{"type":"title","v":1,"title":"","updatedAt":"2026-07-17T06:57:30.306Z","pad":"                                                                                                                                                                              "}
{"type":"session","version":3,"id":"019f6edd-b0c5-7000-8806-41ead7065d1f","timestamp":"2026-07-17T06:57:30.306Z","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"}
{"type":"model_change","id":"9e77eca3","parentId":null,"timestamp":"2026-07-17T06:57:30.364Z","model":"openai-codex/gpt-5.6-sol"}
{"type":"thinking_level_change","id":"b59ac7c4","parentId":"9e77eca3","timestamp":"2026-07-17T06:57:30.364Z","thinkingLevel":"medium","configured":null}
{"type":"session_init","id":"d1319ca3","parentId":"b59ac7c4","timestamp":"2026-07-17T06:57:30.367Z","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: **Broker Concurrency 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\nIdentify why deployed spt v0.36 broker PID 72488 and brain PID 58272 sustain CPU and extreme I/O with 4-5 hosted sessions.\n# Constraints\nRead-only investigation. Do not edit. Skip formatters, linters, and tests. Evidence: broker 532-541 threads but only 4 CPU-active over 5s; brain 18-24 threads with 5 active. 20s means: brain 15.5% one-core CPU and 63.91 MiB/s reads; broker 11.4% one-core CPU and 3.74 MiB/s writes. daemon log grows only ~563 B/s. Current release is v0.36.0 after REDISPATCH fixes.\n# Contract\nReturn exact source paths/lines, loop semantics, and falsifiable probes that distinguish normal activity from leaks/spins.\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 `BrokerCpuRca`. 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- `RedispatchCpuRca` — Release Regression Investigator (sub, running)\n- `BrainCpuRca` — Brain Performance 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-16, 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\nBroker PTY/session/stream handling in crates/spt-daemon; thread spawn sites and lifetime. Non-goal: brain routing.\n# Change\nTrace every long-lived broker thread creation, especially per-stream/per-connection writers and PTY readers. Explain whether ~537 threads can be legitimate for 6 sessions, where they should exit, and any missing cancellation/reap path.\n# Acceptance\nRank concrete broker-side mechanisms with exact source citations and propose a safe live probe that does not stop hosted sessions.","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":"514495f2","parentId":"d1319ca3","timestamp":"2026-07-17T06:57:30.378Z","message":{"role":"user","content":[{"type":"text","text":"Complete the assignment below, thoroughly:\n\n# Target\nBroker PTY/session/stream handling in crates/spt-daemon; thread spawn sites and lifetime. Non-goal: brain routing.\n# Change\nTrace every long-lived broker thread creation, especially per-stream/per-connection writers and PTY readers. Explain whether ~537 threads can be legitimate for 6 sessions, where they should exit, and any missing cancellation/reap path.\n# Acceptance\nRank concrete broker-side mechanisms with exact source citations and propose a safe live probe that does not stop hosted sessions."}],"attribution":"agent","timestamp":1784271450368}}
{"type":"message","id":"0554c0a0","parentId":"514495f2","timestamp":"2026-07-17T06:57:38.339Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning parallel grep for spawn usage**"},{"type":"toolCall","id":"call_ZzKWVx1IVZNoecvMExPm7PZY|fc_0a061eb498f0e908016a59d26246f88196a2df966b188229f7","name":"read","arguments":{"i":"Reading diagnosis workflow","path":"skill://diagnose","selector":null}},{"type":"toolCall","id":"call_jo7e937R7IrbBQB9fTVWtq0F|fc_0a061eb498f0e908016a59d262470881969475f379ccc7484a","name":"glob","arguments":{"i":"Mapping daemon sources","path":"crates/spt-daemon/**/*","hidden":true,"gitignore":true,"limit":500}},{"type":"toolCall","id":"call_TCRZ3WjjGn4qP7BXdiQ0b0JM|fc_0a061eb498f0e908016a59d26247108196ad098a66b554e593","name":"grep","arguments":{"i":"Finding spawn sites","pattern":"thread::spawn|std::thread|tokio::spawn|task::spawn|spawn_blocking|Builder::new\\(\\).*spawn|\\.spawn\\(","path":"crates/spt-daemon","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_e8Iiotg95Z7JoVEz7LsuRrJQ|fc_0a061eb498f0e908016a59d262471c819690eecfcad2a58f4b","name":"grep","arguments":{"i":"Finding PTY stream loops","pattern":"pty|Pty|stream|writer|reader|connection|accept\\(|recv\\(|read\\(|write\\(|loop \\{","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":14919,"output":338,"cacheRead":0,"cacheWrite":0,"totalTokens":15257,"reasoningTokens":98,"cost":{"input":0.07459500000000001,"output":0.01014,"cacheRead":0,"cacheWrite":0,"total":0.084735}},"stopReason":"toolUse","timestamp":1784271450430,"responseId":"resp_0a061eb498f0e908016a59d25af7a48196ae789ed989bbd7d3","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d25c1e948196a9080d02e3495f00","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdJiS9cco5tHXdJ-SPQH_FbWMe3RgyNKJCjZ8Ch7QT6blBHJQIiRDtk8Yb2si_KRbX0hnx1vCsXDT3sXzkrA6OZ598Eib81DggNvq_Wb0DDgTULiQCPoONcMZt_zk_qS5kKcM055uXlVRepYNi_1rtTsPZvdm05veSNxjhfXHjKCrFY6UFrFSxmasD2fWH_gKHoYjYv22EAki40hVRrxW9oEZJVcQDzNg9ss4lBZlJQXy0qPMba0rl4L1s5auz6Y51z2WDHKGsInfUiGJTSAV81a4LInaWl_V3GErGMjB1LqpRkG0ZuCm-0Ct2lLAWU2tdYjyq-WfmSFobMBvMWBt_xd5OXj9z3k7Jk4ODzcBj8688pFwQkt-23krz9wJMbk0l8zQPwChu0sUFmaA_JWjLnaZ0osvXcMPw-0Ud5Io1U0jMr5L-hPxtAeLQvBIYOo-3V33Bq2IRnr2sOEeGZacq9vCigekgnBRTswLrfi43ncCnAbvGVrhQOhSyQFBUMzHcJPodlvvc_ibkRtbH5vADDZsaB-XUhYYoX2duF0RPdA4iwi8KYgPyeq0QXE49Xse4ubNMrO8zlvWT5hhsJA_QpBSdhZX8KHX7RrbP7QOBE8HJQ2YBezHg0Ba7vW80I4usAHM_EI1C0Wj6_I8ayEXERamynqUacHKvqUPxzJHmu-kFIy6VU6_hpWAiWkD8KOiGUecXGyCNKaEezI2Urzyxc7if40JSvY_tmVYCHSJyZxkOeeMXUx-B5qLp_mzDS6boT67mlmejPLyVJZsDdarxvIo3-SQRqodeM1ov6s0-Qg3pczQb390emy6uwIqKhJ_eLnZqmExCEDuuX0df00hOK6gu_mQiYteyOULVBiLX_wRYnU9GzkLLUZCsYf8fAmquV15ZW_LStrTqDzZ3tmFXLo-GGIdI1BnMATH_CO3agc8pEvuc2bMURrIi-nulR1boMYtRQBVa0rknknIgN_QSHLRXRQ0gmDTIaXvwLosiltprVW6f-HVI4ADxuiWccEMyxVWXO7yJncHr0FEfNvshvEu9Jx_abgMKIp8eJ-KjLKHRze6Oa_OWQEft4vWs9unU4teWQCzkXFCraJgrChJLeob2EVVlK8ja7iW81qqVCBI1WVXwyFrVKhzZmR0Je-v64sv2oE8CwP_pGyJO9uyATcDVkfT7Hup6eMZJJoc23ctCx2T-r-iCHMvwDtDesZhzSDG3gfSfH20C_Fwg_AOBrdWnqQFo8fMnoVmahg6zB1vpAL4ol9HmFilaj6LnH6wfgAht7dfSJbG10i43XPEtSNGOwLLkfEu5ZnXYkDtvceHXEAsXskky3gBot4mV30IK9mQzn7wZ1HEFgiXYwFH3jo43sgZX2wGXYUfBuLoNw0HyJGRb17pojhmAkjbNtjkipyW1e9shwKZYsbh06akBi6hGWZ16x-cBB3Qxe_qszwfYmEXwWCZTuxahGI7sL8UNtWA37msMVfISzczLRl_57347-pJYlUVGz7XSDojX63ZZE=","summary":[{"type":"summary_text","text":"**Planning parallel grep for spawn usage**"}]},{"id":"fc_0a061eb498f0e908016a59d26246f88196a2df966b188229f7","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading diagnosis workflow\",\"path\":\"skill://diagnose\",\"selector\":null}","call_id":"call_ZzKWVx1IVZNoecvMExPm7PZY","name":"read"},{"id":"fc_0a061eb498f0e908016a59d262470881969475f379ccc7484a","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping daemon sources\",\"path\":\"crates/spt-daemon/**/*\",\"hidden\":true,\"gitignore\":true,\"limit\":500}","call_id":"call_jo7e937R7IrbBQB9fTVWtq0F","name":"glob"},{"id":"fc_0a061eb498f0e908016a59d26247108196ad098a66b554e593","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding spawn sites\",\"pattern\":\"thread::spawn|std::thread|tokio::spawn|task::spawn|spawn_blocking|Builder::new\\\\(\\\\).*spawn|\\\\.spawn\\\\(\",\"path\":\"crates/spt-daemon\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_TCRZ3WjjGn4qP7BXdiQ0b0JM","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d262471c819690eecfcad2a58f4b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding PTY stream loops\",\"pattern\":\"pty|Pty|stream|writer|reader|connection|accept\\\\(|recv\\\\(|read\\\\(|write\\\\(|loop \\\\{\",\"path\":\"crates/spt-daemon/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_e8Iiotg95Z7JoVEz7LsuRrJQ","name":"grep"}]},"duration":7907.785799995065,"ttft":1707.118499994278,"contextSnapshot":{"promptTokens":14919,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ZzKWVx1IVZNoecvMExPm7PZY|fc_0a061eb498f0e908016a59d26246f88196a2df966b188229f7","toolName":"read","startedAt":"2026-07-17T06:57:38.339Z","args":{"path":"skill://diagnose"},"intent":"Reading diagnosis workflow"},"id":"c7f119d5","parentId":"0554c0a0","timestamp":"2026-07-17T06:57:38.339Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_jo7e937R7IrbBQB9fTVWtq0F|fc_0a061eb498f0e908016a59d262470881969475f379ccc7484a","toolName":"glob","startedAt":"2026-07-17T06:57:38.339Z","args":{"path":"crates/spt-daemon/**/*"},"intent":"Mapping daemon sources"},"id":"b7e8e067","parentId":"c7f119d5","timestamp":"2026-07-17T06:57:38.339Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_TCRZ3WjjGn4qP7BXdiQ0b0JM|fc_0a061eb498f0e908016a59d26247108196ad098a66b554e593","toolName":"grep","startedAt":"2026-07-17T06:57:38.339Z","args":{"path":"crates/spt-daemon"},"intent":"Finding spawn sites"},"id":"b25d0511","parentId":"b7e8e067","timestamp":"2026-07-17T06:57:38.339Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_e8Iiotg95Z7JoVEz7LsuRrJQ|fc_0a061eb498f0e908016a59d262471c819690eecfcad2a58f4b","toolName":"grep","startedAt":"2026-07-17T06:57:38.339Z","args":{"path":"crates/spt-daemon/src"},"intent":"Finding PTY stream loops"},"id":"739f1b80","parentId":"b25d0511","timestamp":"2026-07-17T06:57:38.339Z"}
{"type":"message","id":"1c84d3e2","parentId":"739f1b80","timestamp":"2026-07-17T06:57:38.340Z","message":{"role":"toolResult","toolCallId":"call_ZzKWVx1IVZNoecvMExPm7PZY|fc_0a061eb498f0e908016a59d26246f88196a2df966b188229f7","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":1784271458340}}
{"type":"message","id":"8fae87d5","parentId":"1c84d3e2","timestamp":"2026-07-17T06:57:38.355Z","message":{"role":"toolResult","toolCallId":"call_jo7e937R7IrbBQB9fTVWtq0F|fc_0a061eb498f0e908016a59d262470881969475f379ccc7484a","toolName":"glob","content":[{"type":"text","text":"# crates/spt-daemon/\nCargo.toml\n## src/\nnethost.rs\ndispatch.rs\nbroker.rs\nattach.rs\nbrain.rs\nmsg.rs\nseedproofx.rs\nregistryhost.rs\nlib.rs\nendpoint.rs\nsync.rs\nprojwriter.rs\nbrainproc.rs\napplyhost.rs\ndocshost.rs\ndaemon.rs\nconfig.rs\nupdate.rs\nrelcache.rs\nrelease.rs\nnotif.rs\nrelay.rs\npropagate.rs\nlivehost.rs\ninject.rs\nconn.rs\nautostart.rs\nstderrlog.rs\nlifecycle.rs\ndigest.rs\npairhost.rs\nxfer.rs\nshellwake.rs\nshellchan.rs\nseedmap.rs\nresting.rs\nresthost.rs\nlinkhost.rs\neffect.rs\nadapter_update.rs\nwan.rs\ntunnelhub.rs\ntransport.rs\ntranslation.rs\ntest_home.rs\nshellhost.rs\nshelldisc.rs\nservice.rs\nserveprobe.rs\nrollback_compat.rs\nreconcile.rs\nreap.rs\npsyrelay.rs\npresence.rs\nnotifsync.rs\nmachineid.rs\nharnesshost.rs\ngrants.rs\nframe.rs\ndrivehub.rs\ndigesthub.rs\ndeelevate.rs\ndeadline.rs\ncrc_swap.rs\nconsent.rs\ncodec.rs\naccess.rs\n### pump/\nmod.rs\nhealth.rs\nupdate.rs\nsync.rs\nregistry.rs\nnotif.rs\n### bin/\nxlate_choreo_fixture.rs\n## tests/\ninject_control_wedge.rs\nattach.rs\nredispatch_stall.rs\nfalse_promote.rs\nconn_blackhole_lifecycle.rs\nbroker.rs\nbrain_decouple.rs\nmesh_recovery.rs\nredispatch.rs\ninput_ack_deadlock.rs\ndocs_server_e2e.rs\npropagate.rs\npumpdeadline.rs\npump.rs\nnet_worker_starve.rs\nbrain_resume_conn_deadlock.rs\ntwo_origin_spanning.rs\nwake_single_flight.rs\nendpoint_survival.rs\nxfer.rs\nwanmsg.rs\ntwohost.rs\nreplicate.rs\nsync.rs\nnotifsync.rs\nnetstream.rs\nnetbroker.rs\nidempotent.rs\ndispatch.rs\ndaemon_e2e.rs\naccess.rs\nshellchan.rs\nseedproofx.rs\nrosterprop.rs\nresume.rs\nreseed.rs\npsyche_residency_expectation_e2e.rs\npsyche_event_turn_e2e.rs\npsyche_context_file_e2e.rs\npresence.rs\npairjoin.rs\nmesh.rs\nlegacy_resident_sweep_e2e.rs\nhandoff.rs\ndriven_by_selfheal.rs\ndigest.rs\ndaemon_lifecycle_real_brain.rs\ncontrol_stamp_lifetime.rs\nbudget.rs\nbrain_swap.rs\n### fixtures/\ndispatch_fixture.rs"}],"details":{"scopePath":"crates/spt-daemon","fileCount":131,"files":["crates/spt-daemon/src/","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/tests/","crates/spt-daemon/tests/inject_control_wedge.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/tests/attach.rs","crates/spt-daemon/src/attach.rs","crates/spt-daemon/tests/redispatch_stall.rs","crates/spt-daemon/tests/false_promote.rs","crates/spt-daemon/tests/conn_blackhole_lifecycle.rs","crates/spt-daemon/tests/broker.rs","crates/spt-daemon/tests/brain_decouple.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/msg.rs","crates/spt-daemon/tests/mesh_recovery.rs","crates/spt-daemon/src/seedproofx.rs","crates/spt-daemon/src/registryhost.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/pump/","crates/spt-daemon/src/pump/health.rs","crates/spt-daemon/src/lib.rs","crates/spt-daemon/src/endpoint.rs","crates/spt-daemon/tests/redispatch.rs","crates/spt-daemon/tests/input_ack_deadlock.rs","crates/spt-daemon/tests/fixtures/","crates/spt-daemon/tests/fixtures/dispatch_fixture.rs","crates/spt-daemon/Cargo.toml","crates/spt-daemon/src/sync.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/applyhost.rs","crates/spt-daemon/tests/docs_server_e2e.rs","crates/spt-daemon/src/docshost.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/tests/propagate.rs","crates/spt-daemon/src/update.rs","crates/spt-daemon/src/relcache.rs","crates/spt-daemon/src/release.rs","crates/spt-daemon/src/notif.rs","crates/spt-daemon/tests/pumpdeadline.rs","crates/spt-daemon/tests/pump.rs","crates/spt-daemon/tests/net_worker_starve.rs","crates/spt-daemon/tests/brain_resume_conn_deadlock.rs","crates/spt-daemon/src/relay.rs","crates/spt-daemon/src/propagate.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/inject.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/autostart.rs","crates/spt-daemon/tests/two_origin_spanning.rs","crates/spt-daemon/tests/wake_single_flight.rs","crates/spt-daemon/tests/endpoint_survival.rs","crates/spt-daemon/src/stderrlog.rs","crates/spt-daemon/src/lifecycle.rs","crates/spt-daemon/src/digest.rs","crates/spt-daemon/src/bin/xlate_choreo_fixture.rs","crates/spt-daemon/src/bin/","crates/spt-daemon/src/pairhost.rs","crates/spt-daemon/tests/xfer.rs","crates/spt-daemon/tests/wanmsg.rs","crates/spt-daemon/tests/twohost.rs","crates/spt-daemon/tests/replicate.rs","crates/spt-daemon/tests/sync.rs","crates/spt-daemon/tests/notifsync.rs","crates/spt-daemon/tests/netstream.rs","crates/spt-daemon/tests/netbroker.rs","crates/spt-daemon/tests/idempotent.rs","crates/spt-daemon/tests/dispatch.rs","crates/spt-daemon/tests/daemon_e2e.rs","crates/spt-daemon/tests/access.rs","crates/spt-daemon/src/xfer.rs","crates/spt-daemon/src/shellwake.rs","crates/spt-daemon/src/shellchan.rs","crates/spt-daemon/src/seedmap.rs","crates/spt-daemon/src/resting.rs","crates/spt-daemon/src/resthost.rs","crates/spt-daemon/src/linkhost.rs","crates/spt-daemon/src/effect.rs","crates/spt-daemon/src/adapter_update.rs","crates/spt-daemon/tests/shellchan.rs","crates/spt-daemon/tests/seedproofx.rs","crates/spt-daemon/tests/rosterprop.rs","crates/spt-daemon/tests/resume.rs","crates/spt-daemon/tests/reseed.rs","crates/spt-daemon/tests/psyche_residency_expectation_e2e.rs","crates/spt-daemon/tests/psyche_event_turn_e2e.rs","crates/spt-daemon/tests/psyche_context_file_e2e.rs","crates/spt-daemon/tests/presence.rs","crates/spt-daemon/tests/pairjoin.rs","crates/spt-daemon/tests/mesh.rs","crates/spt-daemon/tests/legacy_resident_sweep_e2e.rs","crates/spt-daemon/tests/handoff.rs","crates/spt-daemon/tests/driven_by_selfheal.rs","crates/spt-daemon/tests/digest.rs","crates/spt-daemon/tests/daemon_lifecycle_real_brain.rs","crates/spt-daemon/tests/control_stamp_lifetime.rs","crates/spt-daemon/tests/budget.rs","crates/spt-daemon/tests/brain_swap.rs","crates/spt-daemon/src/wan.rs","crates/spt-daemon/src/tunnelhub.rs","crates/spt-daemon/src/transport.rs","crates/spt-daemon/src/translation.rs","crates/spt-daemon/src/test_home.rs","crates/spt-daemon/src/shellhost.rs","crates/spt-daemon/src/shelldisc.rs","crates/spt-daemon/src/service.rs","crates/spt-daemon/src/serveprobe.rs","crates/spt-daemon/src/rollback_compat.rs","crates/spt-daemon/src/reconcile.rs","crates/spt-daemon/src/reap.rs","crates/spt-daemon/src/pump/update.rs","crates/spt-daemon/src/pump/sync.rs","crates/spt-daemon/src/pump/registry.rs","crates/spt-daemon/src/pump/notif.rs","crates/spt-daemon/src/psyrelay.rs","crates/spt-daemon/src/presence.rs","crates/spt-daemon/src/notifsync.rs","crates/spt-daemon/src/machineid.rs","crates/spt-daemon/src/harnesshost.rs","crates/spt-daemon/src/grants.rs","crates/spt-daemon/src/frame.rs","crates/spt-daemon/src/drivehub.rs","crates/spt-daemon/src/digesthub.rs","crates/spt-daemon/src/deelevate.rs","crates/spt-daemon/src/deadline.rs","crates/spt-daemon/src/crc_swap.rs","crates/spt-daemon/src/consent.rs","crates/spt-daemon/src/codec.rs","crates/spt-daemon/src/access.rs"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784271458355}}
{"type":"message","id":"38844db9","parentId":"8fae87d5","timestamp":"2026-07-17T06:57:39.006Z","message":{"role":"toolResult","toolCallId":"call_e8Iiotg95Z7JoVEz7LsuRrJQ|fc_0a061eb498f0e908016a59d262471c819690eecfcad2a58f4b","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## access.rs\n 15|//!   endpoint's identity or home. The subject value MUST be the QUIC\n*16|//!   handshake-proven remote node id from the broker's conn/stream table,\n 17|//!   never a payload field (REQ-HAZARD-WAN-ORIGIN-AUTH).\n 18|//! - **Outbound** → any visible node: the whitelist never restricts who an\n 19|//!   endpoint talks *to*.\n...\n 28|//!   origin that *is* this node (a loopback self-dial) short-circuits Allow.\n*29|//! - **Default absent = open**; setting a whitelist restricts (an empty entry\n 30|//!   = locked down). Node-tier ships M4 (Ed25519 node pubkeys); the user tier\n 31|//!   is an inert schema reservation until the cross-user model (ADR-0006).\n 32|//!\n...\n 35|//! an `spt access` edit takes effect on the next inbound without a daemon\n*36|//! restart, and the checks run at message/stream-establishment rate where a\n 37|//! small-file read is noise.\n 38|//!\n 39|//! **Class policy:** only the *message* funnel ([`crate::wan`]) classifies\n...\n 143|    // restricted endpoint admits listed nodes and refuses unlisted ones;\n*144|    // an empty entry is locked down; other endpoints stay open.\n 145|    #[test]\n 146|    fn gate_decision_table() {\n 147|        with_home(|_| {\n...\n 179|                AccessDecision::Deny,\n*180|                \"empty entry refuses everyone\"\n 181|            );\n 182|\n 183|            // Open: entry deleted → default-open again.\n## adapter_update.rs\n 390|            std::fs::create_dir_all(&src).unwrap();\n*391|            std::fs::write(src.join(\"manifest.toml\"), body).unwrap();\n 392|            src\n 393|        };\n 394|        let plain = seed(\n## applyhost.rs\n 82|    /// be the optimistic enlyzeam write D6 exists to kill. `version` is the\n*83|    /// monotonic counter; `product_version` the human-facing semver (empty for\n 84|    /// pre-v0.3.2 metadata, whence the counter-based fallback message).\n 85|    // [impl->REQ-UPD-6]\n 86|    // [impl->REQ-UPD-8]\n...\n 95|    /// new bytes and promotes it on the fresh brain's `ready`. `version` is the\n*96|    /// monotonic counter; `product_version` the human semver (empty pre-v0.3.2).\n 97|    // [impl->REQ-UPDATE-ONE-SHOT-FINISH]\n 98|    AppliedDaemonless {\n 99|        version: u64,\n...\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 172|            \"release-keys.json unprovisioned (no trusted keys)\".to_string(),\n 173|        )));\n...\n 318|    // Connect to the broker BEFORE the binary moves — a dead broker fails the\n*319|    // apply with the seat untouched. The connection is the channel the planned\n 320|    // brain-restart trigger rides after the swap (ADR-0018 D3-3); it does not\n 321|    // attach to any session (the broker holds every hosted endpoint across the\n 322|    // brain cycle — that is the whole point).\n...\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 357|/// construction. The recovery verb for wedged brain-held state that previously\n 358|/// needed a full daemon bounce. Nothing is verified, staged, or renamed: the\n 359|/// respawn lands on the SAME on-disk binary. A candidate that fails readiness\n...\n 625|            .collect();\n*626|        std::fs::write(\n 627|            &keys,\n 628|            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 629|        )\n...\n 687|            .collect();\n*688|        std::fs::write(\n 689|            &keys,\n 690|            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 691|        )\n...\n 723|            .collect();\n*724|        std::fs::write(\n 725|            &keys,\n 726|            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 727|        )\n...\n 743|        let exe = dir.path().join(\"spt-binary\");\n*744|        std::fs::write(&exe, b\"OLD\").unwrap();\n 745|\n 746|        let cache = ReleaseCache::open(&dir.path().join(\"releases\"));\n 747|        let (signed, keys) = sign_single(dir.path(), 7, b\"CROSS-OS BYTES\");\n...\n 756|        );\n*757|        assert_eq!(std::fs::read(&exe).unwrap(), b\"OLD\", \"seat untouched\");\n 758|\n 759|        // 2. Single stamped for the OTHER OS refuses too. \"Other\" = any\n 760|        //    registered platform that is not this host — derived from the\n...\n 775|        );\n*776|        assert_eq!(std::fs::read(&exe).unwrap(), b\"OLD\", \"seat untouched\");\n 777|\n 778|        // 3. Stamped for THIS platform: the single applies (the legitimate\n 779|        //    origin-fetched-local path).\n...\n 787|        );\n*788|        assert_eq!(std::fs::read(&exe).unwrap(), b\"CROSS-OS BYTES\");\n 789|    }\n 790|\n 791|    // [unit->REQ-HAZARD-BROKER-PROCESS-ISOLATION] [unit->REQ-UPD-3] the planned\n...\n 889|        let exe = dir.path().join(\"spt-binary\");\n*890|        std::fs::write(&exe, b\"OLD BINARY\").unwrap();\n 891|        let (cache, keys) = stage(dir.path(), 7, b\"NEW BINARY BYTES\", BROKER_RESOURCE_ABI);\n 892|\n 893|        let out = apply_staged(&cache, &keys, &exe, &name).expect(\"apply ok\");\n...\n 898|        assert_eq!(\n*899|            std::fs::read(&exe).unwrap(),\n 900|            b\"NEW BINARY BYTES\",\n 901|            \"artifact landed\"\n 902|        );\n 903|        assert_eq!(\n*904|            std::fs::read(swap_aside_path(&exe, 7)).unwrap(),\n 905|            b\"OLD BINARY\",\n 906|            \"the outgoing binary stepped aside\"\n 907|        );\n...\n 927|        let exe = dir.path().join(\"spt-binary\");\n*928|        std::fs::write(&exe, b\"OLD BINARY\").unwrap();\n 929|        let (cache, keys) = stage(dir.path(), 7, b\"NEW BINARY BYTES\", BROKER_RESOURCE_ABI);\n 930|\n 931|        // No served_broker — deliberately. A daemonless apply must not need one.\n...\n 937|        assert_eq!(\n*938|            std::fs::read(&exe).unwrap(),\n 939|            b\"NEW BINARY BYTES\",\n 940|            \"artifact landed without any broker handoff\"\n 941|        );\n 942|        assert_eq!(\n*943|            std::fs::read(swap_aside_path(&exe, 7)).unwrap(),\n 944|            b\"OLD BINARY\",\n 945|            \"the outgoing binary stepped aside\"\n 946|        );\n...\n 966|        let exe = dir.path().join(\"spt-binary\");\n*967|        std::fs::write(&exe, b\"OLD\").unwrap();\n 968|\n 969|        // Nothing staged.\n*970|        let empty = ReleaseCache::open(&dir.path().join(\"releases\"));\n 971|        let keys = dir.path().join(\"release-keys.json\");\n## attach.rs\n*1|//! Remote terminal attach (M4-D5b, REQ-INST-8) — serve a byte-stream viewport\n 2|//! onto a local session for an operator on another node.\n 3|//!\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 9|//!   (fire-and-forget sends; `Output.seq` carries the dedup authority);\n 10|//! - inbound [`AttachRecord::Input`] → [`Brain::send_effect`] with the\n*11|//!   operator-minted `op_id` — exactly-once at the PTY write through the B5\n 12|//!   journal (a replayed input record cannot double-type);\n*13|//! - session `Exit` → [`AttachRecord::Exit`] + stream finish.\n 14|//!\n 15|//! ## Exactly-once lives at the EDGES, not the wire sends\n 16|//!\n*17|//! Stream sends here are deliberately **unjournaled** (`op_id: None`): a\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 23|//! `Input.op_id`, and the operator's viewport dedups `Output` records by their\n 24|//! session-log `seq` (the render cursor). A post-restart re-serve may\n 25|//! re-transmit output records on the wire — duplicates are dropped at the\n...\n 32|//! [`access_check`] sees the **handshake-proven** origin from the broker's\n*33|//! stream table — never payload bytes (KNOWN-HAZARDS 7.5). Remote-drive of\n 34|//! your own running instance is ungated by default (ADR-0009 default-open);\n 35|//! the D5d whitelist drops in at this same call.\n 36|//!\n 37|//! Restart survival composes from D4/B5 with **no new machinery**: the broker\n*38|//! owns the QUIC stream, the session, its `OutputLog`, and the effect journal.\n 39|//! A restarted target brain re-attaches the session from its output cursor,\n*40|//! resubscribes the stream from its net cursor, and re-drives journaled sends;\n 41|//! a restarted operator brain resubscribes and dedups rendered chunks by\n 42|//! `Output.seq`.\n 43|\n...\n 73|    Refused,\n*74|    /// The session's child exited; the `Exit` record was sent and the stream\n 75|    /// finished.\n 76|    Exited(Option<i32>),\n 77|    /// The operator closed its send side (detached); the viewport ended with\n...\n 80|    /// This controller was DISPLACED by a different operator's `--take`/`kick`\n*81|    /// (REQ-KICK-1): the loud `Displaced` notice was sent and the stream\n 82|    /// finished. The endpoint stays driven (by the taker) — no dormant edge.\n 83|    Displaced,\n 84|}\n...\n 86|/// The role a serve loop resolved to, once the broker's [`SubscribeOutcome`]\n*87|/// arrives — gates wake (controller-only) and PTY input.\n 88|#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n 89|enum ServeRole {\n 90|    /// The interactive controller (input + resize; wakes the endpoint).\n...\n 140|/// bounded channel is full (a controller that falls behind its own echo under a\n*141|/// hard flood). The next frame this reader sees is then a FORWARD gap that the\n 142|/// strict reject-gap (`read_event`, legacy single-session path) FATALS. A\n 143|/// controller CANNOT snap-above like a viewer (B2: it is authoritative — it\n 144|/// advances `delivered_through`; skipping rolled frames would be a not-exactly-once\n...\n 154|/// spins. The helper swallows the `Subscribed` ack its own re-subscribe produces so\n*155|/// the repeated-gap detection is not masked. Non-`Output` events (NetStreamData /\n 156|/// Size / Exit / …) pass through unchanged.\n 157|// [impl->REQ-HAZARD-CONTROLLER-GAP-RESUME]\n 158|/// `gen` is the serve worker's attach generation (ADR-0038 Amendment fix 6):\n...\n 172|    let mut swallow_resume_ack = false;\n*173|    loop {\n 174|        match brain.read_event() {\n 175|            // Our own re-subscribe's Subscribed reply: swallow it (role is already\n 176|            // resolved) so it cannot mask a repeated gap as forward progress.\n...\n 231|///   viewer / busy / take by intent + origin and replies a `Subscribed`;\n*232|///   driven_by / viewer_count are BROKER-owned (single writer). A VIEWER\n 233|///   attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);\n 234|///   the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).\n 235|// [impl->REQ-RC-CROSS-NODE-ATTACH]\n...\n 240|    wire: &mut Brain,\n*241|    stream_id: u64,\n 242|    endpoint: &str,\n 243|    origin_node: &str,\n 244|    remote_session: Option<u64>,\n...\n 254|    if access_check(endpoint, origin_node, InboundClass::Unsolicited) == AccessDecision::Deny {\n*255|        wire.net_stream_send(stream_id, &[], None, true)?;\n 256|        return Ok(Some(AttachServeOutcome::Refused));\n 257|    }\n 258|    let sid = remote_session.unwrap_or(session_id);\n## autostart.rs\n 38|    let entries = DaemonConfig::load().startup_endpoints;\n*39|    if entries.is_empty() {\n 40|        return;\n 41|    }\n 42|    let adapters_dir = spt_store::perch::adapters_dir();\n...\n 71|        // A fresh session every replay: the daemon just started, so the broker\n*72|        // session map is empty — no duplicate-session risk on this path (the\n 73|        // CLI's live probe guards the manual-run-over-live case, REQ-RUN-NO-DUP-SESSION).\n 74|        let session_id = crate::harnesshost::mint_session_id();\n 75|        let mut last_err = String::new();\n...\n 129|    /// daemon-boot thread. The socket name is intentionally bogus: these gates\n*130|    /// exercise only the pre-launch legs (empty list / loud-skip), which never\n 131|    /// dial the broker, so it must never be reached.\n 132|    fn replay_bounded(budget: Duration) {\n 133|        let (tx, rx) = mpsc::channel();\n...\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 142|        handle.join().expect(\"watchdog thread must not panic\");\n 143|    }\n 144|\n*145|    // [unit->REQ-ENDPOINT-AUTOSTART] an empty startup-endpoints list is a pure\n 146|    // no-op: replay reads the (absent) config, finds nothing, and returns without\n 147|    // touching the broker at all — the zero-config default path.\n 148|    #[test]\n*149|    fn empty_config_is_a_pure_noop() {\n 150|        crate::test_home::with_home(|_home| {\n*151|            // No daemon.json at all → DaemonConfig::load() defaults to an empty\n 152|            // startup_endpoints list → early return, no launch, no dial.\n 153|            assert!(\n*154|                DaemonConfig::load().startup_endpoints.is_empty(),\n 155|                \"precondition: the isolated home has no saved startup endpoints\"\n 156|            );\n 157|            replay_bounded(Duration::from_secs(10));\n...\n 169|            // A config that names an adapter that was never registered, against an\n*170|            // empty adapters dir → resolve_option Errs → the SKIP branch fires and\n 171|            // `continue`s past the launch entirely.\n 172|            let cfg = DaemonConfig {\n 173|                startup_endpoints: vec![StartupEndpoint {\n...\n 180|            cfg.save_to(&DaemonConfig::default_path()).unwrap();\n*181|            // The adapters dir is absent/empty in a fresh isolated home; assert the\n 182|            // precondition so a future default that pre-seeds adapters can't mask\n 183|            // this gate silently.\n 184|            let adapters = home.join(\"adapters\");\n## brain.rs\n 31|\n*32|use interprocess::local_socket::{SendHalf, Stream};\n 33|\n 34|use crate::codec::{read_frame, write_frame};\n 35|use crate::frame::{Envelope, Role};\n...\n 41|    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n*42|    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n*43|    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n 44|    SessionsReply, SizeEvent, SpawnReq, Spawned, SubscribeOutcome, SubscribeReq, SubscribedReply,\n 45|    ViewerEvictedEvent,\n 46|    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...\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_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 55|    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n 56|    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n 57|};\n...\n 115|    },\n*116|    /// The current PTY size of a session, pushed to a VIEWER (the letterbox feed,\n 117|    /// REQ-RCVIEW-1).\n 118|    Size {\n 119|        session_id: u64,\n...\n 143|    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\n*144|    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\n 145|    /// ([`Self::NetPresence`]), not this frame.\n 146|    NetDialSubmitted,\n*147|    /// A stream open durably landed — fresh or deduped (D4b).\n*148|    NetStreamOpened(NetStreamOpened),\n*149|    /// A journaled stream send durably landed — fresh or deduped (D4b).\n 150|    NetSent(NetSent),\n*151|    /// The broker's held-streams listing (D4b).\n*152|    NetStreams(NetStreamsReply),\n 153|    /// The broker's hosted-sessions listing (D9-1: session → endpoint).\n 154|    Sessions(SessionsReply),\n 155|    /// The subnet-join ceremony's verdict (a `pair-joined` reply, M7 D3).\n...\n 159|    MetMember(MetMember),\n*160|    /// A contiguous chunk of a stream's reads (the cursor has advanced past it).\n*161|    NetStreamData {\n*162|        stream_id: u64,\n 163|        seq: u64,\n 164|        bytes: Vec<u8>,\n 165|    },\n*166|    /// A stream's read side finished cleanly; `next_seq` is the completeness\n 167|    /// check (the subscriber's cursor must equal it to have missed nothing).\n*168|    NetStreamEof { stream_id: u64, next_seq: u64 },\n 169|    /// A contiguous conn-liveness event (the presence cursor has advanced past\n 170|    /// it) — connected/disconnected on the broker's conn table (D4c).\n 171|    NetPresence(NetPresenceEvent),\n...\n 190|\n*191|/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\n 192|/// non-pump client: blocking, unbounded reads, correct everywhere) or a\n 193|/// **split** carrier for the peer pump.\n 194|///\n## brainproc.rs\n 19|//! broker spawns + supervises a brain child over the socket, and the broker\n*20|//! (with its PTY children + seed channel) survives the brain dying — the\n 21|//! supervisor respawns it from the executable path, which on a real update is\n 22|//! the swapped binary.\n 23|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n...\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 143|/// from the (possibly swapped) binary.\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 184|    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\n*185|    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\n 186|    // so this is a no-op now and forward-correct when daemon-hosted sessions land\n 187|    // (the live-agent adapter). A failure here is non-fatal — the brain still\n*188|    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\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...\n 199|    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\n*200|    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\n 201|    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n 202|    match brain.resume_session_cursors() {\n*203|        Ok(ids) if !ids.is_empty() => {\n 204|            eprintln!(\n 205|                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\n 206|                ids.len()\n...\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 250|    // reconcile in the background (ready-without-warm is preserved because\n 251|    // write_ready already fired above), then drain/debounce/coalesce the\n 252|    // invalidation queue. Same posture as the hosts above: the stop flag is\n...\n 254|    // rehydrates from the persisted index (warm start, fingerprint-gated).\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...\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...\n 366|    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\n*367|    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\n 368|    // tolerates its absence). Never fail the ready write over a diagnostic field.\n 369|    if let Some(hash) = current_exe_hash() {\n 370|        obj[\"exe_hash\"] = serde_json::Value::String(hash);\n...\n 382|    let exe = std::env::current_exe().ok()?;\n*383|    let bytes = std::fs::read(exe).ok()?;\n 384|    Some(crate::release::sha256_hex(&bytes))\n 385|}\n 386|\n...\n 472|    fn staged_artifact_hash(&self, version: u64) -> Option<String>;\n*473|    /// Whether the OLD brain generation's broker subscriber connection is DRAINED —\n 474|    /// its local controller conn CLOSED or stall-evicted, no blocked writes still\n 475|    /// pending on it (REQ-UPDATE-PROMOTE-DRAINED). Reads BROKER TRUTH in-process (no\n 476|    /// brain round-trip): the supervisor promotes a ready candidate only once this is\n...\n 592|/// = the A11 kill+wait precedes `rollback`), so no brain-side pump can be\n*593|/// advertising and the [`spt_store::epoch::EpochSource`] single-writer assumption\n 594|/// (epoch.rs) holds at this `EpochSource::load`. **Do NOT fire broker-side notifs\n 595|/// while a brain is live:** concurrent `EpochSource` read-modify-write across the\n 596|/// two processes mints duplicate epochs (KH 4.8 lost-update). The forward fix for\n...\n 688|    let mut ready_seen = false;\n*689|    loop {\n 690|        if stop.load(Ordering::Relaxed) {\n 691|            return TrialStep::Stopped;\n 692|        }\n...\n 876|                if supervise {\n*877|                    loop {\n 878|                        if stop.load(Ordering::Relaxed) {\n 879|                            let _ = child.kill();\n 880|                            let _ = child.wait();\n## broker.rs\n 3|//! Per ADR-0004 §B the broker holds **only** the resources a live consumer\n*4|//! would lose continuity on if the logic restarted: the PTY master+writer and\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 10|//! ## Gapless handoff (B2 — the load-bearing invariant)\n...\n 13|//! crash). The broker — and every hosted child — must survive that untouched,\n*14|//! and the new brain must re-attach to the output stream **gaplessly and\n 15|//! exactly-once** (Spike #1 made real). Two mechanisms:\n 16|//!\n 17|//! - **Sequenced, buffered output.** Each session's output is appended to an\n 18|//!   [`OutputLog`]: every chunk gets a monotonic per-session `seq` and is held\n*19|//!   in a bounded ring. The current subscriber (a brain connection) receives\n 20|//!   chunks live; all subscriber writes happen *under the log lock*, so frames\n 21|//!   reach the brain in strict `seq` order with no interleave.\n 22|//! - **Resume from a cursor.** A reconnecting brain sends `subscribe` with its\n*23|//!   last-seen `seq + 1`; the broker replays the ring from there, then streams\n 24|//!   live. The brain dedups by `seq`. Output produced *while no brain was\n 25|//!   attached* sits in the ring and is replayed on the next subscribe — so a\n 26|//!   brain restart loses nothing.\n 27|//!\n*28|//! Sessions are therefore **broker-owned and outlive any one connection**: a\n*29|//! brain disconnect only detaches the subscriber; the child, its PTY, and the\n 30|//! output log persist. A session leaves the table only when its child exits\n 31|//! (reaped by the exit waiter) or is explicitly killed.\n 32|// [impl->REQ-DAEMON-2]\n...\n 41|\n*42|use interprocess::local_socket::{prelude::*, Stream};\n*43|use spt_term::{Drain, PtySession, ScreenGrid, SessionSurface, SurfaceSize};\n 44|\n 45|use spt_net::net::attach::AttachIntent;\n 46|use spt_net::net::endpoint::EndpointAddr;\n...\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, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n 60|    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 62|    KIND_NET_DIAL_SUBMITTED, KIND_NET_PRESENCE_SUBSCRIBE,\n...\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_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 69|    KIND_SPAWNED, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,\n 70|};\n...\n 74|\n*75|/// The shared, serialized send side of one brain connection. Output frames,\n 76|/// replay frames, command acks, and exit/error events all write through this.\n*77|/// `pub(crate)`: the net host's stream logs (D4b) live-send through the same\n 78|/// handle under the same gate discipline. Round-4\n 79|/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw\n 80|/// `Arc<Mutex<SendHalf>>` — [`BrokerConn`] owns the half and every write is\n...\n 92|/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n*93|/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n*94|/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n 95|/// owns the replay batch), so a viewer attaching to a busy session is not\n 96|/// spuriously evicted.\n 97|const VIEWER_CHANNEL_DEPTH: usize = 256;\n...\n 99|/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n*100|/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\n 101|const MAX_VIEWERS: usize = 32;\n 102|\n 103|/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n 104|/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n*105|/// the live stream) or a `Disconnected` one (its writer thread ended after a\n 106|/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n 107|/// is the pure decision the fan-out applies under the log lock.\n 108|// [impl->REQ-HAZARD-VIEWER-ISOLATION]\n## codec.rs\n 5|//! framing) but generic over any [`Read`]/[`Write`] — the IPC carrier is a\n*6|//! local socket (named pipe / UDS), not a `TcpStream`, and tests exercise it\n 7|//! over in-memory buffers and socket pairs.\n 8|//!\n 9|//! The frame *codec* is deliberately transport-agnostic: it is the byte-level\n*10|//! contract, while [`crate::transport`] owns the OS-specific connection.\n 11|// [impl->REQ-DAEMON-2]\n 12|\n 13|use std::io::{self, Read, Write};\n...\n 75|\n*76|    // [unit->REQ-DAEMON-2] multiple frames stream back-to-back without bleed.\n 77|    #[test]\n 78|    fn back_to_back_frames_decode_independently() {\n 79|        let mut buf: Vec<u8> = Vec::new();\n## config.rs\n 81|    pub adapter: String,\n*82|    /// The project cwd the harness PTY lands in (captured at `--save`).\n 83|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 84|    pub cwd: Option<String>,\n 85|}\n...\n 181|    /// `attachment.json` from this list — `spt subnet detach/attach --save`\n*182|    /// writes it. Default empty = every held subnet starts attached.\n 183|    pub detached_subnets: Vec<String>,\n 184|    /// The worker-reap TTL floor (seconds since a worker's `started`), W-3\n 185|    /// (REQ-WORKER-REAP): the reconcile GC reaps any worker older than this even\n...\n 192|    /// REQ-ENDPOINT-AUTOSTART) — `spt endpoint run --save` writes this list.\n*193|    /// Default empty = nothing auto-starts. A replay failure logs loud and\n 194|    /// never blocks daemon start or the other replays.\n 195|    pub startup_endpoints: Vec<StartupEndpoint>,\n 196|    /// The docs server port override (ADR-0036 §4, REQ-DOCS-LOCAL-SERVER).\n...\n 328|            .map_err(|e| std::io::Error::other(e.to_string()))?;\n*329|        std::fs::write(path, json)\n 330|    }\n 331|\n 332|    /// Upsert a startup default at the canonical path (`endpoint run --save`,\n...\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...\n 385|        let path = dir.path().join(\"daemon.json\");\n*386|        std::fs::write(&path, \"not json {{{\").unwrap();\n 387|        assert_eq!(DaemonConfig::load_from(&path), DaemonConfig::default());\n 388|    }\n 389|\n...\n 430|    #[test]\n*431|    fn detached_subnets_knob_defaults_empty() {\n*432|        assert!(DaemonConfig::default().detached_subnets.is_empty());\n 433|\n 434|        let dir = tempfile::tempdir().unwrap();\n 435|        let path = dir.path().join(\"daemon.json\");\n*436|        std::fs::write(&path, r#\"{\"detached_subnets\": [\"work\"]}\"#).unwrap();\n 437|        assert_eq!(\n 438|            DaemonConfig::load_from(&path).detached_subnets,\n 439|            vec![\"work\".to_string()]\n...\n 443|            .detached_subnets\n*444|            .is_empty());\n 445|    }\n 446|\n 447|    // [unit->REQ-INST-3] the node auto-suspend knob is opt-in: absent ⇒ OFF\n...\n 458|        let path = dir.path().join(\"daemon.json\");\n*459|        std::fs::write(&path, r#\"{\"auto_suspend_after_ms\": 300000}\"#).unwrap();\n 460|        assert_eq!(\n 461|            DaemonConfig::load_from(&path).auto_suspend_after_ms,\n 462|            Some(300_000)\n...\n 479|        let path = dir.path().join(\"daemon.json\");\n*480|        std::fs::write(&path, r#\"{\"full_auto_update\": true}\"#).unwrap();\n 481|        assert!(\n 482|            DaemonConfig::load_from(&path).full_auto_update,\n 483|            \"explicit opt-in honored\"\n...\n 499|        let path = dir.path().join(\"daemon.json\");\n*500|        std::fs::write(&path, r#\"{\"relay\": \"disabled\"}\"#).unwrap();\n 501|        assert_eq!(DaemonConfig::load_from(&path).relay, RelayChoice::Disabled);\n 502|\n 503|        // An unrecognized future value degrades to the default, never wedges.\n*504|        std::fs::write(&path, r#\"{\"relay\": \"quantum-mesh\"}\"#).unwrap();\n 505|        assert_eq!(DaemonConfig::load_from(&path).relay, RelayChoice::N0);\n 506|\n 507|        let cfg = DaemonConfig {\n...\n 518|        let path = dir.path().join(\"daemon.json\");\n*519|        std::fs::write(&path, r#\"{\"crash_grace_ms\": 500}\"#).unwrap();\n 520|\n 521|        let cfg = DaemonConfig::load_from(&path);\n 522|        assert_eq!(cfg.crash_grace, Duration::from_millis(500));\n...\n 537|    // the on-disk config: two entries (one WITH a cwd, one WITHOUT) survive\n*538|    // save→load byte-for-byte, and a legacy/absent file loads as an EMPTY list\n 539|    // (nothing auto-starts by default — a daemon written before F-038 back-loads).\n 540|    #[test]\n 541|    fn startup_endpoints_roundtrip() {\n 542|        assert!(\n*543|            DaemonConfig::default().startup_endpoints.is_empty(),\n 544|            \"default is nothing-auto-starts\"\n 545|        );\n 546|\n...\n 575|        // A legacy daemon.json that predates the field (no `startup_endpoints`\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## conn.rs\n 1|//! Bounded, cancelable, poison-on-failure framed writes for one physical\n*2|//! broker connection (UPDATE-WEDGE round-4).\n 3|//!\n 4|//! ## The failure class this kills\n 5|//!\n*6|//! A broker writer used to hold the connection's `Mutex<SendHalf>` guard\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...\n 13|//! ROLE — it never cancels the in-flight pipe write or closes the physical\n*14|//! connection, so the writer (and every write queued behind the same gate)\n 15|//! stays wedged until the peer process dies (~128 s in the field capture, on a\n 16|//! brain restart).\n 17|//!\n...\n 25|//!    write);\n*26|//! 2. arms an INDEPENDENT per-connection watchdog thread with that absolute\n 27|//!    deadline, then performs the blocking [`write_frame`] OUT of every lock;\n 28|//! 3. on success, returns the half to the gate.\n 29|//!\n...\n 31|//! write returning, nor on opportunistic stall-evict sampling: it poisons the\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...\n 40|//! On deadline, write failure, or cancellation: (1) the WHOLE physical\n*41|//! connection is poisoned, idempotently — a length-prefixed frame may have\n 42|//! been PARTIALLY written, so reuse would corrupt framing; (2) read and write\n 43|//! sides are aborted so `handle_conn` reaches its existing EOF cleanup;\n 44|//! (3) the buffer of the canceled op is released only after the op reports\n...\n 55|//!\n*56|//! No new output queue (the bounded per-sink queues + isolated writer threads\n 57|//! already exist — the block this bounds is BELOW them), and no `PIPE_NOWAIT`\n 58|//! (recorded mid-frame corruption risk). Unix keeps its existing semantics for\n*59|//! healthy connections; only the poison/retire path is new.\n 60|// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 61|\n 62|use std::io;\n...\n 120|    /// The pre-write gate closure declined (e.g. a superseded controller\n*121|    /// writer's epoch check) — nothing was written; the conn stays healthy.\n 122|    Superseded,\n 123|}\n 124|\n...\n 171|    bound: Duration,\n*172|    /// The raw OS handle/fd of the underlying stream, captured at\n 173|    /// construction for the out-of-band abort. The recv and send halves share\n*174|    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\n 175|    /// aborting this handle covers a parked read too. Valid for the whole\n*176|    /// conn lifetime: the half lives in `gate`, a writer's stack, or\n 177|    /// `graveyard` until drop.\n 178|    #[cfg(windows)]\n 179|    raw: isize,\n...\n 224|        let label = recover(&self.label);\n*225|        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\n 226|        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\n 227|    }\n 228|\n...\n 265|    /// UNCONDITIONAL): `write-start` (first write only), `transport-close`\n*266|    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n 267|    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n 268|    /// timeout/cancel leg is the retirement record itself.\n 269|    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 270|    fn lifecycle(&self, event: &str, extra: &str) {\n*271|        let sep = if extra.is_empty() { \"\" } else { \" \" };\n 272|        eprintln!(\n 273|            \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",\n 274|            self.attribution()\n...\n 277|\n*278|    /// Abort the connection's in-flight I/O OUT OF BAND (both directions —\n 279|    /// the halves share one OS object) and latch the poison. Idempotent and\n 280|    /// safe to repeat: `CancelIoEx` on a handle with nothing pending is a\n 281|    /// no-op, and re-cancel closes the race where a write was issued a beat\n...\n 296|        // SAFETY: scalar kernel32 call on a handle whose owning half is kept\n*297|        // alive until Drop (gate / writer stack / graveyard — see `raw`).\n 298|        unsafe {\n 299|            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n 300|        }\n...\n 313|\n*314|    /// Sever the physical connection (exactly once), AFTER the canceled op\n 315|    /// reported completion: on Windows `DisconnectNamedPipe` forces the\n 316|    /// client off (its next access fails), makes a re-issued server-side\n 317|    /// read fail (so `handle_conn` reaches EOF cleanup even if it slipped a\n...\n 323|    // there, load-bearing here. Restructuring (e.g. `if !swapped { … }`)\n*324|    // would leave Unix an empty if-body (`clippy::needless_if`) instead.\n 325|    #[cfg_attr(unix, allow(clippy::needless_return))]\n 326|    fn sever(&self) {\n 327|        if self.severed.swap(true, Ordering::AcqRel) {\n...\n 340|    /// poison + cancel, re-canceling periodically until the op reports\n*341|    /// completion (the writer clears `inflight` the instant `write_frame`\n 342|    /// returns — that return IS the buffer-release handshake), then sever.\n 343|    fn watchdog(&self) {\n 344|        let mut d = recover(&self.dog);\n## consent.rs\n 147|        let owlery = tmp.path().join(\"owlery\");\n*148|        // Empty owlery.\n 149|        assert!(most_recently_active(&owlery).is_none());\n 150|        // Only an offline perch → still None.\n 151|        seed_perch(&owlery, \"doyle\", STATUS_OFFLINE, Some(100));\n## crc_swap.rs\n 64|        let target = install_dir.join(&rel);\n*65|        let differs = match std::fs::read(&target) {\n*66|            Ok(existing) => sha256_hex(&std::fs::read(&path)?) != sha256_hex(&existing),\n 67|            // Absent (or unreadable) target ⇒ a new/changed file to place.\n 68|            Err(_) => true,\n 69|        };\n...\n 285|    /// Write `bytes` to `path`, creating parent dirs. Test helper.\n*286|    fn write(path: &Path, bytes: &[u8]) {\n 287|        if let Some(parent) = path.parent() {\n 288|            fs::create_dir_all(parent).unwrap();\n 289|        }\n*290|        fs::write(path, bytes).unwrap();\n 291|    }\n 292|\n 293|    /// The `rel` paths a plan covers, sorted (the plan already sorts; collect for\n...\n 332|        // fileA: identical in both → skipped.\n*333|        write(&s.join(\"fileA\"), b\"same-bytes\");\n*334|        write(&i.join(\"fileA\"), b\"same-bytes\");\n 335|        // fileB: present in both but DIFFERENT bytes → selected.\n*336|        write(&s.join(\"fileB\"), b\"new-content\");\n*337|        write(&i.join(\"fileB\"), b\"old-content\");\n 338|        // fileC: present only in staging (absent in install) → selected.\n*339|        write(&s.join(\"fileC\"), b\"brand-new\");\n 340|\n 341|        let plan = plan_crc_swap(s, i).unwrap();\n 342|\n...\n 363|        // A changed file three levels deep; the install counterpart differs.\n*364|        write(&s.join(\"sub\").join(\"dir\").join(\"x\"), b\"changed\");\n*365|        write(&i.join(\"sub\").join(\"dir\").join(\"x\"), b\"original\");\n 366|\n 367|        let plan = plan_crc_swap(s, i).unwrap();\n 368|\n...\n 386|        // changed: differs → will be swapped to staged bytes.\n*387|        write(&s.join(\"changed\"), b\"NEW\");\n*388|        write(&i.join(\"changed\"), b\"OLD\");\n 389|        // identical: same bytes → must remain byte-unchanged and not be in the plan.\n*390|        write(&s.join(\"identical\"), b\"STABLE\");\n*391|        write(&i.join(\"identical\"), b\"STABLE\");\n 392|        // fresh under a nested parent that does NOT yet exist in install → created.\n 393|        let fresh_rel: PathBuf = [\"newdir\", \"fresh\"].iter().collect();\n*394|        write(&s.join(&fresh_rel), b\"FRESH\");\n 395|        assert!(!i.join(\"newdir\").exists(), \"precondition: nested parent absent\");\n 396|\n 397|        let plan = plan_crc_swap(s, i).unwrap();\n...\n 405|\n*406|        assert_eq!(fs::read(i.join(\"changed\")).unwrap(), b\"NEW\", \"changed got new bytes\");\n 407|        assert_eq!(\n*408|            fs::read(i.join(&fresh_rel)).unwrap(),\n 409|            b\"FRESH\",\n 410|            \"fresh file materialized with its nested parent dir created\"\n 411|        );\n 412|        assert_eq!(\n*413|            fs::read(i.join(\"identical\")).unwrap(),\n 414|            b\"STABLE\",\n 415|            \"identical file byte-unchanged (never touched)\"\n 416|        );\n...\n 440|        let first_staged = s.join(\"first.src\");\n*441|        write(&first_staged, b\"AFTER\");\n 442|        let first_target = i.join(\"first\");\n## daemon.rs\n 3|//! [`Daemon::run`] is the body of the hidden `spt daemon` subcommand: it binds\n*4|//! the broker (B1/B2 PTY hosting) and the seed-control channel (B6) under the\n 5|//! canonical per-home names ([`crate::endpoint`]) and serves both for the life\n 6|//! of the process.\n 7|//!\n...\n 160|        // The broker's network host (D4a, ADR-0004 §B): the node's iroh endpoint\n*161|        // + live QUIC connections live in the broker so they survive a brain\n 162|        // restart. Identity is the durable node.key (stable name across daemon\n 163|        // restarts); relay stance comes from daemon.json; mDNS rides the\n 164|        // endpoint (closing the §B mDNS/relay-session row by construction). A\n*165|        // net failure degrades to a net-less broker — it must not cost PTY\n 166|        // hosting (mirrors the broker-bind soft-fail below).\n 167|        // [impl->REQ-DAEMON-2]\n 168|        // Identity (the durable node.key) decides node_hex independently of the\n...\n 181|\n*182|        // The broker hosts PTYs (B1/B2) + the net endpoint (D4a). Serve it on a\n 183|        // background thread; a bind failure there must not stop the seed channel\n*184|        // (the B6 surface) — the PTY-hosting consumers arrive in B7/B8.\n 185|        let net_up = net.is_some();\n 186|        // Keep the broker handle alive past the bind so the brain supervisor's\n 187|        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\n...\n 253|\n*254|        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\n 255|        // the digest-control channel serves `spt digest <id>` snapshot pulls +\n*256|        // delta-stream subscribes against it. Served on a background thread like\n 257|        // the broker. The per-session feed that *populates* the hub is driven by\n 258|        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\n 259|        // sessions are spawned through the broker; a bare daemon serves the\n...\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*287|        // the shell binary's `api tunnel` resolve their stream end through it.\n 288|        // [impl->REQ-SHELL-4]\n 289|        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\n 290|        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\n...\n 349|        // is the socket ping, never this file, so a stale value is harmless.\n*350|        let _ = std::fs::write(daemon_pid_path(), std::process::id().to_string());\n 351|\n 352|        // The seed-control channel is the foreground loop. Binding it is what\n 353|        // arbitrates the single-daemon-per-home invariant: a second daemon racing\n...\n 441|    let mut backoff = NET_RETRY_FIRST;\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...\n 619|/// with `bInheritHandles = TRUE`, so the long-lived daemon would inherit that\n*620|/// pipe's write end and hold it open forever — the capturing reader never sees\n 621|/// EOF and hangs. Worse, inheritable pipe handles flow through EVERY\n 622|/// `bInheritHandles = TRUE` hop: stripping only this process's *std* handles\n 623|/// (the first guard shipped here) still leaked a grandparent capture's pipe\n...\n 924|    }\n*925|    Err(last_err.unwrap_or_else(|| io::Error::other(\"empty launch ladder\")))\n 926|}\n 927|\n 928|/// Launch the daemon `program args…` job-neutral: drive [`launch_ladder`] with\n...\n 959|    if let Ok(marker) = std::env::var(\"SPT_LAUNCH_RUNG_MARKER\") {\n*960|        let _ = std::fs::write(&marker, via);\n 961|    }\n 962|    if matches!(rung, LaunchRung::InJob) {\n 963|        eprintln!(\n...\n 1235|pub(crate) fn quote_windows_arg(out: &mut String, arg: &str) {\n*1236|    if !arg.is_empty() && !arg.chars().any(|c| c == ' ' || c == '\\t' || c == '\"') {\n 1237|        out.push_str(arg);\n 1238|        return;\n 1239|    }\n...\n 1527|                }\n*1528|                let _ = std::fs::write(\n 1529|                    &diag,\n 1530|                    format!(\"launcher_in_job={launcher_in} gc_in_any_job={gc_in}\"),\n 1531|                );\n 1532|            }\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## deadline.rs\n 124|        if let Some(parent) = path.parent() {\n*125|            if !parent.as_os_str().is_empty() {\n 126|                std::fs::create_dir_all(parent)?;\n 127|            }\n 128|        }\n 129|        let raw = serde_json::to_string(self).map_err(std::io::Error::other)?;\n*130|        std::fs::write(path, raw)\n 131|    }\n 132|\n 133|    /// The next fire at or after `now_ms`, derived functionally — **NO write**:\n...\n 334|        with_home(|_| {\n*335|            std::fs::write(anchor_path(\"pulse\"), b\"{ not valid json\").unwrap();\n 336|            // A garbled file is treated as absent → Update falls back to fresh.\n 337|            let upd = DeadlineAnchor::open(\"pulse\", 100, StartReason::Update, 8_000).unwrap();\n 338|            assert_eq!(upd.anchor_ms, 8_000);\n## deelevate.rs\n 86|    const EQ: u16 = b'=' as u16;\n*87|    // Parse NAME=VALUE entries (stop at the block-terminating empty string).\n 88|    let mut entries: Vec<Vec<u16>> = Vec::new();\n 89|    let mut cur: Vec<u16> = Vec::new();\n 90|    for &u in block {\n 91|        if u == NUL {\n*92|            if cur.is_empty() {\n 93|                break;\n 94|            }\n 95|            entries.push(std::mem::take(&mut cur));\n...\n 99|    }\n*100|    if !cur.is_empty() {\n 101|        entries.push(cur); // tolerate a block missing its final terminator\n 102|    }\n 103|    let name_of = |e: &[u16]| -> String {\n...\n 204|    fn user_by_name(name: &str) -> Option<SudoInvoker> {\n*205|        if name.is_empty() {\n 206|            return None;\n 207|        }\n 208|        let cname = std::ffi::CString::new(name).ok()?;\n...\n 213|        let mut buf = vec![0u8; buf_len as usize];\n*214|        loop {\n 215|            let mut pwd: libc::passwd = unsafe { std::mem::zeroed() };\n 216|            let mut result: *mut libc::passwd = std::ptr::null_mut();\n 217|            let rc = unsafe {\n...\n 241|                    .into_owned();\n*242|                (!s.is_empty()).then(|| PathBuf::from(s))\n 243|            };\n 244|            return Some(SudoInvoker {\n 245|                uid: pwd.pw_uid,\n...\n 260|        }\n*261|        match std::fs::write(&path, format!(\"{name}\\n\")) {\n 262|            Ok(()) => eprintln!(\n 263|                \"ELECTED_DEFAULT_USER:{name} (recorded in {})\",\n 264|                path.display()\n...\n 285|        let default_name = invoker.user.clone().unwrap_or_default();\n*286|        if default_name.is_empty() {\n 287|            return Some(invoker); // no name to elect by; drop without electing\n 288|        }\n 289|        // The one-time election: prompt when interactive (Enter = the\n...\n 320|        let s = s.trim().to_string();\n*321|        (!s.is_empty()).then_some(s)\n 322|    }\n 323|\n 324|    /// The uid's home dir via `getpwuid_r` (reentrant; buffer grown on\n...\n 332|        let mut buf = vec![0u8; buf_len as usize];\n*333|        loop {\n 334|            let mut pwd: libc::passwd = unsafe { std::mem::zeroed() };\n 335|            let mut result: *mut libc::passwd = std::ptr::null_mut();\n 336|            let rc = unsafe {\n...\n 353|            let s = dir.to_string_lossy().into_owned();\n*354|            return if s.is_empty() {\n 355|                None\n 356|            } else {\n 357|                Some(PathBuf::from(s))\n...\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 751|        let mut overlaid: Vec<u16> = Vec::new();\n*752|        let env_ptr = if env_built && !overrides.is_empty() {\n 753|            let raw = unsafe { env_block_to_vec(env as *const u16) };\n 754|            overlaid = super::apply_env_overrides(&raw, &overrides);\n 755|            overlaid.as_mut_ptr() as *mut core::ffi::c_void\n...\n 841|            if u == 0 {\n*842|                if cur.is_empty() {\n 843|                    break;\n 844|                }\n 845|                out.push(String::from_utf16_lossy(&cur));\n...\n 905|        let file = dir.path().join(\"default-user\");\n\n[Showing lines 1-1013 of 1314 (50.0KB limit). Use :1014 to continue]"}],"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":286,"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/bin/xlate_choreo_fixture.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/codec.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/deelevate.rs","crates/spt-daemon/src/digest.rs","crates/spt-daemon/src/digesthub.rs","crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/access.rs","count":5},{"path":"crates/spt-daemon/src/adapter_update.rs","count":1},{"path":"crates/spt-daemon/src/applyhost.rs","count":20},{"path":"crates/spt-daemon/src/attach.rs","count":20},{"path":"crates/spt-daemon/src/autostart.rs","count":10},{"path":"crates/spt-daemon/src/bin/xlate_choreo_fixture.rs","count":9},{"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/codec.rs","count":3},{"path":"crates/spt-daemon/src/config.rs","count":20},{"path":"crates/spt-daemon/src/conn.rs","count":20},{"path":"crates/spt-daemon/src/consent.rs","count":1},{"path":"crates/spt-daemon/src/crc_swap.rs","count":20},{"path":"crates/spt-daemon/src/daemon.rs","count":18},{"path":"crates/spt-daemon/src/deadline.rs","count":3},{"path":"crates/spt-daemon/src/deelevate.rs","count":19},{"path":"crates/spt-daemon/src/digest.rs","count":17},{"path":"crates/spt-daemon/src/digesthub.rs","count":20},{"path":"crates/spt-daemon/src/dispatch.rs","count":20}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## access.rs\n  15│//!   endpoint's identity or home. The subject value MUST be the QUIC\n *16│//!   handshake-proven remote node id from the broker's conn/stream table,\n  17│//!   never a payload field (REQ-HAZARD-WAN-ORIGIN-AUTH).\n  18│//! - **Outbound** → any visible node: the whitelist never restricts who an\n  19│//!   endpoint talks *to*.\n    │...\n  28│//!   origin that *is* this node (a loopback self-dial) short-circuits Allow.\n *29│//! - **Default absent = open**; setting a whitelist restricts (an empty entry\n  30│//!   = locked down). Node-tier ships M4 (Ed25519 node pubkeys); the user tier\n  31│//!   is an inert schema reservation until the cross-user model (ADR-0006).\n  32│//!\n    │...\n  35│//! an `spt access` edit takes effect on the next inbound without a daemon\n *36│//! restart, and the checks run at message/stream-establishment rate where a\n  37│//! small-file read is noise.\n  38│//!\n  39│//! **Class policy:** only the *message* funnel ([`crate::wan`]) classifies\n    │...\n 143│    // restricted endpoint admits listed nodes and refuses unlisted ones;\n*144│    // an empty entry is locked down; other endpoints stay open.\n 145│    #[test]\n 146│    fn gate_decision_table() {\n 147│        with_home(|_| {\n    │...\n 179│                AccessDecision::Deny,\n*180│                \"empty entry refuses everyone\"\n 181│            );\n 182│\n 183│            // Open: entry deleted → default-open again.\n## adapter_update.rs\n 390│            std::fs::create_dir_all(&src).unwrap();\n*391│            std::fs::write(src.join(\"manifest.toml\"), body).unwrap();\n 392│            src\n 393│        };\n 394│        let plain = seed(\n## applyhost.rs\n  82│    /// be the optimistic enlyzeam write D6 exists to kill. `version` is the\n *83│    /// monotonic counter; `product_version` the human-facing semver (empty for\n  84│    /// pre-v0.3.2 metadata, whence the counter-based fallback message).\n  85│    // [impl->REQ-UPD-6]\n  86│    // [impl->REQ-UPD-8]\n    │...\n  95│    /// new bytes and promotes it on the fresh brain's `ready`. `version` is the\n *96│    /// monotonic counter; `product_version` the human semver (empty pre-v0.3.2).\n  97│    // [impl->REQ-UPDATE-ONE-SHOT-FINISH]\n  98│    AppliedDaemonless {\n  99│        version: u64,\n    │...\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 172│            \"release-keys.json unprovisioned (no trusted keys)\".to_string(),\n 173│        )));\n    │...\n 318│    // Connect to the broker BEFORE the binary moves — a dead broker fails the\n*319│    // apply with the seat untouched. The connection is the channel the planned\n 320│    // brain-restart trigger rides after the swap (ADR-0018 D3-3); it does not\n 321│    // attach to any session (the broker holds every hosted endpoint across the\n 322│    // brain cycle — that is the whole point).\n    │...\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 357│/// construction. The recovery verb for wedged brain-held state that previously\n 358│/// needed a full daemon bounce. Nothing is verified, staged, or renamed: the\n 359│/// respawn lands on the SAME on-disk binary. A candidate that fails readiness\n    │...\n 625│            .collect();\n*626│        std::fs::write(\n 627│            &keys,\n 628│            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 629│        )\n    │...\n 687│            .collect();\n*688│        std::fs::write(\n 689│            &keys,\n 690│            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 691│        )\n    │...\n 723│            .collect();\n*724│        std::fs::write(\n 725│            &keys,\n 726│            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 727│        )\n    │...\n 743│        let exe = dir.path().join(\"spt-binary\");\n*744│        std::fs::write(&exe, b\"OLD\").unwrap();\n 745│\n 746│        let cache = ReleaseCache::open(&dir.path().join(\"releases\"));\n 747│        let (signed, keys) = sign_single(dir.path(), 7, b\"CROSS-OS BYTES\");\n    │...\n 756│        );\n*757│        assert_eq!(std::fs::read(&exe).unwrap(), b\"OLD\", \"seat untouched\");\n 758│\n 759│        // 2. Single stamped for the OTHER OS refuses too. \"Other\" = any\n 760│        //    registered platform that is not this host — derived from the\n    │...\n 775│        );\n*776│        assert_eq!(std::fs::read(&exe).unwrap(), b\"OLD\", \"seat untouched\");\n 777│\n 778│        // 3. Stamped for THIS platform: the single applies (the legitimate\n 779│        //    origin-fetched-local path).\n    │...\n 787│        );\n*788│        assert_eq!(std::fs::read(&exe).unwrap(), b\"CROSS-OS BYTES\");\n 789│    }\n 790│\n 791│    // [unit->REQ-HAZARD-BROKER-PROCESS-ISOLATION] [unit->REQ-UPD-3] the planned\n    │...\n 889│        let exe = dir.path().join(\"spt-binary\");\n*890│        std::fs::write(&exe, b\"OLD BINARY\").unwrap();\n 891│        let (cache, keys) = stage(dir.path(), 7, b\"NEW BINARY BYTES\", BROKER_RESOURCE_ABI);\n 892│\n 893│        let out = apply_staged(&cache, &keys, &exe, &name).expect(\"apply ok\");\n    │...\n 898│        assert_eq!(\n*899│            std::fs::read(&exe).unwrap(),\n 900│            b\"NEW BINARY BYTES\",\n 901│            \"artifact landed\"\n 902│        );\n 903│        assert_eq!(\n*904│            std::fs::read(swap_aside_path(&exe, 7)).unwrap(),\n 905│            b\"OLD BINARY\",\n 906│            \"the outgoing binary stepped aside\"\n 907│        );\n    │...\n 927│        let exe = dir.path().join(\"spt-binary\");\n*928│        std::fs::write(&exe, b\"OLD BINARY\").unwrap();\n 929│        let (cache, keys) = stage(dir.path(), 7, b\"NEW BINARY BYTES\", BROKER_RESOURCE_ABI);\n 930│\n 931│        // No served_broker — deliberately. A daemonless apply must not need one.\n    │...\n 937│        assert_eq!(\n*938│            std::fs::read(&exe).unwrap(),\n 939│            b\"NEW BINARY BYTES\",\n 940│            \"artifact landed without any broker handoff\"\n 941│        );\n 942│        assert_eq!(\n*943│            std::fs::read(swap_aside_path(&exe, 7)).unwrap(),\n 944│            b\"OLD BINARY\",\n 945│            \"the outgoing binary stepped aside\"\n 946│        );\n    │...\n 966│        let exe = dir.path().join(\"spt-binary\");\n*967│        std::fs::write(&exe, b\"OLD\").unwrap();\n 968│\n 969│        // Nothing staged.\n*970│        let empty = ReleaseCache::open(&dir.path().join(\"releases\"));\n 971│        let keys = dir.path().join(\"release-keys.json\");\n## attach.rs\n  *1│//! Remote terminal attach (M4-D5b, REQ-INST-8) — serve a byte-stream viewport\n   2│//! onto a local session for an operator on another node.\n   3│//!\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   9│//!   (fire-and-forget sends; `Output.seq` carries the dedup authority);\n  10│//! - inbound [`AttachRecord::Input`] → [`Brain::send_effect`] with the\n *11│//!   operator-minted `op_id` — exactly-once at the PTY write through the B5\n  12│//!   journal (a replayed input record cannot double-type);\n *13│//! - session `Exit` → [`AttachRecord::Exit`] + stream finish.\n  14│//!\n  15│//! ## Exactly-once lives at the EDGES, not the wire sends\n  16│//!\n *17│//! Stream sends here are deliberately **unjournaled** (`op_id: None`): a\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  23│//! `Input.op_id`, and the operator's viewport dedups `Output` records by their\n  24│//! session-log `seq` (the render cursor). A post-restart re-serve may\n  25│//! re-transmit output records on the wire — duplicates are dropped at the\n    │...\n  32│//! [`access_check`] sees the **handshake-proven** origin from the broker's\n *33│//! stream table — never payload bytes (KNOWN-HAZARDS 7.5). Remote-drive of\n  34│//! your own running instance is ungated by default (ADR-0009 default-open);\n  35│//! the D5d whitelist drops in at this same call.\n  36│//!\n  37│//! Restart survival composes from D4/B5 with **no new machinery**: the broker\n *38│//! owns the QUIC stream, the session, its `OutputLog`, and the effect journal.\n  39│//! A restarted target brain re-attaches the session from its output cursor,\n *40│//! resubscribes the stream from its net cursor, and re-drives journaled sends;\n  41│//! a restarted operator brain resubscribes and dedups rendered chunks by\n  42│//! `Output.seq`.\n  43│\n    │...\n  73│    Refused,\n *74│    /// The session's child exited; the `Exit` record was sent and the stream\n  75│    /// finished.\n  76│    Exited(Option<i32>),\n  77│    /// The operator closed its send side (detached); the viewport ended with\n    │...\n  80│    /// This controller was DISPLACED by a different operator's `--take`/`kick`\n *81│    /// (REQ-KICK-1): the loud `Displaced` notice was sent and the stream\n  82│    /// finished. The endpoint stays driven (by the taker) — no dormant edge.\n  83│    Displaced,\n  84│}\n    │...\n  86│/// The role a serve loop resolved to, once the broker's [`SubscribeOutcome`]\n *87│/// arrives — gates wake (controller-only) and PTY input.\n  88│#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n  89│enum ServeRole {\n  90│    /// The interactive controller (input + resize; wakes the endpoint).\n    │...\n 140│/// bounded channel is full (a controller that falls behind its own echo under a\n*141│/// hard flood). The next frame this reader sees is then a FORWARD gap that the\n 142│/// strict reject-gap (`read_event`, legacy single-session path) FATALS. A\n 143│/// controller CANNOT snap-above like a viewer (B2: it is authoritative — it\n 144│/// advances `delivered_through`; skipping rolled frames would be a not-exactly-once\n    │...\n 154│/// spins. The helper swallows the `Subscribed` ack its own re-subscribe produces so\n*155│/// the repeated-gap detection is not masked. Non-`Output` events (NetStreamData /\n 156│/// Size / Exit / …) pass through unchanged.\n 157│// [impl->REQ-HAZARD-CONTROLLER-GAP-RESUME]\n 158│/// `gen` is the serve worker's attach generation (ADR-0038 Amendment fix 6):\n    │...\n 172│    let mut swallow_resume_ack = false;\n*173│    loop {\n 174│        match brain.read_event() {\n 175│            // Our own re-subscribe's Subscribed reply: swallow it (role is already\n 176│            // resolved) so it cannot mask a repeated gap as forward progress.\n    │...\n 231│///   viewer / busy / take by intent + origin and replies a `Subscribed`;\n*232│///   driven_by / viewer_count are BROKER-owned (single writer). A VIEWER\n 233│///   attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);\n 234│///   the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).\n 235│// [impl->REQ-RC-CROSS-NODE-ATTACH]\n    │...\n 240│    wire: &mut Brain,\n*241│    stream_id: u64,\n 242│    endpoint: &str,\n 243│    origin_node: &str,\n 244│    remote_session: Option<u64>,\n    │...\n 254│    if access_check(endpoint, origin_node, InboundClass::Unsolicited) == AccessDecision::Deny {\n*255│        wire.net_stream_send(stream_id, &[], None, true)?;\n 256│        return Ok(Some(AttachServeOutcome::Refused));\n 257│    }\n 258│    let sid = remote_session.unwrap_or(session_id);\n## autostart.rs\n  38│    let entries = DaemonConfig::load().startup_endpoints;\n *39│    if entries.is_empty() {\n  40│        return;\n  41│    }\n  42│    let adapters_dir = spt_store::perch::adapters_dir();\n    │...\n  71│        // A fresh session every replay: the daemon just started, so the broker\n *72│        // session map is empty — no duplicate-session risk on this path (the\n  73│        // CLI's live probe guards the manual-run-over-live case, REQ-RUN-NO-DUP-SESSION).\n  74│        let session_id = crate::harnesshost::mint_session_id();\n  75│        let mut last_err = String::new();\n    │...\n 129│    /// daemon-boot thread. The socket name is intentionally bogus: these gates\n*130│    /// exercise only the pre-launch legs (empty list / loud-skip), which never\n 131│    /// dial the broker, so it must never be reached.\n 132│    fn replay_bounded(budget: Duration) {\n 133│        let (tx, rx) = mpsc::channel();\n    │...\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 142│        handle.join().expect(\"watchdog thread must not panic\");\n 143│    }\n 144│\n*145│    // [unit->REQ-ENDPOINT-AUTOSTART] an empty startup-endpoints list is a pure\n 146│    // no-op: replay reads the (absent) config, finds nothing, and returns without\n 147│    // touching the broker at all — the zero-config default path.\n 148│    #[test]\n*149│    fn empty_config_is_a_pure_noop() {\n 150│        crate::test_home::with_home(|_home| {\n*151│            // No daemon.json at all → DaemonConfig::load() defaults to an empty\n 152│            // startup_endpoints list → early return, no launch, no dial.\n 153│            assert!(\n*154│                DaemonConfig::load().startup_endpoints.is_empty(),\n 155│                \"precondition: the isolated home has no saved startup endpoints\"\n 156│            );\n 157│            replay_bounded(Duration::from_secs(10));\n    │...\n 169│            // A config that names an adapter that was never registered, against an\n*170│            // empty adapters dir → resolve_option Errs → the SKIP branch fires and\n 171│            // `continue`s past the launch entirely.\n 172│            let cfg = DaemonConfig {\n 173│                startup_endpoints: vec![StartupEndpoint {\n    │...\n 180│            cfg.save_to(&DaemonConfig::default_path()).unwrap();\n*181│            // The adapters dir is absent/empty in a fresh isolated home; assert the\n 182│            // precondition so a future default that pre-seeds adapters can't mask\n 183│            // this gate silently.\n 184│            let adapters = home.join(\"adapters\");\n## brain.rs\n  31│\n *32│use interprocess::local_socket::{SendHalf, Stream};\n  33│\n  34│use crate::codec::{read_frame, write_frame};\n  35│use crate::frame::{Envelope, Role};\n    │...\n  41│    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n *42│    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n *43│    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n  44│    SessionsReply, SizeEvent, SpawnReq, Spawned, SubscribeOutcome, SubscribeReq, SubscribedReply,\n  45│    ViewerEvictedEvent,\n  46│    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    │...\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_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  55│    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n  56│    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n  57│};\n    │...\n 115│    },\n*116│    /// The current PTY size of a session, pushed to a VIEWER (the letterbox feed,\n 117│    /// REQ-RCVIEW-1).\n 118│    Size {\n 119│        session_id: u64,\n    │...\n 143│    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\n*144│    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\n 145│    /// ([`Self::NetPresence`]), not this frame.\n 146│    NetDialSubmitted,\n*147│    /// A stream open durably landed — fresh or deduped (D4b).\n*148│    NetStreamOpened(NetStreamOpened),\n*149│    /// A journaled stream send durably landed — fresh or deduped (D4b).\n 150│    NetSent(NetSent),\n*151│    /// The broker's held-streams listing (D4b).\n*152│    NetStreams(NetStreamsReply),\n 153│    /// The broker's hosted-sessions listing (D9-1: session → endpoint).\n 154│    Sessions(SessionsReply),\n 155│    /// The subnet-join ceremony's verdict (a `pair-joined` reply, M7 D3).\n    │...\n 159│    MetMember(MetMember),\n*160│    /// A contiguous chunk of a stream's reads (the cursor has advanced past it).\n*161│    NetStreamData {\n*162│        stream_id: u64,\n 163│        seq: u64,\n 164│        bytes: Vec<u8>,\n 165│    },\n*166│    /// A stream's read side finished cleanly; `next_seq` is the completeness\n 167│    /// check (the subscriber's cursor must equal it to have missed nothing).\n*168│    NetStreamEof { stream_id: u64, next_seq: u64 },\n 169│    /// A contiguous conn-liveness event (the presence cursor has advanced past\n 170│    /// it) — connected/disconnected on the broker's conn table (D4c).\n 171│    NetPresence(NetPresenceEvent),\n    │...\n 190│\n*191│/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\n 192│/// non-pump client: blocking, unbounded reads, correct everywhere) or a\n 193│/// **split** carrier for the peer pump.\n 194│///\n## brainproc.rs\n  19│//! broker spawns + supervises a brain child over the socket, and the broker\n *20│//! (with its PTY children + seed channel) survives the brain dying — the\n  21│//! supervisor respawns it from the executable path, which on a real update is\n  22│//! the swapped binary.\n  23│// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    │...\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 143│/// from the (possibly swapped) binary.\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 184│    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\n*185│    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\n 186│    // so this is a no-op now and forward-correct when daemon-hosted sessions land\n 187│    // (the live-agent adapter). A failure here is non-fatal — the brain still\n*188│    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\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    │...\n 199│    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\n*200│    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\n 201│    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n 202│    match brain.resume_session_cursors() {\n*203│        Ok(ids) if !ids.is_empty() => {\n 204│            eprintln!(\n 205│                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\n 206│                ids.len()\n    │...\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 250│    // reconcile in the background (ready-without-warm is preserved because\n 251│    // write_ready already fired above), then drain/debounce/coalesce the\n 252│    // invalidation queue. Same posture as the hosts above: the stop flag is\n    │...\n 254│    // rehydrates from the persisted index (warm start, fingerprint-gated).\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    │...\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    │...\n 366│    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\n*367│    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\n 368│    // tolerates its absence). Never fail the ready write over a diagnostic field.\n 369│    if let Some(hash) = current_exe_hash() {\n 370│        obj[\"exe_hash\"] = serde_json::Value::String(hash);\n    │...\n 382│    let exe = std::env::current_exe().ok()?;\n*383│    let bytes = std::fs::read(exe).ok()?;\n 384│    Some(crate::release::sha256_hex(&bytes))\n 385│}\n 386│\n    │...\n 472│    fn staged_artifact_hash(&self, version: u64) -> Option<String>;\n*473│    /// Whether the OLD brain generation's broker subscriber connection is DRAINED —\n 474│    /// its local controller conn CLOSED or stall-evicted, no blocked writes still\n 475│    /// pending on it (REQ-UPDATE-PROMOTE-DRAINED). Reads BROKER TRUTH in-process (no\n 476│    /// brain round-trip): the supervisor promotes a ready candidate only once this is\n    │...\n 592│/// = the A11 kill+wait precedes `rollback`), so no brain-side pump can be\n*593│/// advertising and the [`spt_store::epoch::EpochSource`] single-writer assumption\n 594│/// (epoch.rs) holds at this `EpochSource::load`. **Do NOT fire broker-side notifs\n 595│/// while a brain is live:** concurrent `EpochSource` read-modify-write across the\n 596│/// two processes mints duplicate epochs (KH 4.8 lost-update). The forward fix for\n    │...\n 688│    let mut ready_seen = false;\n*689│    loop {\n 690│        if stop.load(Ordering::Relaxed) {\n 691│            return TrialStep::Stopped;\n 692│        }\n    │...\n 876│                if supervise {\n*877│                    loop {\n 878│                        if stop.load(Ordering::Relaxed) {\n 879│                            let _ = child.kill();\n 880│                            let _ = child.wait();\n## broker.rs\n   3│//! Per ADR-0004 §B the broker holds **only** the resources a live consumer\n  *4│//! would lose continuity on if the logic restarted: the PTY master+writer and\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  10│//! ## Gapless handoff (B2 — the load-bearing invariant)\n    │...\n  13│//! crash). The broker — and every hosted child — must survive that untouched,\n *14│//! and the new brain must re-attach to the output stream **gaplessly and\n  15│//! exactly-once** (Spike #1 made real). Two mechanisms:\n  16│//!\n  17│//! - **Sequenced, buffered output.** Each session's output is appended to an\n  18│//!   [`OutputLog`]: every chunk gets a monotonic per-session `seq` and is held\n *19│//!   in a bounded ring. The current subscriber (a brain connection) receives\n  20│//!   chunks live; all subscriber writes happen *under the log lock*, so frames\n  21│//!   reach the brain in strict `seq` order with no interleave.\n  22│//! - **Resume from a cursor.** A reconnecting brain sends `subscribe` with its\n *23│//!   last-seen `seq + 1`; the broker replays the ring from there, then streams\n  24│//!   live. The brain dedups by `seq`. Output produced *while no brain was\n  25│//!   attached* sits in the ring and is replayed on the next subscribe — so a\n  26│//!   brain restart loses nothing.\n  27│//!\n *28│//! Sessions are therefore **broker-owned and outlive any one connection**: a\n *29│//! brain disconnect only detaches the subscriber; the child, its PTY, and the\n  30│//! output log persist. A session leaves the table only when its child exits\n  31│//! (reaped by the exit waiter) or is explicitly killed.\n  32│// [impl->REQ-DAEMON-2]\n    │...\n  41│\n *42│use interprocess::local_socket::{prelude::*, Stream};\n *43│use spt_term::{Drain, PtySession, ScreenGrid, SessionSurface, SurfaceSize};\n  44│\n  45│use spt_net::net::attach::AttachIntent;\n  46│use spt_net::net::endpoint::EndpointAddr;\n    │...\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, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n  60│    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  62│    KIND_NET_DIAL_SUBMITTED, KIND_NET_PRESENCE_SUBSCRIBE,\n    │...\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_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  69│    KIND_SPAWNED, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,\n  70│};\n    │...\n  74│\n *75│/// The shared, serialized send side of one brain connection. Output frames,\n  76│/// replay frames, command acks, and exit/error events all write through this.\n *77│/// `pub(crate)`: the net host's stream logs (D4b) live-send through the same\n  78│/// handle under the same gate discipline. Round-4\n  79│/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw\n  80│/// `Arc<Mutex<SendHalf>>` — [`BrokerConn`] owns the half and every write is\n    │...\n  92│/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n *93│/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n *94│/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n  95│/// owns the replay batch), so a viewer attaching to a busy session is not\n  96│/// spuriously evicted.\n  97│const VIEWER_CHANNEL_DEPTH: usize = 256;\n    │...\n  99│/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n*100│/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\n 101│const MAX_VIEWERS: usize = 32;\n 102│\n 103│/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n 104│/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n*105│/// the live stream) or a `Disconnected` one (its writer thread ended after a\n 106│/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n 107│/// is the pure decision the fan-out applies under the log lock.\n 108│// [impl->REQ-HAZARD-VIEWER-ISOLATION]\n## codec.rs\n  5│//! framing) but generic over any [`Read`]/[`Write`] — the IPC carrier is a\n *6│//! local socket (named pipe / UDS), not a `TcpStream`, and tests exercise it\n  7│//! over in-memory buffers and socket pairs.\n  8│//!\n  9│//! The frame *codec* is deliberately transport-agnostic: it is the byte-level\n*10│//! contract, while [`crate::transport`] owns the OS-specific connection.\n 11│// [impl->REQ-DAEMON-2]\n 12│\n 13│use std::io::{self, Read, Write};\n   │...\n 75│\n*76│    // [unit->REQ-DAEMON-2] multiple frames stream back-to-back without bleed.\n 77│    #[test]\n 78│    fn back_to_back_frames_decode_independently() {\n 79│        let mut buf: Vec<u8> = Vec::new();\n## config.rs\n  81│    pub adapter: String,\n *82│    /// The project cwd the harness PTY lands in (captured at `--save`).\n  83│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n  84│    pub cwd: Option<String>,\n  85│}\n    │...\n 181│    /// `attachment.json` from this list — `spt subnet detach/attach --save`\n*182│    /// writes it. Default empty = every held subnet starts attached.\n 183│    pub detached_subnets: Vec<String>,\n 184│    /// The worker-reap TTL floor (seconds since a worker's `started`), W-3\n 185│    /// (REQ-WORKER-REAP): the reconcile GC reaps any worker older than this even\n    │...\n 192│    /// REQ-ENDPOINT-AUTOSTART) — `spt endpoint run --save` writes this list.\n*193│    /// Default empty = nothing auto-starts. A replay failure logs loud and\n 194│    /// never blocks daemon start or the other replays.\n 195│    pub startup_endpoints: Vec<StartupEndpoint>,\n 196│    /// The docs server port override (ADR-0036 §4, REQ-DOCS-LOCAL-SERVER).\n    │...\n 328│            .map_err(|e| std::io::Error::other(e.to_string()))?;\n*329│        std::fs::write(path, json)\n 330│    }\n 331│\n 332│    /// Upsert a startup default at the canonical path (`endpoint run --save`,\n    │...\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    │...\n 385│        let path = dir.path().join(\"daemon.json\");\n*386│        std::fs::write(&path, \"not json {{{\").unwrap();\n 387│        assert_eq!(DaemonConfig::load_from(&path), DaemonConfig::default());\n 388│    }\n 389│\n    │...\n 430│    #[test]\n*431│    fn detached_subnets_knob_defaults_empty() {\n*432│        assert!(DaemonConfig::default().detached_subnets.is_empty());\n 433│\n 434│        let dir = tempfile::tempdir().unwrap();\n 435│        let path = dir.path().join(\"daemon.json\");\n*436│        std::fs::write(&path, r#\"{\"detached_subnets\": [\"work\"]}\"#).unwrap();\n 437│        assert_eq!(\n 438│            DaemonConfig::load_from(&path).detached_subnets,\n 439│            vec![\"work\".to_string()]\n    │...\n 443│            .detached_subnets\n*444│            .is_empty());\n 445│    }\n 446│\n 447│    // [unit->REQ-INST-3] the node auto-suspend knob is opt-in: absent ⇒ OFF\n    │...\n 458│        let path = dir.path().join(\"daemon.json\");\n*459│        std::fs::write(&path, r#\"{\"auto_suspend_after_ms\": 300000}\"#).unwrap();\n 460│        assert_eq!(\n 461│            DaemonConfig::load_from(&path).auto_suspend_after_ms,\n 462│            Some(300_000)\n    │...\n 479│        let path = dir.path().join(\"daemon.json\");\n*480│        std::fs::write(&path, r#\"{\"full_auto_update\": true}\"#).unwrap();\n 481│        assert!(\n 482│            DaemonConfig::load_from(&path).full_auto_update,\n 483│            \"explicit opt-in honored\"\n    │...\n 499│        let path = dir.path().join(\"daemon.json\");\n*500│        std::fs::write(&path, r#\"{\"relay\": \"disabled\"}\"#).unwrap();\n 501│        assert_eq!(DaemonConfig::load_from(&path).relay, RelayChoice::Disabled);\n 502│\n 503│        // An unrecognized future value degrades to the default, never wedges.\n*504│        std::fs::write(&path, r#\"{\"relay\": \"quantum-mesh\"}\"#).unwrap();\n 505│        assert_eq!(DaemonConfig::load_from(&path).relay, RelayChoice::N0);\n 506│\n 507│        let cfg = DaemonConfig {\n    │...\n 518│        let path = dir.path().join(\"daemon.json\");\n*519│        std::fs::write(&path, r#\"{\"crash_grace_ms\": 500}\"#).unwrap();\n 520│\n 521│        let cfg = DaemonConfig::load_from(&path);\n 522│        assert_eq!(cfg.crash_grace, Duration::from_millis(500));\n    │...\n 537│    // the on-disk config: two entries (one WITH a cwd, one WITHOUT) survive\n*538│    // save→load byte-for-byte, and a legacy/absent file loads as an EMPTY list\n 539│    // (nothing auto-starts by default — a daemon written before F-038 back-loads).\n 540│    #[test]\n 541│    fn startup_endpoints_roundtrip() {\n 542│        assert!(\n*543│            DaemonConfig::default().startup_endpoints.is_empty(),\n 544│            \"default is nothing-auto-starts\"\n 545│        );\n 546│\n    │...\n 575│        // A legacy daemon.json that predates the field (no `startup_endpoints`\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## conn.rs\n   1│//! Bounded, cancelable, poison-on-failure framed writes for one physical\n  *2│//! broker connection (UPDATE-WEDGE round-4).\n   3│//!\n   4│//! ## The failure class this kills\n   5│//!\n  *6│//! A broker writer used to hold the connection's `Mutex<SendHalf>` guard\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    │...\n  13│//! ROLE — it never cancels the in-flight pipe write or closes the physical\n *14│//! connection, so the writer (and every write queued behind the same gate)\n  15│//! stays wedged until the peer process dies (~128 s in the field capture, on a\n  16│//! brain restart).\n  17│//!\n    │...\n  25│//!    write);\n *26│//! 2. arms an INDEPENDENT per-connection watchdog thread with that absolute\n  27│//!    deadline, then performs the blocking [`write_frame`] OUT of every lock;\n  28│//! 3. on success, returns the half to the gate.\n  29│//!\n    │...\n  31│//! write returning, nor on opportunistic stall-evict sampling: it poisons the\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    │...\n  40│//! On deadline, write failure, or cancellation: (1) the WHOLE physical\n *41│//! connection is poisoned, idempotently — a length-prefixed frame may have\n  42│//! been PARTIALLY written, so reuse would corrupt framing; (2) read and write\n  43│//! sides are aborted so `handle_conn` reaches its existing EOF cleanup;\n  44│//! (3) the buffer of the canceled op is released only after the op reports\n    │...\n  55│//!\n *56│//! No new output queue (the bounded per-sink queues + isolated writer threads\n  57│//! already exist — the block this bounds is BELOW them), and no `PIPE_NOWAIT`\n  58│//! (recorded mid-frame corruption risk). Unix keeps its existing semantics for\n *59│//! healthy connections; only the poison/retire path is new.\n  60│// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n  61│\n  62│use std::io;\n    │...\n 120│    /// The pre-write gate closure declined (e.g. a superseded controller\n*121│    /// writer's epoch check) — nothing was written; the conn stays healthy.\n 122│    Superseded,\n 123│}\n 124│\n    │...\n 171│    bound: Duration,\n*172│    /// The raw OS handle/fd of the underlying stream, captured at\n 173│    /// construction for the out-of-band abort. The recv and send halves share\n*174│    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\n 175│    /// aborting this handle covers a parked read too. Valid for the whole\n*176│    /// conn lifetime: the half lives in `gate`, a writer's stack, or\n 177│    /// `graveyard` until drop.\n 178│    #[cfg(windows)]\n 179│    raw: isize,\n    │...\n 224│        let label = recover(&self.label);\n*225│        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\n 226│        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\n 227│    }\n 228│\n    │...\n 265│    /// UNCONDITIONAL): `write-start` (first write only), `transport-close`\n*266│    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n 267│    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n 268│    /// timeout/cancel leg is the retirement record itself.\n 269│    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 270│    fn lifecycle(&self, event: &str, extra: &str) {\n*271│        let sep = if extra.is_empty() { \"\" } else { \" \" };\n 272│        eprintln!(\n 273│            \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",\n 274│            self.attribution()\n    │...\n 277│\n*278│    /// Abort the connection's in-flight I/O OUT OF BAND (both directions —\n 279│    /// the halves share one OS object) and latch the poison. Idempotent and\n 280│    /// safe to repeat: `CancelIoEx` on a handle with nothing pending is a\n 281│    /// no-op, and re-cancel closes the race where a write was issued a beat\n    │...\n 296│        // SAFETY: scalar kernel32 call on a handle whose owning half is kept\n*297│        // alive until Drop (gate / writer stack / graveyard — see `raw`).\n 298│        unsafe {\n 299│            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n 300│        }\n    │...\n 313│\n*314│    /// Sever the physical connection (exactly once), AFTER the canceled op\n 315│    /// reported completion: on Windows `DisconnectNamedPipe` forces the\n 316│    /// client off (its next access fails), makes a re-issued server-side\n 317│    /// read fail (so `handle_conn` reaches EOF cleanup even if it slipped a\n    │...\n 323│    // there, load-bearing here. Restructuring (e.g. `if !swapped { … }`)\n*324│    // would leave Unix an empty if-body (`clippy::needless_if`) instead.\n 325│    #[cfg_attr(unix, allow(clippy::needless_return))]\n 326│    fn sever(&self) {\n 327│        if self.severed.swap(true, Ordering::AcqRel) {\n    │...\n 340│    /// poison + cancel, re-canceling periodically until the op reports\n*341│    /// completion (the writer clears `inflight` the instant `write_frame`\n 342│    /// returns — that return IS the buffer-release handshake), then sever.\n 343│    fn watchdog(&self) {\n 344│        let mut d = recover(&self.dog);\n## consent.rs\n 147│        let owlery = tmp.path().join(\"owlery\");\n*148│        // Empty owlery.\n 149│        assert!(most_recently_active(&owlery).is_none());\n 150│        // Only an offline perch → still None.\n 151│        seed_perch(&owlery, \"doyle\", STATUS_OFFLINE, Some(100));\n## crc_swap.rs\n  64│        let target = install_dir.join(&rel);\n *65│        let differs = match std::fs::read(&target) {\n *66│            Ok(existing) => sha256_hex(&std::fs::read(&path)?) != sha256_hex(&existing),\n  67│            // Absent (or unreadable) target ⇒ a new/changed file to place.\n  68│            Err(_) => true,\n  69│        };\n    │...\n 285│    /// Write `bytes` to `path`, creating parent dirs. Test helper.\n*286│    fn write(path: &Path, bytes: &[u8]) {\n 287│        if let Some(parent) = path.parent() {\n 288│            fs::create_dir_all(parent).unwrap();\n 289│        }\n*290│        fs::write(path, bytes).unwrap();\n 291│    }\n 292│\n 293│    /// The `rel` paths a plan covers, sorted (the plan already sorts; collect for\n    │...\n 332│        // fileA: identical in both → skipped.\n*333│        write(&s.join(\"fileA\"), b\"same-bytes\");\n*334│        write(&i.join(\"fileA\"), b\"same-bytes\");\n 335│        // fileB: present in both but DIFFERENT bytes → selected.\n*336│        write(&s.join(\"fileB\"), b\"new-content\");\n*337│        write(&i.join(\"fileB\"), b\"old-content\");\n 338│        // fileC: present only in staging (absent in install) → selected.\n*339│        write(&s.join(\"fileC\"), b\"brand-new\");\n 340│\n 341│        let plan = plan_crc_swap(s, i).unwrap();\n 342│\n    │...\n 363│        // A changed file three levels deep; the install counterpart differs.\n*364│        write(&s.join(\"sub\").join(\"dir\").join(\"x\"), b\"changed\");\n*365│        write(&i.join(\"sub\").join(\"dir\").join(\"x\"), b\"original\");\n 366│\n 367│        let plan = plan_crc_swap(s, i).unwrap();\n 368│\n    │...\n 386│        // changed: differs → will be swapped to staged bytes.\n*387│        write(&s.join(\"changed\"), b\"NEW\");\n*388│        write(&i.join(\"changed\"), b\"OLD\");\n 389│        // identical: same bytes → must remain byte-unchanged and not be in the plan.\n*390│        write(&s.join(\"identical\"), b\"STABLE\");\n*391│        write(&i.join(\"identical\"), b\"STABLE\");\n 392│        // fresh under a nested parent that does NOT yet exist in install → created.\n 393│        let fresh_rel: PathBuf = [\"newdir\", \"fresh\"].iter().collect();\n*394│        write(&s.join(&fresh_rel), b\"FRESH\");\n 395│        assert!(!i.join(\"newdir\").exists(), \"precondition: nested parent absent\");\n 396│\n 397│        let plan = plan_crc_swap(s, i).unwrap();\n    │...\n 405│\n*406│        assert_eq!(fs::read(i.join(\"changed\")).unwrap(), b\"NEW\", \"changed got new bytes\");\n 407│        assert_eq!(\n*408│            fs::read(i.join(&fresh_rel)).unwrap(),\n 409│            b\"FRESH\",\n 410│            \"fresh file materialized with its nested parent dir created\"\n 411│        );\n 412│        assert_eq!(\n*413│            fs::read(i.join(\"identical\")).unwrap(),\n 414│            b\"STABLE\",\n 415│            \"identical file byte-unchanged (never touched)\"\n 416│        );\n    │...\n 440│        let first_staged = s.join(\"first.src\");\n*441│        write(&first_staged, b\"AFTER\");\n 442│        let first_target = i.join(\"first\");\n## daemon.rs\n    3│//! [`Daemon::run`] is the body of the hidden `spt daemon` subcommand: it binds\n   *4│//! the broker (B1/B2 PTY hosting) and the seed-control channel (B6) under the\n    5│//! canonical per-home names ([`crate::endpoint`]) and serves both for the life\n    6│//! of the process.\n    7│//!\n     │...\n  160│        // The broker's network host (D4a, ADR-0004 §B): the node's iroh endpoint\n *161│        // + live QUIC connections live in the broker so they survive a brain\n  162│        // restart. Identity is the durable node.key (stable name across daemon\n  163│        // restarts); relay stance comes from daemon.json; mDNS rides the\n  164│        // endpoint (closing the §B mDNS/relay-session row by construction). A\n *165│        // net failure degrades to a net-less broker — it must not cost PTY\n  166│        // hosting (mirrors the broker-bind soft-fail below).\n  167│        // [impl->REQ-DAEMON-2]\n  168│        // Identity (the durable node.key) decides node_hex independently of the\n     │...\n  181│\n *182│        // The broker hosts PTYs (B1/B2) + the net endpoint (D4a). Serve it on a\n  183│        // background thread; a bind failure there must not stop the seed channel\n *184│        // (the B6 surface) — the PTY-hosting consumers arrive in B7/B8.\n  185│        let net_up = net.is_some();\n  186│        // Keep the broker handle alive past the bind so the brain supervisor's\n  187│        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\n     │...\n  253│\n *254│        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\n  255│        // the digest-control channel serves `spt digest <id>` snapshot pulls +\n *256│        // delta-stream subscribes against it. Served on a background thread like\n  257│        // the broker. The per-session feed that *populates* the hub is driven by\n  258│        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\n  259│        // sessions are spawned through the broker; a bare daemon serves the\n     │...\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 *287│        // the shell binary's `api tunnel` resolve their stream end through it.\n  288│        // [impl->REQ-SHELL-4]\n  289│        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\n  290│        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\n     │...\n  349│        // is the socket ping, never this file, so a stale value is harmless.\n *350│        let _ = std::fs::write(daemon_pid_path(), std::process::id().to_string());\n  351│\n  352│        // The seed-control channel is the foreground loop. Binding it is what\n  353│        // arbitrates the single-daemon-per-home invariant: a second daemon racing\n     │...\n  441│    let mut backoff = NET_RETRY_FIRST;\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     │...\n  619│/// with `bInheritHandles = TRUE`, so the long-lived daemon would inherit that\n *620│/// pipe's write end and hold it open forever — the capturing reader never sees\n  621│/// EOF and hangs. Worse, inheritable pipe handles flow through EVERY\n  622│/// `bInheritHandles = TRUE` hop: stripping only this process's *std* handles\n  623│/// (the first guard shipped here) still leaked a grandparent capture's pipe\n     │...\n  924│    }\n *925│    Err(last_err.unwrap_or_else(|| io::Error::other(\"empty launch ladder\")))\n  926│}\n  927│\n  928│/// Launch the daemon `program args…` job-neutral: drive [`launch_ladder`] with\n     │...\n  959│    if let Ok(marker) = std::env::var(\"SPT_LAUNCH_RUNG_MARKER\") {\n *960│        let _ = std::fs::write(&marker, via);\n  961│    }\n  962│    if matches!(rung, LaunchRung::InJob) {\n  963│        eprintln!(\n     │...\n 1235│pub(crate) fn quote_windows_arg(out: &mut String, arg: &str) {\n*1236│    if !arg.is_empty() && !arg.chars().any(|c| c == ' ' || c == '\\t' || c == '\"') {\n 1237│        out.push_str(arg);\n 1238│        return;\n 1239│    }\n     │...\n 1527│                }\n*1528│                let _ = std::fs::write(\n 1529│                    &diag,\n 1530│                    format!(\"launcher_in_job={launcher_in} gc_in_any_job={gc_in}\"),\n 1531│                );\n 1532│            }\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## deadline.rs\n 124│        if let Some(parent) = path.parent() {\n*125│            if !parent.as_os_str().is_empty() {\n 126│                std::fs::create_dir_all(parent)?;\n 127│            }\n 128│        }\n 129│        let raw = serde_json::to_string(self).map_err(std::io::Error::other)?;\n*130│        std::fs::write(path, raw)\n 131│    }\n 132│\n 133│    /// The next fire at or after `now_ms`, derived functionally — **NO write**:\n    │...\n 334│        with_home(|_| {\n*335│            std::fs::write(anchor_path(\"pulse\"), b\"{ not valid json\").unwrap();\n 336│            // A garbled file is treated as absent → Update falls back to fresh.\n 337│            let upd = DeadlineAnchor::open(\"pulse\", 100, StartReason::Update, 8_000).unwrap();\n 338│            assert_eq!(upd.anchor_ms, 8_000);\n## deelevate.rs\n  86│    const EQ: u16 = b'=' as u16;\n *87│    // Parse NAME=VALUE entries (stop at the block-terminating empty string).\n  88│    let mut entries: Vec<Vec<u16>> = Vec::new();\n  89│    let mut cur: Vec<u16> = Vec::new();\n  90│    for &u in block {\n  91│        if u == NUL {\n *92│            if cur.is_empty() {\n  93│                break;\n  94│            }\n  95│            entries.push(std::mem::take(&mut cur));\n    │...\n  99│    }\n*100│    if !cur.is_empty() {\n 101│        entries.push(cur); // tolerate a block missing its final terminator\n 102│    }\n 103│    let name_of = |e: &[u16]| -> String {\n    │...\n 204│    fn user_by_name(name: &str) -> Option<SudoInvoker> {\n*205│        if name.is_empty() {\n 206│            return None;\n 207│        }\n 208│        let cname = std::ffi::CString::new(name).ok()?;\n    │...\n 213│        let mut buf = vec![0u8; buf_len as usize];\n*214│        loop {\n 215│            let mut pwd: libc::passwd = unsafe { std::mem::zeroed() };\n 216│            let mut result: *mut libc::passwd = std::ptr::null_mut();\n 217│            let rc = unsafe {\n    │...\n 241│                    .into_owned();\n*242│                (!s.is_empty()).then(|| PathBuf::from(s))\n 243│            };\n 244│            return Some(SudoInvoker {\n 245│                uid: pwd.pw_uid,\n    │...\n 260│        }\n*261│        match std::fs::write(&path, format!(\"{name}\\n\")) {\n 262│            Ok(()) => eprintln!(\n 263│                \"ELECTED_DEFAULT_USER:{name} (recorded in {})\",\n 264│                path.display()\n    │...\n 285│        let default_name = invoker.user.clone().unwrap_or_default();\n*286│        if default_name.is_empty() {\n 287│            return Some(invoker); // no name to elect by; drop without electing\n 288│        }\n 289│        // The one-time election: prompt when interactive (Enter = the\n    │...\n 320│        let s = s.trim().to_string();\n*321│        (!s.is_empty()).then_some(s)\n 322│    }\n 323│\n 324│    /// The uid's home dir via `getpwuid_r` (reentrant; buffer grown on\n    │...\n 332│        let mut buf = vec![0u8; buf_len as usize];\n*333│        loop {\n 334│            let mut pwd: libc::passwd = unsafe { std::mem::zeroed() };\n 335│            let mut result: *mut libc::passwd = std::ptr::null_mut();\n 336│            let rc = unsafe {\n    │...\n 353│            let s = dir.to_string_lossy().into_owned();\n*354│            return if s.is_empty() {\n 355│                None\n 356│            } else {\n 357│                Some(PathBuf::from(s))\n    │...\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 751│        let mut overlaid: Vec<u16> = Vec::new();\n*752│        let env_ptr = if env_built && !overrides.is_empty() {\n 753│            let raw = unsafe { env_block_to_vec(env as *const u16) };\n 754│            overlaid = super::apply_env_overrides(&raw, &overrides);\n 755│            overlaid.as_mut_ptr() as *mut core::ffi::c_void\n    │...\n 841│            if u == 0 {\n*842│                if cur.is_empty() {\n 843│                    break;\n 844│                }\n 845│                out.push(String::from_utf16_lossy(&cur));\n    │...\n 905│        let file = dir.path().join(\"default-user\");\n*906│        std::fs::write(&file, \"no-such-user-zzz\\n\").unwrap();\n 907│        assert_eq!(unix::elected_user_from(&file), None);\n 908│        // Root never elects.\n*909│        std::fs::write(&file, \"root\\n\").unwrap();\n 910│        assert_eq!(unix::elected_user_from(&file), None);\n 911│        // The current (non-root) user resolves to its own ids. Skipped when\n 912│        // the test itself runs as root (containered CI) — root may not be\n    │...\n 916│            if let Ok(name) = std::env::var(\"USER\") {\n*917│                if !name.is_empty() {\n*918│                    std::fs::write(&file, format!(\"{name}\\n\")).unwrap();\n 919│                    if let Some(t) = unix::elected_user_from(&file) {\n 920│                        assert_eq!(t.uid, uid, \"elected uid = the named account's\");\n 921│                        assert!(t.home.is_some(), \"home resolved for the universe anchor\");\n## digest.rs\n   6│//!\n  *7│//! The superseded shape folded broker PTY bytes through an adapter-pattern parser\n   8│//! on every output chunk. The digest is now a **projection of the same normalized\n   9│//! history the echo-commune consumes** — so there is nothing to feed: a snapshot\n  10│//! pull (or a `digest-entry` push) **projects on demand** from the endpoint's\n  11│//! records via [`project_endpoint_digest`], and the hub publishes the result.\n *12│//! Render surfaces read the PTY (the raw byte ring, unchanged); content surfaces\n  13│//! read the logs.\n  14│//!\n  15│//! ## Sources (one per endpoint)\n    │...\n  33│//! applies it by **truncating its view to `from`, then appending `turns`**. The\n *34│//! delta-stream **contract** ships; its deltas are driven by pull / digest-entry\n  35│//! publishes (autonomous file-watch freshness is deferred to the consuming\n  36│//! frontend milestone — CONTEXT.md \"session digest\").\n  37│// [impl->REQ-TERM-4]\n    │...\n 101│/// A structured digest change to push to a subscriber. Sent only when the digest\n*102│/// actually changed (so the stream carries deltas, not heartbeats).\n 103│#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\n 104│pub struct DigestUpdate {\n 105│    /// Monotonic version of the digest after this change (starts at 1).\n    │...\n 129│/// consumer `over` on top). An endpoint with no records (or no resolvable source)\n*130│/// projects an empty [`Digest`] — never an error, never a block.\n 131│// [impl->REQ-TERM-5]\n 132│// [impl->REQ-TERM-6]\n 133│// [impl->REQ-TERM-7]\n    │...\n 139│        .map(|i| i.session_id.clone())\n*140│        .filter(|s| !s.is_empty());\n 141│\n 142│    // Resolve the adapter's manifest (with profile) by the perch's recorded\n 143│    // adapter. The record's `source_dir` is the adapter's install dir — where a\n    │...\n 205│/// (REQ-TERM-6): enumerate the session ledger (falling back to the current bound\n*206│/// session when empty — a fresh / pre-ledger perch), run the extractor per\n 207│/// session file, parse each line into a [`TimelineItem::Activity`] (diagnosed,\n 208│/// no silent drop), and splice a [`TimelineItem::Boundary`] between sessions.\n 209│// [impl->REQ-TERM-6]\n    │...\n 228│    // perch has no row → the current bound session anchors at ordinal 0.\n*229│    let sessions: Vec<(String, Option<String>, String, u64)> = if ledger.is_empty() {\n 230│        current_session\n 231│            .map(|s| vec![(s.to_string(), None, \"boot\".to_string(), 0u64)])\n 232│            .unwrap_or_default()\n    │...\n 424│    for (ln, raw) in s.lines().enumerate() {\n*425│        if raw.trim().is_empty() || spt_term::parse_context_record(raw).is_some() {\n 426│            continue; // blank, or an spt context entry (merged separately)\n 427│        }\n 428│        match spt_term::record_to_tagged_result(raw) {\n    │...\n 493│fn merge_by_ts(backbone: Vec<TimelineItem>, context: Vec<TimelineItem>) -> Vec<TimelineItem> {\n*494│    if context.is_empty() {\n 495│        return backbone;\n 496│    }\n 497│    let n = backbone.len();\n    │...\n 584│    // [unit->REQ-TERM-4] a source-less endpoint (no perch, no records) projects an\n*585│    // empty digest — never an error, never a block.\n 586│    #[test]\n*587│    fn projects_empty_for_a_sourceless_endpoint() {\n 588│        crate::test_home::with_home(|_| {\n 589│            let d = project_endpoint_digest(\"nobody\", &DigestOverride::default());\n*590│            assert!(d.turns.is_empty());\n 591│        });\n 592│    }\n 593│\n    │...\n 769│    // sessions from the ledger: records from both the pre- and post-/clear session\n*770│    // appear, separated by a boundary marker — the window is not reset-to-empty.\n 771│    #[test]\n 772│    fn extractor_spans_sessions_with_a_boundary_marker() {\n 773│        #[cfg(unix)]\n    │...\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 783│                \"{\\\"role\\\":\\\"input\\\",\\\"text\\\":\\\"before clear\\\"}\\n\",\n 784│            )\n 785│            .unwrap();\n*786│            std::fs::write(\n 787│                home.join(\"sess-B.jsonl\"),\n 788│                \"{\\\"role\\\":\\\"input\\\",\\\"text\\\":\\\"after clear\\\"}\\n\",\n 789│            )\n    │...\n 800│            std::fs::create_dir_all(&asrc).unwrap();\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## digesthub.rs\n  13│//!   the endpoint's current buffer on demand and returns it;\n *14│//! - **delta-stream** — `spt endpoint digest <id> --follow` ([`follow`])\n  15│//!   subscribes, receives a base snapshot, then **only the changes**\n *16│//!   ([`DigestUpdate`]s) as pulls / `digest-entry` pushes re-project. The stream\n  17│//!   contract ships; autonomous file-watch freshness is deferred to the consuming\n  18│//!   frontend milestone (CONTEXT.md \"session digest\").\n  19│//!\n    │...\n  45│pub const KIND_DIGEST_RESULT: &str = \"digest_result\";\n *46│/// Client→daemon: subscribe to an endpoint's delta-stream from a version floor.\n  47│pub const KIND_DIGEST_SUBSCRIBE: &str = \"digest_subscribe\";\n *48│/// Daemon→client: one structured digest change (the streamed delta / base).\n  49│pub const KIND_DIGEST_DELTA: &str = \"digest_delta\";\n  50│/// Client→daemon: re-project an endpoint now and publish any change to live\n  51│/// subscribers — the push-driven delta after an `api digest-entry` append (no\n    │...\n  59│    pub id: String,\n *60│    /// Subscribe floor: only stream changes with `version > from_version`. The\n  61│    /// base snapshot is sent regardless so a fresh subscriber has an apply base.\n  62│    #[serde(default)]\n  63│    pub from_version: u64,\n  64│    /// Consumer presentation override (ADR-0019) — overrides the adapter's\n *65│    /// `[digest]` defaults for this pull/subscribe. Empty ⇒ adapter defaults.\n  66│    #[serde(default)]\n  67│    pub over: DigestOverride,\n  68│}\n    │...\n  81│/// One endpoint's live digest state in the hub: the latest snapshot + version\n *82│/// (for pulls) and the set of live subscriber senders (for the delta-stream).\n  83│#[derive(Default)]\n  84│struct EndpointState {\n  85│    snapshot: Digest,\n    │...\n 100│impl DigestHub {\n*101│    /// A fresh, empty hub.\n 102│    pub fn new() -> Self {\n 103│        DigestHub {\n 104│            map: Mutex::new(HashMap::new()),\n    │...\n 171│/// Bind the digest-control channel at `name` and serve it forever against `hub`.\n*172│/// Thread-per-connection (mirroring the broker / seed-control): a `--follow`\n*173│/// subscribe blocks its connection thread streaming deltas, so serving inline\n 174│/// would stall every other client.\n 175│pub fn serve_digest_control(name: &str, hub: Arc<DigestHub>) -> io::Result<()> {\n 176│    let listener = LocalSocketTransport::bind(name)?;\n*177│    loop {\n*178│        let conn = listener.accept()?;\n 179│        let hub = Arc::clone(&hub);\n 180│        thread::spawn(move || {\n 181│            let _ = handle_conn(conn, &hub);\n    │...\n 185│\n*186│/// Drive one control connection: handshake, then service snapshot pulls and\n*187│/// subscribe streams until the client disconnects.\n 188│fn handle_conn<C: Read + Write>(mut conn: C, hub: &DigestHub) -> io::Result<()> {\n 189│    recv_hello(&mut conn, Role::Brain)?;\n*190│    loop {\n 191│        let env = match read_frame(&mut conn) {\n 192│            Ok(e) => e,\n 193│            Err(_) => return Ok(()), // peer hung up\n    │...\n 202│                let (snap, version) = hub.project_and_publish(&req.id, projected);\n*203│                let digest = if version == 0 && snap.turns.is_empty() {\n 204│                    None // never projected anything for this endpoint\n 205│                } else {\n 206│                    Some(snap)\n    │...\n 225│                // Seed the base from a fresh on-demand projection, then register and\n*226│                // send that base (full), then stream subsequent changes.\n 227│                let projected = project_endpoint_digest(&req.id, &req.over);\n 228│                let _ = hub.project_and_publish(&req.id, projected);\n 229│                let (base, version, rx) = hub.subscribe(&req.id);\n    │...\n 232│                        version,\n*233│                        from: 0, // a fresh subscriber replaces its (empty) view\n 234│                        turns: base.turns,\n 235│                    };\n 236│                    write_frame(&mut conn, &delta_frame(&base_update))?;\n    │...\n 239│                // write failure) or the hub drops the sender.\n*240│                while let Ok(up) = rx.recv() {\n 241│                    if up.version <= req.from_version {\n 242│                        continue;\n 243│                    }\n    │...\n 257│/// (the `spt digest` CLI is a transient logic client of the daemon).\n*258│fn connect(name: &str) -> io::Result<interprocess::local_socket::Stream> {\n 259│    let mut conn = LocalSocketTransport::connect(name)?;\n 260│    send_hello(&mut conn, Role::Brain)?;\n 261│    Ok(conn)\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   5│//! `serve_sync` / `serve_update` / `apply_notif_feed` / `receive_wan` against\n  *6│//! a known stream). In production nothing did — a peer could dial and write\n  *7│//! and the bytes sat in the broker's stream log unread. This module is the\n  *8│//! missing consumer: a daemon-hosted loop that watches the broker's stream\n  *9│//! table for **peer-initiated** streams, classifies each by its first NDJSON\n  10│//! record, and hands it to the right serve loop on its own worker thread.\n  11│//!\n  12│//! ## Direction (the gotcha-#9 fact, now first-class)\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  18│//! never inferred.\n  19│//!\n  20│//! ## Classification (first-record demux)\n  21│//!\n *22│//! Streams are single-purpose; the opener's first record names the protocol.\n  23│//! The kind-tagged families collide on variant names (`request` is both\n  24│//! sync's and attach's opener; `chunk`/`done`/`err` recur everywhere), so the\n  25│//! demux keys on the first line's **shape**, not its kind alone:\n    │...\n  45│//!\n *46│//! Each claimed stream gets its own worker thread with its **own** brain IPC\n *47│//! connection (the broker is multi-client by design; the probe-brain pattern\n *48│//! every E2E test uses). The peek and the serve use **separate** connections:\n  49│//! the peek brain subscribes from 0 to read the first line and is dropped;\n *50│//! the serve loop then subscribes from 0 on a fresh connection so it owns its\n *51│//! stream's event feed alone (no double-subscription interleave). Origin is\n  52│//! the table's `remote_id_hex` — handshake-proven, never payload\n  53│//! (REQ-HAZARD-WAN-ORIGIN-AUTH); every family's own gate then runs unchanged.\n  54│// [impl->REQ-NET-1]\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 *91│pub enum StreamFamily {\n  92│    /// A context sync pull (`SyncRecord::Request`).\n  93│    Sync,\n  94│    /// An update pull (`UpdRecord::Query`).\n    │...\n 119│/// Classify one decoded first line by shape (module-docs demux table).\n*120│pub fn classify_first_line(line: &serde_json::Value) -> StreamFamily {\n 121│    match line.get(\"kind\").and_then(|k| k.as_str()) {\n*122│        Some(\"request\") if line.get(\"sync_id\").is_some() => StreamFamily::Sync,\n\n## bin/\n### xlate_choreo_fixture.rs\n  12│//! On an `event` we emit (here → spt-core, one JSON object per line on stdout,\n *13│//! flushing each so the broker's reader sees them promptly):\n  14│//!   `{\"key\":\"ctrl+s\"}` `{\"delay_ms\":50}` `{\"text\":\"XLATE_OK\"}` `{\"key\":\"enter\"}`\n  15│//!   `{\"delay_ms\":50}` `{\"key\":\"ctrl+s\"}` then `{\"commit\":true}`.\n  16│//!\n    │...\n  34│//! (e.g. the controller's typed bytes) ever appears — only `init` / `event` /\n *35│//! content-free `input` lines do. The binary never sees PTY keystroke content.\n  36│\n  37│use std::fs::OpenOptions;\n  38│use std::io::{self, BufRead, Write};\n  39│\n *40│/// The fixed, recognizable payload token the choreography types into the PTY.\n  41│const PAYLOAD: &str = \"XLATE_OK\";\n  42│\n  43│fn main() {\n    │...\n  55│        let trimmed = line.trim();\n *56│        if trimmed.is_empty() {\n  57│            continue;\n  58│        }\n  59│\n    │...\n  82│\n *83│        // Emit the choreography, flushing each line so the broker's line-reader\n  84│        // applies it promptly (the delays are part of the sequence the broker\n  85│        // honors, not a wall-clock the test asserts on).\n  86│        emit(&mut out, r#\"{\"key\":\"ctrl+s\"}\"#);\n    │...\n 107│            // `ctrl+s` (XOFF, 0x13) emitted above PAUSED terminal output. On a\n*108│            // forkpty PTY (IXON honored) that pause STRANDS every subsequent echo —\n 109│            // the deadline-flushed operator keystrokes (op_flushed), observed via the\n 110│            // child's echo, never reach the output ring → the g2 op_flushed read\n*111│            // times out (forkpty-ONLY; Windows ConPTY ignores XOFF, so g2 passed\n*112│            // there and the strand stayed hidden until the forkpty matrix). The happy path already\n 113│            // emits this XON before `{commit}`; an adapter that ABORTS mid-sequence\n 114│            // must restore flow just the same. We still NEVER commit, so the\n 115│            // commit-deadline FAULT path is exercised exactly as before.\n    │...\n 122│        // XON (`ctrl+q` = 0x11): resume the terminal output flow the `ctrl+s` (XOFF)\n*123│        // chord paused, so the payload's echo flushes deterministically on a ConPTY\n 124│        // (the int test observes byte-receipt via that echo). A real stash/restore\n 125│        // adapter restores flow at the end of its sequence just the same; this keeps\n 126│        // the `ctrl+s` chord (and its real 0x13 mapping + floor exercise) intact while","truncation":{"content":"# crates/spt-daemon/src/\n## access.rs\n 15|//!   endpoint's identity or home. The subject value MUST be the QUIC\n*16|//!   handshake-proven remote node id from the broker's conn/stream table,\n 17|//!   never a payload field (REQ-HAZARD-WAN-ORIGIN-AUTH).\n 18|//! - **Outbound** → any visible node: the whitelist never restricts who an\n 19|//!   endpoint talks *to*.\n...\n 28|//!   origin that *is* this node (a loopback self-dial) short-circuits Allow.\n*29|//! - **Default absent = open**; setting a whitelist restricts (an empty entry\n 30|//!   = locked down). Node-tier ships M4 (Ed25519 node pubkeys); the user tier\n 31|//!   is an inert schema reservation until the cross-user model (ADR-0006).\n 32|//!\n...\n 35|//! an `spt access` edit takes effect on the next inbound without a daemon\n*36|//! restart, and the checks run at message/stream-establishment rate where a\n 37|//! small-file read is noise.\n 38|//!\n 39|//! **Class policy:** only the *message* funnel ([`crate::wan`]) classifies\n...\n 143|    // restricted endpoint admits listed nodes and refuses unlisted ones;\n*144|    // an empty entry is locked down; other endpoints stay open.\n 145|    #[test]\n 146|    fn gate_decision_table() {\n 147|        with_home(|_| {\n...\n 179|                AccessDecision::Deny,\n*180|                \"empty entry refuses everyone\"\n 181|            );\n 182|\n 183|            // Open: entry deleted → default-open again.\n## adapter_update.rs\n 390|            std::fs::create_dir_all(&src).unwrap();\n*391|            std::fs::write(src.join(\"manifest.toml\"), body).unwrap();\n 392|            src\n 393|        };\n 394|        let plain = seed(\n## applyhost.rs\n 82|    /// be the optimistic enlyzeam write D6 exists to kill. `version` is the\n*83|    /// monotonic counter; `product_version` the human-facing semver (empty for\n 84|    /// pre-v0.3.2 metadata, whence the counter-based fallback message).\n 85|    // [impl->REQ-UPD-6]\n 86|    // [impl->REQ-UPD-8]\n...\n 95|    /// new bytes and promotes it on the fresh brain's `ready`. `version` is the\n*96|    /// monotonic counter; `product_version` the human semver (empty pre-v0.3.2).\n 97|    // [impl->REQ-UPDATE-ONE-SHOT-FINISH]\n 98|    AppliedDaemonless {\n 99|        version: u64,\n...\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 172|            \"release-keys.json unprovisioned (no trusted keys)\".to_string(),\n 173|        )));\n...\n 318|    // Connect to the broker BEFORE the binary moves — a dead broker fails the\n*319|    // apply with the seat untouched. The connection is the channel the planned\n 320|    // brain-restart trigger rides after the swap (ADR-0018 D3-3); it does not\n 321|    // attach to any session (the broker holds every hosted endpoint across the\n 322|    // brain cycle — that is the whole point).\n...\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 357|/// construction. The recovery verb for wedged brain-held state that previously\n 358|/// needed a full daemon bounce. Nothing is verified, staged, or renamed: the\n 359|/// respawn lands on the SAME on-disk binary. A candidate that fails readiness\n...\n 625|            .collect();\n*626|        std::fs::write(\n 627|            &keys,\n 628|            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 629|        )\n...\n 687|            .collect();\n*688|        std::fs::write(\n 689|            &keys,\n 690|            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 691|        )\n...\n 723|            .collect();\n*724|        std::fs::write(\n 725|            &keys,\n 726|            serde_json::json!({\"keys\": {\"k\": pub_hex}, \"channel\": \"stable\"}).to_string(),\n 727|        )\n...\n 743|        let exe = dir.path().join(\"spt-binary\");\n*744|        std::fs::write(&exe, b\"OLD\").unwrap();\n 745|\n 746|        let cache = ReleaseCache::open(&dir.path().join(\"releases\"));\n 747|        let (signed, keys) = sign_single(dir.path(), 7, b\"CROSS-OS BYTES\");\n...\n 756|        );\n*757|        assert_eq!(std::fs::read(&exe).unwrap(), b\"OLD\", \"seat untouched\");\n 758|\n 759|        // 2. Single stamped for the OTHER OS refuses too. \"Other\" = any\n 760|        //    registered platform that is not this host — derived from the\n...\n 775|        );\n*776|        assert_eq!(std::fs::read(&exe).unwrap(), b\"OLD\", \"seat untouched\");\n 777|\n 778|        // 3. Stamped for THIS platform: the single applies (the legitimate\n 779|        //    origin-fetched-local path).\n...\n 787|        );\n*788|        assert_eq!(std::fs::read(&exe).unwrap(), b\"CROSS-OS BYTES\");\n 789|    }\n 790|\n 791|    // [unit->REQ-HAZARD-BROKER-PROCESS-ISOLATION] [unit->REQ-UPD-3] the planned\n...\n 889|        let exe = dir.path().join(\"spt-binary\");\n*890|        std::fs::write(&exe, b\"OLD BINARY\").unwrap();\n 891|        let (cache, keys) = stage(dir.path(), 7, b\"NEW BINARY BYTES\", BROKER_RESOURCE_ABI);\n 892|\n 893|        let out = apply_staged(&cache, &keys, &exe, &name).expect(\"apply ok\");\n...\n 898|        assert_eq!(\n*899|            std::fs::read(&exe).unwrap(),\n 900|            b\"NEW BINARY BYTES\",\n 901|            \"artifact landed\"\n 902|        );\n 903|        assert_eq!(\n*904|            std::fs::read(swap_aside_path(&exe, 7)).unwrap(),\n 905|            b\"OLD BINARY\",\n 906|            \"the outgoing binary stepped aside\"\n 907|        );\n...\n 927|        let exe = dir.path().join(\"spt-binary\");\n*928|        std::fs::write(&exe, b\"OLD BINARY\").unwrap();\n 929|        let (cache, keys) = stage(dir.path(), 7, b\"NEW BINARY BYTES\", BROKER_RESOURCE_ABI);\n 930|\n 931|        // No served_broker — deliberately. A daemonless apply must not need one.\n...\n 937|        assert_eq!(\n*938|            std::fs::read(&exe).unwrap(),\n 939|            b\"NEW BINARY BYTES\",\n 940|            \"artifact landed without any broker handoff\"\n 941|        );\n 942|        assert_eq!(\n*943|            std::fs::read(swap_aside_path(&exe, 7)).unwrap(),\n 944|            b\"OLD BINARY\",\n 945|            \"the outgoing binary stepped aside\"\n 946|        );\n...\n 966|        let exe = dir.path().join(\"spt-binary\");\n*967|        std::fs::write(&exe, b\"OLD\").unwrap();\n 968|\n 969|        // Nothing staged.\n*970|        let empty = ReleaseCache::open(&dir.path().join(\"releases\"));\n 971|        let keys = dir.path().join(\"release-keys.json\");\n## attach.rs\n*1|//! Remote terminal attach (M4-D5b, REQ-INST-8) — serve a byte-stream viewport\n 2|//! onto a local session for an operator on another node.\n 3|//!\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 9|//!   (fire-and-forget sends; `Output.seq` carries the dedup authority);\n 10|//! - inbound [`AttachRecord::Input`] → [`Brain::send_effect`] with the\n*11|//!   operator-minted `op_id` — exactly-once at the PTY write through the B5\n 12|//!   journal (a replayed input record cannot double-type);\n*13|//! - session `Exit` → [`AttachRecord::Exit`] + stream finish.\n 14|//!\n 15|//! ## Exactly-once lives at the EDGES, not the wire sends\n 16|//!\n*17|//! Stream sends here are deliberately **unjournaled** (`op_id: None`): a\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 23|//! `Input.op_id`, and the operator's viewport dedups `Output` records by their\n 24|//! session-log `seq` (the render cursor). A post-restart re-serve may\n 25|//! re-transmit output records on the wire — duplicates are dropped at the\n...\n 32|//! [`access_check`] sees the **handshake-proven** origin from the broker's\n*33|//! stream table — never payload bytes (KNOWN-HAZARDS 7.5). Remote-drive of\n 34|//! your own running instance is ungated by default (ADR-0009 default-open);\n 35|//! the D5d whitelist drops in at this same call.\n 36|//!\n 37|//! Restart survival composes from D4/B5 with **no new machinery**: the broker\n*38|//! owns the QUIC stream, the session, its `OutputLog`, and the effect journal.\n 39|//! A restarted target brain re-attaches the session from its output cursor,\n*40|//! resubscribes the stream from its net cursor, and re-drives journaled sends;\n 41|//! a restarted operator brain resubscribes and dedups rendered chunks by\n 42|//! `Output.seq`.\n 43|\n...\n 73|    Refused,\n*74|    /// The session's child exited; the `Exit` record was sent and the stream\n 75|    /// finished.\n 76|    Exited(Option<i32>),\n 77|    /// The operator closed its send side (detached); the viewport ended with\n...\n 80|    /// This controller was DISPLACED by a different operator's `--take`/`kick`\n*81|    /// (REQ-KICK-1): the loud `Displaced` notice was sent and the stream\n 82|    /// finished. The endpoint stays driven (by the taker) — no dormant edge.\n 83|    Displaced,\n 84|}\n...\n 86|/// The role a serve loop resolved to, once the broker's [`SubscribeOutcome`]\n*87|/// arrives — gates wake (controller-only) and PTY input.\n 88|#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n 89|enum ServeRole {\n 90|    /// The interactive controller (input + resize; wakes the endpoint).\n...\n 140|/// bounded channel is full (a controller that falls behind its own echo under a\n*141|/// hard flood). The next frame this reader sees is then a FORWARD gap that the\n 142|/// strict reject-gap (`read_event`, legacy single-session path) FATALS. A\n 143|/// controller CANNOT snap-above like a viewer (B2: it is authoritative — it\n 144|/// advances `delivered_through`; skipping rolled frames would be a not-exactly-once\n...\n 154|/// spins. The helper swallows the `Subscribed` ack its own re-subscribe produces so\n*155|/// the repeated-gap detection is not masked. Non-`Output` events (NetStreamData /\n 156|/// Size / Exit / …) pass through unchanged.\n 157|// [impl->REQ-HAZARD-CONTROLLER-GAP-RESUME]\n 158|/// `gen` is the serve worker's attach generation (ADR-0038 Amendment fix 6):\n...\n 172|    let mut swallow_resume_ack = false;\n*173|    loop {\n 174|        match brain.read_event() {\n 175|            // Our own re-subscribe's Subscribed reply: swallow it (role is already\n 176|            // resolved) so it cannot mask a repeated gap as forward progress.\n...\n 231|///   viewer / busy / take by intent + origin and replies a `Subscribed`;\n*232|///   driven_by / viewer_count are BROKER-owned (single writer). A VIEWER\n 233|///   attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);\n 234|///   the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).\n 235|// [impl->REQ-RC-CROSS-NODE-ATTACH]\n...\n 240|    wire: &mut Brain,\n*241|    stream_id: u64,\n 242|    endpoint: &str,\n 243|    origin_node: &str,\n 244|    remote_session: Option<u64>,\n...\n 254|    if access_check(endpoint, origin_node, InboundClass::Unsolicited) == AccessDecision::Deny {\n*255|        wire.net_stream_send(stream_id, &[], None, true)?;\n 256|        return Ok(Some(AttachServeOutcome::Refused));\n 257|    }\n 258|    let sid = remote_session.unwrap_or(session_id);\n## autostart.rs\n 38|    let entries = DaemonConfig::load().startup_endpoints;\n*39|    if entries.is_empty() {\n 40|        return;\n 41|    }\n 42|    let adapters_dir = spt_store::perch::adapters_dir();\n...\n 71|        // A fresh session every replay: the daemon just started, so the broker\n*72|        // session map is empty — no duplicate-session risk on this path (the\n 73|        // CLI's live probe guards the manual-run-over-live case, REQ-RUN-NO-DUP-SESSION).\n 74|        let session_id = crate::harnesshost::mint_session_id();\n 75|        let mut last_err = String::new();\n...\n 129|    /// daemon-boot thread. The socket name is intentionally bogus: these gates\n*130|    /// exercise only the pre-launch legs (empty list / loud-skip), which never\n 131|    /// dial the broker, so it must never be reached.\n 132|    fn replay_bounded(budget: Duration) {\n 133|        let (tx, rx) = mpsc::channel();\n...\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 142|        handle.join().expect(\"watchdog thread must not panic\");\n 143|    }\n 144|\n*145|    // [unit->REQ-ENDPOINT-AUTOSTART] an empty startup-endpoints list is a pure\n 146|    // no-op: replay reads the (absent) config, finds nothing, and returns without\n 147|    // touching the broker at all — the zero-config default path.\n 148|    #[test]\n*149|    fn empty_config_is_a_pure_noop() {\n 150|        crate::test_home::with_home(|_home| {\n*151|            // No daemon.json at all → DaemonConfig::load() defaults to an empty\n 152|            // startup_endpoints list → early return, no launch, no dial.\n 153|            assert!(\n*154|                DaemonConfig::load().startup_endpoints.is_empty(),\n 155|                \"precondition: the isolated home has no saved startup endpoints\"\n 156|            );\n 157|            replay_bounded(Duration::from_secs(10));\n...\n 169|            // A config that names an adapter that was never registered, against an\n*170|            // empty adapters dir → resolve_option Errs → the SKIP branch fires and\n 171|            // `continue`s past the launch entirely.\n 172|            let cfg = DaemonConfig {\n 173|                startup_endpoints: vec![StartupEndpoint {\n...\n 180|            cfg.save_to(&DaemonConfig::default_path()).unwrap();\n*181|            // The adapters dir is absent/empty in a fresh isolated home; assert the\n 182|            // precondition so a future default that pre-seeds adapters can't mask\n 183|            // this gate silently.\n 184|            let adapters = home.join(\"adapters\");\n## brain.rs\n 31|\n*32|use interprocess::local_socket::{SendHalf, Stream};\n 33|\n 34|use crate::codec::{read_frame, write_frame};\n 35|use crate::frame::{Envelope, Role};\n...\n 41|    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n*42|    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n*43|    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n 44|    SessionsReply, SizeEvent, SpawnReq, Spawned, SubscribeOutcome, SubscribeReq, SubscribedReply,\n 45|    ViewerEvictedEvent,\n 46|    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...\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_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 55|    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n 56|    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n 57|};\n...\n 115|    },\n*116|    /// The current PTY size of a session, pushed to a VIEWER (the letterbox feed,\n 117|    /// REQ-RCVIEW-1).\n 118|    Size {\n 119|        session_id: u64,\n...\n 143|    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\n*144|    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\n 145|    /// ([`Self::NetPresence`]), not this frame.\n 146|    NetDialSubmitted,\n*147|    /// A stream open durably landed — fresh or deduped (D4b).\n*148|    NetStreamOpened(NetStreamOpened),\n*149|    /// A journaled stream send durably landed — fresh or deduped (D4b).\n 150|    NetSent(NetSent),\n*151|    /// The broker's held-streams listing (D4b).\n*152|    NetStreams(NetStreamsReply),\n 153|    /// The broker's hosted-sessions listing (D9-1: session → endpoint).\n 154|    Sessions(SessionsReply),\n 155|    /// The subnet-join ceremony's verdict (a `pair-joined` reply, M7 D3).\n...\n 159|    MetMember(MetMember),\n*160|    /// A contiguous chunk of a stream's reads (the cursor has advanced past it).\n*161|    NetStreamData {\n*162|        stream_id: u64,\n 163|        seq: u64,\n 164|        bytes: Vec<u8>,\n 165|    },\n*166|    /// A stream's read side finished cleanly; `next_seq` is the completeness\n 167|    /// check (the subscriber's cursor must equal it to have missed nothing).\n*168|    NetStreamEof { stream_id: u64, next_seq: u64 },\n 169|    /// A contiguous conn-liveness event (the presence cursor has advanced past\n 170|    /// it) — connected/disconnected on the broker's conn table (D4c).\n 171|    NetPresence(NetPresenceEvent),\n...\n 190|\n*191|/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\n 192|/// non-pump client: blocking, unbounded reads, correct everywhere) or a\n 193|/// **split** carrier for the peer pump.\n 194|///\n## brainproc.rs\n 19|//! broker spawns + supervises a brain child over the socket, and the broker\n*20|//! (with its PTY children + seed channel) survives the brain dying — the\n 21|//! supervisor respawns it from the executable path, which on a real update is\n 22|//! the swapped binary.\n 23|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n...\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 143|/// from the (possibly swapped) binary.\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 184|    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\n*185|    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\n 186|    // so this is a no-op now and forward-correct when daemon-hosted sessions land\n 187|    // (the live-agent adapter). A failure here is non-fatal — the brain still\n*188|    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\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...\n 199|    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\n*200|    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\n 201|    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n 202|    match brain.resume_session_cursors() {\n*203|        Ok(ids) if !ids.is_empty() => {\n 204|            eprintln!(\n 205|                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\n 206|                ids.len()\n...\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 250|    // reconcile in the background (ready-without-warm is preserved because\n 251|    // write_ready already fired above), then drain/debounce/coalesce the\n 252|    // invalidation queue. Same posture as the hosts above: the stop flag is\n...\n 254|    // rehydrates from the persisted index (warm start, fingerprint-gated).\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...\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...\n 366|    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\n*367|    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\n 368|    // tolerates its absence). Never fail the ready write over a diagnostic field.\n 369|    if let Some(hash) = current_exe_hash() {\n 370|        obj[\"exe_hash\"] = serde_json::Value::String(hash);\n...\n 382|    let exe = std::env::current_exe().ok()?;\n*383|    let bytes = std::fs::read(exe).ok()?;\n 384|    Some(crate::release::sha256_hex(&bytes))\n 385|}\n 386|\n...\n 472|    fn staged_artifact_hash(&self, version: u64) -> Option<String>;\n*473|    /// Whether the OLD brain generation's broker subscriber connection is DRAINED —\n 474|    /// its local controller conn CLOSED or stall-evicted, no blocked writes still\n 475|    /// pending on it (REQ-UPDATE-PROMOTE-DRAINED). Reads BROKER TRUTH in-process (no\n 476|    /// brain round-trip): the supervisor promotes a ready candidate only once this is\n...\n 592|/// = the A11 kill+wait precedes `rollback`), so no brain-side pump can be\n*593|/// advertising and the [`spt_store::epoch::EpochSource`] single-writer assumption\n 594|/// (epoch.rs) holds at this `EpochSource::load`. **Do NOT fire broker-side notifs\n 595|/// while a brain is live:** concurrent `EpochSource` read-modify-write across the\n 596|/// two processes mints duplicate epochs (KH 4.8 lost-update). The forward fix for\n...\n 688|    let mut ready_seen = false;\n*689|    loop {\n 690|        if stop.load(Ordering::Relaxed) {\n 691|            return TrialStep::Stopped;\n 692|        }\n...\n 876|                if supervise {\n*877|                    loop {\n 878|                        if stop.load(Ordering::Relaxed) {\n 879|                            let _ = child.kill();\n 880|                            let _ = child.wait();\n## broker.rs\n 3|//! Per ADR-0004 §B the broker holds **only** the resources a live consumer\n*4|//! would lose continuity on if the logic restarted: the PTY master+writer and\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 10|//! ## Gapless handoff (B2 — the load-bearing invariant)\n...\n 13|//! crash). The broker — and every hosted child — must survive that untouched,\n*14|//! and the new brain must re-attach to the output stream **gaplessly and\n 15|//! exactly-once** (Spike #1 made real). Two mechanisms:\n 16|//!\n 17|//! - **Sequenced, buffered output.** Each session's output is appended to an\n 18|//!   [`OutputLog`]: every chunk gets a monotonic per-session `seq` and is held\n*19|//!   in a bounded ring. The current subscriber (a brain connection) receives\n 20|//!   chunks live; all subscriber writes happen *under the log lock*, so frames\n 21|//!   reach the brain in strict `seq` order with no interleave.\n 22|//! - **Resume from a cursor.** A reconnecting brain sends `subscribe` with its\n*23|//!   last-seen `seq + 1`; the broker replays the ring from there, then streams\n 24|//!   live. The brain dedups by `seq`. Output produced *while no brain was\n 25|//!   attached* sits in the ring and is replayed on the next subscribe — so a\n 26|//!   brain restart loses nothing.\n 27|//!\n*28|//! Sessions are therefore **broker-owned and outlive any one connection**: a\n*29|//! brain disconnect only detaches the subscriber; the child, its PTY, and the\n 30|//! output log persist. A session leaves the table only when its child exits\n 31|//! (reaped by the exit waiter) or is explicitly killed.\n 32|// [impl->REQ-DAEMON-2]\n...\n 41|\n*42|use interprocess::local_socket::{prelude::*, Stream};\n*43|use spt_term::{Drain, PtySession, ScreenGrid, SessionSurface, SurfaceSize};\n 44|\n 45|use spt_net::net::attach::AttachIntent;\n 46|use spt_net::net::endpoint::EndpointAddr;\n...\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, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n 60|    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 62|    KIND_NET_DIAL_SUBMITTED, KIND_NET_PRESENCE_SUBSCRIBE,\n...\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_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 69|    KIND_SPAWNED, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,\n 70|};\n...\n 74|\n*75|/// The shared, serialized send side of one brain connection. Output frames,\n 76|/// replay frames, command acks, and exit/error events all write through this.\n*77|/// `pub(crate)`: the net host's stream logs (D4b) live-send through the same\n 78|/// handle under the same gate discipline. Round-4\n 79|/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw\n 80|/// `Arc<Mutex<SendHalf>>` — [`BrokerConn`] owns the half and every write is\n...\n 92|/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n*93|/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n*94|/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n 95|/// owns the replay batch), so a viewer attaching to a busy session is not\n 96|/// spuriously evicted.\n 97|const VIEWER_CHANNEL_DEPTH: usize = 256;\n...\n 99|/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n*100|/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\n 101|const MAX_VIEWERS: usize = 32;\n 102|\n 103|/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n 104|/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n*105|/// the live stream) or a `Disconnected` one (its writer thread ended after a\n 106|/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n 107|/// is the pure decision the fan-out applies under the log lock.\n 108|// [impl->REQ-HAZARD-VIEWER-ISOLATION]\n## codec.rs\n 5|//! framing) but generic over any [`Read`]/[`Write`] — the IPC carrier is a\n*6|//! local socket (named pipe / UDS), not a `TcpStream`, and tests exercise it\n 7|//! over in-memory buffers and socket pairs.\n 8|//!\n 9|//! The frame *codec* is deliberately transport-agnostic: it is the byte-level\n*10|//! contract, while [`crate::transport`] owns the OS-specific connection.\n 11|// [impl->REQ-DAEMON-2]\n 12|\n 13|use std::io::{self, Read, Write};\n...\n 75|\n*76|    // [unit->REQ-DAEMON-2] multiple frames stream back-to-back without bleed.\n 77|    #[test]\n 78|    fn back_to_back_frames_decode_independently() {\n 79|        let mut buf: Vec<u8> = Vec::new();\n## config.rs\n 81|    pub adapter: String,\n*82|    /// The project cwd the harness PTY lands in (captured at `--save`).\n 83|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 84|    pub cwd: Option<String>,\n 85|}\n...\n 181|    /// `attachment.json` from this list — `spt subnet detach/attach --save`\n*182|    /// writes it. Default empty = every held subnet starts attached.\n 183|    pub detached_subnets: Vec<String>,\n 184|    /// The worker-reap TTL floor (seconds since a worker's `started`), W-3\n 185|    /// (REQ-WORKER-REAP): the reconcile GC reaps any worker older than this even\n...\n 192|    /// REQ-ENDPOINT-AUTOSTART) — `spt endpoint run --save` writes this list.\n*193|    /// Default empty = nothing auto-starts. A replay failure logs loud and\n 194|    /// never blocks daemon start or the other replays.\n 195|    pub startup_endpoints: Vec<StartupEndpoint>,\n 196|    /// The docs server port override (ADR-0036 §4, REQ-DOCS-LOCAL-SERVER).\n...\n 328|            .map_err(|e| std::io::Error::other(e.to_string()))?;\n*329|        std::fs::write(path, json)\n 330|    }\n 331|\n 332|    /// Upsert a startup default at the canonical path (`endpoint run --save`,\n...\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...\n 385|        let path = dir.path().join(\"daemon.json\");\n*386|        std::fs::write(&path, \"not json {{{\").unwrap();\n 387|        assert_eq!(DaemonConfig::load_from(&path), DaemonConfig::default());\n 388|    }\n 389|\n...\n 430|    #[test]\n*431|    fn detached_subnets_knob_defaults_empty() {\n*432|        assert!(DaemonConfig::default().detached_subnets.is_empty());\n 433|\n 434|        let dir = tempfile::tempdir().unwrap();\n 435|        let path = dir.path().join(\"daemon.json\");\n*436|        std::fs::write(&path, r#\"{\"detached_subnets\": [\"work\"]}\"#).unwrap();\n 437|        assert_eq!(\n 438|            DaemonConfig::load_from(&path).detached_subnets,\n 439|            vec![\"work\".to_string()]\n...\n 443|            .detached_subnets\n*444|            .is_empty());\n 445|    }\n 446|\n 447|    // [unit->REQ-INST-3] the node auto-suspend knob is opt-in: absent ⇒ OFF\n...\n 458|        let path = dir.path().join(\"daemon.json\");\n*459|        std::fs::write(&path, r#\"{\"auto_suspend_after_ms\": 300000}\"#).unwrap();\n 460|        assert_eq!(\n 461|            DaemonConfig::load_from(&path).auto_suspend_after_ms,\n 462|            Some(300_000)\n...\n 479|        let path = dir.path().join(\"daemon.json\");\n*480|        std::fs::write(&path, r#\"{\"full_auto_update\": true}\"#).unwrap();\n 481|        assert!(\n 482|            DaemonConfig::load_from(&path).full_auto_update,\n 483|            \"explicit opt-in honored\"\n...\n 499|        let path = dir.path().join(\"daemon.json\");\n*500|        std::fs::write(&path, r#\"{\"relay\": \"disabled\"}\"#).unwrap();\n 501|        assert_eq!(DaemonConfig::load_from(&path).relay, RelayChoice::Disabled);\n 502|\n 503|        // An unrecognized future value degrades to the default, never wedges.\n*504|        std::fs::write(&path, r#\"{\"relay\": \"quantum-mesh\"}\"#).unwrap();\n 505|        assert_eq!(DaemonConfig::load_from(&path).relay, RelayChoice::N0);\n 506|\n 507|        let cfg = DaemonConfig {\n...\n 518|        let path = dir.path().join(\"daemon.json\");\n*519|        std::fs::write(&path, r#\"{\"crash_grace_ms\": 500}\"#).unwrap();\n 520|\n 521|        let cfg = DaemonConfig::load_from(&path);\n 522|        assert_eq!(cfg.crash_grace, Duration::from_millis(500));\n...\n 537|    // the on-disk config: two entries (one WITH a cwd, one WITHOUT) survive\n*538|    // save→load byte-for-byte, and a legacy/absent file loads as an EMPTY list\n 539|    // (nothing auto-starts by default — a daemon written before F-038 back-loads).\n 540|    #[test]\n 541|    fn startup_endpoints_roundtrip() {\n 542|        assert!(\n*543|            DaemonConfig::default().startup_endpoints.is_empty(),\n 544|            \"default is nothing-auto-starts\"\n 545|        );\n 546|\n...\n 575|        // A legacy daemon.json that predates the field (no `startup_endpoints`\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## conn.rs\n 1|//! Bounded, cancelable, poison-on-failure framed writes for one physical\n*2|//! broker connection (UPDATE-WEDGE round-4).\n 3|//!\n 4|//! ## The failure class this kills\n 5|//!\n*6|//! A broker writer used to hold the connection's `Mutex<SendHalf>` guard\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...\n 13|//! ROLE — it never cancels the in-flight pipe write or closes the physical\n*14|//! connection, so the writer (and every write queued behind the same gate)\n 15|//! stays wedged until the peer process dies (~128 s in the field capture, on a\n 16|//! brain restart).\n 17|//!\n...\n 25|//!    write);\n*26|//! 2. arms an INDEPENDENT per-connection watchdog thread with that absolute\n 27|//!    deadline, then performs the blocking [`write_frame`] OUT of every lock;\n 28|//! 3. on success, returns the half to the gate.\n 29|//!\n...\n 31|//! write returning, nor on opportunistic stall-evict sampling: it poisons the\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...\n 40|//! On deadline, write failure, or cancellation: (1) the WHOLE physical\n*41|//! connection is poisoned, idempotently — a length-prefixed frame may have\n 42|//! been PARTIALLY written, so reuse would corrupt framing; (2) read and write\n 43|//! sides are aborted so `handle_conn` reaches its existing EOF cleanup;\n 44|//! (3) the buffer of the canceled op is released only after the op reports\n...\n 55|//!\n*56|//! No new output queue (the bounded per-sink queues + isolated writer threads\n 57|//! already exist — the block this bounds is BELOW them), and no `PIPE_NOWAIT`\n 58|//! (recorded mid-frame corruption risk). Unix keeps its existing semantics for\n*59|//! healthy connections; only the poison/retire path is new.\n 60|// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 61|\n 62|use std::io;\n...\n 120|    /// The pre-write gate closure declined (e.g. a superseded controller\n*121|    /// writer's epoch check) — nothing was written; the conn stays healthy.\n 122|    Superseded,\n 123|}\n 124|\n...\n 171|    bound: Duration,\n*172|    /// The raw OS handle/fd of the underlying stream, captured at\n 173|    /// construction for the out-of-band abort. The recv and send halves share\n*174|    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\n 175|    /// aborting this handle covers a parked read too. Valid for the whole\n*176|    /// conn lifetime: the half lives in `gate`, a writer's stack, or\n 177|    /// `graveyard` until drop.\n 178|    #[cfg(windows)]\n 179|    raw: isize,\n...\n 224|        let label = recover(&self.label);\n*225|        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\n 226|        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\n 227|    }\n 228|\n...\n 265|    /// UNCONDITIONAL): `write-start` (first write only), `transport-close`\n*266|    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n 267|    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n 268|    /// timeout/cancel leg is the retirement record itself.\n 269|    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 270|    fn lifecycle(&self, event: &str, extra: &str) {\n*271|        let sep = if extra.is_empty() { \"\" } else { \" \" };\n 272|        eprintln!(\n 273|            \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",\n 274|            self.attribution()\n...\n 277|\n*278|    /// Abort the connection's in-flight I/O OUT OF BAND (both directions —\n 279|    /// the halves share one OS object) and latch the poison. Idempotent and\n 280|    /// safe to repeat: `CancelIoEx` on a handle with nothing pending is a\n 281|    /// no-op, and re-cancel closes the race where a write was issued a beat\n...\n 296|        // SAFETY: scalar kernel32 call on a handle whose owning half is kept\n*297|        // alive until Drop (gate / writer stack / graveyard — see `raw`).\n 298|        unsafe {\n 299|            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n 300|        }\n...\n 313|\n*314|    /// Sever the physical connection (exactly once), AFTER the canceled op\n 315|    /// reported completion: on Windows `DisconnectNamedPipe` forces the\n 316|    /// client off (its next access fails), makes a re-issued server-side\n 317|    /// read fail (so `handle_conn` reaches EOF cleanup even if it slipped a\n...\n 323|    // there, load-bearing here. Restructuring (e.g. `if !swapped { … }`)\n*324|    // would leave Unix an empty if-body (`clippy::needless_if`) instead.\n 325|    #[cfg_attr(unix, allow(clippy::needless_return))]\n 326|    fn sever(&self) {\n 327|        if self.severed.swap(true, Ordering::AcqRel) {\n...\n 340|    /// poison + cancel, re-canceling periodically until the op reports\n*341|    /// completion (the writer clears `inflight` the instant `write_frame`\n 342|    /// returns — that return IS the buffer-release handshake), then sever.\n 343|    fn watchdog(&self) {\n 344|        let mut d = recover(&self.dog);\n## consent.rs\n 147|        let owlery = tmp.path().join(\"owlery\");\n*148|        // Empty owlery.\n 149|        assert!(most_recently_active(&owlery).is_none());\n 150|        // Only an offline perch → still None.\n 151|        seed_perch(&owlery, \"doyle\", STATUS_OFFLINE, Some(100));\n## crc_swap.rs\n 64|        let target = install_dir.join(&rel);\n*65|        let differs = match std::fs::read(&target) {\n*66|            Ok(existing) => sha256_hex(&std::fs::read(&path)?) != sha256_hex(&existing),\n 67|            // Absent (or unreadable) target ⇒ a new/changed file to place.\n 68|            Err(_) => true,\n 69|        };\n...\n 285|    /// Write `bytes` to `path`, creating parent dirs. Test helper.\n*286|    fn write(path: &Path, bytes: &[u8]) {\n 287|        if let Some(parent) = path.parent() {\n 288|            fs::create_dir_all(parent).unwrap();\n 289|        }\n*290|        fs::write(path, bytes).unwrap();\n 291|    }\n 292|\n 293|    /// The `rel` paths a plan covers, sorted (the plan already sorts; collect for\n...\n 332|        // fileA: identical in both → skipped.\n*333|        write(&s.join(\"fileA\"), b\"same-bytes\");\n*334|        write(&i.join(\"fileA\"), b\"same-bytes\");\n 335|        // fileB: present in both but DIFFERENT bytes → selected.\n*336|        write(&s.join(\"fileB\"), b\"new-content\");\n*337|        write(&i.join(\"fileB\"), b\"old-content\");\n 338|        // fileC: present only in staging (absent in install) → selected.\n*339|        write(&s.join(\"fileC\"), b\"brand-new\");\n 340|\n 341|        let plan = plan_crc_swap(s, i).unwrap();\n 342|\n...\n 363|        // A changed file three levels deep; the install counterpart differs.\n*364|        write(&s.join(\"sub\").join(\"dir\").join(\"x\"), b\"changed\");\n*365|        write(&i.join(\"sub\").join(\"dir\").join(\"x\"), b\"original\");\n 366|\n 367|        let plan = plan_crc_swap(s, i).unwrap();\n 368|\n...\n 386|        // changed: differs → will be swapped to staged bytes.\n*387|        write(&s.join(\"changed\"), b\"NEW\");\n*388|        write(&i.join(\"changed\"), b\"OLD\");\n 389|        // identical: same bytes → must remain byte-unchanged and not be in the plan.\n*390|        write(&s.join(\"identical\"), b\"STABLE\");\n*391|        write(&i.join(\"identical\"), b\"STABLE\");\n 392|        // fresh under a nested parent that does NOT yet exist in install → created.\n 393|        let fresh_rel: PathBuf = [\"newdir\", \"fresh\"].iter().collect();\n*394|        write(&s.join(&fresh_rel), b\"FRESH\");\n 395|        assert!(!i.join(\"newdir\").exists(), \"precondition: nested parent absent\");\n 396|\n 397|        let plan = plan_crc_swap(s, i).unwrap();\n...\n 405|\n*406|        assert_eq!(fs::read(i.join(\"changed\")).unwrap(), b\"NEW\", \"changed got new bytes\");\n 407|        assert_eq!(\n*408|            fs::read(i.join(&fresh_rel)).unwrap(),\n 409|            b\"FRESH\",\n 410|            \"fresh file materialized with its nested parent dir created\"\n 411|        );\n 412|        assert_eq!(\n*413|            fs::read(i.join(\"identical\")).unwrap(),\n 414|            b\"STABLE\",\n 415|            \"identical file byte-unchanged (never touched)\"\n 416|        );\n...\n 440|        let first_staged = s.join(\"first.src\");\n*441|        write(&first_staged, b\"AFTER\");\n 442|        let first_target = i.join(\"first\");\n## daemon.rs\n 3|//! [`Daemon::run`] is the body of the hidden `spt daemon` subcommand: it binds\n*4|//! the broker (B1/B2 PTY hosting) and the seed-control channel (B6) under the\n 5|//! canonical per-home names ([`crate::endpoint`]) and serves both for the life\n 6|//! of the process.\n 7|//!\n...\n 160|        // The broker's network host (D4a, ADR-0004 §B): the node's iroh endpoint\n*161|        // + live QUIC connections live in the broker so they survive a brain\n 162|        // restart. Identity is the durable node.key (stable name across daemon\n 163|        // restarts); relay stance comes from daemon.json; mDNS rides the\n 164|        // endpoint (closing the §B mDNS/relay-session row by construction). A\n*165|        // net failure degrades to a net-less broker — it must not cost PTY\n 166|        // hosting (mirrors the broker-bind soft-fail below).\n 167|        // [impl->REQ-DAEMON-2]\n 168|        // Identity (the durable node.key) decides node_hex independently of the\n...\n 181|\n*182|        // The broker hosts PTYs (B1/B2) + the net endpoint (D4a). Serve it on a\n 183|        // background thread; a bind failure there must not stop the seed channel\n*184|        // (the B6 surface) — the PTY-hosting consumers arrive in B7/B8.\n 185|        let net_up = net.is_some();\n 186|        // Keep the broker handle alive past the bind so the brain supervisor's\n 187|        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\n...\n 253|\n*254|        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\n 255|        // the digest-control channel serves `spt digest <id>` snapshot pulls +\n*256|        // delta-stream subscribes against it. Served on a background thread like\n 257|        // the broker. The per-session feed that *populates* the hub is driven by\n 258|        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\n 259|        // sessions are spawned through the broker; a bare daemon serves the\n...\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*287|        // the shell binary's `api tunnel` resolve their stream end through it.\n 288|        // [impl->REQ-SHELL-4]\n 289|        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\n 290|        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\n...\n 349|        // is the socket ping, never this file, so a stale value is harmless.\n*350|        let _ = std::fs::write(daemon_pid_path(), std::process::id().to_string());\n 351|\n 352|        // The seed-control channel is the foreground loop. Binding it is what\n 353|        // arbitrates the single-daemon-per-home invariant: a second daemon racing\n...\n 441|    let mut backoff = NET_RETRY_FIRST;\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...\n 619|/// with `bInheritHandles = TRUE`, so the long-lived daemon would inherit that\n*620|/// pipe's write end and hold it open forever — the capturing reader never sees\n 621|/// EOF and hangs. Worse, inheritable pipe handles flow through EVERY\n 622|/// `bInheritHandles = TRUE` hop: stripping only this process's *std* handles\n 623|/// (the first guard shipped here) still leaked a grandparent capture's pipe\n...\n 924|    }\n*925|    Err(last_err.unwrap_or_else(|| io::Error::other(\"empty launch ladder\")))\n 926|}\n 927|\n 928|/// Launch the daemon `program args…` job-neutral: drive [`launch_ladder`] with\n...\n 959|    if let Ok(marker) = std::env::var(\"SPT_LAUNCH_RUNG_MARKER\") {\n*960|        let _ = std::fs::write(&marker, via);\n 961|    }\n 962|    if matches!(rung, LaunchRung::InJob) {\n 963|        eprintln!(\n...\n 1235|pub(crate) fn quote_windows_arg(out: &mut String, arg: &str) {\n*1236|    if !arg.is_empty() && !arg.chars().any(|c| c == ' ' || c == '\\t' || c == '\"') {\n 1237|        out.push_str(arg);\n 1238|        return;\n 1239|    }\n...\n 1527|                }\n*1528|                let _ = std::fs::write(\n 1529|                    &diag,\n 1530|                    format!(\"launcher_in_job={launcher_in} gc_in_any_job={gc_in}\"),\n 1531|                );\n 1532|            }\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## deadline.rs\n 124|        if let Some(parent) = path.parent() {\n*125|            if !parent.as_os_str().is_empty() {\n 126|                std::fs::create_dir_all(parent)?;\n 127|            }\n 128|        }\n 129|        let raw = serde_json::to_string(self).map_err(std::io::Error::other)?;\n*130|        std::fs::write(path, raw)\n 131|    }\n 132|\n 133|    /// The next fire at or after `now_ms`, derived functionally — **NO write**:\n...\n 334|        with_home(|_| {\n*335|            std::fs::write(anchor_path(\"pulse\"), b\"{ not valid json\").unwrap();\n 336|            // A garbled file is treated as absent → Update falls back to fresh.\n 337|            let upd = DeadlineAnchor::open(\"pulse\", 100, StartReason::Update, 8_000).unwrap();\n 338|            assert_eq!(upd.anchor_ms, 8_000);\n## deelevate.rs\n 86|    const EQ: u16 = b'=' as u16;\n*87|    // Parse NAME=VALUE entries (stop at the block-terminating empty string).\n 88|    let mut entries: Vec<Vec<u16>> = Vec::new();\n 89|    let mut cur: Vec<u16> = Vec::new();\n 90|    for &u in block {\n 91|        if u == NUL {\n*92|            if cur.is_empty() {\n 93|                break;\n 94|            }\n 95|            entries.push(std::mem::take(&mut cur));\n...\n 99|    }\n*100|    if !cur.is_empty() {\n 101|        entries.push(cur); // tolerate a block missing its final terminator\n 102|    }\n 103|    let name_of = |e: &[u16]| -> String {\n...\n 204|    fn user_by_name(name: &str) -> Option<SudoInvoker> {\n*205|        if name.is_empty() {\n 206|            return None;\n 207|        }\n 208|        let cname = std::ffi::CString::new(name).ok()?;\n...\n 213|        let mut buf = vec![0u8; buf_len as usize];\n*214|        loop {\n 215|            let mut pwd: libc::passwd = unsafe { std::mem::zeroed() };\n 216|            let mut result: *mut libc::passwd = std::ptr::null_mut();\n 217|            let rc = unsafe {\n...\n 241|                    .into_owned();\n*242|                (!s.is_empty()).then(|| PathBuf::from(s))\n 243|            };\n 244|            return Some(SudoInvoker {\n 245|                uid: pwd.pw_uid,\n...\n 260|        }\n*261|        match std::fs::write(&path, format!(\"{name}\\n\")) {\n 262|            Ok(()) => eprintln!(\n 263|                \"ELECTED_DEFAULT_USER:{name} (recorded in {})\",\n 264|                path.display()\n...\n 285|        let default_name = invoker.user.clone().unwrap_or_default();\n*286|        if default_name.is_empty() {\n 287|            return Some(invoker); // no name to elect by; drop without electing\n 288|        }\n 289|        // The one-time election: prompt when interactive (Enter = the\n...\n 320|        let s = s.trim().to_string();\n*321|        (!s.is_empty()).then_some(s)\n 322|    }\n 323|\n 324|    /// The uid's home dir via `getpwuid_r` (reentrant; buffer grown on\n...\n 332|        let mut buf = vec![0u8; buf_len as usize];\n*333|        loop {\n 334|            let mut pwd: libc::passwd = unsafe { std::mem::zeroed() };\n 335|            let mut result: *mut libc::passwd = std::ptr::null_mut();\n 336|            let rc = unsafe {\n...\n 353|            let s = dir.to_string_lossy().into_owned();\n*354|            return if s.is_empty() {\n 355|                None\n 356|            } else {\n 357|                Some(PathBuf::from(s))\n...\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 751|        let mut overlaid: Vec<u16> = Vec::new();\n*752|        let env_ptr = if env_built && !overrides.is_empty() {\n 753|            let raw = unsafe { env_block_to_vec(env as *const u16) };\n 754|            overlaid = super::apply_env_overrides(&raw, &overrides);\n 755|            overlaid.as_mut_ptr() as *mut core::ffi::c_void\n...\n 841|            if u == 0 {\n*842|                if cur.is_empty() {\n 843|                    break;\n 844|                }\n 845|                out.push(String::from_utf16_lossy(&cur));\n...\n 905|        let file = dir.path().join(\"default-user\");","truncated":true,"truncatedBy":"bytes","totalLines":1314,"totalBytes":66636,"outputLines":1013,"outputBytes":51194,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":1314,"totalBytes":66636,"outputLines":1013,"outputBytes":51194,"shownRange":{"start":1,"end":1013},"nextOffset":1014}}},"isError":false,"timestamp":1784271459006}}
{"type":"message","id":"e99cdd16","parentId":"38844db9","timestamp":"2026-07-17T06:57:39.462Z","message":{"role":"toolResult","toolCallId":"call_TCRZ3WjjGn4qP7BXdiQ0b0JM|fc_0a061eb498f0e908016a59d26247108196ad098a66b554e593","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 493|        broker: Arc<Broker>,\n*494|        handle: Option<std::thread::JoinHandle<()>>,\n 495|    }\n 496|    impl std::ops::Deref for ServedBroker {\n 497|        type Target = Arc<Broker>;\n...\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...\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 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 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 26|use std::sync::mpsc::{self, Receiver, RecvTimeoutError};\n*27|use std::thread::{self, JoinHandle};\n 28|use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};\n 29|\n 30|use interprocess::local_socket::prelude::*;\n...\n 235|            .name(\"pump-ipc-reader\".to_string())\n*236|            .spawn(move || {\n 237|                eprintln!(\"PUMP_IPC_READER: spawned\");\n 238|                loop {\n 239|                    let framed = read_frame(&mut recv);\n...\n 1919|        let brain_handle =\n*1920|            thread::spawn(move || Brain::cold_start(&connect_name, 1).expect(\"brain cold_start\"));\n 1921|\n 1922|        let mut server = listener.accept().expect(\"accept the brain\");\n 1923|        crate::transport::recv_hello(&mut server, Role::Brain).expect(\"stub recv_hello\");\n...\n 1931|        let (feed, frames) = sync_channel::<Envelope>(64);\n*1932|        let server_thread = thread::spawn(move || {\n 1933|            while let Ok(env) = frames.recv() {\n 1934|                if write_frame(&mut send, &env).is_err() {\n 1935|                    break;\n## brainproc.rs\n 29|use std::sync::Arc;\n*30|use std::thread;\n 31|use std::time::{Duration, Instant};\n 32|\n 33|use crate::brain::{now_ms, Brain};\n...\n 1068|    }\n*1069|    cmd.spawn()\n 1070|}\n 1071|\n 1072|/// The versioned brain-spawn argv (KH-2.3): `daemon brain --generation <N>\n...\n 1110|    let canonical_exe = std::env::current_exe().ok();\n*1111|    let handle = thread::spawn(move || {\n 1112|        // The DRAINED gate (REQ-UPDATE-PROMOTE-DRAINED) reads broker truth in-process;\n 1113|        // a net-less / bind-failed daemon has no broker (None) → the gate degrades to\n 1114|        // readiness-only (no old-gen control plane to drain).\n...\n 1145|        {\n*1146|            Command::new(\"cmd\").args([\"/C\", \"rem\"]).spawn()\n 1147|        }\n 1148|        #[cfg(unix)]\n 1149|        {\n*1150|            Command::new(\"true\").spawn()\n 1151|        }\n 1152|    }\n 1153|\n...\n 1163|                .stdout(std::process::Stdio::null())\n*1164|                .spawn()\n 1165|        }\n 1166|        #[cfg(unix)]\n 1167|        {\n*1168|            Command::new(\"sleep\").arg(\"30\").spawn()\n 1169|        }\n 1170|    }\n 1171|\n## broker.rs\n 38|use std::sync::{Arc, Mutex};\n*39|use std::thread::{self, JoinHandle};\n 40|use std::time::{Duration, Instant};\n 41|\n 42|use interprocess::local_socket::{prelude::*, Stream};\n...\n 947|        let writer_blocked = Arc::clone(&write_blocked_since);\n*948|        let writer = thread::spawn(move || {\n 949|            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n 950|        });\n 951|        self.controller = Some(ControllerSink {\n...\n 1137|        let writer =\n*1138|            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139|        self.viewers.insert(\n 1140|            vid,\n 1141|            ViewerSink {\n...\n 1789|        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790|        let writer = thread::spawn(move || input_writer(session, rx));\n 1791|        Arc::new(InputWriter {\n 1792|            tx,\n 1793|            backpressure: AtomicBool::new(false),\n...\n 1991|            let sup_endpoint = endpoint_id.to_string();\n*1992|            thread::spawn(move || {\n 1993|                run_inject_worker_supervised(\n 1994|                    sup_child,\n 1995|                    sup_faulted,\n...\n 2794|            let me = Arc::clone(self);\n*2795|            thread::spawn(move || {\n 2796|                let _ = me.handle_conn(conn);\n 2797|            });\n 2798|        }\n...\n 2817|        let me = Arc::clone(self);\n*2818|        Ok(thread::spawn(move || {\n 2819|            let _ = me.handle_conn(conn);\n 2820|        }))\n 2821|    }\n...\n 2878|        // stays un-reapable as a live-but-wedged writer even under child output.\n*2879|        let writer = thread::spawn(move || for _ in rx.iter() {});\n 2880|        recover_log(&log).controller = Some(ControllerSink {\n 2881|            tx,\n 2882|            send,\n...\n 3434|        let waiter = Arc::clone(&session);\n*3435|        thread::spawn(move || {\n 3436|            if let Ok(status) = waiter.wait() {\n 3437|                let ev = ExitEvent {\n 3438|                    session_id: id,\n...\n 4756|        let mut client = client;\n*4757|        thread::spawn(move || {\n 4758|            let r = read_frame(&mut client).ok();\n 4759|            let _ = tx.send(r);\n 4760|        });\n...\n 4786|            // Empty initial batch (no size/replay needed for this assertion).\n*4787|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4788|\n 4789|            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 4790|            evicted.store(true, Ordering::Release);\n...\n 4812|            let w_send = Arc::clone(&send);\n*4813|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4814|\n 4815|            // A clean teardown: drop tx with the flag still false.\n 4816|            drop(tx);\n...\n 4861|                evicted,\n*4862|                _writer: thread::spawn(|| {}),\n 4863|            },\n 4864|        );\n 4865|\n...\n 4941|            write_blocked_since: Arc::new(Mutex::new(None)),\n*4942|            _writer: thread::spawn(|| {}),\n 4943|        });\n 4944|        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 4945|        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n...\n 4953|                    evicted: Arc::new(AtomicBool::new(false)),\n*4954|                    _writer: thread::spawn(|| {}),\n 4955|                },\n 4956|            );\n 4957|\n...\n 5054|            endpoint: String::new(),\n*5055|            _writer: thread::spawn(|| {}),\n 5056|        };\n 5057|        (w, rx)\n 5058|    }\n...\n 5192|        let f = Arc::clone(&floor);\n*5193|        let _ = thread::spawn(move || {\n 5194|            let _g = f.lock().unwrap();\n 5195|            panic!(\"poison the inject floor\");\n 5196|        })\n...\n 5219|        let s = Arc::clone(&sessions);\n*5220|        let _ = thread::spawn(move || {\n 5221|            let _g = s.lock().unwrap();\n 5222|            panic!(\"poison the sessions map mid-attach\");\n 5223|        })\n...\n 5277|        let l = Arc::clone(&log);\n*5278|        let _ = thread::spawn(move || {\n 5279|            let _g = l.lock().unwrap();\n 5280|            panic!(\"poison the output log mid-append\");\n 5281|        })\n...\n 5950|        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5951|        let writer = thread::spawn(|| {});\n 5952|        for _ in 0..1000 {\n 5953|            if writer.is_finished() {\n 5954|                break;\n## conn.rs\n 64|use std::sync::{Arc, Condvar, Mutex, MutexGuard, OnceLock};\n*65|use std::thread::{self, JoinHandle};\n 66|use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};\n 67|\n 68|use interprocess::local_socket::SendHalf;\n...\n 449|            .name(\"conn-watchdog\".into())\n*450|            .spawn(move || dog_inner.watchdog())\n 451|            .ok();\n 452|        BrokerConn { inner, dog }\n 453|    }\n...\n 770|                }\n*771|                Ok(_) => std::thread::yield_now(),\n 772|            }\n 773|        }\n 774|        let e = organic.expect(\"a write to a dead peer eventually fails\");\n## crc_swap.rs\n 515|                .stdout(std::process::Stdio::null())\n*516|                .spawn()\n 517|                .expect(\"spawn from the mapped image\")\n 518|        }\n 519|        #[cfg(target_os = \"linux\")]\n...\n 522|                .arg(\"30\")\n*523|                .spawn()\n 524|                .expect(\"spawn from the mapped image\")\n 525|        }\n 526|    }\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 19|use std::sync::Arc;\n*20|use std::thread;\n 21|use std::time::Duration;\n 22|\n 23|use spt_net::net::endpoint::{BindScope, LocalDiscovery, RelayPolicy};\n...\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 718|        }\n*719|        cmd.spawn()?;\n 720|        Ok(())\n 721|    }\n 722|}\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 1574|            .stderr(Stdio::null())\n*1575|            .spawn();\n 1576|        let mut launcher = match launcher {\n 1577|            Ok(c) => c,\n 1578|            // ERROR_ACCESS_DENIED: this runner's ANCESTOR job forbids breakaway, so\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 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## digesthub.rs\n 30|use std::sync::{Arc, Mutex};\n*31|use std::thread;\n 32|\n 33|use serde::{Deserialize, Serialize};\n 34|use spt_term::{Digest, DigestEntry, Turn};\n...\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 61|use std::sync::{Arc, Mutex, OnceLock};\n*62|use std::thread;\n 63|use std::time::{Duration, Instant};\n 64|\n 65|use spt_net::net::notif::NotifDecoder;\n...\n 497|            pool.fetch_add(1, Ordering::Relaxed);\n*498|            thread::spawn(move || {\n 499|                let started = Instant::now();\n 500|                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n 501|                pool.fetch_sub(1, Ordering::Relaxed);\n...\n 1201|) -> thread::JoinHandle<()> {\n*1202|    thread::spawn(move || {\n 1203|        let paths = DispatchPaths::production();\n 1204|        if let Err(e) =\n 1205|            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n## docshost.rs\n 234|        let root = docs_root.clone();\n*235|        tokio::task::spawn_local(async move {\n 236|            let service = service_fn(move |req| handle(req, root.clone()));\n 237|            // Serve one connection to completion; an error here is one\n 238|            // browser's problem, never the server's.\n...\n 253|    let (tx, rx) = std::sync::mpsc::channel::<io::Result<u16>>();\n*254|    std::thread::Builder::new()\n 255|        .name(\"spt-docs-server\".to_string())\n*256|        .spawn(move || {\n 257|            let rt = match tokio::runtime::Builder::new_current_thread()\n 258|                .enable_io()\n 259|                .build()\n...\n 274|                            let root6 = docs_root.clone();\n*275|                            tokio::task::spawn_local(accept_loop(v6, root6));\n 276|                        }\n 277|                        accept_loop(v4, docs_root).await;\n 278|                    }\n## drivehub.rs\n 40|use std::sync::{Arc, Mutex};\n*41|use std::thread;\n 42|\n 43|use serde::{Deserialize, Serialize};\n 44|\n...\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 1355|        let nap = left.min(SLICE);\n*1356|        std::thread::sleep(nap);\n 1357|        left = left.saturating_sub(nap);\n 1358|    }\n 1359|}\n...\n 2367|            // A crash restart re-bases the anchor to a fresh instant.\n*2368|            std::thread::sleep(Duration::from_millis(5));\n 2369|            run(StartReason::Crash);\n 2370|            assert_ne!(anchor_of(), cold_phase, \"Crash must re-base the grid phase\");\n 2371|        });\n## livehost.rs\n 29|use std::sync::{Arc, Mutex};\n*30|use std::thread::JoinHandle;\n 31|use std::time::Duration;\n 32|\n 33|use spt_runtime::registry::AdapterRecord;\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...\n 978|pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n*979|    std::thread::spawn(move || {\n 980|        let set = Arc::new(LiveSet::new());\n 981|        {\n 982|            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n...\n 1019|            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n*1020|                std::thread::sleep(Duration::from_millis(100));\n 1021|                continue;\n 1022|            }\n 1023|            let owlery = perch::owlery_dir();\n...\n 1050|                let step = left.min(100);\n*1051|                std::thread::sleep(Duration::from_millis(step));\n 1052|                left -= step;\n 1053|            }\n 1054|        }\n...\n 1116|            }\n*1117|            std::thread::sleep(Duration::from_millis(20));\n 1118|        }\n 1119|        pred()\n 1120|    }\n...\n 1481|            let b2 = Arc::clone(&broker);\n*1482|            std::thread::spawn(move || {\n 1483|                let _ = b2.serve();\n 1484|            });\n 1485|            let mut brain = {\n...\n 1491|                    }\n*1492|                    std::thread::sleep(Duration::from_millis(10));\n 1493|                }\n 1494|                b.expect(\"connect to test broker\")\n 1495|            };\n...\n 1781|                }\n*1782|                std::thread::sleep(std::time::Duration::from_millis(20));\n 1783|            }\n 1784|            assert!(removed, \"could not remove the perch dir for the torn-down case\");\n 1785|            run();\n...\n 1803|                .args([\"/C\", &format!(\"ping -n 30 127.0.0.1 >NUL & rem {marker}\")])\n*1804|                .spawn()\n 1805|                .expect(\"spawn\")\n 1806|        };\n 1807|        // A trailing shell builtin (`:`) keeps the shell RESIDENT (no tail-exec-replace by\n...\n 1813|                .args([\"-c\", &format!(\"sleep 30; : {marker}\")])\n*1814|                .spawn()\n 1815|                .expect(\"spawn\")\n 1816|        };\n 1817|        let mut psyche = spawn(\"agent7-psyche\"); // the real {id} legacy wrapper\n## nethost.rs\n 195|        let writer_poisoned = Arc::clone(&poisoned);\n*196|        std::thread::spawn(move || {\n 197|            let poison = |halt_reason: &str| {\n 198|                writer_poisoned.store(true, Ordering::Release);\n 199|                if let Some(l) = &lease {\n...\n 953|    let hex_close = remote_id_hex.clone();\n*954|    tokio::spawn(async move {\n 955|        conn_close.closed().await;\n 956|        sh_close.conns.lock().unwrap().remove(&id);\n 957|        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n...\n 979|    let hex = remote_id_hex.clone();\n*980|    tokio::spawn(async move {\n 981|        while let Ok((send, recv)) = conn.accept_bi().await {\n 982|            register_stream(\n 983|                &sh,\n...\n 1035|    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n*1036|    tokio::spawn(async move {\n 1037|        match recv {\n 1038|            RecvHalf::Quic(mut recv) => loop {\n 1039|                await_ring_room(&log, &room).await;\n...\n 1218|        let accept_ep = Arc::clone(&endpoint);\n*1219|        runtime.spawn(async move {\n 1220|            while let Some(incoming) = ep.accept().await {\n 1221|                let sh = Arc::clone(&sh);\n 1222|                let rate = Arc::clone(&rate);\n...\n 1228|                    serde_json::to_value(accept_ep.addr()).unwrap_or(serde_json::Value::Null);\n*1229|                tokio::spawn(async move {\n 1230|                    let Ok(connecting) = incoming.accept() else {\n 1231|                        return;\n 1232|                    };\n...\n 1287|        let canary = Arc::clone(&net_canary_tick_ms);\n*1288|        runtime.spawn(async move {\n 1289|            let mut ivl = tokio::time::interval(Duration::from_millis(25));\n 1290|            loop {\n 1291|                ivl.tick().await;\n...\n 1491|        let gauge = Arc::clone(&self.active_dial_tasks);\n*1492|        self.runtime.spawn(async move {\n 1493|            gauge.fetch_add(1, Ordering::Relaxed);\n 1494|            let _dial_guard = DialGauge(gauge);\n 1495|            // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline\n...\n 2130|            }\n*2131|            std::thread::sleep(std::time::Duration::from_millis(5));\n 2132|        }\n 2133|        assert_eq!(b.conn_count(), 1, \"accept loop registered the inbound conn\");\n 2134|        assert_eq!(\n...\n 2196|            }\n*2197|            std::thread::sleep(std::time::Duration::from_millis(5));\n 2198|        }\n 2199|        assert!(\n 2200|            crossed,\n...\n 2258|            let sent = Arc::clone(&sent);\n*2259|            std::thread::spawn(move || {\n 2260|                for f in &frames {\n 2261|                    host.send_stream(owner, f, false).expect(\"send\");\n 2262|                    sent.fetch_add(1, AtOrd::Relaxed);\n...\n 2273|            }\n*2274|            std::thread::sleep(std::time::Duration::from_millis(5));\n 2275|            if sent.load(AtOrd::Relaxed) >= N {\n 2276|                break; // (shouldn't reach N while we never drain — backpressure)\n 2277|            }\n...\n 2299|            }\n*2300|            std::thread::sleep(std::time::Duration::from_millis(2));\n 2301|        }\n 2302|        writer.join().expect(\"writer joins\");\n 2303|        assert!(finished, \"the tunnel saw EOF after the owner finished\");\n...\n 2405|            }\n*2406|            std::thread::sleep(Duration::from_millis(5));\n 2407|        }\n 2408|        assert_eq!(\n 2409|            pinned.as_deref(),\n...\n 2461|            }\n*2462|            std::thread::sleep(Duration::from_millis(5));\n 2463|        }\n 2464|        assert!(\n 2465|            String::from_utf8_lossy(&got).contains(\"\\\"outcome\\\":\\\"edge\\\"\"),\n...\n 2488|            }\n*2489|            std::thread::sleep(Duration::from_millis(5));\n 2490|        }\n 2491|        assert!(saw, \"the peer stream row registered on b\");\n 2492|\n...\n 2500|            }\n*2501|            std::thread::sleep(Duration::from_millis(10));\n 2502|        }\n 2503|        assert!(swept, \"the closed-watcher swept the dead conn's stream rows\");\n 2504|    }\n...\n 2548|            }\n*2549|            std::thread::sleep(Duration::from_millis(5));\n 2550|        }\n 2551|        panic!(\"seat never poisoned — the dead conn's write should have failed\");\n 2552|    }\n...\n 2789|            }\n*2790|            std::thread::sleep(Duration::from_millis(5));\n 2791|        }\n 2792|        assert!(\n 2793|            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## pairhost.rs\n 179|    };\n*180|    handle.spawn(async move {\n 181|        // The PREVIOUS window's listeners, kept serving one extra period\n 182|        // (M7 acceptance fix): published records outlive listeners by the\n 183|        // DNS TTL, so a joiner resolving the step-1 token must find a live\n...\n 204|                let real_addr = endpoint.addr();\n*205|                window_tasks.push(tokio::spawn(async move {\n 206|                    let listener = match bind_rendezvous(&name, step, relay, discovery, scope).await\n 207|                    {\n 208|                        Ok(l) => l,\n## projwriter.rs\n 32|use std::sync::Arc;\n*33|use std::thread::JoinHandle;\n 34|use std::time::Duration;\n 35|\n 36|use serde::{Deserialize, Serialize};\n...\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...\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\nShowing files 1-20 of 77+. Use skip=20 for the next page, or narrow paths/pattern."}],"details":{"scopePath":"crates/spt-daemon","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":112,"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/conn.rs","crates/spt-daemon/src/crc_swap.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/digesthub.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/docshost.rs","crates/spt-daemon/src/drivehub.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/pairhost.rs","crates/spt-daemon/src/projwriter.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/applyhost.rs","count":4},{"path":"crates/spt-daemon/src/attach.rs","count":1},{"path":"crates/spt-daemon/src/autostart.rs","count":2},{"path":"crates/spt-daemon/src/brain.rs","count":4},{"path":"crates/spt-daemon/src/brainproc.rs","count":7},{"path":"crates/spt-daemon/src/broker.rs","count":20},{"path":"crates/spt-daemon/src/conn.rs","count":3},{"path":"crates/spt-daemon/src/crc_swap.rs","count":3},{"path":"crates/spt-daemon/src/daemon.rs","count":13},{"path":"crates/spt-daemon/src/digesthub.rs","count":2},{"path":"crates/spt-daemon/src/dispatch.rs","count":3},{"path":"crates/spt-daemon/src/docshost.rs","count":4},{"path":"crates/spt-daemon/src/drivehub.rs","count":2},{"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":11},{"path":"crates/spt-daemon/src/nethost.rs","count":19},{"path":"crates/spt-daemon/src/notif.rs","count":1},{"path":"crates/spt-daemon/src/pairhost.rs","count":2},{"path":"crates/spt-daemon/src/projwriter.rs","count":7}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":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 493│        broker: Arc<Broker>,\n*494│        handle: Option<std::thread::JoinHandle<()>>,\n 495│    }\n 496│    impl std::ops::Deref for ServedBroker {\n 497│        type Target = Arc<Broker>;\n    │...\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    │...\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 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 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   26│use std::sync::mpsc::{self, Receiver, RecvTimeoutError};\n  *27│use std::thread::{self, JoinHandle};\n   28│use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};\n   29│\n   30│use interprocess::local_socket::prelude::*;\n     │...\n  235│            .name(\"pump-ipc-reader\".to_string())\n *236│            .spawn(move || {\n  237│                eprintln!(\"PUMP_IPC_READER: spawned\");\n  238│                loop {\n  239│                    let framed = read_frame(&mut recv);\n     │...\n 1919│        let brain_handle =\n*1920│            thread::spawn(move || Brain::cold_start(&connect_name, 1).expect(\"brain cold_start\"));\n 1921│\n 1922│        let mut server = listener.accept().expect(\"accept the brain\");\n 1923│        crate::transport::recv_hello(&mut server, Role::Brain).expect(\"stub recv_hello\");\n     │...\n 1931│        let (feed, frames) = sync_channel::<Envelope>(64);\n*1932│        let server_thread = thread::spawn(move || {\n 1933│            while let Ok(env) = frames.recv() {\n 1934│                if write_frame(&mut send, &env).is_err() {\n 1935│                    break;\n## brainproc.rs\n   29│use std::sync::Arc;\n  *30│use std::thread;\n   31│use std::time::{Duration, Instant};\n   32│\n   33│use crate::brain::{now_ms, Brain};\n     │...\n 1068│    }\n*1069│    cmd.spawn()\n 1070│}\n 1071│\n 1072│/// The versioned brain-spawn argv (KH-2.3): `daemon brain --generation <N>\n     │...\n 1110│    let canonical_exe = std::env::current_exe().ok();\n*1111│    let handle = thread::spawn(move || {\n 1112│        // The DRAINED gate (REQ-UPDATE-PROMOTE-DRAINED) reads broker truth in-process;\n 1113│        // a net-less / bind-failed daemon has no broker (None) → the gate degrades to\n 1114│        // readiness-only (no old-gen control plane to drain).\n     │...\n 1145│        {\n*1146│            Command::new(\"cmd\").args([\"/C\", \"rem\"]).spawn()\n 1147│        }\n 1148│        #[cfg(unix)]\n 1149│        {\n*1150│            Command::new(\"true\").spawn()\n 1151│        }\n 1152│    }\n 1153│\n     │...\n 1163│                .stdout(std::process::Stdio::null())\n*1164│                .spawn()\n 1165│        }\n 1166│        #[cfg(unix)]\n 1167│        {\n*1168│            Command::new(\"sleep\").arg(\"30\").spawn()\n 1169│        }\n 1170│    }\n 1171│\n## broker.rs\n   38│use std::sync::{Arc, Mutex};\n  *39│use std::thread::{self, JoinHandle};\n   40│use std::time::{Duration, Instant};\n   41│\n   42│use interprocess::local_socket::{prelude::*, Stream};\n     │...\n  947│        let writer_blocked = Arc::clone(&write_blocked_since);\n *948│        let writer = thread::spawn(move || {\n  949│            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n  950│        });\n  951│        self.controller = Some(ControllerSink {\n     │...\n 1137│        let writer =\n*1138│            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139│        self.viewers.insert(\n 1140│            vid,\n 1141│            ViewerSink {\n     │...\n 1789│        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790│        let writer = thread::spawn(move || input_writer(session, rx));\n 1791│        Arc::new(InputWriter {\n 1792│            tx,\n 1793│            backpressure: AtomicBool::new(false),\n     │...\n 1991│            let sup_endpoint = endpoint_id.to_string();\n*1992│            thread::spawn(move || {\n 1993│                run_inject_worker_supervised(\n 1994│                    sup_child,\n 1995│                    sup_faulted,\n     │...\n 2794│            let me = Arc::clone(self);\n*2795│            thread::spawn(move || {\n 2796│                let _ = me.handle_conn(conn);\n 2797│            });\n 2798│        }\n     │...\n 2817│        let me = Arc::clone(self);\n*2818│        Ok(thread::spawn(move || {\n 2819│            let _ = me.handle_conn(conn);\n 2820│        }))\n 2821│    }\n     │...\n 2878│        // stays un-reapable as a live-but-wedged writer even under child output.\n*2879│        let writer = thread::spawn(move || for _ in rx.iter() {});\n 2880│        recover_log(&log).controller = Some(ControllerSink {\n 2881│            tx,\n 2882│            send,\n     │...\n 3434│        let waiter = Arc::clone(&session);\n*3435│        thread::spawn(move || {\n 3436│            if let Ok(status) = waiter.wait() {\n 3437│                let ev = ExitEvent {\n 3438│                    session_id: id,\n     │...\n 4756│        let mut client = client;\n*4757│        thread::spawn(move || {\n 4758│            let r = read_frame(&mut client).ok();\n 4759│            let _ = tx.send(r);\n 4760│        });\n     │...\n 4786│            // Empty initial batch (no size/replay needed for this assertion).\n*4787│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4788│\n 4789│            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 4790│            evicted.store(true, Ordering::Release);\n     │...\n 4812│            let w_send = Arc::clone(&send);\n*4813│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4814│\n 4815│            // A clean teardown: drop tx with the flag still false.\n 4816│            drop(tx);\n     │...\n 4861│                evicted,\n*4862│                _writer: thread::spawn(|| {}),\n 4863│            },\n 4864│        );\n 4865│\n     │...\n 4941│            write_blocked_since: Arc::new(Mutex::new(None)),\n*4942│            _writer: thread::spawn(|| {}),\n 4943│        });\n 4944│        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 4945│        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n     │...\n 4953│                    evicted: Arc::new(AtomicBool::new(false)),\n*4954│                    _writer: thread::spawn(|| {}),\n 4955│                },\n 4956│            );\n 4957│\n     │...\n 5054│            endpoint: String::new(),\n*5055│            _writer: thread::spawn(|| {}),\n 5056│        };\n 5057│        (w, rx)\n 5058│    }\n     │...\n 5192│        let f = Arc::clone(&floor);\n*5193│        let _ = thread::spawn(move || {\n 5194│            let _g = f.lock().unwrap();\n 5195│            panic!(\"poison the inject floor\");\n 5196│        })\n     │...\n 5219│        let s = Arc::clone(&sessions);\n*5220│        let _ = thread::spawn(move || {\n 5221│            let _g = s.lock().unwrap();\n 5222│            panic!(\"poison the sessions map mid-attach\");\n 5223│        })\n     │...\n 5277│        let l = Arc::clone(&log);\n*5278│        let _ = thread::spawn(move || {\n 5279│            let _g = l.lock().unwrap();\n 5280│            panic!(\"poison the output log mid-append\");\n 5281│        })\n     │...\n 5950│        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5951│        let writer = thread::spawn(|| {});\n 5952│        for _ in 0..1000 {\n 5953│            if writer.is_finished() {\n 5954│                break;\n## conn.rs\n  64│use std::sync::{Arc, Condvar, Mutex, MutexGuard, OnceLock};\n *65│use std::thread::{self, JoinHandle};\n  66│use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};\n  67│\n  68│use interprocess::local_socket::SendHalf;\n    │...\n 449│            .name(\"conn-watchdog\".into())\n*450│            .spawn(move || dog_inner.watchdog())\n 451│            .ok();\n 452│        BrokerConn { inner, dog }\n 453│    }\n    │...\n 770│                }\n*771│                Ok(_) => std::thread::yield_now(),\n 772│            }\n 773│        }\n 774│        let e = organic.expect(\"a write to a dead peer eventually fails\");\n## crc_swap.rs\n 515│                .stdout(std::process::Stdio::null())\n*516│                .spawn()\n 517│                .expect(\"spawn from the mapped image\")\n 518│        }\n 519│        #[cfg(target_os = \"linux\")]\n    │...\n 522│                .arg(\"30\")\n*523│                .spawn()\n 524│                .expect(\"spawn from the mapped image\")\n 525│        }\n 526│    }\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   19│use std::sync::Arc;\n  *20│use std::thread;\n   21│use std::time::Duration;\n   22│\n   23│use spt_net::net::endpoint::{BindScope, LocalDiscovery, RelayPolicy};\n     │...\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  718│        }\n *719│        cmd.spawn()?;\n  720│        Ok(())\n  721│    }\n  722│}\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 1574│            .stderr(Stdio::null())\n*1575│            .spawn();\n 1576│        let mut launcher = match launcher {\n 1577│            Ok(c) => c,\n 1578│            // ERROR_ACCESS_DENIED: this runner's ANCESTOR job forbids breakaway, so\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 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## digesthub.rs\n  30│use std::sync::{Arc, Mutex};\n *31│use std::thread;\n  32│\n  33│use serde::{Deserialize, Serialize};\n  34│use spt_term::{Digest, DigestEntry, Turn};\n    │...\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   61│use std::sync::{Arc, Mutex, OnceLock};\n  *62│use std::thread;\n   63│use std::time::{Duration, Instant};\n   64│\n   65│use spt_net::net::notif::NotifDecoder;\n     │...\n  497│            pool.fetch_add(1, Ordering::Relaxed);\n *498│            thread::spawn(move || {\n  499│                let started = Instant::now();\n  500│                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n  501│                pool.fetch_sub(1, Ordering::Relaxed);\n     │...\n 1201│) -> thread::JoinHandle<()> {\n*1202│    thread::spawn(move || {\n 1203│        let paths = DispatchPaths::production();\n 1204│        if let Err(e) =\n 1205│            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n## docshost.rs\n 234│        let root = docs_root.clone();\n*235│        tokio::task::spawn_local(async move {\n 236│            let service = service_fn(move |req| handle(req, root.clone()));\n 237│            // Serve one connection to completion; an error here is one\n 238│            // browser's problem, never the server's.\n    │...\n 253│    let (tx, rx) = std::sync::mpsc::channel::<io::Result<u16>>();\n*254│    std::thread::Builder::new()\n 255│        .name(\"spt-docs-server\".to_string())\n*256│        .spawn(move || {\n 257│            let rt = match tokio::runtime::Builder::new_current_thread()\n 258│                .enable_io()\n 259│                .build()\n    │...\n 274│                            let root6 = docs_root.clone();\n*275│                            tokio::task::spawn_local(accept_loop(v6, root6));\n 276│                        }\n 277│                        accept_loop(v4, docs_root).await;\n 278│                    }\n## drivehub.rs\n  40│use std::sync::{Arc, Mutex};\n *41│use std::thread;\n  42│\n  43│use serde::{Deserialize, Serialize};\n  44│\n    │...\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 1355│        let nap = left.min(SLICE);\n*1356│        std::thread::sleep(nap);\n 1357│        left = left.saturating_sub(nap);\n 1358│    }\n 1359│}\n     │...\n 2367│            // A crash restart re-bases the anchor to a fresh instant.\n*2368│            std::thread::sleep(Duration::from_millis(5));\n 2369│            run(StartReason::Crash);\n 2370│            assert_ne!(anchor_of(), cold_phase, \"Crash must re-base the grid phase\");\n 2371│        });\n## livehost.rs\n   29│use std::sync::{Arc, Mutex};\n  *30│use std::thread::JoinHandle;\n   31│use std::time::Duration;\n   32│\n   33│use spt_runtime::registry::AdapterRecord;\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     │...\n  978│pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n *979│    std::thread::spawn(move || {\n  980│        let set = Arc::new(LiveSet::new());\n  981│        {\n  982│            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n     │...\n 1019│            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n*1020│                std::thread::sleep(Duration::from_millis(100));\n 1021│                continue;\n 1022│            }\n 1023│            let owlery = perch::owlery_dir();\n     │...\n 1050│                let step = left.min(100);\n*1051│                std::thread::sleep(Duration::from_millis(step));\n 1052│                left -= step;\n 1053│            }\n 1054│        }\n     │...\n 1116│            }\n*1117│            std::thread::sleep(Duration::from_millis(20));\n 1118│        }\n 1119│        pred()\n 1120│    }\n     │...\n 1481│            let b2 = Arc::clone(&broker);\n*1482│            std::thread::spawn(move || {\n 1483│                let _ = b2.serve();\n 1484│            });\n 1485│            let mut brain = {\n     │...\n 1491│                    }\n*1492│                    std::thread::sleep(Duration::from_millis(10));\n 1493│                }\n 1494│                b.expect(\"connect to test broker\")\n 1495│            };\n     │...\n 1781│                }\n*1782│                std::thread::sleep(std::time::Duration::from_millis(20));\n 1783│            }\n 1784│            assert!(removed, \"could not remove the perch dir for the torn-down case\");\n 1785│            run();\n     │...\n 1803│                .args([\"/C\", &format!(\"ping -n 30 127.0.0.1 >NUL & rem {marker}\")])\n*1804│                .spawn()\n 1805│                .expect(\"spawn\")\n 1806│        };\n 1807│        // A trailing shell builtin (`:`) keeps the shell RESIDENT (no tail-exec-replace by\n     │...\n 1813│                .args([\"-c\", &format!(\"sleep 30; : {marker}\")])\n*1814│                .spawn()\n 1815│                .expect(\"spawn\")\n 1816│        };\n 1817│        let mut psyche = spawn(\"agent7-psyche\"); // the real {id} legacy wrapper\n## nethost.rs\n  195│        let writer_poisoned = Arc::clone(&poisoned);\n *196│        std::thread::spawn(move || {\n  197│            let poison = |halt_reason: &str| {\n  198│                writer_poisoned.store(true, Ordering::Release);\n  199│                if let Some(l) = &lease {\n     │...\n  953│    let hex_close = remote_id_hex.clone();\n *954│    tokio::spawn(async move {\n  955│        conn_close.closed().await;\n  956│        sh_close.conns.lock().unwrap().remove(&id);\n  957│        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n     │...\n  979│    let hex = remote_id_hex.clone();\n *980│    tokio::spawn(async move {\n  981│        while let Ok((send, recv)) = conn.accept_bi().await {\n  982│            register_stream(\n  983│                &sh,\n     │...\n 1035│    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n*1036│    tokio::spawn(async move {\n 1037│        match recv {\n 1038│            RecvHalf::Quic(mut recv) => loop {\n 1039│                await_ring_room(&log, &room).await;\n     │...\n 1218│        let accept_ep = Arc::clone(&endpoint);\n*1219│        runtime.spawn(async move {\n 1220│            while let Some(incoming) = ep.accept().await {\n 1221│                let sh = Arc::clone(&sh);\n 1222│                let rate = Arc::clone(&rate);\n     │...\n 1228│                    serde_json::to_value(accept_ep.addr()).unwrap_or(serde_json::Value::Null);\n*1229│                tokio::spawn(async move {\n 1230│                    let Ok(connecting) = incoming.accept() else {\n 1231│                        return;\n 1232│                    };\n     │...\n 1287│        let canary = Arc::clone(&net_canary_tick_ms);\n*1288│        runtime.spawn(async move {\n 1289│            let mut ivl = tokio::time::interval(Duration::from_millis(25));\n 1290│            loop {\n 1291│                ivl.tick().await;\n     │...\n 1491│        let gauge = Arc::clone(&self.active_dial_tasks);\n*1492│        self.runtime.spawn(async move {\n 1493│            gauge.fetch_add(1, Ordering::Relaxed);\n 1494│            let _dial_guard = DialGauge(gauge);\n 1495│            // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline\n     │...\n 2130│            }\n*2131│            std::thread::sleep(std::time::Duration::from_millis(5));\n 2132│        }\n 2133│        assert_eq!(b.conn_count(), 1, \"accept loop registered the inbound conn\");\n 2134│        assert_eq!(\n     │...\n 2196│            }\n*2197│            std::thread::sleep(std::time::Duration::from_millis(5));\n 2198│        }\n 2199│        assert!(\n 2200│            crossed,\n     │...\n 2258│            let sent = Arc::clone(&sent);\n*2259│            std::thread::spawn(move || {\n 2260│                for f in &frames {\n 2261│                    host.send_stream(owner, f, false).expect(\"send\");\n 2262│                    sent.fetch_add(1, AtOrd::Relaxed);\n     │...\n 2273│            }\n*2274│            std::thread::sleep(std::time::Duration::from_millis(5));\n 2275│            if sent.load(AtOrd::Relaxed) >= N {\n 2276│                break; // (shouldn't reach N while we never drain — backpressure)\n 2277│            }\n     │...\n 2299│            }\n*2300│            std::thread::sleep(std::time::Duration::from_millis(2));\n 2301│        }\n 2302│        writer.join().expect(\"writer joins\");\n 2303│        assert!(finished, \"the tunnel saw EOF after the owner finished\");\n     │...\n 2405│            }\n*2406│            std::thread::sleep(Duration::from_millis(5));\n 2407│        }\n 2408│        assert_eq!(\n 2409│            pinned.as_deref(),\n     │...\n 2461│            }\n*2462│            std::thread::sleep(Duration::from_millis(5));\n 2463│        }\n 2464│        assert!(\n 2465│            String::from_utf8_lossy(&got).contains(\"\\\"outcome\\\":\\\"edge\\\"\"),\n     │...\n 2488│            }\n*2489│            std::thread::sleep(Duration::from_millis(5));\n 2490│        }\n 2491│        assert!(saw, \"the peer stream row registered on b\");\n 2492│\n     │...\n 2500│            }\n*2501│            std::thread::sleep(Duration::from_millis(10));\n 2502│        }\n 2503│        assert!(swept, \"the closed-watcher swept the dead conn's stream rows\");\n 2504│    }\n     │...\n 2548│            }\n*2549│            std::thread::sleep(Duration::from_millis(5));\n 2550│        }\n 2551│        panic!(\"seat never poisoned — the dead conn's write should have failed\");\n 2552│    }\n     │...\n 2789│            }\n*2790│            std::thread::sleep(Duration::from_millis(5));\n 2791│        }\n 2792│        assert!(\n 2793│            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## pairhost.rs\n 179│    };\n*180│    handle.spawn(async move {\n 181│        // The PREVIOUS window's listeners, kept serving one extra period\n 182│        // (M7 acceptance fix): published records outlive listeners by the\n 183│        // DNS TTL, so a joiner resolving the step-1 token must find a live\n    │...\n 204│                let real_addr = endpoint.addr();\n*205│                window_tasks.push(tokio::spawn(async move {\n 206│                    let listener = match bind_rendezvous(&name, step, relay, discovery, scope).await\n 207│                    {\n 208│                        Ok(l) => l,\n## projwriter.rs\n   32│use std::sync::Arc;\n  *33│use std::thread::JoinHandle;\n   34│use std::time::Duration;\n   35│\n   36│use serde::{Deserialize, Serialize};\n     │...\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     │...\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);"},"isError":false,"timestamp":1784271459462}}
{"type":"message","id":"6f517f93","parentId":"e99cdd16","timestamp":"2026-07-17T06:57:51.880Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Tracing broker thread creation and lifecycle**"},{"type":"toolCall","id":"call_NsD4rlpJDAbmFDwOAUsiGv6m|fc_0a061eb498f0e908016a59d26fc67c819686dde5f50e6d0c13","name":"grep","arguments":{"i":"Finding all broker spawns","pattern":"thread::spawn|thread::Builder|std::thread::spawn|std::thread::Builder|runtime\\.spawn|tokio::spawn","path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_dJbtkJ3fpa8tUBnwfOecSaqt|fc_0a061eb498f0e908016a59d26fc6908196890519e2594822c3","name":"grep","arguments":{"i":"Locating PTY implementation","pattern":"struct PtySession|impl PtySession|pub fn spawn|fn wait\\(|impl Drain|reader|read_loop|thread::spawn|thread::Builder","path":"crates","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_kwc2BWWSKU90DMesZco6Sh2u|fc_0a061eb498f0e908016a59d26fc6988196b20515e82726354e","name":"grep","arguments":{"i":"Locating broker structures","pattern":"struct (ControllerSink|ViewerSink|InputWriter|OutputLog|HostedSession|Broker)|fn (controller_writer|viewer_writer|input_writer|handle_conn|serve|spawn_session|append|unsubscribe|retire)|impl Drop","path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_kpNJakWouOUjxiBLGFZP5nHH|fc_0a061eb498f0e908016a59d26fc6a08196badcd32445f9f22f","name":"grep","arguments":{"i":"Finding stream task lifecycle","pattern":"register_stream|remove\\(&.*stream|streams.*remove|retire_stream|NetStream|send_stream|RecvHalf|writer_poisoned|accept_bi|closed\\(\\)","path":"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/broker.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":39045,"output":573,"cacheRead":0,"cacheWrite":0,"totalTokens":39618,"reasoningTokens":158,"cost":{"input":0.195225,"output":0.01719,"cacheRead":0,"cacheWrite":0,"total":0.21241500000000002}},"stopReason":"toolUse","timestamp":1784271459508,"responseId":"resp_0a061eb498f0e908016a59d263d5548196a94820cc80a44ab9","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d2656f8c8196b13d83db71b8bc00","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdJvL8t6CfvyGurlbuO-eBIiQ4-qN0yoqz8_VO-MYISDyZK65bnbJfJekPt40LKge6mlt_oiaCWxvDbJoXU8SyS-wLYSYn40zSPzUNovmEJeeh6qb76puf5uQYfBjtgFyh8u8eIMdUvlcMrd8guGSSDt15K-8HQl0AvIvXWN0C15D2BncYDloBEsKVNKiQP_fEYIlc9bu7kEqozuVxtXYiOlt9sQJcxdyDBCOuJUaHeGzm0n_OkcnFKe5B99d-gq1Z6bH5xbb7PxSycWjyHHQhibBou3wcxFvP679wssaXxQdO4dS35jx-ZbwixxIJHobHpQ_29F_z1f3WkQCG9xKOIX93JMQ2JgnX9xrEFPM-WBzADZFde5vz8nA4CWj2PK2QPtBf5yhz4mVOFx0Vcm71iQsBUVZQZI-G46XAi6PS5THUWFAnqXDzPSce3YMreP0nanPU1JYqj_J6aWhRKaRg3JX2ESjsMXFRByDuHJXuErBDoWZg_Xi6QnH7v28HmXldfJiUnycNQtvNNV_Qypot_9VvO_L-wUqhP-ktcFQlqaHUaZ5WtSsnBrhAAOOhHvD0fKHf8msgQPDIbym1350_U_eOP9fihuN0NT2q-S_JnZuOB4aEwJLx1ML7MfPF4AN7gy7uq39WPa_ckusfo4m8j9Gwq2Me6uDGt6eO2kng2-mQpsIjbU-jyu4VAXW0IL7-zyYhA6BKBSbWIZcD6C6uTVri65Wqr_UP2QDaatFfq07JguemjMhtPrHIUlqmvtiZzpxGrOYFxffLUR5xDX-ySDAYkwR-kkdi_-tQKhWXZ3VMVVWfURp97Fk_uIfORogb4lcfFZwmr95sNw9ketlbC938msA251VfwnS0sMmN-Blhomf0gUujzy5W2Brua11gvb6sjz2EXiklj7Naw-KYftoe4_B1xBJdEn7qh60mQCjmCmcsB7JgdPiaK5jCiTz6h1fBZ9VHVkg4Sp1Itw4AqueYPRg_9nyhDqg1MZ6J3SiOt6AaKo7rf7Kny_b8hUMyaR8h8l2Fc3_ZrTGdKoZ2JFYDmcP5k27dmQ0RD9SuNpvgR9QT9lyTkmvPIlRqW5wOIkNnFPiofU3czTzYo2jCcqRWgexN4WRZTyiRQm8dsdOtUK1fNXYTszEtOhpAd2bu2w9ueh_60h_yk_iWxuzZiYQbf-4L4tEI54mPS10d0mzzBOYTUzjCKs2GQX1bEBq72psbNvaKQof1zvE4fyrLI8AkAjR-nrt78Z4iahXj-y4ZhiHRZmfluYxDz5kCVu5BGsXfjQ24AUn2cXIJpD6OXcT9I1OLKJjavRBLRhiSSGCXNF7UEynzFNn7vq3WXrIWKAApscjxfydMbL9mMRbU5sbmMpr4EHhO3ro3ZUrvJol-ZQTrnvoOz-6OEI14ZhP3jU0u5ruoEMTbN4gz5ObcHqKKj_o1O-k7Gn3dJnEV8mTfYYrVDc2DlrEinE-ccb-gLlcz9ONK2_ZESwaKF9oiWwAA8LngVqI6EpTuw__CbBUBqT2X53Frkqgektiu-NU4T-ntMdTNKJgH7dwomq9fwmFLD2Lwiy1ZZFMPJKKW5wop3fn6AMfQsASXX_jk_XTzATIFxb-J20FQbEACvHTSnedYozHRy8fmyg4_3Oyivoc4TbDuTFMeW-ylBXYprgiPlWQOi5zlm4RM62XTZZSLQF0GqvBu6QXqzcOls32Kt9t5feuQnhJUktYlwcnjHGYYPIRht0HnO6uLIG8CJG9lM_gGY5Fk28OBgpBPBIvOZt8D3H8RyaGCf9m-JqV3YO78Acs2Ir-se_xIDe0U5b7WwETZNMki6V_Dfvei-E-Sw8Tg4-DP1HzWeNztOn8NBiAHq3LXJptOuGvzZmTdPelG0pEBVVyZmV6Mwg4xieutpEXikjgkKzYHsIvscUY6BoDFVjciyjUV65IJZpWleC38p4EN1oLwgnPJ27JDUVIJqaL4RrWQQad_8UQRZdiWzCA9Zf1PICwsMxQPwMWmGGBnK-6Q==","summary":[{"type":"summary_text","text":"**Tracing broker thread creation and lifecycle**"}]},{"id":"fc_0a061eb498f0e908016a59d26fc67c819686dde5f50e6d0c13","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding all broker spawns\",\"pattern\":\"thread::spawn|thread::Builder|std::thread::spawn|std::thread::Builder|runtime\\\\.spawn|tokio::spawn\",\"path\":\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_NsD4rlpJDAbmFDwOAUsiGv6m","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d26fc6908196890519e2594822c3","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating PTY implementation\",\"pattern\":\"struct PtySession|impl PtySession|pub fn spawn|fn wait\\\\(|impl Drain|reader|read_loop|thread::spawn|thread::Builder\",\"path\":\"crates\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_dJbtkJ3fpa8tUBnwfOecSaqt","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d26fc6988196b20515e82726354e","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating broker structures\",\"pattern\":\"struct (ControllerSink|ViewerSink|InputWriter|OutputLog|HostedSession|Broker)|fn (controller_writer|viewer_writer|input_writer|handle_conn|serve|spawn_session|append|unsubscribe|retire)|impl Drop\",\"path\":\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_kwc2BWWSKU90DMesZco6Sh2u","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d26fc6a08196badcd32445f9f22f","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding stream task lifecycle\",\"pattern\":\"register_stream|remove\\\\(&.*stream|streams.*remove|retire_stream|NetStream|send_stream|RecvHalf|writer_poisoned|accept_bi|closed\\\\(\\\\)\",\"path\":\"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/broker.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_kpNJakWouOUjxiBLGFZP5nHH","name":"grep"}]},"duration":12332.657499998808,"ttft":1941.638799995184,"contextSnapshot":{"promptTokens":39045,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_NsD4rlpJDAbmFDwOAUsiGv6m|fc_0a061eb498f0e908016a59d26fc67c819686dde5f50e6d0c13","toolName":"grep","startedAt":"2026-07-17T06:57:51.880Z","args":{"path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs"},"intent":"Finding all broker spawns"},"id":"8ec45cbc","parentId":"6f517f93","timestamp":"2026-07-17T06:57:51.880Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_dJbtkJ3fpa8tUBnwfOecSaqt|fc_0a061eb498f0e908016a59d26fc6908196890519e2594822c3","toolName":"grep","startedAt":"2026-07-17T06:57:51.881Z","args":{"path":"crates"},"intent":"Locating PTY implementation"},"id":"68e3eb2f","parentId":"8ec45cbc","timestamp":"2026-07-17T06:57:51.881Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_kwc2BWWSKU90DMesZco6Sh2u|fc_0a061eb498f0e908016a59d26fc6988196b20515e82726354e","toolName":"grep","startedAt":"2026-07-17T06:57:51.881Z","args":{"path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs"},"intent":"Locating broker structures"},"id":"f1ad4ae2","parentId":"68e3eb2f","timestamp":"2026-07-17T06:57:51.881Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_kpNJakWouOUjxiBLGFZP5nHH|fc_0a061eb498f0e908016a59d26fc6a08196badcd32445f9f22f","toolName":"grep","startedAt":"2026-07-17T06:57:51.881Z","args":{"path":"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/broker.rs"},"intent":"Finding stream task lifecycle"},"id":"0c9d8864","parentId":"f1ad4ae2","timestamp":"2026-07-17T06:57:51.881Z"}
{"type":"message","id":"815ff1e4","parentId":"0c9d8864","timestamp":"2026-07-17T06:57:51.905Z","message":{"role":"toolResult","toolCallId":"call_NsD4rlpJDAbmFDwOAUsiGv6m|fc_0a061eb498f0e908016a59d26fc67c819686dde5f50e6d0c13","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## broker.rs\n 947|        let writer_blocked = Arc::clone(&write_blocked_since);\n*948|        let writer = thread::spawn(move || {\n 949|            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n 950|        });\n 951|        self.controller = Some(ControllerSink {\n...\n 1137|        let writer =\n*1138|            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139|        self.viewers.insert(\n 1140|            vid,\n 1141|            ViewerSink {\n...\n 1789|        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790|        let writer = thread::spawn(move || input_writer(session, rx));\n 1791|        Arc::new(InputWriter {\n 1792|            tx,\n 1793|            backpressure: AtomicBool::new(false),\n...\n 1991|            let sup_endpoint = endpoint_id.to_string();\n*1992|            thread::spawn(move || {\n 1993|                run_inject_worker_supervised(\n 1994|                    sup_child,\n 1995|                    sup_faulted,\n...\n 2794|            let me = Arc::clone(self);\n*2795|            thread::spawn(move || {\n 2796|                let _ = me.handle_conn(conn);\n 2797|            });\n 2798|        }\n...\n 2817|        let me = Arc::clone(self);\n*2818|        Ok(thread::spawn(move || {\n 2819|            let _ = me.handle_conn(conn);\n 2820|        }))\n 2821|    }\n...\n 2878|        // stays un-reapable as a live-but-wedged writer even under child output.\n*2879|        let writer = thread::spawn(move || for _ in rx.iter() {});\n 2880|        recover_log(&log).controller = Some(ControllerSink {\n 2881|            tx,\n 2882|            send,\n...\n 3434|        let waiter = Arc::clone(&session);\n*3435|        thread::spawn(move || {\n 3436|            if let Ok(status) = waiter.wait() {\n 3437|                let ev = ExitEvent {\n 3438|                    session_id: id,\n...\n 4756|        let mut client = client;\n*4757|        thread::spawn(move || {\n 4758|            let r = read_frame(&mut client).ok();\n 4759|            let _ = tx.send(r);\n 4760|        });\n...\n 4786|            // Empty initial batch (no size/replay needed for this assertion).\n*4787|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4788|\n 4789|            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 4790|            evicted.store(true, Ordering::Release);\n...\n 4812|            let w_send = Arc::clone(&send);\n*4813|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4814|\n 4815|            // A clean teardown: drop tx with the flag still false.\n 4816|            drop(tx);\n...\n 4861|                evicted,\n*4862|                _writer: thread::spawn(|| {}),\n 4863|            },\n 4864|        );\n 4865|\n...\n 4941|            write_blocked_since: Arc::new(Mutex::new(None)),\n*4942|            _writer: thread::spawn(|| {}),\n 4943|        });\n 4944|        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 4945|        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n...\n 4953|                    evicted: Arc::new(AtomicBool::new(false)),\n*4954|                    _writer: thread::spawn(|| {}),\n 4955|                },\n 4956|            );\n 4957|\n...\n 5054|            endpoint: String::new(),\n*5055|            _writer: thread::spawn(|| {}),\n 5056|        };\n 5057|        (w, rx)\n 5058|    }\n...\n 5192|        let f = Arc::clone(&floor);\n*5193|        let _ = thread::spawn(move || {\n 5194|            let _g = f.lock().unwrap();\n 5195|            panic!(\"poison the inject floor\");\n 5196|        })\n...\n 5219|        let s = Arc::clone(&sessions);\n*5220|        let _ = thread::spawn(move || {\n 5221|            let _g = s.lock().unwrap();\n 5222|            panic!(\"poison the sessions map mid-attach\");\n 5223|        })\n...\n 5277|        let l = Arc::clone(&log);\n*5278|        let _ = thread::spawn(move || {\n 5279|            let _g = l.lock().unwrap();\n 5280|            panic!(\"poison the output log mid-append\");\n 5281|        })\n...\n 5950|        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5951|        let writer = thread::spawn(|| {});\n 5952|        for _ in 0..1000 {\n 5953|            if writer.is_finished() {\n 5954|                break;\n...\n 5992|        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5993|        let writer = thread::spawn(move || {\n 5994|            let _ = rx.recv(); // blocks (idle live controller) until tx drops\n 5995|        });\n 5996|        log.controller = Some(ControllerSink {\n## conn.rs\n 447|        let dog_inner = Arc::clone(&inner);\n*448|        let dog = thread::Builder::new()\n 449|            .name(\"conn-watchdog\".into())\n 450|            .spawn(move || dog_inner.watchdog())\n 451|            .ok();\n## nethost.rs\n 195|        let writer_poisoned = Arc::clone(&poisoned);\n*196|        std::thread::spawn(move || {\n 197|            let poison = |halt_reason: &str| {\n 198|                writer_poisoned.store(true, Ordering::Release);\n 199|                if let Some(l) = &lease {\n...\n 953|    let hex_close = remote_id_hex.clone();\n*954|    tokio::spawn(async move {\n 955|        conn_close.closed().await;\n 956|        sh_close.conns.lock().unwrap().remove(&id);\n 957|        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n...\n 979|    let hex = remote_id_hex.clone();\n*980|    tokio::spawn(async move {\n 981|        while let Ok((send, recv)) = conn.accept_bi().await {\n 982|            register_stream(\n 983|                &sh,\n...\n 1035|    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n*1036|    tokio::spawn(async move {\n 1037|        match recv {\n 1038|            RecvHalf::Quic(mut recv) => loop {\n 1039|                await_ring_room(&log, &room).await;\n...\n 1218|        let accept_ep = Arc::clone(&endpoint);\n*1219|        runtime.spawn(async move {\n 1220|            while let Some(incoming) = ep.accept().await {\n 1221|                let sh = Arc::clone(&sh);\n 1222|                let rate = Arc::clone(&rate);\n...\n 1228|                    serde_json::to_value(accept_ep.addr()).unwrap_or(serde_json::Value::Null);\n*1229|                tokio::spawn(async move {\n 1230|                    let Ok(connecting) = incoming.accept() else {\n 1231|                        return;\n 1232|                    };\n...\n 1287|        let canary = Arc::clone(&net_canary_tick_ms);\n*1288|        runtime.spawn(async move {\n 1289|            let mut ivl = tokio::time::interval(Duration::from_millis(25));\n 1290|            loop {\n 1291|                ivl.tick().await;\n...\n 1491|        let gauge = Arc::clone(&self.active_dial_tasks);\n*1492|        self.runtime.spawn(async move {\n 1493|            gauge.fetch_add(1, Ordering::Relaxed);\n 1494|            let _dial_guard = DialGauge(gauge);\n 1495|            // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline\n...\n 2258|            let sent = Arc::clone(&sent);\n*2259|            std::thread::spawn(move || {\n 2260|                for f in &frames {\n 2261|                    host.send_stream(owner, f, false).expect(\"send\");\n 2262|                    sent.fetch_add(1, AtOrd::Relaxed);"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs, crates/spt-daemon/src/conn.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":30,"fileCount":3,"files":["crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":20},{"path":"crates/spt-daemon/src/conn.rs","count":1},{"path":"crates/spt-daemon/src/nethost.rs","count":9}],"truncated":true,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## broker.rs\n  947│        let writer_blocked = Arc::clone(&write_blocked_since);\n *948│        let writer = thread::spawn(move || {\n  949│            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n  950│        });\n  951│        self.controller = Some(ControllerSink {\n     │...\n 1137│        let writer =\n*1138│            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139│        self.viewers.insert(\n 1140│            vid,\n 1141│            ViewerSink {\n     │...\n 1789│        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790│        let writer = thread::spawn(move || input_writer(session, rx));\n 1791│        Arc::new(InputWriter {\n 1792│            tx,\n 1793│            backpressure: AtomicBool::new(false),\n     │...\n 1991│            let sup_endpoint = endpoint_id.to_string();\n*1992│            thread::spawn(move || {\n 1993│                run_inject_worker_supervised(\n 1994│                    sup_child,\n 1995│                    sup_faulted,\n     │...\n 2794│            let me = Arc::clone(self);\n*2795│            thread::spawn(move || {\n 2796│                let _ = me.handle_conn(conn);\n 2797│            });\n 2798│        }\n     │...\n 2817│        let me = Arc::clone(self);\n*2818│        Ok(thread::spawn(move || {\n 2819│            let _ = me.handle_conn(conn);\n 2820│        }))\n 2821│    }\n     │...\n 2878│        // stays un-reapable as a live-but-wedged writer even under child output.\n*2879│        let writer = thread::spawn(move || for _ in rx.iter() {});\n 2880│        recover_log(&log).controller = Some(ControllerSink {\n 2881│            tx,\n 2882│            send,\n     │...\n 3434│        let waiter = Arc::clone(&session);\n*3435│        thread::spawn(move || {\n 3436│            if let Ok(status) = waiter.wait() {\n 3437│                let ev = ExitEvent {\n 3438│                    session_id: id,\n     │...\n 4756│        let mut client = client;\n*4757│        thread::spawn(move || {\n 4758│            let r = read_frame(&mut client).ok();\n 4759│            let _ = tx.send(r);\n 4760│        });\n     │...\n 4786│            // Empty initial batch (no size/replay needed for this assertion).\n*4787│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4788│\n 4789│            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 4790│            evicted.store(true, Ordering::Release);\n     │...\n 4812│            let w_send = Arc::clone(&send);\n*4813│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4814│\n 4815│            // A clean teardown: drop tx with the flag still false.\n 4816│            drop(tx);\n     │...\n 4861│                evicted,\n*4862│                _writer: thread::spawn(|| {}),\n 4863│            },\n 4864│        );\n 4865│\n     │...\n 4941│            write_blocked_since: Arc::new(Mutex::new(None)),\n*4942│            _writer: thread::spawn(|| {}),\n 4943│        });\n 4944│        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 4945│        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n     │...\n 4953│                    evicted: Arc::new(AtomicBool::new(false)),\n*4954│                    _writer: thread::spawn(|| {}),\n 4955│                },\n 4956│            );\n 4957│\n     │...\n 5054│            endpoint: String::new(),\n*5055│            _writer: thread::spawn(|| {}),\n 5056│        };\n 5057│        (w, rx)\n 5058│    }\n     │...\n 5192│        let f = Arc::clone(&floor);\n*5193│        let _ = thread::spawn(move || {\n 5194│            let _g = f.lock().unwrap();\n 5195│            panic!(\"poison the inject floor\");\n 5196│        })\n     │...\n 5219│        let s = Arc::clone(&sessions);\n*5220│        let _ = thread::spawn(move || {\n 5221│            let _g = s.lock().unwrap();\n 5222│            panic!(\"poison the sessions map mid-attach\");\n 5223│        })\n     │...\n 5277│        let l = Arc::clone(&log);\n*5278│        let _ = thread::spawn(move || {\n 5279│            let _g = l.lock().unwrap();\n 5280│            panic!(\"poison the output log mid-append\");\n 5281│        })\n     │...\n 5950│        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5951│        let writer = thread::spawn(|| {});\n 5952│        for _ in 0..1000 {\n 5953│            if writer.is_finished() {\n 5954│                break;\n     │...\n 5992│        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5993│        let writer = thread::spawn(move || {\n 5994│            let _ = rx.recv(); // blocks (idle live controller) until tx drops\n 5995│        });\n 5996│        log.controller = Some(ControllerSink {\n## conn.rs\n 447│        let dog_inner = Arc::clone(&inner);\n*448│        let dog = thread::Builder::new()\n 449│            .name(\"conn-watchdog\".into())\n 450│            .spawn(move || dog_inner.watchdog())\n 451│            .ok();\n## nethost.rs\n  195│        let writer_poisoned = Arc::clone(&poisoned);\n *196│        std::thread::spawn(move || {\n  197│            let poison = |halt_reason: &str| {\n  198│                writer_poisoned.store(true, Ordering::Release);\n  199│                if let Some(l) = &lease {\n     │...\n  953│    let hex_close = remote_id_hex.clone();\n *954│    tokio::spawn(async move {\n  955│        conn_close.closed().await;\n  956│        sh_close.conns.lock().unwrap().remove(&id);\n  957│        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n     │...\n  979│    let hex = remote_id_hex.clone();\n *980│    tokio::spawn(async move {\n  981│        while let Ok((send, recv)) = conn.accept_bi().await {\n  982│            register_stream(\n  983│                &sh,\n     │...\n 1035│    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n*1036│    tokio::spawn(async move {\n 1037│        match recv {\n 1038│            RecvHalf::Quic(mut recv) => loop {\n 1039│                await_ring_room(&log, &room).await;\n     │...\n 1218│        let accept_ep = Arc::clone(&endpoint);\n*1219│        runtime.spawn(async move {\n 1220│            while let Some(incoming) = ep.accept().await {\n 1221│                let sh = Arc::clone(&sh);\n 1222│                let rate = Arc::clone(&rate);\n     │...\n 1228│                    serde_json::to_value(accept_ep.addr()).unwrap_or(serde_json::Value::Null);\n*1229│                tokio::spawn(async move {\n 1230│                    let Ok(connecting) = incoming.accept() else {\n 1231│                        return;\n 1232│                    };\n     │...\n 1287│        let canary = Arc::clone(&net_canary_tick_ms);\n*1288│        runtime.spawn(async move {\n 1289│            let mut ivl = tokio::time::interval(Duration::from_millis(25));\n 1290│            loop {\n 1291│                ivl.tick().await;\n     │...\n 1491│        let gauge = Arc::clone(&self.active_dial_tasks);\n*1492│        self.runtime.spawn(async move {\n 1493│            gauge.fetch_add(1, Ordering::Relaxed);\n 1494│            let _dial_guard = DialGauge(gauge);\n 1495│            // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline\n     │...\n 2258│            let sent = Arc::clone(&sent);\n*2259│            std::thread::spawn(move || {\n 2260│                for f in &frames {\n 2261│                    host.send_stream(owner, f, false).expect(\"send\");\n 2262│                    sent.fetch_add(1, AtOrd::Relaxed);"},"isError":false,"timestamp":1784271471904}}
{"type":"message","id":"9e94687f","parentId":"815ff1e4","timestamp":"2026-07-17T06:57:51.910Z","message":{"role":"toolResult","toolCallId":"call_kpNJakWouOUjxiBLGFZP5nHH|fc_0a061eb498f0e908016a59d26fc6a08196badcd32445f9f22f","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## nethost.rs\n 50|    net_presence_event_envelope, net_stream_data_envelope, net_stream_eof_envelope,\n*51|    NetPresenceEvent, NetStreamInfo, PRESENCE_CONNECTED, PRESENCE_DIAL_FAILED, PRESENCE_DISCONNECTED,\n 52|};\n 53|\n 54|/// The reserved [`crate::effect::EffectKey`] session namespace for net-scoped\n...\n 59|/// Broker-side QUIC-op deadline (REQ-HAZARD-BROKER-QUIC-DEADLINE), in ms. Each\n*60|/// brain-waiting QUIC await — `dial` / `open_stream` / `send_stream` — is bounded\n 61|/// by this so a black-holed or dead peer fails PROMPTLY with an ORDINARY error\n 62|/// the broker replies, never an unbounded await that wedges the single-threaded\n 63|/// pump (the B-half of REQ-HAZARD-PUMP-IPC-DEADLINE; the 2.2h hfenduleam wedge).\n...\n 194|        let writer_done = Arc::clone(&done);\n*195|        let writer_poisoned = Arc::clone(&poisoned);\n 196|        std::thread::spawn(move || {\n 197|            let poison = |halt_reason: &str| {\n*198|                writer_poisoned.store(true, Ordering::Release);\n 199|                if let Some(l) = &lease {\n 200|                    l.cancel();\n 201|                }\n...\n 256|/// mechanism): canceled when the stream's subscriber seat POISONS, which\n*257|/// makes every later `send_stream` on the stream refuse — the paired\n 258|/// serve/wire worker discovers the cancellation at its next forward and\n 259|/// terminates instead of feeding an orphan leg forever.\n 260|// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n...\n 563|        // One poison never dead-ends the stream (T5 recovery): the next\n*564|        // generation's mint IS the renewal; `send_stream` reads this current\n 565|        // Arc, old workers' handles stay theirs (C2 consumes via\n 566|        // [`NetHost::stream_lease`]).\n 567|        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n...\n 764|\n*765|/// A stream's read half — fed into the single read pump in [`register_stream`].\n 766|/// QUIC reads via quinn's chunk API; loopback via the read end of the duplex.\n 767|/// Both append to the same [`StreamLog`], so the subscriber (and everything\n 768|/// above it) cannot tell the transports apart.\n*769|enum RecvHalf {\n 770|    Quic(RecvStream),\n 771|    Loopback(ReadHalf<DuplexStream>),\n 772|}\n...\n 954|    tokio::spawn(async move {\n*955|        conn_close.closed().await;\n 956|        sh_close.conns.lock().unwrap().remove(&id);\n 957|        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n 958|        // — nothing can ever be served on them again, and leaving them makes\n...\n 980|    tokio::spawn(async move {\n*981|        while let Ok((send, recv)) = conn.accept_bi().await {\n*982|            register_stream(\n 983|                &sh,\n 984|                id,\n 985|                &hex,\n 986|                SendHalf::Quic(send),\n*987|                RecvHalf::Quic(recv),\n 988|                false,\n 989|            );\n 990|        }\n...\n 999|/// from [`NetHost::open_stream`]).\n*1000|fn register_stream(\n 1001|    shared: &Arc<NetShared>,\n 1002|    conn_id: u64,\n 1003|    remote_id_hex: &str,\n 1004|    send: SendHalf,\n*1005|    recv: RecvHalf,\n 1006|    initiated_locally: bool,\n 1007|) -> u64 {\n 1008|    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n...\n 1037|        match recv {\n*1038|            RecvHalf::Quic(mut recv) => loop {\n 1039|                await_ring_room(&log, &room).await;\n 1040|                match recv.read_chunk(STREAM_READ_CHUNK).await {\n 1041|                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n...\n 1047|            },\n*1048|            RecvHalf::Loopback(mut recv) => {\n 1049|                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n 1050|                loop {\n 1051|                    await_ring_room(&log, &room).await;\n...\n 1643|    /// (`initiated_locally = false`) the inbound dispatcher claims and serves via\n*1644|    /// `serve_attach` — exactly as an `accept_bi` would surface a remote-opened\n 1645|    /// stream. One `tokio::io::duplex` wires both directions; each row's read\n 1646|    /// pump and `StreamLog` are the SAME machinery the QUIC path uses (the W1.5\n 1647|    /// one-pump invariant). The peer row's `remote_id_hex` is this node's own id,\n...\n 1675|                    .map_err(|e| io::Error::other(e.to_string()))?;\n*1676|                Ok(register_stream(\n 1677|                    &shared,\n 1678|                    conn_id,\n 1679|                    &remote_id_hex,\n 1680|                    SendHalf::Quic(send),\n*1681|                    RecvHalf::Quic(recv),\n 1682|                    true,\n 1683|                ))\n 1684|            }),\n...\n 1703|                // dispatcher must never miss the stream.\n*1704|                register_stream(\n 1705|                    &shared,\n 1706|                    conn_id,\n 1707|                    &remote_id_hex,\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, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n 60|    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 62|    KIND_NET_DIAL_SUBMITTED, KIND_NET_PRESENCE_SUBSCRIBE,\n...\n 4271|    fn dispatch_net_stream_open(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4272|        let req: NetStreamOpenReq = serde_json::from_value(env.payload)\n 4273|            .map_err(|e| format!(\"bad net-stream-open payload: {e}\"))?;\n 4274|        let host = self.net.get().ok_or(\"net disabled\")?;\n 4275|        let build = |stream_id: u64, conn_id: u64, op_id: Option<u64>, applied_now: bool| {\n...\n 4277|                KIND_NET_STREAM_OPENED,\n*4278|                serde_json::to_value(NetStreamOpened {\n 4279|                    stream_id,\n 4280|                    conn_id,\n 4281|                    op_id,\n...\n 4283|                })\n*4284|                .expect(\"NetStreamOpened serializes\"),\n 4285|            )\n 4286|        };\n 4287|        match req.op_id {\n...\n 4326|    fn dispatch_net_stream_send(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4327|        let req: NetStreamSendReq = serde_json::from_value(env.payload)\n 4328|            .map_err(|e| format!(\"bad net-stream-send payload: {e}\"))?;\n 4329|        let bytes =\n 4330|            decode_bytes(&req.data_b64).map_err(|e| format!(\"bad net-stream-send base64: {e}\"))?;\n...\n 4333|            None => host\n*4334|                .send_stream(req.stream_id, &bytes, req.finish)\n 4335|                .map_err(|e| e.to_string()),\n 4336|            Some(op) => {\n 4337|                let minter = req.minter.unwrap_or(Minter::Legacy);\n...\n 4345|                    .apply_once(key, EffectKind::NetSend, || {\n*4346|                        host.send_stream(req.stream_id, &bytes, req.finish)\n 4347|                    })\n 4348|                    .map_err(|e| format!(\"net-stream-send failed: {e}\"))?;\n 4349|                let frame = Envelope::new(\n...\n 4369|            KIND_NET_STREAMS_REPLY,\n*4370|            serde_json::to_value(NetStreamsReply {\n 4371|                streams: host.stream_infos(),\n 4372|            })\n*4373|            .expect(\"NetStreamsReply serializes\"),\n 4374|        );\n 4375|        send_frame(send, &frame);\n 4376|        Ok(())\n...\n 4384|    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4385|        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n 4386|            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4387|        let host = self.net.get().ok_or(\"net disabled\")?;\n*4388|        let removed = host.retire_stream(req.stream_id);\n 4389|        let frame = Envelope::new(\n 4390|            KIND_NET_STREAM_RETIRED,\n*4391|            serde_json::to_value(NetStreamRetired {\n 4392|                stream_id: req.stream_id,\n 4393|                removed,\n 4394|            })\n*4395|            .expect(\"NetStreamRetired serializes\"),\n 4396|        );\n 4397|        send_frame(send, &frame);\n 4398|        Ok(())\n...\n 4404|    fn dispatch_net_stream_opener(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4405|        let req: NetStreamOpenerReq = serde_json::from_value(env.payload)\n 4406|            .map_err(|e| format!(\"bad net-stream-opener payload: {e}\"))?;\n 4407|        let host = self.net.get().ok_or(\"net disabled\")?;\n 4408|        let opener = host\n...\n 4412|            KIND_NET_STREAM_OPENER_REPLY,\n*4413|            serde_json::to_value(NetStreamOpenerReply {\n 4414|                stream_id: req.stream_id,\n 4415|                opener_b64: opener.map(|line| crate::msg::encode_bytes(&line)),\n 4416|            })\n*4417|            .expect(\"NetStreamOpenerReply serializes\"),\n 4418|        );\n 4419|        send_frame(send, &frame);\n 4420|        Ok(())\n...\n 4430|    ) -> Result<u64, String> {\n*4431|        let req: NetStreamSubscribeReq = serde_json::from_value(env.payload)\n 4432|            .map_err(|e| format!(\"bad net-stream-subscribe payload: {e}\"))?;\n 4433|        let host = self.net.get().ok_or(\"net disabled\")?;\n 4434|        host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)\n...\n 5575|    /// `conn.split()`.\n*5576|    fn controller_socket_pair() -> (SharedSend, Stream, interprocess::local_socket::RecvHalf) {\n 5577|        use std::sync::atomic::AtomicU32;\n 5578|        // A process-unique pipe/UDS name so parallel test threads never collide.\n 5579|        static SEQ: AtomicU32 = AtomicU32::new(0);"}],"details":{"scopePath":"crates/spt-daemon/src/nethost.rs, crates/spt-daemon/src/broker.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":39,"fileCount":2,"files":["crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/nethost.rs","count":20},{"path":"crates/spt-daemon/src/broker.rs","count":19}],"truncated":true,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## nethost.rs\n   50│    net_presence_event_envelope, net_stream_data_envelope, net_stream_eof_envelope,\n  *51│    NetPresenceEvent, NetStreamInfo, PRESENCE_CONNECTED, PRESENCE_DIAL_FAILED, PRESENCE_DISCONNECTED,\n   52│};\n   53│\n   54│/// The reserved [`crate::effect::EffectKey`] session namespace for net-scoped\n     │...\n   59│/// Broker-side QUIC-op deadline (REQ-HAZARD-BROKER-QUIC-DEADLINE), in ms. Each\n  *60│/// brain-waiting QUIC await — `dial` / `open_stream` / `send_stream` — is bounded\n   61│/// by this so a black-holed or dead peer fails PROMPTLY with an ORDINARY error\n   62│/// the broker replies, never an unbounded await that wedges the single-threaded\n   63│/// pump (the B-half of REQ-HAZARD-PUMP-IPC-DEADLINE; the 2.2h hfenduleam wedge).\n     │...\n  194│        let writer_done = Arc::clone(&done);\n *195│        let writer_poisoned = Arc::clone(&poisoned);\n  196│        std::thread::spawn(move || {\n  197│            let poison = |halt_reason: &str| {\n *198│                writer_poisoned.store(true, Ordering::Release);\n  199│                if let Some(l) = &lease {\n  200│                    l.cancel();\n  201│                }\n     │...\n  256│/// mechanism): canceled when the stream's subscriber seat POISONS, which\n *257│/// makes every later `send_stream` on the stream refuse — the paired\n  258│/// serve/wire worker discovers the cancellation at its next forward and\n  259│/// terminates instead of feeding an orphan leg forever.\n  260│// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n     │...\n  563│        // One poison never dead-ends the stream (T5 recovery): the next\n *564│        // generation's mint IS the renewal; `send_stream` reads this current\n  565│        // Arc, old workers' handles stay theirs (C2 consumes via\n  566│        // [`NetHost::stream_lease`]).\n  567│        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n     │...\n  764│\n *765│/// A stream's read half — fed into the single read pump in [`register_stream`].\n  766│/// QUIC reads via quinn's chunk API; loopback via the read end of the duplex.\n  767│/// Both append to the same [`StreamLog`], so the subscriber (and everything\n  768│/// above it) cannot tell the transports apart.\n *769│enum RecvHalf {\n  770│    Quic(RecvStream),\n  771│    Loopback(ReadHalf<DuplexStream>),\n  772│}\n     │...\n  954│    tokio::spawn(async move {\n *955│        conn_close.closed().await;\n  956│        sh_close.conns.lock().unwrap().remove(&id);\n  957│        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n  958│        // — nothing can ever be served on them again, and leaving them makes\n     │...\n  980│    tokio::spawn(async move {\n *981│        while let Ok((send, recv)) = conn.accept_bi().await {\n *982│            register_stream(\n  983│                &sh,\n  984│                id,\n  985│                &hex,\n  986│                SendHalf::Quic(send),\n *987│                RecvHalf::Quic(recv),\n  988│                false,\n  989│            );\n  990│        }\n     │...\n  999│/// from [`NetHost::open_stream`]).\n*1000│fn register_stream(\n 1001│    shared: &Arc<NetShared>,\n 1002│    conn_id: u64,\n 1003│    remote_id_hex: &str,\n 1004│    send: SendHalf,\n*1005│    recv: RecvHalf,\n 1006│    initiated_locally: bool,\n 1007│) -> u64 {\n 1008│    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n     │...\n 1037│        match recv {\n*1038│            RecvHalf::Quic(mut recv) => loop {\n 1039│                await_ring_room(&log, &room).await;\n 1040│                match recv.read_chunk(STREAM_READ_CHUNK).await {\n 1041│                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n     │...\n 1047│            },\n*1048│            RecvHalf::Loopback(mut recv) => {\n 1049│                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n 1050│                loop {\n 1051│                    await_ring_room(&log, &room).await;\n     │...\n 1643│    /// (`initiated_locally = false`) the inbound dispatcher claims and serves via\n*1644│    /// `serve_attach` — exactly as an `accept_bi` would surface a remote-opened\n 1645│    /// stream. One `tokio::io::duplex` wires both directions; each row's read\n 1646│    /// pump and `StreamLog` are the SAME machinery the QUIC path uses (the W1.5\n 1647│    /// one-pump invariant). The peer row's `remote_id_hex` is this node's own id,\n     │...\n 1675│                    .map_err(|e| io::Error::other(e.to_string()))?;\n*1676│                Ok(register_stream(\n 1677│                    &shared,\n 1678│                    conn_id,\n 1679│                    &remote_id_hex,\n 1680│                    SendHalf::Quic(send),\n*1681│                    RecvHalf::Quic(recv),\n 1682│                    true,\n 1683│                ))\n 1684│            }),\n     │...\n 1703│                // dispatcher must never miss the stream.\n*1704│                register_stream(\n 1705│                    &shared,\n 1706│                    conn_id,\n 1707│                    &remote_id_hex,\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, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n   60│    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   62│    KIND_NET_DIAL_SUBMITTED, KIND_NET_PRESENCE_SUBSCRIBE,\n     │...\n 4271│    fn dispatch_net_stream_open(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4272│        let req: NetStreamOpenReq = serde_json::from_value(env.payload)\n 4273│            .map_err(|e| format!(\"bad net-stream-open payload: {e}\"))?;\n 4274│        let host = self.net.get().ok_or(\"net disabled\")?;\n 4275│        let build = |stream_id: u64, conn_id: u64, op_id: Option<u64>, applied_now: bool| {\n     │...\n 4277│                KIND_NET_STREAM_OPENED,\n*4278│                serde_json::to_value(NetStreamOpened {\n 4279│                    stream_id,\n 4280│                    conn_id,\n 4281│                    op_id,\n     │...\n 4283│                })\n*4284│                .expect(\"NetStreamOpened serializes\"),\n 4285│            )\n 4286│        };\n 4287│        match req.op_id {\n     │...\n 4326│    fn dispatch_net_stream_send(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4327│        let req: NetStreamSendReq = serde_json::from_value(env.payload)\n 4328│            .map_err(|e| format!(\"bad net-stream-send payload: {e}\"))?;\n 4329│        let bytes =\n 4330│            decode_bytes(&req.data_b64).map_err(|e| format!(\"bad net-stream-send base64: {e}\"))?;\n     │...\n 4333│            None => host\n*4334│                .send_stream(req.stream_id, &bytes, req.finish)\n 4335│                .map_err(|e| e.to_string()),\n 4336│            Some(op) => {\n 4337│                let minter = req.minter.unwrap_or(Minter::Legacy);\n     │...\n 4345│                    .apply_once(key, EffectKind::NetSend, || {\n*4346│                        host.send_stream(req.stream_id, &bytes, req.finish)\n 4347│                    })\n 4348│                    .map_err(|e| format!(\"net-stream-send failed: {e}\"))?;\n 4349│                let frame = Envelope::new(\n     │...\n 4369│            KIND_NET_STREAMS_REPLY,\n*4370│            serde_json::to_value(NetStreamsReply {\n 4371│                streams: host.stream_infos(),\n 4372│            })\n*4373│            .expect(\"NetStreamsReply serializes\"),\n 4374│        );\n 4375│        send_frame(send, &frame);\n 4376│        Ok(())\n     │...\n 4384│    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4385│        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n 4386│            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4387│        let host = self.net.get().ok_or(\"net disabled\")?;\n*4388│        let removed = host.retire_stream(req.stream_id);\n 4389│        let frame = Envelope::new(\n 4390│            KIND_NET_STREAM_RETIRED,\n*4391│            serde_json::to_value(NetStreamRetired {\n 4392│                stream_id: req.stream_id,\n 4393│                removed,\n 4394│            })\n*4395│            .expect(\"NetStreamRetired serializes\"),\n 4396│        );\n 4397│        send_frame(send, &frame);\n 4398│        Ok(())\n     │...\n 4404│    fn dispatch_net_stream_opener(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n*4405│        let req: NetStreamOpenerReq = serde_json::from_value(env.payload)\n 4406│            .map_err(|e| format!(\"bad net-stream-opener payload: {e}\"))?;\n 4407│        let host = self.net.get().ok_or(\"net disabled\")?;\n 4408│        let opener = host\n     │...\n 4412│            KIND_NET_STREAM_OPENER_REPLY,\n*4413│            serde_json::to_value(NetStreamOpenerReply {\n 4414│                stream_id: req.stream_id,\n 4415│                opener_b64: opener.map(|line| crate::msg::encode_bytes(&line)),\n 4416│            })\n*4417│            .expect(\"NetStreamOpenerReply serializes\"),\n 4418│        );\n 4419│        send_frame(send, &frame);\n 4420│        Ok(())\n     │...\n 4430│    ) -> Result<u64, String> {\n*4431│        let req: NetStreamSubscribeReq = serde_json::from_value(env.payload)\n 4432│            .map_err(|e| format!(\"bad net-stream-subscribe payload: {e}\"))?;\n 4433│        let host = self.net.get().ok_or(\"net disabled\")?;\n 4434│        host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)\n     │...\n 5575│    /// `conn.split()`.\n*5576│    fn controller_socket_pair() -> (SharedSend, Stream, interprocess::local_socket::RecvHalf) {\n 5577│        use std::sync::atomic::AtomicU32;\n 5578│        // A process-unique pipe/UDS name so parallel test threads never collide.\n 5579│        static SEQ: AtomicU32 = AtomicU32::new(0);"},"isError":false,"timestamp":1784271471910}}
{"type":"message","id":"0d1b12b9","parentId":"9e94687f","timestamp":"2026-07-17T06:57:51.913Z","message":{"role":"toolResult","toolCallId":"call_kwc2BWWSKU90DMesZco6Sh2u|fc_0a061eb498f0e908016a59d26fc6988196b20515e82726354e","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## broker.rs\n 117|/// dropped (the `tx` closes → the writer ends) and removed from the map.\n*118|struct ViewerSink {\n 119|    /// The bounded live-frame queue to this viewer's writer thread.\n 120|    tx: SyncSender<Envelope>,\n 121|    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n...\n 210|\n*211|impl Drop for WakeClaimGuard<'_> {\n 212|    fn drop(&mut self) {\n 213|        recover(self.set).remove(&self.endpoint);\n 214|    }\n...\n 493|/// on a single full `try_send` — only after [`CONTROLLER_WRITE_DEADLINE`].\n*494|struct ControllerSink {\n 495|    /// The bounded live-frame queue to the controller's writer thread.\n 496|    tx: SyncSender<CtrlMsg>,\n 497|    /// The controller's IPC send half — kept for identity matching on detach and\n...\n 544|/// `Mutex<OutputLog>` is held, so frames reach each sink in strict `seq` order.\n*545|struct OutputLog {\n 546|    session_id: u64,\n 547|    next_seq: u64,\n 548|    ring: VecDeque<(u64, Vec<u8>)>,\n...\n 800|\n*801|    fn append(&mut self, bytes: &[u8]) -> Option<u64> {\n 802|        let seq = self.next_seq;\n 803|        self.next_seq += 1;\n 804|        self.ring.push_back((seq, bytes.to_vec()));\n...\n 1419|/// evicts the row. The drain thread itself never blocks on this socket.\n*1420|fn viewer_writer(\n 1421|    send: SharedSend,\n 1422|    session_id: u64,\n 1423|    initial: Vec<Envelope>,\n...\n 1434|    }\n*1435|    impl Drop for ExitNote {\n 1436|        fn drop(&mut self) {\n 1437|            self.send.lifecycle_event(\n 1438|                \"writer-exit\",\n...\n 1552|#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\n*1553|fn controller_writer(\n 1554|    sid: u64,\n 1555|    send: SharedSend,\n 1556|    initial: Vec<(u64, Vec<u8>)>,\n...\n 1691|/// session, plus its gapless-resume output log.\n*1692|struct HostedSession {\n 1693|    /// The PTY + child (PTY master/writer + spawned child process).\n 1694|    session: Arc<PtySession>,\n 1695|    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n...\n 1768|/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\n*1769|struct InputWriter {\n 1770|    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n 1771|    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n 1772|    tx: SyncSender<InputRecord>,\n...\n 1843|/// when the last `tx` clone drops at session teardown.\n*1844|fn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n 1845|    while let Ok(bytes) = rx.recv() {\n 1846|        let _ = session.write_input(&bytes);\n 1847|    }\n...\n 2560|/// the brain (Spike #6 constraint 1).\n*2561|pub struct Broker {\n 2562|    listener: LocalSocketTransport,\n 2563|    /// The namespaced listener name — held so [`Broker::stop`] can dial a throwaway\n 2564|    /// connection to unblock the blocked `accept()` in [`serve`](Self::serve) (there is\n...\n 2784|    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n*2785|    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n 2786|        loop {\n 2787|            let conn = self.listener.accept()?;\n 2788|            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n...\n 2814|    /// that thread's handle. The single-brain entry point the tests exercise.\n*2815|    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n 2816|        let conn = self.listener.accept()?;\n 2817|        let me = Arc::clone(self);\n 2818|        Ok(thread::spawn(move || {\n...\n 3024|    /// restart must not disturb the hosted children).\n*3025|    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n 3026|        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n 3027|        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028|        struct HandlerTally<'a>(&'a AtomicUsize);\n*3029|        impl Drop for HandlerTally<'_> {\n 3030|            fn drop(&mut self) {\n 3031|                self.0.fetch_sub(1, Ordering::AcqRel);\n 3032|            }\n...\n 4777|    #[test]\n*4778|    fn viewer_writer_emits_evicted_marker_only_on_an_evicted_close() {\n 4779|        // ── EVICTED close: flag true before tx drops → marker emitted. ──\n 4780|        {\n 4781|            let (send, client, _recv) = controller_socket_pair();\n...\n 4844|    #[test]\n*4845|    fn append_overflow_flags_the_evicted_viewer_for_skip_to_live() {\n 4846|        let mut log = OutputLog::new(1, DEFAULT_LOG_CHUNKS, String::new(), (24, 80));\n 4847|        // A viewer whose live queue is depth-1 and which we NEVER drain (rx held,\n 4848|        // unread) — it cannot keep up with the drain. We do NOT use `add_viewer`\n...\n 5068|    #[test]\n*5069|    fn input_writer_preserves_strict_fifo_order_through_the_sole_writer() {\n 5070|        use spt_term::surface::{SessionSurface, SurfaceError, SurfaceSize};\n 5071|\n 5072|        /// A stub PTY write seam: appends every `write_input` to a shared Vec, in\n## conn.rs\n 414|/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\n*415|pub(crate) struct BrokerConn {\n 416|    inner: Arc<Inner>,\n 417|    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n 418|    /// watchdog aborts through strictly outlives every raw use.\n...\n 614|#[cfg(test)]\n*615|impl Drop for TestGatePin {\n 616|    fn drop(&mut self) {\n 617|        let mut g = recover(&self.inner.gate);\n 618|        g.half = self.half.take();\n...\n 638|\n*639|impl Drop for BrokerConn {\n 640|    fn drop(&mut self) {\n 641|        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n 642|        // is about to close — the terminal record of this conn id's life, with\n...\n 714|    #[test]\n*715|    fn retirement_token_splits_deadline_from_organic_with_attribution_parity() {\n 716|        let (conn, _client) = make_conn();\n 717|        conn.describe(\"role=brain\");\n 718|        conn.describe(\"controller session=7 endpoint=ep by=cli@host\");\n## nethost.rs\n 413|    /// never evicts — bytes leave only via [`drain`](Self::drain).\n*414|    fn append(&mut self, bytes: &[u8]) {\n 415|        // Opener capture (ADR-0038 B): pin the first NDJSON line as it streams\n 416|        // past, before ring bounds can ever evict it. One-shot: `Pinned` and\n 417|        // `Oversize` are terminal states.\n...\n 619|    /// in strict `seq` order.\n*620|    fn append(&mut self, kind: &str, conn_id: u64, remote_id_hex: &str) {\n 621|        self.push(NetPresenceEvent {\n 622|            seq: 0, // assigned in push\n 623|            kind: kind.to_string(),\n...\n 635|    // [impl->REQ-CONV-1]\n*636|    fn append_connected(&mut self, conn_id: u64, remote_id_hex: &str, remote_addr: serde_json::Value) {\n 637|        self.push(NetPresenceEvent {\n 638|            seq: 0,\n 639|            kind: PRESENCE_CONNECTED.to_string(),\n...\n 650|    // [impl->REQ-PUMP-PEER-ISOLATION]\n*651|    fn append_dial_failed(&mut self, remote_id_hex: &str, reason: String) {\n 652|        self.push(NetPresenceEvent {\n 653|            seq: 0,\n 654|            kind: PRESENCE_DIAL_FAILED.to_string(),\n...\n 1159|struct DialGauge(Arc<AtomicUsize>);\n*1160|impl Drop for DialGauge {\n 1161|    fn drop(&mut self) {\n 1162|        self.0.fetch_sub(1, Ordering::Relaxed);\n 1163|    }\n...\n 1835|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1836|    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1837|        let Some(entry) = self\n 1838|            .shared\n 1839|            .streams\n...\n 2393|    #[test]\n*2394|    fn retire_hides_the_row_while_active_rows_stay() {\n 2395|        let host = NetHost::start(hermetic(&Identity::generate())).expect(\"host start\");\n 2396|        let (owner, shell) = host.open_loopback_pair().expect(\"open pair\");\n 2397|        host.send_stream(owner, b\"{\\\"kind\\\":\\\"request\\\",\\\"session_id\\\":1}\\n\", false)\n...\n 2434|    #[test]\n*2435|    fn retired_row_still_flushes_a_late_reply() {\n 2436|        let host = NetHost::start(hermetic(&Identity::generate())).expect(\"host start\");\n 2437|        let (owner, shell) = host.open_loopback_pair().expect(\"open pair\");\n 2438|        // The requester's one-shot request: write + FIN (the rest/sync shape —\n...\n 2560|    #[test]\n*2561|    fn append_halts_at_first_failed_write_removes_the_seat_and_cancels_the_lease() {\n 2562|        let (sub, client, _recv) = seat_socket_pair(Duration::from_secs(5));\n 2563|        let mut log = StreamLog::new(7, 64);\n 2564|        assert_eq!(log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\"), 0);"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs, crates/spt-daemon/src/conn.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":32,"fileCount":3,"files":["crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":19},{"path":"crates/spt-daemon/src/conn.rs","count":4},{"path":"crates/spt-daemon/src/nethost.rs","count":9}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## broker.rs\n  117│/// dropped (the `tx` closes → the writer ends) and removed from the map.\n *118│struct ViewerSink {\n  119│    /// The bounded live-frame queue to this viewer's writer thread.\n  120│    tx: SyncSender<Envelope>,\n  121│    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n     │...\n  210│\n *211│impl Drop for WakeClaimGuard<'_> {\n  212│    fn drop(&mut self) {\n  213│        recover(self.set).remove(&self.endpoint);\n  214│    }\n     │...\n  493│/// on a single full `try_send` — only after [`CONTROLLER_WRITE_DEADLINE`].\n *494│struct ControllerSink {\n  495│    /// The bounded live-frame queue to the controller's writer thread.\n  496│    tx: SyncSender<CtrlMsg>,\n  497│    /// The controller's IPC send half — kept for identity matching on detach and\n     │...\n  544│/// `Mutex<OutputLog>` is held, so frames reach each sink in strict `seq` order.\n *545│struct OutputLog {\n  546│    session_id: u64,\n  547│    next_seq: u64,\n  548│    ring: VecDeque<(u64, Vec<u8>)>,\n     │...\n  800│\n *801│    fn append(&mut self, bytes: &[u8]) -> Option<u64> {\n  802│        let seq = self.next_seq;\n  803│        self.next_seq += 1;\n  804│        self.ring.push_back((seq, bytes.to_vec()));\n     │...\n 1419│/// evicts the row. The drain thread itself never blocks on this socket.\n*1420│fn viewer_writer(\n 1421│    send: SharedSend,\n 1422│    session_id: u64,\n 1423│    initial: Vec<Envelope>,\n     │...\n 1434│    }\n*1435│    impl Drop for ExitNote {\n 1436│        fn drop(&mut self) {\n 1437│            self.send.lifecycle_event(\n 1438│                \"writer-exit\",\n     │...\n 1552│#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\n*1553│fn controller_writer(\n 1554│    sid: u64,\n 1555│    send: SharedSend,\n 1556│    initial: Vec<(u64, Vec<u8>)>,\n     │...\n 1691│/// session, plus its gapless-resume output log.\n*1692│struct HostedSession {\n 1693│    /// The PTY + child (PTY master/writer + spawned child process).\n 1694│    session: Arc<PtySession>,\n 1695│    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n     │...\n 1768│/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\n*1769│struct InputWriter {\n 1770│    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n 1771│    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n 1772│    tx: SyncSender<InputRecord>,\n     │...\n 1843│/// when the last `tx` clone drops at session teardown.\n*1844│fn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n 1845│    while let Ok(bytes) = rx.recv() {\n 1846│        let _ = session.write_input(&bytes);\n 1847│    }\n     │...\n 2560│/// the brain (Spike #6 constraint 1).\n*2561│pub struct Broker {\n 2562│    listener: LocalSocketTransport,\n 2563│    /// The namespaced listener name — held so [`Broker::stop`] can dial a throwaway\n 2564│    /// connection to unblock the blocked `accept()` in [`serve`](Self::serve) (there is\n     │...\n 2784│    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n*2785│    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n 2786│        loop {\n 2787│            let conn = self.listener.accept()?;\n 2788│            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n     │...\n 2814│    /// that thread's handle. The single-brain entry point the tests exercise.\n*2815│    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n 2816│        let conn = self.listener.accept()?;\n 2817│        let me = Arc::clone(self);\n 2818│        Ok(thread::spawn(move || {\n     │...\n 3024│    /// restart must not disturb the hosted children).\n*3025│    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n 3026│        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n 3027│        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028│        struct HandlerTally<'a>(&'a AtomicUsize);\n*3029│        impl Drop for HandlerTally<'_> {\n 3030│            fn drop(&mut self) {\n 3031│                self.0.fetch_sub(1, Ordering::AcqRel);\n 3032│            }\n     │...\n 4777│    #[test]\n*4778│    fn viewer_writer_emits_evicted_marker_only_on_an_evicted_close() {\n 4779│        // ── EVICTED close: flag true before tx drops → marker emitted. ──\n 4780│        {\n 4781│            let (send, client, _recv) = controller_socket_pair();\n     │...\n 4844│    #[test]\n*4845│    fn append_overflow_flags_the_evicted_viewer_for_skip_to_live() {\n 4846│        let mut log = OutputLog::new(1, DEFAULT_LOG_CHUNKS, String::new(), (24, 80));\n 4847│        // A viewer whose live queue is depth-1 and which we NEVER drain (rx held,\n 4848│        // unread) — it cannot keep up with the drain. We do NOT use `add_viewer`\n     │...\n 5068│    #[test]\n*5069│    fn input_writer_preserves_strict_fifo_order_through_the_sole_writer() {\n 5070│        use spt_term::surface::{SessionSurface, SurfaceError, SurfaceSize};\n 5071│\n 5072│        /// A stub PTY write seam: appends every `write_input` to a shared Vec, in\n## conn.rs\n 414│/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\n*415│pub(crate) struct BrokerConn {\n 416│    inner: Arc<Inner>,\n 417│    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n 418│    /// watchdog aborts through strictly outlives every raw use.\n    │...\n 614│#[cfg(test)]\n*615│impl Drop for TestGatePin {\n 616│    fn drop(&mut self) {\n 617│        let mut g = recover(&self.inner.gate);\n 618│        g.half = self.half.take();\n    │...\n 638│\n*639│impl Drop for BrokerConn {\n 640│    fn drop(&mut self) {\n 641│        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n 642│        // is about to close — the terminal record of this conn id's life, with\n    │...\n 714│    #[test]\n*715│    fn retirement_token_splits_deadline_from_organic_with_attribution_parity() {\n 716│        let (conn, _client) = make_conn();\n 717│        conn.describe(\"role=brain\");\n 718│        conn.describe(\"controller session=7 endpoint=ep by=cli@host\");\n## nethost.rs\n  413│    /// never evicts — bytes leave only via [`drain`](Self::drain).\n *414│    fn append(&mut self, bytes: &[u8]) {\n  415│        // Opener capture (ADR-0038 B): pin the first NDJSON line as it streams\n  416│        // past, before ring bounds can ever evict it. One-shot: `Pinned` and\n  417│        // `Oversize` are terminal states.\n     │...\n  619│    /// in strict `seq` order.\n *620│    fn append(&mut self, kind: &str, conn_id: u64, remote_id_hex: &str) {\n  621│        self.push(NetPresenceEvent {\n  622│            seq: 0, // assigned in push\n  623│            kind: kind.to_string(),\n     │...\n  635│    // [impl->REQ-CONV-1]\n *636│    fn append_connected(&mut self, conn_id: u64, remote_id_hex: &str, remote_addr: serde_json::Value) {\n  637│        self.push(NetPresenceEvent {\n  638│            seq: 0,\n  639│            kind: PRESENCE_CONNECTED.to_string(),\n     │...\n  650│    // [impl->REQ-PUMP-PEER-ISOLATION]\n *651│    fn append_dial_failed(&mut self, remote_id_hex: &str, reason: String) {\n  652│        self.push(NetPresenceEvent {\n  653│            seq: 0,\n  654│            kind: PRESENCE_DIAL_FAILED.to_string(),\n     │...\n 1159│struct DialGauge(Arc<AtomicUsize>);\n*1160│impl Drop for DialGauge {\n 1161│    fn drop(&mut self) {\n 1162│        self.0.fetch_sub(1, Ordering::Relaxed);\n 1163│    }\n     │...\n 1835│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1836│    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1837│        let Some(entry) = self\n 1838│            .shared\n 1839│            .streams\n     │...\n 2393│    #[test]\n*2394│    fn retire_hides_the_row_while_active_rows_stay() {\n 2395│        let host = NetHost::start(hermetic(&Identity::generate())).expect(\"host start\");\n 2396│        let (owner, shell) = host.open_loopback_pair().expect(\"open pair\");\n 2397│        host.send_stream(owner, b\"{\\\"kind\\\":\\\"request\\\",\\\"session_id\\\":1}\\n\", false)\n     │...\n 2434│    #[test]\n*2435│    fn retired_row_still_flushes_a_late_reply() {\n 2436│        let host = NetHost::start(hermetic(&Identity::generate())).expect(\"host start\");\n 2437│        let (owner, shell) = host.open_loopback_pair().expect(\"open pair\");\n 2438│        // The requester's one-shot request: write + FIN (the rest/sync shape —\n     │...\n 2560│    #[test]\n*2561│    fn append_halts_at_first_failed_write_removes_the_seat_and_cancels_the_lease() {\n 2562│        let (sub, client, _recv) = seat_socket_pair(Duration::from_secs(5));\n 2563│        let mut log = StreamLog::new(7, 64);\n 2564│        assert_eq!(log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\"), 0);"},"isError":false,"timestamp":1784271471912}}
{"type":"message","id":"3901026b","parentId":"0d1b12b9","timestamp":"2026-07-17T06:57:52.668Z","message":{"role":"toolResult","toolCallId":"call_dJbtkJ3fpa8tUBnwfOecSaqt|fc_0a061eb498f0e908016a59d26fc6908196890519e2594822c3","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\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## attach.rs\n 140|/// bounded channel is full (a controller that falls behind its own echo under a\n*141|/// hard flood). The next frame this reader sees is then a FORWARD gap that the\n 142|/// strict reject-gap (`read_event`, legacy single-session path) FATALS. A\n 143|/// controller CANNOT snap-above like a viewer (B2: it is authoritative — it\n 144|/// advances `delivered_through`; skipping rolled frames would be a not-exactly-once\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 200|/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n*201|/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n 202|/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n 203|/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n 204|/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n 205|/// channel supplies the deadline. On a timeout the pump bubbles out to a\n*206|/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n*207|/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n 208|/// old conn's drop eventually errors its read and the thread exits).\n 209|enum BrainConn {\n 210|    /// The ordinary blocking carrier — every non-pump brain.\n...\n 212|    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\n*213|    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\n 214|    Split {\n 215|        send: SendHalf,\n 216|        frames: Receiver<io::Result<Envelope>>,\n*217|        /// The reader-thread handle — held so the thread is owned, not detached\n 218|        /// silently. On a supervised restart the whole [`Brain`] drops; this\n 219|        /// handle drops with it (the thread, blocked in `read_frame`, is\n 220|        /// abandoned and exits when the old conn closes — KH 7.6).\n*221|        _reader: JoinHandle<()>,\n 222|    },\n 223|}\n 224|\n...\n 226|    /// Split a connected+handshaked stream into the pump carrier: spawn the\n*227|    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\n*228|    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\n*229|    /// reader is diagnosable in the field (KH 7.6).\n 230|    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*231|    fn split_with_reader(stream: Stream) -> BrainConn {\n 232|        let (mut recv, send) = stream.split();\n 233|        let (tx, frames) = mpsc::channel();\n*234|        let reader = thread::Builder::new()\n*235|            .name(\"pump-ipc-reader\".to_string())\n 236|            .spawn(move || {\n 237|                eprintln!(\"PUMP_IPC_READER: spawned\");\n 238|                loop {\n...\n 253|            })\n*254|            .expect(\"spawn pump-ipc-reader thread\");\n 255|        BrainConn::Split {\n 256|            send,\n 257|            frames,\n*258|            _reader: reader,\n 259|        }\n 260|    }\n 261|}\n...\n 295|    /// — set only by [`Brain::cold_start_pump`], which also splits the carrier\n*296|    /// into the reader-thread form so the deadline can be honored over a channel\n 297|    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n 298|    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n 299|    /// single-threaded pump, where a black-holed peer would wedge the whole loop\n...\n 337|    /// Cold start in **PUMP mode**: connect, handshake, then SPLIT the stream\n*338|    /// into the reader-thread carrier ([`BrainConn::Split`]) and arm a per-IPC-\n 339|    /// call deadline of `io_timeout`. This is the peer pump's dedicated client —\n 340|    /// every reply read is bounded ([`Brain::read_event_until`] via\n 341|    /// [`Brain::call_deadline`]) so a black-holed peer can never wedge the\n...\n 344|    /// is impossible behind `&mut self`), so a pump brain is split-and-bounded\n*345|    /// for its whole life and a non-pump brain never pays the reader thread.\n 346|    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n 347|    pub fn cold_start_pump(name: &str, now_ms: u64, io_timeout: Duration) -> io::Result<Self> {\n 348|        let mut stream = LocalSocketTransport::connect(name)?;\n...\n 350|        Ok(Brain {\n*351|            conn: BrainConn::split_with_reader(stream),\n 352|            generation: 0,\n 353|            gen_start_ms: now_ms,\n 354|            session_id: None,\n...\n 446|    /// races ahead).\n*447|    pub fn spawn_session(&mut self, req: SpawnReq) -> io::Result<u64> {\n 448|        self.spawn_session_pid(req)\n 449|            .map(|(session_id, _)| session_id)\n 450|    }\n...\n 465|    /// session) or route the frames it reads for other sessions, not drop them.\n*466|    pub fn spawn_session_pid(&mut self, req: SpawnReq) -> io::Result<(u64, Option<u32>)> {\n 467|        self.send(\n 468|            KIND_SPAWN,\n 469|            serde_json::to_value(req).expect(\"SpawnReq serializes\"),\n## brainproc.rs\n 366|    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\n*367|    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\n 368|    // tolerates its absence). Never fail the ready write over a diagnostic field.\n 369|    if let Some(hash) = current_exe_hash() {\n 370|        obj[\"exe_hash\"] = serde_json::Value::String(hash);\n...\n 1094|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*1095|pub fn spawn_brain_supervisor(\n 1096|    stop: Arc<AtomicBool>,\n 1097|    reaper: Arc<crate::reap::BrainReaper>,\n 1098|    broker: Option<Arc<crate::broker::Broker>>,\n...\n 1110|    let canonical_exe = std::env::current_exe().ok();\n*1111|    let handle = thread::spawn(move || {\n 1112|        // The DRAINED gate (REQ-UPDATE-PROMOTE-DRAINED) reads broker truth in-process;\n 1113|        // a net-less / bind-failed daemon has no broker (None) → the gate degrades to\n 1114|        // readiness-only (no old-gen control plane to drain).\n...\n 1396|\n*1397|    /// D7-1: the `exe_hash` breadcrumb reader extracts the resident-bytes digest\n 1398|    /// and is N-1-readable — a legacy D6-era `{pid, generation}` stamp (no\n 1399|    /// `exe_hash`) reads `None`, never an error.\n 1400|    // [unit->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n## broker.rs\n 353|// The typed idle-inject leg ate HEAD bytes nondeterministically: bytes typed into a\n*354|// PTY whose input reader is not yet attached/settled are swallowed mid-stream (the\n 355|// pre-settle race — 1854B once landed intact, ~1150B usually swallowed = a timing\n 356|// class, not a size cap). A live-SENT inject leaves NO spool copy, so a swallow is\n 357|// silent AND unrecoverable. The fix is three layers: (1) MUST settle-gate before ANY\n...\n 373|/// a TUI input line and never a submit; a live terminal/child answers or re-renders,\n*374|/// producing output — the POSITIVE signal that the input reader is attached.\n 375|const INJECT_SETTLE_PROBE: &[u8] = b\"\\x1b[6n\";\n 376|\n 377|/// The effective settle-gate deadline; the int gate tunes it via\n...\n 417|/// rather than one write, so no single huge write races the terminal's coalescer.\n*418|/// Layered UNDER the settle-gate (the reader is already confirmed live before the\n 419|/// first chunk). The int gate tunes it via `SPT_INJECT_TEXT_CHUNK`.\n 420|const INJECT_TEXT_CHUNK: usize = 256;\n 421|\n...\n 506|    /// The controller's identity: `Some(node)` = a remote operator, `None` =\n*507|    /// local (the brain's spawn-reader / resume). Ownership keys on this.\n 508|    by: Option<String>,\n 509|    /// Time of the last SUCCESSFUL handoff (`try_send` Ok) to this controller's\n 510|    /// writer channel (b4, REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE).\n...\n 519|    /// `Some(Instant::now())` immediately BEFORE it enters a blocking `write_frame`\n*520|    /// and back to `None` the instant the write returns. A reader\n 521|    /// ([`OutputLog::controller_stalled`]) sees a `Some` older than\n 522|    /// [`BRAIN_WRITE_DEADLINE`] as a writer WEDGED on a suspended/black-holed brain\n 523|    /// conn and stall-evicts it — the signal `last_ok` (channel-handoff time) cannot\n...\n 525|    /// BLOCKED one (writer stuck in the socket write, `Some` here) both leave\n*526|    /// `last_ok` stale. `Arc<Mutex<…>>` so the reader observes the writer's live\n 527|    /// state; the mutex is taken only around the brief set/clear and the read, never\n 528|    /// held across the socket write itself.\n 529|    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n...\n 591|    /// `attach(sub, 0)` rewind-replay would reset the resume point under a live\n*592|    /// reader.\n 593|    ///\n 594|    /// W1: now an `Arc<AtomicU64>` shared with the controller's writer thread,\n 595|    /// which advances it (via [`advanced_cursor`], CAS-monotonic) as it writes —\n...\n 947|        let writer_blocked = Arc::clone(&write_blocked_since);\n*948|        let writer = thread::spawn(move || {\n 949|            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n 950|        });\n 951|        self.controller = Some(ControllerSink {\n...\n 1137|        let writer =\n*1138|            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139|        self.viewers.insert(\n 1140|            vid,\n 1141|            ViewerSink {\n...\n 1563|    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n*1564|    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n 1565|    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n 1566|    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n 1567|    // move the wedge onto the mutex).\n...\n 1789|        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790|        let writer = thread::spawn(move || input_writer(session, rx));\n 1791|        Arc::new(InputWriter {\n 1792|            tx,\n 1793|            backpressure: AtomicBool::new(false),\n...\n 1991|            let sup_endpoint = endpoint_id.to_string();\n*1992|            thread::spawn(move || {\n 1993|                run_inject_worker_supervised(\n 1994|                    sup_child,\n 1995|                    sup_faulted,\n...\n 2068|/// Layer 1 (REQ-INJECT-MULTILINE-INTEGRITY, the load-bearing fix): settle-gate before\n*2069|/// ANY inject byte of a sequence. The head-swallow race is a PTY whose input reader is\n 2070|/// not yet attached/settled when the first bytes are typed. It is NOT startup-only: a\n 2071|/// mid-session harness reset (a `/clear` re-entering raw mode, re-attaching the input\n*2072|/// reader) RE-CREATES the same window (field-proven on 0.29.0 — a checkpoint-wake payload\n 2073|/// injected right after `/clear` lost its head), so an echoing/interactive PTY must\n 2074|/// re-settle every delivery, not once per worker. Detect readiness with a POSITIVE\n 2075|/// signal, not a blind timer: write the benign DSR cursor-position probe and wait for the\n*2076|/// session ring to produce output (the child answered / re-rendered → its reader is live).\n 2077|/// Re-probe each tick until output appears or the bounded deadline elapses — a genuinely\n 2078|/// quiet/dead child never parks the worker (echo-verify + the commit deadline still bound\n 2079|/// delivery). No lock is held across a PTY write. Returns `true` iff the probe was\n...\n 2086|    loop {\n*2087|        // Probe: a live reader answers DSR / re-renders → the ring advances.\n 2088|        input.enqueue(INJECT_SETTLE_PROBE.to_vec());\n 2089|        thread::sleep(INJECT_SETTLE_POLL);\n 2090|        if recover_log(log).high_water() > baseline {\n*2091|            return true; // output produced since baseline → the input reader is live\n 2092|        }\n 2093|        if Instant::now() >= deadline {\n 2094|            eprintln!(\n...\n 2103|/// Decide whether to run the settle-gate for this delivery attempt (Layer 1 re-arm,\n*2104|/// REQ-INJECT-MULTILINE-INTEGRITY). The reader-reattach race is NOT startup-only, so an\n*2105|/// echoing/interactive PTY (the bug-prone class — a `/clear` re-attaches its reader\n 2106|/// mid-session) MUST re-settle before EVERY delivery's first byte. We only skip that\n 2107|/// steady-state settle where the probe is known UNOBSERVABLE on this PTY (a non-echoing\n*2108|/// ConPTY, whose DSR answer never surfaces): there is no reader-reattach race to guard,\n 2109|/// and each settle would burn the full deadline. A RE-DRIVE (attempt > 1) always settles\n 2110|/// regardless of the latch — it is only reached on a swallowed head, so readiness must be\n 2111|/// re-confirmed before retyping.\n## conn.rs\n 447|        let dog_inner = Arc::clone(&inner);\n*448|        let dog = thread::Builder::new()\n 449|            .name(\"conn-watchdog\".into())\n 450|            .spawn(move || dog_inner.watchdog())\n 451|            .ok();\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 619|/// with `bInheritHandles = TRUE`, so the long-lived daemon would inherit that\n*620|/// pipe's write end and hold it open forever — the capturing reader never sees\n 621|/// EOF and hangs. Worse, inheritable pipe handles flow through EVERY\n 622|/// `bInheritHandles = TRUE` hop: stripping only this process's *std* handles\n 623|/// (the first guard shipped here) still leaked a grandparent capture's pipe\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## deelevate.rs\n 581|    // [impl->REQ-HAZARD-ELEVATED-DAEMON-SPAWN]\n*582|    pub fn spawn_deelevated(program: &str, args: &[String]) -> io::Result<Option<u32>> {\n 583|        if !is_elevated() {\n 584|            return Ok(None);\n 585|        }\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...\n 404|                DigestEntry::Boundary { kind, .. } => {\n*405|                    // A distinctive divider so a reader sees the context reset\n 406|                    // without losing the spanned thread (REQ-TERM-6).\n 407|                    out.push_str(&format!(\"── /{kind} ──\\n\"));\n 408|                }\n## dispatch.rs\n 497|            pool.fetch_add(1, Ordering::Relaxed);\n*498|            thread::spawn(move || {\n 499|                let started = Instant::now();\n 500|                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n 501|                pool.fetch_sub(1, Ordering::Relaxed);\n...\n 1196|/// socket — the daemon-boot entry ([`crate::daemon::Daemon::run`]).\n*1197|pub fn spawn_dispatcher(\n 1198|    broker_name: String,\n 1199|    registry: Arc<RegistryHost>,\n 1200|    stop: Arc<AtomicBool>,\n 1201|) -> thread::JoinHandle<()> {\n*1202|    thread::spawn(move || {\n 1203|        let paths = DispatchPaths::production();\n 1204|        if let Err(e) =\n 1205|            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n## docshost.rs\n 253|    let (tx, rx) = std::sync::mpsc::channel::<io::Result<u16>>();\n*254|    std::thread::Builder::new()\n 255|        .name(\"spt-docs-server\".to_string())\n 256|        .spawn(move || {\n 257|            let rt = match tokio::runtime::Builder::new_current_thread()\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 22|//! write to an offline/unreachable peer**, retained as the re-drive recovery\n*23|//! marker (it re-drives on the next brain restart / reachability). Two reader\n 24|//! caveats: the log is **append-only**, so a failed-then-re-driven effect keeps\n 25|//! its stale `PENDING` line AND appends a fresh `PENDING`+`DONE` — a raw\n 26|//! line-count OVER-reads the live pending set; [`recover`] is authoritative and\n...\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## frame.rs\n 117|/// One IPC message. The forward-compatible envelope: `protocol_version` lets a\n*118|/// reader scope its interpretation, `kind` is a *string* so an unknown message\n 119|/// type decodes cleanly (the logic layer decides what to do with an unknown\n 120|/// kind), and `payload` is opaque JSON so each kind owns its own shape without\n 121|/// the envelope needing to know it. Unknown trailing fields are ignored on\n## lifecycle.rs\n 349|        let runtime = build_runtime(&new, install_dir);\n*350|        // Write the runtime first, then the manifest: a reader that snapshots\n 351|        // between the two writes sees the new runtime with the old manifest at\n 352|        // worst — never a runtime built from a manifest it can't see. Both writes\n 353|        // are short (no spawn/IO under the guard).\n...\n 963|    /// state participant; a phantom status/pid would render it a cold instance to\n*964|    /// endpoint readers. It is a dedicated `psyche-custody.json` (`{\"session_id\":\"…\"}`),\n 965|    /// NOT an `info.json`, so the perch scans (which key off `info.json`) never see it.\n 966|    ///\n 967|    /// Reseed (FORK-3; W3 amendment): a turn that fails with the RESERVED EXIT CODE 95\n## livehost.rs\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...\n 977|// [impl->REQ-DAEMON-1]\n*978|pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n*979|    std::thread::spawn(move || {\n 980|        let set = Arc::new(LiveSet::new());\n 981|        {\n 982|            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n...\n 1481|            let b2 = Arc::clone(&broker);\n*1482|            std::thread::spawn(move || {\n 1483|                let _ = b2.serve();\n 1484|            });\n 1485|            let mut brain = {\n## msg.rs\n 357|    /// W2.5 controller/viewer intent (REQ-RCVIEW-1). `#[serde(default)]` =\n*358|    /// [`AttachIntent::Control`], so a local resume / spawn-reader / an N-1\n 359|    /// brain's `subscribe` (no field) re-takes the controller slot as before.\n 360|    #[serde(default)]\n 361|    pub intent: AttachIntent,\n...\n 363|    /// handshake-proven origin), `None` = local (the daemon brain's own\n*364|    /// spawn-reader / resume). The broker keys controller identity on this:\n 365|    /// a same-`by` re-subscribe silently re-takes the controller (no\n 366|    /// `Displaced`); a `None` (local) re-attach NEVER displaces a remote\n 367|    /// controller (it falls back to viewer) — the gate-#7 invariant.\n## nethost.rs\n 195|        let writer_poisoned = Arc::clone(&poisoned);\n*196|        std::thread::spawn(move || {\n 197|            let poison = |halt_reason: &str| {\n 198|                writer_poisoned.store(true, Ordering::Release);\n 199|                if let Some(l) = &lease {\n...\n 2236|    // the owner keeps writing must NOT lose bytes AND must NOT grow unbounded — the\n*2237|    // read pump lags the sender at the cap. After the reader catches up, every byte\n 2238|    // arrives byte-exact and in order. Proves \"lag, never loss\".\n 2239|    #[test]\n 2240|    fn loopback_tunnel_backpressures_without_loss() {\n...\n 2258|            let sent = Arc::clone(&sent);\n*2259|            std::thread::spawn(move || {\n 2260|                for f in &frames {\n 2261|                    host.send_stream(owner, f, false).expect(\"send\");\n 2262|                    sent.fetch_add(1, AtOrd::Relaxed);\n\n## bin/\n### xlate_choreo_fixture.rs\n 12|//! On an `event` we emit (here → spt-core, one JSON object per line on stdout,\n*13|//! flushing each so the broker's reader sees them promptly):\n 14|//!   `{\"key\":\"ctrl+s\"}` `{\"delay_ms\":50}` `{\"text\":\"XLATE_OK\"}` `{\"key\":\"enter\"}`\n 15|//!   `{\"delay_ms\":50}` `{\"key\":\"ctrl+s\"}` then `{\"commit\":true}`.\n 16|//!\n...\n 82|\n*83|        // Emit the choreography, flushing each line so the broker's line-reader\n 84|        // applies it promptly (the delays are part of the sequence the broker\n 85|        // honors, not a wall-clock the test asserts on).\n 86|        emit(&mut out, r#\"{\"key\":\"ctrl+s\"}\"#);\n\nShowing files 1-20 of 176+. Use skip=20 for the next page, or narrow paths/pattern."}],"details":{"scopePath":"crates","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":81,"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/bin/xlate_choreo_fixture.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/deelevate.rs","crates/spt-daemon/src/digesthub.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/docshost.rs","crates/spt-daemon/src/drivehub.rs","crates/spt-daemon/src/effect.rs","crates/spt-daemon/src/frame.rs","crates/spt-daemon/src/lifecycle.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/msg.rs","crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/applyhost.rs","count":1},{"path":"crates/spt-daemon/src/attach.rs","count":1},{"path":"crates/spt-daemon/src/autostart.rs","count":1},{"path":"crates/spt-daemon/src/bin/xlate_choreo_fixture.rs","count":2},{"path":"crates/spt-daemon/src/brain.rs","count":20},{"path":"crates/spt-daemon/src/brainproc.rs","count":4},{"path":"crates/spt-daemon/src/broker.rs","count":20},{"path":"crates/spt-daemon/src/conn.rs","count":1},{"path":"crates/spt-daemon/src/daemon.rs","count":8},{"path":"crates/spt-daemon/src/deelevate.rs","count":1},{"path":"crates/spt-daemon/src/digesthub.rs","count":2},{"path":"crates/spt-daemon/src/dispatch.rs","count":3},{"path":"crates/spt-daemon/src/docshost.rs","count":1},{"path":"crates/spt-daemon/src/drivehub.rs","count":1},{"path":"crates/spt-daemon/src/effect.rs","count":3},{"path":"crates/spt-daemon/src/frame.rs","count":1},{"path":"crates/spt-daemon/src/lifecycle.rs","count":2},{"path":"crates/spt-daemon/src/livehost.rs","count":4},{"path":"crates/spt-daemon/src/msg.rs","count":2},{"path":"crates/spt-daemon/src/nethost.rs","count":3}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\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## attach.rs\n 140│/// bounded channel is full (a controller that falls behind its own echo under a\n*141│/// hard flood). The next frame this reader sees is then a FORWARD gap that the\n 142│/// strict reject-gap (`read_event`, legacy single-session path) FATALS. A\n 143│/// controller CANNOT snap-above like a viewer (B2: it is authoritative — it\n 144│/// advances `delivered_through`; skipping rolled frames would be a not-exactly-once\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 200│/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n*201│/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n 202│/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n 203│/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n 204│/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n 205│/// channel supplies the deadline. On a timeout the pump bubbles out to a\n*206│/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n*207│/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n 208│/// old conn's drop eventually errors its read and the thread exits).\n 209│enum BrainConn {\n 210│    /// The ordinary blocking carrier — every non-pump brain.\n    │...\n 212│    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\n*213│    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\n 214│    Split {\n 215│        send: SendHalf,\n 216│        frames: Receiver<io::Result<Envelope>>,\n*217│        /// The reader-thread handle — held so the thread is owned, not detached\n 218│        /// silently. On a supervised restart the whole [`Brain`] drops; this\n 219│        /// handle drops with it (the thread, blocked in `read_frame`, is\n 220│        /// abandoned and exits when the old conn closes — KH 7.6).\n*221│        _reader: JoinHandle<()>,\n 222│    },\n 223│}\n 224│\n    │...\n 226│    /// Split a connected+handshaked stream into the pump carrier: spawn the\n*227│    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\n*228│    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\n*229│    /// reader is diagnosable in the field (KH 7.6).\n 230│    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*231│    fn split_with_reader(stream: Stream) -> BrainConn {\n 232│        let (mut recv, send) = stream.split();\n 233│        let (tx, frames) = mpsc::channel();\n*234│        let reader = thread::Builder::new()\n*235│            .name(\"pump-ipc-reader\".to_string())\n 236│            .spawn(move || {\n 237│                eprintln!(\"PUMP_IPC_READER: spawned\");\n 238│                loop {\n    │...\n 253│            })\n*254│            .expect(\"spawn pump-ipc-reader thread\");\n 255│        BrainConn::Split {\n 256│            send,\n 257│            frames,\n*258│            _reader: reader,\n 259│        }\n 260│    }\n 261│}\n    │...\n 295│    /// — set only by [`Brain::cold_start_pump`], which also splits the carrier\n*296│    /// into the reader-thread form so the deadline can be honored over a channel\n 297│    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n 298│    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n 299│    /// single-threaded pump, where a black-holed peer would wedge the whole loop\n    │...\n 337│    /// Cold start in **PUMP mode**: connect, handshake, then SPLIT the stream\n*338│    /// into the reader-thread carrier ([`BrainConn::Split`]) and arm a per-IPC-\n 339│    /// call deadline of `io_timeout`. This is the peer pump's dedicated client —\n 340│    /// every reply read is bounded ([`Brain::read_event_until`] via\n 341│    /// [`Brain::call_deadline`]) so a black-holed peer can never wedge the\n    │...\n 344│    /// is impossible behind `&mut self`), so a pump brain is split-and-bounded\n*345│    /// for its whole life and a non-pump brain never pays the reader thread.\n 346│    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n 347│    pub fn cold_start_pump(name: &str, now_ms: u64, io_timeout: Duration) -> io::Result<Self> {\n 348│        let mut stream = LocalSocketTransport::connect(name)?;\n    │...\n 350│        Ok(Brain {\n*351│            conn: BrainConn::split_with_reader(stream),\n 352│            generation: 0,\n 353│            gen_start_ms: now_ms,\n 354│            session_id: None,\n    │...\n 446│    /// races ahead).\n*447│    pub fn spawn_session(&mut self, req: SpawnReq) -> io::Result<u64> {\n 448│        self.spawn_session_pid(req)\n 449│            .map(|(session_id, _)| session_id)\n 450│    }\n    │...\n 465│    /// session) or route the frames it reads for other sessions, not drop them.\n*466│    pub fn spawn_session_pid(&mut self, req: SpawnReq) -> io::Result<(u64, Option<u32>)> {\n 467│        self.send(\n 468│            KIND_SPAWN,\n 469│            serde_json::to_value(req).expect(\"SpawnReq serializes\"),\n## brainproc.rs\n  366│    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\n *367│    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\n  368│    // tolerates its absence). Never fail the ready write over a diagnostic field.\n  369│    if let Some(hash) = current_exe_hash() {\n  370│        obj[\"exe_hash\"] = serde_json::Value::String(hash);\n     │...\n 1094│// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*1095│pub fn spawn_brain_supervisor(\n 1096│    stop: Arc<AtomicBool>,\n 1097│    reaper: Arc<crate::reap::BrainReaper>,\n 1098│    broker: Option<Arc<crate::broker::Broker>>,\n     │...\n 1110│    let canonical_exe = std::env::current_exe().ok();\n*1111│    let handle = thread::spawn(move || {\n 1112│        // The DRAINED gate (REQ-UPDATE-PROMOTE-DRAINED) reads broker truth in-process;\n 1113│        // a net-less / bind-failed daemon has no broker (None) → the gate degrades to\n 1114│        // readiness-only (no old-gen control plane to drain).\n     │...\n 1396│\n*1397│    /// D7-1: the `exe_hash` breadcrumb reader extracts the resident-bytes digest\n 1398│    /// and is N-1-readable — a legacy D6-era `{pid, generation}` stamp (no\n 1399│    /// `exe_hash`) reads `None`, never an error.\n 1400│    // [unit->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n## broker.rs\n  353│// The typed idle-inject leg ate HEAD bytes nondeterministically: bytes typed into a\n *354│// PTY whose input reader is not yet attached/settled are swallowed mid-stream (the\n  355│// pre-settle race — 1854B once landed intact, ~1150B usually swallowed = a timing\n  356│// class, not a size cap). A live-SENT inject leaves NO spool copy, so a swallow is\n  357│// silent AND unrecoverable. The fix is three layers: (1) MUST settle-gate before ANY\n     │...\n  373│/// a TUI input line and never a submit; a live terminal/child answers or re-renders,\n *374│/// producing output — the POSITIVE signal that the input reader is attached.\n  375│const INJECT_SETTLE_PROBE: &[u8] = b\"\\x1b[6n\";\n  376│\n  377│/// The effective settle-gate deadline; the int gate tunes it via\n     │...\n  417│/// rather than one write, so no single huge write races the terminal's coalescer.\n *418│/// Layered UNDER the settle-gate (the reader is already confirmed live before the\n  419│/// first chunk). The int gate tunes it via `SPT_INJECT_TEXT_CHUNK`.\n  420│const INJECT_TEXT_CHUNK: usize = 256;\n  421│\n     │...\n  506│    /// The controller's identity: `Some(node)` = a remote operator, `None` =\n *507│    /// local (the brain's spawn-reader / resume). Ownership keys on this.\n  508│    by: Option<String>,\n  509│    /// Time of the last SUCCESSFUL handoff (`try_send` Ok) to this controller's\n  510│    /// writer channel (b4, REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE).\n     │...\n  519│    /// `Some(Instant::now())` immediately BEFORE it enters a blocking `write_frame`\n *520│    /// and back to `None` the instant the write returns. A reader\n  521│    /// ([`OutputLog::controller_stalled`]) sees a `Some` older than\n  522│    /// [`BRAIN_WRITE_DEADLINE`] as a writer WEDGED on a suspended/black-holed brain\n  523│    /// conn and stall-evicts it — the signal `last_ok` (channel-handoff time) cannot\n     │...\n  525│    /// BLOCKED one (writer stuck in the socket write, `Some` here) both leave\n *526│    /// `last_ok` stale. `Arc<Mutex<…>>` so the reader observes the writer's live\n  527│    /// state; the mutex is taken only around the brief set/clear and the read, never\n  528│    /// held across the socket write itself.\n  529│    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n     │...\n  591│    /// `attach(sub, 0)` rewind-replay would reset the resume point under a live\n *592│    /// reader.\n  593│    ///\n  594│    /// W1: now an `Arc<AtomicU64>` shared with the controller's writer thread,\n  595│    /// which advances it (via [`advanced_cursor`], CAS-monotonic) as it writes —\n     │...\n  947│        let writer_blocked = Arc::clone(&write_blocked_since);\n *948│        let writer = thread::spawn(move || {\n  949│            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n  950│        });\n  951│        self.controller = Some(ControllerSink {\n     │...\n 1137│        let writer =\n*1138│            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139│        self.viewers.insert(\n 1140│            vid,\n 1141│            ViewerSink {\n     │...\n 1563│    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n*1564│    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n 1565│    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n 1566│    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n 1567│    // move the wedge onto the mutex).\n     │...\n 1789│        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790│        let writer = thread::spawn(move || input_writer(session, rx));\n 1791│        Arc::new(InputWriter {\n 1792│            tx,\n 1793│            backpressure: AtomicBool::new(false),\n     │...\n 1991│            let sup_endpoint = endpoint_id.to_string();\n*1992│            thread::spawn(move || {\n 1993│                run_inject_worker_supervised(\n 1994│                    sup_child,\n 1995│                    sup_faulted,\n     │...\n 2068│/// Layer 1 (REQ-INJECT-MULTILINE-INTEGRITY, the load-bearing fix): settle-gate before\n*2069│/// ANY inject byte of a sequence. The head-swallow race is a PTY whose input reader is\n 2070│/// not yet attached/settled when the first bytes are typed. It is NOT startup-only: a\n 2071│/// mid-session harness reset (a `/clear` re-entering raw mode, re-attaching the input\n*2072│/// reader) RE-CREATES the same window (field-proven on 0.29.0 — a checkpoint-wake payload\n 2073│/// injected right after `/clear` lost its head), so an echoing/interactive PTY must\n 2074│/// re-settle every delivery, not once per worker. Detect readiness with a POSITIVE\n 2075│/// signal, not a blind timer: write the benign DSR cursor-position probe and wait for the\n*2076│/// session ring to produce output (the child answered / re-rendered → its reader is live).\n 2077│/// Re-probe each tick until output appears or the bounded deadline elapses — a genuinely\n 2078│/// quiet/dead child never parks the worker (echo-verify + the commit deadline still bound\n 2079│/// delivery). No lock is held across a PTY write. Returns `true` iff the probe was\n     │...\n 2086│    loop {\n*2087│        // Probe: a live reader answers DSR / re-renders → the ring advances.\n 2088│        input.enqueue(INJECT_SETTLE_PROBE.to_vec());\n 2089│        thread::sleep(INJECT_SETTLE_POLL);\n 2090│        if recover_log(log).high_water() > baseline {\n*2091│            return true; // output produced since baseline → the input reader is live\n 2092│        }\n 2093│        if Instant::now() >= deadline {\n 2094│            eprintln!(\n     │...\n 2103│/// Decide whether to run the settle-gate for this delivery attempt (Layer 1 re-arm,\n*2104│/// REQ-INJECT-MULTILINE-INTEGRITY). The reader-reattach race is NOT startup-only, so an\n*2105│/// echoing/interactive PTY (the bug-prone class — a `/clear` re-attaches its reader\n 2106│/// mid-session) MUST re-settle before EVERY delivery's first byte. We only skip that\n 2107│/// steady-state settle where the probe is known UNOBSERVABLE on this PTY (a non-echoing\n*2108│/// ConPTY, whose DSR answer never surfaces): there is no reader-reattach race to guard,\n 2109│/// and each settle would burn the full deadline. A RE-DRIVE (attempt > 1) always settles\n 2110│/// regardless of the latch — it is only reached on a swallowed head, so readiness must be\n 2111│/// re-confirmed before retyping.\n## conn.rs\n 447│        let dog_inner = Arc::clone(&inner);\n*448│        let dog = thread::Builder::new()\n 449│            .name(\"conn-watchdog\".into())\n 450│            .spawn(move || dog_inner.watchdog())\n 451│            .ok();\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  619│/// with `bInheritHandles = TRUE`, so the long-lived daemon would inherit that\n *620│/// pipe's write end and hold it open forever — the capturing reader never sees\n  621│/// EOF and hangs. Worse, inheritable pipe handles flow through EVERY\n  622│/// `bInheritHandles = TRUE` hop: stripping only this process's *std* handles\n  623│/// (the first guard shipped here) still leaked a grandparent capture's pipe\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## deelevate.rs\n 581│    // [impl->REQ-HAZARD-ELEVATED-DAEMON-SPAWN]\n*582│    pub fn spawn_deelevated(program: &str, args: &[String]) -> io::Result<Option<u32>> {\n 583│        if !is_elevated() {\n 584│            return Ok(None);\n 585│        }\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    │...\n 404│                DigestEntry::Boundary { kind, .. } => {\n*405│                    // A distinctive divider so a reader sees the context reset\n 406│                    // without losing the spanned thread (REQ-TERM-6).\n 407│                    out.push_str(&format!(\"── /{kind} ──\\n\"));\n 408│                }\n## dispatch.rs\n  497│            pool.fetch_add(1, Ordering::Relaxed);\n *498│            thread::spawn(move || {\n  499│                let started = Instant::now();\n  500│                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n  501│                pool.fetch_sub(1, Ordering::Relaxed);\n     │...\n 1196│/// socket — the daemon-boot entry ([`crate::daemon::Daemon::run`]).\n*1197│pub fn spawn_dispatcher(\n 1198│    broker_name: String,\n 1199│    registry: Arc<RegistryHost>,\n 1200│    stop: Arc<AtomicBool>,\n 1201│) -> thread::JoinHandle<()> {\n*1202│    thread::spawn(move || {\n 1203│        let paths = DispatchPaths::production();\n 1204│        if let Err(e) =\n 1205│            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n## docshost.rs\n 253│    let (tx, rx) = std::sync::mpsc::channel::<io::Result<u16>>();\n*254│    std::thread::Builder::new()\n 255│        .name(\"spt-docs-server\".to_string())\n 256│        .spawn(move || {\n 257│            let rt = match tokio::runtime::Builder::new_current_thread()\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  22│//! write to an offline/unreachable peer**, retained as the re-drive recovery\n *23│//! marker (it re-drives on the next brain restart / reachability). Two reader\n  24│//! caveats: the log is **append-only**, so a failed-then-re-driven effect keeps\n  25│//! its stale `PENDING` line AND appends a fresh `PENDING`+`DONE` — a raw\n  26│//! line-count OVER-reads the live pending set; [`recover`] is authoritative and\n    │...\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## frame.rs\n 117│/// One IPC message. The forward-compatible envelope: `protocol_version` lets a\n*118│/// reader scope its interpretation, `kind` is a *string* so an unknown message\n 119│/// type decodes cleanly (the logic layer decides what to do with an unknown\n 120│/// kind), and `payload` is opaque JSON so each kind owns its own shape without\n 121│/// the envelope needing to know it. Unknown trailing fields are ignored on\n## lifecycle.rs\n 349│        let runtime = build_runtime(&new, install_dir);\n*350│        // Write the runtime first, then the manifest: a reader that snapshots\n 351│        // between the two writes sees the new runtime with the old manifest at\n 352│        // worst — never a runtime built from a manifest it can't see. Both writes\n 353│        // are short (no spawn/IO under the guard).\n    │...\n 963│    /// state participant; a phantom status/pid would render it a cold instance to\n*964│    /// endpoint readers. It is a dedicated `psyche-custody.json` (`{\"session_id\":\"…\"}`),\n 965│    /// NOT an `info.json`, so the perch scans (which key off `info.json`) never see it.\n 966│    ///\n 967│    /// Reseed (FORK-3; W3 amendment): a turn that fails with the RESERVED EXIT CODE 95\n## livehost.rs\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     │...\n  977│// [impl->REQ-DAEMON-1]\n *978│pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n *979│    std::thread::spawn(move || {\n  980│        let set = Arc::new(LiveSet::new());\n  981│        {\n  982│            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n     │...\n 1481│            let b2 = Arc::clone(&broker);\n*1482│            std::thread::spawn(move || {\n 1483│                let _ = b2.serve();\n 1484│            });\n 1485│            let mut brain = {\n## msg.rs\n 357│    /// W2.5 controller/viewer intent (REQ-RCVIEW-1). `#[serde(default)]` =\n*358│    /// [`AttachIntent::Control`], so a local resume / spawn-reader / an N-1\n 359│    /// brain's `subscribe` (no field) re-takes the controller slot as before.\n 360│    #[serde(default)]\n 361│    pub intent: AttachIntent,\n    │...\n 363│    /// handshake-proven origin), `None` = local (the daemon brain's own\n*364│    /// spawn-reader / resume). The broker keys controller identity on this:\n 365│    /// a same-`by` re-subscribe silently re-takes the controller (no\n 366│    /// `Displaced`); a `None` (local) re-attach NEVER displaces a remote\n 367│    /// controller (it falls back to viewer) — the gate-#7 invariant.\n## nethost.rs\n  195│        let writer_poisoned = Arc::clone(&poisoned);\n *196│        std::thread::spawn(move || {\n  197│            let poison = |halt_reason: &str| {\n  198│                writer_poisoned.store(true, Ordering::Release);\n  199│                if let Some(l) = &lease {\n     │...\n 2236│    // the owner keeps writing must NOT lose bytes AND must NOT grow unbounded — the\n*2237│    // read pump lags the sender at the cap. After the reader catches up, every byte\n 2238│    // arrives byte-exact and in order. Proves \"lag, never loss\".\n 2239│    #[test]\n 2240│    fn loopback_tunnel_backpressures_without_loss() {\n     │...\n 2258│            let sent = Arc::clone(&sent);\n*2259│            std::thread::spawn(move || {\n 2260│                for f in &frames {\n 2261│                    host.send_stream(owner, f, false).expect(\"send\");\n 2262│                    sent.fetch_add(1, AtOrd::Relaxed);\n\n## bin/\n### xlate_choreo_fixture.rs\n 12│//! On an `event` we emit (here → spt-core, one JSON object per line on stdout,\n*13│//! flushing each so the broker's reader sees them promptly):\n 14│//!   `{\"key\":\"ctrl+s\"}` `{\"delay_ms\":50}` `{\"text\":\"XLATE_OK\"}` `{\"key\":\"enter\"}`\n 15│//!   `{\"delay_ms\":50}` `{\"key\":\"ctrl+s\"}` then `{\"commit\":true}`.\n 16│//!\n   │...\n 82│\n*83│        // Emit the choreography, flushing each line so the broker's line-reader\n 84│        // applies it promptly (the delays are part of the sequence the broker\n 85│        // honors, not a wall-clock the test asserts on).\n 86│        emit(&mut out, r#\"{\"key\":\"ctrl+s\"}\"#);"},"isError":false,"timestamp":1784271472668}}
{"type":"message","id":"5c8010a0","parentId":"3901026b","timestamp":"2026-07-17T06:58:00.384Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Locating exact spt-term crate**"},{"type":"toolCall","id":"call_x6jbmlgjy1x5Rwo1gSMGQl85|fc_0a061eb498f0e908016a59d2785298819684ea24829670ca67","name":"glob","arguments":{"i":"Mapping terminal crate","path":"crates/spt-term/**/*","hidden":true,"gitignore":true,"limit":300}},{"type":"toolCall","id":"call_K59wl6eXsPMEqRmH1aTOhZKl|fc_0a061eb498f0e908016a59d27852a881969e211fa532b37606","name":"read","arguments":{"i":"Reading broker sink definitions","path":"crates/spt-daemon/src/broker.rs","selector":"70-180,470-640,780-880,900-1170"}},{"type":"toolCall","id":"call_Yf2VizWqTI9dfs2r2unbIgDq|fc_0a061eb498f0e908016a59d27852b081969db378bae1979ef6","name":"read","arguments":{"i":"Reading broker writer loops","path":"crates/spt-daemon/src/broker.rs","selector":"1390-1625,1680-1865"}},{"type":"toolCall","id":"call_O5N8cexk9GX74aCSvwyGgBTo|fc_0a061eb498f0e908016a59d27852b48196bd93b66e0f473c01","name":"read","arguments":{"i":"Reading broker accept handling","path":"crates/spt-daemon/src/broker.rs","selector":"2540-2840,3000-3140"}},{"type":"toolCall","id":"call_De4PXtxz5a0qCVEsFNmqNeiv|fc_0a061eb498f0e908016a59d27852bc81968ae86aba32cbd531","name":"read","arguments":{"i":"Reading connection watchdog","path":"crates/spt-daemon/src/conn.rs","selector":"140-190,210-380,400-470,620-675"}},{"type":"toolCall","id":"call_U7ur19OzK4b90OelhqnvrRm2|fc_0a061eb498f0e908016a59d27852c081969bde39892fcc1e9c","name":"read","arguments":{"i":"Reading network writer tasks","path":"crates/spt-daemon/src/nethost.rs","selector":"130-280,900-1085,1180-1310,1460-1525,1810-1875"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":14995,"output":321,"cacheRead":38400,"cacheWrite":0,"totalTokens":53716,"reasoningTokens":23,"cost":{"input":0.074975,"output":0.00963,"cacheRead":0.0192,"cacheWrite":0,"total":0.103805}},"stopReason":"toolUse","timestamp":1784271472724,"responseId":"resp_0a061eb498f0e908016a59d270ee088196a1ef3c129696e2a6","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d27288c88196b82dfafe7612cfed","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdJ4_rKgm2sZNFwSkEPkTXl4Rv16p4crlKp0oxY-6Qjw5_Fe1oKJW-K6vl7mjgGoIlhkzLNNQr76cCJ_X8lhj07FpT97WvhJ_Lztjo1xynqGaNzdVudDSWOfXzPWuJgmDtYxhqhPdiBsts0vY_QnB47bL9ktMLUduDd6xG1SflLzpbSgl-cw6Fkb6gjMJvjZykr72YdOA7BAVwOhtTeEfuKSvoUJbIu-SkI9yLm5FQeycTSeKce6JRGtOjZJUf_QxRp8unZa4cq13R562xybuQsPQSwrrWaOJ1HTlkqJ9P78Rjp8kdo3GI6VpXtAAKGoCRSX9EcCAEx1VXZSm-DeGfcbudPbgqnctcHwYAlowpQRmdimLsDdmKxIfWX4LHCMT2TAhCkaeIaBcJXM9VF5DKESmcn8a8vA9MFUAqH2uxhmvFlGt1kW8fMjdh1JfEnijLodW6zIZL_ZrCxCIJpJ2fO895Gj6dOMrMPD92SWIOc7TYyxvx8VsOjjp9HIFfqfbiwTb4xEng-SsBRIelKig-F41iWVkGZXFeHYtLLK3L_7Q51O0_GAvcTeR5Ox91FDIie3L78P3T-DzsW3TNR_P-5y2RaRErWNCKYCwhEuzC1xkNRHmScHCGZfrYpu61LoggKpQVBpOSlL9BXSUq-pGO5B01EHE9dSUqQpTJDKL-XXgxAgMKLOiGWazxAVixL5pcgeGK0JSq3Iuq2bH7SJw_GUZLcvye92kr-S82UiNhc1BOQ6N-ZsgR8lkk6KX5Rpx9O38m68TJhhuHt4B6h8JmeMPJa5Pr6dvLN6oo07RpT5mtproqsTDpAiIOb0h6ZWsj1BsKuRV2BQraqDLxQjjxeTqA8WntP9VmcHJfxhE5guiXEUhS5mc5PWJFaWZ5P8LrY-xIq1C6Q97EH1eT7v3pvO-8Udcwxeu0_r_Z3oJJuWLHG7GnRi39A5qyv19U3b8ecpJdyuBYhN1fziFkAoGx9D_NbqTXp0UULLCwBQciHbtPNyDeldaZVFJu2imgiNgfT4HR4dgxhHh5V-iZlN8Vo4-Q==","summary":[{"type":"summary_text","text":"**Locating exact spt-term crate**"}]},{"id":"fc_0a061eb498f0e908016a59d2785298819684ea24829670ca67","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping terminal crate\",\"path\":\"crates/spt-term/**/*\",\"hidden\":true,\"gitignore\":true,\"limit\":300}","call_id":"call_x6jbmlgjy1x5Rwo1gSMGQl85","name":"glob"},{"id":"fc_0a061eb498f0e908016a59d27852a881969e211fa532b37606","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker sink definitions\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"70-180,470-640,780-880,900-1170\"}","call_id":"call_K59wl6eXsPMEqRmH1aTOhZKl","name":"read"},{"id":"fc_0a061eb498f0e908016a59d27852b081969db378bae1979ef6","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker writer loops\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1390-1625,1680-1865\"}","call_id":"call_Yf2VizWqTI9dfs2r2unbIgDq","name":"read"},{"id":"fc_0a061eb498f0e908016a59d27852b48196bd93b66e0f473c01","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker accept handling\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"2540-2840,3000-3140\"}","call_id":"call_O5N8cexk9GX74aCSvwyGgBTo","name":"read"},{"id":"fc_0a061eb498f0e908016a59d27852bc81968ae86aba32cbd531","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading connection watchdog\",\"path\":\"crates/spt-daemon/src/conn.rs\",\"selector\":\"140-190,210-380,400-470,620-675\"}","call_id":"call_De4PXtxz5a0qCVEsFNmqNeiv","name":"read"},{"id":"fc_0a061eb498f0e908016a59d27852c081969bde39892fcc1e9c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading network writer tasks\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"130-280,900-1085,1180-1310,1460-1525,1810-1875\"}","call_id":"call_U7ur19OzK4b90OelhqnvrRm2","name":"read"}]},"duration":7659.4741999953985,"ttft":1842.9761999994516,"contextSnapshot":{"promptTokens":53395,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_x6jbmlgjy1x5Rwo1gSMGQl85|fc_0a061eb498f0e908016a59d2785298819684ea24829670ca67","toolName":"glob","startedAt":"2026-07-17T06:58:00.384Z","args":{"path":"crates/spt-term/**/*"},"intent":"Mapping terminal crate"},"id":"e4f5d29d","parentId":"5c8010a0","timestamp":"2026-07-17T06:58:00.384Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_K59wl6eXsPMEqRmH1aTOhZKl|fc_0a061eb498f0e908016a59d27852a881969e211fa532b37606","toolName":"read","startedAt":"2026-07-17T06:58:00.384Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker sink definitions"},"id":"cc35bf18","parentId":"e4f5d29d","timestamp":"2026-07-17T06:58:00.384Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Yf2VizWqTI9dfs2r2unbIgDq|fc_0a061eb498f0e908016a59d27852b081969db378bae1979ef6","toolName":"read","startedAt":"2026-07-17T06:58:00.384Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker writer loops"},"id":"f9f38651","parentId":"cc35bf18","timestamp":"2026-07-17T06:58:00.384Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_O5N8cexk9GX74aCSvwyGgBTo|fc_0a061eb498f0e908016a59d27852b48196bd93b66e0f473c01","toolName":"read","startedAt":"2026-07-17T06:58:00.385Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker accept handling"},"id":"2f2d9551","parentId":"f9f38651","timestamp":"2026-07-17T06:58:00.385Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_De4PXtxz5a0qCVEsFNmqNeiv|fc_0a061eb498f0e908016a59d27852bc81968ae86aba32cbd531","toolName":"read","startedAt":"2026-07-17T06:58:00.385Z","args":{"path":"crates/spt-daemon/src/conn.rs"},"intent":"Reading connection watchdog"},"id":"02874cc3","parentId":"2f2d9551","timestamp":"2026-07-17T06:58:00.385Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_U7ur19OzK4b90OelhqnvrRm2|fc_0a061eb498f0e908016a59d27852c081969bde39892fcc1e9c","toolName":"read","startedAt":"2026-07-17T06:58:00.385Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading network writer tasks"},"id":"592949cb","parentId":"02874cc3","timestamp":"2026-07-17T06:58:00.385Z"}
{"type":"message","id":"33001697","parentId":"592949cb","timestamp":"2026-07-17T06:58:00.475Z","message":{"role":"toolResult","toolCallId":"call_Yf2VizWqTI9dfs2r2unbIgDq|fc_0a061eb498f0e908016a59d27852b081969db378bae1979ef6","toolName":"read","content":[{"type":"text","text":"impl OutputLog {\n…\n    fn stamp_reaped(&self) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_driven_by(&perch, None);\n        let _ = spt_store::info::set_controlled(&perch, false);\n        let _ = spt_store::info::set_viewer_count(&perch, 0);\n    }\n\n    /// Whether `sub` is the current controller (the resize-exclusivity check).\n    fn is_controller(&self, sub: &SharedSend) -> bool {\n        self.controller\n            .as_ref()\n            .is_some_and(|c| Arc::ptr_eq(&c.send, sub))\n    }\n\n    /// The next seq a re-attaching controller still needs (the persisted resume\n    /// cursor surfaced in `KIND_SESSIONS` → `resume_seq`). W1: read from the\n    /// atomic the controller writer thread advances.\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n    // isolation is preserved). REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT.\n    // [impl->REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT]\n    if evicted.load(Ordering::Acquire) {\n        let marker = evicted_envelope(session_id);\n        let _ = send.write(&marker);\n    }\n}\n\n/// Round-4 observability bridge: a controller writer whose bounded conn write\n/// was DEADLINE-retired (`TimedOut` — the conn watchdog aborted a wedged\n/// write, or a gate-wait behind one exhausted the bound) IS the\n/// brain-subscriber stall-evict fact the W2 tally counts. Pre-round-4 that\n/// wedge aged until a logical sampler (`stall_evict_controller`) observed it;\n/// the physical bound now fires FIRST, so the tally is recorded here — same\n/// event class, same `daemon status` surface. An ORGANIC write failure (peer\n/// death, any non-TimedOut error) stays uncounted, exactly as before.\n// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\nfn note_controller_write_retired(sid: u64, conn: u64, e: &io::Error) {\n    if e.kind() != io::ErrorKind::TimedOut {\n        return;\n    }\n    // conn id + stamps (F-039 leg b). [impl->REQ-CONN-POISON-ATTRIBUTION]\n    eprintln!(\n        \"BRAIN_SUBSCRIBER_STALL_EVICT:{sid} conn={conn} {} — controller conn write \\\n         exceeded its bound; physical conn poisoned + retired (writer released, EOF \\\n         cleanup follows) [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n        crate::conn::log_stamp()\n    );\n    record_stall_evict();\n}\n\n/// A message to the CONTROLLER writer thread (W1). `Output` carries a sequenced\n/// chunk and advances the authoritative `delivered_through` on a successful\n/// write; `Control` is an out-of-band notice (Displaced, …) that is written but\n/// does NOT move the resume cursor.\nenum CtrlMsg {\n    Output(u64, Envelope),\n    Control(Envelope),\n}\n\n/// Advance the shared `delivered_through` cursor to `seq + 1`, monotonically\n/// (D4-1, via [`advanced_cursor`]) and CAS-safe against a brief two-writer\n/// overlap during a controller displace.\nfn advance_delivered(dt: &AtomicU64, seq: u64) {\n    let mut cur = dt.load(Ordering::Acquire);\n    loop {\n        let next = advanced_cursor(cur, seq, true);\n        if next == cur {\n            return;\n        }\n        match dt.compare_exchange_weak(cur, next, Ordering::AcqRel, Ordering::Acquire) {\n            Ok(_) => return,\n            Err(actual) => cur = actual,\n        }\n    }\n}\n\n/// Advance the controller resume cursor CONTIGUOUSLY (b4 / the (a) B2-gate): move to\n/// `seq + 1` ONLY when the cursor is EXACTLY `seq` (the next expected seq). A gap\n/// (`seq > cursor` — a frame the drain dropped while the controller channel was Full,\n/// the b4 backpressure) FREEZES the cursor at last-contiguous, so a re-attaching\n/// brain's `resume_seq` never skips a dropped chunk (a high-watermark jump PAST the\n/// gap would be a not-exactly-once / non-gapless resume = a B2 violation). An\n/// already-delivered `seq` (`seq < cursor`, a rewind re-send) is a no-op. A single CAS,\n/// no loop: it advances by exactly one, or not at all. In the NO-DROP path (every\n/// live frame is contiguous) this is identical to [`advance_delivered`].\n// [impl->REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE]\nfn contiguous_advance(dt: &AtomicU64, seq: u64) {\n    let _ = dt.compare_exchange(seq, seq + 1, Ordering::AcqRel, Ordering::Acquire);\n}\n\n/// The interactive CONTROLLER's dedicated writer thread (W1 /\n/// REQ-HAZARD-INJECT-CONTROL-COEXIST) — the authoritative analog of\n/// [`viewer_writer`]. Write the `initial` ring-replay batch (advancing the resume\n/// cursor on each success), then drain live [`CtrlMsg`]s with a BLOCKING socket\n/// write each — so a backed-up controller blocks ONLY this thread, never the\n/// session drain (which used to write the controller inline under the log lock).\n/// A failed write (dead operator) ends the thread; the drain's next bounded\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        advance_delivered(&delivered_through, *seq);\n    }\n    while let Ok(msg) = rx.recv() {\n        let (frame, seq) = match &msg {\n            CtrlMsg::Output(seq, frame) => (frame, Some(*seq)),\n            CtrlMsg::Control(frame) => (frame, None),\n        };\n        // NO epoch gate on the live path (P1c): new output only ever flows to the\n        // CURRENT controller's channel (the drain clones `self.controller.tx`), so\n        // a superseded writer's channel holds only its pre-supersede output\n        // backlog (seq the consumer dedups via snap-above) plus its own TERMINAL\n…\n    }\n…\n}\n…\nstruct Translation {\n…\n    event_tx: Sender<String>,\n    /// The live child — shared so `dispatch_input` fires content-free pings while\n    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n    child: Arc<TranslationChild>,\n    /// Raised by the worker on FAULT (commit-deadline miss / binary death): the\n    /// session's idle inbound then SPOOLS (never raw-injected) and `dispatch_input`\n    /// stops pinging.\n    faulted: Arc<AtomicBool>,\n}\n\n/// A child the broker hosts under a PTY — the §B-owned resources for one\n/// session, plus its gapless-resume output log.\nstruct HostedSession {\n    /// The PTY + child (PTY master/writer + spawned child process).\n    session: Arc<PtySession>,\n    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n    /// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): the SOLE caller of the blocking\n    /// `write_input`. Every dispatch-side write ENQUEUES here and returns at once,\n    /// so a paste burst that fills the harness's input buffer parks only the\n    /// writer thread, never the broker dispatch thread.\n    input: Arc<InputWriter>,\n    /// The output drain pump (kept so teardown can stop it).\n    #[allow(dead_code)] // held for ownership/teardown; not read directly\n    drain: Drain,\n    /// The sequenced, buffered output + current subscriber.\n    log: Arc<Mutex<OutputLog>>,\n    /// The owning endpoint (the spawn's label; empty = unlabeled). The\n    /// inbound dispatcher's gate subject for remote-drive (D9-1).\n    endpoint: String,\n    /// The translation-binary attachment (Layer C), or `None` for a session with\n    /// no `[message-idle-translation-binary]` — then idle inbound delivery SPOOLS\n    /// (no raw PTY inject; ADR-0022 amendment).\n    translation: Option<Arc<Translation>>,\n    /// The resolved translation argv this session was spawned with (F029 C-1) —\n    /// held so a bounded eager respawn after a REAL fault can rebuild the binary\n    /// from the exact same command (`build_translation`) without re-reading the\n    /// manifest (works for a test session with a direct argv AND a production\n    /// session). `None` for a no-translation session. Updated on an adapter-apply\n    /// restart to the swapped-in argv.\n    translation_argv: Option<Vec<String>>,\n    /// The bounded-respawn give-up counter shared with the inject worker (F029 C-1,\n    /// REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH): the dispatch respawn path\n    /// increments it per rebuild, the worker RESETS it to 0 on a healthy `{commit}`\n    /// (so a recovered binary refreshes the whole budget). At `translate_respawn_\n    /// budget()` the daemon gives up (loud) and leaves the binary dead → spool.\n    translation_respawns: Arc<AtomicU32>,\n    /// The adapter name owning this session (W3a, ADR-0025) — empty for a\n    /// legacy/test/shell spawn. A live adapter update finds every live session\n    /// whose `adapter` matches to cycle its resident children.\n    adapter: String,\n    /// The adapter's install dir for this session (W3a) — `None` if unknown. The\n    /// apply target for a live update's CRC swap.\n    install_dir: Option<std::path::PathBuf>,\n}\n\n/// One record queued to a session's dedicated PTY input-writer thread — the raw\n/// bytes to write (v0.13.0 P0, REQ-HAZARD-PTY-INPUT-WRITER-WEDGE).\ntype InputRecord = Vec<u8>;\n\n/// The per-session PTY input FIFO depth (records). Sized for a generous paste —\n/// a wedged harness fills this and then DROPS, never blocking the dispatch\n/// thread. The int gate shrinks it via `SPT_INPUT_QUEUE_DEPTH` so the\n/// DROP+`INPUT_BACKPRESSURE` leg is forced in a handful of records rather than a\n/// few hundred KB of real paste.\nconst INPUT_QUEUE_DEPTH: usize = 4096;\n\n/// The effective input FIFO depth: production is [`INPUT_QUEUE_DEPTH`]; the int\n/// gate overrides it (`SPT_INPUT_QUEUE_DEPTH`) to a tiny value to force a\n/// deterministic queue saturation — the depth's PRESENCE (bounded, drop-on-full)\n/// is the invariant, not its exact value.\nfn input_queue_depth() -> usize {\n    match std::env::var(\"SPT_INPUT_QUEUE_DEPTH\") {\n        Ok(n) => n\n            .parse::<usize>()\n            .ok()\n            .filter(|d| *d > 0)\n            .unwrap_or(INPUT_QUEUE_DEPTH),\n        Err(_) => INPUT_QUEUE_DEPTH,\n    }\n}\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n                true\n            }\n            Err(TrySendError::Full(_)) => {\n                // DROP + surface, but stamp only on the rising edge.\n                if !self.backpressure.swap(true, Ordering::AcqRel) {\n                    self.stamp_backpressure(true);\n                }\n                false\n            }\n            // The writer thread is gone (session teardown) — nothing to do.\n            Err(TrySendError::Disconnected(_)) => false,\n        }\n    }\n\n    /// Mirror the input-backpressure signal to the perch's `info.json` (the\n    /// broker is the single writer). Best-effort: a session served without a\n    /// perch (raw broker tests) has nowhere to record.\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}\n\n/// A session's input-writer thread (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): drain\n/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /"}],"details":{"displayContent":{"text":"impl OutputLog {\n…\n    fn stamp_reaped(&self) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_driven_by(&perch, None);\n        let _ = spt_store::info::set_controlled(&perch, false);\n        let _ = spt_store::info::set_viewer_count(&perch, 0);\n    }\n\n    /// Whether `sub` is the current controller (the resize-exclusivity check).\n    fn is_controller(&self, sub: &SharedSend) -> bool {\n        self.controller\n            .as_ref()\n            .is_some_and(|c| Arc::ptr_eq(&c.send, sub))\n    }\n\n    /// The next seq a re-attaching controller still needs (the persisted resume\n    /// cursor surfaced in `KIND_SESSIONS` → `resume_seq`). W1: read from the\n    /// atomic the controller writer thread advances.\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n    // isolation is preserved). REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT.\n    // [impl->REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT]\n    if evicted.load(Ordering::Acquire) {\n        let marker = evicted_envelope(session_id);\n        let _ = send.write(&marker);\n    }\n}\n\n/// Round-4 observability bridge: a controller writer whose bounded conn write\n/// was DEADLINE-retired (`TimedOut` — the conn watchdog aborted a wedged\n/// write, or a gate-wait behind one exhausted the bound) IS the\n/// brain-subscriber stall-evict fact the W2 tally counts. Pre-round-4 that\n/// wedge aged until a logical sampler (`stall_evict_controller`) observed it;\n/// the physical bound now fires FIRST, so the tally is recorded here — same\n/// event class, same `daemon status` surface. An ORGANIC write failure (peer\n/// death, any non-TimedOut error) stays uncounted, exactly as before.\n// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\nfn note_controller_write_retired(sid: u64, conn: u64, e: &io::Error) {\n    if e.kind() != io::ErrorKind::TimedOut {\n        return;\n    }\n    // conn id + stamps (F-039 leg b). [impl->REQ-CONN-POISON-ATTRIBUTION]\n    eprintln!(\n        \"BRAIN_SUBSCRIBER_STALL_EVICT:{sid} conn={conn} {} — controller conn write \\\n         exceeded its bound; physical conn poisoned + retired (writer released, EOF \\\n         cleanup follows) [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n        crate::conn::log_stamp()\n    );\n    record_stall_evict();\n}\n\n/// A message to the CONTROLLER writer thread (W1). `Output` carries a sequenced\n/// chunk and advances the authoritative `delivered_through` on a successful\n/// write; `Control` is an out-of-band notice (Displaced, …) that is written but\n/// does NOT move the resume cursor.\nenum CtrlMsg {\n    Output(u64, Envelope),\n    Control(Envelope),\n}\n\n/// Advance the shared `delivered_through` cursor to `seq + 1`, monotonically\n/// (D4-1, via [`advanced_cursor`]) and CAS-safe against a brief two-writer\n/// overlap during a controller displace.\nfn advance_delivered(dt: &AtomicU64, seq: u64) {\n    let mut cur = dt.load(Ordering::Acquire);\n    loop {\n        let next = advanced_cursor(cur, seq, true);\n        if next == cur {\n            return;\n        }\n        match dt.compare_exchange_weak(cur, next, Ordering::AcqRel, Ordering::Acquire) {\n            Ok(_) => return,\n            Err(actual) => cur = actual,\n        }\n    }\n}\n\n/// Advance the controller resume cursor CONTIGUOUSLY (b4 / the (a) B2-gate): move to\n/// `seq + 1` ONLY when the cursor is EXACTLY `seq` (the next expected seq). A gap\n/// (`seq > cursor` — a frame the drain dropped while the controller channel was Full,\n/// the b4 backpressure) FREEZES the cursor at last-contiguous, so a re-attaching\n/// brain's `resume_seq` never skips a dropped chunk (a high-watermark jump PAST the\n/// gap would be a not-exactly-once / non-gapless resume = a B2 violation). An\n/// already-delivered `seq` (`seq < cursor`, a rewind re-send) is a no-op. A single CAS,\n/// no loop: it advances by exactly one, or not at all. In the NO-DROP path (every\n/// live frame is contiguous) this is identical to [`advance_delivered`].\n// [impl->REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE]\nfn contiguous_advance(dt: &AtomicU64, seq: u64) {\n    let _ = dt.compare_exchange(seq, seq + 1, Ordering::AcqRel, Ordering::Acquire);\n}\n\n/// The interactive CONTROLLER's dedicated writer thread (W1 /\n/// REQ-HAZARD-INJECT-CONTROL-COEXIST) — the authoritative analog of\n/// [`viewer_writer`]. Write the `initial` ring-replay batch (advancing the resume\n/// cursor on each success), then drain live [`CtrlMsg`]s with a BLOCKING socket\n/// write each — so a backed-up controller blocks ONLY this thread, never the\n/// session drain (which used to write the controller inline under the log lock).\n/// A failed write (dead operator) ends the thread; the drain's next bounded\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        advance_delivered(&delivered_through, *seq);\n    }\n    while let Ok(msg) = rx.recv() {\n        let (frame, seq) = match &msg {\n            CtrlMsg::Output(seq, frame) => (frame, Some(*seq)),\n            CtrlMsg::Control(frame) => (frame, None),\n        };\n        // NO epoch gate on the live path (P1c): new output only ever flows to the\n        // CURRENT controller's channel (the drain clones `self.controller.tx`), so\n        // a superseded writer's channel holds only its pre-supersede output\n        // backlog (seq the consumer dedups via snap-above) plus its own TERMINAL\n…\n    }\n…\n}\n…\nstruct Translation {\n…\n    event_tx: Sender<String>,\n    /// The live child — shared so `dispatch_input` fires content-free pings while\n    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n    child: Arc<TranslationChild>,\n    /// Raised by the worker on FAULT (commit-deadline miss / binary death): the\n    /// session's idle inbound then SPOOLS (never raw-injected) and `dispatch_input`\n    /// stops pinging.\n    faulted: Arc<AtomicBool>,\n}\n\n/// A child the broker hosts under a PTY — the §B-owned resources for one\n/// session, plus its gapless-resume output log.\nstruct HostedSession {\n    /// The PTY + child (PTY master/writer + spawned child process).\n    session: Arc<PtySession>,\n    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n    /// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): the SOLE caller of the blocking\n    /// `write_input`. Every dispatch-side write ENQUEUES here and returns at once,\n    /// so a paste burst that fills the harness's input buffer parks only the\n    /// writer thread, never the broker dispatch thread.\n    input: Arc<InputWriter>,\n    /// The output drain pump (kept so teardown can stop it).\n    #[allow(dead_code)] // held for ownership/teardown; not read directly\n    drain: Drain,\n    /// The sequenced, buffered output + current subscriber.\n    log: Arc<Mutex<OutputLog>>,\n    /// The owning endpoint (the spawn's label; empty = unlabeled). The\n    /// inbound dispatcher's gate subject for remote-drive (D9-1).\n    endpoint: String,\n    /// The translation-binary attachment (Layer C), or `None` for a session with\n    /// no `[message-idle-translation-binary]` — then idle inbound delivery SPOOLS\n    /// (no raw PTY inject; ADR-0022 amendment).\n    translation: Option<Arc<Translation>>,\n    /// The resolved translation argv this session was spawned with (F029 C-1) —\n    /// held so a bounded eager respawn after a REAL fault can rebuild the binary\n    /// from the exact same command (`build_translation`) without re-reading the\n    /// manifest (works for a test session with a direct argv AND a production\n    /// session). `None` for a no-translation session. Updated on an adapter-apply\n    /// restart to the swapped-in argv.\n    translation_argv: Option<Vec<String>>,\n    /// The bounded-respawn give-up counter shared with the inject worker (F029 C-1,\n    /// REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH): the dispatch respawn path\n    /// increments it per rebuild, the worker RESETS it to 0 on a healthy `{commit}`\n    /// (so a recovered binary refreshes the whole budget). At `translate_respawn_\n    /// budget()` the daemon gives up (loud) and leaves the binary dead → spool.\n    translation_respawns: Arc<AtomicU32>,\n    /// The adapter name owning this session (W3a, ADR-0025) — empty for a\n    /// legacy/test/shell spawn. A live adapter update finds every live session\n    /// whose `adapter` matches to cycle its resident children.\n    adapter: String,\n    /// The adapter's install dir for this session (W3a) — `None` if unknown. The\n    /// apply target for a live update's CRC swap.\n    install_dir: Option<std::path::PathBuf>,\n}\n\n/// One record queued to a session's dedicated PTY input-writer thread — the raw\n/// bytes to write (v0.13.0 P0, REQ-HAZARD-PTY-INPUT-WRITER-WEDGE).\ntype InputRecord = Vec<u8>;\n\n/// The per-session PTY input FIFO depth (records). Sized for a generous paste —\n/// a wedged harness fills this and then DROPS, never blocking the dispatch\n/// thread. The int gate shrinks it via `SPT_INPUT_QUEUE_DEPTH` so the\n/// DROP+`INPUT_BACKPRESSURE` leg is forced in a handful of records rather than a\n/// few hundred KB of real paste.\nconst INPUT_QUEUE_DEPTH: usize = 4096;\n\n/// The effective input FIFO depth: production is [`INPUT_QUEUE_DEPTH`]; the int\n/// gate overrides it (`SPT_INPUT_QUEUE_DEPTH`) to a tiny value to force a\n/// deterministic queue saturation — the depth's PRESENCE (bounded, drop-on-full)\n/// is the invariant, not its exact value.\nfn input_queue_depth() -> usize {\n    match std::env::var(\"SPT_INPUT_QUEUE_DEPTH\") {\n        Ok(n) => n\n            .parse::<usize>()\n            .ok()\n            .filter(|d| *d > 0)\n            .unwrap_or(INPUT_QUEUE_DEPTH),\n        Err(_) => INPUT_QUEUE_DEPTH,\n    }\n}\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n                true\n            }\n            Err(TrySendError::Full(_)) => {\n                // DROP + surface, but stamp only on the rising edge.\n                if !self.backpressure.swap(true, Ordering::AcqRel) {\n                    self.stamp_backpressure(true);\n                }\n                false\n            }\n            // The writer thread is gone (session teardown) — nothing to do.\n            Err(TrySendError::Disconnected(_)) => false,\n        }\n    }\n\n    /// Mirror the input-backpressure signal to the perch's `info.json` (the\n    /// broker is the single writer). Best-effort: a session served without a\n    /// perch (raw broker tests) has nowhere to record.\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}\n\n/// A session's input-writer thread (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): drain\n/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /","startLine":684,"lineNumbers":[684,null,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,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,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,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,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,null,1654,null,1661,null,1675,null,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271480474}}
{"type":"message","id":"dc9020db","parentId":"33001697","timestamp":"2026-07-17T06:58:00.475Z","message":{"role":"toolResult","toolCallId":"call_K59wl6eXsPMEqRmH1aTOhZKl|fc_0a061eb498f0e908016a59d27852a881969e211fa532b37606","toolName":"read","content":[{"type":"text","text":"use crate::msg::{\n…\n};\nuse crate::nethost::{NetHost, NET_EFFECT_SESSION};\nuse crate::translation::{key_to_bytes, InjectFloor, KeyCmd, ToBinary, TranslationChild};\nuse crate::transport::{recv_hello, DaemonTransport, LocalSocketTransport};\n\n/// The shared, serialized send side of one brain connection. Output frames,\n/// replay frames, command acks, and exit/error events all write through this.\n/// `pub(crate)`: the net host's stream logs (D4b) live-send through the same\n/// handle under the same gate discipline. Round-4\n/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw\n/// `Arc<Mutex<SendHalf>>` — [`BrokerConn`] owns the half and every write is\n/// bounded + cancelable + poison-on-failure (see [`crate::conn`]). Identity\n/// matching stays `Arc::ptr_eq`.\npub(crate) type SharedSend = Arc<BrokerConn>;\n\n/// Default bounded output-log depth (chunks). Large enough that a brain restart\n/// window never evicts unreplayed output in practice; the bound is what keeps a\n/// disconnected session from buffering without limit.\nconst DEFAULT_LOG_CHUNKS: usize = 4096;\n\n/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it\n/// OVERFLOWS the viewer is evicted — the drain `try_send`s and never blocks\n/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n/// owns the replay batch), so a viewer attaching to a busy session is not\n/// spuriously evicted.\nconst VIEWER_CHANNEL_DEPTH: usize = 256;\n\n/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\nconst MAX_VIEWERS: usize = 32;\n\n/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n/// the live stream) or a `Disconnected` one (its writer thread ended after a\n/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n/// is the pure decision the fan-out applies under the log lock.\n// [impl->REQ-HAZARD-VIEWER-ISOLATION]\nfn viewer_send_evicts<T>(r: &Result<(), TrySendError<T>>) -> bool {\n    r.is_err()\n}\n\n/// One read-only viewer's isolated sink (REQ-HAZARD-VIEWER-ISOLATION). The drain\n/// thread `try_send`s output frames into `tx` (a bounded queue); a dedicated\n/// `writer` thread does the BLOCKING socket write, so a wedged viewer backs up\n/// only its own queue — never the drain. When the queue overflows the sink is\n/// dropped (the `tx` closes → the writer ends) and removed from the map.\nstruct ViewerSink {\n    /// The bounded live-frame queue to this viewer's writer thread.\n    tx: SyncSender<Envelope>,\n    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n    /// (a dropped brain connection removes its viewer rows); never written here.\n    send: SharedSend,\n    /// Set TRUE when this viewer is EVICTED for overflow (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT),\n    /// distinguishing an eviction from a normal teardown (session end / conn drop).\n    /// `append` stores `true` BEFORE dropping the sink (and thus `tx`); the writer,\n    /// on its `rx.recv()` Err, reads this and — when true — emits a\n    /// [`KIND_VIEWER_EVICTED`] marker (in the writer thread, OFF the log lock) so\n    /// the serving brain skips to live instead of tearing the attach down.\n    evicted: Arc<AtomicBool>,\n    /// The writer thread handle (held for ownership; it exits when `tx` drops or\n    /// a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// The controller live-frame channel depth (frames). Deeper than a viewer's\n/// queue because the controller is the AUTHORITATIVE view — unlike a viewer it is\n/// NOT evicted on a SINGLE full `try_send` (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// b4: the drain does ONE non-blocking `try_send` per chunk and NEVER blocks; a\n/// merely-slow controller DROPS chunks + falls behind the ring, and only a channel\n/// that stays full for [`CONTROLLER_WRITE_DEADLINE`] (tracked via\n/// [`ControllerSink::last_ok`]) is detached. Generous so a momentary slow consumer\n/// never trips the deadline.\nconst CONTROLLER_CHANNEL_DEPTH: usize = 4096;\n\n/// How long a CONTROLLER's channel may stay FULL (no successful handoff since\n/// [`ControllerSink::last_ok`]) before the drain declares it stalled and detaches it\n/// (W1, refined by b4 / REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE). This\n/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n/// untouched.\nconst CONTROLLER_WRITE_DEADLINE: Duration = Duration::from_secs(5);\n\n/// How long a controller's writer thread may sit BLOCKED inside a single socket\n/// write — the brain subscriber suspended / black-holed — before a take/reattach\n/// or the `KIND_SESSIONS` reap stall-evicts it (LIFECYCLE-TRUTH W2,\n/// REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE). Distinct from and 3× longer than\n/// [`CONTROLLER_WRITE_DEADLINE`] on PURPOSE (doyle ruling Q1): that 5 s bound\n/// protects the fan-out against ONE per-client conn falling behind and is\n/// output-driven (the drain observes a Full channel); THIS bound is measured\n/// full-with-**zero writer progress** and covers the case the output-driven path\n/// can't — an IDLE session whose brain-subscriber conn is suspended produces no\n/// output, so `append`/`mark_controller_gone` never runs, and the stalled\n/// controller would otherwise latch `driven_by` forever (reattach refused, `--take`\n/// blocked). The brain aggregates every session + psyche + WAN feed, so its drain\n/// is bursty; 15 s tolerates a normal burst-stall while still bounding the wedge.\n/// A slow-but-DRAINING brain never trips it — the clock only advances while a write\n/// is genuinely in flight past the deadline (see [`ControllerSink::write_blocked_since`]).\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\nconst BRAIN_WRITE_DEADLINE: Duration = Duration::from_secs(15);\n\n/// The EFFECTIVE brain-write deadline. Production is [`BRAIN_WRITE_DEADLINE`]; the\n/// suspend-brain int rig shrinks it via `SPT_BRAIN_WRITE_DEADLINE_MS` so the\n/// structural outcome (a wedged controller is stall-evicted → take/reattach frees\n/// the slot) is provable in ~1 s instead of 15 (mirrors the\n/// `SPT_INJECT_COMMIT_DEADLINE_MS` env-knob precedent). Grants test wall-clock\n/// ONLY — never relaxes an assertion.\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n…\n\nfn note_miss_respool(respooled_once: &mut HashSet<String>, envelope: &str) -> MissRespool {\n    if respooled_once.contains(envelope) {\n        MissRespool::DeadLetter\n    } else {\n        respooled_once.insert(envelope.to_string());\n        MissRespool::Respool\n    }\n}\n\n/// Pure strike-budget verdict: a MISS becomes a REAL fault once `strikes` reaches\n/// the `budget` (F029 C-1, REQ-TRANSLATE-COMMIT-MISS-TOLERANCE). Below the budget\n/// the miss is tolerated (binary preserved, worker continues).\nfn miss_strikes_exhausted(strikes: u32, budget: u32) -> bool {\n    strikes >= budget\n}\n\n/// The interactive CONTROLLER's isolated sink (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// Symmetric with [`ViewerSink`] — a dedicated writer thread does the BLOCKING\n/// socket write so a backed-up controller can never stall the session drain\n/// thread (the v0.12.x wedge: the controller write was inline on the drain,\n/// holding `Mutex<OutputLog>`). Unlike a viewer it is AUTHORITATIVE: its writer\n/// advances `delivered_through` on each successful write, and it is never evicted\n/// on a single full `try_send` — only after [`CONTROLLER_WRITE_DEADLINE`].\nstruct ControllerSink {\n    /// The bounded live-frame queue to the controller's writer thread.\n    tx: SyncSender<CtrlMsg>,\n    /// The controller's IPC send half — kept for identity matching on detach and\n    /// for the `exit`-frame fan-out ([`OutputLog::all_sinks`]).\n    send: SharedSend,\n    /// The controller's ATTACH GENERATION (ADR-0038 Amendment fix 6,\n    /// REQ-SERVE-OWNERSHIP-GENERATION): operator-minted wall-ms from the wire\n    /// Request (`0` = local / N-1). A same-identity re-take with an OLDER\n    /// generation is a replayed stale Request — refused; a stale worker's\n    /// late detach (older generation) never clears a newer controller.\n    attach_gen: u64,\n    /// The controller's identity: `Some(node)` = a remote operator, `None` =\n    /// local (the brain's spawn-reader / resume). Ownership keys on this.\n    by: Option<String>,\n    /// Time of the last SUCCESSFUL handoff (`try_send` Ok) to this controller's\n    /// writer channel (b4, REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE).\n    /// The drain does a SINGLE non-blocking `try_send` per chunk and NEVER sleeps;\n    /// a channel that stays Full for [`CONTROLLER_WRITE_DEADLINE`] PAST this stamp\n    /// evicts the stalled controller (bounded wedge preserved), while a slow-but-\n    /// alive controller just drops the chunk + falls behind the ring (resume-from-\n    /// floor). Seeded `now` at [`OutputLog::become_controller`].\n    last_ok: Instant,\n    /// The writer's IN-FLIGHT socket-write marker (LIFECYCLE-TRUTH W2,\n    /// REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): the `controller_writer` sets it to\n    /// `Some(Instant::now())` immediately BEFORE it enters a blocking `write_frame`\n    /// and back to `None` the instant the write returns. A reader\n    /// ([`OutputLog::controller_stalled`]) sees a `Some` older than\n    /// [`BRAIN_WRITE_DEADLINE`] as a writer WEDGED on a suspended/black-holed brain\n    /// conn and stall-evicts it — the signal `last_ok` (channel-handoff time) cannot\n    /// give: an IDLE controller (writer parked on `rx.recv()`, `None` here) and a\n    /// BLOCKED one (writer stuck in the socket write, `Some` here) both leave\n    /// `last_ok` stale. `Arc<Mutex<…>>` so the reader observes the writer's live\n    /// state; the mutex is taken only around the brief set/clear and the read, never\n    /// held across the socket write itself.\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n    /// The writer thread handle (held for ownership; exits when `tx` drops — the\n    /// drain's bounded `send_timeout` then sees `Disconnected` and detaches — or\n    /// when a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// A bounded, sequenced output log for one session — the gapless-resume buffer\n/// AND the W2.5 controller/viewer fan-out hub (REQ-RCVIEW-1).\n///\n/// The session's single drain thread is the only producer ([`OutputLog::append`]).\n/// Output fans out to ONE interactive `controller` (the authoritative,\n/// cursor-advancing, blocking path) plus ANY NUMBER of read-only `viewers` (each\n/// an isolated bounded queue + writer thread, evicted on overflow). Every\n/// controller send and viewer `try_send` happens while the enclosing\n/// `Mutex<OutputLog>` is held, so frames reach each sink in strict `seq` order.\nstruct OutputLog {\n    session_id: u64,\n    next_seq: u64,\n    ring: VecDeque<(u64, Vec<u8>)>,\n    cap_chunks: usize,\n    /// The single interactive controller's isolated sink (W1: a dedicated writer\n    /// thread + bounded channel + authoritative cursor). `None` ⇒ undriven. The\n    /// controller's identity (`Some(node)` remote / `None` local) lives in\n    /// [`ControllerSink::by`] and keys ownership — a same-`by` re-subscribe\n    /// silently re-takes (no `Displaced`, the gate-#7 self-kick guard); only a\n    /// DIFFERENT remote's `Take` displaces.\n    controller: Option<ControllerSink>,\n    /// Monotonic controller generation, shared with the live `controller_writer`\n    /// thread (`Arc<AtomicU64>`). Bumped on every [`become_controller`]; the\n    /// drain's deadline-evict ([`mark_controller_gone`]) carries the epoch it\n    /// observed and only detaches if it still matches — so a slow-controller\n    /// timeout can never unseat a NEWER controller that attached meanwhile. The\n    /// writer snapshots its own epoch and returns the moment this value moves past\n    /// it, so a SUPERSEDED writer flushes no further frames (P1c, single live\n    /// writer per connection, [`REQ-HAZARD-CONTROLLER-WRITER-REORDER`]).\n    controller_epoch: Arc<AtomicU64>,\n    /// The read-only viewers, keyed by a broker-minted viewer id.\n    viewers: HashMap<u64, ViewerSink>,\n    /// Monotonic viewer-id source.\n    next_viewer_id: u64,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test).\n    /// The broker is the SINGLE writer of `driven_by` + `viewer_count` on this\n    /// perch (REQ-RCVIEW-1, resolves the clear-race); empty ⇒ nowhere to stamp.\n    endpoint: String,\n    /// Last-known PTY size — seeded at spawn, updated on a controller resize.\n    /// Pushed to a viewer on attach + to all viewers on resize (the letterbox\n    /// feed); the broker holds it since the PTY exposes no size getter.\n    size: (u16, u16),\n    /// Cursor-of-record (restoration D4-1, ADR-0018 Q6): the next seq a\n    /// re-attaching CONTROLLER still needs (= highest seq **successfully written**\n    /// to the controller, +1). It is **log** state, not subscriber state, so it\n    /// **survives `detach_if`** — a dead brain leaves its resume point behind, and\n    /// a cold-starting brain reads it (via `KIND_SESSIONS` → `resume_seq`) instead\n    /// of replaying the whole ring from 0. **Viewer writes NEVER move it**\n    /// (REQ-RCVIEW-1: the brain-resume cursor tracks the controller only).\n    ///\n    /// **Advanced only on a successful socket write** (`Ok`), and **monotonic**\n    /// (never decreases) — see [`advanced_cursor`]. Both invariants are\n    /// load-bearing for at-least-once output: advancing past a *failed* write to a\n    /// dying-but-not-yet-detached controller would make resume skip that chunk\n    /// forever (at-least-once → at-most-once); decreasing on a deliberate\n    /// `attach(sub, 0)` rewind-replay would reset the resume point under a live\n    /// reader.\n    ///\n    /// W1: now an `Arc<AtomicU64>` shared with the controller's writer thread,\n    /// which advances it (via [`advanced_cursor`], CAS-monotonic) as it writes —\n    /// the cursor moved off the drain thread with the controller delivery itself.\n    delivered_through: Arc<AtomicU64>,\n    /// The server-side **render grid** (#6 / REQ-BROKER-SCREEN-GRID, ADR-0031):\n    /// the authoritative CURRENT SCREEN, interpreted from the same byte stream the\n    /// ring records. Fed on the drain path in [`append`], AFTER the fan-out (so it\n    /// never adds latency to controller/viewer delivery — hazard 7.12). A cold\n    /// attach's initial batch is a single synthesized [`ScreenGrid::render_repaint`]\n    /// instead of the raw ring, so replaying an alt-screen TUI into a fresh terminal\n    /// no longer corrupts scrollback. Single-writer (the one drain thread), mirroring\n    /// the ring's single producer.\n    grid: ScreenGrid,\n}\n\n/// The post-write resume cursor (pure — the D4-1 unit kernel, mirroring\n/// `brainproc::consumer_gate`/`next_backoff`): advance to `seq + 1` **only** on a\n/// successful write, and **monotonically** (never below `current`). A failed\n/// write (`write_ok == false`) leaves the cursor untouched, and a re-send of an\n/// already-delivered `seq` (an `attach(sub, 0)` rewind, `seq + 1 <= current`)\n/// cannot lower it. This is the exact decision the `let _ = write_frame(...)`\n/// swallow used to drop (doyle D4-1 amendments 1–3).\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\nfn advanced_cursor(current: u64, seq: u64, write_ok: bool) -> u64 {\n    if write_ok {\n        current.max(seq + 1)\n    } else {\n        current\n    }\n}\n\n/// Pure divergence decision for the control/viewer stamp convergence\n/// (REQ-HAZARD-CONTROL-STAMP-CONVERGENCE): does the perch's RECORDED\n/// (`driven_by`, `controlled`, `viewer_count`) differ from the live session TRUTH?\n/// Returns `(control_write_needed, viewer_write_needed)` — the divergence gate that\n/// keeps the per-poll re-assert from writing (fsync) when nothing changed.\n// [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\nfn stamp_divergence(\n    rec_driven_by: Option<&str>,\n    rec_controlled: bool,\n    rec_viewers: u32,\n    want_driven_by: Option<&str>,\n    want_controlled: bool,\n    want_viewers: u32,\n) -> (bool, bool) {\n    let control = rec_driven_by != want_driven_by || rec_controlled != want_controlled;\n    let viewer = rec_viewers != want_viewers;\n…\n}\n…\n    /// point for the inject leg's settle-gate + echo-verify (REQ-INJECT-MULTILINE-\n    /// INTEGRITY). A rising high-water since a baseline == the PTY produced output.\n    fn high_water(&self) -> u64 {\n        self.next_seq\n    }\n\n    /// Concatenate ring bytes at or after `from_seq` — the output PRODUCED since a\n    /// snapshot, used to confirm a settle probe echoed (readiness, Layer 1) and that\n    /// a typed payload's head echoed back (integrity, Layer 2). Best-effort: bytes\n    /// pruned out of the bounded ring are simply absent (the echo we look for is\n    /// recent, well within cap).\n    fn bytes_since(&self, from_seq: u64) -> Vec<u8> {\n        let mut out = Vec::new();\n        for (seq, chunk) in self.ring.iter() {\n            if *seq >= from_seq {\n                out.extend_from_slice(chunk);\n            }\n        }\n        out\n    }\n\n    fn append(&mut self, bytes: &[u8]) -> Option<u64> {\n        let seq = self.next_seq;\n        self.next_seq += 1;\n        self.ring.push_back((seq, bytes.to_vec()));\n        while self.ring.len() > self.cap_chunks {\n            self.ring.pop_front();\n        }\n        let frame = output_envelope(self.session_id, seq, bytes);\n        // Viewers: non-blocking fan-out; a full / disconnected queue = eviction.\n        if !self.viewers.is_empty() {\n            let mut evicted: Vec<u64> = Vec::new();\n            for (vid, sink) in self.viewers.iter() {\n                if viewer_send_evicts(&sink.tx.try_send(frame.clone())) {\n                    evicted.push(*vid);\n                }\n            }\n            if !evicted.is_empty() {\n                for vid in evicted {\n                    // Mark eviction BEFORE dropping the sink: the writer's\n                    // `rx.recv()` then returns Err (tx dropped) and reads this flag\n                    // to emit a KIND_VIEWER_EVICTED marker (skip-to-live, off the\n                    // log lock) instead of dying silently (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT).\n                    if let Some(sink) = self.viewers.remove(&vid) {\n                        sink.evicted.store(true, Ordering::Release);\n                    }\n                }\n                self.stamp_viewer_count();\n            }\n        }\n        // Controller: the SAME non-blocking discipline as a viewer (b4). One\n        // `try_send`, never a sleep. Ok → record the handoff time. Full → DROP (a\n        // slow controller falls behind the ring) unless it has been Full for the\n        // whole deadline since its last success → EVICT. Disconnected (writer gone)\n        // → EVICT. The drain off-lock turns `Some(epoch)` into `mark_controller_gone`.\n        let now = Instant::now();\n        let epoch = self.controller_epoch.load(Ordering::Acquire);\n        let result = if let Some(c) = self.controller.as_mut() {\n            match c.tx.try_send(CtrlMsg::Output(seq, frame)) {\n                Ok(()) => {\n                    c.last_ok = now;\n                    None\n                }\n                Err(TrySendError::Full(_)) => {\n                    if now.duration_since(c.last_ok) >= CONTROLLER_WRITE_DEADLINE {\n                        Some(epoch) // stalled past the deadline → bounded detach\n                    } else {\n                        None // drop this chunk; controller falls behind the ring\n                    }\n                }\n                Err(TrySendError::Disconnected(_)) => Some(epoch),\n            }\n        } else {\n            None\n        };\n        // Advance the render grid AFTER the fan-out — it must never sit between the\n        // drain and the controller/viewer `try_send` (REQ-HAZARD-INJECT-CONTROL-COEXIST\n        // 7.12). The grid is single-writer (this one drain thread); `render_repaint`\n        // snapshots it under the same short log lock only when an attach requests it.\n        self.grid.advance(bytes);\n        result\n    }\n\n    /// The current controller's identity (`Some(node)` remote / `None` local),\n    /// or `None` when undriven. The `by`-keyed ownership logic in\n    /// [`resolve_subscribe`] reads this.\n    fn controller_by(&self) -> Option<&str> {\n        self.controller.as_ref().and_then(|c| c.by.as_deref())\n    }\n\n    /// Whether ANY controller currently drives this session (the `controlled`\n    /// any-controller truth — REQ-HAZARD-CONTROL-STAMP-CONVERGENCE). Snapshotted under\n    /// the log lock, then converged onto the perch OFF the lock.\n    fn has_controller(&self) -> bool {\n        self.controller.is_some()\n    }\n\n    /// The live viewer count (the `viewer_count` truth). Snapshotted under the log lock\n    /// for the convergence re-assert.\n    fn live_viewer_count(&self) -> u32 {\n        self.viewers.len() as u32\n    }\n…\n    fn become_controller(&mut self, sub: SharedSend, by: Option<String>, from_seq: u64, attach_gen: u64) {\n…\n        // for the old controller can't unseat this one and (b) a prior writer\n        // still flushing its initial batch returns before its next frame.\n        // Attribution (F-039 legs b+d): the replaced conn's record names its\n        // successor, and the new conn accretes the controller role fact.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        if let Some(old) = self.controller.take() {\n            old.send.lifecycle_event(\n                \"controller-replaced\",\n                &format!(\"session={} new_conn={}\", self.session_id, sub.id()),\n            );\n        }\n        sub.describe(&format!(\n            \"controller session={} endpoint={} by={}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint },\n            by.as_deref().unwrap_or(\"local\")\n        ));\n        sub.lifecycle_event(\n            \"controller-attach\",\n            &format!(\"session={} from_seq={from_seq}\", self.session_id),\n        );\n        self.controller = None;\n        let epoch = self.controller_epoch.fetch_add(1, Ordering::AcqRel) + 1;\n        // #6 (ADR-0031): a COLD attach's initial batch is a single synthesized clean\n        // repaint of the CURRENT SCREEN (at pseudo-seq `next_seq - 1`) instead of the\n        // raw ring — replaying an alt-screen TUI's raw ring into a fresh terminal is\n        // exactly the corruption #6/#7/#8 report. A resume-from-floor (`from_seq > 0`)\n        // keeps the raw-ring exactly-once re-fetch untouched (B2). Either way the\n        // batch is owned by the writer thread (never pushed through the live channel —\n        // it must not block the drain); live frames stream raw + in-order afterwards.\n        let initial: Vec<(u64, Vec<u8>)> = match self.repaint_initial(from_seq) {\n            Some(repaint) => vec![repaint],\n            None => self\n                .ring\n                .iter()\n                .filter(|(s, _)| *s >= from_seq)\n                .cloned()\n                .collect(),\n        };\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let dt = Arc::clone(&self.delivered_through);\n        let epoch_gate = Arc::clone(&self.controller_epoch);\n        let sid = self.session_id;\n        // W2 decouple: the writer publishes its in-flight-write window here so a\n        // stall-evict can distinguish a wedged writer from an idle one.\n        let write_blocked_since = Arc::new(Mutex::new(None));\n        let writer_blocked = Arc::clone(&write_blocked_since);\n        let writer = thread::spawn(move || {\n            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n        });\n        self.controller = Some(ControllerSink {\n            tx,\n            send: sub,\n            by,\n            last_ok: Instant::now(),\n            write_blocked_since,\n            _writer: writer,\n            attach_gen,\n            });\n        self.stamp_driven_by();\n    }\n\n    /// Detach the controller and UNLATCH the perch — the ONE unlatch path shared\n    /// by W1's deadline-evict ([`mark_controller_gone`]), [`detach_if`], and (per\n    /// the W1↔W5 synergy) W5's reconcile self-heal. Dropping the sink ends its\n    /// writer thread; clearing the slot re-stamps `driven_by` to `None` (so an\n    /// `ONLINE+CONTROLLED` latch cannot outlive a gone controller).\n    fn clear_controller(&mut self) {\n        if self.controller.take().is_some() {\n            self.stamp_driven_by();\n        }\n    }\n\n    /// B-2 (REQ-CONTROLLER-LIVENESS-REAP): lazily drop a controller whose WRITER\n    /// THREAD has EXITED — the record-vs-truth honesty step, run on the authoritative\n    /// `KIND_SESSIONS` poll BEFORE `controller_by`/`has_controller` are read. The\n    /// writer exits when a socket write fails (a severed / keepalive-killed controller\n    /// conn) or its `tx` drops; while it is parked on `rx.recv()` (a LIVE but idle\n    /// controller) it is NOT finished, so a live controller is never touched (the\n    /// no-false-reap guard). Reaping here makes the broker report honest truth so the\n    /// EXISTING [`converge_perch_stamps`] clears the now-stale info.json\n    /// `driven_by`/`controlled` stamp — no new detach path, no new query.\n    ///\n    /// LOCK-SAFE: this runs UNDER the log lock in the snapshot closure, so it must do\n    /// NO file I/O (the lock-across-effect discipline, KH 7.12/5.16). It drops the\n    /// sink in-memory ONLY (like [`become_controller`]'s prior-drop) and does NOT\n    /// [`stamp_driven_by`] — the OFF-lock `converge_perch_stamps` writes the honest\n    /// stamp. Returns true iff it reaped.\n    ///\n    /// SCOPE (doyle B-2 reduction): catches a writer that FAILED A WRITE (output was\n    /// flowing when the conn severed) or whose detach was dropped by a prior wedge\n    /// (the B-1 poison class). A TRULY IDLE severed controller (writer parked on recv,\n    /// no output, conn not yet EOF'd) stays `is_finished() == false` and converges\n    /// only once output resumes or the conn EOFs (→ `handle_conn` detach) — that\n    /// harder active-probe case is the reserved [`REQ-HAZARD-DRIVEN-BY-IDLE-REMOTE-EVICT`],\n    /// deliberately NOT built here. KH 7.15 held by construction: only ever CLEARS,\n    /// never latches `driven_by`.\n    // [impl->REQ-CONTROLLER-LIVENESS-REAP]\n    fn reap_dead_controller(&mut self) -> bool {\n        let dead = self\n            .controller\n            .as_ref()\n            .is_some_and(|c| c._writer.is_finished());\n        if dead {\n            // In-memory drop only (ends the — already-exited — writer); NO stamp here\n            // (info.json I/O under the log lock is the KH 7.12 hazard). converge does it.\n            self.controller = None;\n            return true;\n        }\n        // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): a controller whose\n        // writer is BLOCKED (not exited) on a suspended brain conn past\n        // BRAIN_WRITE_DEADLINE is also reaped here, so the honest `KIND_SESSIONS`\n        // truth + the off-lock converge_perch_stamps release its stale `driven_by`\n        // stamp even when nobody take/reattaches. Deferred stamp: the reap runs in\n        // the multi-session snapshot closure (no I/O under the shared sessions lock).\n        self.stall_evict_controller(Instant::now(), StampMode::Deferred)\n    }\n\n    /// Deadline-evict path (W1): the drain observed a fully-stalled controller and\n    /// timed out its `send_timeout`. Detach it — but ONLY if it is still the same\n    /// controller generation the drain saw (`epoch`), so a NEWER controller that\n    /// attached during the stall is never unseated.\n    fn mark_controller_gone(&mut self, epoch: u64) {\n        if self.controller_epoch.load(Ordering::Acquire) == epoch {\n            self.clear_controller();\n        }\n    }\n\n    /// Whether the current controller's writer is WEDGED — blocked inside a single\n    /// socket write for at least `deadline` (the brain-subscriber conn suspended /\n    /// black-holed). An IDLE controller (writer parked on `rx.recv()`, nothing to\n    /// write) reads NOT stalled: its [`ControllerSink::write_blocked_since`] is `None`.\n    /// Pure over the injected `now` + `deadline` so the unit tests it with no thread.\n    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n    fn controller_write_stalled(&self, now: Instant, deadline: Duration) -> bool {\n        self.controller.as_ref().is_some_and(|c| {\n            c.write_blocked_since\n                .lock()\n                .ok()\n                .and_then(|g| *g)\n                .is_some_and(|since| now.saturating_duration_since(since) >= deadline)\n        })\n    }\n\n    /// Whether this session's controller is the brain's OWN LOCAL conn (`by: None`)\n    /// AND wedged past `deadline` — the brain-generation promotion DRAINED gate reads\n    /// it (REQ-UPDATE-PROMOTE-DRAINED). A killed OLD brain generation whose local\n    /// controller conn is black-holed reads wedged here until the W2 stall-evict\n    /// releases it (or the conn EOFs); a cleanly-closed conn is simply absent. A\n    /// REMOTE operator's wedged conn (`by: Some`) is the W2 stall-evict concern, NOT\n    /// an old-gen brain conn, so it is EXCLUDED — a stuck remote viewer must never\n    /// gate a brain promotion. Pure over the injected `now`/`deadline` (no thread).\n    // [impl->REQ-UPDATE-PROMOTE-DRAINED]\n    fn local_controller_wedged(&self, now: Instant, deadline: Duration) -> bool {\n        self.controller.as_ref().is_some_and(|c| c.by.is_none())\n            && self.controller_write_stalled(now, deadline)\n    }\n\n    /// Stall-evict a controller wedged past [`BRAIN_WRITE_DEADLINE`]: clear the slot\n    /// and re-stamp `driven_by`/`controlled` (the BROKER-side release — no brain\n    /// round-trip, so `controlled-by` can never latch behind a dead transit) and\n    /// record the evict for observability (broker log now; W3 persists the stderr,\n    /// the tally surfaces on `daemon status`). The take/reattach path and the\n    /// `KIND_SESSIONS` reap call this so a suspended brain subscriber can never hold\n    /// control on an idle session (the output-driven [`mark_controller_gone`] never\n    /// fires without new output). Returns true iff it evicted. `stamp` selects whether\n    /// the perch re-stamp happens inline (the take/reattach path, which already stamps\n    /// under the log lock via [`become_controller`]) or is deferred to the off-lock\n    /// `converge_perch_stamps` (the multi-session reap closure, KH 7.12 no-I/O rule).\n    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n    fn stall_evict_controller(&mut self, now: Instant, stamp: StampMode) -> bool {\n        let deadline = brain_write_deadline();\n        if !self.controller_write_stalled(now, deadline) {\n            return false;\n        }\n        // Attribution (F-039 leg b): the evicted controller's stable conn id +\n        // stamps ride the record. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        let conn = self.controller.as_ref().map(|c| c.send.id()).unwrap_or(0);\n        eprintln!(\n            \"BRAIN_SUBSCRIBER_STALL_EVICT:{} conn={conn} {} — controller writer blocked > {}ms \\\n             on a suspended/black-holed brain conn; detached, driven_by released \\\n             [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n            self.session_id,\n            crate::conn::log_stamp(),\n            deadline.as_millis()\n        );\n        record_stall_evict();\n        match stamp {\n            // Inline: drop the sink AND re-stamp the perch (become_controller's\n            // sibling — the take/reattach path is already I/O-under-log-lock).\n            StampMode::Inline => self.clear_controller(),\n            // Deferred: in-memory drop ONLY (the reap closure forbids I/O under the\n            // shared sessions lock); converge_perch_stamps writes the release off-lock.\n            StampMode::Deferred => self.controller = None,\n        }\n        true\n    }\n\n    /// Add a read-only viewer: snapshot the ring from `from_seq` into the writer\n    /// thread (NOT through the bounded live queue — replay must not trip the\n    /// overflow eviction), seed it the current size frame first, then run the\n    /// live queue. The drain thread fans live frames in via `try_send`.\n    fn add_viewer(&mut self, sub: SharedSend, from_seq: u64) {\n        let vid = self.next_viewer_id;\n        self.next_viewer_id += 1;\n        // Attribution (F-039 legs b+d): viewer role fact + attach record.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\n            \"viewer session={} endpoint={} vid={vid}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint }\n        ));\n        sub.lifecycle_event(\n            \"viewer-attach\",\n            &format!(\"session={} vid={vid} from_seq={from_seq}\", self.session_id),\n        );\n        // The size frame + the initial batch (owned by the thread, not the bounded\n        // queue). A COLD viewer attach (`from_seq == 0`) gets the #6 clean repaint;\n        // a skip-to-live / snap re-attach (`from_seq > 0`, incl. `u64::MAX`) keeps\n        // the raw-ring slice (`s >= from_seq`) — empty for skip-to-live, as before.\n        let mut initial: Vec<Envelope> =\n            vec![size_envelope(self.session_id, self.size.0, self.size.1)];\n        match self.repaint_initial(from_seq) {\n            Some((seq, bytes)) => initial.push(output_envelope(self.session_id, seq, &bytes)),\n            None => initial.extend(\n                self.ring\n                    .iter()\n                    .filter(|(s, _)| *s >= from_seq)\n                    .map(|(seq, bytes)| output_envelope(self.session_id, *seq, bytes)),\n            ),\n        }\n        let (tx, rx) = sync_channel::<Envelope>(VIEWER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let evicted = Arc::new(AtomicBool::new(false));\n        let writer_evicted = Arc::clone(&evicted);\n        let session_id = self.session_id;\n        let writer =\n            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n        self.viewers.insert(\n            vid,\n            ViewerSink {\n                tx,\n                send: sub,\n                evicted,\n                _writer: writer,\n            },\n        );\n    }\n\n    /// Resolve a controller/viewer subscribe under the W2.5 model\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). Returns the [`SubscribeOutcome`]; performs\n    /// the controller take / viewer add / loud displace as a side effect. See the\n    /// identity matrix in the body — the `by`-keyed logic is what makes a\n    /// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.\n    fn resolve_subscribe(\n        &mut self,\n        sub: SharedSend,\n        from_seq: u64,\n        intent: AttachIntent,\n        by: Option<String>,\n        gen: u64,\n    ) -> SubscribeOutcome {\n        if intent == AttachIntent::Viewer {\n            if self.viewers.len() >= MAX_VIEWERS {\n                // Soft cap reached — refuse the viewer (bounds thread count).\n                return SubscribeOutcome::BusyControlled {\n                    by: \"viewer cap reached\".to_string(),\n                };\n            }\n            self.add_viewer(sub, from_seq);\n…\n        }\n…\n    }"}],"details":{"displayContent":{"text":"use crate::msg::{\n…\n};\nuse crate::nethost::{NetHost, NET_EFFECT_SESSION};\nuse crate::translation::{key_to_bytes, InjectFloor, KeyCmd, ToBinary, TranslationChild};\nuse crate::transport::{recv_hello, DaemonTransport, LocalSocketTransport};\n\n/// The shared, serialized send side of one brain connection. Output frames,\n/// replay frames, command acks, and exit/error events all write through this.\n/// `pub(crate)`: the net host's stream logs (D4b) live-send through the same\n/// handle under the same gate discipline. Round-4\n/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw\n/// `Arc<Mutex<SendHalf>>` — [`BrokerConn`] owns the half and every write is\n/// bounded + cancelable + poison-on-failure (see [`crate::conn`]). Identity\n/// matching stays `Arc::ptr_eq`.\npub(crate) type SharedSend = Arc<BrokerConn>;\n\n/// Default bounded output-log depth (chunks). Large enough that a brain restart\n/// window never evicts unreplayed output in practice; the bound is what keeps a\n/// disconnected session from buffering without limit.\nconst DEFAULT_LOG_CHUNKS: usize = 4096;\n\n/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it\n/// OVERFLOWS the viewer is evicted — the drain `try_send`s and never blocks\n/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n/// owns the replay batch), so a viewer attaching to a busy session is not\n/// spuriously evicted.\nconst VIEWER_CHANNEL_DEPTH: usize = 256;\n\n/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\nconst MAX_VIEWERS: usize = 32;\n\n/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n/// the live stream) or a `Disconnected` one (its writer thread ended after a\n/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n/// is the pure decision the fan-out applies under the log lock.\n// [impl->REQ-HAZARD-VIEWER-ISOLATION]\nfn viewer_send_evicts<T>(r: &Result<(), TrySendError<T>>) -> bool {\n    r.is_err()\n}\n\n/// One read-only viewer's isolated sink (REQ-HAZARD-VIEWER-ISOLATION). The drain\n/// thread `try_send`s output frames into `tx` (a bounded queue); a dedicated\n/// `writer` thread does the BLOCKING socket write, so a wedged viewer backs up\n/// only its own queue — never the drain. When the queue overflows the sink is\n/// dropped (the `tx` closes → the writer ends) and removed from the map.\nstruct ViewerSink {\n    /// The bounded live-frame queue to this viewer's writer thread.\n    tx: SyncSender<Envelope>,\n    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n    /// (a dropped brain connection removes its viewer rows); never written here.\n    send: SharedSend,\n    /// Set TRUE when this viewer is EVICTED for overflow (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT),\n    /// distinguishing an eviction from a normal teardown (session end / conn drop).\n    /// `append` stores `true` BEFORE dropping the sink (and thus `tx`); the writer,\n    /// on its `rx.recv()` Err, reads this and — when true — emits a\n    /// [`KIND_VIEWER_EVICTED`] marker (in the writer thread, OFF the log lock) so\n    /// the serving brain skips to live instead of tearing the attach down.\n    evicted: Arc<AtomicBool>,\n    /// The writer thread handle (held for ownership; it exits when `tx` drops or\n    /// a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// The controller live-frame channel depth (frames). Deeper than a viewer's\n/// queue because the controller is the AUTHORITATIVE view — unlike a viewer it is\n/// NOT evicted on a SINGLE full `try_send` (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// b4: the drain does ONE non-blocking `try_send` per chunk and NEVER blocks; a\n/// merely-slow controller DROPS chunks + falls behind the ring, and only a channel\n/// that stays full for [`CONTROLLER_WRITE_DEADLINE`] (tracked via\n/// [`ControllerSink::last_ok`]) is detached. Generous so a momentary slow consumer\n/// never trips the deadline.\nconst CONTROLLER_CHANNEL_DEPTH: usize = 4096;\n\n/// How long a CONTROLLER's channel may stay FULL (no successful handoff since\n/// [`ControllerSink::last_ok`]) before the drain declares it stalled and detaches it\n/// (W1, refined by b4 / REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE). This\n/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n/// untouched.\nconst CONTROLLER_WRITE_DEADLINE: Duration = Duration::from_secs(5);\n\n/// How long a controller's writer thread may sit BLOCKED inside a single socket\n/// write — the brain subscriber suspended / black-holed — before a take/reattach\n/// or the `KIND_SESSIONS` reap stall-evicts it (LIFECYCLE-TRUTH W2,\n/// REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE). Distinct from and 3× longer than\n/// [`CONTROLLER_WRITE_DEADLINE`] on PURPOSE (doyle ruling Q1): that 5 s bound\n/// protects the fan-out against ONE per-client conn falling behind and is\n/// output-driven (the drain observes a Full channel); THIS bound is measured\n/// full-with-**zero writer progress** and covers the case the output-driven path\n/// can't — an IDLE session whose brain-subscriber conn is suspended produces no\n/// output, so `append`/`mark_controller_gone` never runs, and the stalled\n/// controller would otherwise latch `driven_by` forever (reattach refused, `--take`\n/// blocked). The brain aggregates every session + psyche + WAN feed, so its drain\n/// is bursty; 15 s tolerates a normal burst-stall while still bounding the wedge.\n/// A slow-but-DRAINING brain never trips it — the clock only advances while a write\n/// is genuinely in flight past the deadline (see [`ControllerSink::write_blocked_since`]).\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\nconst BRAIN_WRITE_DEADLINE: Duration = Duration::from_secs(15);\n\n/// The EFFECTIVE brain-write deadline. Production is [`BRAIN_WRITE_DEADLINE`]; the\n/// suspend-brain int rig shrinks it via `SPT_BRAIN_WRITE_DEADLINE_MS` so the\n/// structural outcome (a wedged controller is stall-evicted → take/reattach frees\n/// the slot) is provable in ~1 s instead of 15 (mirrors the\n/// `SPT_INJECT_COMMIT_DEADLINE_MS` env-knob precedent). Grants test wall-clock\n/// ONLY — never relaxes an assertion.\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n…\n\nfn note_miss_respool(respooled_once: &mut HashSet<String>, envelope: &str) -> MissRespool {\n    if respooled_once.contains(envelope) {\n        MissRespool::DeadLetter\n    } else {\n        respooled_once.insert(envelope.to_string());\n        MissRespool::Respool\n    }\n}\n\n/// Pure strike-budget verdict: a MISS becomes a REAL fault once `strikes` reaches\n/// the `budget` (F029 C-1, REQ-TRANSLATE-COMMIT-MISS-TOLERANCE). Below the budget\n/// the miss is tolerated (binary preserved, worker continues).\nfn miss_strikes_exhausted(strikes: u32, budget: u32) -> bool {\n    strikes >= budget\n}\n\n/// The interactive CONTROLLER's isolated sink (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// Symmetric with [`ViewerSink`] — a dedicated writer thread does the BLOCKING\n/// socket write so a backed-up controller can never stall the session drain\n/// thread (the v0.12.x wedge: the controller write was inline on the drain,\n/// holding `Mutex<OutputLog>`). Unlike a viewer it is AUTHORITATIVE: its writer\n/// advances `delivered_through` on each successful write, and it is never evicted\n/// on a single full `try_send` — only after [`CONTROLLER_WRITE_DEADLINE`].\nstruct ControllerSink {\n    /// The bounded live-frame queue to the controller's writer thread.\n    tx: SyncSender<CtrlMsg>,\n    /// The controller's IPC send half — kept for identity matching on detach and\n    /// for the `exit`-frame fan-out ([`OutputLog::all_sinks`]).\n    send: SharedSend,\n    /// The controller's ATTACH GENERATION (ADR-0038 Amendment fix 6,\n    /// REQ-SERVE-OWNERSHIP-GENERATION): operator-minted wall-ms from the wire\n    /// Request (`0` = local / N-1). A same-identity re-take with an OLDER\n    /// generation is a replayed stale Request — refused; a stale worker's\n    /// late detach (older generation) never clears a newer controller.\n    attach_gen: u64,\n    /// The controller's identity: `Some(node)` = a remote operator, `None` =\n    /// local (the brain's spawn-reader / resume). Ownership keys on this.\n    by: Option<String>,\n    /// Time of the last SUCCESSFUL handoff (`try_send` Ok) to this controller's\n    /// writer channel (b4, REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE).\n    /// The drain does a SINGLE non-blocking `try_send` per chunk and NEVER sleeps;\n    /// a channel that stays Full for [`CONTROLLER_WRITE_DEADLINE`] PAST this stamp\n    /// evicts the stalled controller (bounded wedge preserved), while a slow-but-\n    /// alive controller just drops the chunk + falls behind the ring (resume-from-\n    /// floor). Seeded `now` at [`OutputLog::become_controller`].\n    last_ok: Instant,\n    /// The writer's IN-FLIGHT socket-write marker (LIFECYCLE-TRUTH W2,\n    /// REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): the `controller_writer` sets it to\n    /// `Some(Instant::now())` immediately BEFORE it enters a blocking `write_frame`\n    /// and back to `None` the instant the write returns. A reader\n    /// ([`OutputLog::controller_stalled`]) sees a `Some` older than\n    /// [`BRAIN_WRITE_DEADLINE`] as a writer WEDGED on a suspended/black-holed brain\n    /// conn and stall-evicts it — the signal `last_ok` (channel-handoff time) cannot\n    /// give: an IDLE controller (writer parked on `rx.recv()`, `None` here) and a\n    /// BLOCKED one (writer stuck in the socket write, `Some` here) both leave\n    /// `last_ok` stale. `Arc<Mutex<…>>` so the reader observes the writer's live\n    /// state; the mutex is taken only around the brief set/clear and the read, never\n    /// held across the socket write itself.\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n    /// The writer thread handle (held for ownership; exits when `tx` drops — the\n    /// drain's bounded `send_timeout` then sees `Disconnected` and detaches — or\n    /// when a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// A bounded, sequenced output log for one session — the gapless-resume buffer\n/// AND the W2.5 controller/viewer fan-out hub (REQ-RCVIEW-1).\n///\n/// The session's single drain thread is the only producer ([`OutputLog::append`]).\n/// Output fans out to ONE interactive `controller` (the authoritative,\n/// cursor-advancing, blocking path) plus ANY NUMBER of read-only `viewers` (each\n/// an isolated bounded queue + writer thread, evicted on overflow). Every\n/// controller send and viewer `try_send` happens while the enclosing\n/// `Mutex<OutputLog>` is held, so frames reach each sink in strict `seq` order.\nstruct OutputLog {\n    session_id: u64,\n    next_seq: u64,\n    ring: VecDeque<(u64, Vec<u8>)>,\n    cap_chunks: usize,\n    /// The single interactive controller's isolated sink (W1: a dedicated writer\n    /// thread + bounded channel + authoritative cursor). `None` ⇒ undriven. The\n    /// controller's identity (`Some(node)` remote / `None` local) lives in\n    /// [`ControllerSink::by`] and keys ownership — a same-`by` re-subscribe\n    /// silently re-takes (no `Displaced`, the gate-#7 self-kick guard); only a\n    /// DIFFERENT remote's `Take` displaces.\n    controller: Option<ControllerSink>,\n    /// Monotonic controller generation, shared with the live `controller_writer`\n    /// thread (`Arc<AtomicU64>`). Bumped on every [`become_controller`]; the\n    /// drain's deadline-evict ([`mark_controller_gone`]) carries the epoch it\n    /// observed and only detaches if it still matches — so a slow-controller\n    /// timeout can never unseat a NEWER controller that attached meanwhile. The\n    /// writer snapshots its own epoch and returns the moment this value moves past\n    /// it, so a SUPERSEDED writer flushes no further frames (P1c, single live\n    /// writer per connection, [`REQ-HAZARD-CONTROLLER-WRITER-REORDER`]).\n    controller_epoch: Arc<AtomicU64>,\n    /// The read-only viewers, keyed by a broker-minted viewer id.\n    viewers: HashMap<u64, ViewerSink>,\n    /// Monotonic viewer-id source.\n    next_viewer_id: u64,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test).\n    /// The broker is the SINGLE writer of `driven_by` + `viewer_count` on this\n    /// perch (REQ-RCVIEW-1, resolves the clear-race); empty ⇒ nowhere to stamp.\n    endpoint: String,\n    /// Last-known PTY size — seeded at spawn, updated on a controller resize.\n    /// Pushed to a viewer on attach + to all viewers on resize (the letterbox\n    /// feed); the broker holds it since the PTY exposes no size getter.\n    size: (u16, u16),\n    /// Cursor-of-record (restoration D4-1, ADR-0018 Q6): the next seq a\n    /// re-attaching CONTROLLER still needs (= highest seq **successfully written**\n    /// to the controller, +1). It is **log** state, not subscriber state, so it\n    /// **survives `detach_if`** — a dead brain leaves its resume point behind, and\n    /// a cold-starting brain reads it (via `KIND_SESSIONS` → `resume_seq`) instead\n    /// of replaying the whole ring from 0. **Viewer writes NEVER move it**\n    /// (REQ-RCVIEW-1: the brain-resume cursor tracks the controller only).\n    ///\n    /// **Advanced only on a successful socket write** (`Ok`), and **monotonic**\n    /// (never decreases) — see [`advanced_cursor`]. Both invariants are\n    /// load-bearing for at-least-once output: advancing past a *failed* write to a\n    /// dying-but-not-yet-detached controller would make resume skip that chunk\n    /// forever (at-least-once → at-most-once); decreasing on a deliberate\n    /// `attach(sub, 0)` rewind-replay would reset the resume point under a live\n    /// reader.\n    ///\n    /// W1: now an `Arc<AtomicU64>` shared with the controller's writer thread,\n    /// which advances it (via [`advanced_cursor`], CAS-monotonic) as it writes —\n    /// the cursor moved off the drain thread with the controller delivery itself.\n    delivered_through: Arc<AtomicU64>,\n    /// The server-side **render grid** (#6 / REQ-BROKER-SCREEN-GRID, ADR-0031):\n    /// the authoritative CURRENT SCREEN, interpreted from the same byte stream the\n    /// ring records. Fed on the drain path in [`append`], AFTER the fan-out (so it\n    /// never adds latency to controller/viewer delivery — hazard 7.12). A cold\n    /// attach's initial batch is a single synthesized [`ScreenGrid::render_repaint`]\n    /// instead of the raw ring, so replaying an alt-screen TUI into a fresh terminal\n    /// no longer corrupts scrollback. Single-writer (the one drain thread), mirroring\n    /// the ring's single producer.\n    grid: ScreenGrid,\n}\n\n/// The post-write resume cursor (pure — the D4-1 unit kernel, mirroring\n/// `brainproc::consumer_gate`/`next_backoff`): advance to `seq + 1` **only** on a\n/// successful write, and **monotonically** (never below `current`). A failed\n/// write (`write_ok == false`) leaves the cursor untouched, and a re-send of an\n/// already-delivered `seq` (an `attach(sub, 0)` rewind, `seq + 1 <= current`)\n/// cannot lower it. This is the exact decision the `let _ = write_frame(...)`\n/// swallow used to drop (doyle D4-1 amendments 1–3).\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\nfn advanced_cursor(current: u64, seq: u64, write_ok: bool) -> u64 {\n    if write_ok {\n        current.max(seq + 1)\n    } else {\n        current\n    }\n}\n\n/// Pure divergence decision for the control/viewer stamp convergence\n/// (REQ-HAZARD-CONTROL-STAMP-CONVERGENCE): does the perch's RECORDED\n/// (`driven_by`, `controlled`, `viewer_count`) differ from the live session TRUTH?\n/// Returns `(control_write_needed, viewer_write_needed)` — the divergence gate that\n/// keeps the per-poll re-assert from writing (fsync) when nothing changed.\n// [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\nfn stamp_divergence(\n    rec_driven_by: Option<&str>,\n    rec_controlled: bool,\n    rec_viewers: u32,\n    want_driven_by: Option<&str>,\n    want_controlled: bool,\n    want_viewers: u32,\n) -> (bool, bool) {\n    let control = rec_driven_by != want_driven_by || rec_controlled != want_controlled;\n    let viewer = rec_viewers != want_viewers;\n…\n}\n…\n    /// point for the inject leg's settle-gate + echo-verify (REQ-INJECT-MULTILINE-\n    /// INTEGRITY). A rising high-water since a baseline == the PTY produced output.\n    fn high_water(&self) -> u64 {\n        self.next_seq\n    }\n\n    /// Concatenate ring bytes at or after `from_seq` — the output PRODUCED since a\n    /// snapshot, used to confirm a settle probe echoed (readiness, Layer 1) and that\n    /// a typed payload's head echoed back (integrity, Layer 2). Best-effort: bytes\n    /// pruned out of the bounded ring are simply absent (the echo we look for is\n    /// recent, well within cap).\n    fn bytes_since(&self, from_seq: u64) -> Vec<u8> {\n        let mut out = Vec::new();\n        for (seq, chunk) in self.ring.iter() {\n            if *seq >= from_seq {\n                out.extend_from_slice(chunk);\n            }\n        }\n        out\n    }\n\n    fn append(&mut self, bytes: &[u8]) -> Option<u64> {\n        let seq = self.next_seq;\n        self.next_seq += 1;\n        self.ring.push_back((seq, bytes.to_vec()));\n        while self.ring.len() > self.cap_chunks {\n            self.ring.pop_front();\n        }\n        let frame = output_envelope(self.session_id, seq, bytes);\n        // Viewers: non-blocking fan-out; a full / disconnected queue = eviction.\n        if !self.viewers.is_empty() {\n            let mut evicted: Vec<u64> = Vec::new();\n            for (vid, sink) in self.viewers.iter() {\n                if viewer_send_evicts(&sink.tx.try_send(frame.clone())) {\n                    evicted.push(*vid);\n                }\n            }\n            if !evicted.is_empty() {\n                for vid in evicted {\n                    // Mark eviction BEFORE dropping the sink: the writer's\n                    // `rx.recv()` then returns Err (tx dropped) and reads this flag\n                    // to emit a KIND_VIEWER_EVICTED marker (skip-to-live, off the\n                    // log lock) instead of dying silently (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT).\n                    if let Some(sink) = self.viewers.remove(&vid) {\n                        sink.evicted.store(true, Ordering::Release);\n                    }\n                }\n                self.stamp_viewer_count();\n            }\n        }\n        // Controller: the SAME non-blocking discipline as a viewer (b4). One\n        // `try_send`, never a sleep. Ok → record the handoff time. Full → DROP (a\n        // slow controller falls behind the ring) unless it has been Full for the\n        // whole deadline since its last success → EVICT. Disconnected (writer gone)\n        // → EVICT. The drain off-lock turns `Some(epoch)` into `mark_controller_gone`.\n        let now = Instant::now();\n        let epoch = self.controller_epoch.load(Ordering::Acquire);\n        let result = if let Some(c) = self.controller.as_mut() {\n            match c.tx.try_send(CtrlMsg::Output(seq, frame)) {\n                Ok(()) => {\n                    c.last_ok = now;\n                    None\n                }\n                Err(TrySendError::Full(_)) => {\n                    if now.duration_since(c.last_ok) >= CONTROLLER_WRITE_DEADLINE {\n                        Some(epoch) // stalled past the deadline → bounded detach\n                    } else {\n                        None // drop this chunk; controller falls behind the ring\n                    }\n                }\n                Err(TrySendError::Disconnected(_)) => Some(epoch),\n            }\n        } else {\n            None\n        };\n        // Advance the render grid AFTER the fan-out — it must never sit between the\n        // drain and the controller/viewer `try_send` (REQ-HAZARD-INJECT-CONTROL-COEXIST\n        // 7.12). The grid is single-writer (this one drain thread); `render_repaint`\n        // snapshots it under the same short log lock only when an attach requests it.\n        self.grid.advance(bytes);\n        result\n    }\n\n    /// The current controller's identity (`Some(node)` remote / `None` local),\n    /// or `None` when undriven. The `by`-keyed ownership logic in\n    /// [`resolve_subscribe`] reads this.\n    fn controller_by(&self) -> Option<&str> {\n        self.controller.as_ref().and_then(|c| c.by.as_deref())\n    }\n\n    /// Whether ANY controller currently drives this session (the `controlled`\n    /// any-controller truth — REQ-HAZARD-CONTROL-STAMP-CONVERGENCE). Snapshotted under\n    /// the log lock, then converged onto the perch OFF the lock.\n    fn has_controller(&self) -> bool {\n        self.controller.is_some()\n    }\n\n    /// The live viewer count (the `viewer_count` truth). Snapshotted under the log lock\n    /// for the convergence re-assert.\n    fn live_viewer_count(&self) -> u32 {\n        self.viewers.len() as u32\n    }\n…\n    fn become_controller(&mut self, sub: SharedSend, by: Option<String>, from_seq: u64, attach_gen: u64) {\n…\n        // for the old controller can't unseat this one and (b) a prior writer\n        // still flushing its initial batch returns before its next frame.\n        // Attribution (F-039 legs b+d): the replaced conn's record names its\n        // successor, and the new conn accretes the controller role fact.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        if let Some(old) = self.controller.take() {\n            old.send.lifecycle_event(\n                \"controller-replaced\",\n                &format!(\"session={} new_conn={}\", self.session_id, sub.id()),\n            );\n        }\n        sub.describe(&format!(\n            \"controller session={} endpoint={} by={}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint },\n            by.as_deref().unwrap_or(\"local\")\n        ));\n        sub.lifecycle_event(\n            \"controller-attach\",\n            &format!(\"session={} from_seq={from_seq}\", self.session_id),\n        );\n        self.controller = None;\n        let epoch = self.controller_epoch.fetch_add(1, Ordering::AcqRel) + 1;\n        // #6 (ADR-0031): a COLD attach's initial batch is a single synthesized clean\n        // repaint of the CURRENT SCREEN (at pseudo-seq `next_seq - 1`) instead of the\n        // raw ring — replaying an alt-screen TUI's raw ring into a fresh terminal is\n        // exactly the corruption #6/#7/#8 report. A resume-from-floor (`from_seq > 0`)\n        // keeps the raw-ring exactly-once re-fetch untouched (B2). Either way the\n        // batch is owned by the writer thread (never pushed through the live channel —\n        // it must not block the drain); live frames stream raw + in-order afterwards.\n        let initial: Vec<(u64, Vec<u8>)> = match self.repaint_initial(from_seq) {\n            Some(repaint) => vec![repaint],\n            None => self\n                .ring\n                .iter()\n                .filter(|(s, _)| *s >= from_seq)\n                .cloned()\n                .collect(),\n        };\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let dt = Arc::clone(&self.delivered_through);\n        let epoch_gate = Arc::clone(&self.controller_epoch);\n        let sid = self.session_id;\n        // W2 decouple: the writer publishes its in-flight-write window here so a\n        // stall-evict can distinguish a wedged writer from an idle one.\n        let write_blocked_since = Arc::new(Mutex::new(None));\n        let writer_blocked = Arc::clone(&write_blocked_since);\n        let writer = thread::spawn(move || {\n            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n        });\n        self.controller = Some(ControllerSink {\n            tx,\n            send: sub,\n            by,\n            last_ok: Instant::now(),\n            write_blocked_since,\n            _writer: writer,\n            attach_gen,\n            });\n        self.stamp_driven_by();\n    }\n\n    /// Detach the controller and UNLATCH the perch — the ONE unlatch path shared\n    /// by W1's deadline-evict ([`mark_controller_gone`]), [`detach_if`], and (per\n    /// the W1↔W5 synergy) W5's reconcile self-heal. Dropping the sink ends its\n    /// writer thread; clearing the slot re-stamps `driven_by` to `None` (so an\n    /// `ONLINE+CONTROLLED` latch cannot outlive a gone controller).\n    fn clear_controller(&mut self) {\n        if self.controller.take().is_some() {\n            self.stamp_driven_by();\n        }\n    }\n\n    /// B-2 (REQ-CONTROLLER-LIVENESS-REAP): lazily drop a controller whose WRITER\n    /// THREAD has EXITED — the record-vs-truth honesty step, run on the authoritative\n    /// `KIND_SESSIONS` poll BEFORE `controller_by`/`has_controller` are read. The\n    /// writer exits when a socket write fails (a severed / keepalive-killed controller\n    /// conn) or its `tx` drops; while it is parked on `rx.recv()` (a LIVE but idle\n    /// controller) it is NOT finished, so a live controller is never touched (the\n    /// no-false-reap guard). Reaping here makes the broker report honest truth so the\n    /// EXISTING [`converge_perch_stamps`] clears the now-stale info.json\n    /// `driven_by`/`controlled` stamp — no new detach path, no new query.\n    ///\n    /// LOCK-SAFE: this runs UNDER the log lock in the snapshot closure, so it must do\n    /// NO file I/O (the lock-across-effect discipline, KH 7.12/5.16). It drops the\n    /// sink in-memory ONLY (like [`become_controller`]'s prior-drop) and does NOT\n    /// [`stamp_driven_by`] — the OFF-lock `converge_perch_stamps` writes the honest\n    /// stamp. Returns true iff it reaped.\n    ///\n    /// SCOPE (doyle B-2 reduction): catches a writer that FAILED A WRITE (output was\n    /// flowing when the conn severed) or whose detach was dropped by a prior wedge\n    /// (the B-1 poison class). A TRULY IDLE severed controller (writer parked on recv,\n    /// no output, conn not yet EOF'd) stays `is_finished() == false` and converges\n    /// only once output resumes or the conn EOFs (→ `handle_conn` detach) — that\n    /// harder active-probe case is the reserved [`REQ-HAZARD-DRIVEN-BY-IDLE-REMOTE-EVICT`],\n    /// deliberately NOT built here. KH 7.15 held by construction: only ever CLEARS,\n    /// never latches `driven_by`.\n    // [impl->REQ-CONTROLLER-LIVENESS-REAP]\n    fn reap_dead_controller(&mut self) -> bool {\n        let dead = self\n            .controller\n            .as_ref()\n            .is_some_and(|c| c._writer.is_finished());\n        if dead {\n            // In-memory drop only (ends the — already-exited — writer); NO stamp here\n            // (info.json I/O under the log lock is the KH 7.12 hazard). converge does it.\n            self.controller = None;\n            return true;\n        }\n        // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): a controller whose\n        // writer is BLOCKED (not exited) on a suspended brain conn past\n        // BRAIN_WRITE_DEADLINE is also reaped here, so the honest `KIND_SESSIONS`\n        // truth + the off-lock converge_perch_stamps release its stale `driven_by`\n        // stamp even when nobody take/reattaches. Deferred stamp: the reap runs in\n        // the multi-session snapshot closure (no I/O under the shared sessions lock).\n        self.stall_evict_controller(Instant::now(), StampMode::Deferred)\n    }\n\n    /// Deadline-evict path (W1): the drain observed a fully-stalled controller and\n    /// timed out its `send_timeout`. Detach it — but ONLY if it is still the same\n    /// controller generation the drain saw (`epoch`), so a NEWER controller that\n    /// attached during the stall is never unseated.\n    fn mark_controller_gone(&mut self, epoch: u64) {\n        if self.controller_epoch.load(Ordering::Acquire) == epoch {\n            self.clear_controller();\n        }\n    }\n\n    /// Whether the current controller's writer is WEDGED — blocked inside a single\n    /// socket write for at least `deadline` (the brain-subscriber conn suspended /\n    /// black-holed). An IDLE controller (writer parked on `rx.recv()`, nothing to\n    /// write) reads NOT stalled: its [`ControllerSink::write_blocked_since`] is `None`.\n    /// Pure over the injected `now` + `deadline` so the unit tests it with no thread.\n    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n    fn controller_write_stalled(&self, now: Instant, deadline: Duration) -> bool {\n        self.controller.as_ref().is_some_and(|c| {\n            c.write_blocked_since\n                .lock()\n                .ok()\n                .and_then(|g| *g)\n                .is_some_and(|since| now.saturating_duration_since(since) >= deadline)\n        })\n    }\n\n    /// Whether this session's controller is the brain's OWN LOCAL conn (`by: None`)\n    /// AND wedged past `deadline` — the brain-generation promotion DRAINED gate reads\n    /// it (REQ-UPDATE-PROMOTE-DRAINED). A killed OLD brain generation whose local\n    /// controller conn is black-holed reads wedged here until the W2 stall-evict\n    /// releases it (or the conn EOFs); a cleanly-closed conn is simply absent. A\n    /// REMOTE operator's wedged conn (`by: Some`) is the W2 stall-evict concern, NOT\n    /// an old-gen brain conn, so it is EXCLUDED — a stuck remote viewer must never\n    /// gate a brain promotion. Pure over the injected `now`/`deadline` (no thread).\n    // [impl->REQ-UPDATE-PROMOTE-DRAINED]\n    fn local_controller_wedged(&self, now: Instant, deadline: Duration) -> bool {\n        self.controller.as_ref().is_some_and(|c| c.by.is_none())\n            && self.controller_write_stalled(now, deadline)\n    }\n\n    /// Stall-evict a controller wedged past [`BRAIN_WRITE_DEADLINE`]: clear the slot\n    /// and re-stamp `driven_by`/`controlled` (the BROKER-side release — no brain\n    /// round-trip, so `controlled-by` can never latch behind a dead transit) and\n    /// record the evict for observability (broker log now; W3 persists the stderr,\n    /// the tally surfaces on `daemon status`). The take/reattach path and the\n    /// `KIND_SESSIONS` reap call this so a suspended brain subscriber can never hold\n    /// control on an idle session (the output-driven [`mark_controller_gone`] never\n    /// fires without new output). Returns true iff it evicted. `stamp` selects whether\n    /// the perch re-stamp happens inline (the take/reattach path, which already stamps\n    /// under the log lock via [`become_controller`]) or is deferred to the off-lock\n    /// `converge_perch_stamps` (the multi-session reap closure, KH 7.12 no-I/O rule).\n    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n    fn stall_evict_controller(&mut self, now: Instant, stamp: StampMode) -> bool {\n        let deadline = brain_write_deadline();\n        if !self.controller_write_stalled(now, deadline) {\n            return false;\n        }\n        // Attribution (F-039 leg b): the evicted controller's stable conn id +\n        // stamps ride the record. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        let conn = self.controller.as_ref().map(|c| c.send.id()).unwrap_or(0);\n        eprintln!(\n            \"BRAIN_SUBSCRIBER_STALL_EVICT:{} conn={conn} {} — controller writer blocked > {}ms \\\n             on a suspended/black-holed brain conn; detached, driven_by released \\\n             [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n            self.session_id,\n            crate::conn::log_stamp(),\n            deadline.as_millis()\n        );\n        record_stall_evict();\n        match stamp {\n            // Inline: drop the sink AND re-stamp the perch (become_controller's\n            // sibling — the take/reattach path is already I/O-under-log-lock).\n            StampMode::Inline => self.clear_controller(),\n            // Deferred: in-memory drop ONLY (the reap closure forbids I/O under the\n            // shared sessions lock); converge_perch_stamps writes the release off-lock.\n            StampMode::Deferred => self.controller = None,\n        }\n        true\n    }\n\n    /// Add a read-only viewer: snapshot the ring from `from_seq` into the writer\n    /// thread (NOT through the bounded live queue — replay must not trip the\n    /// overflow eviction), seed it the current size frame first, then run the\n    /// live queue. The drain thread fans live frames in via `try_send`.\n    fn add_viewer(&mut self, sub: SharedSend, from_seq: u64) {\n        let vid = self.next_viewer_id;\n        self.next_viewer_id += 1;\n        // Attribution (F-039 legs b+d): viewer role fact + attach record.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\n            \"viewer session={} endpoint={} vid={vid}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint }\n        ));\n        sub.lifecycle_event(\n            \"viewer-attach\",\n            &format!(\"session={} vid={vid} from_seq={from_seq}\", self.session_id),\n        );\n        // The size frame + the initial batch (owned by the thread, not the bounded\n        // queue). A COLD viewer attach (`from_seq == 0`) gets the #6 clean repaint;\n        // a skip-to-live / snap re-attach (`from_seq > 0`, incl. `u64::MAX`) keeps\n        // the raw-ring slice (`s >= from_seq`) — empty for skip-to-live, as before.\n        let mut initial: Vec<Envelope> =\n            vec![size_envelope(self.session_id, self.size.0, self.size.1)];\n        match self.repaint_initial(from_seq) {\n            Some((seq, bytes)) => initial.push(output_envelope(self.session_id, seq, &bytes)),\n            None => initial.extend(\n                self.ring\n                    .iter()\n                    .filter(|(s, _)| *s >= from_seq)\n                    .map(|(seq, bytes)| output_envelope(self.session_id, *seq, bytes)),\n            ),\n        }\n        let (tx, rx) = sync_channel::<Envelope>(VIEWER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let evicted = Arc::new(AtomicBool::new(false));\n        let writer_evicted = Arc::clone(&evicted);\n        let session_id = self.session_id;\n        let writer =\n            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n        self.viewers.insert(\n            vid,\n            ViewerSink {\n                tx,\n                send: sub,\n                evicted,\n                _writer: writer,\n            },\n        );\n    }\n\n    /// Resolve a controller/viewer subscribe under the W2.5 model\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). Returns the [`SubscribeOutcome`]; performs\n    /// the controller take / viewer add / loud displace as a side effect. See the\n    /// identity matrix in the body — the `by`-keyed logic is what makes a\n    /// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.\n    fn resolve_subscribe(\n        &mut self,\n        sub: SharedSend,\n        from_seq: u64,\n        intent: AttachIntent,\n        by: Option<String>,\n        gen: u64,\n    ) -> SubscribeOutcome {\n        if intent == AttachIntent::Viewer {\n            if self.viewers.len() >= MAX_VIEWERS {\n                // Soft cap reached — refuse the viewer (bounds thread count).\n                return SubscribeOutcome::BusyControlled {\n                    by: \"viewer cap reached\".to_string(),\n                };\n            }\n            self.add_viewer(sub, from_seq);\n…\n        }\n…\n    }","startLine":53,"lineNumbers":[53,null,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,null,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,null,642,null,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,null,897,null,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,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,null,1173,null,1245]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271480474}}
{"type":"message","id":"277ac49a","parentId":"dc9020db","timestamp":"2026-07-17T06:58:00.477Z","message":{"role":"toolResult","toolCallId":"call_x6jbmlgjy1x5Rwo1gSMGQl85|fc_0a061eb498f0e908016a59d2785298819684ea24829670ca67","toolName":"glob","content":[{"type":"text","text":"# crates/spt-term/\nCargo.toml\n## src/\nscreen.rs\nwinprog.rs\nsurface.rs\nstream.rs\nreader.rs\npty.rs\nprojection.rs\nlib.rs\ndigest.rs\n## tests/\nwinspawn.rs\nsurface.rs\nstream.rs\ninject.rs\ndsr.rs"}],"details":{"scopePath":"crates/spt-term","fileCount":17,"files":["crates/spt-term/src/","crates/spt-term/src/screen.rs","crates/spt-term/tests/","crates/spt-term/tests/winspawn.rs","crates/spt-term/tests/surface.rs","crates/spt-term/tests/stream.rs","crates/spt-term/tests/inject.rs","crates/spt-term/tests/dsr.rs","crates/spt-term/src/winprog.rs","crates/spt-term/src/surface.rs","crates/spt-term/src/stream.rs","crates/spt-term/src/reader.rs","crates/spt-term/src/pty.rs","crates/spt-term/src/projection.rs","crates/spt-term/src/lib.rs","crates/spt-term/src/digest.rs","crates/spt-term/Cargo.toml"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784271480477}}
{"type":"message","id":"491762f2","parentId":"277ac49a","timestamp":"2026-07-17T06:58:00.534Z","message":{"role":"toolResult","toolCallId":"call_De4PXtxz5a0qCVEsFNmqNeiv|fc_0a061eb498f0e908016a59d27852bc81968ae86aba32cbd531","toolName":"read","content":[{"type":"text","text":"/// the watchdog must not keep the conn alive).\nstruct Inner {\n    /// Stable per-physical-conn id ([`CONN_ID_SEQ`]) — on every lifecycle record.\n    id: u64,\n    /// Accreted attribution facts (subscriber role, endpoint/session where\n    /// known — [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].\n    label: Mutex<String>,\n    /// Latch: the once-per-conn `write-start` lifecycle record fired.\n    first_write_logged: AtomicBool,\n    gate: Mutex<Gate>,\n    gate_cv: Condvar,\n    dog: Mutex<Dog>,\n    dog_cv: Condvar,\n    /// Idempotently latched on the first deadline/failure/cancel. A poisoned\n    /// conn refuses every future write and is never re-gated.\n    poisoned: AtomicBool,\n    /// Latched when the retirement was DEADLINE-driven (watchdog fired, or a\n    /// gate-waiter exhausted its bound) — as opposed to an organic I/O error\n    /// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can\n    /// count the wedge (the W2 stall-evict tally) without conflating it with\n    /// an ordinary disconnect.\n    timed_out: AtomicBool,\n    /// The physical sever ran (exactly once; Windows `DisconnectNamedPipe`).\n    severed: AtomicBool,\n    /// A retired (poisoned) half parks here so its OS handle stays alive\n    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\n    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\n    graveyard: Mutex<Option<SendHalf>>,\n    /// Monotonic per-write op identity (the watchdog cancels a SPECIFIC op).\n    op_seq: AtomicU64,\n    /// The absolute per-write bound (gate-wait + OS write completion).\n    bound: Duration,\n    /// The raw OS handle/fd of the underlying stream, captured at\n    /// construction for the out-of-band abort. The recv and send halves share\n    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\n    /// aborting this handle covers a parked read too. Valid for the whole\n    /// conn lifetime: the half lives in `gate`, a writer's stack, or\n    /// `graveyard` until drop.\n    #[cfg(windows)]\n    raw: isize,\n    #[cfg(unix)]\n    raw: i32,\n}\n\n/// Recover a mutex guard even if a holder panicked — the state these guards\n/// protect is a plain slot/flag pair, valid on every panic boundary.\nfn recover<T>(m: &Mutex<T>) -> MutexGuard<'_, T> {\n    match m.lock() {\n        Ok(g) => g,\n        Err(p) => p.into_inner(),\n    }\n}\n…\nmod win {\n    // kernel32 is in the MSVC default link set — raw externs, no new dep\n    // (the deelevate.rs / daemon.rs posture).\n    extern \"system\" {\n        pub fn CancelIoEx(handle: isize, overlapped: *mut core::ffi::c_void) -> i32;\n        pub fn DisconnectNamedPipe(handle: isize) -> i32;\n    }\n}\n\nimpl Inner {\n    /// The attribution snapshot every lifecycle record carries: stable conn id,\n    /// accreted role/endpoint/session facts, wall + monotonic stamps.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    fn attribution(&self) -> String {\n        let label = recover(&self.label);\n        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\n        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\n    }\n\n    /// Render the once-per-conn retirement record — the F-039 token split\n    /// (leg a): `CONN_WRITE_POISONED` is RESERVED for the deadline class\n    /// (`timed_out` latched — the wedge observable blackhole-controller.ps1\n    /// watches); an ORGANIC write failure (peer death / broken pipe on an\n    /// already-dead counterpart, the offline-peer dial churn) emits the\n    /// distinct `CONN_WRITE_RETIRED` token carrying the error kind and the\n    /// SAME attribution fields — quieter class, never thinner (the retired\n    /// class is what discriminates fresh-carrier churn from interleave\n    /// artifact in the field). Behavior is identical either way: poison,\n    /// abort, retire, never reuse.\n    // [impl->REQ-CONN-POISON-DIAL-SCOPE]\n    fn render_retirement(&self, timed_out: bool, cause: Option<&io::Error>) -> String {\n        if timed_out {\n            format!(\n                \"CONN_WRITE_POISONED: {} — physical broker conn retired: a write \\\n                 exceeded its {}ms bound; in-flight I/O aborted, conn never reused \\\n                 [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\",\n                self.attribution(),\n                self.bound.as_millis()\n            )\n        } else {\n            let cause = match cause {\n                Some(e) => format!(\"{:?}: {e}\", e.kind()),\n                None => \"write failed\".to_string(),\n            };\n            format!(\n                \"CONN_WRITE_RETIRED: {} — organic write failure ({cause}); physical \\\n                 broker conn poisoned + retired, never reused (same retire behavior \\\n                 as POISONED — only the failure class differs) \\\n                 [REQ-CONN-POISON-DIAL-SCOPE]\",\n                self.attribution()\n            )\n        }\n    }\n\n    /// One BOUNDED per-conn lifecycle record (leg d, doyle-confirmed\n    /// UNCONDITIONAL): `write-start` (first write only), `transport-close`\n    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n    /// timeout/cancel leg is the retirement record itself.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    fn lifecycle(&self, event: &str, extra: &str) {\n        let sep = if extra.is_empty() { \"\" } else { \" \" };\n        eprintln!(\n            \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",\n            self.attribution()\n        );\n    }\n\n    /// Abort the connection's in-flight I/O OUT OF BAND (both directions —\n    /// the halves share one OS object) and latch the poison. Idempotent and\n    /// safe to repeat: `CancelIoEx` on a handle with nothing pending is a\n    /// no-op, and re-cancel closes the race where a write was issued a beat\n    /// AFTER a cancel (cancellation only reaches ALREADY-issued ops).\n    /// `cause` (the organic caller's write error) rides the retirement record\n    /// when the retirement is NOT deadline-driven.\n    fn poison_and_cancel(&self, cause: Option<&io::Error>) {\n        if !self.poisoned.swap(true, Ordering::AcqRel) {\n            // First poison of this conn: loud, once. The token is class-split\n            // (F-039 leg a): deadline → CONN_WRITE_POISONED (the wedge\n            // observable), organic fast-fail → CONN_WRITE_RETIRED.\n            eprintln!(\n                \"{}\",\n                self.render_retirement(self.timed_out.load(Ordering::Acquire), cause)\n            );\n        }\n        #[cfg(windows)]\n        // SAFETY: scalar kernel32 call on a handle whose owning half is kept\n        // alive until Drop (gate / writer stack / graveyard — see `raw`).\n        unsafe {\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n        #[cfg(unix)]\n        // SAFETY: scalar shutdown(2) on an fd alive until Drop. SHUT_RDWR\n        // fails the blocked write (EPIPE), EOFs the parked read, and fails\n        // every future op — on Unix this one call IS the whole teardown.\n        unsafe {\n            let _ = libc::shutdown(self.raw, libc::SHUT_RDWR);\n        }\n        // Wake gate-waiters so they observe the poison instead of sleeping\n        // out their full deadline, and the watchdog so it re-evaluates.\n        self.gate_cv.notify_all();\n        self.dog_cv.notify_all();\n    }\n\n    /// Sever the physical connection (exactly once), AFTER the canceled op\n    /// reported completion: on Windows `DisconnectNamedPipe` forces the\n    /// client off (its next access fails), makes a re-issued server-side\n    /// read fail (so `handle_conn` reaches EOF cleanup even if it slipped a\n    /// new read in after the cancel), and defuses the drop-limbo flush; the\n    /// trailing re-cancel covers exactly that slipped-in read. On Unix the\n    /// `shutdown` in [`poison_and_cancel`] already did all of this.\n    // On Unix the cfg(windows) teardown strips out and the idempotence\n    // guard's early `return` becomes the function tail — needless_return\n    // there, load-bearing here. Restructuring (e.g. `if !swapped { … }`)\n    // would leave Unix an empty if-body (`clippy::needless_if`) instead.\n    #[cfg_attr(unix, allow(clippy::needless_return))]\n    fn sever(&self) {\n        if self.severed.swap(true, Ordering::AcqRel) {\n            return;\n        }\n        #[cfg(windows)]\n        // SAFETY: as in poison_and_cancel — handle outlives the watchdog.\n        unsafe {\n            let _ = win::DisconnectNamedPipe(self.raw);\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n    }\n\n    /// The watchdog body: park until a write is in flight, then sleep to its\n    /// absolute deadline. If the op is still in flight at the deadline,\n    /// poison + cancel, re-canceling periodically until the op reports\n    /// completion (the writer clears `inflight` the instant `write_frame`\n    /// returns — that return IS the buffer-release handshake), then sever.\n    fn watchdog(&self) {\n        let mut d = recover(&self.dog);\n        loop {\n            // Park until armed (or shutdown).\n            let (op, deadline) = loop {\n                if d.shutdown {\n                    return;\n                }\n                if let Some(armed) = d.inflight {\n                    break armed;\n                }\n                d = self\n                    .dog_cv\n                    .wait(d)\n                    .unwrap_or_else(|p| p.into_inner());\n            };\n            // Sleep toward the deadline while THIS op stays in flight.\n            let fired = loop {\n                if d.shutdown {\n                    return;\n                }\n                match d.inflight {\n                    Some((cur, _)) if cur == op => {}\n                    // Completed (or a newer op armed) before the deadline.\n                    _ => break false,\n                }\n                let now = Instant::now();\n                if now >= deadline {\n                    break true;\n                }\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, deadline - now)\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n            };\n            if !fired {\n                continue;\n            }\n…\n            while matches!(d.inflight, Some((cur, _)) if cur == op) && !d.shutdown {\n…\n                d = recover(&self.dog);\n            }\n            if d.shutdown {\n                return;\n            }\n            drop(d);\n            self.sever();\n            d = recover(&self.dog);\n        }\n    }\n}\n\n/// The shared, serialized, BOUNDED send side of one physical broker\n/// connection — what [`crate::broker::SharedSend`] now aliases. Owns the\n/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n    inner: Arc<Inner>,\n    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n    /// watchdog aborts through strictly outlives every raw use.\n    dog: Option<JoinHandle<()>>,\n}\n\nimpl BrokerConn {\n    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n    /// deadline (gate-wait + OS write completion) — the broker passes its\n    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n        let raw = raw_of(&half);\n        let inner = Arc::new(Inner {\n            id: CONN_ID_SEQ.fetch_add(1, Ordering::Relaxed) + 1,\n            label: Mutex::new(String::new()),\n            first_write_logged: AtomicBool::new(false),\n            gate: Mutex::new(Gate { half: Some(half) }),\n            gate_cv: Condvar::new(),\n            dog: Mutex::new(Dog {\n                inflight: None,\n                shutdown: false,\n            }),\n            dog_cv: Condvar::new(),\n            poisoned: AtomicBool::new(false),\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n    /// (`Arc::ptr_eq` identity does not survive a log line).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn id(&self) -> u64 {\n        self.inner.id\n    }\n\n    /// Accrete an attribution fact onto this conn's label (subscriber role,\n    /// endpoint/session where known — e.g. `role=brain`,\n    /// `controller session=7 by=cli@host`). Facts accumulate space-separated\n    /// and ride EVERY subsequent lifecycle record for this conn; growth is\n    /// bounded by [`LABEL_CAP`] (one `…` marker, then no-op).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn describe(&self, fact: &str) {\n        let mut l = recover(&self.inner.label);\n        if l.ends_with('…') {\n…\n        }\n…\n    }\n…\n}\n…\nimpl Drop for TestGatePin {\n    fn drop(&mut self) {\n…\n        self.inner.gate_cv.notify_all();\n    }\n}\n\n#[cfg(test)]\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n    io::Error::new(\n        io::ErrorKind::BrokenPipe,\n        \"broker conn poisoned (bounded write retired the physical connection)\",\n    )\n}\n\nfn timeout_err() -> io::Error {\n    io::Error::new(\n        io::ErrorKind::TimedOut,\n        \"broker conn write exceeded its bound (conn poisoned + aborted)\",\n    )\n}"}],"details":{"displayContent":{"text":"/// the watchdog must not keep the conn alive).\nstruct Inner {\n    /// Stable per-physical-conn id ([`CONN_ID_SEQ`]) — on every lifecycle record.\n    id: u64,\n    /// Accreted attribution facts (subscriber role, endpoint/session where\n    /// known — [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].\n    label: Mutex<String>,\n    /// Latch: the once-per-conn `write-start` lifecycle record fired.\n    first_write_logged: AtomicBool,\n    gate: Mutex<Gate>,\n    gate_cv: Condvar,\n    dog: Mutex<Dog>,\n    dog_cv: Condvar,\n    /// Idempotently latched on the first deadline/failure/cancel. A poisoned\n    /// conn refuses every future write and is never re-gated.\n    poisoned: AtomicBool,\n    /// Latched when the retirement was DEADLINE-driven (watchdog fired, or a\n    /// gate-waiter exhausted its bound) — as opposed to an organic I/O error\n    /// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can\n    /// count the wedge (the W2 stall-evict tally) without conflating it with\n    /// an ordinary disconnect.\n    timed_out: AtomicBool,\n    /// The physical sever ran (exactly once; Windows `DisconnectNamedPipe`).\n    severed: AtomicBool,\n    /// A retired (poisoned) half parks here so its OS handle stays alive\n    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\n    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\n    graveyard: Mutex<Option<SendHalf>>,\n    /// Monotonic per-write op identity (the watchdog cancels a SPECIFIC op).\n    op_seq: AtomicU64,\n    /// The absolute per-write bound (gate-wait + OS write completion).\n    bound: Duration,\n    /// The raw OS handle/fd of the underlying stream, captured at\n    /// construction for the out-of-band abort. The recv and send halves share\n    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\n    /// aborting this handle covers a parked read too. Valid for the whole\n    /// conn lifetime: the half lives in `gate`, a writer's stack, or\n    /// `graveyard` until drop.\n    #[cfg(windows)]\n    raw: isize,\n    #[cfg(unix)]\n    raw: i32,\n}\n\n/// Recover a mutex guard even if a holder panicked — the state these guards\n/// protect is a plain slot/flag pair, valid on every panic boundary.\nfn recover<T>(m: &Mutex<T>) -> MutexGuard<'_, T> {\n    match m.lock() {\n        Ok(g) => g,\n        Err(p) => p.into_inner(),\n    }\n}\n…\nmod win {\n    // kernel32 is in the MSVC default link set — raw externs, no new dep\n    // (the deelevate.rs / daemon.rs posture).\n    extern \"system\" {\n        pub fn CancelIoEx(handle: isize, overlapped: *mut core::ffi::c_void) -> i32;\n        pub fn DisconnectNamedPipe(handle: isize) -> i32;\n    }\n}\n\nimpl Inner {\n    /// The attribution snapshot every lifecycle record carries: stable conn id,\n    /// accreted role/endpoint/session facts, wall + monotonic stamps.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    fn attribution(&self) -> String {\n        let label = recover(&self.label);\n        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\n        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\n    }\n\n    /// Render the once-per-conn retirement record — the F-039 token split\n    /// (leg a): `CONN_WRITE_POISONED` is RESERVED for the deadline class\n    /// (`timed_out` latched — the wedge observable blackhole-controller.ps1\n    /// watches); an ORGANIC write failure (peer death / broken pipe on an\n    /// already-dead counterpart, the offline-peer dial churn) emits the\n    /// distinct `CONN_WRITE_RETIRED` token carrying the error kind and the\n    /// SAME attribution fields — quieter class, never thinner (the retired\n    /// class is what discriminates fresh-carrier churn from interleave\n    /// artifact in the field). Behavior is identical either way: poison,\n    /// abort, retire, never reuse.\n    // [impl->REQ-CONN-POISON-DIAL-SCOPE]\n    fn render_retirement(&self, timed_out: bool, cause: Option<&io::Error>) -> String {\n        if timed_out {\n            format!(\n                \"CONN_WRITE_POISONED: {} — physical broker conn retired: a write \\\n                 exceeded its {}ms bound; in-flight I/O aborted, conn never reused \\\n                 [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\",\n                self.attribution(),\n                self.bound.as_millis()\n            )\n        } else {\n            let cause = match cause {\n                Some(e) => format!(\"{:?}: {e}\", e.kind()),\n                None => \"write failed\".to_string(),\n            };\n            format!(\n                \"CONN_WRITE_RETIRED: {} — organic write failure ({cause}); physical \\\n                 broker conn poisoned + retired, never reused (same retire behavior \\\n                 as POISONED — only the failure class differs) \\\n                 [REQ-CONN-POISON-DIAL-SCOPE]\",\n                self.attribution()\n            )\n        }\n    }\n\n    /// One BOUNDED per-conn lifecycle record (leg d, doyle-confirmed\n    /// UNCONDITIONAL): `write-start` (first write only), `transport-close`\n    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n    /// timeout/cancel leg is the retirement record itself.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    fn lifecycle(&self, event: &str, extra: &str) {\n        let sep = if extra.is_empty() { \"\" } else { \" \" };\n        eprintln!(\n            \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",\n            self.attribution()\n        );\n    }\n\n    /// Abort the connection's in-flight I/O OUT OF BAND (both directions —\n    /// the halves share one OS object) and latch the poison. Idempotent and\n    /// safe to repeat: `CancelIoEx` on a handle with nothing pending is a\n    /// no-op, and re-cancel closes the race where a write was issued a beat\n    /// AFTER a cancel (cancellation only reaches ALREADY-issued ops).\n    /// `cause` (the organic caller's write error) rides the retirement record\n    /// when the retirement is NOT deadline-driven.\n    fn poison_and_cancel(&self, cause: Option<&io::Error>) {\n        if !self.poisoned.swap(true, Ordering::AcqRel) {\n            // First poison of this conn: loud, once. The token is class-split\n            // (F-039 leg a): deadline → CONN_WRITE_POISONED (the wedge\n            // observable), organic fast-fail → CONN_WRITE_RETIRED.\n            eprintln!(\n                \"{}\",\n                self.render_retirement(self.timed_out.load(Ordering::Acquire), cause)\n            );\n        }\n        #[cfg(windows)]\n        // SAFETY: scalar kernel32 call on a handle whose owning half is kept\n        // alive until Drop (gate / writer stack / graveyard — see `raw`).\n        unsafe {\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n        #[cfg(unix)]\n        // SAFETY: scalar shutdown(2) on an fd alive until Drop. SHUT_RDWR\n        // fails the blocked write (EPIPE), EOFs the parked read, and fails\n        // every future op — on Unix this one call IS the whole teardown.\n        unsafe {\n            let _ = libc::shutdown(self.raw, libc::SHUT_RDWR);\n        }\n        // Wake gate-waiters so they observe the poison instead of sleeping\n        // out their full deadline, and the watchdog so it re-evaluates.\n        self.gate_cv.notify_all();\n        self.dog_cv.notify_all();\n    }\n\n    /// Sever the physical connection (exactly once), AFTER the canceled op\n    /// reported completion: on Windows `DisconnectNamedPipe` forces the\n    /// client off (its next access fails), makes a re-issued server-side\n    /// read fail (so `handle_conn` reaches EOF cleanup even if it slipped a\n    /// new read in after the cancel), and defuses the drop-limbo flush; the\n    /// trailing re-cancel covers exactly that slipped-in read. On Unix the\n    /// `shutdown` in [`poison_and_cancel`] already did all of this.\n    // On Unix the cfg(windows) teardown strips out and the idempotence\n    // guard's early `return` becomes the function tail — needless_return\n    // there, load-bearing here. Restructuring (e.g. `if !swapped { … }`)\n    // would leave Unix an empty if-body (`clippy::needless_if`) instead.\n    #[cfg_attr(unix, allow(clippy::needless_return))]\n    fn sever(&self) {\n        if self.severed.swap(true, Ordering::AcqRel) {\n            return;\n        }\n        #[cfg(windows)]\n        // SAFETY: as in poison_and_cancel — handle outlives the watchdog.\n        unsafe {\n            let _ = win::DisconnectNamedPipe(self.raw);\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n    }\n\n    /// The watchdog body: park until a write is in flight, then sleep to its\n    /// absolute deadline. If the op is still in flight at the deadline,\n    /// poison + cancel, re-canceling periodically until the op reports\n    /// completion (the writer clears `inflight` the instant `write_frame`\n    /// returns — that return IS the buffer-release handshake), then sever.\n    fn watchdog(&self) {\n        let mut d = recover(&self.dog);\n        loop {\n            // Park until armed (or shutdown).\n            let (op, deadline) = loop {\n                if d.shutdown {\n                    return;\n                }\n                if let Some(armed) = d.inflight {\n                    break armed;\n                }\n                d = self\n                    .dog_cv\n                    .wait(d)\n                    .unwrap_or_else(|p| p.into_inner());\n            };\n            // Sleep toward the deadline while THIS op stays in flight.\n            let fired = loop {\n                if d.shutdown {\n                    return;\n                }\n                match d.inflight {\n                    Some((cur, _)) if cur == op => {}\n                    // Completed (or a newer op armed) before the deadline.\n                    _ => break false,\n                }\n                let now = Instant::now();\n                if now >= deadline {\n                    break true;\n                }\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, deadline - now)\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n            };\n            if !fired {\n                continue;\n            }\n…\n            while matches!(d.inflight, Some((cur, _)) if cur == op) && !d.shutdown {\n…\n                d = recover(&self.dog);\n            }\n            if d.shutdown {\n                return;\n            }\n            drop(d);\n            self.sever();\n            d = recover(&self.dog);\n        }\n    }\n}\n\n/// The shared, serialized, BOUNDED send side of one physical broker\n/// connection — what [`crate::broker::SharedSend`] now aliases. Owns the\n/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n    inner: Arc<Inner>,\n    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n    /// watchdog aborts through strictly outlives every raw use.\n    dog: Option<JoinHandle<()>>,\n}\n\nimpl BrokerConn {\n    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n    /// deadline (gate-wait + OS write completion) — the broker passes its\n    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n        let raw = raw_of(&half);\n        let inner = Arc::new(Inner {\n            id: CONN_ID_SEQ.fetch_add(1, Ordering::Relaxed) + 1,\n            label: Mutex::new(String::new()),\n            first_write_logged: AtomicBool::new(false),\n            gate: Mutex::new(Gate { half: Some(half) }),\n            gate_cv: Condvar::new(),\n            dog: Mutex::new(Dog {\n                inflight: None,\n                shutdown: false,\n            }),\n            dog_cv: Condvar::new(),\n            poisoned: AtomicBool::new(false),\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n    /// (`Arc::ptr_eq` identity does not survive a log line).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn id(&self) -> u64 {\n        self.inner.id\n    }\n\n    /// Accrete an attribution fact onto this conn's label (subscriber role,\n    /// endpoint/session where known — e.g. `role=brain`,\n    /// `controller session=7 by=cli@host`). Facts accumulate space-separated\n    /// and ride EVERY subsequent lifecycle record for this conn; growth is\n    /// bounded by [`LABEL_CAP`] (one `…` marker, then no-op).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn describe(&self, fact: &str) {\n        let mut l = recover(&self.inner.label);\n        if l.ends_with('…') {\n…\n        }\n…\n    }\n…\n}\n…\nimpl Drop for TestGatePin {\n    fn drop(&mut self) {\n…\n        self.inner.gate_cv.notify_all();\n    }\n}\n\n#[cfg(test)]\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n    io::Error::new(\n        io::ErrorKind::BrokenPipe,\n        \"broker conn poisoned (bounded write retired the physical connection)\",\n    )\n}\n\nfn timeout_err() -> io::Error {\n    io::Error::new(\n        io::ErrorKind::TimedOut,\n        \"broker conn write exceeded its bound (conn poisoned + aborted)\",\n    )\n}","startLine":140,"lineNumbers":[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,null,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,null,392,null,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,null,472,null,481,null,602,null,615,616,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\conn.rs"}}},"isError":false,"timestamp":1784271480534}}
{"type":"message","id":"9a245c6e","parentId":"491762f2","timestamp":"2026-07-17T06:58:00.534Z","message":{"role":"toolResult","toolCallId":"call_O5N8cexk9GX74aCSvwyGgBTo|fc_0a061eb498f0e908016a59d27852b48196bd93b66e0f473c01","toolName":"read","content":[{"type":"text","text":"fn fault_translation_stamped(\n…\n) {\n…\n    fault_translation(faulted, child, why);\n}\n\n/// FAULT a translation binary: mark the session degraded (so inbound delivery\n/// SPOOLS until a working binary and `dispatch_input` stops pinging), log it, and\n/// reap the child. The dispatch path bounded-respawns from this state\n/// (REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH) — idle inbound spools (poll-fed,\n/// never raw-injected) until a respawn lands or the give-up budget is exhausted.\nfn fault_translation(faulted: &AtomicBool, child: &TranslationChild, why: &str) {\n    faulted.store(true, Ordering::Relaxed);\n    eprintln!(\n        \"TRANSLATION_FAULT: {why} — terminating binary; idle messages spool until a respawn or a working binary\"\n    );\n    child.terminate();\n}\n\n/// The broker process kernel. Owns the listening socket, the table of hosted\n/// sessions, and the broker-owned idempotency anchor (B5); holds no logic state\n/// (ADR-0004 §B). The [`EffectJournal`] is a §B resource — the durable\n/// recovery anchor a brain crash must not lose, so it lives in the broker, not\n/// the brain (Spike #6 constraint 1).\npub struct Broker {\n    listener: LocalSocketTransport,\n    /// The namespaced listener name — held so [`Broker::stop`] can dial a throwaway\n    /// connection to unblock the blocked `accept()` in [`serve`](Self::serve) (there is\n    /// no other wakeup for the accept loop).\n    name: String,\n    /// Graceful-stop latch (C1, REQ-HAZARD-DAEMON-STOP-BARRIER teardown-hygiene):\n    /// [`serve`](Self::serve) checks it after each accept and returns. Without it\n    /// `serve` is an unstoppable accept loop, so a test (or any host) that stands a\n    /// broker up leaks the serve thread AND every accepted-conn handler thread at\n    /// teardown — the load population that starved the seed stop barrier.\n    stop: AtomicBool,\n    sessions: Arc<Mutex<HashMap<u64, HostedSession>>>,\n    next_id: AtomicU64,\n    log_cap_chunks: usize,\n    /// The exactly-once anchor for idempotent (`op_id`-carrying) effects.\n    journal: Arc<EffectJournal>,\n    /// The broker-owned net endpoint + live QUIC connections (D4a, ADR-0004 §B).\n    /// Empty when bound without a network host (net-disabled / most tests) OR\n    /// when net is still being brought up (REQ-DAEMON-9 boot-race self-heal):\n    /// a `OnceLock` so the background net-retry can ATTACH the host after bind\n    /// without a relock on the hot effect-dispatch read path (`.get()` is\n    /// lock-free). Settable exactly once — the first host wins.\n    net: std::sync::OnceLock<NetHost>,\n    /// The broker→supervisor planned-restart signal (ADR-0018 D3-3): a\n    /// `KIND_BRAIN_RESTART` handler raises it so the brain supervisor cycles the\n    /// child onto a freshly-swapped binary. Empty on a bare broker (a test broker\n    /// with no supervisor) — the verb is then accepted but unhonored. Set once by\n    /// `Daemon::run` after it spawns the supervisor.\n    brain_restart: std::sync::OnceLock<Arc<crate::brainproc::BrainRestart>>,\n    /// Held meet results for the two-phase join (REQ-JOIN-TWO-PHASE): a\n    /// `session_id → (subnet, real address, 5-min deadline)` between\n    /// [`KIND_PAIR_MEET`] and [`KIND_PAIR_CODE_SUBMIT`]. The code phase dials the\n    /// held address (no re-search); a wrong-code retry keeps the entry. Pairing\n    /// is never journaled (the code must not persist) — in-memory only, and a\n    /// daemon restart simply makes the operator re-run the meet.\n    pair_holds: Mutex<HashMap<u64, PairHold>>,\n    /// In-flight single-flight WAKE claims, keyed by endpoint id (W4,\n    /// REQ-SPAWN-COLLISION-GUARD-LIVE-DUP). The broker is the sole spawner post-W3 (the\n    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n    /// perch-record claim (that would add another info.json writer, the exact\n    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n    /// a duplicate wake for a claimed-or-already-live endpoint stands down (no-op ack).\n    wake_inflight: Mutex<HashSet<String>>,\n    /// Live per-connection handler-thread tally: incremented on [`handle_conn`]\n    /// entry, decremented (RAII, panic-safe) when the handler returns. The\n    /// UPDATE-WEDGE round-4 int gate's observability seam\n    /// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): a poisoned/aborted\n    /// physical conn must drive its handler to EOF cleanup within the write\n    /// bound WITHOUT the client dropping — the test watches this count fall.\n    conn_handlers: AtomicUsize,\n}\n\n/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\nstruct PairHold {\n    subnet: String,\n    addr: EndpointAddr,\n    /// When the wait-for-code window expires (meet + 5 minutes).\n    deadline: Instant,\n}\n\n/// The two-phase join's wait-for-code window: the daemon holds the met address\n/// this long before a code must arrive (ADR-0030 / REQ-JOIN-TWO-PHASE).\nconst PAIR_CODE_WAIT: Duration = Duration::from_secs(5 * 60);\n\n/// Whether a held meet is still within its wait-for-code window\n/// (REQ-JOIN-TWO-PHASE). Pure (the testable core of the timeout).\nfn hold_is_live(deadline: Instant, now: Instant) -> bool {\n    deadline > now\n}\n\n/// Whether a failed code submission should KEEP the held meet for another try\n/// (REQ-JOIN-TWO-PHASE): only a wrong code — the operator re-enters it and the\n/// ceremony re-runs against the same held address (no re-search). Every other\n/// verdict (rate-limited, clock-skew, unknown-subnet, plumbing) is terminal.\nfn fail_keeps_hold(fail: &crate::pairhost::JoinFail) -> bool {\n    matches!(fail, crate::pairhost::JoinFail::WrongCode)\n}\n\n/// Render a [`JoinFail`](crate::pairhost::JoinFail) as the classified\n/// `pair-joined` failure frame the CLI's guided UX reads — single-sourced so the\n/// one-shot join, the meet phase, and the code phase all classify identically.\nfn pair_fail_frame(fail: &crate::pairhost::JoinFail) -> Envelope {\n    use crate::pairhost::JoinFail;\n    let (class, retry) = match fail {\n        JoinFail::NoSeedHolder(_) => (\"no-seed-holder\", None),\n        JoinFail::WrongCode => (\"wrong-code\", None),\n        JoinFail::RateLimited(retry) => (\"rate-limited\", *retry),\n        JoinFail::UnknownSubnet(_) => (\"unknown-subnet\", None),\n        JoinFail::ClockSkew => (\"clock-skew\", None),\n        JoinFail::Other(_) => (\"other\", None),\n    };\n    Envelope::new(\n        KIND_PAIR_JOINED,\n        serde_json::to_value(PairJoinReply {\n            ok: false,\n            class: Some(class.to_string()),\n            retry_after_secs: retry,\n            detail: fail.to_string(),\n        })\n        .expect(\"PairJoinReply serializes\"),\n    )\n}\n\n/// The distinct `(endpoint, install_dir)` pairs whose session runs `adapter`,\n/// from per-session `(endpoint, adapter, install_dir)` rows. Sessions with no\n/// recorded install dir are dropped (a live update needs a target). Pure (no\n/// lock, no I/O) so the live-update endpoint-selection is unit-testable without\n/// constructing real `HostedSession`s. (W3a, ADR-0025)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn select_endpoints_running_adapter(\n    rows: impl IntoIterator<Item = (String, String, Option<std::path::PathBuf>)>,\n    adapter: &str,\n) -> Vec<(String, std::path::PathBuf)> {\n    let mut out: Vec<(String, std::path::PathBuf)> = rows\n        .into_iter()\n        .filter_map(|(endpoint, adp, dir)| {\n            // Parent-match: a profile-composite `<adapter>:<profile>` session belongs\n            // to the update's parent record name (F015B — no exact-match skew).\n            spt_runtime::profile::adapter_parent_matches(&adp, adapter)\n                .then_some(dir.map(|d| (endpoint, d)))?\n        })\n        .collect();\n    out.sort();\n    out.dedup();\n    out\n}\n\nimpl Broker {\n    /// Bind the broker's listening endpoint at the namespaced `name`, with the\n    /// effect journal at the default path (`<spt_home>/daemon-effects.log`).\n    pub fn bind(name: &str) -> io::Result<Arc<Self>> {\n        Self::bind_in(name, default_journal_path())\n    }\n\n    /// Bind with an explicit effect-journal path — the testable seam (tests point\n    /// the broker-owned anchor at a temp file rather than the shared home).\n    pub fn bind_in(name: &str, journal_path: std::path::PathBuf) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net(name, journal_path, None)\n    }\n\n    /// Bind with an already-started broker-owned network host (D4a). Taking the\n    /// host (not its config) keeps a net bind failure separable from a listener\n    /// bind failure — the daemon degrades to a net-less broker rather than\n    /// losing PTY hosting (see `Daemon::run`).\n    // [impl->REQ-DAEMON-2]\n    pub fn bind_in_with_net(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n    ) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net_cap(name, journal_path, net, DEFAULT_LOG_CHUNKS)\n    }\n\n    /// [`bind_in_with_net`](Self::bind_in_with_net) with an explicit output-log\n    /// ring cap (the per-session eviction bound). Production binds at\n    /// [`DEFAULT_LOG_CHUNKS`]; the restoration D4-2 resume harness binds a **tiny**\n    /// cap to force ring eviction and exercise the post-eviction floor clamp (a\n    /// `resume_seq` below the surviving ring floor must resume forward, losing only\n    /// the evicted tail — never gap-erroring the live stream).\n    pub fn bind_in_with_net_cap(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n        log_cap_chunks: usize,\n    ) -> io::Result<Arc<Self>> {\n        let net_cell = std::sync::OnceLock::new();\n        if let Some(host) = net {\n            let _ = net_cell.set(host);\n        }\n        Ok(Arc::new(Broker {\n            listener: LocalSocketTransport::bind(name)?,\n            name: name.to_string(),\n            stop: AtomicBool::new(false),\n            sessions: Arc::new(Mutex::new(HashMap::new())),\n            next_id: AtomicU64::new(1),\n            log_cap_chunks,\n            journal: Arc::new(EffectJournal::open(journal_path)?),\n            net: net_cell,\n            brain_restart: std::sync::OnceLock::new(),\n            pair_holds: Mutex::new(HashMap::new()),\n            wake_inflight: Mutex::new(HashSet::new()),\n            conn_handlers: AtomicUsize::new(0),\n        }))\n    }\n\n    /// Wire the brain supervisor's planned-restart signal (ADR-0018 D3-3) so the\n    /// `KIND_BRAIN_RESTART` verb can drive a real brain-process restart. Called\n    /// once by `Daemon::run` after spawning the supervisor; idempotent by\n    /// `OnceLock` (the first wins). A broker without it accepts the verb but\n    /// reports `honored: false` (no supervisor to respawn the child).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn set_brain_restart(&self, signal: Arc<crate::brainproc::BrainRestart>) -> bool {\n        self.brain_restart.set(signal).is_ok()\n    }\n\n    /// Attach a network host to a broker that was bound net-less (REQ-DAEMON-9):\n    /// the boot-race self-heal path calls this once the background retry brings\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n    /// Idempotent by `OnceLock` — a second attach is a no-op returning `false`\n    /// (the first host wins); the hot read path (`net()`) never blocks on it.\n    // [impl->REQ-DAEMON-9]\n    pub fn attach_net(&self, host: NetHost) -> bool {\n        self.net.set(host).is_ok()\n    }\n\n    /// The broker-owned exactly-once anchor (for introspection / tests).\n    pub fn journal(&self) -> &Arc<EffectJournal> {\n        &self.journal\n    }\n\n    /// The broker-owned network host, if one is attached (at bind or via the\n    /// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.\n    pub fn net(&self) -> Option<&NetHost> {\n        self.net.get()\n    }\n\n    /// Accept connections forever, handling each on its own thread. The broker\n    /// is the long-lived process; this is its main loop. Per-connection\n    /// threading is half the KH 7.4 isolation stance: one brain's blocking\n    /// dispatch can never stall another's (the per-session half is\n    /// [`Broker::dispatch_spawn`]'s drain/waiter threads).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n        loop {\n            let conn = self.listener.accept()?;\n            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n            // throwaway connection that woke this accept — observe it and return so the\n            // serve thread (and, with it, the listener) tears down instead of leaking.\n            if self.stop.load(Ordering::Acquire) {\n                return Ok(());\n            }\n            let me = Arc::clone(self);\n            thread::spawn(move || {\n                let _ = me.handle_conn(conn);\n            });\n        }\n    }\n\n    /// Gracefully stop the [`serve`](Self::serve) accept loop: raise the latch, then\n    /// dial one throwaway connection so the blocked `accept()` wakes, observes the\n    /// latch, and returns (dropping the listener). Best-effort + idempotent — a second\n    /// call, or a call after the loop already exited, just fails the dial harmlessly.\n    /// Fills the honest gap that `serve` is otherwise unstoppable (the leaked-serve\n    /// load that starved the seed stop barrier — REQ-HAZARD-DAEMON-STOP-BARRIER).\n    // [impl->REQ-HAZARD-DAEMON-STOP-BARRIER]\n    pub fn stop(&self) {\n        self.stop.store(true, Ordering::Release);\n        let _ = LocalSocketTransport::connect(&self.name);\n    }\n\n    /// Accept exactly one connection and handle it on a spawned thread, returning\n    /// that thread's handle. The single-brain entry point the tests exercise.\n    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n        let conn = self.listener.accept()?;\n        let me = Arc::clone(self);\n        Ok(thread::spawn(move || {\n            let _ = me.handle_conn(conn);\n        }))\n    }\n\n    /// Number of currently hosted sessions (for tests / introspection).\n    pub fn session_count(&self) -> usize {\n        recover(&self.sessions).len()\n    }\n\n    /// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling\n    /// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-\n    /// wedged LOCAL controller (`by: None`) on hosted session `id` — a sink\n    /// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and\n    /// whose writer thread only drains its channel (it NEVER calls\n    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical\n    /// bound cannot clear the injected wedge). Lets an integration rig\n    /// exercise the REQ-UPDATE-PROMOTE-DRAINED gate DECISION in isolation —\n    /// the physical bound itself is `brain_decouple.rs`'s concern. The wedge\n    /// drains through the REAL logical paths (a take's `stall_evict_controller`\n    /// or a `KIND_SESSIONS` reap), exactly like a production stall-evict.\n    /// Returns false if the session doesn't exist or the seed can't be built.\n    /// `#[doc(hidden)]` — test support, not a product surface.\n…\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n                KIND_STALL_EVICTS => self.dispatch_stall_evicts(&send),\n                KIND_NET_DIAL => {\n                    if let Err(msg) = self.dispatch_net_dial(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_DIAL_LOOPBACK => {\n                    if let Err(msg) = self.dispatch_net_dial_loopback(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-PUMP-PEER-ISOLATION]\n                KIND_NET_DIAL_SUBMIT => {\n                    if let Err(msg) = self.dispatch_net_dial_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_JOIN => {\n                    if let Err(msg) = self.dispatch_pair_join(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_MEET => {\n                    if let Err(msg) = self.dispatch_pair_meet(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_CODE_SUBMIT => {\n                    if let Err(msg) = self.dispatch_pair_code_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPEN => {\n                    if let Err(msg) = self.dispatch_net_stream_open(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SEND => {\n                    if let Err(msg) = self.dispatch_net_stream_send(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n…\n            }\n        }\n…\n    }\n…\n}"}],"details":{"displayContent":{"text":"fn fault_translation_stamped(\n…\n) {\n…\n    fault_translation(faulted, child, why);\n}\n\n/// FAULT a translation binary: mark the session degraded (so inbound delivery\n/// SPOOLS until a working binary and `dispatch_input` stops pinging), log it, and\n/// reap the child. The dispatch path bounded-respawns from this state\n/// (REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH) — idle inbound spools (poll-fed,\n/// never raw-injected) until a respawn lands or the give-up budget is exhausted.\nfn fault_translation(faulted: &AtomicBool, child: &TranslationChild, why: &str) {\n    faulted.store(true, Ordering::Relaxed);\n    eprintln!(\n        \"TRANSLATION_FAULT: {why} — terminating binary; idle messages spool until a respawn or a working binary\"\n    );\n    child.terminate();\n}\n\n/// The broker process kernel. Owns the listening socket, the table of hosted\n/// sessions, and the broker-owned idempotency anchor (B5); holds no logic state\n/// (ADR-0004 §B). The [`EffectJournal`] is a §B resource — the durable\n/// recovery anchor a brain crash must not lose, so it lives in the broker, not\n/// the brain (Spike #6 constraint 1).\npub struct Broker {\n    listener: LocalSocketTransport,\n    /// The namespaced listener name — held so [`Broker::stop`] can dial a throwaway\n    /// connection to unblock the blocked `accept()` in [`serve`](Self::serve) (there is\n    /// no other wakeup for the accept loop).\n    name: String,\n    /// Graceful-stop latch (C1, REQ-HAZARD-DAEMON-STOP-BARRIER teardown-hygiene):\n    /// [`serve`](Self::serve) checks it after each accept and returns. Without it\n    /// `serve` is an unstoppable accept loop, so a test (or any host) that stands a\n    /// broker up leaks the serve thread AND every accepted-conn handler thread at\n    /// teardown — the load population that starved the seed stop barrier.\n    stop: AtomicBool,\n    sessions: Arc<Mutex<HashMap<u64, HostedSession>>>,\n    next_id: AtomicU64,\n    log_cap_chunks: usize,\n    /// The exactly-once anchor for idempotent (`op_id`-carrying) effects.\n    journal: Arc<EffectJournal>,\n    /// The broker-owned net endpoint + live QUIC connections (D4a, ADR-0004 §B).\n    /// Empty when bound without a network host (net-disabled / most tests) OR\n    /// when net is still being brought up (REQ-DAEMON-9 boot-race self-heal):\n    /// a `OnceLock` so the background net-retry can ATTACH the host after bind\n    /// without a relock on the hot effect-dispatch read path (`.get()` is\n    /// lock-free). Settable exactly once — the first host wins.\n    net: std::sync::OnceLock<NetHost>,\n    /// The broker→supervisor planned-restart signal (ADR-0018 D3-3): a\n    /// `KIND_BRAIN_RESTART` handler raises it so the brain supervisor cycles the\n    /// child onto a freshly-swapped binary. Empty on a bare broker (a test broker\n    /// with no supervisor) — the verb is then accepted but unhonored. Set once by\n    /// `Daemon::run` after it spawns the supervisor.\n    brain_restart: std::sync::OnceLock<Arc<crate::brainproc::BrainRestart>>,\n    /// Held meet results for the two-phase join (REQ-JOIN-TWO-PHASE): a\n    /// `session_id → (subnet, real address, 5-min deadline)` between\n    /// [`KIND_PAIR_MEET`] and [`KIND_PAIR_CODE_SUBMIT`]. The code phase dials the\n    /// held address (no re-search); a wrong-code retry keeps the entry. Pairing\n    /// is never journaled (the code must not persist) — in-memory only, and a\n    /// daemon restart simply makes the operator re-run the meet.\n    pair_holds: Mutex<HashMap<u64, PairHold>>,\n    /// In-flight single-flight WAKE claims, keyed by endpoint id (W4,\n    /// REQ-SPAWN-COLLISION-GUARD-LIVE-DUP). The broker is the sole spawner post-W3 (the\n    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n    /// perch-record claim (that would add another info.json writer, the exact\n    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n    /// a duplicate wake for a claimed-or-already-live endpoint stands down (no-op ack).\n    wake_inflight: Mutex<HashSet<String>>,\n    /// Live per-connection handler-thread tally: incremented on [`handle_conn`]\n    /// entry, decremented (RAII, panic-safe) when the handler returns. The\n    /// UPDATE-WEDGE round-4 int gate's observability seam\n    /// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): a poisoned/aborted\n    /// physical conn must drive its handler to EOF cleanup within the write\n    /// bound WITHOUT the client dropping — the test watches this count fall.\n    conn_handlers: AtomicUsize,\n}\n\n/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\nstruct PairHold {\n    subnet: String,\n    addr: EndpointAddr,\n    /// When the wait-for-code window expires (meet + 5 minutes).\n    deadline: Instant,\n}\n\n/// The two-phase join's wait-for-code window: the daemon holds the met address\n/// this long before a code must arrive (ADR-0030 / REQ-JOIN-TWO-PHASE).\nconst PAIR_CODE_WAIT: Duration = Duration::from_secs(5 * 60);\n\n/// Whether a held meet is still within its wait-for-code window\n/// (REQ-JOIN-TWO-PHASE). Pure (the testable core of the timeout).\nfn hold_is_live(deadline: Instant, now: Instant) -> bool {\n    deadline > now\n}\n\n/// Whether a failed code submission should KEEP the held meet for another try\n/// (REQ-JOIN-TWO-PHASE): only a wrong code — the operator re-enters it and the\n/// ceremony re-runs against the same held address (no re-search). Every other\n/// verdict (rate-limited, clock-skew, unknown-subnet, plumbing) is terminal.\nfn fail_keeps_hold(fail: &crate::pairhost::JoinFail) -> bool {\n    matches!(fail, crate::pairhost::JoinFail::WrongCode)\n}\n\n/// Render a [`JoinFail`](crate::pairhost::JoinFail) as the classified\n/// `pair-joined` failure frame the CLI's guided UX reads — single-sourced so the\n/// one-shot join, the meet phase, and the code phase all classify identically.\nfn pair_fail_frame(fail: &crate::pairhost::JoinFail) -> Envelope {\n    use crate::pairhost::JoinFail;\n    let (class, retry) = match fail {\n        JoinFail::NoSeedHolder(_) => (\"no-seed-holder\", None),\n        JoinFail::WrongCode => (\"wrong-code\", None),\n        JoinFail::RateLimited(retry) => (\"rate-limited\", *retry),\n        JoinFail::UnknownSubnet(_) => (\"unknown-subnet\", None),\n        JoinFail::ClockSkew => (\"clock-skew\", None),\n        JoinFail::Other(_) => (\"other\", None),\n    };\n    Envelope::new(\n        KIND_PAIR_JOINED,\n        serde_json::to_value(PairJoinReply {\n            ok: false,\n            class: Some(class.to_string()),\n            retry_after_secs: retry,\n            detail: fail.to_string(),\n        })\n        .expect(\"PairJoinReply serializes\"),\n    )\n}\n\n/// The distinct `(endpoint, install_dir)` pairs whose session runs `adapter`,\n/// from per-session `(endpoint, adapter, install_dir)` rows. Sessions with no\n/// recorded install dir are dropped (a live update needs a target). Pure (no\n/// lock, no I/O) so the live-update endpoint-selection is unit-testable without\n/// constructing real `HostedSession`s. (W3a, ADR-0025)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn select_endpoints_running_adapter(\n    rows: impl IntoIterator<Item = (String, String, Option<std::path::PathBuf>)>,\n    adapter: &str,\n) -> Vec<(String, std::path::PathBuf)> {\n    let mut out: Vec<(String, std::path::PathBuf)> = rows\n        .into_iter()\n        .filter_map(|(endpoint, adp, dir)| {\n            // Parent-match: a profile-composite `<adapter>:<profile>` session belongs\n            // to the update's parent record name (F015B — no exact-match skew).\n            spt_runtime::profile::adapter_parent_matches(&adp, adapter)\n                .then_some(dir.map(|d| (endpoint, d)))?\n        })\n        .collect();\n    out.sort();\n    out.dedup();\n    out\n}\n\nimpl Broker {\n    /// Bind the broker's listening endpoint at the namespaced `name`, with the\n    /// effect journal at the default path (`<spt_home>/daemon-effects.log`).\n    pub fn bind(name: &str) -> io::Result<Arc<Self>> {\n        Self::bind_in(name, default_journal_path())\n    }\n\n    /// Bind with an explicit effect-journal path — the testable seam (tests point\n    /// the broker-owned anchor at a temp file rather than the shared home).\n    pub fn bind_in(name: &str, journal_path: std::path::PathBuf) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net(name, journal_path, None)\n    }\n\n    /// Bind with an already-started broker-owned network host (D4a). Taking the\n    /// host (not its config) keeps a net bind failure separable from a listener\n    /// bind failure — the daemon degrades to a net-less broker rather than\n    /// losing PTY hosting (see `Daemon::run`).\n    // [impl->REQ-DAEMON-2]\n    pub fn bind_in_with_net(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n    ) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net_cap(name, journal_path, net, DEFAULT_LOG_CHUNKS)\n    }\n\n    /// [`bind_in_with_net`](Self::bind_in_with_net) with an explicit output-log\n    /// ring cap (the per-session eviction bound). Production binds at\n    /// [`DEFAULT_LOG_CHUNKS`]; the restoration D4-2 resume harness binds a **tiny**\n    /// cap to force ring eviction and exercise the post-eviction floor clamp (a\n    /// `resume_seq` below the surviving ring floor must resume forward, losing only\n    /// the evicted tail — never gap-erroring the live stream).\n    pub fn bind_in_with_net_cap(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n        log_cap_chunks: usize,\n    ) -> io::Result<Arc<Self>> {\n        let net_cell = std::sync::OnceLock::new();\n        if let Some(host) = net {\n            let _ = net_cell.set(host);\n        }\n        Ok(Arc::new(Broker {\n            listener: LocalSocketTransport::bind(name)?,\n            name: name.to_string(),\n            stop: AtomicBool::new(false),\n            sessions: Arc::new(Mutex::new(HashMap::new())),\n            next_id: AtomicU64::new(1),\n            log_cap_chunks,\n            journal: Arc::new(EffectJournal::open(journal_path)?),\n            net: net_cell,\n            brain_restart: std::sync::OnceLock::new(),\n            pair_holds: Mutex::new(HashMap::new()),\n            wake_inflight: Mutex::new(HashSet::new()),\n            conn_handlers: AtomicUsize::new(0),\n        }))\n    }\n\n    /// Wire the brain supervisor's planned-restart signal (ADR-0018 D3-3) so the\n    /// `KIND_BRAIN_RESTART` verb can drive a real brain-process restart. Called\n    /// once by `Daemon::run` after spawning the supervisor; idempotent by\n    /// `OnceLock` (the first wins). A broker without it accepts the verb but\n    /// reports `honored: false` (no supervisor to respawn the child).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn set_brain_restart(&self, signal: Arc<crate::brainproc::BrainRestart>) -> bool {\n        self.brain_restart.set(signal).is_ok()\n    }\n\n    /// Attach a network host to a broker that was bound net-less (REQ-DAEMON-9):\n    /// the boot-race self-heal path calls this once the background retry brings\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n    /// Idempotent by `OnceLock` — a second attach is a no-op returning `false`\n    /// (the first host wins); the hot read path (`net()`) never blocks on it.\n    // [impl->REQ-DAEMON-9]\n    pub fn attach_net(&self, host: NetHost) -> bool {\n        self.net.set(host).is_ok()\n    }\n\n    /// The broker-owned exactly-once anchor (for introspection / tests).\n    pub fn journal(&self) -> &Arc<EffectJournal> {\n        &self.journal\n    }\n\n    /// The broker-owned network host, if one is attached (at bind or via the\n    /// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.\n    pub fn net(&self) -> Option<&NetHost> {\n        self.net.get()\n    }\n\n    /// Accept connections forever, handling each on its own thread. The broker\n    /// is the long-lived process; this is its main loop. Per-connection\n    /// threading is half the KH 7.4 isolation stance: one brain's blocking\n    /// dispatch can never stall another's (the per-session half is\n    /// [`Broker::dispatch_spawn`]'s drain/waiter threads).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n        loop {\n            let conn = self.listener.accept()?;\n            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n            // throwaway connection that woke this accept — observe it and return so the\n            // serve thread (and, with it, the listener) tears down instead of leaking.\n            if self.stop.load(Ordering::Acquire) {\n                return Ok(());\n            }\n            let me = Arc::clone(self);\n            thread::spawn(move || {\n                let _ = me.handle_conn(conn);\n            });\n        }\n    }\n\n    /// Gracefully stop the [`serve`](Self::serve) accept loop: raise the latch, then\n    /// dial one throwaway connection so the blocked `accept()` wakes, observes the\n    /// latch, and returns (dropping the listener). Best-effort + idempotent — a second\n    /// call, or a call after the loop already exited, just fails the dial harmlessly.\n    /// Fills the honest gap that `serve` is otherwise unstoppable (the leaked-serve\n    /// load that starved the seed stop barrier — REQ-HAZARD-DAEMON-STOP-BARRIER).\n    // [impl->REQ-HAZARD-DAEMON-STOP-BARRIER]\n    pub fn stop(&self) {\n        self.stop.store(true, Ordering::Release);\n        let _ = LocalSocketTransport::connect(&self.name);\n    }\n\n    /// Accept exactly one connection and handle it on a spawned thread, returning\n    /// that thread's handle. The single-brain entry point the tests exercise.\n    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n        let conn = self.listener.accept()?;\n        let me = Arc::clone(self);\n        Ok(thread::spawn(move || {\n            let _ = me.handle_conn(conn);\n        }))\n    }\n\n    /// Number of currently hosted sessions (for tests / introspection).\n    pub fn session_count(&self) -> usize {\n        recover(&self.sessions).len()\n    }\n\n    /// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling\n    /// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-\n    /// wedged LOCAL controller (`by: None`) on hosted session `id` — a sink\n    /// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and\n    /// whose writer thread only drains its channel (it NEVER calls\n    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical\n    /// bound cannot clear the injected wedge). Lets an integration rig\n    /// exercise the REQ-UPDATE-PROMOTE-DRAINED gate DECISION in isolation —\n    /// the physical bound itself is `brain_decouple.rs`'s concern. The wedge\n    /// drains through the REAL logical paths (a take's `stall_evict_controller`\n    /// or a `KIND_SESSIONS` reap), exactly like a production stall-evict.\n    /// Returns false if the session doesn't exist or the seed can't be built.\n    /// `#[doc(hidden)]` — test support, not a product surface.\n…\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n                KIND_STALL_EVICTS => self.dispatch_stall_evicts(&send),\n                KIND_NET_DIAL => {\n                    if let Err(msg) = self.dispatch_net_dial(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_DIAL_LOOPBACK => {\n                    if let Err(msg) = self.dispatch_net_dial_loopback(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-PUMP-PEER-ISOLATION]\n                KIND_NET_DIAL_SUBMIT => {\n                    if let Err(msg) = self.dispatch_net_dial_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_JOIN => {\n                    if let Err(msg) = self.dispatch_pair_join(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_MEET => {\n                    if let Err(msg) = self.dispatch_pair_meet(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_CODE_SUBMIT => {\n                    if let Err(msg) = self.dispatch_pair_code_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPEN => {\n                    if let Err(msg) = self.dispatch_net_stream_open(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SEND => {\n                    if let Err(msg) = self.dispatch_net_stream_send(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n…\n            }\n        }\n…\n    }\n…\n}","startLine":2533,"lineNumbers":[2533,null,2538,null,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,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,null,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,null,3258,3259,null,3289,null,4579]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271480534}}
{"type":"message","id":"c314fbc4","parentId":"9a245c6e","timestamp":"2026-07-17T06:58:00.563Z","message":{"role":"toolResult","toolCallId":"call_U7ur19OzK4b90OelhqnvrRm2|fc_0a061eb498f0e908016a59d27852c081969bde39892fcc1e9c","toolName":"read","content":[{"type":"text","text":"/// either, but only a POISON (real write failure on the conn) cancels the\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum SeatFail {\n    /// The writer thread died on a failed conn write (the 15s bounded-write\n    /// poison class) — halt-at-first-failure already happened writer-side.\n    Poisoned,\n    /// The bounded queue is full — the subscriber cannot keep up.\n    Overflow,\n}\n\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\n///\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\n/// sender — the writer drains what it holds and exits.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\nstruct SubscriberSeat {\n    sub: SharedSend,\n    tx: std::sync::mpsc::SyncSender<Envelope>,\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n    /// and a replacement may install (the no-reinstall-until-gone rule,\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\n    done: Arc<std::sync::atomic::AtomicBool>,\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\n}\n\nimpl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n                    writer_done.store(true, Ordering::Release);\n                    return;\n                }\n            }\n            // Then live frames, same halt discipline.\n            while let Ok(frame) = rx.recv() {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"live write failed\");\n                    break;\n                }\n            }\n            writer_done.store(true, Ordering::Release);\n        });\n        SubscriberSeat {\n            sub,\n            tx,\n            done,\n            poisoned,\n        }\n    }\n\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\n    /// push). `Err` means the seat must be removed.\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\n        if self.poisoned.load(Ordering::Acquire) {\n            return Err(SeatFail::Poisoned);\n        }\n        match self.tx.try_send(frame) {\n            Ok(()) => Ok(()),\n            Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),\n            Err(std::sync::mpsc::TrySendError::Disconnected(_)) => Err(SeatFail::Poisoned),\n        }\n    }\n\n    /// Whether this seat belongs to `sub` (detach correlation).\n    fn is(&self, sub: &SharedSend) -> bool {\n        Arc::ptr_eq(&self.sub, sub)\n    }\n\n    /// Whether the writer thread has fully exited — the reinstall gate.\n    fn gone(&self) -> bool {\n        self.done.load(Ordering::Acquire)\n    }\n}\n\n/// A stream's serve lease (ADR-0038 Amendment fix 4; built here so the\n/// DAEMON-LIFECYCLE C2 work consumes it rather than growing a second\n/// mechanism): canceled when the stream's subscriber seat POISONS, which\n/// makes every later `send_stream` on the stream refuse — the paired\n/// serve/wire worker discovers the cancellation at its next forward and\n/// terminates instead of feeding an orphan leg forever.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Default)]\npub struct StreamLease {\n    canceled: std::sync::atomic::AtomicBool,\n}\n\nimpl StreamLease {\n    /// Cancel the lease (subscriber poison; C2 will add its own callers).\n    pub fn cancel(&self) {\n        self.canceled.store(true, Ordering::Release);\n    }\n\n    /// Whether the lease was canceled.\n    pub fn is_canceled(&self) -> bool {\n        self.canceled.load(Ordering::Acquire)\n    }\n}\n\n/// Restart-durable opener capture (ADR-0038 B, REQ-STREAM-OPENER-DURABLE):\n/// the stream's complete first NDJSON line, pinned OUTSIDE the evictable data\n/// ring and held until the stream row goes away. Recovery classifies from\n…\nimpl DialPlan {\n…\n    async fn connect(self, addr: EndpointAddr, stage: &DialStage) -> io::Result<(u64, String)> {\n…\n        let proven = match self.membership {\n            Some(src) => {\n…\n                prove_membership(\n…\n                .await\n                .ok_or_else(|| {\n                    io::Error::other(\"seed-proof failed: peer is not a subnet member\")\n                })?\n            }\n            None => HashSet::new(),\n        };\n        Ok(register_conn(&self.shared, conn, proven))\n    }\n}\n\n// Local alias so the stage constants read namespaced at the use sites without\n// a wildcard import.\nuse crate::seedproofx as spt_seedproof_stage;\nuse crate::seedproofx::DialStage;\n\nfn register_conn(\n    shared: &Arc<NetShared>,\n    conn: Connection,\n    proven_subnets: HashSet<String>,\n) -> (u64, String) {\n    let remote_id_hex = PublicKey::from_bytes(conn.remote_id().as_bytes())\n        .expect(\"an iroh EndpointId is always a valid ed25519 public key\")\n        .to_hex();\n    let id = shared.next_conn_id.fetch_add(1, Ordering::Relaxed);\n    shared.conns.lock().unwrap().insert(\n        id,\n        ConnEntry {\n            kind: ConnKind::Quic(conn.clone()),\n            remote_id_hex: remote_id_hex.clone(),\n            proven_subnets,\n        },\n    );\n\n    // Presence: announce the row BEFORE spawning the closed-watcher, so the\n    // `connected` event can never race behind its own `disconnected` (D4c). The\n    // event carries the OBSERVED remote addr (REQ-CONV-1 seed write-back) so a\n    // non-blocking submit-dial seeds `peer-addrs.json` like the blocking reply\n    // did (id-only / path-less → `null`, nothing worth seeding).\n    let observed = observed_addr_json(&conn);\n    shared\n        .presence\n        .lock()\n        .unwrap()\n        .append_connected(id, &remote_id_hex, observed);\n\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\n    // close, conn loss, or our own endpoint close), removes the row — conns\n    // finally LEAVE the table — then appends the `disconnected` event (row\n    // gone before the event is observable).\n    // [impl->REQ-EP-4]\n    let sh_close = Arc::clone(shared);\n    let conn_close = conn.clone();\n    let hex_close = remote_id_hex.clone();\n    tokio::spawn(async move {\n        conn_close.closed().await;\n        sh_close.conns.lock().unwrap().remove(&id);\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n        // — nothing can ever be served on them again, and leaving them makes\n        // every future dispatcher generation replay them (the control-steal\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\n        // else reads a dead conn's stream ring.\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n        sh_close\n            .streams\n            .lock()\n            .unwrap()\n            .retain(|_, e| e.conn_id != id);\n        sh_close\n            .presence\n            .lock()\n            .unwrap()\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\n    });\n\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n    let hex = remote_id_hex.clone();\n    tokio::spawn(async move {\n        while let Ok((send, recv)) = conn.accept_bi().await {\n            register_stream(\n                &sh,\n                id,\n                &hex,\n                SendHalf::Quic(send),\n                RecvHalf::Quic(recv),\n                false,\n            );\n        }\n    });\n\n    (id, remote_id_hex)\n}\n\n/// Register a live stream (opened or accepted): mint its broker id and spawn\n/// its read pump. Must run inside the host's runtime context.\n/// `initiated_locally` records the direction fact for the table (true only\n/// from [`NetHost::open_stream`]).\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n\n/// Backpressure gate for a retentive (tunnel) read pump: park until the undrained\n/// ring has room below `retentive_cap`, woken by a `drain` on `room`. A no-op for\n/// an ordinary stream (`retentive_cap == 0`). Holds no lock across the await.\n// [impl->REQ-SHELL-4]\nasync fn await_ring_room(log: &Arc<Mutex<StreamLog>>, room: &tokio::sync::Notify) {\n    loop {\n        {\n            let l = log.lock().unwrap();\n            if l.retentive_cap == 0 || l.ring.len() < l.retentive_cap {\n                return;\n            }\n        }\n        room.notified().await;\n    }\n}\n\n/// The broker-owned net endpoint + live connection/stream tables (see module\n/// docs).\npub struct NetHost {\n…\n}\n…\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n        let endpoint = runtime\n            .block_on(NetEndpoint::bind_scoped(\n                &cfg.identity,\n                cfg.relay.clone(),\n                cfg.discovery,\n                vec![\n                    SPT_NET_ALPN.to_vec(),\n                    spt_net::net::pairing::wire::SPT_PAIR_ALPN.to_vec(),\n                ],\n                cfg.scope,\n            ))\n            .map_err(|e| io::Error::other(e.to_string()))?;\n        let endpoint = Arc::new(endpoint);\n        let shared = Arc::new(NetShared::new());\n        let local_pub = cfg.identity.public_key();\n        let pair_rate = Arc::new(tokio::sync::Mutex::new(\n            spt_net::net::pairing::ratelimit::PairingRateLimiter::new(),\n        ));\n\n        // Accept loop: lives for the endpoint's lifetime on the host's runtime.\n        // Each handshake completes on its own task so a slow peer can't stall\n        // the loop; a failed handshake is simply not registered. The pairing\n        // ALPN routes to the responder; everything else is the trusted table.\n        let roster = Arc::new(Mutex::new(None::<RosterExchange>));\n        let ep = Arc::clone(&endpoint);\n        let sh = Arc::clone(&shared);\n        let rate = Arc::clone(&pair_rate);\n        let accept_membership = cfg.membership.clone();\n        let accept_roster = Arc::clone(&roster);\n        let accept_ep = Arc::clone(&endpoint);\n        runtime.spawn(async move {\n            while let Some(incoming) = ep.accept().await {\n                let sh = Arc::clone(&sh);\n                let rate = Arc::clone(&rate);\n                let membership = accept_membership.clone();\n                // Snapshot the (opt-in) roster exchange + our live address for\n                // this connect; the leg runs after the proof verifies.\n                let roster_rx = accept_roster.lock().unwrap().clone();\n                let self_addr =\n                    serde_json::to_value(accept_ep.addr()).unwrap_or(serde_json::Value::Null);\n                tokio::spawn(async move {\n                    let Ok(connecting) = incoming.accept() else {\n                        return;\n                    };\n                    let Ok(conn) = connecting.await else { return };\n                    if conn.alpn() == spt_net::net::pairing::wire::SPT_PAIR_ALPN {\n                        crate::pairhost::respond(conn, local_pub, rate).await;\n                    } else {\n                        // Mesh-D2: prove membership in-band BEFORE the connection\n                        // joins the table. A non-prover (no shared subnet / bad\n                        // seed) is dropped — the conn falls out of scope and QUIC\n                        // closes it. With membership disabled, register as before.\n                        // Mesh-D4: on success, a roster leg rides the same stream.\n                        let proven = match membership {\n                            Some(src) => {\n                                let creds = src();\n                                match prove_membership(\n                                    &conn,\n                                    local_pub,\n                                    ProofRole::Acceptor,\n                                    &creds,\n                                    roster_rx.as_ref(),\n                                    &self_addr,\n                                    &DialStage::new(), // accept side: stage untracked\n                                )\n                                .await\n                                {\n                                    Some(set) => set,\n                                    None => return, // drop the connection\n                                }\n                            }\n                            None => HashSet::new(),\n                        };\n                        register_conn(&sh, conn, proven);\n                    }\n                });\n            }\n        });\n\n        // The meet-rotation loop (M7 D3): how a joiner that knows only\n        // (subnet name, code) finds this responder. Idles with no subnets.\n        crate::pairhost::spawn_meet_rotation(\n            runtime.handle(),\n            Arc::clone(&endpoint),\n            cfg.relay,\n            cfg.discovery,\n            cfg.scope,\n        );\n\n        // The limiter Arc lives on in the accept loop; the host keeps no\n        // handle (per-ceremony state is the responder's, not the table's).\n        drop(pair_rate);\n\n        // DIAGNOSTIC (UPDATE-WEDGE round-3): the reactor-liveness canary. Stamps\n        // epoch-ms every ~25ms FROM the 2-worker runtime, so a starved runtime\n        // (workers monopolized by non-yielding dead-peer connects) shows as a\n        // stale stamp. Throwaway probe — no REQ, gated by nothing (cheap store).\n        let net_canary_tick_ms = Arc::new(AtomicU64::new(epoch_ms()));\n        let canary = Arc::clone(&net_canary_tick_ms);\n        runtime.spawn(async move {\n            let mut ivl = tokio::time::interval(Duration::from_millis(25));\n            loop {\n                ivl.tick().await;\n                canary.store(epoch_ms(), Ordering::Relaxed);\n            }\n        });\n\n        Ok(NetHost {\n            runtime,\n            endpoint,\n            shared,\n            dial_ops: Mutex::new(HashMap::new()),\n            stream_ops: Mutex::new(HashMap::new()),\n            local_id: local_pub,\n            membership: cfg.membership,\n            roster,\n            loopback_conn: Mutex::new(None),\n            loopback_pair_lock: Mutex::new(()),\n            quic_op_timeout_ms: AtomicU64::new(BROKER_QUIC_OP_TIMEOUT_MS),\n            dial_semaphore: Arc::new(tokio::sync::Semaphore::new(PUMP_DIAL_CONCURRENCY)),\n            active_dial_tasks: Arc::new(AtomicUsize::new(0)),\n            net_canary_tick_ms,\n        })\n…\n    pub fn dial(&self, addr: EndpointAddr) -> io::Result<(u64, String)> {\n…\n        self.bounded_block_on(async move {\n            // Q2 caveat: the blocking dial acquires a permit from the SAME\n            // semaphore as `submit_dial`, so the concurrency cap bounds every dial\n            // source (never bypassed). `acquire_owned` errs only on a closed\n            // semaphore — we never close it.\n            let _permit = sem\n                .acquire_owned()\n                .await\n                .map_err(|e| io::Error::other(e.to_string()))?;\n            plan.connect(addr, &DialStage::new()).await\n        })\n    }\n\n    /// PUMP-TRUTH W2 (REQ-PUMP-PEER-ISOLATION): submit a NON-BLOCKING dial and\n    /// return IMMEDIATELY. Spawns the connect on the host runtime under the shared\n    /// concurrency permit ([`PUMP_DIAL_CONCURRENCY`]); the dial is bounded exactly\n    /// like [`Self::dial`] (W1's per-dial bound), so a dead peer fails PROMPTLY.\n    /// The OUTCOME rides the presence stream — success already emits\n    /// `PRESENCE_CONNECTED` inside `register_conn`; failure appends\n    /// `PRESENCE_DIAL_FAILED` here (conn_id:0 sentinel, correlated by\n    /// `remote_id_hex`). Never a blocking reply, never a whole-round poison — one\n    /// dead peer's fate is isolated to its own event.\n    // [impl->REQ-PUMP-PEER-ISOLATION]\n    pub fn submit_dial(&self, addr: EndpointAddr, remote_id_hex: String) {\n        let plan = self.dial_plan();\n        let sem = Arc::clone(&self.dial_semaphore);\n        let shared = Arc::clone(&self.shared);\n        let dur = self.quic_op_timeout();\n        // DIAGNOSTIC (round-3): mark this dial in-flight for the whole task, so\n        // the starvation rig can read how many dead-peer connects are occupying\n        // the 2-worker runtime at once. RAII decrement (panic/cancel-safe).\n        let gauge = Arc::clone(&self.active_dial_tasks);\n        self.runtime.spawn(async move {\n            gauge.fetch_add(1, Ordering::Relaxed);\n            let _dial_guard = DialGauge(gauge);\n            // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline\n            // advances it; the timeout arm reads it, so the 10s token names\n            // the stage the dial was IN when the bound cut it — the exact\n            // instrumentation the 2026-07-10 RCA's open discriminator needs.\n            // [impl->REQ-PUMP-STAGE-TRUTH]\n            let stage = DialStage::new();\n            let outcome = async {\n                let _permit = sem\n                    .acquire_owned()\n                    .await\n                    .map_err(|e| io::Error::other(e.to_string()))?;\n                match tokio::time::timeout(dur, plan.connect(addr, &stage)).await {\n                    Ok(inner) => inner,\n                    Err(_elapsed) => Err(io::Error::other(format!(\n                        \"submit-dial exceeded the {dur:?} bound (peer unresponsive)\"\n                    ))),\n                }\n            }\n            .await;\n            if let Err(e) = outcome {\n                // Ordinary per-peer failure rides the presence stream — the pump\n                // backs THIS peer off and moves on; the round is never poisoned.\n                // The reason is stage-attributed (REQ-PUMP-STAGE-TRUTH).\n                shared\n                    .presence\n                    .lock()\n                    .unwrap()\n                    .append_dial_failed(\n                        &remote_id_hex,\n                        format!(\"stage={}: {e}\", stage.current()),\n                    );\n            }\n        });\n    }\n…\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n…\n        streams\n…\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\n    /// not yet arrived, or capture gave up bounded).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        // A retired row answers no-such-stream: classification exists only to\n        // serve, and a retired exchange must never be served again.\n        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n            return None;\n        }\n        let line = entry.log.lock().unwrap().opener_line();\n        Some(line)\n    }\n\n    /// Mark a held stream **retentive** with backpressure `cap` chunks (M11-W3,\n    /// REQ-SHELL-4): its read log stops evicting (no byte loss) and its read pump"}],"details":{"displayContent":{"text":"/// either, but only a POISON (real write failure on the conn) cancels the\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum SeatFail {\n    /// The writer thread died on a failed conn write (the 15s bounded-write\n    /// poison class) — halt-at-first-failure already happened writer-side.\n    Poisoned,\n    /// The bounded queue is full — the subscriber cannot keep up.\n    Overflow,\n}\n\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\n///\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\n/// sender — the writer drains what it holds and exits.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\nstruct SubscriberSeat {\n    sub: SharedSend,\n    tx: std::sync::mpsc::SyncSender<Envelope>,\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n    /// and a replacement may install (the no-reinstall-until-gone rule,\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\n    done: Arc<std::sync::atomic::AtomicBool>,\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\n}\n\nimpl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n                    writer_done.store(true, Ordering::Release);\n                    return;\n                }\n            }\n            // Then live frames, same halt discipline.\n            while let Ok(frame) = rx.recv() {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"live write failed\");\n                    break;\n                }\n            }\n            writer_done.store(true, Ordering::Release);\n        });\n        SubscriberSeat {\n            sub,\n            tx,\n            done,\n            poisoned,\n        }\n    }\n\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\n    /// push). `Err` means the seat must be removed.\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\n        if self.poisoned.load(Ordering::Acquire) {\n            return Err(SeatFail::Poisoned);\n        }\n        match self.tx.try_send(frame) {\n            Ok(()) => Ok(()),\n            Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),\n            Err(std::sync::mpsc::TrySendError::Disconnected(_)) => Err(SeatFail::Poisoned),\n        }\n    }\n\n    /// Whether this seat belongs to `sub` (detach correlation).\n    fn is(&self, sub: &SharedSend) -> bool {\n        Arc::ptr_eq(&self.sub, sub)\n    }\n\n    /// Whether the writer thread has fully exited — the reinstall gate.\n    fn gone(&self) -> bool {\n        self.done.load(Ordering::Acquire)\n    }\n}\n\n/// A stream's serve lease (ADR-0038 Amendment fix 4; built here so the\n/// DAEMON-LIFECYCLE C2 work consumes it rather than growing a second\n/// mechanism): canceled when the stream's subscriber seat POISONS, which\n/// makes every later `send_stream` on the stream refuse — the paired\n/// serve/wire worker discovers the cancellation at its next forward and\n/// terminates instead of feeding an orphan leg forever.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Default)]\npub struct StreamLease {\n    canceled: std::sync::atomic::AtomicBool,\n}\n\nimpl StreamLease {\n    /// Cancel the lease (subscriber poison; C2 will add its own callers).\n    pub fn cancel(&self) {\n        self.canceled.store(true, Ordering::Release);\n    }\n\n    /// Whether the lease was canceled.\n    pub fn is_canceled(&self) -> bool {\n        self.canceled.load(Ordering::Acquire)\n    }\n}\n\n/// Restart-durable opener capture (ADR-0038 B, REQ-STREAM-OPENER-DURABLE):\n/// the stream's complete first NDJSON line, pinned OUTSIDE the evictable data\n/// ring and held until the stream row goes away. Recovery classifies from\n…\nimpl DialPlan {\n…\n    async fn connect(self, addr: EndpointAddr, stage: &DialStage) -> io::Result<(u64, String)> {\n…\n        let proven = match self.membership {\n            Some(src) => {\n…\n                prove_membership(\n…\n                .await\n                .ok_or_else(|| {\n                    io::Error::other(\"seed-proof failed: peer is not a subnet member\")\n                })?\n            }\n            None => HashSet::new(),\n        };\n        Ok(register_conn(&self.shared, conn, proven))\n    }\n}\n\n// Local alias so the stage constants read namespaced at the use sites without\n// a wildcard import.\nuse crate::seedproofx as spt_seedproof_stage;\nuse crate::seedproofx::DialStage;\n\nfn register_conn(\n    shared: &Arc<NetShared>,\n    conn: Connection,\n    proven_subnets: HashSet<String>,\n) -> (u64, String) {\n    let remote_id_hex = PublicKey::from_bytes(conn.remote_id().as_bytes())\n        .expect(\"an iroh EndpointId is always a valid ed25519 public key\")\n        .to_hex();\n    let id = shared.next_conn_id.fetch_add(1, Ordering::Relaxed);\n    shared.conns.lock().unwrap().insert(\n        id,\n        ConnEntry {\n            kind: ConnKind::Quic(conn.clone()),\n            remote_id_hex: remote_id_hex.clone(),\n            proven_subnets,\n        },\n    );\n\n    // Presence: announce the row BEFORE spawning the closed-watcher, so the\n    // `connected` event can never race behind its own `disconnected` (D4c). The\n    // event carries the OBSERVED remote addr (REQ-CONV-1 seed write-back) so a\n    // non-blocking submit-dial seeds `peer-addrs.json` like the blocking reply\n    // did (id-only / path-less → `null`, nothing worth seeding).\n    let observed = observed_addr_json(&conn);\n    shared\n        .presence\n        .lock()\n        .unwrap()\n        .append_connected(id, &remote_id_hex, observed);\n\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\n    // close, conn loss, or our own endpoint close), removes the row — conns\n    // finally LEAVE the table — then appends the `disconnected` event (row\n    // gone before the event is observable).\n    // [impl->REQ-EP-4]\n    let sh_close = Arc::clone(shared);\n    let conn_close = conn.clone();\n    let hex_close = remote_id_hex.clone();\n    tokio::spawn(async move {\n        conn_close.closed().await;\n        sh_close.conns.lock().unwrap().remove(&id);\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n        // — nothing can ever be served on them again, and leaving them makes\n        // every future dispatcher generation replay them (the control-steal\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\n        // else reads a dead conn's stream ring.\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n        sh_close\n            .streams\n            .lock()\n            .unwrap()\n            .retain(|_, e| e.conn_id != id);\n        sh_close\n            .presence\n            .lock()\n            .unwrap()\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\n    });\n\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n    let hex = remote_id_hex.clone();\n    tokio::spawn(async move {\n        while let Ok((send, recv)) = conn.accept_bi().await {\n            register_stream(\n                &sh,\n                id,\n                &hex,\n                SendHalf::Quic(send),\n                RecvHalf::Quic(recv),\n                false,\n            );\n        }\n    });\n\n    (id, remote_id_hex)\n}\n\n/// Register a live stream (opened or accepted): mint its broker id and spawn\n/// its read pump. Must run inside the host's runtime context.\n/// `initiated_locally` records the direction fact for the table (true only\n/// from [`NetHost::open_stream`]).\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n\n/// Backpressure gate for a retentive (tunnel) read pump: park until the undrained\n/// ring has room below `retentive_cap`, woken by a `drain` on `room`. A no-op for\n/// an ordinary stream (`retentive_cap == 0`). Holds no lock across the await.\n// [impl->REQ-SHELL-4]\nasync fn await_ring_room(log: &Arc<Mutex<StreamLog>>, room: &tokio::sync::Notify) {\n    loop {\n        {\n            let l = log.lock().unwrap();\n            if l.retentive_cap == 0 || l.ring.len() < l.retentive_cap {\n                return;\n            }\n        }\n        room.notified().await;\n    }\n}\n\n/// The broker-owned net endpoint + live connection/stream tables (see module\n/// docs).\npub struct NetHost {\n…\n}\n…\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n        let endpoint = runtime\n            .block_on(NetEndpoint::bind_scoped(\n                &cfg.identity,\n                cfg.relay.clone(),\n                cfg.discovery,\n                vec![\n                    SPT_NET_ALPN.to_vec(),\n                    spt_net::net::pairing::wire::SPT_PAIR_ALPN.to_vec(),\n                ],\n                cfg.scope,\n            ))\n            .map_err(|e| io::Error::other(e.to_string()))?;\n        let endpoint = Arc::new(endpoint);\n        let shared = Arc::new(NetShared::new());\n        let local_pub = cfg.identity.public_key();\n        let pair_rate = Arc::new(tokio::sync::Mutex::new(\n            spt_net::net::pairing::ratelimit::PairingRateLimiter::new(),\n        ));\n\n        // Accept loop: lives for the endpoint's lifetime on the host's runtime.\n        // Each handshake completes on its own task so a slow peer can't stall\n        // the loop; a failed handshake is simply not registered. The pairing\n        // ALPN routes to the responder; everything else is the trusted table.\n        let roster = Arc::new(Mutex::new(None::<RosterExchange>));\n        let ep = Arc::clone(&endpoint);\n        let sh = Arc::clone(&shared);\n        let rate = Arc::clone(&pair_rate);\n        let accept_membership = cfg.membership.clone();\n        let accept_roster = Arc::clone(&roster);\n        let accept_ep = Arc::clone(&endpoint);\n        runtime.spawn(async move {\n            while let Some(incoming) = ep.accept().await {\n                let sh = Arc::clone(&sh);\n                let rate = Arc::clone(&rate);\n                let membership = accept_membership.clone();\n                // Snapshot the (opt-in) roster exchange + our live address for\n                // this connect; the leg runs after the proof verifies.\n                let roster_rx = accept_roster.lock().unwrap().clone();\n                let self_addr =\n                    serde_json::to_value(accept_ep.addr()).unwrap_or(serde_json::Value::Null);\n                tokio::spawn(async move {\n                    let Ok(connecting) = incoming.accept() else {\n                        return;\n                    };\n                    let Ok(conn) = connecting.await else { return };\n                    if conn.alpn() == spt_net::net::pairing::wire::SPT_PAIR_ALPN {\n                        crate::pairhost::respond(conn, local_pub, rate).await;\n                    } else {\n                        // Mesh-D2: prove membership in-band BEFORE the connection\n                        // joins the table. A non-prover (no shared subnet / bad\n                        // seed) is dropped — the conn falls out of scope and QUIC\n                        // closes it. With membership disabled, register as before.\n                        // Mesh-D4: on success, a roster leg rides the same stream.\n                        let proven = match membership {\n                            Some(src) => {\n                                let creds = src();\n                                match prove_membership(\n                                    &conn,\n                                    local_pub,\n                                    ProofRole::Acceptor,\n                                    &creds,\n                                    roster_rx.as_ref(),\n                                    &self_addr,\n                                    &DialStage::new(), // accept side: stage untracked\n                                )\n                                .await\n                                {\n                                    Some(set) => set,\n                                    None => return, // drop the connection\n                                }\n                            }\n                            None => HashSet::new(),\n                        };\n                        register_conn(&sh, conn, proven);\n                    }\n                });\n            }\n        });\n\n        // The meet-rotation loop (M7 D3): how a joiner that knows only\n        // (subnet name, code) finds this responder. Idles with no subnets.\n        crate::pairhost::spawn_meet_rotation(\n            runtime.handle(),\n            Arc::clone(&endpoint),\n            cfg.relay,\n            cfg.discovery,\n            cfg.scope,\n        );\n\n        // The limiter Arc lives on in the accept loop; the host keeps no\n        // handle (per-ceremony state is the responder's, not the table's).\n        drop(pair_rate);\n\n        // DIAGNOSTIC (UPDATE-WEDGE round-3): the reactor-liveness canary. Stamps\n        // epoch-ms every ~25ms FROM the 2-worker runtime, so a starved runtime\n        // (workers monopolized by non-yielding dead-peer connects) shows as a\n        // stale stamp. Throwaway probe — no REQ, gated by nothing (cheap store).\n        let net_canary_tick_ms = Arc::new(AtomicU64::new(epoch_ms()));\n        let canary = Arc::clone(&net_canary_tick_ms);\n        runtime.spawn(async move {\n            let mut ivl = tokio::time::interval(Duration::from_millis(25));\n            loop {\n                ivl.tick().await;\n                canary.store(epoch_ms(), Ordering::Relaxed);\n            }\n        });\n\n        Ok(NetHost {\n            runtime,\n            endpoint,\n            shared,\n            dial_ops: Mutex::new(HashMap::new()),\n            stream_ops: Mutex::new(HashMap::new()),\n            local_id: local_pub,\n            membership: cfg.membership,\n            roster,\n            loopback_conn: Mutex::new(None),\n            loopback_pair_lock: Mutex::new(()),\n            quic_op_timeout_ms: AtomicU64::new(BROKER_QUIC_OP_TIMEOUT_MS),\n            dial_semaphore: Arc::new(tokio::sync::Semaphore::new(PUMP_DIAL_CONCURRENCY)),\n            active_dial_tasks: Arc::new(AtomicUsize::new(0)),\n            net_canary_tick_ms,\n        })\n…\n    pub fn dial(&self, addr: EndpointAddr) -> io::Result<(u64, String)> {\n…\n        self.bounded_block_on(async move {\n            // Q2 caveat: the blocking dial acquires a permit from the SAME\n            // semaphore as `submit_dial`, so the concurrency cap bounds every dial\n            // source (never bypassed). `acquire_owned` errs only on a closed\n            // semaphore — we never close it.\n            let _permit = sem\n                .acquire_owned()\n                .await\n                .map_err(|e| io::Error::other(e.to_string()))?;\n            plan.connect(addr, &DialStage::new()).await\n        })\n    }\n\n    /// PUMP-TRUTH W2 (REQ-PUMP-PEER-ISOLATION): submit a NON-BLOCKING dial and\n    /// return IMMEDIATELY. Spawns the connect on the host runtime under the shared\n    /// concurrency permit ([`PUMP_DIAL_CONCURRENCY`]); the dial is bounded exactly\n    /// like [`Self::dial`] (W1's per-dial bound), so a dead peer fails PROMPTLY.\n    /// The OUTCOME rides the presence stream — success already emits\n    /// `PRESENCE_CONNECTED` inside `register_conn`; failure appends\n    /// `PRESENCE_DIAL_FAILED` here (conn_id:0 sentinel, correlated by\n    /// `remote_id_hex`). Never a blocking reply, never a whole-round poison — one\n    /// dead peer's fate is isolated to its own event.\n    // [impl->REQ-PUMP-PEER-ISOLATION]\n    pub fn submit_dial(&self, addr: EndpointAddr, remote_id_hex: String) {\n        let plan = self.dial_plan();\n        let sem = Arc::clone(&self.dial_semaphore);\n        let shared = Arc::clone(&self.shared);\n        let dur = self.quic_op_timeout();\n        // DIAGNOSTIC (round-3): mark this dial in-flight for the whole task, so\n        // the starvation rig can read how many dead-peer connects are occupying\n        // the 2-worker runtime at once. RAII decrement (panic/cancel-safe).\n        let gauge = Arc::clone(&self.active_dial_tasks);\n        self.runtime.spawn(async move {\n            gauge.fetch_add(1, Ordering::Relaxed);\n            let _dial_guard = DialGauge(gauge);\n            // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline\n            // advances it; the timeout arm reads it, so the 10s token names\n            // the stage the dial was IN when the bound cut it — the exact\n            // instrumentation the 2026-07-10 RCA's open discriminator needs.\n            // [impl->REQ-PUMP-STAGE-TRUTH]\n            let stage = DialStage::new();\n            let outcome = async {\n                let _permit = sem\n                    .acquire_owned()\n                    .await\n                    .map_err(|e| io::Error::other(e.to_string()))?;\n                match tokio::time::timeout(dur, plan.connect(addr, &stage)).await {\n                    Ok(inner) => inner,\n                    Err(_elapsed) => Err(io::Error::other(format!(\n                        \"submit-dial exceeded the {dur:?} bound (peer unresponsive)\"\n                    ))),\n                }\n            }\n            .await;\n            if let Err(e) = outcome {\n                // Ordinary per-peer failure rides the presence stream — the pump\n                // backs THIS peer off and moves on; the round is never poisoned.\n                // The reason is stage-attributed (REQ-PUMP-STAGE-TRUTH).\n                shared\n                    .presence\n                    .lock()\n                    .unwrap()\n                    .append_dial_failed(\n                        &remote_id_hex,\n                        format!(\"stage={}: {e}\", stage.current()),\n                    );\n            }\n        });\n    }\n…\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n…\n        streams\n…\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\n    /// not yet arrived, or capture gave up bounded).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        // A retired row answers no-such-stream: classification exists only to\n        // serve, and a retired exchange must never be served again.\n        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n            return None;\n        }\n        let line = entry.log.lock().unwrap().opener_line();\n        Some(line)\n    }\n\n    /// Mark a held stream **retentive** with backpressure `cap` chunks (M11-W3,\n    /// REQ-SHELL-4): its read log stops evicting (no byte loss) and its read pump","startLine":130,"lineNumbers":[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,null,869,null,879,null,888,889,null,891,null,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,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,null,1147,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,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,null,1454,null,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,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,null,1805,null,1807,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784271480563}}
{"type":"message","id":"042dfd60","parentId":"c314fbc4","timestamp":"2026-07-17T06:58:12.356Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Gathering handle_conn and dispatch details**"},{"type":"toolCall","id":"call_m1VQOuc8kWD0qWMLFE97Zhth|fc_0a061eb498f0e908016a59d28447f08196ab553f48b1a9c95a","name":"grep","arguments":{"i":"Finding terminal thread sites","pattern":"thread::spawn|thread::Builder|std::thread::spawn|std::thread::Builder|spawn_blocking|tokio::spawn","path":"crates/spt-term/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_1kiVYiRPvn41e3cnTAX2JxNl|fc_0a061eb498f0e908016a59d28448048196a4caaf98477c8bf2","name":"grep","arguments":{"i":"Finding PTY lifecycle methods","pattern":"pub struct PtySession|impl PtySession|impl SessionSurface for PtySession|pub struct Drain|fn drain|fn stop|fn wait|fn kill|impl Drop","path":"crates/spt-term/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_fKBdIZe9bk166ibc33rZwc6a|fc_0a061eb498f0e908016a59d284480c8196975f92f15b5ad467","name":"read","arguments":{"i":"Reading connection cleanup","path":"crates/spt-daemon/src/broker.rs","selector":"3024-3270"}},{"type":"toolCall","id":"call_KzO9qggjrlxF63XoZvdU51cg|fc_0a061eb498f0e908016a59d28448108196973a06f26e52ab5f","name":"read","arguments":{"i":"Reading session spawn lifecycle","path":"crates/spt-daemon/src/broker.rs","selector":"3330-3505"}},{"type":"toolCall","id":"call_tVDZCZnfgzolMczVr8SqBNM3|fc_0a061eb498f0e908016a59d28448188196bdc9428ca12ba6cb","name":"read","arguments":{"i":"Reading network stream log lifecycle","path":"crates/spt-daemon/src/nethost.rs","selector":"280-590,740-890,1000-1080,1750-1870"}},{"type":"toolCall","id":"call_SOFEVEARax2kmBSN6F4n5zq7|fc_0a061eb498f0e908016a59d284481c8196bd374f87db48a292","name":"grep","arguments":{"i":"Finding broker introspection surfaces","pattern":"conn_handler_count|stream_infos|session_count|net_conn_count|broker-image|BrokerImage|StallEvicts|daemon status","path":"crates/spt-daemon/src; crates/spt-cli/src","selector":null,"case":false,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":30461,"output":428,"cacheRead":52736,"cacheWrite":0,"totalTokens":83625,"reasoningTokens":44,"cost":{"input":0.15230500000000002,"output":0.01284,"cacheRead":0.026368,"cacheWrite":0,"total":0.19151300000000002}},"stopReason":"toolUse","timestamp":1784271480602,"responseId":"resp_0a061eb498f0e908016a59d278ebc481968951f50fa22161f9","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d27c37f88196992a823d0483c550","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdKEBpJ2uRAkyMU6iJ1BmZPZL61K1S9wPCGDY16RUwV8DYohBP-66-D5uaio9TkOxl6CmfU8fUmWd2k7GDEdd74v_sFHv19wZA-1hDU1Ww2tVASgwaMqcMEVGvjXNpBJXTiVXPDaclpGaX0vuoiGHq87EXNY8GUM00KX_gZxcj0--ggXQMF6rFWX5Rr-q-_05zjaTuV-QFEXvuA4pPbnSEwe_I-dRIr9-U4vjY-Qmd3CgwlblPTDUZNoOl3DizkQbJVE-mwlW0Ql1TRIQS04VvH4zwrCeB5UObvH2PBYSG7EtevC0_Sj-5JXwYv1ic2t4eKER1odujvME-q7gjhklqUzXvoXVQ5eqBoFCgoli_TnxX-ZykgepRGeuZrjiRfQNFox39H4XQnM0TenN1YvAVp968WWIq5Ql4AbpoAJIOkOZk1SDYhaodVmyL4TnfGTOJHljPoi-ifElsC7ds_bvFTwv61Ih5WZAb1XbK9ZyQIB0tKeScyS5VuxhgqCgPKr8el9ItXRCpOX7IVQqd29W4DWyn025NDNCaIZPTiLZTJdMnxpzUyI56o5EeV4S4WSTyufhFE6jOZQsF8fjOrFAga7K2y0fqDj8hdzyGquBRAYLmIL-veg_ixmS8SRiuC8g-ITBwSc8GneF1MezkIKwiOvbD_82IWxZgIo4C4eFqjIyxnXkyrAquhAcsmpABmfx7JdymzfPpx2YuyISxiB5XC-GMRbIrPI508f0loCrB7I6gejjLWLvFYU3mEVIXwhQnUt729qvwaFwhn7QwLqfzlEHxmp-mTsYDijBQXBVCttrJlz7ft9s8henRpQZg6-xaJgBIqQImi2oDRUgTcLYmhLBlfjJXlzJr323IJYUcbuFMgz2TtXOKB0_551urfNJYR4gU6JTGhwrxeiUAt-Mgb7Rpoprd1XUVesCFny_Jo6p8KpQo8rR5klY2JHaRt04PqII-99rUD7xEU2lIWtD6sP5uTlqebjZ5LPxZuvFTCPMk-zIqux2xu2Hqj-x0HAaCTpM2EZMwZzpzWQEIS22r4QCX6ISJHuaa1pHEBOSqyPA8xqXdUZU82XpEtCa4XrLh8cHbskwFso0yG4hCXQTGL_8kb6EEBIMtOTqxR7Gq2s6DphYl7IQeq246TdnrPXR6E63UEldkVLcQJbYo1yAV03cA==","summary":[{"type":"summary_text","text":"**Gathering handle_conn and dispatch details**"}]},{"id":"fc_0a061eb498f0e908016a59d28447f08196ab553f48b1a9c95a","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding terminal thread sites\",\"pattern\":\"thread::spawn|thread::Builder|std::thread::spawn|std::thread::Builder|spawn_blocking|tokio::spawn\",\"path\":\"crates/spt-term/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_m1VQOuc8kWD0qWMLFE97Zhth","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d28448048196a4caaf98477c8bf2","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding PTY lifecycle methods\",\"pattern\":\"pub struct PtySession|impl PtySession|impl SessionSurface for PtySession|pub struct Drain|fn drain|fn stop|fn wait|fn kill|impl Drop\",\"path\":\"crates/spt-term/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_1kiVYiRPvn41e3cnTAX2JxNl","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d284480c8196975f92f15b5ad467","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading connection cleanup\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3024-3270\"}","call_id":"call_fKBdIZe9bk166ibc33rZwc6a","name":"read"},{"id":"fc_0a061eb498f0e908016a59d28448108196973a06f26e52ab5f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading session spawn lifecycle\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3330-3505\"}","call_id":"call_KzO9qggjrlxF63XoZvdU51cg","name":"read"},{"id":"fc_0a061eb498f0e908016a59d28448188196bdc9428ca12ba6cb","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading network stream log lifecycle\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"280-590,740-890,1000-1080,1750-1870\"}","call_id":"call_tVDZCZnfgzolMczVr8SqBNM3","name":"read"},{"id":"fc_0a061eb498f0e908016a59d284481c8196bd374f87db48a292","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding broker introspection surfaces\",\"pattern\":\"conn_handler_count|stream_infos|session_count|net_conn_count|broker-image|BrokerImage|StallEvicts|daemon status\",\"path\":\"crates/spt-daemon/src; crates/spt-cli/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_SOFEVEARax2kmBSN6F4n5zq7","name":"grep"}]},"duration":11753.26399999857,"ttft":3630.508900001645,"contextSnapshot":{"promptTokens":83197,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_m1VQOuc8kWD0qWMLFE97Zhth|fc_0a061eb498f0e908016a59d28447f08196ab553f48b1a9c95a","toolName":"grep","startedAt":"2026-07-17T06:58:12.356Z","args":{"path":"crates/spt-term/src"},"intent":"Finding terminal thread sites"},"id":"04fd6a3d","parentId":"042dfd60","timestamp":"2026-07-17T06:58:12.356Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_1kiVYiRPvn41e3cnTAX2JxNl|fc_0a061eb498f0e908016a59d28448048196a4caaf98477c8bf2","toolName":"grep","startedAt":"2026-07-17T06:58:12.357Z","args":{"path":"crates/spt-term/src"},"intent":"Finding PTY lifecycle methods"},"id":"db91d24b","parentId":"04fd6a3d","timestamp":"2026-07-17T06:58:12.357Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_fKBdIZe9bk166ibc33rZwc6a|fc_0a061eb498f0e908016a59d284480c8196975f92f15b5ad467","toolName":"read","startedAt":"2026-07-17T06:58:12.357Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading connection cleanup"},"id":"0979d7d0","parentId":"db91d24b","timestamp":"2026-07-17T06:58:12.357Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_KzO9qggjrlxF63XoZvdU51cg|fc_0a061eb498f0e908016a59d28448108196973a06f26e52ab5f","toolName":"read","startedAt":"2026-07-17T06:58:12.357Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading session spawn lifecycle"},"id":"35029306","parentId":"0979d7d0","timestamp":"2026-07-17T06:58:12.357Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_tVDZCZnfgzolMczVr8SqBNM3|fc_0a061eb498f0e908016a59d28448188196bdc9428ca12ba6cb","toolName":"read","startedAt":"2026-07-17T06:58:12.357Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading network stream log lifecycle"},"id":"219274f2","parentId":"35029306","timestamp":"2026-07-17T06:58:12.357Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_SOFEVEARax2kmBSN6F4n5zq7|fc_0a061eb498f0e908016a59d284481c8196bd374f87db48a292","toolName":"grep","startedAt":"2026-07-17T06:58:12.357Z","args":{"path":"crates/spt-daemon/src; crates/spt-cli/src"},"intent":"Finding broker introspection surfaces"},"id":"d8088d5a","parentId":"219274f2","timestamp":"2026-07-17T06:58:12.357Z"}
{"type":"message","id":"8e4b379c","parentId":"d8088d5a","timestamp":"2026-07-17T06:58:12.378Z","message":{"role":"toolResult","toolCallId":"call_tVDZCZnfgzolMczVr8SqBNM3|fc_0a061eb498f0e908016a59d28448188196bdc9428ca12ba6cb","toolName":"read","content":[{"type":"text","text":"/// ring and held until the stream row goes away. Recovery classifies from\n/// this fact, never from ring seq 0 (which a bounded ring evicts under\n/// traffic — the abandoned-active-stream leg of the hertz RCA).\nenum OpenerCapture {\n    /// Still hunting the first `\\n` — holds every byte seen so far.\n    Buffering(Vec<u8>),\n    /// The complete first line (newline excluded), immutable from here on.\n    Pinned(Vec<u8>),\n    /// No newline within [`OPENER_PIN_MAX`] — not an NDJSON opener; give up\n    /// bounded (classification reads this as \"no opener\").\n    Oversize,\n}\n\n/// Transport backing a held connection. A real `Quic` connection (the only\n/// kind an inbound handshake can produce), or a broker-minted `Loopback` —\n/// an in-process connection with NO iroh handshake whose identity IS this node,\n/// established BY CONSTRUCTION. A loopback conn can ONLY be minted broker-side\n/// via [`NetHost::dial_loopback`]; it can never arise from an inbound handshake\n/// (a remote always presents its own key and cannot claim to be us). This is\n/// what lets a LOCAL `spt rc` ride the byte-identical `serve_attach` pump (M12\n/// W1.5, B1) — QUIC self-dial is refused by iroh (\"Connecting to ourself is not\n/// supported\"), so local attach rides a broker loopback conn instead.\nenum ConnKind {\n    /// A real QUIC connection — kept alive by ownership here; dropping it closes\n    /// the connection. Cloned (cheap handle) for stream opens.\n    Quic(Connection),\n    /// A broker-minted in-process loopback (no iroh handle, no handshake). Its\n    /// streams are minted eagerly in cross-wired pairs by [`NetHost::open_stream`];\n    /// there is no accept loop and no closed-watcher (it lives for the host).\n    Loopback,\n}\n\n/// One live connection the broker holds (QUIC or loopback).\nstruct ConnEntry {\n    /// The transport backing this connection.\n    kind: ConnKind,\n    /// The remote node's stable name (hex pubkey). For QUIC, proven by the\n    /// handshake; for loopback, THIS node's own id (the broker-minted identity).\n    remote_id_hex: String,\n    /// The subnets the peer proved current-epoch seed-knowledge of at connect\n    /// (Mesh-D2, REQ-MESH-1). Empty when seed-proof is disabled (`membership:\n    /// None`). The D5 gate swap reads this in place of `is_trusted(subnet, …)`;\n    /// at D2 it is cached but not yet consumed (the `is_trusted` gates still run\n    /// in parallel — belt + suspenders, no regression).\n    proven_subnets: HashSet<String>,\n}\n\n/// A bounded, sequenced read log for one QUIC stream — the PTY `OutputLog`\n/// discipline applied to the network (D4b): the stream's single read pump is\n/// the only producer; a brain connection attaches as the subscriber; every\n/// subscriber send happens under the enclosing `Mutex`, so live chunks and a\n/// replay can never interleave out of `seq` order. Chunks produced while no\n/// brain is attached sit in the ring and replay on the next subscribe — a\n/// brain restart loses nothing (Spike #3 invariant B/D).\n// [impl->REQ-DAEMON-2]\nstruct StreamLog {\n    stream_id: u64,\n    /// TRANSPORT read counter: bumped once per [`append`](Self::append) (one\n    /// read-pump `read_chunk`), INDEPENDENT of byte size. NOT a logical-chunk\n    /// count — QUIC may coalesce several sender writes into one receiver\n    /// `read_chunk` (or split one), so `next_seq` can be < the number of logical\n    /// chunks the sender issued for the SAME bytes. Correctness (byte-exact +\n    /// exactly-once) holds via these transport seqs + the recv cursor regardless;\n    /// any test asserting `next_seq == logical-chunk-count` is wrong (the Windows\n    /// coalescing flake) and must gate on BYTES instead.\n    next_seq: u64,\n    ring: VecDeque<(u64, Vec<u8>)>,\n    cap_chunks: usize,\n    /// The installed subscriber, behind its bounded writer queue (ADR-0038\n    /// Amendment fixes 2+3): producers ENQUEUE here; conn I/O never runs\n    /// under this log's mutex.\n    subscriber: Option<SubscriberSeat>,\n    /// The stream's serve lease (Amendment fix 4): canceled on subscriber\n    /// POISON so the paired serve/wire worker's sends refuse.\n    lease: Arc<StreamLease>,\n    /// Read side finished cleanly (peer called finish / conn ended).\n    finished: bool,\n    /// **Retentive backpressure cap** (M11-W3, REQ-SHELL-4), in chunks; `0` ⇒ not\n    /// retentive (ordinary bounded-overwrite stream). A shell-tunnel stream must\n    /// NOT drop bytes — CONTEXT:262 \"tunneled protocols cannot drop frames, so\n    /// congestion surfaces as lag, never loss.\" So a retentive log never cap-evicts\n    /// on append (no loss), and the read pump REFUSES to pull the next chunk once\n    /// the undrained ring reaches this cap (no unbounded growth ⇒ no OOM) — the\n    /// transport's native flow-control then lags the *sender*. A chunk leaves the\n    /// ring ONLY when [`drain`](Self::drain) (the recv cursor) pops it; the pump is\n    /// woken to resume via the entry's `room` notifier. Ordinary streams keep\n    /// `retentive_cap = 0` (a slow/absent brain must not OOM the broker via an\n    /// unbounded ring) and are drained by subscribe, never the sync cursor.\n    retentive_cap: usize,\n    /// The pinned first NDJSON line (ADR-0038 B) — one bounded side fact per\n    /// stream, independent of the ring's eviction. Fed by [`append`](Self::append).\n    opener: OpenerCapture,\n}\n\nimpl StreamLog {\n    fn new(stream_id: u64, cap_chunks: usize) -> Self {\n        StreamLog {\n            stream_id,\n            next_seq: 0,\n            ring: VecDeque::new(),\n            cap_chunks,\n            subscriber: None,\n            lease: Arc::new(StreamLease::default()),\n            finished: false,\n            retentive_cap: 0,\n            opener: OpenerCapture::Buffering(Vec::new()),\n        }\n    }\n\n    /// The pinned opener line, if the first `\\n` has arrived (ADR-0038 B).\n    /// `None` while still buffering or when capture gave up (`Oversize`).\n    fn opener_line(&self) -> Option<Vec<u8>> {\n        match &self.opener {\n            OpenerCapture::Pinned(line) => Some(line.clone()),\n            _ => None,\n        }\n    }\n\n    /// The oldest retained ring seq — the safe subscribe cursor after the ring\n    /// rolled (a `from_seq` below this floor makes the brain's gap check\n    /// reject the resume). `next_seq` when the ring is empty.\n    fn floor_seq(&self) -> u64 {\n        self.ring.front().map(|(s, _)| *s).unwrap_or(self.next_seq)\n    }\n\n    /// Mark this log retentive with backpressure `cap` (chunks). Idempotent set.\n    fn set_retentive(&mut self, cap: usize) {\n        self.retentive_cap = cap;\n    }\n\n    /// Append a freshly-read chunk: assign the next `seq`, retain it in the ring,\n    /// live-send to the current subscriber. Read-pump only. A non-retentive log\n    /// cap-evicts the oldest chunks past `cap_chunks`; a retentive (tunnel) log\n    /// never evicts — bytes leave only via [`drain`](Self::drain).\n    fn append(&mut self, bytes: &[u8]) {\n        // Opener capture (ADR-0038 B): pin the first NDJSON line as it streams\n        // past, before ring bounds can ever evict it. One-shot: `Pinned` and\n        // `Oversize` are terminal states.\n        // [impl->REQ-STREAM-OPENER-DURABLE]\n        if let OpenerCapture::Buffering(buf) = &mut self.opener {\n            match bytes.iter().position(|&b| b == b'\\n') {\n                Some(nl) => {\n                    buf.extend_from_slice(&bytes[..nl]);\n                    let line = std::mem::take(buf);\n                    self.opener = if line.len() > OPENER_PIN_MAX {\n                        OpenerCapture::Oversize\n                    } else {\n                        OpenerCapture::Pinned(line)\n                    };\n                }\n                None => {\n                    buf.extend_from_slice(bytes);\n                    if buf.len() > OPENER_PIN_MAX {\n                        self.opener = OpenerCapture::Oversize;\n                    }\n                }\n            }\n        }\n        let seq = self.next_seq;\n        self.next_seq += 1;\n        self.ring.push_back((seq, bytes.to_vec()));\n        if self.retentive_cap == 0 {\n            while self.ring.len() > self.cap_chunks {\n                self.ring.pop_front();\n            }\n        }\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_data_envelope(self.stream_id, seq, bytes);\n            // ENQUEUE only (ADR-0038 Amendment fix 3): the conn I/O runs on\n            // the seat's writer thread, outside this mutex — a wedged\n            // subscriber can no longer park this producer OR the lock.\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Remove the current seat after an enqueue failure (halt-at-first-\n    /// failure, all producer sites): a POISON also cancels the stream's\n    /// lease so the paired serve/wire worker terminates (Amendment fix 4);\n    /// an OVERFLOW just detaches — the brain resumes from its cursor.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn drop_seat(&mut self, fail: SeatFail) {\n        if let Some(seat) = self.subscriber.take() {\n            seat.sub.lifecycle_event(\n                \"stream-sub-halt\",\n                &format!(\"stream={} reason={fail:?}\", self.stream_id),\n            );\n            if fail == SeatFail::Poisoned {\n                self.lease.cancel();\n            }\n        }\n    }\n\n    /// Drain every undrained chunk in order (the shell-tunnel recv cursor, W3).\n    /// Pops the whole ring front-to-back (FIFO by `seq`) and concatenates the\n    /// bytes — chunk boundaries are arbitrary read-pump splits, irrelevant to an\n    /// opaque byte stream. Lossless + ordered: a byte leaves the ring only here,\n    /// once. Returns `(bytes, finished)`; `finished` reflects a clean/torn end so\n    /// the poller sees EOF and closes. Empty bytes with `finished=false` ⇒ nothing\n    /// pending yet.\n    fn drain(&mut self) -> (Vec<u8>, bool) {\n        let mut out = Vec::new();\n        while let Some((_, chunk)) = self.ring.pop_front() {\n            out.extend_from_slice(&chunk);\n        }\n        (out, self.finished)\n    }\n\n    /// Mark the read side finished and tell the subscriber (with the final\n    /// cursor, so it can verify completeness).\n    fn finish(&mut self) {\n        self.finished = true;\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);\n            // Enqueue only — same discipline as append (Amendment fix 2:\n            // ALL producer sites halt-and-remove, finish included).\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Install `sub` as the subscriber with the replay snapshot (retained\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\n    /// replay-then-live seq order is structural (see\n    /// [`SubscriberSeat::install`]), while every conn write still happens\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n    /// under the lock with discarded write errors, the exact serial-poison\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\n    ///\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\n    /// a replacement subscriber is never installed until the prior one is\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // No-reinstall-until-gone applies to the POISON class only\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n            // 15s bounded write — installing a replacement now would hand the\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\n            // DISPLACED as before (the newer-brain-takes-over contract).\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    format!(\n                        \"stream {} subscriber busy: prior subscriber still draining\",\n                        self.stream_id\n                    ),\n                ));\n            }\n            // Healthy displacement, prior fully gone, or same sub re-attach.\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\n        // record — this is one of the two RCA-pinned shared-carrier classes.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\n        sub.lifecycle_event(\n            \"stream-sub-attach\",\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\n        );\n        let mut replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|(s, _)| *s >= from_seq)\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\n            .collect();\n        if self.finished {\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\n        }\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\n        // prior writer — poisoned OR healthily displaced — holds only its own\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\n        // brain-swap displacement left the displaced writer and the successor\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\n        // write failure (its conn dying — every daemon refresh) canceled the\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\n        // displaced stream on exactly the post-refresh path this wave calms.\n        // One poison never dead-ends the stream (T5 recovery): the next\n        // generation's mint IS the renewal; `send_stream` reads this current\n        // Arc, old workers' handles stay theirs (C2 consumes via\n        // [`NetHost::stream_lease`]).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        self.lease = Arc::new(StreamLease::default());\n        let replay_len = replay.len();\n        self.subscriber = Some(SubscriberSeat::install(\n            sub,\n            replay,\n            Some(Arc::clone(&self.lease)),\n        ));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n}\n\n/// A bounded, sequenced log of connection liveness events — the broker-owned\n/// PresenceChannel seam (D4c, REQ-EP-4): the StreamLog ring/cursor discipline\n…\nenum SendHalf {\n…\n    Loopback(WriteHalf<DuplexStream>),\n}\n\nimpl SendHalf {\n    /// Write all `bytes` (no-op on empty). Runs on the host runtime.\n    async fn write_all(&mut self, bytes: &[u8]) -> io::Result<()> {\n        match self {\n            SendHalf::Quic(s) => s\n                .write_all(bytes)\n                .await\n                .map_err(|e| io::Error::other(e.to_string())),\n            SendHalf::Loopback(w) => w.write_all(bytes).await,\n        }\n    }\n\n    /// Close the send side so the peer's read pump sees a clean end (QUIC\n    /// `finish` / duplex `shutdown`).\n    async fn finish(&mut self) -> io::Result<()> {\n        match self {\n            SendHalf::Quic(s) => s.finish().map_err(|e| io::Error::other(e.to_string())),\n            SendHalf::Loopback(w) => w.shutdown().await,\n        }\n    }\n}\n\n/// A stream's read half — fed into the single read pump in [`register_stream`].\n/// QUIC reads via quinn's chunk API; loopback via the read end of the duplex.\n/// Both append to the same [`StreamLog`], so the subscriber (and everything\n/// above it) cannot tell the transports apart.\nenum RecvHalf {\n    Quic(RecvStream),\n    Loopback(ReadHalf<DuplexStream>),\n}\n\n/// One live stream the broker holds (QUIC or loopback): the send half (brain\n/// writes ride it over IPC) + the sequenced read log.\nstruct StreamEntry {\n    conn_id: u64,\n    remote_id_hex: String,\n    /// Whether THIS node opened the stream (`open_stream`) vs the peer\n    /// (accept loop). The inbound dispatcher (D9-1) claims only\n    /// peer-initiated streams; without this fact the table is ambiguous —\n    /// it holds locally-opened outbound streams too (gotcha: a dispatcher\n    /// that served its own requester stream would deadlock on itself).\n    initiated_locally: bool,\n    /// The send half, serialized behind an async mutex (writes happen on the\n    /// host's runtime via `block_on`).\n    send: tokio::sync::Mutex<SendHalf>,\n    log: Arc<Mutex<StreamLog>>,\n    /// Wakes the read pump when a retentive (tunnel) stream's ring drains below\n    /// its backpressure cap (M11-W3, REQ-SHELL-4) — see [`StreamLog::retentive_cap`].\n    /// Unused by ordinary (non-retentive) streams.\n    room: Arc<tokio::sync::Notify>,\n    /// Retired = invisible to dispatch eligibility (ADR-0038 A), NOT torn down:\n    /// retire must never sever the transport — the worker's reply send is\n    /// fire-and-forget, so a retire that dropped this entry could overtake the\n    /// still-queued reply inside the broker and reset the never-finished QUIC\n    /// send half (requester sees torn-EOF, no reply). The reply-flush ordering\n    /// is load-bearing; physical teardown belongs to the conn-close sweep only.\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    retired: std::sync::atomic::AtomicBool,\n}\n\n/// Tables shared between the host's sync surface and its runtime tasks\n/// (accept loop, per-conn stream acceptors, per-stream read pumps).\nstruct NetShared {\n    next_conn_id: AtomicU64,\n    conns: Mutex<HashMap<u64, ConnEntry>>,\n    next_stream_id: AtomicU64,\n    streams: Mutex<HashMap<u64, Arc<StreamEntry>>>,\n    ring_cap: usize,\n    /// The conn-liveness event log (D4c) — one per host, all conns interleaved.\n    presence: Mutex<PresenceLog>,\n}\n\nimpl NetShared {\n    fn new() -> Self {\n        NetShared {\n            next_conn_id: AtomicU64::new(1),\n            conns: Mutex::new(HashMap::new()),\n            next_stream_id: AtomicU64::new(1),\n            streams: Mutex::new(HashMap::new()),\n            ring_cap: ring_cap_from_env(),\n            presence: Mutex::new(PresenceLog::new(DEFAULT_STREAM_RING_CHUNKS)),\n        }\n    }\n}\n\n/// The stream ring depth — [`DEFAULT_STREAM_RING_CHUNKS`] in production.\n/// `SPT_STREAM_RING_CHUNKS` is a TEST-RIG-ONLY valve (the D2 regression rolls\n/// an opener out of a small ring deterministically instead of pushing >4096\n/// real transport chunks); production semantics and sizing are untouched.\nfn ring_cap_from_env() -> usize {\n    std::env::var(\"SPT_STREAM_RING_CHUNKS\")\n        .ok()\n        .and_then(|v| v.parse().ok())\n        .filter(|n: &usize| *n > 0)\n        .unwrap_or(DEFAULT_STREAM_RING_CHUNKS)\n}\n\n/// Register a live connection: mint its broker id and spawn its inbound-stream\n/// acceptor. Must run inside the host's runtime context (the accept loop, or a\n/// `block_on` future) — it spawns tasks.\n/// The connection's OBSERVED remote address as opaque seed JSON (REQ-CONV-1):\n/// the path address string, or `null` when id-only / path-less (nothing worth\n/// seeding over discovery). Shared by [`register_conn`]'s presence write-back\n/// and [`NetHost::conn_remote_addr_json`] so both seed identically.\n// [impl->REQ-CONV-1]\nfn observed_addr_json(conn: &Connection) -> serde_json::Value {\n    let addr = spt_net::net::endpoint::conn_remote_addr(conn);\n    if addr.is_empty() {\n        return serde_json::Value::Null; // id-only adds nothing over discovery\n    }\n    serde_json::to_value(addr).unwrap_or(serde_json::Value::Null)\n}\n\n/// A `Send + 'static` snapshot of one dial's inputs — the SHARED connect path\n/// for both the blocking [`NetHost::dial`] and the spawned\n/// [`NetHost::submit_dial`], so W1's per-dial bound and the Mesh-D2 seed-proof\n/// stay single-sourced (never a second, drifting dial impl).\nstruct DialPlan {\n    endpoint: Arc<NetEndpoint>,\n    shared: Arc<NetShared>,\n    local_id: PublicKey,\n    membership: Option<MembershipSource>,\n    roster_rx: Option<RosterExchange>,\n    self_addr: serde_json::Value,\n}\n\nimpl DialPlan {\n    /// Connect, prove membership in-band (Mesh-D2 — a failed/empty proof drops\n    /// the dial before it registers; Mesh-D4 roster leg rides the same stream on\n    /// success), then register the conn (which emits `PRESENCE_CONNECTED` with\n    /// the observed addr). The caller bounds this await (the blocking dial via\n    /// `bounded_block_on`; the submit via its own `timeout`). `stage` names the\n    /// pipeline stage the dial is in (ADR-0039 Decision 5) — a stage-local\n    /// error and the caller's outer timeout both read it, so the failure token\n    /// says WHERE the dial died instead of collapsing six stages into one.\n    // [impl->REQ-PUMP-STAGE-TRUTH]\n    async fn connect(self, addr: EndpointAddr, stage: &DialStage) -> io::Result<(u64, String)> {\n        stage.enter(spt_seedproof_stage::STAGE_QUIC_CONNECT);\n        let conn = self.endpoint.connect(addr).await.map_err(|e| {\n            let msg = e.to_string();\n            if msg.to_ascii_lowercase().contains(\"alpn\") {\n                stage.enter(spt_seedproof_stage::STAGE_ALPN);\n            }\n            io::Error::other(msg)\n        })?;\n        let proven = match self.membership {\n            Some(src) => {\n                let creds = src();\n…\n            }\n…\n        };\n…\n    }\n}\n…\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n\n/// Backpressure gate for a retentive (tunnel) read pump: park until the undrained\n/// ring has room below `retentive_cap`, woken by a `drain` on `room`. A no-op for\n/// an ordinary stream (`retentive_cap == 0`). Holds no lock across the await.\n// [impl->REQ-SHELL-4]\nasync fn await_ring_room(log: &Arc<Mutex<StreamLog>>, room: &tokio::sync::Notify) {\n    loop {\n        {\n            let l = log.lock().unwrap();\n            if l.retentive_cap == 0 || l.ring.len() < l.retentive_cap {\n                return;\n            }\n        }\n        room.notified().await;\n    }\n}\n…\n    pub fn stream_conn(&self, stream_id: u64) -> Option<(u64, String)> {\n…\n    }\n\n    /// Write `bytes` to a held stream's send side; `finish` closes the send\n    /// side after the write (the peer's read pump then sees a clean end).\n    // [impl->REQ-DAEMON-2]\n    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n        let entry = {\n            let streams = self.shared.streams.lock().unwrap();\n            Arc::clone(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        };\n        // Serve-lease gate (ADR-0038 Amendment fix 4): a stream whose\n        // subscriber POISONED has its lease canceled — refusing the send here\n        // is what terminates the paired serve/wire worker at its next\n        // forward instead of leaving an orphan forwarding leg running.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        if entry.log.lock().unwrap().lease.is_canceled() {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n            )));\n        }\n        let bytes = bytes.to_vec();\n        // Bounded (REQ-HAZARD-BROKER-QUIC-DEADLINE): `write_all` / `finish` on a\n        // black-holed QUIC stream blocks on flow-control the dead peer never grants.\n        // Loopback (in-process) never hangs, so the bound is a no-op for it.\n        self.bounded_block_on(async move {\n            let mut send = entry.send.lock().await;\n            if !bytes.is_empty() {\n                send.write_all(&bytes).await?;\n            }\n            if finish {\n                send.finish().await?;\n            }\n            Ok(())\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\n    /// not yet arrived, or capture gave up bounded).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        // A retired row answers no-such-stream: classification exists only to\n        // serve, and a retired exchange must never be served again.\n        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n            return None;\n        }\n        let line = entry.log.lock().unwrap().opener_line();\n…\n    }"}],"details":{"displayContent":{"text":"/// ring and held until the stream row goes away. Recovery classifies from\n/// this fact, never from ring seq 0 (which a bounded ring evicts under\n/// traffic — the abandoned-active-stream leg of the hertz RCA).\nenum OpenerCapture {\n    /// Still hunting the first `\\n` — holds every byte seen so far.\n    Buffering(Vec<u8>),\n    /// The complete first line (newline excluded), immutable from here on.\n    Pinned(Vec<u8>),\n    /// No newline within [`OPENER_PIN_MAX`] — not an NDJSON opener; give up\n    /// bounded (classification reads this as \"no opener\").\n    Oversize,\n}\n\n/// Transport backing a held connection. A real `Quic` connection (the only\n/// kind an inbound handshake can produce), or a broker-minted `Loopback` —\n/// an in-process connection with NO iroh handshake whose identity IS this node,\n/// established BY CONSTRUCTION. A loopback conn can ONLY be minted broker-side\n/// via [`NetHost::dial_loopback`]; it can never arise from an inbound handshake\n/// (a remote always presents its own key and cannot claim to be us). This is\n/// what lets a LOCAL `spt rc` ride the byte-identical `serve_attach` pump (M12\n/// W1.5, B1) — QUIC self-dial is refused by iroh (\"Connecting to ourself is not\n/// supported\"), so local attach rides a broker loopback conn instead.\nenum ConnKind {\n    /// A real QUIC connection — kept alive by ownership here; dropping it closes\n    /// the connection. Cloned (cheap handle) for stream opens.\n    Quic(Connection),\n    /// A broker-minted in-process loopback (no iroh handle, no handshake). Its\n    /// streams are minted eagerly in cross-wired pairs by [`NetHost::open_stream`];\n    /// there is no accept loop and no closed-watcher (it lives for the host).\n    Loopback,\n}\n\n/// One live connection the broker holds (QUIC or loopback).\nstruct ConnEntry {\n    /// The transport backing this connection.\n    kind: ConnKind,\n    /// The remote node's stable name (hex pubkey). For QUIC, proven by the\n    /// handshake; for loopback, THIS node's own id (the broker-minted identity).\n    remote_id_hex: String,\n    /// The subnets the peer proved current-epoch seed-knowledge of at connect\n    /// (Mesh-D2, REQ-MESH-1). Empty when seed-proof is disabled (`membership:\n    /// None`). The D5 gate swap reads this in place of `is_trusted(subnet, …)`;\n    /// at D2 it is cached but not yet consumed (the `is_trusted` gates still run\n    /// in parallel — belt + suspenders, no regression).\n    proven_subnets: HashSet<String>,\n}\n\n/// A bounded, sequenced read log for one QUIC stream — the PTY `OutputLog`\n/// discipline applied to the network (D4b): the stream's single read pump is\n/// the only producer; a brain connection attaches as the subscriber; every\n/// subscriber send happens under the enclosing `Mutex`, so live chunks and a\n/// replay can never interleave out of `seq` order. Chunks produced while no\n/// brain is attached sit in the ring and replay on the next subscribe — a\n/// brain restart loses nothing (Spike #3 invariant B/D).\n// [impl->REQ-DAEMON-2]\nstruct StreamLog {\n    stream_id: u64,\n    /// TRANSPORT read counter: bumped once per [`append`](Self::append) (one\n    /// read-pump `read_chunk`), INDEPENDENT of byte size. NOT a logical-chunk\n    /// count — QUIC may coalesce several sender writes into one receiver\n    /// `read_chunk` (or split one), so `next_seq` can be < the number of logical\n    /// chunks the sender issued for the SAME bytes. Correctness (byte-exact +\n    /// exactly-once) holds via these transport seqs + the recv cursor regardless;\n    /// any test asserting `next_seq == logical-chunk-count` is wrong (the Windows\n    /// coalescing flake) and must gate on BYTES instead.\n    next_seq: u64,\n    ring: VecDeque<(u64, Vec<u8>)>,\n    cap_chunks: usize,\n    /// The installed subscriber, behind its bounded writer queue (ADR-0038\n    /// Amendment fixes 2+3): producers ENQUEUE here; conn I/O never runs\n    /// under this log's mutex.\n    subscriber: Option<SubscriberSeat>,\n    /// The stream's serve lease (Amendment fix 4): canceled on subscriber\n    /// POISON so the paired serve/wire worker's sends refuse.\n    lease: Arc<StreamLease>,\n    /// Read side finished cleanly (peer called finish / conn ended).\n    finished: bool,\n    /// **Retentive backpressure cap** (M11-W3, REQ-SHELL-4), in chunks; `0` ⇒ not\n    /// retentive (ordinary bounded-overwrite stream). A shell-tunnel stream must\n    /// NOT drop bytes — CONTEXT:262 \"tunneled protocols cannot drop frames, so\n    /// congestion surfaces as lag, never loss.\" So a retentive log never cap-evicts\n    /// on append (no loss), and the read pump REFUSES to pull the next chunk once\n    /// the undrained ring reaches this cap (no unbounded growth ⇒ no OOM) — the\n    /// transport's native flow-control then lags the *sender*. A chunk leaves the\n    /// ring ONLY when [`drain`](Self::drain) (the recv cursor) pops it; the pump is\n    /// woken to resume via the entry's `room` notifier. Ordinary streams keep\n    /// `retentive_cap = 0` (a slow/absent brain must not OOM the broker via an\n    /// unbounded ring) and are drained by subscribe, never the sync cursor.\n    retentive_cap: usize,\n    /// The pinned first NDJSON line (ADR-0038 B) — one bounded side fact per\n    /// stream, independent of the ring's eviction. Fed by [`append`](Self::append).\n    opener: OpenerCapture,\n}\n\nimpl StreamLog {\n    fn new(stream_id: u64, cap_chunks: usize) -> Self {\n        StreamLog {\n            stream_id,\n            next_seq: 0,\n            ring: VecDeque::new(),\n            cap_chunks,\n            subscriber: None,\n            lease: Arc::new(StreamLease::default()),\n            finished: false,\n            retentive_cap: 0,\n            opener: OpenerCapture::Buffering(Vec::new()),\n        }\n    }\n\n    /// The pinned opener line, if the first `\\n` has arrived (ADR-0038 B).\n    /// `None` while still buffering or when capture gave up (`Oversize`).\n    fn opener_line(&self) -> Option<Vec<u8>> {\n        match &self.opener {\n            OpenerCapture::Pinned(line) => Some(line.clone()),\n            _ => None,\n        }\n    }\n\n    /// The oldest retained ring seq — the safe subscribe cursor after the ring\n    /// rolled (a `from_seq` below this floor makes the brain's gap check\n    /// reject the resume). `next_seq` when the ring is empty.\n    fn floor_seq(&self) -> u64 {\n        self.ring.front().map(|(s, _)| *s).unwrap_or(self.next_seq)\n    }\n\n    /// Mark this log retentive with backpressure `cap` (chunks). Idempotent set.\n    fn set_retentive(&mut self, cap: usize) {\n        self.retentive_cap = cap;\n    }\n\n    /// Append a freshly-read chunk: assign the next `seq`, retain it in the ring,\n    /// live-send to the current subscriber. Read-pump only. A non-retentive log\n    /// cap-evicts the oldest chunks past `cap_chunks`; a retentive (tunnel) log\n    /// never evicts — bytes leave only via [`drain`](Self::drain).\n    fn append(&mut self, bytes: &[u8]) {\n        // Opener capture (ADR-0038 B): pin the first NDJSON line as it streams\n        // past, before ring bounds can ever evict it. One-shot: `Pinned` and\n        // `Oversize` are terminal states.\n        // [impl->REQ-STREAM-OPENER-DURABLE]\n        if let OpenerCapture::Buffering(buf) = &mut self.opener {\n            match bytes.iter().position(|&b| b == b'\\n') {\n                Some(nl) => {\n                    buf.extend_from_slice(&bytes[..nl]);\n                    let line = std::mem::take(buf);\n                    self.opener = if line.len() > OPENER_PIN_MAX {\n                        OpenerCapture::Oversize\n                    } else {\n                        OpenerCapture::Pinned(line)\n                    };\n                }\n                None => {\n                    buf.extend_from_slice(bytes);\n                    if buf.len() > OPENER_PIN_MAX {\n                        self.opener = OpenerCapture::Oversize;\n                    }\n                }\n            }\n        }\n        let seq = self.next_seq;\n        self.next_seq += 1;\n        self.ring.push_back((seq, bytes.to_vec()));\n        if self.retentive_cap == 0 {\n            while self.ring.len() > self.cap_chunks {\n                self.ring.pop_front();\n            }\n        }\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_data_envelope(self.stream_id, seq, bytes);\n            // ENQUEUE only (ADR-0038 Amendment fix 3): the conn I/O runs on\n            // the seat's writer thread, outside this mutex — a wedged\n            // subscriber can no longer park this producer OR the lock.\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Remove the current seat after an enqueue failure (halt-at-first-\n    /// failure, all producer sites): a POISON also cancels the stream's\n    /// lease so the paired serve/wire worker terminates (Amendment fix 4);\n    /// an OVERFLOW just detaches — the brain resumes from its cursor.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn drop_seat(&mut self, fail: SeatFail) {\n        if let Some(seat) = self.subscriber.take() {\n            seat.sub.lifecycle_event(\n                \"stream-sub-halt\",\n                &format!(\"stream={} reason={fail:?}\", self.stream_id),\n            );\n            if fail == SeatFail::Poisoned {\n                self.lease.cancel();\n            }\n        }\n    }\n\n    /// Drain every undrained chunk in order (the shell-tunnel recv cursor, W3).\n    /// Pops the whole ring front-to-back (FIFO by `seq`) and concatenates the\n    /// bytes — chunk boundaries are arbitrary read-pump splits, irrelevant to an\n    /// opaque byte stream. Lossless + ordered: a byte leaves the ring only here,\n    /// once. Returns `(bytes, finished)`; `finished` reflects a clean/torn end so\n    /// the poller sees EOF and closes. Empty bytes with `finished=false` ⇒ nothing\n    /// pending yet.\n    fn drain(&mut self) -> (Vec<u8>, bool) {\n        let mut out = Vec::new();\n        while let Some((_, chunk)) = self.ring.pop_front() {\n            out.extend_from_slice(&chunk);\n        }\n        (out, self.finished)\n    }\n\n    /// Mark the read side finished and tell the subscriber (with the final\n    /// cursor, so it can verify completeness).\n    fn finish(&mut self) {\n        self.finished = true;\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);\n            // Enqueue only — same discipline as append (Amendment fix 2:\n            // ALL producer sites halt-and-remove, finish included).\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Install `sub` as the subscriber with the replay snapshot (retained\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\n    /// replay-then-live seq order is structural (see\n    /// [`SubscriberSeat::install`]), while every conn write still happens\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n    /// under the lock with discarded write errors, the exact serial-poison\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\n    ///\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\n    /// a replacement subscriber is never installed until the prior one is\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // No-reinstall-until-gone applies to the POISON class only\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n            // 15s bounded write — installing a replacement now would hand the\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\n            // DISPLACED as before (the newer-brain-takes-over contract).\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    format!(\n                        \"stream {} subscriber busy: prior subscriber still draining\",\n                        self.stream_id\n                    ),\n                ));\n            }\n            // Healthy displacement, prior fully gone, or same sub re-attach.\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\n        // record — this is one of the two RCA-pinned shared-carrier classes.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\n        sub.lifecycle_event(\n            \"stream-sub-attach\",\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\n        );\n        let mut replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|(s, _)| *s >= from_seq)\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\n            .collect();\n        if self.finished {\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\n        }\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\n        // prior writer — poisoned OR healthily displaced — holds only its own\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\n        // brain-swap displacement left the displaced writer and the successor\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\n        // write failure (its conn dying — every daemon refresh) canceled the\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\n        // displaced stream on exactly the post-refresh path this wave calms.\n        // One poison never dead-ends the stream (T5 recovery): the next\n        // generation's mint IS the renewal; `send_stream` reads this current\n        // Arc, old workers' handles stay theirs (C2 consumes via\n        // [`NetHost::stream_lease`]).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        self.lease = Arc::new(StreamLease::default());\n        let replay_len = replay.len();\n        self.subscriber = Some(SubscriberSeat::install(\n            sub,\n            replay,\n            Some(Arc::clone(&self.lease)),\n        ));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n}\n\n/// A bounded, sequenced log of connection liveness events — the broker-owned\n/// PresenceChannel seam (D4c, REQ-EP-4): the StreamLog ring/cursor discipline\n…\nenum SendHalf {\n…\n    Loopback(WriteHalf<DuplexStream>),\n}\n\nimpl SendHalf {\n    /// Write all `bytes` (no-op on empty). Runs on the host runtime.\n    async fn write_all(&mut self, bytes: &[u8]) -> io::Result<()> {\n        match self {\n            SendHalf::Quic(s) => s\n                .write_all(bytes)\n                .await\n                .map_err(|e| io::Error::other(e.to_string())),\n            SendHalf::Loopback(w) => w.write_all(bytes).await,\n        }\n    }\n\n    /// Close the send side so the peer's read pump sees a clean end (QUIC\n    /// `finish` / duplex `shutdown`).\n    async fn finish(&mut self) -> io::Result<()> {\n        match self {\n            SendHalf::Quic(s) => s.finish().map_err(|e| io::Error::other(e.to_string())),\n            SendHalf::Loopback(w) => w.shutdown().await,\n        }\n    }\n}\n\n/// A stream's read half — fed into the single read pump in [`register_stream`].\n/// QUIC reads via quinn's chunk API; loopback via the read end of the duplex.\n/// Both append to the same [`StreamLog`], so the subscriber (and everything\n/// above it) cannot tell the transports apart.\nenum RecvHalf {\n    Quic(RecvStream),\n    Loopback(ReadHalf<DuplexStream>),\n}\n\n/// One live stream the broker holds (QUIC or loopback): the send half (brain\n/// writes ride it over IPC) + the sequenced read log.\nstruct StreamEntry {\n    conn_id: u64,\n    remote_id_hex: String,\n    /// Whether THIS node opened the stream (`open_stream`) vs the peer\n    /// (accept loop). The inbound dispatcher (D9-1) claims only\n    /// peer-initiated streams; without this fact the table is ambiguous —\n    /// it holds locally-opened outbound streams too (gotcha: a dispatcher\n    /// that served its own requester stream would deadlock on itself).\n    initiated_locally: bool,\n    /// The send half, serialized behind an async mutex (writes happen on the\n    /// host's runtime via `block_on`).\n    send: tokio::sync::Mutex<SendHalf>,\n    log: Arc<Mutex<StreamLog>>,\n    /// Wakes the read pump when a retentive (tunnel) stream's ring drains below\n    /// its backpressure cap (M11-W3, REQ-SHELL-4) — see [`StreamLog::retentive_cap`].\n    /// Unused by ordinary (non-retentive) streams.\n    room: Arc<tokio::sync::Notify>,\n    /// Retired = invisible to dispatch eligibility (ADR-0038 A), NOT torn down:\n    /// retire must never sever the transport — the worker's reply send is\n    /// fire-and-forget, so a retire that dropped this entry could overtake the\n    /// still-queued reply inside the broker and reset the never-finished QUIC\n    /// send half (requester sees torn-EOF, no reply). The reply-flush ordering\n    /// is load-bearing; physical teardown belongs to the conn-close sweep only.\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    retired: std::sync::atomic::AtomicBool,\n}\n\n/// Tables shared between the host's sync surface and its runtime tasks\n/// (accept loop, per-conn stream acceptors, per-stream read pumps).\nstruct NetShared {\n    next_conn_id: AtomicU64,\n    conns: Mutex<HashMap<u64, ConnEntry>>,\n    next_stream_id: AtomicU64,\n    streams: Mutex<HashMap<u64, Arc<StreamEntry>>>,\n    ring_cap: usize,\n    /// The conn-liveness event log (D4c) — one per host, all conns interleaved.\n    presence: Mutex<PresenceLog>,\n}\n\nimpl NetShared {\n    fn new() -> Self {\n        NetShared {\n            next_conn_id: AtomicU64::new(1),\n            conns: Mutex::new(HashMap::new()),\n            next_stream_id: AtomicU64::new(1),\n            streams: Mutex::new(HashMap::new()),\n            ring_cap: ring_cap_from_env(),\n            presence: Mutex::new(PresenceLog::new(DEFAULT_STREAM_RING_CHUNKS)),\n        }\n    }\n}\n\n/// The stream ring depth — [`DEFAULT_STREAM_RING_CHUNKS`] in production.\n/// `SPT_STREAM_RING_CHUNKS` is a TEST-RIG-ONLY valve (the D2 regression rolls\n/// an opener out of a small ring deterministically instead of pushing >4096\n/// real transport chunks); production semantics and sizing are untouched.\nfn ring_cap_from_env() -> usize {\n    std::env::var(\"SPT_STREAM_RING_CHUNKS\")\n        .ok()\n        .and_then(|v| v.parse().ok())\n        .filter(|n: &usize| *n > 0)\n        .unwrap_or(DEFAULT_STREAM_RING_CHUNKS)\n}\n\n/// Register a live connection: mint its broker id and spawn its inbound-stream\n/// acceptor. Must run inside the host's runtime context (the accept loop, or a\n/// `block_on` future) — it spawns tasks.\n/// The connection's OBSERVED remote address as opaque seed JSON (REQ-CONV-1):\n/// the path address string, or `null` when id-only / path-less (nothing worth\n/// seeding over discovery). Shared by [`register_conn`]'s presence write-back\n/// and [`NetHost::conn_remote_addr_json`] so both seed identically.\n// [impl->REQ-CONV-1]\nfn observed_addr_json(conn: &Connection) -> serde_json::Value {\n    let addr = spt_net::net::endpoint::conn_remote_addr(conn);\n    if addr.is_empty() {\n        return serde_json::Value::Null; // id-only adds nothing over discovery\n    }\n    serde_json::to_value(addr).unwrap_or(serde_json::Value::Null)\n}\n\n/// A `Send + 'static` snapshot of one dial's inputs — the SHARED connect path\n/// for both the blocking [`NetHost::dial`] and the spawned\n/// [`NetHost::submit_dial`], so W1's per-dial bound and the Mesh-D2 seed-proof\n/// stay single-sourced (never a second, drifting dial impl).\nstruct DialPlan {\n    endpoint: Arc<NetEndpoint>,\n    shared: Arc<NetShared>,\n    local_id: PublicKey,\n    membership: Option<MembershipSource>,\n    roster_rx: Option<RosterExchange>,\n    self_addr: serde_json::Value,\n}\n\nimpl DialPlan {\n    /// Connect, prove membership in-band (Mesh-D2 — a failed/empty proof drops\n    /// the dial before it registers; Mesh-D4 roster leg rides the same stream on\n    /// success), then register the conn (which emits `PRESENCE_CONNECTED` with\n    /// the observed addr). The caller bounds this await (the blocking dial via\n    /// `bounded_block_on`; the submit via its own `timeout`). `stage` names the\n    /// pipeline stage the dial is in (ADR-0039 Decision 5) — a stage-local\n    /// error and the caller's outer timeout both read it, so the failure token\n    /// says WHERE the dial died instead of collapsing six stages into one.\n    // [impl->REQ-PUMP-STAGE-TRUTH]\n    async fn connect(self, addr: EndpointAddr, stage: &DialStage) -> io::Result<(u64, String)> {\n        stage.enter(spt_seedproof_stage::STAGE_QUIC_CONNECT);\n        let conn = self.endpoint.connect(addr).await.map_err(|e| {\n            let msg = e.to_string();\n            if msg.to_ascii_lowercase().contains(\"alpn\") {\n                stage.enter(spt_seedproof_stage::STAGE_ALPN);\n            }\n            io::Error::other(msg)\n        })?;\n        let proven = match self.membership {\n            Some(src) => {\n                let creds = src();\n…\n            }\n…\n        };\n…\n    }\n}\n…\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n\n/// Backpressure gate for a retentive (tunnel) read pump: park until the undrained\n/// ring has room below `retentive_cap`, woken by a `drain` on `room`. A no-op for\n/// an ordinary stream (`retentive_cap == 0`). Holds no lock across the await.\n// [impl->REQ-SHELL-4]\nasync fn await_ring_room(log: &Arc<Mutex<StreamLog>>, room: &tokio::sync::Notify) {\n    loop {\n        {\n            let l = log.lock().unwrap();\n            if l.retentive_cap == 0 || l.ring.len() < l.retentive_cap {\n                return;\n            }\n        }\n        room.notified().await;\n    }\n}\n…\n    pub fn stream_conn(&self, stream_id: u64) -> Option<(u64, String)> {\n…\n    }\n\n    /// Write `bytes` to a held stream's send side; `finish` closes the send\n    /// side after the write (the peer's read pump then sees a clean end).\n    // [impl->REQ-DAEMON-2]\n    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n        let entry = {\n            let streams = self.shared.streams.lock().unwrap();\n            Arc::clone(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        };\n        // Serve-lease gate (ADR-0038 Amendment fix 4): a stream whose\n        // subscriber POISONED has its lease canceled — refusing the send here\n        // is what terminates the paired serve/wire worker at its next\n        // forward instead of leaving an orphan forwarding leg running.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        if entry.log.lock().unwrap().lease.is_canceled() {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n            )));\n        }\n        let bytes = bytes.to_vec();\n        // Bounded (REQ-HAZARD-BROKER-QUIC-DEADLINE): `write_all` / `finish` on a\n        // black-holed QUIC stream blocks on flow-control the dead peer never grants.\n        // Loopback (in-process) never hangs, so the bound is a no-op for it.\n        self.bounded_block_on(async move {\n            let mut send = entry.send.lock().await;\n            if !bytes.is_empty() {\n                send.write_all(&bytes).await?;\n            }\n            if finish {\n                send.finish().await?;\n            }\n            Ok(())\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\n    /// not yet arrived, or capture gave up bounded).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        // A retired row answers no-such-stream: classification exists only to\n        // serve, and a retired exchange must never be served again.\n        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n            return None;\n        }\n        let line = entry.log.lock().unwrap().opener_line();\n…\n    }","startLine":280,"lineNumbers":[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,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,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,null,738,null,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,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,null,904,null,906,null,908,909,null,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,null,1743,null,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,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,null,1872]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784271492378}}
{"type":"message","id":"56153205","parentId":"8e4b379c","timestamp":"2026-07-17T06:58:12.379Z","message":{"role":"toolResult","toolCallId":"call_1kiVYiRPvn41e3cnTAX2JxNl|fc_0a061eb498f0e908016a59d28448048196a4caaf98477c8bf2","toolName":"grep","content":[{"type":"text","text":"# crates/spt-term/src/\n## pty.rs\n 34|/// [`PtySession::wait`] / [`PtySession::kill`].\n*35|pub struct PtySession {\n 36|    /// The master end, behind a lock so `resize` never races the reader (Spike #5).\n 37|    master: Mutex<Box<dyn MasterPty + Send>>,\n 38|    /// The single PTY writer, shared so the A2 drain thread can answer DSR.\n...\n 50|\n*51|impl PtySession {\n 52|    /// Spawn `cmd` under a fresh native PTY sized to `size`.\n 53|    ///\n 54|    /// The slave end is dropped immediately after the child is spawned: the\n...\n 202|    /// Block until the child exits, yielding its status.\n*203|    pub fn wait(&self) -> Result<ExitStatus, SurfaceError> {\n 204|        self.child.lock().unwrap().wait().map_err(SurfaceError::Io)\n 205|    }\n 206|\n...\n 209|    /// [`PtySession::wait`] / [`PtySession::try_wait`].\n*210|    pub fn kill(&self) -> Result<(), SurfaceError> {\n 211|        let res = self.killer.lock().unwrap().kill();\n 212|        #[cfg(windows)]\n 213|        {\n...\n 234|// [impl->REQ-TERM-1]\n*235|impl SessionSurface for PtySession {\n 236|    fn write_input(&self, bytes: &[u8]) -> Result<(), SurfaceError> {\n 237|        let mut w = self.writer.lock().unwrap();\n 238|        w.write_all(bytes).map_err(SurfaceError::Io)?;\n## reader.rs\n 67|/// cooperative stop flag; see the module docs for the teardown contract.\n*68|pub struct Drain {\n 69|    stop: Arc<AtomicBool>,\n 70|    dsr_answered: Arc<AtomicU64>,\n 71|    bytes: Arc<AtomicU64>,\n...\n 161|\n*162|impl PtySession {\n 163|    /// Start draining this surface's output on a background thread, answering\n 164|    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\n 165|    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\n...\n 169|    // [impl->REQ-HAZARD-CONPTY-DSR]\n*170|    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\n 171|    where\n 172|        S: FnMut(&[u8]) + Send + 'static,\n 173|    {\n## stream.rs\n 51|    /// and the cooperative stop flag.\n*52|    pub fn drain(&self) -> &Drain {\n 53|        &self.drain\n 54|    }\n 55|\n...\n 61|\n*62|impl PtySession {\n 63|    /// Stream this surface's output through a bounded channel of `capacity`\n 64|    /// chunks. `capacity == 0` is a rendezvous channel (maximum backpressure:\n 65|    /// every chunk blocks until the consumer takes it)."}],"details":{"scopePath":"crates/spt-term/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":10,"fileCount":3,"files":["crates/spt-term/src/pty.rs","crates/spt-term/src/reader.rs","crates/spt-term/src/stream.rs"],"fileMatches":[{"path":"crates/spt-term/src/pty.rs","count":5},{"path":"crates/spt-term/src/reader.rs","count":3},{"path":"crates/spt-term/src/stream.rs","count":2}],"truncated":false,"displayContent":"# crates/spt-term/src/\n## pty.rs\n  34│/// [`PtySession::wait`] / [`PtySession::kill`].\n *35│pub struct PtySession {\n  36│    /// The master end, behind a lock so `resize` never races the reader (Spike #5).\n  37│    master: Mutex<Box<dyn MasterPty + Send>>,\n  38│    /// The single PTY writer, shared so the A2 drain thread can answer DSR.\n    │...\n  50│\n *51│impl PtySession {\n  52│    /// Spawn `cmd` under a fresh native PTY sized to `size`.\n  53│    ///\n  54│    /// The slave end is dropped immediately after the child is spawned: the\n    │...\n 202│    /// Block until the child exits, yielding its status.\n*203│    pub fn wait(&self) -> Result<ExitStatus, SurfaceError> {\n 204│        self.child.lock().unwrap().wait().map_err(SurfaceError::Io)\n 205│    }\n 206│\n    │...\n 209│    /// [`PtySession::wait`] / [`PtySession::try_wait`].\n*210│    pub fn kill(&self) -> Result<(), SurfaceError> {\n 211│        let res = self.killer.lock().unwrap().kill();\n 212│        #[cfg(windows)]\n 213│        {\n    │...\n 234│// [impl->REQ-TERM-1]\n*235│impl SessionSurface for PtySession {\n 236│    fn write_input(&self, bytes: &[u8]) -> Result<(), SurfaceError> {\n 237│        let mut w = self.writer.lock().unwrap();\n 238│        w.write_all(bytes).map_err(SurfaceError::Io)?;\n## reader.rs\n  67│/// cooperative stop flag; see the module docs for the teardown contract.\n *68│pub struct Drain {\n  69│    stop: Arc<AtomicBool>,\n  70│    dsr_answered: Arc<AtomicU64>,\n  71│    bytes: Arc<AtomicU64>,\n    │...\n 161│\n*162│impl PtySession {\n 163│    /// Start draining this surface's output on a background thread, answering\n 164│    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\n 165│    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\n    │...\n 169│    // [impl->REQ-HAZARD-CONPTY-DSR]\n*170│    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\n 171│    where\n 172│        S: FnMut(&[u8]) + Send + 'static,\n 173│    {\n## stream.rs\n 51│    /// and the cooperative stop flag.\n*52│    pub fn drain(&self) -> &Drain {\n 53│        &self.drain\n 54│    }\n 55│\n   │...\n 61│\n*62│impl PtySession {\n 63│    /// Stream this surface's output through a bounded channel of `capacity`\n 64│    /// chunks. `capacity == 0` is a rendezvous channel (maximum backpressure:\n 65│    /// every chunk blocks until the consumer takes it)."},"isError":false,"timestamp":1784271492379}}
{"type":"message","id":"0227a79d","parentId":"56153205","timestamp":"2026-07-17T06:58:12.379Z","message":{"role":"toolResult","toolCallId":"call_m1VQOuc8kWD0qWMLFE97Zhth|fc_0a061eb498f0e908016a59d28447f08196ab553f48b1a9c95a","toolName":"grep","content":[{"type":"text","text":"# crates/spt-term/src/\n## reader.rs\n 119|\n*120|        let handle = thread::spawn(move || {\n 121|            let mut reader = reader;\n 122|            let mut matcher = DsrMatcher::default();\n 123|            let mut buf = [0u8; 8192];"}],"details":{"scopePath":"crates/spt-term/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":1,"fileCount":1,"files":["crates/spt-term/src/reader.rs"],"fileMatches":[{"path":"crates/spt-term/src/reader.rs","count":1}],"truncated":false,"displayContent":"# crates/spt-term/src/\n## reader.rs\n 119│\n*120│        let handle = thread::spawn(move || {\n 121│            let mut reader = reader;\n 122│            let mut matcher = DsrMatcher::default();\n 123│            let mut buf = [0u8; 8192];"},"isError":false,"timestamp":1784271492379}}
{"type":"message","id":"98b35904","parentId":"0227a79d","timestamp":"2026-07-17T06:58:12.382Z","message":{"role":"toolResult","toolCallId":"call_SOFEVEARax2kmBSN6F4n5zq7|fc_0a061eb498f0e908016a59d284481c8196bd374f87db48a292","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## applyhost.rs\n 909|        assert_eq!(\n*910|            broker.session_count(),\n 911|            1,\n 912|            \"exactly one session across the apply\"\n 913|        );\n...\n 1051|        assert_eq!(std::fs::read(&exe).unwrap(), b\"NEW WITHOUT SESSIONS\");\n*1052|        assert_eq!(broker.session_count(), 0);\n 1053|    }\n 1054|\n 1055|    // [unit->REQ-UPD-6] Broker-touching debug/update-set payloads are accepted\n## brain.rs\n 37|use crate::msg::{\n*38|    decode_bytes, encode_bytes, AdapterApplyReq, AppliedEvent, BrainRestarted, BrokerImageReply, StallEvictsReply, DisplacedEvent,\n 39|    EndpointInjected, EndpointInputReq, ErrorEvent, ExitEvent,\n 40|    InputReq,\n 41|    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n...\n 1143|                KIND_BROKER_IMAGE_REPLY => {\n*1144|                    let ev: BrokerImageReply = serde_json::from_value(env.payload)\n 1145|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1146|                    return Ok(Some(ev.version));\n 1147|                }\n...\n 1160|    /// is too old to answer (an older broker replies `unknown command kind`), read as\n*1161|    /// \"not reported\" on `daemon status` — same forward-compat contract as\n 1162|    /// [`broker_image_version`](Self::broker_image_version).\n 1163|    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n 1164|    pub fn stall_evicts(&mut self) -> io::Result<Option<(u64, u64)>> {\n...\n 1169|                KIND_STALL_EVICTS_REPLY => {\n*1170|                    let ev: StallEvictsReply = serde_json::from_value(env.payload)\n 1171|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1172|                    return Ok(Some((ev.count, ev.last_ms)));\n 1173|                }\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, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n 60|    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 268|/// The current stall-evict tally `(count_since_boot, last_evict_wall_ms)` —\n*269|/// `last_evict_wall_ms` is 0 when none have happened. Read by the `daemon status`\n 270|/// surface (the observability rider).\n 271|// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n 272|pub(crate) fn stall_evict_stats() -> (u64, u64) {\n...\n 1062|    /// record the evict for observability (broker log now; W3 persists the stderr,\n*1063|    /// the tally surfaces on `daemon status`). The take/reattach path and the\n 1064|    /// `KIND_SESSIONS` reap call this so a suspended brain subscriber can never hold\n 1065|    /// control on an idle session (the output-driven [`mark_controller_gone`] never\n 1066|    /// fires without new output). Returns true iff it evicted. `stamp` selects whether\n...\n 1482|/// the physical bound now fires FIRST, so the tally is recorded here — same\n*1483|/// event class, same `daemon status` surface. An ORGANIC write failure (peer\n 1484|/// death, any non-TimedOut error) stays uncounted, exactly as before.\n 1485|// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 1486|// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n...\n 2823|    /// Number of currently hosted sessions (for tests / introspection).\n*2824|    pub fn session_count(&self) -> usize {\n 2825|        recover(&self.sessions).len()\n 2826|    }\n 2827|\n...\n 2921|    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*2922|    pub fn conn_handler_count(&self) -> usize {\n 2923|        self.conn_handlers.load(Ordering::Acquire)\n 2924|    }\n 2925|\n...\n 2998|    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n*2999|    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n 3000|    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*3001|    pub fn net_conn_count(&self) -> usize {\n 3002|        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n 3003|    }\n 3004|\n...\n 3026|        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n*3027|        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028|        struct HandlerTally<'a>(&'a AtomicUsize);\n 3029|        impl Drop for HandlerTally<'_> {\n 3030|            fn drop(&mut self) {\n...\n 3919|    /// (brain-only restart, ADR-0018 D3-3) honestly reports the PRE-apply version\n*3920|    /// — the authoritative running-image truth the `daemon status` version surface\n 3921|    /// compares against the freshly-installed CLI. Sourced from the running\n 3922|    /// process, never inferred from disk (the disk is the half already ahead).\n 3923|    // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n...\n 3926|            KIND_BROKER_IMAGE_REPLY,\n*3927|            serde_json::to_value(BrokerImageReply {\n 3928|                // spt-daemon's CARGO_PKG_VERSION == the workspace version this\n 3929|                // broker binary was compiled at.\n 3930|                version: env!(\"CARGO_PKG_VERSION\").to_string(),\n 3931|            })\n*3932|            .expect(\"BrokerImageReply serializes\"),\n 3933|        );\n 3934|        send_frame(send, &frame);\n 3935|    }\n...\n 3937|    /// Answer the brain-subscriber stall-evict tally query (LIFECYCLE-TRUTH W2\n*3938|    /// observability rider) from the broker-global counters — so `daemon status` can\n 3939|    /// surface a brain that never returned as a diagnosable fact, not a silent absence.\n 3940|    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n 3941|    fn dispatch_stall_evicts(&self, send: &SharedSend) {\n...\n 3944|            KIND_STALL_EVICTS_REPLY,\n*3945|            serde_json::to_value(StallEvictsReply { count, last_ms })\n*3946|                .expect(\"StallEvictsReply serializes\"),\n 3947|        );\n 3948|        send_frame(send, &frame);\n 3949|    }\n...\n 4370|            serde_json::to_value(NetStreamsReply {\n*4371|                streams: host.stream_infos(),\n 4372|            })\n 4373|            .expect(\"NetStreamsReply serializes\"),\n 4374|        );\n## endpoint.rs\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## msg.rs\n 98|/// router's forward-compat default), which the CLI reads as \"too old to report\".\n*99|pub const KIND_BROKER_IMAGE: &str = \"broker-image\";\n 100|/// Broker→brain: the broker image version reply.\n*101|pub const KIND_BROKER_IMAGE_REPLY: &str = \"broker-image-reply\";\n 102|/// Brain→broker query: the brain-subscriber stall-evict tally (LIFECYCLE-TRUTH W2\n 103|/// observability rider, REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE) — how many\n 104|/// controllers were stall-evicted for a suspended/black-holed brain conn since\n*105|/// boot, and when the most recent fired. Surfaced on `daemon status` so a brain\n 106|/// that never returns is a diagnosable fact. An older broker predating this kind\n 107|/// replies `unknown command kind` (forward-compat), read as \"not reported\".\n 108|pub const KIND_STALL_EVICTS: &str = \"stall-evicts\";\n...\n 570|\n*571|/// `broker-image-reply` — the semver the RUNNING broker process was compiled with\n 572|/// (its own `CARGO_PKG_VERSION`), the authoritative running-image version for the\n 573|/// F-025 version surface (a surviving old broker honestly reports the pre-apply\n 574|/// version). `version` is defaulted so a truncated/older reply still decodes\n...\n 576|#[derive(Debug, Clone, Serialize, Deserialize)]\n*577|pub struct BrokerImageReply {\n 578|    /// The broker's compiled image version (semver).\n 579|    #[serde(default)]\n 580|    pub version: String,\n...\n 586|#[derive(Debug, Clone, Serialize, Deserialize)]\n*587|pub struct StallEvictsReply {\n 588|    /// Controllers stall-evicted for a suspended/black-holed brain conn since broker boot.\n 589|    #[serde(default)]\n 590|    pub count: u64,\n## nethost.rs\n 1804|    /// enumeration is exactly what a future dispatcher generation would replay.\n*1805|    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n 1806|        let streams = self.shared.streams.lock().unwrap();\n 1807|        streams\n 1808|            .iter()\n...\n 1828|    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\n*1829|    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\n 1830|    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n 1831|    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n 1832|    /// reply sends when it removed the entry (see the `retired` field note).\n...\n 2164|        let op_stream = host.open_stream(c1).expect(\"open loopback stream\");\n*2165|        let infos = host.stream_infos();\n 2166|        assert_eq!(infos.len(), 2, \"operator + peer rows\");\n 2167|        let op = infos\n 2168|            .iter()\n...\n 2189|            if host\n*2190|                .stream_infos()\n 2191|                .iter()\n 2192|                .any(|s| s.stream_id == peer_id && s.next_seq > 0)\n 2193|            {\n...\n 2387|    // named row from dispatch eligibility: the retired stream leaves the\n*2388|    // dispatch enumeration (stream_infos) while the active sibling stays\n 2389|    // claimable, a second retire is a no-op, and the pinned-opener query\n 2390|    // answers no-such-stream afterwards. Retirement is visibility, not\n 2391|    // teardown — the transport half of the contract is the sibling test\n...\n 2414|        assert!(host.retire_stream(shell), \"first retire hides the row\");\n*2415|        let ids: Vec<u64> = host.stream_infos().iter().map(|s| s.stream_id).collect();\n 2416|        assert!(!ids.contains(&shell), \"retired row left the enumeration\");\n 2417|        assert!(ids.contains(&owner), \"the active sibling row stays\");\n 2418|        assert!(!host.retire_stream(shell), \"second retire is a no-op\");\n...\n 2484|        for _ in 0..400 {\n*2485|            if !b.stream_infos().is_empty() {\n 2486|                saw = true;\n 2487|                break;\n 2488|            }\n...\n 2496|        for _ in 0..600 {\n*2497|            if b.stream_infos().is_empty() {\n 2498|                swept = true;\n 2499|                break;\n 2500|            }\n## projwriter.rs\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 83|#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]\n 84|pub struct IndexWriterStats {\n...\n 138|/// Read the stats sidecar (tolerant: absent/corrupt → `None`) — the\n*139|/// `spt daemon status` consumer half.\n 140|pub fn read_stats_at(path: &Path) -> Option<IndexWriterStats> {\n 141|    let raw = std::fs::read_to_string(path).ok()?;\n 142|    serde_json::from_str(&raw).ok()\n## service.rs\n 18|//! so start stays a detached spawn and stop stays an IPC stop; the task is\n*19|//! surfaced only as a `daemon status` boot hint.\n 20|\n 21|use std::io;\n 22|#[allow(unused_imports)]\n...\n 102|    fn stop(&self) -> io::Result<()>;\n*103|    /// Short label for `daemon status` + conflict warnings (\"systemd --user\").\n 104|    fn label(&self) -> &'static str;\n*105|    /// A boot-autostart note for `daemon status`, when the platform has one\n 106|    /// that isn't a start/stop-controllable service (the Windows logon task,\n 107|    /// or the systemd unit's enable-state). `None` = nothing to add.\n 108|    fn boot_hint(&self) -> Option<String> {\n\n## pump/\n### health.rs\n 10|//! The pump owns the state and persists it to `identity/pump-health.json`\n*11|//! (sibling of the heartbeat); `spt daemon status` / `spt subnet status`\n 12|//! read the file. Fields are additive — an N-1 reader ignores them.\n 13|// [impl->REQ-PUMP-STAGE-TRUTH]\n 14|\n### mod.rs\n 259|    /// epoch-ms written while the loop is alive, rendered by\n*260|    /// `spt daemon status` / the `subnet status` stall warning\n 261|    /// ([`crate::endpoint::pump_heartbeat_path`]).\n 262|    pub heartbeat: PathBuf,\n 263|    /// `rotation-pending.json` (Mesh-D7, REQ-MESH-4): the timeboxed seed-rotation\n...\n 1167|/// Write the pump's last-tick heartbeat (epoch ms) — the liveness fact\n*1168|/// `spt daemon status` renders and the `subnet status` stall warning reads\n 1169|/// (M8 decision 23). Best-effort: a failed write costs honesty, never the\n 1170|/// pump (and the reader treats an absent/unreadable file as \"no heartbeat\n 1171|/// recorded\", not as healthy).\n...\n 1803|    // stamp at the given path (creating parents) and a later write advances\n*1804|    // it — what the D1 `daemon status` reader + stall warning consume.\n 1805|    #[test]\n 1806|    fn heartbeat_writes_and_advances() {\n 1807|        let dir = tempfile::tempdir().unwrap();\n\nSkipped missing paths: crates/spt-cli/src"}],"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":46,"fileCount":10,"files":["crates/spt-daemon/src/applyhost.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/endpoint.rs","crates/spt-daemon/src/msg.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/pump/health.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/service.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/applyhost.rs","count":2},{"path":"crates/spt-daemon/src/brain.rs","count":4},{"path":"crates/spt-daemon/src/broker.rs","count":16},{"path":"crates/spt-daemon/src/endpoint.rs","count":1},{"path":"crates/spt-daemon/src/msg.rs","count":6},{"path":"crates/spt-daemon/src/nethost.rs","count":8},{"path":"crates/spt-daemon/src/projwriter.rs","count":2},{"path":"crates/spt-daemon/src/pump/health.rs","count":1},{"path":"crates/spt-daemon/src/pump/mod.rs","count":3},{"path":"crates/spt-daemon/src/service.rs","count":3}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## applyhost.rs\n  909│        assert_eq!(\n *910│            broker.session_count(),\n  911│            1,\n  912│            \"exactly one session across the apply\"\n  913│        );\n     │...\n 1051│        assert_eq!(std::fs::read(&exe).unwrap(), b\"NEW WITHOUT SESSIONS\");\n*1052│        assert_eq!(broker.session_count(), 0);\n 1053│    }\n 1054│\n 1055│    // [unit->REQ-UPD-6] Broker-touching debug/update-set payloads are accepted\n## brain.rs\n   37│use crate::msg::{\n  *38│    decode_bytes, encode_bytes, AdapterApplyReq, AppliedEvent, BrainRestarted, BrokerImageReply, StallEvictsReply, DisplacedEvent,\n   39│    EndpointInjected, EndpointInputReq, ErrorEvent, ExitEvent,\n   40│    InputReq,\n   41│    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n     │...\n 1143│                KIND_BROKER_IMAGE_REPLY => {\n*1144│                    let ev: BrokerImageReply = serde_json::from_value(env.payload)\n 1145│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1146│                    return Ok(Some(ev.version));\n 1147│                }\n     │...\n 1160│    /// is too old to answer (an older broker replies `unknown command kind`), read as\n*1161│    /// \"not reported\" on `daemon status` — same forward-compat contract as\n 1162│    /// [`broker_image_version`](Self::broker_image_version).\n 1163│    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n 1164│    pub fn stall_evicts(&mut self) -> io::Result<Option<(u64, u64)>> {\n     │...\n 1169│                KIND_STALL_EVICTS_REPLY => {\n*1170│                    let ev: StallEvictsReply = serde_json::from_value(env.payload)\n 1171│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1172│                    return Ok(Some((ev.count, ev.last_ms)));\n 1173│                }\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, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n   60│    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  268│/// The current stall-evict tally `(count_since_boot, last_evict_wall_ms)` —\n *269│/// `last_evict_wall_ms` is 0 when none have happened. Read by the `daemon status`\n  270│/// surface (the observability rider).\n  271│// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n  272│pub(crate) fn stall_evict_stats() -> (u64, u64) {\n     │...\n 1062│    /// record the evict for observability (broker log now; W3 persists the stderr,\n*1063│    /// the tally surfaces on `daemon status`). The take/reattach path and the\n 1064│    /// `KIND_SESSIONS` reap call this so a suspended brain subscriber can never hold\n 1065│    /// control on an idle session (the output-driven [`mark_controller_gone`] never\n 1066│    /// fires without new output). Returns true iff it evicted. `stamp` selects whether\n     │...\n 1482│/// the physical bound now fires FIRST, so the tally is recorded here — same\n*1483│/// event class, same `daemon status` surface. An ORGANIC write failure (peer\n 1484│/// death, any non-TimedOut error) stays uncounted, exactly as before.\n 1485│// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 1486│// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n     │...\n 2823│    /// Number of currently hosted sessions (for tests / introspection).\n*2824│    pub fn session_count(&self) -> usize {\n 2825│        recover(&self.sessions).len()\n 2826│    }\n 2827│\n     │...\n 2921│    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*2922│    pub fn conn_handler_count(&self) -> usize {\n 2923│        self.conn_handlers.load(Ordering::Acquire)\n 2924│    }\n 2925│\n     │...\n 2998│    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n*2999│    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n 3000│    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*3001│    pub fn net_conn_count(&self) -> usize {\n 3002│        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n 3003│    }\n 3004│\n     │...\n 3026│        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n*3027│        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028│        struct HandlerTally<'a>(&'a AtomicUsize);\n 3029│        impl Drop for HandlerTally<'_> {\n 3030│            fn drop(&mut self) {\n     │...\n 3919│    /// (brain-only restart, ADR-0018 D3-3) honestly reports the PRE-apply version\n*3920│    /// — the authoritative running-image truth the `daemon status` version surface\n 3921│    /// compares against the freshly-installed CLI. Sourced from the running\n 3922│    /// process, never inferred from disk (the disk is the half already ahead).\n 3923│    // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n     │...\n 3926│            KIND_BROKER_IMAGE_REPLY,\n*3927│            serde_json::to_value(BrokerImageReply {\n 3928│                // spt-daemon's CARGO_PKG_VERSION == the workspace version this\n 3929│                // broker binary was compiled at.\n 3930│                version: env!(\"CARGO_PKG_VERSION\").to_string(),\n 3931│            })\n*3932│            .expect(\"BrokerImageReply serializes\"),\n 3933│        );\n 3934│        send_frame(send, &frame);\n 3935│    }\n     │...\n 3937│    /// Answer the brain-subscriber stall-evict tally query (LIFECYCLE-TRUTH W2\n*3938│    /// observability rider) from the broker-global counters — so `daemon status` can\n 3939│    /// surface a brain that never returned as a diagnosable fact, not a silent absence.\n 3940│    // [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n 3941│    fn dispatch_stall_evicts(&self, send: &SharedSend) {\n     │...\n 3944│            KIND_STALL_EVICTS_REPLY,\n*3945│            serde_json::to_value(StallEvictsReply { count, last_ms })\n*3946│                .expect(\"StallEvictsReply serializes\"),\n 3947│        );\n 3948│        send_frame(send, &frame);\n 3949│    }\n     │...\n 4370│            serde_json::to_value(NetStreamsReply {\n*4371│                streams: host.stream_infos(),\n 4372│            })\n 4373│            .expect(\"NetStreamsReply serializes\"),\n 4374│        );\n## endpoint.rs\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## msg.rs\n  98│/// router's forward-compat default), which the CLI reads as \"too old to report\".\n *99│pub const KIND_BROKER_IMAGE: &str = \"broker-image\";\n 100│/// Broker→brain: the broker image version reply.\n*101│pub const KIND_BROKER_IMAGE_REPLY: &str = \"broker-image-reply\";\n 102│/// Brain→broker query: the brain-subscriber stall-evict tally (LIFECYCLE-TRUTH W2\n 103│/// observability rider, REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE) — how many\n 104│/// controllers were stall-evicted for a suspended/black-holed brain conn since\n*105│/// boot, and when the most recent fired. Surfaced on `daemon status` so a brain\n 106│/// that never returns is a diagnosable fact. An older broker predating this kind\n 107│/// replies `unknown command kind` (forward-compat), read as \"not reported\".\n 108│pub const KIND_STALL_EVICTS: &str = \"stall-evicts\";\n    │...\n 570│\n*571│/// `broker-image-reply` — the semver the RUNNING broker process was compiled with\n 572│/// (its own `CARGO_PKG_VERSION`), the authoritative running-image version for the\n 573│/// F-025 version surface (a surviving old broker honestly reports the pre-apply\n 574│/// version). `version` is defaulted so a truncated/older reply still decodes\n    │...\n 576│#[derive(Debug, Clone, Serialize, Deserialize)]\n*577│pub struct BrokerImageReply {\n 578│    /// The broker's compiled image version (semver).\n 579│    #[serde(default)]\n 580│    pub version: String,\n    │...\n 586│#[derive(Debug, Clone, Serialize, Deserialize)]\n*587│pub struct StallEvictsReply {\n 588│    /// Controllers stall-evicted for a suspended/black-holed brain conn since broker boot.\n 589│    #[serde(default)]\n 590│    pub count: u64,\n## nethost.rs\n 1804│    /// enumeration is exactly what a future dispatcher generation would replay.\n*1805│    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n 1806│        let streams = self.shared.streams.lock().unwrap();\n 1807│        streams\n 1808│            .iter()\n     │...\n 1828│    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\n*1829│    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\n 1830│    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n 1831│    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n 1832│    /// reply sends when it removed the entry (see the `retired` field note).\n     │...\n 2164│        let op_stream = host.open_stream(c1).expect(\"open loopback stream\");\n*2165│        let infos = host.stream_infos();\n 2166│        assert_eq!(infos.len(), 2, \"operator + peer rows\");\n 2167│        let op = infos\n 2168│            .iter()\n     │...\n 2189│            if host\n*2190│                .stream_infos()\n 2191│                .iter()\n 2192│                .any(|s| s.stream_id == peer_id && s.next_seq > 0)\n 2193│            {\n     │...\n 2387│    // named row from dispatch eligibility: the retired stream leaves the\n*2388│    // dispatch enumeration (stream_infos) while the active sibling stays\n 2389│    // claimable, a second retire is a no-op, and the pinned-opener query\n 2390│    // answers no-such-stream afterwards. Retirement is visibility, not\n 2391│    // teardown — the transport half of the contract is the sibling test\n     │...\n 2414│        assert!(host.retire_stream(shell), \"first retire hides the row\");\n*2415│        let ids: Vec<u64> = host.stream_infos().iter().map(|s| s.stream_id).collect();\n 2416│        assert!(!ids.contains(&shell), \"retired row left the enumeration\");\n 2417│        assert!(ids.contains(&owner), \"the active sibling row stays\");\n 2418│        assert!(!host.retire_stream(shell), \"second retire is a no-op\");\n     │...\n 2484│        for _ in 0..400 {\n*2485│            if !b.stream_infos().is_empty() {\n 2486│                saw = true;\n 2487│                break;\n 2488│            }\n     │...\n 2496│        for _ in 0..600 {\n*2497│            if b.stream_infos().is_empty() {\n 2498│                swept = true;\n 2499│                break;\n 2500│            }\n## projwriter.rs\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  83│#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]\n  84│pub struct IndexWriterStats {\n    │...\n 138│/// Read the stats sidecar (tolerant: absent/corrupt → `None`) — the\n*139│/// `spt daemon status` consumer half.\n 140│pub fn read_stats_at(path: &Path) -> Option<IndexWriterStats> {\n 141│    let raw = std::fs::read_to_string(path).ok()?;\n 142│    serde_json::from_str(&raw).ok()\n## service.rs\n  18│//! so start stays a detached spawn and stop stays an IPC stop; the task is\n *19│//! surfaced only as a `daemon status` boot hint.\n  20│\n  21│use std::io;\n  22│#[allow(unused_imports)]\n    │...\n 102│    fn stop(&self) -> io::Result<()>;\n*103│    /// Short label for `daemon status` + conflict warnings (\"systemd --user\").\n 104│    fn label(&self) -> &'static str;\n*105│    /// A boot-autostart note for `daemon status`, when the platform has one\n 106│    /// that isn't a start/stop-controllable service (the Windows logon task,\n 107│    /// or the systemd unit's enable-state). `None` = nothing to add.\n 108│    fn boot_hint(&self) -> Option<String> {\n\n## pump/\n### health.rs\n 10│//! The pump owns the state and persists it to `identity/pump-health.json`\n*11│//! (sibling of the heartbeat); `spt daemon status` / `spt subnet status`\n 12│//! read the file. Fields are additive — an N-1 reader ignores them.\n 13│// [impl->REQ-PUMP-STAGE-TRUTH]\n 14│\n### mod.rs\n  259│    /// epoch-ms written while the loop is alive, rendered by\n *260│    /// `spt daemon status` / the `subnet status` stall warning\n  261│    /// ([`crate::endpoint::pump_heartbeat_path`]).\n  262│    pub heartbeat: PathBuf,\n  263│    /// `rotation-pending.json` (Mesh-D7, REQ-MESH-4): the timeboxed seed-rotation\n     │...\n 1167│/// Write the pump's last-tick heartbeat (epoch ms) — the liveness fact\n*1168│/// `spt daemon status` renders and the `subnet status` stall warning reads\n 1169│/// (M8 decision 23). Best-effort: a failed write costs honesty, never the\n 1170│/// pump (and the reader treats an absent/unreadable file as \"no heartbeat\n 1171│/// recorded\", not as healthy).\n     │...\n 1803│    // stamp at the given path (creating parents) and a later write advances\n*1804│    // it — what the D1 `daemon status` reader + stall warning consume.\n 1805│    #[test]\n 1806│    fn heartbeat_writes_and_advances() {\n 1807│        let dir = tempfile::tempdir().unwrap();","missingPaths":["crates/spt-cli/src"]},"isError":false,"timestamp":1784271492382}}
{"type":"message","id":"a65c6ba1","parentId":"98b35904","timestamp":"2026-07-17T06:58:12.430Z","message":{"role":"toolResult","toolCallId":"call_fKBdIZe9bk166ibc33rZwc6a|fc_0a061eb498f0e908016a59d284480c8196975f92f15b5ad467","toolName":"read","content":[{"type":"text","text":"    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n                KIND_STALL_EVICTS => self.dispatch_stall_evicts(&send),\n                KIND_NET_DIAL => {\n                    if let Err(msg) = self.dispatch_net_dial(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_DIAL_LOOPBACK => {\n                    if let Err(msg) = self.dispatch_net_dial_loopback(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-PUMP-PEER-ISOLATION]\n                KIND_NET_DIAL_SUBMIT => {\n                    if let Err(msg) = self.dispatch_net_dial_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_JOIN => {\n                    if let Err(msg) = self.dispatch_pair_join(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_MEET => {\n                    if let Err(msg) = self.dispatch_pair_meet(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_CODE_SUBMIT => {\n                    if let Err(msg) = self.dispatch_pair_code_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPEN => {\n                    if let Err(msg) = self.dispatch_net_stream_open(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SEND => {\n                    if let Err(msg) = self.dispatch_net_stream_send(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAMS => {\n                    if let Err(msg) = self.dispatch_net_streams(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_RETIRE => {\n                    if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPENER => {\n                    // TEST-RIG-ONLY (T7 mixed-image N-1): with\n                    // SPT_TEST_STREAM_OPENER_UNSUPPORTED set this broker\n                    // answers the verb EXACTLY like an N-1 broker that\n                    // predates it — the forward-compat unknown-kind reply\n                    // below, byte-identical (the stable KH-2.3 wire fact the\n                    // dispatcher's fallback gate keys on). Never set in\n                    // production.\n                    if std::env::var(\"SPT_TEST_STREAM_OPENER_UNSUPPORTED\").is_ok() {\n                        send_error(&send, &format!(\"unknown command kind {:?}\", env.kind));\n                    } else if let Err(msg) = self.dispatch_net_stream_opener(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_SESSIONS => {\n                    // Clone the (id, endpoint, log) out from under the sessions\n                    // lock, then read each log's cursor under the log lock alone —\n                    // never both locks at once (the dispatch_subscribe discipline).\n                    let rows: Vec<(u64, String, Arc<Mutex<OutputLog>>)> = {\n                        let sessions = recover(&self.sessions);\n                        sessions\n                            .iter()\n                            .map(|(id, h)| (*id, h.endpoint.clone(), Arc::clone(&h.log)))\n                            .collect()\n                    };\n                    // Snapshot each session's truth under its OWN log lock (cursor +\n                    // controller identity + the control/viewer stamp truth), doing NO\n                    // file I/O under the lock (the lock-across-effect discipline, KH\n                    // 7.12/5.16). The convergence re-assert + the reply then run OFF\n                    // the lock.\n                    struct SessSnap {\n                        id: u64,\n                        endpoint: String,\n                        resume_seq: u64,\n                        controller_by: Option<String>,\n                        has_controller: bool,\n                        viewers: u32,\n                    }\n                    let snaps: Vec<SessSnap> = rows\n                        .into_iter()\n                        .map(|(id, endpoint, log)| {\n                            let mut log = recover_log(&log);\n                            // B-2 (REQ-CONTROLLER-LIVENESS-REAP): make the controller\n                            // truth HONEST before reading it — reap a dead-writer\n                            // (severed) controller so both the reply's controller_by\n                            // AND the off-lock converge_perch_stamps below see the\n                            // cleared state and the stale info.json stamp clears.\n                            let _ = log.reap_dead_controller();\n                            SessSnap {\n                                id,\n                                endpoint,\n                                resume_seq: log.delivered_through(),\n                                controller_by: log.controller_by().map(str::to_string),\n                                has_controller: log.has_controller(),\n                                viewers: log.live_viewer_count(),\n                            }\n                        })\n                        .collect();\n                    // STAMP CONVERGENCE (REQ-HAZARD-CONTROL-STAMP-CONVERGENCE): re-assert\n                    // each live session's control/viewer stamps to broker truth,\n                    // divergence-gated + OFF the log lock. Closes the stamp-before-bind\n                    // loss for a picker-created endpoint (its spawn stamp was swallowed\n                    // pre-bind); converges within one reconcile-poll window after bind.\n                    // [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n                    for s in &snaps {\n                        converge_perch_stamps(\n                            &s.endpoint,\n                            s.controller_by.as_deref(),\n                            s.has_controller,\n                            s.viewers,\n                        );\n                    }\n                    let reply = SessionsReply {\n                        sessions: snaps\n                            .into_iter()\n                            .map(|s| SessionInfo {\n                                session_id: s.id,\n                                endpoint: s.endpoint,\n                                resume_seq: s.resume_seq,\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n…\n    }\n\n[Showing lines 3023-3273 of 6298. Use :3274 to continue]"}],"details":{"truncation":{"content":"    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n                KIND_STALL_EVICTS => self.dispatch_stall_evicts(&send),\n                KIND_NET_DIAL => {\n                    if let Err(msg) = self.dispatch_net_dial(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_DIAL_LOOPBACK => {\n                    if let Err(msg) = self.dispatch_net_dial_loopback(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-PUMP-PEER-ISOLATION]\n                KIND_NET_DIAL_SUBMIT => {\n                    if let Err(msg) = self.dispatch_net_dial_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_JOIN => {\n                    if let Err(msg) = self.dispatch_pair_join(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_MEET => {\n                    if let Err(msg) = self.dispatch_pair_meet(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_CODE_SUBMIT => {\n                    if let Err(msg) = self.dispatch_pair_code_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPEN => {\n                    if let Err(msg) = self.dispatch_net_stream_open(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SEND => {\n                    if let Err(msg) = self.dispatch_net_stream_send(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAMS => {\n                    if let Err(msg) = self.dispatch_net_streams(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_RETIRE => {\n                    if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPENER => {\n                    // TEST-RIG-ONLY (T7 mixed-image N-1): with\n                    // SPT_TEST_STREAM_OPENER_UNSUPPORTED set this broker\n                    // answers the verb EXACTLY like an N-1 broker that\n                    // predates it — the forward-compat unknown-kind reply\n                    // below, byte-identical (the stable KH-2.3 wire fact the\n                    // dispatcher's fallback gate keys on). Never set in\n                    // production.\n                    if std::env::var(\"SPT_TEST_STREAM_OPENER_UNSUPPORTED\").is_ok() {\n                        send_error(&send, &format!(\"unknown command kind {:?}\", env.kind));\n                    } else if let Err(msg) = self.dispatch_net_stream_opener(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_SESSIONS => {\n                    // Clone the (id, endpoint, log) out from under the sessions\n                    // lock, then read each log's cursor under the log lock alone —\n                    // never both locks at once (the dispatch_subscribe discipline).\n                    let rows: Vec<(u64, String, Arc<Mutex<OutputLog>>)> = {\n                        let sessions = recover(&self.sessions);\n                        sessions\n                            .iter()\n                            .map(|(id, h)| (*id, h.endpoint.clone(), Arc::clone(&h.log)))\n                            .collect()\n                    };\n                    // Snapshot each session's truth under its OWN log lock (cursor +\n                    // controller identity + the control/viewer stamp truth), doing NO\n                    // file I/O under the lock (the lock-across-effect discipline, KH\n                    // 7.12/5.16). The convergence re-assert + the reply then run OFF\n                    // the lock.\n                    struct SessSnap {\n                        id: u64,\n                        endpoint: String,\n                        resume_seq: u64,\n                        controller_by: Option<String>,\n                        has_controller: bool,\n                        viewers: u32,\n                    }\n                    let snaps: Vec<SessSnap> = rows\n                        .into_iter()\n                        .map(|(id, endpoint, log)| {\n                            let mut log = recover_log(&log);\n                            // B-2 (REQ-CONTROLLER-LIVENESS-REAP): make the controller\n                            // truth HONEST before reading it — reap a dead-writer\n                            // (severed) controller so both the reply's controller_by\n                            // AND the off-lock converge_perch_stamps below see the\n                            // cleared state and the stale info.json stamp clears.\n                            let _ = log.reap_dead_controller();\n                            SessSnap {\n                                id,\n                                endpoint,\n                                resume_seq: log.delivered_through(),\n                                controller_by: log.controller_by().map(str::to_string),\n                                has_controller: log.has_controller(),\n                                viewers: log.live_viewer_count(),\n                            }\n                        })\n                        .collect();\n                    // STAMP CONVERGENCE (REQ-HAZARD-CONTROL-STAMP-CONVERGENCE): re-assert\n                    // each live session's control/viewer stamps to broker truth,\n                    // divergence-gated + OFF the log lock. Closes the stamp-before-bind\n                    // loss for a picker-created endpoint (its spawn stamp was swallowed\n                    // pre-bind); converges within one reconcile-poll window after bind.\n                    // [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n                    for s in &snaps {\n                        converge_perch_stamps(\n                            &s.endpoint,\n                            s.controller_by.as_deref(),\n                            s.has_controller,\n                            s.viewers,\n                        );\n                    }\n                    let reply = SessionsReply {\n                        sessions: snaps\n                            .into_iter()\n                            .map(|s| SessionInfo {\n                                session_id: s.id,\n                                endpoint: s.endpoint,\n                                resume_seq: s.resume_seq,\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()","truncated":true,"truncatedBy":"lines","totalLines":3276,"totalBytes":12487,"outputLines":251,"outputBytes":12487,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n                KIND_STALL_EVICTS => self.dispatch_stall_evicts(&send),\n                KIND_NET_DIAL => {\n                    if let Err(msg) = self.dispatch_net_dial(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_DIAL_LOOPBACK => {\n                    if let Err(msg) = self.dispatch_net_dial_loopback(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-PUMP-PEER-ISOLATION]\n                KIND_NET_DIAL_SUBMIT => {\n                    if let Err(msg) = self.dispatch_net_dial_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_JOIN => {\n                    if let Err(msg) = self.dispatch_pair_join(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_MEET => {\n                    if let Err(msg) = self.dispatch_pair_meet(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_PAIR_CODE_SUBMIT => {\n                    if let Err(msg) = self.dispatch_pair_code_submit(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPEN => {\n                    if let Err(msg) = self.dispatch_net_stream_open(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SEND => {\n                    if let Err(msg) = self.dispatch_net_stream_send(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAMS => {\n                    if let Err(msg) = self.dispatch_net_streams(&send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_RETIRE => {\n                    if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_OPENER => {\n                    // TEST-RIG-ONLY (T7 mixed-image N-1): with\n                    // SPT_TEST_STREAM_OPENER_UNSUPPORTED set this broker\n                    // answers the verb EXACTLY like an N-1 broker that\n                    // predates it — the forward-compat unknown-kind reply\n                    // below, byte-identical (the stable KH-2.3 wire fact the\n                    // dispatcher's fallback gate keys on). Never set in\n                    // production.\n                    if std::env::var(\"SPT_TEST_STREAM_OPENER_UNSUPPORTED\").is_ok() {\n                        send_error(&send, &format!(\"unknown command kind {:?}\", env.kind));\n                    } else if let Err(msg) = self.dispatch_net_stream_opener(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_SESSIONS => {\n                    // Clone the (id, endpoint, log) out from under the sessions\n                    // lock, then read each log's cursor under the log lock alone —\n                    // never both locks at once (the dispatch_subscribe discipline).\n                    let rows: Vec<(u64, String, Arc<Mutex<OutputLog>>)> = {\n                        let sessions = recover(&self.sessions);\n                        sessions\n                            .iter()\n                            .map(|(id, h)| (*id, h.endpoint.clone(), Arc::clone(&h.log)))\n                            .collect()\n                    };\n                    // Snapshot each session's truth under its OWN log lock (cursor +\n                    // controller identity + the control/viewer stamp truth), doing NO\n                    // file I/O under the lock (the lock-across-effect discipline, KH\n                    // 7.12/5.16). The convergence re-assert + the reply then run OFF\n                    // the lock.\n                    struct SessSnap {\n                        id: u64,\n                        endpoint: String,\n                        resume_seq: u64,\n                        controller_by: Option<String>,\n                        has_controller: bool,\n                        viewers: u32,\n                    }\n                    let snaps: Vec<SessSnap> = rows\n                        .into_iter()\n                        .map(|(id, endpoint, log)| {\n                            let mut log = recover_log(&log);\n                            // B-2 (REQ-CONTROLLER-LIVENESS-REAP): make the controller\n                            // truth HONEST before reading it — reap a dead-writer\n                            // (severed) controller so both the reply's controller_by\n                            // AND the off-lock converge_perch_stamps below see the\n                            // cleared state and the stale info.json stamp clears.\n                            let _ = log.reap_dead_controller();\n                            SessSnap {\n                                id,\n                                endpoint,\n                                resume_seq: log.delivered_through(),\n                                controller_by: log.controller_by().map(str::to_string),\n                                has_controller: log.has_controller(),\n                                viewers: log.live_viewer_count(),\n                            }\n                        })\n                        .collect();\n                    // STAMP CONVERGENCE (REQ-HAZARD-CONTROL-STAMP-CONVERGENCE): re-assert\n                    // each live session's control/viewer stamps to broker truth,\n                    // divergence-gated + OFF the log lock. Closes the stamp-before-bind\n                    // loss for a picker-created endpoint (its spawn stamp was swallowed\n                    // pre-bind); converges within one reconcile-poll window after bind.\n                    // [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n                    for s in &snaps {\n                        converge_perch_stamps(\n                            &s.endpoint,\n                            s.controller_by.as_deref(),\n                            s.has_controller,\n                            s.viewers,\n                        );\n                    }\n                    let reply = SessionsReply {\n                        sessions: snaps\n                            .into_iter()\n                            .map(|s| SessionInfo {\n                                session_id: s.id,\n                                endpoint: s.endpoint,\n                                resume_seq: s.resume_seq,\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n…\n    }","startLine":3023,"lineNumbers":[3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,null,3289]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":12487,"outputLines":251,"outputBytes":12487,"shownRange":{"start":3023,"end":3273},"nextOffset":3274}}},"isError":false,"timestamp":1784271492430}}
{"type":"message","id":"b405d3b7","parentId":"a65c6ba1","timestamp":"2026-07-17T06:58:12.468Z","message":{"role":"toolResult","toolCallId":"call_KzO9qggjrlxF63XoZvdU51cg|fc_0a061eb498f0e908016a59d28448108196973a06f26e52ab5f","toolName":"read","content":[{"type":"text","text":"        let _wake_claim: Option<WakeClaimGuard> = if req.endpoint.is_empty() {\n…\n        } else {\n…\n            loop {\n…\n                let gate = {\n…\n                    let live = sessions\n…\n                        .find(|(_, h)| h.endpoint == req.endpoint)\n                        .map(|(sid, h)| (*sid, h.session.process_id()));\n                    match wake_gate_decision(\n                        live.is_some(),\n                        inflight.contains(&req.endpoint),\n                        Instant::now() >= deadline,\n                    ) {\n                        WakeGate::AlreadyLive => {\n                            let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");\n                            Gate::AlreadyLive(sid, spid)\n                        }\n                        WakeGate::Racing => Gate::Racing,\n                        WakeGate::Claim => {\n                            inflight.insert(req.endpoint.clone());\n                            Gate::Claimed(WakeClaimGuard {\n                                set: &self.wake_inflight,\n                                endpoint: req.endpoint.clone(),\n                            })\n                        }\n                    }\n                };\n                match gate {\n                    Gate::Claimed(guard) => break Some(guard),\n                    Gate::AlreadyLive(sid, spid) => {\n                        eprintln!(\n                            \"SPAWN_DEDUP:{}: endpoint already has a live session {sid} — \\\n                             single-flight wake no-op ack [REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\",\n                            req.endpoint\n                        );\n                        let frame = Envelope::new(\n                            KIND_SPAWNED,\n                            serde_json::to_value(Spawned { session_id: sid, pid: spid })\n                                .expect(\"Spawned serializes\"),\n                        );\n                        send_frame(send, &frame);\n                        return Ok(sid);\n                    }\n                    Gate::Racing => thread::sleep(WAKE_DEDUP_POLL),\n                }\n            }\n        };\n        // REQ-HOST-RUN-2: spawn in the requested project cwd when carried;\n        // `None` inherits the broker's cwd (legacy/test + W1 bringup shortcut).\n        // Inject the manifest [env] vars (REQ-HAZARD-ENV-SUBST) on top of the\n        // inherited env — empty for a legacy/N-1 spawn (inherit only).\n        let session = PtySession::spawn_program_in_env(\n            &req.program,\n            &req.args,\n            SurfaceSize::new(req.rows, req.cols),\n            req.cwd.as_deref(),\n            req.env.iter().map(|(k, v)| (k.as_str(), v.as_str())),\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),\n        );\n\n[Showing lines 3329-3508 of 6298. Use :3509 to continue]"}],"details":{"truncation":{"content":"                        .find(|(_, h)| h.endpoint == req.endpoint)\n                        .map(|(sid, h)| (*sid, h.session.process_id()));\n                    match wake_gate_decision(\n                        live.is_some(),\n                        inflight.contains(&req.endpoint),\n                        Instant::now() >= deadline,\n                    ) {\n                        WakeGate::AlreadyLive => {\n                            let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");\n                            Gate::AlreadyLive(sid, spid)\n                        }\n                        WakeGate::Racing => Gate::Racing,\n                        WakeGate::Claim => {\n                            inflight.insert(req.endpoint.clone());\n                            Gate::Claimed(WakeClaimGuard {\n                                set: &self.wake_inflight,\n                                endpoint: req.endpoint.clone(),\n                            })\n                        }\n                    }\n                };\n                match gate {\n                    Gate::Claimed(guard) => break Some(guard),\n                    Gate::AlreadyLive(sid, spid) => {\n                        eprintln!(\n                            \"SPAWN_DEDUP:{}: endpoint already has a live session {sid} — \\\n                             single-flight wake no-op ack [REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\",\n                            req.endpoint\n                        );\n                        let frame = Envelope::new(\n                            KIND_SPAWNED,\n                            serde_json::to_value(Spawned { session_id: sid, pid: spid })\n                                .expect(\"Spawned serializes\"),\n                        );\n                        send_frame(send, &frame);\n                        return Ok(sid);\n                    }\n                    Gate::Racing => thread::sleep(WAKE_DEDUP_POLL),\n                }\n            }\n        };\n        // REQ-HOST-RUN-2: spawn in the requested project cwd when carried;\n        // `None` inherits the broker's cwd (legacy/test + W1 bringup shortcut).\n        // Inject the manifest [env] vars (REQ-HAZARD-ENV-SUBST) on top of the\n        // inherited env — empty for a legacy/N-1 spawn (inherit only).\n        let session = PtySession::spawn_program_in_env(\n            &req.program,\n            &req.args,\n            SurfaceSize::new(req.rows, req.cols),\n            req.cwd.as_deref(),\n            req.env.iter().map(|(k, v)| (k.as_str(), v.as_str())),\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),","truncated":true,"truncatedBy":"lines","totalLines":2970,"totalBytes":8680,"outputLines":180,"outputBytes":8680,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"        let _wake_claim: Option<WakeClaimGuard> = if req.endpoint.is_empty() {\n…\n        } else {\n…\n            loop {\n…\n                let gate = {\n…\n                    let live = sessions\n…\n                        .find(|(_, h)| h.endpoint == req.endpoint)\n                        .map(|(sid, h)| (*sid, h.session.process_id()));\n                    match wake_gate_decision(\n                        live.is_some(),\n                        inflight.contains(&req.endpoint),\n                        Instant::now() >= deadline,\n                    ) {\n                        WakeGate::AlreadyLive => {\n                            let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");\n                            Gate::AlreadyLive(sid, spid)\n                        }\n                        WakeGate::Racing => Gate::Racing,\n                        WakeGate::Claim => {\n                            inflight.insert(req.endpoint.clone());\n                            Gate::Claimed(WakeClaimGuard {\n                                set: &self.wake_inflight,\n                                endpoint: req.endpoint.clone(),\n                            })\n                        }\n                    }\n                };\n                match gate {\n                    Gate::Claimed(guard) => break Some(guard),\n                    Gate::AlreadyLive(sid, spid) => {\n                        eprintln!(\n                            \"SPAWN_DEDUP:{}: endpoint already has a live session {sid} — \\\n                             single-flight wake no-op ack [REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\",\n                            req.endpoint\n                        );\n                        let frame = Envelope::new(\n                            KIND_SPAWNED,\n                            serde_json::to_value(Spawned { session_id: sid, pid: spid })\n                                .expect(\"Spawned serializes\"),\n                        );\n                        send_frame(send, &frame);\n                        return Ok(sid);\n                    }\n                    Gate::Racing => thread::sleep(WAKE_DEDUP_POLL),\n                }\n            }\n        };\n        // REQ-HOST-RUN-2: spawn in the requested project cwd when carried;\n        // `None` inherits the broker's cwd (legacy/test + W1 bringup shortcut).\n        // Inject the manifest [env] vars (REQ-HAZARD-ENV-SUBST) on top of the\n        // inherited env — empty for a legacy/N-1 spawn (inherit only).\n        let session = PtySession::spawn_program_in_env(\n            &req.program,\n            &req.args,\n            SurfaceSize::new(req.rows, req.cols),\n            req.cwd.as_deref(),\n            req.env.iter().map(|(k, v)| (k.as_str(), v.as_str())),\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),\n        );","startLine":3314,"lineNumbers":[3314,null,3316,null,3318,null,3324,null,3327,null,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":8680,"outputLines":180,"outputBytes":8680,"shownRange":{"start":3329,"end":3508},"nextOffset":3509}}},"isError":false,"timestamp":1784271492467}}
{"type":"message","id":"e3a5e535","parentId":"b405d3b7","timestamp":"2026-07-17T06:58:20.062Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing Drain drop behavior**"},{"type":"toolCall","id":"call_W5bg18vXCHVZBUAoURKU3I51|fc_0a061eb498f0e908016a59d28bff1c8196ae78ee2426d6bd2b","name":"read","arguments":{"i":"Reading PTY ownership","path":"crates/spt-term/src/pty.rs","selector":"1-270"}},{"type":"toolCall","id":"call_hoPpVT891jFv3Vsc13lLSVDg|fc_0a061eb498f0e908016a59d28bff3081969106fc2cc89b5361","name":"read","arguments":{"i":"Reading PTY drain lifecycle","path":"crates/spt-term/src/reader.rs","selector":"1-230"}},{"type":"toolCall","id":"call_ehLbtVO8ddy71IjhWqOoGN03|fc_0a061eb498f0e908016a59d28bff348196bc6821d2449d400b","name":"read","arguments":{"i":"Reading broker detach cleanup","path":"crates/spt-daemon/src/broker.rs","selector":"3260-3335"}},{"type":"toolCall","id":"call_UFVgWwLBY7USpWOC1t6fwIHE|fc_0a061eb498f0e908016a59d28bff3c8196ad9c012b8f56045f","name":"read","arguments":{"i":"Reading translation worker lifecycle","path":"crates/spt-daemon/src/broker.rs","selector":"1860-2050,2180-2380"}},{"type":"toolCall","id":"call_H8DyywtVKXMsR0SD1o0fzv6y|fc_0a061eb498f0e908016a59d28bff4081969c666831b8cbed63","name":"read","arguments":{"i":"Reading net host drop semantics","path":"crates/spt-daemon/src/nethost.rs","selector":"1080-1185,1310-1415,1870-1955"}},{"type":"toolCall","id":"call_Nz6u1RRtuCO1ovokmkYNe4pr|fc_0a061eb498f0e908016a59d28bff44819693618502a0b08f22","name":"grep","arguments":{"i":"Finding production thread names","pattern":"\\.name\\(|thread_name\\(","path":"crates/spt-daemon/src; crates/spt-term/src","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":17759,"output":325,"cacheRead":82432,"cacheWrite":0,"totalTokens":100516,"reasoningTokens":43,"cost":{"input":0.08879500000000001,"output":0.00975,"cacheRead":0.041215999999999996,"cacheWrite":0,"total":0.139761}},"stopReason":"toolUse","timestamp":1784271492508,"responseId":"resp_0a061eb498f0e908016a59d284f0088196b15a4cb9f65d18b3","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d2861bd48196a082ed33427689e6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdKMvbTjXaHbkdmWxE_oW2q5PNedh7aZeDPq7-ZcNhZ-F0aCqdVNoAHhbqhHzhW3sjvSAr0hyub11NuzzabsvAU5nXtdsu_wNXM_gWLRcOy4uGfaRhRSvnxJLGfVe7aVmW9KacYwmVv62VN8upBFaTzZncUPUsL1dLJizud26itSwhzXG3HC7oPs-MO5gg1yFkpHj4ZEAtIc1q1UZf_Q4ulxIxfwsiRPbR138RzhsCsDMTrCRqNs2qjgce5KKq2-ZSteIeYogKCNmdMS5DOnZYe5vwtYM9SDETB-buQnY7cdHeBUPR4GIq4uZrmkYOPiHqDG-MwF1j63z6dAsRKpdwh5VhexCdZC7gnbY4hQyPTcE4rCXZhjDeYvH683cWjsDjXlZQeM-z2-zGMIjwIbp4uwexisToGps3GEL0a_EZHXddh3dMhRvTFkOvNINS7zCC1prfP7NPJrMDV_IDSmtrwwviB-pnrWjkOaRPhvU3Gh1PmmDrQnKNoqM7RuaGBuvO-Gz5QxhgtCFwF6W-gA0-tRLWOKpfZ-geViWSaL8eJaTINrUSssAacVGDg2l1rNR4CtNTe2CMKslx9YJE_dqLRd0LR0fF52fmE9mDcMieLOXdfqftiYcRXgFvh4f-ZCiNHT5iGs0foxHn65S89x1QCYdbiKRup6IzFPZk92E3XDAfZIlck8tLuQv0faPDtCsFidQVggA6gcSyLxhJCL9-771MhxwEcnsAsJ8oOpixV4_i0I_PkaV65r5e4E-iO4wGixeemz669Of1RX4VKo5KKgdubia90H2Ki1DI_7SQpt2IzOlTA6aOXa5HlBSTdiCklAlbmFj7h9TahttXMT2RiB0DioZ6oHiWvPU-oaPg7GKw1j1bjWIYcEyXlTTI1jgvs3mw-WWtsxzgJEizKlM_v1fJO_m19dSqaEu1cW3E04OZOLOuSEZoIzqm3YclMTJr7CvgeVdR_ypsRBlhKw9Q44H5S2fETUqT4V-WKeS5EWLbfkzaCvhAI4peYOThQDB2iQroZf9fWMaqrVK4A5b0Hc7vpLQGK5BHtXgNKUNRGr_eBfcXeHt-tCEfTe_vc7lHTkmrU-XX0TR70q9q4dXd5fh8Gx-JjPsSXc0Aj2i2YSaxlvKd6k0XkF33kCmGbQVTbdM5IMgA3-o9ffRNR9iqaWiKVtg9ZpJOsL94KUN8v4Axc=","summary":[{"type":"summary_text","text":"**Analyzing Drain drop behavior**"}]},{"id":"fc_0a061eb498f0e908016a59d28bff1c8196ae78ee2426d6bd2b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading PTY ownership\",\"path\":\"crates/spt-term/src/pty.rs\",\"selector\":\"1-270\"}","call_id":"call_W5bg18vXCHVZBUAoURKU3I51","name":"read"},{"id":"fc_0a061eb498f0e908016a59d28bff3081969106fc2cc89b5361","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading PTY drain lifecycle\",\"path\":\"crates/spt-term/src/reader.rs\",\"selector\":\"1-230\"}","call_id":"call_hoPpVT891jFv3Vsc13lLSVDg","name":"read"},{"id":"fc_0a061eb498f0e908016a59d28bff348196bc6821d2449d400b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker detach cleanup\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3260-3335\"}","call_id":"call_ehLbtVO8ddy71IjhWqOoGN03","name":"read"},{"id":"fc_0a061eb498f0e908016a59d28bff3c8196ad9c012b8f56045f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading translation worker lifecycle\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1860-2050,2180-2380\"}","call_id":"call_UFVgWwLBY7USpWOC1t6fwIHE","name":"read"},{"id":"fc_0a061eb498f0e908016a59d28bff4081969c666831b8cbed63","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading net host drop semantics\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1080-1185,1310-1415,1870-1955\"}","call_id":"call_H8DyywtVKXMsR0SD1o0fzv6y","name":"read"},{"id":"fc_0a061eb498f0e908016a59d28bff44819693618502a0b08f22","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding production thread names\",\"pattern\":\"\\\\.name\\\\(|thread_name\\\\(\",\"path\":\"crates/spt-daemon/src; crates/spt-term/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_Nz6u1RRtuCO1ovokmkYNe4pr","name":"grep"}]},"duration":7553.016499996185,"ttft":1619.8793999999762,"contextSnapshot":{"promptTokens":100191,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_W5bg18vXCHVZBUAoURKU3I51|fc_0a061eb498f0e908016a59d28bff1c8196ae78ee2426d6bd2b","toolName":"read","startedAt":"2026-07-17T06:58:20.063Z","args":{"path":"crates/spt-term/src/pty.rs"},"intent":"Reading PTY ownership"},"id":"c6503d9b","parentId":"e3a5e535","timestamp":"2026-07-17T06:58:20.063Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_hoPpVT891jFv3Vsc13lLSVDg|fc_0a061eb498f0e908016a59d28bff3081969106fc2cc89b5361","toolName":"read","startedAt":"2026-07-17T06:58:20.063Z","args":{"path":"crates/spt-term/src/reader.rs"},"intent":"Reading PTY drain lifecycle"},"id":"d48b99cb","parentId":"c6503d9b","timestamp":"2026-07-17T06:58:20.063Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ehLbtVO8ddy71IjhWqOoGN03|fc_0a061eb498f0e908016a59d28bff348196bc6821d2449d400b","toolName":"read","startedAt":"2026-07-17T06:58:20.063Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker detach cleanup"},"id":"c1a1472c","parentId":"d48b99cb","timestamp":"2026-07-17T06:58:20.063Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_UFVgWwLBY7USpWOC1t6fwIHE|fc_0a061eb498f0e908016a59d28bff3c8196ad9c012b8f56045f","toolName":"read","startedAt":"2026-07-17T06:58:20.063Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading translation worker lifecycle"},"id":"93e9c1f2","parentId":"c1a1472c","timestamp":"2026-07-17T06:58:20.063Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_H8DyywtVKXMsR0SD1o0fzv6y|fc_0a061eb498f0e908016a59d28bff4081969c666831b8cbed63","toolName":"read","startedAt":"2026-07-17T06:58:20.063Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading net host drop semantics"},"id":"6eaa290a","parentId":"93e9c1f2","timestamp":"2026-07-17T06:58:20.063Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Nz6u1RRtuCO1ovokmkYNe4pr|fc_0a061eb498f0e908016a59d28bff44819693618502a0b08f22","toolName":"grep","startedAt":"2026-07-17T06:58:20.063Z","args":{"path":"crates/spt-daemon/src; crates/spt-term/src"},"intent":"Finding production thread names"},"id":"d99f583e","parentId":"6eaa290a","timestamp":"2026-07-17T06:58:20.063Z"}
{"type":"message","id":"23b7bf72","parentId":"d99f583e","timestamp":"2026-07-17T06:58:20.086Z","message":{"role":"toolResult","toolCallId":"call_H8DyywtVKXMsR0SD1o0fzv6y|fc_0a061eb498f0e908016a59d28bff4081969c666831b8cbed63","toolName":"read","content":[{"type":"text","text":"async fn await_ring_room(log: &Arc<Mutex<StreamLog>>, room: &tokio::sync::Notify) {\n    loop {\n…\n    }\n}\n\n/// The broker-owned net endpoint + live connection/stream tables (see module\n/// docs).\npub struct NetHost {\n    /// The dedicated tokio runtime hosting the endpoint and its accept loop.\n    /// Dropping the host drops the runtime, stopping every net task with it.\n    runtime: tokio::runtime::Runtime,\n    endpoint: Arc<NetEndpoint>,\n    shared: Arc<NetShared>,\n    /// `(minter, op_id) → conn_id` for exactly-once dial replies: a deduped replay\n    /// of a journaled dial is answered with the connection the first apply opened.\n    /// Keyed by `(minter, op_id)` (ADR-0034) — the minter namespaces the op so two\n    /// counters that both start at 1 cannot clobber each other's dial record.\n    dial_ops: Mutex<HashMap<(Minter, u64), u64>>,\n    /// `(minter, op_id) → stream_id` for exactly-once stream-open replies (D4b),\n    /// same discipline as `dial_ops`. Minter-namespaced (ADR-0034), matching the\n    /// journal key the broker builds for the same op.\n    stream_ops: Mutex<HashMap<(Minter, u64), u64>>,\n    /// This node's pubkey (the seed-proof's local channel-binding identity).\n    local_id: PublicKey,\n    /// The connect-time seed-proof credential source (Mesh-D2). `None` disables\n    /// the proof (see [`NetConfig::membership`]).\n    membership: Option<MembershipSource>,\n    /// The on-connect roster-exchange seam (Mesh-D4, REQ-MESH-2), set on the live\n    /// host after `start` via [`Self::set_roster_exchange`] (kept off `NetConfig`\n    /// so the many hermetic test configs need no change — a roster exchange is a\n    /// layer atop the proof, opt-in per host). `None` ⇒ no roster leg. Read +\n    /// cloned per connect on the net runtime, so the accept loop (spawned in\n    /// `start`, before the host exists) shares it through this `Arc`.\n    roster: Arc<Mutex<Option<RosterExchange>>>,\n    /// The broker's single in-process loopback connection (M12 W1.5, B1),\n    /// minted lazily on the first [`Self::dial_loopback`] and reused thereafter\n    /// — a local `spt rc` needs exactly one. `Some(conn_id)` once minted; the\n    /// row lives for the host (no handshake to lose, no closed-watcher).\n    loopback_conn: Mutex<Option<u64>>,\n    /// Serializes [`Self::open_loopback_pair`] (M11-W3) so the peer-row discovery\n    /// (a before/after diff on the loopback conn's inbound rows) sees exactly the\n    /// one row this open minted — concurrent pair-opens on the shared loopback conn\n    /// would otherwise race the diff.\n    loopback_pair_lock: Mutex<()>,\n    /// The broker-side QUIC-op deadline in ms (REQ-HAZARD-BROKER-QUIC-DEADLINE),\n    /// default [`BROKER_QUIC_OP_TIMEOUT_MS`]; the hermetic black-hole tests lower\n    /// it via [`Self::set_quic_op_timeout`]. Interior-mutable so the setter takes\n    /// `&self`, like the live host's other post-`start` knobs (`set_roster_exchange`).\n    quic_op_timeout_ms: AtomicU64,\n    /// The bounded concurrent-dial cap (PUMP-TRUTH W2, G4): a shared\n    /// [`tokio::sync::Semaphore`] cap [`PUMP_DIAL_CONCURRENCY`]. BOTH the\n    /// non-blocking [`Self::submit_dial`] AND the blocking [`Self::dial`] acquire\n    /// a permit from THIS one, so the cap bounds every dial source (Q2 caveat).\n    // [impl->REQ-PUMP-PEER-ISOLATION]\n    dial_semaphore: Arc<tokio::sync::Semaphore>,\n    /// DIAGNOSTIC (UPDATE-WEDGE round-3, throwaway — NOT a shipped feature):\n    /// the count of in-flight [`Self::submit_dial`] tasks currently occupying\n    /// the 2-worker net runtime. A dial task increments on entry, decrements on\n    /// completion (RAII, panic-safe). The round-3 starvation rig reads this to\n    /// size a dead-peer burst against the worker pool.\n    active_dial_tasks: Arc<AtomicUsize>,\n    /// DIAGNOSTIC (UPDATE-WEDGE round-3, throwaway): reactor-liveness canary. A\n    /// runtime task stamps epoch-ms here every ~25ms. If the 2 workers are\n    /// MONOPOLIZED (a non-yielding dead-peer connect that never awaits back to\n    /// the scheduler) the stamp goes STALE — the DIRECT worker-starvation\n    /// discriminator the round-3 rig asserts on. A fresh stamp under a dead-peer\n    /// burst PROVES the QUIC awaits yield cleanly (⇒ the 2-worker-starvation\n    /// seam is FALSIFIED and must be re-opened, per the round-3 ruling §5).\n    net_canary_tick_ms: Arc<AtomicU64>,\n}\n\n/// DIAGNOSTIC helper (round-3): epoch-ms wall clock for the canary stamp.\nfn epoch_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/// DIAGNOSTIC (round-3): decrement the in-flight dial gauge on drop, so a dial\n/// task that panics or is cancelled still leaves the count correct.\nstruct DialGauge(Arc<AtomicUsize>);\nimpl Drop for DialGauge {\n    fn drop(&mut self) {\n        self.0.fetch_sub(1, Ordering::Relaxed);\n    }\n}\n\nimpl NetHost {\n    /// Bind the broker's endpoint on a fresh dedicated runtime and start the\n    /// accept loop. The endpoint speaks TWO ALPNs (M7 D3, REQ-SUBNET-2): the\n    /// trusted [`SPT_NET_ALPN`] (connections join the table as before) and\n    /// the pre-trust pairing ALPN — routed to the always-on responder\n    /// ([`crate::pairhost::respond`]), never registered in the stream table.\n    /// One endpoint for both is deliberate: the pairing transcript binds and\n    /// pins the REAL node pubkey, and the relay can only route one endpoint\n    /// per key — the ALPN is the pre-trust/trusted boundary (ADR-0005).\n    /// The meet-rotation listener loop rides the same runtime.\n    // [impl->REQ-DAEMON-2]\n    // [impl->REQ-SUBNET-2]\n    pub fn start(cfg: NetConfig) -> io::Result<NetHost> {\n        // Hermeticity guard (REQ-PAIR-8): a loopback-scoped endpoint is the\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n…\n        Ok(NetHost {\n…\n            net_canary_tick_ms,\n        })\n    }\n\n    /// Wire the on-connect roster-exchange seam (Mesh-D4, REQ-MESH-2) onto this\n    /// live host. The daemon calls this once after `start` with\n    /// [`crate::seedproofx::production_roster_exchange`]; tests inject their own.\n    /// Off `NetConfig` by design — see the `roster` field. Takes effect on the\n    /// next dial/accept (each connect snapshots it).\n    // [impl->REQ-MESH-2]\n    pub fn set_roster_exchange(&self, exchange: RosterExchange) {\n        *self.roster.lock().unwrap() = Some(exchange);\n    }\n\n    /// The broker-side QUIC-op deadline currently in force (default\n    /// [`BROKER_QUIC_OP_TIMEOUT_MS`]).\n    fn quic_op_timeout(&self) -> Duration {\n        Duration::from_millis(self.quic_op_timeout_ms.load(Ordering::Relaxed))\n    }\n\n    /// Override the broker-side QUIC-op deadline (REQ-HAZARD-BROKER-QUIC-DEADLINE).\n    /// Production keeps the [`BROKER_QUIC_OP_TIMEOUT_MS`] default; the hermetic\n    /// black-hole tests set a short bound so a dead-peer await fails fast instead\n    /// of pinning the test for ~10s. Off [`NetConfig`] by design (mirrors\n    /// [`Self::set_roster_exchange`]) — the many hermetic test configs need no change.\n    // [impl->REQ-HAZARD-BROKER-QUIC-DEADLINE]\n    pub fn set_quic_op_timeout(&self, dur: Duration) {\n        self.quic_op_timeout_ms\n            .store(dur.as_millis() as u64, Ordering::Relaxed);\n    }\n\n    /// Run `fut` on the host runtime under the broker-side QUIC-op deadline\n    /// (REQ-HAZARD-BROKER-QUIC-DEADLINE) — the B-half of REQ-HAZARD-PUMP-IPC-\n    /// DEADLINE. A brain-waiting QUIC await against a black-holed/dead peer must\n    /// fail PROMPTLY with an ORDINARY error the broker replies, never the\n    /// unbounded await that wedged the single-threaded pump for 2.2h. On elapse\n    /// the future is DROPPED — cancelling the in-flight connect / stream op, so\n    /// nothing is half-registered — and a non-`TimedOut` `io::Error` is returned.\n    /// At the broker boundary that error is stringified into a normal error reply\n    /// frame, so the brain reconstructs an `ErrorKind::Other` (`Brain::net_dial` /\n    /// `net_open_stream` / `net_stream_send` → `io::Error::other`) and\n    /// `pump::peer_outcome` takes the ordinary per-peer arm (drop conn + redial,\n    /// round continues, heartbeat advances) — DISTINCT from the brain's OWN\n    /// read-deadline `TimedOut` (the A-half poison → supervised-restart signal).\n    /// Because the bound fires (10s) well before the brain's 30s\n    /// `PUMP_PEER_IO_TIMEOUT`, the broker always REPLIES first. A live op\n    /// completes with zero added latency; the bound only bites a non-responsive\n    /// peer.\n    // [impl->REQ-HAZARD-BROKER-QUIC-DEADLINE]\n    fn bounded_block_on<F, T>(&self, fut: F) -> io::Result<T>\n    where\n        F: std::future::Future<Output = io::Result<T>>,\n    {\n        let dur = self.quic_op_timeout();\n        self.runtime.handle().block_on(async move {\n            match tokio::time::timeout(dur, fut).await {\n                Ok(inner) => inner,\n                Err(_elapsed) => Err(io::Error::other(format!(\n                    \"broker QUIC op exceeded the {dur:?} bound (peer unresponsive) — \\\n                     failing as an ordinary per-peer error\"\n                ))),\n            }\n        })\n    }\n\n    /// Run the joiner leg of the pairing ceremony (M7 D3, REQ-SUBNET-2) on\n    /// the host's runtime — the broker IPC `pair-join` arm. The ceremony\n    /// must run HERE because it binds and pins this endpoint's real node\n    /// pubkey. Returns the rendered trust outcome, or the classified failure.\n    // [impl->REQ-SUBNET-2]\n    pub fn pair_join(\n        &self,\n        subnet: &str,\n        code: &str,\n        responder_addr: Option<EndpointAddr>,\n    ) -> Result<String, crate::pairhost::JoinFail> {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            crate::pairhost::join_ceremony(&endpoint, subnet, code, responder_addr).await\n        })\n    }\n\n    /// The MEET phase of the two-phase join (REQ-JOIN-TWO-PHASE): resolve a\n    /// seed-holder's real, stable pairing address via the rendezvous — no code,\n    /// no ceremony — so the broker can hold it while the operator enters the\n    /// code. Same runtime/endpoint discipline as [`Self::pair_join`].\n    // [impl->REQ-JOIN-TWO-PHASE]\n    pub fn pair_meet(\n        &self,\n        subnet: &str,\n        verbose: bool,\n    ) -> Result<EndpointAddr, crate::pairhost::JoinFail> {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            crate::pairhost::meet_seed_holder(&endpoint, subnet, verbose).await\n        })\n    }\n\n    /// The node's stable name (lowercase-hex pubkey == iroh EndpointId).\n    pub fn node_id_hex(&self) -> String {\n        self.endpoint.node_id_hex()\n    }\n\n    /// The endpoint's dialable address (id + currently-known direct/relay paths).\n    pub fn addr(&self) -> EndpointAddr {\n        self.endpoint.addr()\n    }\n…\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n…\n        let line = entry.log.lock().unwrap().opener_line();\n        Some(line)\n    }\n\n    /// Mark a held stream **retentive** with backpressure `cap` chunks (M11-W3,\n    /// REQ-SHELL-4): its read log stops evicting (no byte loss) and its read pump\n    /// lags the sender once the undrained ring reaches `cap` (no unbounded growth).\n    /// Used for shell-tunnel streams; ordinary streams stay bounded-overwrite.\n    /// No-op if the stream is gone.\n    // [impl->REQ-SHELL-4]\n    pub fn mark_stream_retentive(&self, stream_id: u64, cap: usize) {\n        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n            e.log.lock().unwrap().set_retentive(cap);\n        }\n    }\n\n    /// Drain a retentive stream's undrained bytes (the shell-tunnel recv cursor):\n    /// pops the whole ring in order, concatenated, and wakes the read pump (which\n    /// may have been lagging the sender at the backpressure cap). Returns\n    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n    // [impl->REQ-SHELL-4]\n    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        let drained = entry.log.lock().unwrap().drain();\n        // The drain freed ring room — wake a pump that was backpressure-parked.\n        entry.room.notify_one();\n        Some(drained)\n    }\n\n    /// A held stream's current undrained ring depth in chunks (test introspection\n    /// for the retentive backpressure bound). `None` ⇒ no such stream.\n    #[cfg(test)]\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\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)?;\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…\n    }\n…\n}"}],"details":{"displayContent":{"text":"async fn await_ring_room(log: &Arc<Mutex<StreamLog>>, room: &tokio::sync::Notify) {\n    loop {\n…\n    }\n}\n\n/// The broker-owned net endpoint + live connection/stream tables (see module\n/// docs).\npub struct NetHost {\n    /// The dedicated tokio runtime hosting the endpoint and its accept loop.\n    /// Dropping the host drops the runtime, stopping every net task with it.\n    runtime: tokio::runtime::Runtime,\n    endpoint: Arc<NetEndpoint>,\n    shared: Arc<NetShared>,\n    /// `(minter, op_id) → conn_id` for exactly-once dial replies: a deduped replay\n    /// of a journaled dial is answered with the connection the first apply opened.\n    /// Keyed by `(minter, op_id)` (ADR-0034) — the minter namespaces the op so two\n    /// counters that both start at 1 cannot clobber each other's dial record.\n    dial_ops: Mutex<HashMap<(Minter, u64), u64>>,\n    /// `(minter, op_id) → stream_id` for exactly-once stream-open replies (D4b),\n    /// same discipline as `dial_ops`. Minter-namespaced (ADR-0034), matching the\n    /// journal key the broker builds for the same op.\n    stream_ops: Mutex<HashMap<(Minter, u64), u64>>,\n    /// This node's pubkey (the seed-proof's local channel-binding identity).\n    local_id: PublicKey,\n    /// The connect-time seed-proof credential source (Mesh-D2). `None` disables\n    /// the proof (see [`NetConfig::membership`]).\n    membership: Option<MembershipSource>,\n    /// The on-connect roster-exchange seam (Mesh-D4, REQ-MESH-2), set on the live\n    /// host after `start` via [`Self::set_roster_exchange`] (kept off `NetConfig`\n    /// so the many hermetic test configs need no change — a roster exchange is a\n    /// layer atop the proof, opt-in per host). `None` ⇒ no roster leg. Read +\n    /// cloned per connect on the net runtime, so the accept loop (spawned in\n    /// `start`, before the host exists) shares it through this `Arc`.\n    roster: Arc<Mutex<Option<RosterExchange>>>,\n    /// The broker's single in-process loopback connection (M12 W1.5, B1),\n    /// minted lazily on the first [`Self::dial_loopback`] and reused thereafter\n    /// — a local `spt rc` needs exactly one. `Some(conn_id)` once minted; the\n    /// row lives for the host (no handshake to lose, no closed-watcher).\n    loopback_conn: Mutex<Option<u64>>,\n    /// Serializes [`Self::open_loopback_pair`] (M11-W3) so the peer-row discovery\n    /// (a before/after diff on the loopback conn's inbound rows) sees exactly the\n    /// one row this open minted — concurrent pair-opens on the shared loopback conn\n    /// would otherwise race the diff.\n    loopback_pair_lock: Mutex<()>,\n    /// The broker-side QUIC-op deadline in ms (REQ-HAZARD-BROKER-QUIC-DEADLINE),\n    /// default [`BROKER_QUIC_OP_TIMEOUT_MS`]; the hermetic black-hole tests lower\n    /// it via [`Self::set_quic_op_timeout`]. Interior-mutable so the setter takes\n    /// `&self`, like the live host's other post-`start` knobs (`set_roster_exchange`).\n    quic_op_timeout_ms: AtomicU64,\n    /// The bounded concurrent-dial cap (PUMP-TRUTH W2, G4): a shared\n    /// [`tokio::sync::Semaphore`] cap [`PUMP_DIAL_CONCURRENCY`]. BOTH the\n    /// non-blocking [`Self::submit_dial`] AND the blocking [`Self::dial`] acquire\n    /// a permit from THIS one, so the cap bounds every dial source (Q2 caveat).\n    // [impl->REQ-PUMP-PEER-ISOLATION]\n    dial_semaphore: Arc<tokio::sync::Semaphore>,\n    /// DIAGNOSTIC (UPDATE-WEDGE round-3, throwaway — NOT a shipped feature):\n    /// the count of in-flight [`Self::submit_dial`] tasks currently occupying\n    /// the 2-worker net runtime. A dial task increments on entry, decrements on\n    /// completion (RAII, panic-safe). The round-3 starvation rig reads this to\n    /// size a dead-peer burst against the worker pool.\n    active_dial_tasks: Arc<AtomicUsize>,\n    /// DIAGNOSTIC (UPDATE-WEDGE round-3, throwaway): reactor-liveness canary. A\n    /// runtime task stamps epoch-ms here every ~25ms. If the 2 workers are\n    /// MONOPOLIZED (a non-yielding dead-peer connect that never awaits back to\n    /// the scheduler) the stamp goes STALE — the DIRECT worker-starvation\n    /// discriminator the round-3 rig asserts on. A fresh stamp under a dead-peer\n    /// burst PROVES the QUIC awaits yield cleanly (⇒ the 2-worker-starvation\n    /// seam is FALSIFIED and must be re-opened, per the round-3 ruling §5).\n    net_canary_tick_ms: Arc<AtomicU64>,\n}\n\n/// DIAGNOSTIC helper (round-3): epoch-ms wall clock for the canary stamp.\nfn epoch_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/// DIAGNOSTIC (round-3): decrement the in-flight dial gauge on drop, so a dial\n/// task that panics or is cancelled still leaves the count correct.\nstruct DialGauge(Arc<AtomicUsize>);\nimpl Drop for DialGauge {\n    fn drop(&mut self) {\n        self.0.fetch_sub(1, Ordering::Relaxed);\n    }\n}\n\nimpl NetHost {\n    /// Bind the broker's endpoint on a fresh dedicated runtime and start the\n    /// accept loop. The endpoint speaks TWO ALPNs (M7 D3, REQ-SUBNET-2): the\n    /// trusted [`SPT_NET_ALPN`] (connections join the table as before) and\n    /// the pre-trust pairing ALPN — routed to the always-on responder\n    /// ([`crate::pairhost::respond`]), never registered in the stream table.\n    /// One endpoint for both is deliberate: the pairing transcript binds and\n    /// pins the REAL node pubkey, and the relay can only route one endpoint\n    /// per key — the ALPN is the pre-trust/trusted boundary (ADR-0005).\n    /// The meet-rotation listener loop rides the same runtime.\n    // [impl->REQ-DAEMON-2]\n    // [impl->REQ-SUBNET-2]\n    pub fn start(cfg: NetConfig) -> io::Result<NetHost> {\n        // Hermeticity guard (REQ-PAIR-8): a loopback-scoped endpoint is the\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n…\n        Ok(NetHost {\n…\n            net_canary_tick_ms,\n        })\n    }\n\n    /// Wire the on-connect roster-exchange seam (Mesh-D4, REQ-MESH-2) onto this\n    /// live host. The daemon calls this once after `start` with\n    /// [`crate::seedproofx::production_roster_exchange`]; tests inject their own.\n    /// Off `NetConfig` by design — see the `roster` field. Takes effect on the\n    /// next dial/accept (each connect snapshots it).\n    // [impl->REQ-MESH-2]\n    pub fn set_roster_exchange(&self, exchange: RosterExchange) {\n        *self.roster.lock().unwrap() = Some(exchange);\n    }\n\n    /// The broker-side QUIC-op deadline currently in force (default\n    /// [`BROKER_QUIC_OP_TIMEOUT_MS`]).\n    fn quic_op_timeout(&self) -> Duration {\n        Duration::from_millis(self.quic_op_timeout_ms.load(Ordering::Relaxed))\n    }\n\n    /// Override the broker-side QUIC-op deadline (REQ-HAZARD-BROKER-QUIC-DEADLINE).\n    /// Production keeps the [`BROKER_QUIC_OP_TIMEOUT_MS`] default; the hermetic\n    /// black-hole tests set a short bound so a dead-peer await fails fast instead\n    /// of pinning the test for ~10s. Off [`NetConfig`] by design (mirrors\n    /// [`Self::set_roster_exchange`]) — the many hermetic test configs need no change.\n    // [impl->REQ-HAZARD-BROKER-QUIC-DEADLINE]\n    pub fn set_quic_op_timeout(&self, dur: Duration) {\n        self.quic_op_timeout_ms\n            .store(dur.as_millis() as u64, Ordering::Relaxed);\n    }\n\n    /// Run `fut` on the host runtime under the broker-side QUIC-op deadline\n    /// (REQ-HAZARD-BROKER-QUIC-DEADLINE) — the B-half of REQ-HAZARD-PUMP-IPC-\n    /// DEADLINE. A brain-waiting QUIC await against a black-holed/dead peer must\n    /// fail PROMPTLY with an ORDINARY error the broker replies, never the\n    /// unbounded await that wedged the single-threaded pump for 2.2h. On elapse\n    /// the future is DROPPED — cancelling the in-flight connect / stream op, so\n    /// nothing is half-registered — and a non-`TimedOut` `io::Error` is returned.\n    /// At the broker boundary that error is stringified into a normal error reply\n    /// frame, so the brain reconstructs an `ErrorKind::Other` (`Brain::net_dial` /\n    /// `net_open_stream` / `net_stream_send` → `io::Error::other`) and\n    /// `pump::peer_outcome` takes the ordinary per-peer arm (drop conn + redial,\n    /// round continues, heartbeat advances) — DISTINCT from the brain's OWN\n    /// read-deadline `TimedOut` (the A-half poison → supervised-restart signal).\n    /// Because the bound fires (10s) well before the brain's 30s\n    /// `PUMP_PEER_IO_TIMEOUT`, the broker always REPLIES first. A live op\n    /// completes with zero added latency; the bound only bites a non-responsive\n    /// peer.\n    // [impl->REQ-HAZARD-BROKER-QUIC-DEADLINE]\n    fn bounded_block_on<F, T>(&self, fut: F) -> io::Result<T>\n    where\n        F: std::future::Future<Output = io::Result<T>>,\n    {\n        let dur = self.quic_op_timeout();\n        self.runtime.handle().block_on(async move {\n            match tokio::time::timeout(dur, fut).await {\n                Ok(inner) => inner,\n                Err(_elapsed) => Err(io::Error::other(format!(\n                    \"broker QUIC op exceeded the {dur:?} bound (peer unresponsive) — \\\n                     failing as an ordinary per-peer error\"\n                ))),\n            }\n        })\n    }\n\n    /// Run the joiner leg of the pairing ceremony (M7 D3, REQ-SUBNET-2) on\n    /// the host's runtime — the broker IPC `pair-join` arm. The ceremony\n    /// must run HERE because it binds and pins this endpoint's real node\n    /// pubkey. Returns the rendered trust outcome, or the classified failure.\n    // [impl->REQ-SUBNET-2]\n    pub fn pair_join(\n        &self,\n        subnet: &str,\n        code: &str,\n        responder_addr: Option<EndpointAddr>,\n    ) -> Result<String, crate::pairhost::JoinFail> {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            crate::pairhost::join_ceremony(&endpoint, subnet, code, responder_addr).await\n        })\n    }\n\n    /// The MEET phase of the two-phase join (REQ-JOIN-TWO-PHASE): resolve a\n    /// seed-holder's real, stable pairing address via the rendezvous — no code,\n    /// no ceremony — so the broker can hold it while the operator enters the\n    /// code. Same runtime/endpoint discipline as [`Self::pair_join`].\n    // [impl->REQ-JOIN-TWO-PHASE]\n    pub fn pair_meet(\n        &self,\n        subnet: &str,\n        verbose: bool,\n    ) -> Result<EndpointAddr, crate::pairhost::JoinFail> {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            crate::pairhost::meet_seed_holder(&endpoint, subnet, verbose).await\n        })\n    }\n\n    /// The node's stable name (lowercase-hex pubkey == iroh EndpointId).\n    pub fn node_id_hex(&self) -> String {\n        self.endpoint.node_id_hex()\n    }\n\n    /// The endpoint's dialable address (id + currently-known direct/relay paths).\n    pub fn addr(&self) -> EndpointAddr {\n        self.endpoint.addr()\n    }\n…\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n…\n        let line = entry.log.lock().unwrap().opener_line();\n        Some(line)\n    }\n\n    /// Mark a held stream **retentive** with backpressure `cap` chunks (M11-W3,\n    /// REQ-SHELL-4): its read log stops evicting (no byte loss) and its read pump\n    /// lags the sender once the undrained ring reaches `cap` (no unbounded growth).\n    /// Used for shell-tunnel streams; ordinary streams stay bounded-overwrite.\n    /// No-op if the stream is gone.\n    // [impl->REQ-SHELL-4]\n    pub fn mark_stream_retentive(&self, stream_id: u64, cap: usize) {\n        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n            e.log.lock().unwrap().set_retentive(cap);\n        }\n    }\n\n    /// Drain a retentive stream's undrained bytes (the shell-tunnel recv cursor):\n    /// pops the whole ring in order, concatenated, and wakes the read pump (which\n    /// may have been lagging the sender at the backpressure cap). Returns\n    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n    // [impl->REQ-SHELL-4]\n    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        let drained = entry.log.lock().unwrap().drain();\n        // The drain freed ring room — wake a pump that was backpressure-parked.\n        entry.room.notify_one();\n        Some(drained)\n    }\n\n    /// A held stream's current undrained ring depth in chunks (test introspection\n    /// for the retentive backpressure bound). `None` ⇒ no such stream.\n    #[cfg(test)]\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\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)?;\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…\n    }\n…\n}","startLine":1071,"lineNumbers":[1071,1072,null,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,null,1296,null,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,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,null,1863,null,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,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,null,1977,null,2024]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784271500086}}
{"type":"message","id":"31505891","parentId":"23b7bf72","timestamp":"2026-07-17T06:58:20.127Z","message":{"role":"toolResult","toolCallId":"call_UFVgWwLBY7USpWOC1t6fwIHE|fc_0a061eb498f0e908016a59d28bff3c8196ad9c012b8f56045f","toolName":"read","content":[{"type":"text","text":"/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can\n/// leave the ring torn (a bumped `next_seq` past the ring, an over-cap ring from an\n/// interrupted prune, a non-monotonic front/back), and replaying those bytes to a\n/// subscriber risks garbage. So ONLY on the recovered (poisoned) branch, run\n/// [`OutputLog::clamp_or_reset`]: cheap-check the ring invariants and RESET it empty\n/// (+ loud log) on any violation. Lost scrollback self-heals on the next PTY output +\n/// repaint — strictly better than a permanent wedge (fail-fast reintroduces the very\n/// wedge B-1 kills) or a torn serve (blind recover). The healthy `Ok` path is a pure\n/// lock — no clamp, no cost on the hot append path.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover_log(m: &Mutex<OutputLog>) -> std::sync::MutexGuard<'_, OutputLog> {\n    match m.lock() {\n        Ok(g) => g,\n        Err(p) => {\n            let mut g = p.into_inner();\n            let _ = g.clamp_or_reset(); // bool is for the unit test; the effect is the reset\n            g\n        }\n    }\n}\n\nfn flush_inject_floor(floor: &Mutex<InjectFloor>, input: &InputWriter) {\n    loop {\n        let chunk = lock_floor(floor).take_or_release();\n        match chunk {\n            Some(bytes) => {\n                input.enqueue(bytes);\n            }\n            None => break,\n        }\n    }\n}\n\n/// The inject worker (W2 Layer C): one thread per translation-bearing session. It\n/// drives inbound `<EVENT>`s through the binary and applies the binary's keystroke\n/// commands to the PTY ATOMICALLY w.r.t. the operator's live controller.\n///\n/// Per queued event: drop any stray pre-event commands, OPEN the floor (operator\n/// input now buffers in `dispatch_input`), feed the binary the `{type:event}`,\n/// then drain `{key}`/`{text}`/`{delay_ms}` into `session.write_input` until\n/// `{commit}` — bounded by [`INJECT_COMMIT_DEADLINE`]. On commit: flush the\n/// buffered controller bytes AFTER the injected sequence and release the floor. On\n/// deadline-miss or binary death: flush+release anyway (operator input is never\n/// stranded), then FAULT — terminate the binary, set `faulted`, and exit (idle\n/// inbound then SPOOLS, never raw-injected). The loop ends when `event_tx` is dropped\n/// (session teardown), reaping the child.\n///\n/// The atomic open→drain→commit→flush is the W1 coexistence mechanism: an injected\n/// sequence and the operator's live controller share one PTY without clobbering\n/// each other (REQ-HAZARD-INJECT-CONTROL-COEXIST), and the deadline FAULT path is\n/// the \"never park forever\" bound applied to injection.\n/// Bring up a translation binary at `path` for `endpoint_id`: spawn the\n/// stdin→stdout filter, send the identity `Init`, start the inject worker that\n/// owns the atomic PTY apply, and return the `Arc<Translation>`. A spawn failure\n/// FAILS CLOSED to SPOOLING (`None`, logged): `None` now MEANS the inbound spools\n/// (idle delivery is translation-binary-only, never a raw PTY inject) — a missing\n/// binary costs idle delivery, never the operator their agent. `input` is the session's EXISTING PTY input writer\n/// (reused; only the translation child is created). Extracted verbatim from\n/// `dispatch_spawn` so a live-update restart (`dispatch_adapter_apply`, W3d) can\n/// rebuild a session's translation child from the NEW binary without disturbing\n/// the PTY / output log / session (brain-parity).\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn build_translation(\n    argv: &[String],\n    endpoint_id: &str,\n    input: &Arc<InputWriter>,\n    respawns: Arc<AtomicU32>,\n    log: &Arc<Mutex<OutputLog>>,\n) -> Option<Arc<Translation>> {\n    let (cmd_tx, cmd_rx) = channel::<KeyCmd>();\n    match TranslationChild::spawn(argv, cmd_tx) {\n        Ok(child) => {\n            let child = Arc::new(child);\n            // First line: identity (content-free of any PTY bytes).\n            let _ = child.send(&ToBinary::Init {\n                endpoint_id: endpoint_id.to_string(),\n                node: spt_store::hostlabel::os_hostname().unwrap_or_default(),\n            });\n            let floor = Arc::new(Mutex::new(InjectFloor::default()));\n            let faulted = Arc::new(AtomicBool::new(false));\n            let (event_tx, event_rx) = channel::<String>();\n            let w_input = Arc::clone(input);\n            let w_child = Arc::clone(&child);\n            let w_floor = Arc::clone(&floor);\n            let w_faulted = Arc::clone(&faulted);\n            let w_respawns = Arc::clone(&respawns);\n            let w_log = Arc::clone(log);\n            let w_endpoint = endpoint_id.to_string();\n            // B6 (REQ-HAZARD-INJECT-WORKER-POISON): run the worker under a panic\n            // guard. A panic inside the worker (a residual unwrap, a poisoned lock the\n            // recovery missed, anything) must NOT silently kill the thread and orphan\n            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n            let sup_child = Arc::clone(&child);\n            let sup_faulted = Arc::clone(&faulted);\n            let sup_endpoint = endpoint_id.to_string();\n            thread::spawn(move || {\n                run_inject_worker_supervised(\n                    sup_child,\n                    sup_faulted,\n                    sup_endpoint,\n                    std::panic::AssertUnwindSafe(move || {\n                        run_inject_worker(\n                            w_input, w_child, w_floor, event_rx, cmd_rx, w_faulted, w_respawns,\n                            w_log, w_endpoint,\n                        );\n                    }),\n                );\n            });\n            Some(Arc::new(Translation {\n                floor,\n                event_tx,\n                child,\n                faulted,\n            }))\n        }\n        Err(e) => {\n            eprintln!(\n                \"TRANSLATION_SPAWN_FAILED:{argv:?}: {e} — no idle PTY delivery; inbound spools (declare/repair the binary)\"\n            );\n            None\n        }\n    }\n}\n\n/// The resident translation binary path declared by the manifest at\n/// `<install_dir>/manifest.toml` (`[message-idle-translation-binary].path`), or\n/// `None` if there is no such manifest / declaration. Read fresh from disk so a\n/// live-update restart picks up a MOVED/renamed binary (verdict flag-5: never\n/// reuse the stale cached `SpawnReq.translation_binary`). (W3d)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\n// [impl->REQ-TRANSLATE-COMMAND]\nfn read_translation_command(install_dir: &std::path::Path) -> Option<Vec<String>> {\n    let s = std::fs::read_to_string(install_dir.join(\"manifest.toml\")).ok()?;\n    let manifest = spt_runtime::Manifest::from_toml_str(&s).ok()?;\n    let decl = manifest.message_idle_translation_binary.as_ref()?;\n    // F-019 / REQ-INSTALL-11 + ADR-0029: resolve `command` (preferred) else the\n    // deprecated `path` to a spawnable argv — adapter-static keys substituted, the\n    // program token resolved against the install dir (same as the initial spawn in\n    // harnesshost) so the W3d live-update RESPAWN runs the real binary, not a\n    // verbatim path Command::new fails to find (which would spool idle inbound).\n    spt_runtime::runtime::resolve_translation_argv(\n        decl,\n        Some(install_dir),\n        Some(manifest.adapter.name.as_str()),\n    )\n}\n\n/// Run the inject worker under a panic guard (B6, REQ-HAZARD-INJECT-WORKER-POISON):\n/// `body` is the [`run_inject_worker`] call. If it PANICS, the guard FAULTs the\n/// translation binary — `fault_translation` terminates the child (no orphaned live\n/// pid) and sets `faulted` (idle inbound then spools, never a silent \"worker-gone\"\n/// force-native refusal against a still-running binary). Without this, a worker\n/// panic drops `event_rx` while the child keeps running: every later inject sees\n/// `event_tx.send` fail and reports delivered=false forever. `child` + `faulted` are\n…\n\n/// The outcome of driving ONE inject sequence (feed the event, drain keystroke\n/// commands to `{commit}` / deadline / death). Carries the payload text TYPED this\n/// attempt so Layer 2 can echo-verify it and (on a re-drive) the caller can re-run.\nenum SeqOutcome {\n    /// The binary emitted `{commit}` — a complete sequence. `sent_text` is the\n    /// concatenated payload text typed (keys excluded — they carry no echoable text).\n    Committed { sent_text: Vec<u8> },\n    /// The commit deadline elapsed with the binary still ALIVE (a MISS, not a fault).\n    Missed,\n    /// The binary's stdout closed mid-sequence (a REAL death fault).\n    Disconnected,\n    /// The stdin write to feed the event FAILED — the binary is gone (a REAL fault).\n    SendFailed,\n}\n\n/// Drive one inject sequence for `envelope`: open the floor, feed the event, drain the\n/// binary's `{key}`/`{text}`/`{delay_ms}` commands to the PTY (text paced-chunked under\n/// the settle-gate) until `{commit}` / the commit deadline / stdout death, then flush the\n/// buffered controller input and release the floor in EVERY exit path (the anti-stall\n/// guarantee). Returns the outcome + typed payload text for the caller's echo-verify.\n// [impl->REQ-INJECT-MULTILINE-INTEGRITY]\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\nfn drive_one_sequence(\n    input: &InputWriter,\n    floor: &Mutex<InjectFloor>,\n    child: &TranslationChild,\n    cmd_rx: &Receiver<KeyCmd>,\n    envelope: String,\n) -> SeqOutcome {\n    lock_floor(floor).open();\n    if child.send(&ToBinary::Event { envelope }).is_err() {\n        flush_inject_floor(floor, input);\n        return SeqOutcome::SendFailed;\n    }\n    let deadline = Instant::now() + inject_commit_deadline();\n    let mut committed = false;\n    let mut disconnected = false;\n    let mut sent_text: Vec<u8> = Vec::new();\n    loop {\n        let now = Instant::now();\n        let remaining = deadline.saturating_duration_since(now);\n        if remaining.is_zero() {\n            break; // deadline → MISS\n        }\n        match cmd_rx.recv_timeout(remaining) {\n            Ok(KeyCmd::Key { key }) => {\n                if let Some(bytes) = key_to_bytes(&key) {\n                    input.enqueue(bytes);\n                }\n            }\n            Ok(KeyCmd::Text { text }) => {\n                // Accumulate the payload for echo-verify, then type it paced-chunked.\n                let bytes = text.into_bytes();\n                sent_text.extend_from_slice(&bytes);\n                enqueue_text_chunked(input, bytes);\n            }\n            Ok(KeyCmd::Delay { delay_ms }) => {\n                let want = Duration::from_millis(delay_ms);\n                let cap = deadline.saturating_duration_since(Instant::now());\n                thread::sleep(want.min(cap));\n            }\n            Ok(KeyCmd::Commit { .. }) => {\n                committed = true;\n                break;\n            }\n            Err(RecvTimeoutError::Timeout) => break,\n            Err(RecvTimeoutError::Disconnected) => {\n                disconnected = true;\n                break;\n            }\n        }\n    }\n    // Flush buffered controller input AFTER the injected bytes + release the floor —\n    // in EVERY exit path (the ANTI-STALL guarantee).\n    flush_inject_floor(floor, input);\n    if disconnected {\n        SeqOutcome::Disconnected\n    } else if committed {\n        SeqOutcome::Committed { sent_text }\n    } else {\n        SeqOutcome::Missed\n    }\n}\n\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-MSG-DELIVERY-AXES]\n// [impl->REQ-TRANSLATE-COMMIT-MISS-TOLERANCE]\n// [impl->REQ-INJECT-MULTILINE-INTEGRITY]\n#[allow(clippy::too_many_arguments)] // per-session worker wiring (C-1 added the respawn counter, W5-A the output-log tap); a struct would obscure the call\nfn run_inject_worker(\n    input: Arc<InputWriter>,\n    child: Arc<TranslationChild>,\n    floor: Arc<Mutex<InjectFloor>>,\n    event_rx: Receiver<String>,\n    cmd_rx: Receiver<KeyCmd>,\n    faulted: Arc<AtomicBool>,\n    respawns: Arc<AtomicU32>,\n    log: Arc<Mutex<OutputLog>>,\n    endpoint: String,\n) {\n    // C-1 worker-local state (REQ-TRANSLATE-COMMIT-MISS-TOLERANCE): CONSECUTIVE\n    // commit-deadline misses (reset on any successful `{commit}`), and the set of\n    // envelopes already respooled-once so a repeat miss dead-letters instead of\n    // respooling forever. Both are worker-local: a REAL fault exits the worker, and\n    // a respawn builds a fresh worker with a fresh budget + set.\n    let mut strikes: u32 = 0;\n    let mut respooled_once: HashSet<String> = HashSet::new();\n    // W5-A Layer 1 (re-arm fix): settle before EVERY delivery, not once per worker. The\n    // head-swallow race is NOT startup-only — a mid-session `/clear` re-enters the\n    // harness's raw-mode input reader and re-creates the pre-settle window (field-proven\n    // on 0.29.0: a checkpoint-wake payload injected right after `/clear` lost its head\n    // even though the worker had long since settled at spawn). So an echoing/interactive\n    // PTY re-settles per delivery (cheap: a tick or two once the reader answers). The old\n    // one-shot's ONLY legitimate purpose was sparing a NON-echoing ConPTY the full\n    // settle-deadline on every delivery (its DSR answer never surfaces, and it has no\n    // reader-reattach race to guard). We keep exactly that optimization via a LATCH driven\n    // by the settle's own return value: a settle that TIMES OUT (probe unobservable) sets\n    // this, and thereafter first-attempt settles are skipped; a settle that is OBSERVED\n    // keeps it clear, so the bug-prone class re-settles forever.\n    let mut probe_unobservable = false;\n    // Layer 2 (echo-verify → re-drive → LOUD spool) is a DECLARED CAPABILITY, default\n    // OFF (`SPT_INJECT_VERIFY_ECHO`). It applies ONLY where the harness re-renders typed\n    // input into its observable output (a real TUI's input line does; a bare shell / a\n    // ConPTY programmatic inject / a test echo-child on ConPTY does NOT). Universal\n    // auto-detection is infeasible — a raw-mode TUI does not echo a benign control probe\n    // (so the probe cannot prove text-echo), and incidental output (a prompt, a redraw)\n    // would make a head-prefix check false-read head-loss and spuriously LOUD-spool EVERY\n    // delivery. So an adapter that KNOWS its harness echoes declares the capability\n    // (parallel to the ruling's \"bracketed-paste where the harness declares it\"); Layer 1\n    // (the settle-gate) is the UNCONDITIONAL root fix. The int gate also forces it on\n    // (`SPT_INJECT_FORCE_ECHO_MISS`) to exercise the re-drive/spool wiring on any platform.\n    // AMBIENT env can NOT arm this: both vars are scrubbed at daemon startup\n    // (`spt_runtime::INJECT_ECHO_ENV_VARS`, F-036 env-inheritance class — an inherited\n    // dev-shell export once force-enabled echo-verify host-wide and a false miss RETYPED\n    // sequences into a live session's input). Only an explicit declaration (or an\n    // in-process test broker, which never runs the daemon entrypoints) reaches this read.\n    let echo_capable = std::env::var_os(\"SPT_INJECT_VERIFY_ECHO\").is_some()\n        || std::env::var_os(\"SPT_INJECT_FORCE_ECHO_MISS\").is_some();\n    // `event_rx` blocks here; events queue → one sequence at a time.\n    for envelope in event_rx {\n        // A well-behaved filter only emits in response to an event, but drop any\n        // unsolicited commands left in the channel so they can't be mis-attributed\n        // to this event's sequence.\n        while cmd_rx.try_recv().is_ok() {}\n\n        let envelope_copy = envelope.clone();\n\n        // ── W5-A: run the sequence with a settle-gate (Layer 1) before ANY byte, an\n        // echo-verify (Layer 2) after `{commit}`, and ONE re-drive on a verify miss →\n        // LOUD spool on a second miss (silent+unrecoverable head-loss → recoverable+loud).\n        // The commit-deadline MISS / binary-death / send-fail semantics below are\n        // unchanged (C-1 miss-tolerance).\n        let mut committed = false;\n        let mut disconnected = false;\n        let mut send_failed = false;\n        let mut integrity_lost = false;\n        for attempt in 1..=INJECT_REDRIVE_ATTEMPTS {\n            // Layer 1: settle-gate before the first byte of EVERY delivery on an echoing\n            // PTY (re-arm — a mid-session `/clear` re-creates the reader-reattach race),\n            // and always before a RE-DRIVE (only reached on a swallowed head, so re-confirm\n            // readiness before retyping). Skip only where the probe is known unobservable\n            // (a non-echoing ConPTY — no race to guard, and settling would burn the full\n            // deadline). The latch is driven by the FIRST-ATTEMPT settle's own outcome.\n            if should_settle(attempt, probe_unobservable) {\n                let observed = settle_before_inject(&input, &log, &endpoint);\n                if attempt == 1 {\n                    probe_unobservable = !observed;\n                }\n            }\n            // Snapshot the ring high-water AFTER settling (excludes probe echoes) so\n            // Layer 2 sees only THIS sequence's output.\n            let seq_start = recover_log(&log).high_water();\n            match drive_one_sequence(&input, &floor, &child, &cmd_rx, envelope_copy.clone()) {\n                SeqOutcome::SendFailed => {\n                    send_failed = true;\n                    break;\n                }\n                SeqOutcome::Disconnected => {\n                    disconnected = true;\n                    break;\n                }\n                SeqOutcome::Missed => {\n                    // Commit-deadline miss — leave to the C-1 miss path (not an\n                    // integrity re-drive; the binary never signalled a complete sequence).\n                    break;\n                }\n                SeqOutcome::Committed { sent_text } => {\n                    committed = true;\n                    // Layer 2: verify the typed head echoed back — ONLY where the terminal\n                    // demonstrably echoes (else a non-echoing PTY's incidental output would\n                    // false-read head-loss). Where it does not echo, Layer 1 stands alone.\n                    if !echo_capable || echo_verify_after(&log, seq_start, &sent_text) {\n                        break; // delivered byte-complete (or echo-verify not applicable here)\n                    }\n                    if attempt < INJECT_REDRIVE_ATTEMPTS {\n                        eprintln!(\n                            \"INJECT_ECHO_MISS:{endpoint}: typed head did not echo (attempt {attempt}/{INJECT_REDRIVE_ATTEMPTS}) — re-driving once\"\n                        );\n                        committed = false; // re-drive; only a verified commit counts\n…\n                    }\n…\n                }\n            }\n        }\n…\n    }\n…\n}"}],"details":{"displayContent":{"text":"/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can\n/// leave the ring torn (a bumped `next_seq` past the ring, an over-cap ring from an\n/// interrupted prune, a non-monotonic front/back), and replaying those bytes to a\n/// subscriber risks garbage. So ONLY on the recovered (poisoned) branch, run\n/// [`OutputLog::clamp_or_reset`]: cheap-check the ring invariants and RESET it empty\n/// (+ loud log) on any violation. Lost scrollback self-heals on the next PTY output +\n/// repaint — strictly better than a permanent wedge (fail-fast reintroduces the very\n/// wedge B-1 kills) or a torn serve (blind recover). The healthy `Ok` path is a pure\n/// lock — no clamp, no cost on the hot append path.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover_log(m: &Mutex<OutputLog>) -> std::sync::MutexGuard<'_, OutputLog> {\n    match m.lock() {\n        Ok(g) => g,\n        Err(p) => {\n            let mut g = p.into_inner();\n            let _ = g.clamp_or_reset(); // bool is for the unit test; the effect is the reset\n            g\n        }\n    }\n}\n\nfn flush_inject_floor(floor: &Mutex<InjectFloor>, input: &InputWriter) {\n    loop {\n        let chunk = lock_floor(floor).take_or_release();\n        match chunk {\n            Some(bytes) => {\n                input.enqueue(bytes);\n            }\n            None => break,\n        }\n    }\n}\n\n/// The inject worker (W2 Layer C): one thread per translation-bearing session. It\n/// drives inbound `<EVENT>`s through the binary and applies the binary's keystroke\n/// commands to the PTY ATOMICALLY w.r.t. the operator's live controller.\n///\n/// Per queued event: drop any stray pre-event commands, OPEN the floor (operator\n/// input now buffers in `dispatch_input`), feed the binary the `{type:event}`,\n/// then drain `{key}`/`{text}`/`{delay_ms}` into `session.write_input` until\n/// `{commit}` — bounded by [`INJECT_COMMIT_DEADLINE`]. On commit: flush the\n/// buffered controller bytes AFTER the injected sequence and release the floor. On\n/// deadline-miss or binary death: flush+release anyway (operator input is never\n/// stranded), then FAULT — terminate the binary, set `faulted`, and exit (idle\n/// inbound then SPOOLS, never raw-injected). The loop ends when `event_tx` is dropped\n/// (session teardown), reaping the child.\n///\n/// The atomic open→drain→commit→flush is the W1 coexistence mechanism: an injected\n/// sequence and the operator's live controller share one PTY without clobbering\n/// each other (REQ-HAZARD-INJECT-CONTROL-COEXIST), and the deadline FAULT path is\n/// the \"never park forever\" bound applied to injection.\n/// Bring up a translation binary at `path` for `endpoint_id`: spawn the\n/// stdin→stdout filter, send the identity `Init`, start the inject worker that\n/// owns the atomic PTY apply, and return the `Arc<Translation>`. A spawn failure\n/// FAILS CLOSED to SPOOLING (`None`, logged): `None` now MEANS the inbound spools\n/// (idle delivery is translation-binary-only, never a raw PTY inject) — a missing\n/// binary costs idle delivery, never the operator their agent. `input` is the session's EXISTING PTY input writer\n/// (reused; only the translation child is created). Extracted verbatim from\n/// `dispatch_spawn` so a live-update restart (`dispatch_adapter_apply`, W3d) can\n/// rebuild a session's translation child from the NEW binary without disturbing\n/// the PTY / output log / session (brain-parity).\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn build_translation(\n    argv: &[String],\n    endpoint_id: &str,\n    input: &Arc<InputWriter>,\n    respawns: Arc<AtomicU32>,\n    log: &Arc<Mutex<OutputLog>>,\n) -> Option<Arc<Translation>> {\n    let (cmd_tx, cmd_rx) = channel::<KeyCmd>();\n    match TranslationChild::spawn(argv, cmd_tx) {\n        Ok(child) => {\n            let child = Arc::new(child);\n            // First line: identity (content-free of any PTY bytes).\n            let _ = child.send(&ToBinary::Init {\n                endpoint_id: endpoint_id.to_string(),\n                node: spt_store::hostlabel::os_hostname().unwrap_or_default(),\n            });\n            let floor = Arc::new(Mutex::new(InjectFloor::default()));\n            let faulted = Arc::new(AtomicBool::new(false));\n            let (event_tx, event_rx) = channel::<String>();\n            let w_input = Arc::clone(input);\n            let w_child = Arc::clone(&child);\n            let w_floor = Arc::clone(&floor);\n            let w_faulted = Arc::clone(&faulted);\n            let w_respawns = Arc::clone(&respawns);\n            let w_log = Arc::clone(log);\n            let w_endpoint = endpoint_id.to_string();\n            // B6 (REQ-HAZARD-INJECT-WORKER-POISON): run the worker under a panic\n            // guard. A panic inside the worker (a residual unwrap, a poisoned lock the\n            // recovery missed, anything) must NOT silently kill the thread and orphan\n            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n            let sup_child = Arc::clone(&child);\n            let sup_faulted = Arc::clone(&faulted);\n            let sup_endpoint = endpoint_id.to_string();\n            thread::spawn(move || {\n                run_inject_worker_supervised(\n                    sup_child,\n                    sup_faulted,\n                    sup_endpoint,\n                    std::panic::AssertUnwindSafe(move || {\n                        run_inject_worker(\n                            w_input, w_child, w_floor, event_rx, cmd_rx, w_faulted, w_respawns,\n                            w_log, w_endpoint,\n                        );\n                    }),\n                );\n            });\n            Some(Arc::new(Translation {\n                floor,\n                event_tx,\n                child,\n                faulted,\n            }))\n        }\n        Err(e) => {\n            eprintln!(\n                \"TRANSLATION_SPAWN_FAILED:{argv:?}: {e} — no idle PTY delivery; inbound spools (declare/repair the binary)\"\n            );\n            None\n        }\n    }\n}\n\n/// The resident translation binary path declared by the manifest at\n/// `<install_dir>/manifest.toml` (`[message-idle-translation-binary].path`), or\n/// `None` if there is no such manifest / declaration. Read fresh from disk so a\n/// live-update restart picks up a MOVED/renamed binary (verdict flag-5: never\n/// reuse the stale cached `SpawnReq.translation_binary`). (W3d)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\n// [impl->REQ-TRANSLATE-COMMAND]\nfn read_translation_command(install_dir: &std::path::Path) -> Option<Vec<String>> {\n    let s = std::fs::read_to_string(install_dir.join(\"manifest.toml\")).ok()?;\n    let manifest = spt_runtime::Manifest::from_toml_str(&s).ok()?;\n    let decl = manifest.message_idle_translation_binary.as_ref()?;\n    // F-019 / REQ-INSTALL-11 + ADR-0029: resolve `command` (preferred) else the\n    // deprecated `path` to a spawnable argv — adapter-static keys substituted, the\n    // program token resolved against the install dir (same as the initial spawn in\n    // harnesshost) so the W3d live-update RESPAWN runs the real binary, not a\n    // verbatim path Command::new fails to find (which would spool idle inbound).\n    spt_runtime::runtime::resolve_translation_argv(\n        decl,\n        Some(install_dir),\n        Some(manifest.adapter.name.as_str()),\n    )\n}\n\n/// Run the inject worker under a panic guard (B6, REQ-HAZARD-INJECT-WORKER-POISON):\n/// `body` is the [`run_inject_worker`] call. If it PANICS, the guard FAULTs the\n/// translation binary — `fault_translation` terminates the child (no orphaned live\n/// pid) and sets `faulted` (idle inbound then spools, never a silent \"worker-gone\"\n/// force-native refusal against a still-running binary). Without this, a worker\n/// panic drops `event_rx` while the child keeps running: every later inject sees\n/// `event_tx.send` fail and reports delivered=false forever. `child` + `faulted` are\n…\n\n/// The outcome of driving ONE inject sequence (feed the event, drain keystroke\n/// commands to `{commit}` / deadline / death). Carries the payload text TYPED this\n/// attempt so Layer 2 can echo-verify it and (on a re-drive) the caller can re-run.\nenum SeqOutcome {\n    /// The binary emitted `{commit}` — a complete sequence. `sent_text` is the\n    /// concatenated payload text typed (keys excluded — they carry no echoable text).\n    Committed { sent_text: Vec<u8> },\n    /// The commit deadline elapsed with the binary still ALIVE (a MISS, not a fault).\n    Missed,\n    /// The binary's stdout closed mid-sequence (a REAL death fault).\n    Disconnected,\n    /// The stdin write to feed the event FAILED — the binary is gone (a REAL fault).\n    SendFailed,\n}\n\n/// Drive one inject sequence for `envelope`: open the floor, feed the event, drain the\n/// binary's `{key}`/`{text}`/`{delay_ms}` commands to the PTY (text paced-chunked under\n/// the settle-gate) until `{commit}` / the commit deadline / stdout death, then flush the\n/// buffered controller input and release the floor in EVERY exit path (the anti-stall\n/// guarantee). Returns the outcome + typed payload text for the caller's echo-verify.\n// [impl->REQ-INJECT-MULTILINE-INTEGRITY]\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\nfn drive_one_sequence(\n    input: &InputWriter,\n    floor: &Mutex<InjectFloor>,\n    child: &TranslationChild,\n    cmd_rx: &Receiver<KeyCmd>,\n    envelope: String,\n) -> SeqOutcome {\n    lock_floor(floor).open();\n    if child.send(&ToBinary::Event { envelope }).is_err() {\n        flush_inject_floor(floor, input);\n        return SeqOutcome::SendFailed;\n    }\n    let deadline = Instant::now() + inject_commit_deadline();\n    let mut committed = false;\n    let mut disconnected = false;\n    let mut sent_text: Vec<u8> = Vec::new();\n    loop {\n        let now = Instant::now();\n        let remaining = deadline.saturating_duration_since(now);\n        if remaining.is_zero() {\n            break; // deadline → MISS\n        }\n        match cmd_rx.recv_timeout(remaining) {\n            Ok(KeyCmd::Key { key }) => {\n                if let Some(bytes) = key_to_bytes(&key) {\n                    input.enqueue(bytes);\n                }\n            }\n            Ok(KeyCmd::Text { text }) => {\n                // Accumulate the payload for echo-verify, then type it paced-chunked.\n                let bytes = text.into_bytes();\n                sent_text.extend_from_slice(&bytes);\n                enqueue_text_chunked(input, bytes);\n            }\n            Ok(KeyCmd::Delay { delay_ms }) => {\n                let want = Duration::from_millis(delay_ms);\n                let cap = deadline.saturating_duration_since(Instant::now());\n                thread::sleep(want.min(cap));\n            }\n            Ok(KeyCmd::Commit { .. }) => {\n                committed = true;\n                break;\n            }\n            Err(RecvTimeoutError::Timeout) => break,\n            Err(RecvTimeoutError::Disconnected) => {\n                disconnected = true;\n                break;\n            }\n        }\n    }\n    // Flush buffered controller input AFTER the injected bytes + release the floor —\n    // in EVERY exit path (the ANTI-STALL guarantee).\n    flush_inject_floor(floor, input);\n    if disconnected {\n        SeqOutcome::Disconnected\n    } else if committed {\n        SeqOutcome::Committed { sent_text }\n    } else {\n        SeqOutcome::Missed\n    }\n}\n\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-MSG-DELIVERY-AXES]\n// [impl->REQ-TRANSLATE-COMMIT-MISS-TOLERANCE]\n// [impl->REQ-INJECT-MULTILINE-INTEGRITY]\n#[allow(clippy::too_many_arguments)] // per-session worker wiring (C-1 added the respawn counter, W5-A the output-log tap); a struct would obscure the call\nfn run_inject_worker(\n    input: Arc<InputWriter>,\n    child: Arc<TranslationChild>,\n    floor: Arc<Mutex<InjectFloor>>,\n    event_rx: Receiver<String>,\n    cmd_rx: Receiver<KeyCmd>,\n    faulted: Arc<AtomicBool>,\n    respawns: Arc<AtomicU32>,\n    log: Arc<Mutex<OutputLog>>,\n    endpoint: String,\n) {\n    // C-1 worker-local state (REQ-TRANSLATE-COMMIT-MISS-TOLERANCE): CONSECUTIVE\n    // commit-deadline misses (reset on any successful `{commit}`), and the set of\n    // envelopes already respooled-once so a repeat miss dead-letters instead of\n    // respooling forever. Both are worker-local: a REAL fault exits the worker, and\n    // a respawn builds a fresh worker with a fresh budget + set.\n    let mut strikes: u32 = 0;\n    let mut respooled_once: HashSet<String> = HashSet::new();\n    // W5-A Layer 1 (re-arm fix): settle before EVERY delivery, not once per worker. The\n    // head-swallow race is NOT startup-only — a mid-session `/clear` re-enters the\n    // harness's raw-mode input reader and re-creates the pre-settle window (field-proven\n    // on 0.29.0: a checkpoint-wake payload injected right after `/clear` lost its head\n    // even though the worker had long since settled at spawn). So an echoing/interactive\n    // PTY re-settles per delivery (cheap: a tick or two once the reader answers). The old\n    // one-shot's ONLY legitimate purpose was sparing a NON-echoing ConPTY the full\n    // settle-deadline on every delivery (its DSR answer never surfaces, and it has no\n    // reader-reattach race to guard). We keep exactly that optimization via a LATCH driven\n    // by the settle's own return value: a settle that TIMES OUT (probe unobservable) sets\n    // this, and thereafter first-attempt settles are skipped; a settle that is OBSERVED\n    // keeps it clear, so the bug-prone class re-settles forever.\n    let mut probe_unobservable = false;\n    // Layer 2 (echo-verify → re-drive → LOUD spool) is a DECLARED CAPABILITY, default\n    // OFF (`SPT_INJECT_VERIFY_ECHO`). It applies ONLY where the harness re-renders typed\n    // input into its observable output (a real TUI's input line does; a bare shell / a\n    // ConPTY programmatic inject / a test echo-child on ConPTY does NOT). Universal\n    // auto-detection is infeasible — a raw-mode TUI does not echo a benign control probe\n    // (so the probe cannot prove text-echo), and incidental output (a prompt, a redraw)\n    // would make a head-prefix check false-read head-loss and spuriously LOUD-spool EVERY\n    // delivery. So an adapter that KNOWS its harness echoes declares the capability\n    // (parallel to the ruling's \"bracketed-paste where the harness declares it\"); Layer 1\n    // (the settle-gate) is the UNCONDITIONAL root fix. The int gate also forces it on\n    // (`SPT_INJECT_FORCE_ECHO_MISS`) to exercise the re-drive/spool wiring on any platform.\n    // AMBIENT env can NOT arm this: both vars are scrubbed at daemon startup\n    // (`spt_runtime::INJECT_ECHO_ENV_VARS`, F-036 env-inheritance class — an inherited\n    // dev-shell export once force-enabled echo-verify host-wide and a false miss RETYPED\n    // sequences into a live session's input). Only an explicit declaration (or an\n    // in-process test broker, which never runs the daemon entrypoints) reaches this read.\n    let echo_capable = std::env::var_os(\"SPT_INJECT_VERIFY_ECHO\").is_some()\n        || std::env::var_os(\"SPT_INJECT_FORCE_ECHO_MISS\").is_some();\n    // `event_rx` blocks here; events queue → one sequence at a time.\n    for envelope in event_rx {\n        // A well-behaved filter only emits in response to an event, but drop any\n        // unsolicited commands left in the channel so they can't be mis-attributed\n        // to this event's sequence.\n        while cmd_rx.try_recv().is_ok() {}\n\n        let envelope_copy = envelope.clone();\n\n        // ── W5-A: run the sequence with a settle-gate (Layer 1) before ANY byte, an\n        // echo-verify (Layer 2) after `{commit}`, and ONE re-drive on a verify miss →\n        // LOUD spool on a second miss (silent+unrecoverable head-loss → recoverable+loud).\n        // The commit-deadline MISS / binary-death / send-fail semantics below are\n        // unchanged (C-1 miss-tolerance).\n        let mut committed = false;\n        let mut disconnected = false;\n        let mut send_failed = false;\n        let mut integrity_lost = false;\n        for attempt in 1..=INJECT_REDRIVE_ATTEMPTS {\n            // Layer 1: settle-gate before the first byte of EVERY delivery on an echoing\n            // PTY (re-arm — a mid-session `/clear` re-creates the reader-reattach race),\n            // and always before a RE-DRIVE (only reached on a swallowed head, so re-confirm\n            // readiness before retyping). Skip only where the probe is known unobservable\n            // (a non-echoing ConPTY — no race to guard, and settling would burn the full\n            // deadline). The latch is driven by the FIRST-ATTEMPT settle's own outcome.\n            if should_settle(attempt, probe_unobservable) {\n                let observed = settle_before_inject(&input, &log, &endpoint);\n                if attempt == 1 {\n                    probe_unobservable = !observed;\n                }\n            }\n            // Snapshot the ring high-water AFTER settling (excludes probe echoes) so\n            // Layer 2 sees only THIS sequence's output.\n            let seq_start = recover_log(&log).high_water();\n            match drive_one_sequence(&input, &floor, &child, &cmd_rx, envelope_copy.clone()) {\n                SeqOutcome::SendFailed => {\n                    send_failed = true;\n                    break;\n                }\n                SeqOutcome::Disconnected => {\n                    disconnected = true;\n                    break;\n                }\n                SeqOutcome::Missed => {\n                    // Commit-deadline miss — leave to the C-1 miss path (not an\n                    // integrity re-drive; the binary never signalled a complete sequence).\n                    break;\n                }\n                SeqOutcome::Committed { sent_text } => {\n                    committed = true;\n                    // Layer 2: verify the typed head echoed back — ONLY where the terminal\n                    // demonstrably echoes (else a non-echoing PTY's incidental output would\n                    // false-read head-loss). Where it does not echo, Layer 1 stands alone.\n                    if !echo_capable || echo_verify_after(&log, seq_start, &sent_text) {\n                        break; // delivered byte-complete (or echo-verify not applicable here)\n                    }\n                    if attempt < INJECT_REDRIVE_ATTEMPTS {\n                        eprintln!(\n                            \"INJECT_ECHO_MISS:{endpoint}: typed head did not echo (attempt {attempt}/{INJECT_REDRIVE_ATTEMPTS}) — re-driving once\"\n                        );\n                        committed = false; // re-drive; only a verified commit counts\n…\n                    }\n…\n                }\n            }\n        }\n…\n    }\n…\n}","startLine":1860,"lineNumbers":[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,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,null,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,null,2382,null,2386,2387,2388,null,2484,null,2487]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271500127}}
{"type":"message","id":"8d345c18","parentId":"31505891","timestamp":"2026-07-17T06:58:20.128Z","message":{"role":"toolResult","toolCallId":"call_Nz6u1RRtuCO1ovokmkYNe4pr|fc_0a061eb498f0e908016a59d28bff44819693618502a0b08f22","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## brain.rs\n 234|        let reader = thread::Builder::new()\n*235|            .name(\"pump-ipc-reader\".to_string())\n 236|            .spawn(move || {\n 237|                eprintln!(\"PUMP_IPC_READER: spawned\");\n 238|                loop {\n## conn.rs\n 448|        let dog = thread::Builder::new()\n*449|            .name(\"conn-watchdog\".into())\n 450|            .spawn(move || dog_inner.watchdog())\n 451|            .ok();\n 452|        BrokerConn { inner, dog }\n## docshost.rs\n 254|    std::thread::Builder::new()\n*255|        .name(\"spt-docs-server\".to_string())\n 256|        .spawn(move || {\n 257|            let rt = match tokio::runtime::Builder::new_current_thread()\n 258|                .enable_io()\n## nethost.rs\n 1185|            .worker_threads(2)\n*1186|            .thread_name(\"spt-broker-net\")\n 1187|            .enable_all()\n 1188|            .build()?;\n 1189|        let endpoint = runtime\n## transport.rs\n 46|        let ns = name.to_ns_name::<GenericNamespaced>()?;\n*47|        let listener = ListenerOptions::new().name(ns).create_sync()?;\n 48|        Ok(LocalSocketTransport { listener })\n 49|    }\n 50|"}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt-term/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":5,"files":["crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/docshost.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/transport.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brain.rs","count":1},{"path":"crates/spt-daemon/src/conn.rs","count":1},{"path":"crates/spt-daemon/src/docshost.rs","count":1},{"path":"crates/spt-daemon/src/nethost.rs","count":1},{"path":"crates/spt-daemon/src/transport.rs","count":1}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## brain.rs\n 234│        let reader = thread::Builder::new()\n*235│            .name(\"pump-ipc-reader\".to_string())\n 236│            .spawn(move || {\n 237│                eprintln!(\"PUMP_IPC_READER: spawned\");\n 238│                loop {\n## conn.rs\n 448│        let dog = thread::Builder::new()\n*449│            .name(\"conn-watchdog\".into())\n 450│            .spawn(move || dog_inner.watchdog())\n 451│            .ok();\n 452│        BrokerConn { inner, dog }\n## docshost.rs\n 254│    std::thread::Builder::new()\n*255│        .name(\"spt-docs-server\".to_string())\n 256│        .spawn(move || {\n 257│            let rt = match tokio::runtime::Builder::new_current_thread()\n 258│                .enable_io()\n## nethost.rs\n 1185│            .worker_threads(2)\n*1186│            .thread_name(\"spt-broker-net\")\n 1187│            .enable_all()\n 1188│            .build()?;\n 1189│        let endpoint = runtime\n## transport.rs\n 46│        let ns = name.to_ns_name::<GenericNamespaced>()?;\n*47│        let listener = ListenerOptions::new().name(ns).create_sync()?;\n 48│        Ok(LocalSocketTransport { listener })\n 49│    }\n 50│"},"isError":false,"timestamp":1784271500128}}
{"type":"message","id":"e46537f1","parentId":"8d345c18","timestamp":"2026-07-17T06:58:20.134Z","message":{"role":"toolResult","toolCallId":"call_hoPpVT891jFv3Vsc13lLSVDg|fc_0a061eb498f0e908016a59d28bff3081969106fc2cc89b5361","toolName":"read","content":[{"type":"text","text":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\n//!\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\n//! never emit it for short commands; an app that queries DSR itself always\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\n//! that does withhold. The auto-answer is verified deterministically by injecting\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\n//!\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\n//! does *not* EOF while the writer is held, so the read loop runs on its own\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\n//! broker stops a surface by terminating the child (which tears the PTY down and\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\n\nuse std::io::{Read, Write};\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\nuse std::sync::Arc;\nuse std::thread;\n\nuse crate::pty::{PtySession, SharedWriter};\nuse crate::surface::SurfaceError;\n\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\n\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\n#[derive(Default)]\nstruct DsrMatcher {\n    matched: usize,\n}\n\nimpl DsrMatcher {\n    /// Feed a chunk; return how many complete DSR queries it completed.\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\n        let mut hits = 0;\n        for &b in chunk {\n            if b == DSR_QUERY[self.matched] {\n                self.matched += 1;\n                if self.matched == DSR_QUERY.len() {\n                    hits += 1;\n                    self.matched = 0;\n                }\n            } else {\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\n                self.matched = usize::from(b == DSR_QUERY[0]);\n            }\n        }\n        hits\n    }\n}\n\n/// A running drain pump over a surface's output. Holds live counters and a\n/// cooperative stop flag; see the module docs for the teardown contract.\npub struct Drain {\n    stop: Arc<AtomicBool>,\n    dsr_answered: Arc<AtomicU64>,\n    bytes: Arc<AtomicU64>,\n    handle: Option<thread::JoinHandle<()>>,\n}\n\nimpl Drain {\n    /// Total DSR queries answered so far (live).\n    pub fn dsr_answered(&self) -> u64 {\n        self.dsr_answered.load(Ordering::Relaxed)\n    }\n\n    /// Total bytes forwarded to the sink so far (live).\n    pub fn bytes_forwarded(&self) -> u64 {\n        self.bytes.load(Ordering::Relaxed)\n    }\n\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\n    /// **not** interrupt a read already blocked (that requires tearing the child\n    /// down — the no-EOF-while-writer-held discipline).\n    pub fn request_stop(&self) {\n        self.stop.store(true, Ordering::Relaxed);\n    }\n\n    /// Join the pump thread. Only returns once the underlying `read()` has\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\n    /// on ConPTY that means the child must be torn down first. Best-effort.\n    pub fn join(mut self) {\n        if let Some(h) = self.handle.take() {\n            let _ = h.join();\n        }\n    }\n}\n\nimpl Drain {\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\n    /// bounded channel applies backpressure).\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\n    where\n        R: Read + Send + 'static,\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let stop = Arc::new(AtomicBool::new(false));\n        let dsr_answered = Arc::new(AtomicU64::new(0));\n        let bytes = Arc::new(AtomicU64::new(0));\n\n        let t_stop = Arc::clone(&stop);\n        let t_dsr = Arc::clone(&dsr_answered);\n        let t_bytes = Arc::clone(&bytes);\n\n        let handle = thread::spawn(move || {\n            let mut reader = reader;\n            let mut matcher = DsrMatcher::default();\n            let mut buf = [0u8; 8192];\n            loop {\n                if t_stop.load(Ordering::Relaxed) {\n                    break;\n                }\n                match reader.read(&mut buf) {\n                    Ok(0) => break, // EOF — child gone and handles released\n                    Ok(n) => {\n                        let chunk = &buf[..n];\n                        let hits = matcher.scan(chunk);\n                        if hits > 0 {\n                            // Answer through the shared, serialized writer so the\n                            // CPR never interleaves with caller-injected input.\n                            if let Ok(mut w) = writer.lock() {\n                                for _ in 0..hits {\n                                    let _ = w.write_all(DSR_REPLY);\n                                }\n                                let _ = w.flush();\n                            }\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\n                        }\n                        sink(chunk);\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\n                    }\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\n                    Err(_) => break,\n                }\n            }\n        });\n\n        Drain {\n            stop,\n            dsr_answered,\n            bytes,\n            handle: Some(handle),\n        }\n    }\n}\n\nimpl PtySession {\n    /// Start draining this surface's output on a background thread, answering\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\n    ///\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\n    //\n    // [impl->REQ-HAZARD-CONPTY-DSR]\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\n    where\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let reader = self.take_reader()?;\n        let writer = self.shared_writer();\n        Ok(Drain::spawn(reader, writer, sink))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::sync::Mutex;\n    use std::time::Duration;\n\n    // [unit->REQ-HAZARD-CONPTY-DSR]\n    #[test]\n    fn dsr_matcher_finds_query_across_chunk_boundary() {\n        let mut m = DsrMatcher::default();\n        // Split `\\x1b[6n` across two feeds.\n        assert_eq!(m.scan(b\"output\\x1b[\"), 0);\n        assert_eq!(m.scan(b\"6nmore\"), 1);\n        // A lone ESC that restarts a match mid-stream, then completes.\n        let mut m = DsrMatcher::default();\n        assert_eq!(m.scan(b\"\\x1b\\x1b[6n\"), 1);\n        // Two back-to-back queries.\n        let mut m = DsrMatcher::default();\n        assert_eq!(m.scan(b\"\\x1b[6n\\x1b[6n\"), 2);\n    }\n\n    /// A reader that yields one scripted chunk then EOFs — models a ConPTY\n    /// stream that emits a DSR query, independent of the host's real ConPTY.\n    struct ScriptedReader {\n        chunks: std::vec::IntoIter<Vec<u8>>,\n    }\n    impl Read for ScriptedReader {\n        fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {\n            match self.chunks.next() {\n                Some(c) => {\n                    let n = c.len().min(buf.len());\n                    buf[..n].copy_from_slice(&c[..n]);\n                    Ok(n)\n                }\n                None => Ok(0),\n            }\n        }\n    }\n\n    /// A writer capturing everything written, behind the SharedWriter shape.\n    fn capturing_writer() -> (SharedWriter, Arc<Mutex<Vec<u8>>>) {\n        struct Cap(Arc<Mutex<Vec<u8>>>);\n        impl Write for Cap {\n            fn write(&mut self, b: &[u8]) -> std::io::Result<usize> {\n                self.0.lock().unwrap().extend_from_slice(b);\n                Ok(b.len())\n            }\n            fn flush(&mut self) -> std::io::Result<()> {\n                Ok(())\n            }\n        }\n        let sink = Arc::new(Mutex::new(Vec::new()));\n        let w: SharedWriter = Arc::new(Mutex::new(Box::new(Cap(Arc::clone(&sink)))));\n        (w, sink)\n    }\n…\n}\n\n[Showing lines 1-233 of 287. Use :234 to continue]"}],"details":{"truncation":{"content":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\r\n//!\r\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\r\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\r\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\r\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\r\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\r\n//! never emit it for short commands; an app that queries DSR itself always\r\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\r\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\r\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\r\n//! that does withhold. The auto-answer is verified deterministically by injecting\r\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\r\n//!\r\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\r\n//! does *not* EOF while the writer is held, so the read loop runs on its own\r\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\r\n//! broker stops a surface by terminating the child (which tears the PTY down and\r\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\r\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\r\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\r\n\r\nuse std::io::{Read, Write};\r\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\r\nuse std::sync::Arc;\r\nuse std::thread;\r\n\r\nuse crate::pty::{PtySession, SharedWriter};\r\nuse crate::surface::SurfaceError;\r\n\r\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\r\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\r\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\r\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\r\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\r\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\r\n\r\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\r\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\r\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\r\n#[derive(Default)]\r\nstruct DsrMatcher {\r\n    matched: usize,\r\n}\r\n\r\nimpl DsrMatcher {\r\n    /// Feed a chunk; return how many complete DSR queries it completed.\r\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\r\n        let mut hits = 0;\r\n        for &b in chunk {\r\n            if b == DSR_QUERY[self.matched] {\r\n                self.matched += 1;\r\n                if self.matched == DSR_QUERY.len() {\r\n                    hits += 1;\r\n                    self.matched = 0;\r\n                }\r\n            } else {\r\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\r\n                self.matched = usize::from(b == DSR_QUERY[0]);\r\n            }\r\n        }\r\n        hits\r\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\r\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\r\n    ///\r\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\r\n    //\r\n    // [impl->REQ-HAZARD-CONPTY-DSR]\r\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\r\n    where\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let reader = self.take_reader()?;\r\n        let writer = self.shared_writer();\r\n        Ok(Drain::spawn(reader, writer, sink))\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use std::sync::Mutex;\r\n    use std::time::Duration;\r\n\r\n    // [unit->REQ-HAZARD-CONPTY-DSR]\r\n    #[test]\r\n    fn dsr_matcher_finds_query_across_chunk_boundary() {\r\n        let mut m = DsrMatcher::default();\r\n        // Split `\\x1b[6n` across two feeds.\r\n        assert_eq!(m.scan(b\"output\\x1b[\"), 0);\r\n        assert_eq!(m.scan(b\"6nmore\"), 1);\r\n        // A lone ESC that restarts a match mid-stream, then completes.\r\n        let mut m = DsrMatcher::default();\r\n        assert_eq!(m.scan(b\"\\x1b\\x1b[6n\"), 1);\r\n        // Two back-to-back queries.\r\n        let mut m = DsrMatcher::default();\r\n        assert_eq!(m.scan(b\"\\x1b[6n\\x1b[6n\"), 2);\r\n    }\r\n\r\n    /// A reader that yields one scripted chunk then EOFs — models a ConPTY\r\n    /// stream that emits a DSR query, independent of the host's real ConPTY.\r\n    struct ScriptedReader {\r\n        chunks: std::vec::IntoIter<Vec<u8>>,\r\n    }\r\n    impl Read for ScriptedReader {\r\n        fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {\r\n            match self.chunks.next() {\r\n                Some(c) => {\r\n                    let n = c.len().min(buf.len());\r\n                    buf[..n].copy_from_slice(&c[..n]);\r\n                    Ok(n)\r\n                }\r\n                None => Ok(0),\r\n            }\r\n        }\r\n    }\r\n\r\n    /// A writer capturing everything written, behind the SharedWriter shape.\r\n    fn capturing_writer() -> (SharedWriter, Arc<Mutex<Vec<u8>>>) {\r\n        struct Cap(Arc<Mutex<Vec<u8>>>);\r\n        impl Write for Cap {\r\n            fn write(&mut self, b: &[u8]) -> std::io::Result<usize> {\r\n                self.0.lock().unwrap().extend_from_slice(b);\r\n                Ok(b.len())\r\n            }\r\n            fn flush(&mut self) -> std::io::Result<()> {\r\n                Ok(())\r\n            }\r\n        }\r\n        let sink = Arc::new(Mutex::new(Vec::new()));\r\n        let w: SharedWriter = Arc::new(Mutex::new(Box::new(Cap(Arc::clone(&sink)))));\r\n        (w, sink)\r","truncated":true,"truncatedBy":"lines","totalLines":287,"totalBytes":9427,"outputLines":233,"outputBytes":9427,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\r\n//!\r\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\r\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\r\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\r\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\r\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\r\n//! never emit it for short commands; an app that queries DSR itself always\r\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\r\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\r\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\r\n//! that does withhold. The auto-answer is verified deterministically by injecting\r\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\r\n//!\r\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\r\n//! does *not* EOF while the writer is held, so the read loop runs on its own\r\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\r\n//! broker stops a surface by terminating the child (which tears the PTY down and\r\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\r\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\r\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\r\n\r\nuse std::io::{Read, Write};\r\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\r\nuse std::sync::Arc;\r\nuse std::thread;\r\n\r\nuse crate::pty::{PtySession, SharedWriter};\r\nuse crate::surface::SurfaceError;\r\n\r\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\r\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\r\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\r\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\r\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\r\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\r\n\r\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\r\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\r\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\r\n#[derive(Default)]\r\nstruct DsrMatcher {\r\n    matched: usize,\r\n}\r\n\r\nimpl DsrMatcher {\r\n    /// Feed a chunk; return how many complete DSR queries it completed.\r\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\r\n        let mut hits = 0;\r\n        for &b in chunk {\r\n            if b == DSR_QUERY[self.matched] {\r\n                self.matched += 1;\r\n                if self.matched == DSR_QUERY.len() {\r\n                    hits += 1;\r\n                    self.matched = 0;\r\n                }\r\n            } else {\r\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\r\n                self.matched = usize::from(b == DSR_QUERY[0]);\r\n            }\r\n        }\r\n        hits\r\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\r\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\r\n    ///\r\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\r\n    //\r\n    // [impl->REQ-HAZARD-CONPTY-DSR]\r\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\r\n    where\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let reader = self.take_reader()?;\r\n        let writer = self.shared_writer();\r\n        Ok(Drain::spawn(reader, writer, sink))\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use std::sync::Mutex;\r\n    use std::time::Duration;\r\n\r\n    // [unit->REQ-HAZARD-CONPTY-DSR]\r\n    #[test]\r\n    fn dsr_matcher_finds_query_across_chunk_boundary() {\r\n        let mut m = DsrMatcher::default();\r\n        // Split `\\x1b[6n` across two feeds.\r\n        assert_eq!(m.scan(b\"output\\x1b[\"), 0);\r\n        assert_eq!(m.scan(b\"6nmore\"), 1);\r\n        // A lone ESC that restarts a match mid-stream, then completes.\r\n        let mut m = DsrMatcher::default();\r\n        assert_eq!(m.scan(b\"\\x1b\\x1b[6n\"), 1);\r\n        // Two back-to-back queries.\r\n        let mut m = DsrMatcher::default();\r\n        assert_eq!(m.scan(b\"\\x1b[6n\\x1b[6n\"), 2);\r\n    }\r\n\r\n    /// A reader that yields one scripted chunk then EOFs — models a ConPTY\r\n    /// stream that emits a DSR query, independent of the host's real ConPTY.\r\n    struct ScriptedReader {\r\n        chunks: std::vec::IntoIter<Vec<u8>>,\r\n    }\r\n    impl Read for ScriptedReader {\r\n        fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {\r\n            match self.chunks.next() {\r\n                Some(c) => {\r\n                    let n = c.len().min(buf.len());\r\n                    buf[..n].copy_from_slice(&c[..n]);\r\n                    Ok(n)\r\n                }\r\n                None => Ok(0),\r\n            }\r\n        }\r\n    }\r\n\r\n    /// A writer capturing everything written, behind the SharedWriter shape.\r\n    fn capturing_writer() -> (SharedWriter, Arc<Mutex<Vec<u8>>>) {\r\n        struct Cap(Arc<Mutex<Vec<u8>>>);\r\n        impl Write for Cap {\r\n            fn write(&mut self, b: &[u8]) -> std::io::Result<usize> {\r\n                self.0.lock().unwrap().extend_from_slice(b);\r\n                Ok(b.len())\r\n            }\r\n            fn flush(&mut self) -> std::io::Result<()> {\r\n                Ok(())\r\n            }\r\n        }\r\n        let sink = Arc::new(Mutex::new(Vec::new()));\r\n        let w: SharedWriter = Arc::new(Mutex::new(Box::new(Cap(Arc::clone(&sink)))));\r\n        (w, sink)\r\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,null,286]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\reader.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":287,"totalBytes":9427,"outputLines":233,"outputBytes":9427,"shownRange":{"start":1,"end":233},"nextOffset":234}}},"isError":false,"timestamp":1784271500134}}
{"type":"message","id":"a6508147","parentId":"e46537f1","timestamp":"2026-07-17T06:58:20.135Z","message":{"role":"toolResult","toolCallId":"call_W5bg18vXCHVZBUAoURKU3I51|fc_0a061eb498f0e908016a59d28bff1c8196ae78ee2426d6bd2b","toolName":"read","content":[{"type":"text","text":"//! Native-PTY session backend — ConPTY on Windows 10+, `forkpty(3)` on Unix,\n//! both via `portable-pty` (the exact crate + handoff shape Spikes #1 / #4\n//! proved).\n//!\n//! [`PtySession`] spawns a child under a real PTY, owns the master reader and\n//! writer, and serves the [`SessionSurface`] contract. It is **single-surface\n//! per handle** — one child's PTY, not the multiplexed fleet (that supervisor is\n//! the M3b broker).\n//!\n//! ## Concurrency discipline (Spike #5, binding)\n//!\n//! `resize()` races the reader thread on Windows; the master is therefore held\n//! behind a `Mutex` and every `resize` takes that lock. The writer is a shared\n//! `Arc<Mutex<…>>` so the A2 DSR drain thread can answer ConPTY's startup\n//! cursor query through the same serialized writer the caller injects input\n//! through — no torn writes.\n\nuse std::io::{Read, Write};\nuse std::sync::{Arc, Mutex};\n\nuse portable_pty::{native_pty_system, Child, ChildKiller, CommandBuilder, ExitStatus, MasterPty};\n\nuse crate::surface::{SessionSurface, SurfaceError, SurfaceSize};\n\n/// Shared, serialized handle to the PTY master writer. Cloned to the A2 drain\n/// thread so the DSR auto-answer and caller input never interleave mid-write.\npub(crate) type SharedWriter = Arc<Mutex<Box<dyn Write + Send>>>;\n\n/// A child process running under a native PTY, exposed as a [`SessionSurface`].\n///\n/// Build one with [`PtySession::spawn`]; drive input via [`SessionSurface::write_input`]\n/// (or the A3 `send_keys`/`send_line` helpers), drain output via\n/// [`PtySession::take_reader`], and observe lifecycle via [`PtySession::try_wait`] /\n/// [`PtySession::wait`] / [`PtySession::kill`].\npub struct PtySession {\n    /// The master end, behind a lock so `resize` never races the reader (Spike #5).\n    master: Mutex<Box<dyn MasterPty + Send>>,\n    /// The single PTY writer, shared so the A2 drain thread can answer DSR.\n    writer: SharedWriter,\n    /// The spawned child; behind a lock for `wait`/`try_wait`.\n    child: Mutex<Box<dyn Child + Send + Sync>>,\n    /// A kill handle split from the child so we can terminate from another\n    /// thread even while `wait` blocks (`portable-pty` `ChildKiller`).\n    killer: Mutex<Box<dyn ChildKiller + Send + Sync>>,\n    /// The master reader, taken at most once (`take_reader`).\n    reader: Mutex<Option<Box<dyn Read + Send>>>,\n    /// The child OS pid, captured at spawn.\n    pid: Option<u32>,\n}\n\nimpl PtySession {\n    /// Spawn `cmd` under a fresh native PTY sized to `size`.\n    ///\n    /// The slave end is dropped immediately after the child is spawned: the\n    /// child holds the only remaining slave handle, which lets EOF propagate on\n    /// the Unix raw-pipe backend once the child exits. (On Windows the no-EOF\n    /// behaviour is governed by the writer, handled by the A2 drain discipline.)\n    //\n    // [impl->REQ-TERM-1]\n    pub fn spawn(cmd: CommandBuilder, size: SurfaceSize) -> Result<Self, SurfaceError> {\n        let pty_system = native_pty_system();\n        let pair = pty_system\n            .openpty(size.into())\n            .map_err(|e| SurfaceError::OpenPty(e.to_string()))?;\n\n        let child = pair\n            .slave\n            .spawn_command(cmd)\n            .map_err(|e| SurfaceError::Spawn(e.to_string()))?;\n        // Drop the slave so the child owns the only slave-side handle.\n        drop(pair.slave);\n\n        let reader = pair\n            .master\n            .try_clone_reader()\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\n        let writer = pair\n            .master\n            .take_writer()\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\n        let killer = child.clone_killer();\n        let pid = child.process_id();\n\n        Ok(Self {\n            master: Mutex::new(pair.master),\n            writer: Arc::new(Mutex::new(writer)),\n            child: Mutex::new(child),\n            killer: Mutex::new(killer),\n            reader: Mutex::new(Some(reader)),\n            pid,\n        })\n    }\n\n    /// Convenience: spawn `program` with `args` under a PTY sized to `size`,\n    /// inheriting the caller's working directory.\n    pub fn spawn_program<P, A, S>(\n        program: P,\n        args: A,\n        size: SurfaceSize,\n    ) -> Result<Self, SurfaceError>\n    where\n        P: AsRef<std::ffi::OsStr>,\n        A: IntoIterator<Item = S>,\n        S: AsRef<std::ffi::OsStr>,\n    {\n        Self::spawn_program_in(program, args, size, None::<&std::ffi::OsStr>)\n    }\n\n    /// Spawn `program` with `args` under a PTY sized to `size`, in `cwd` when\n    /// `Some` (REQ-HOST-RUN-2: a project-scoped working directory for the\n    /// spawned child) — `None` inherits the caller's cwd, identical to\n    /// [`Self::spawn_program`].\n    // [impl->REQ-HOST-RUN-2]\n    pub fn spawn_program_in<P, A, S, D>(\n        program: P,\n        args: A,\n        size: SurfaceSize,\n        cwd: Option<D>,\n    ) -> Result<Self, SurfaceError>\n    where\n        P: AsRef<std::ffi::OsStr>,\n        A: IntoIterator<Item = S>,\n        S: AsRef<std::ffi::OsStr>,\n        D: AsRef<std::ffi::OsStr>,\n    {\n        Self::spawn_program_in_env(program, args, size, cwd, std::iter::empty::<(&str, &str)>())\n    }\n\n    /// Like [`Self::spawn_program_in`] but also sets `env` vars on the child\n    /// (manifest `[env.<VAR>]` direction = inject — REQ-HAZARD-ENV-SUBST). Each\n    /// `(key, value)` is applied to the spawned process's environment ON TOP of\n    /// the inherited env, so an adapter's per-endpoint injects (e.g.\n    /// `SPT_ENDPOINT_ID = {id}`) actually reach the harness child.\n    // [impl->REQ-HAZARD-ENV-SUBST]\n    // [impl->REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE]\n    pub fn spawn_program_in_env<P, A, S, D, E, K, V>(\n        program: P,\n        args: A,\n        size: SurfaceSize,\n        cwd: Option<D>,\n        env: E,\n    ) -> Result<Self, SurfaceError>\n    where\n        P: AsRef<std::ffi::OsStr>,\n        A: IntoIterator<Item = S>,\n        S: AsRef<std::ffi::OsStr>,\n        D: AsRef<std::ffi::OsStr>,\n        E: IntoIterator<Item = (K, V)>,\n        K: AsRef<std::ffi::OsStr>,\n        V: AsRef<std::ffi::OsStr>,\n    {\n        // Resolve the program for the OS spawn before portable-pty's own `which`\n        // can pick an extensionless shebang shim that CreateProcessW rejects\n        // (os error 193). On Windows this PATHEXT-resolves a bare name and wraps a\n        // non-PE target (.cmd/.bat → cmd.exe, .ps1 → powershell); off Windows it\n        // is a passthrough. The wrap prefix args precede the caller's args.\n        // [impl->REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE]\n        let (program, prefix) = crate::winprog::resolve_for_pty(program.as_ref());\n        let mut cmd = CommandBuilder::new(&program);\n        for a in prefix {\n            cmd.arg(a);\n        }\n        for a in args {\n            cmd.arg(a);\n        }\n        if let Some(dir) = cwd {\n            cmd.cwd(dir);\n        }\n        for (k, v) in env {\n            cmd.env(k, v);\n        }\n        Self::spawn(cmd, size)\n    }\n\n    /// Take the master reader. Returns [`SurfaceError::ReaderTaken`] on the\n    /// second call — output is drained by exactly one consumer (the A2 drain\n    /// thread in the hosted path; a test consumer otherwise).\n    pub fn take_reader(&self) -> Result<Box<dyn Read + Send>, SurfaceError> {\n        self.reader\n            .lock()\n            .unwrap()\n            .take()\n            .ok_or(SurfaceError::ReaderTaken)\n    }\n\n    /// The shared writer handle — cloned to the A2 DSR drain thread so its\n    /// auto-answer goes through the same serialized writer the caller injects\n    /// input through (no torn writes).\n    pub(crate) fn shared_writer(&self) -> SharedWriter {\n        Arc::clone(&self.writer)\n    }\n\n    /// Poll for child exit without blocking.\n    pub fn try_wait(&self) -> Result<Option<ExitStatus>, SurfaceError> {\n        self.child\n            .lock()\n            .unwrap()\n            .try_wait()\n            .map_err(SurfaceError::Io)\n    }\n\n    /// Block until the child exits, yielding its status.\n    pub fn wait(&self) -> Result<ExitStatus, SurfaceError> {\n        self.child.lock().unwrap().wait().map_err(SurfaceError::Io)\n    }\n\n    /// Terminate the child. Safe to call from another thread while `wait`\n    /// blocks (uses the split `ChildKiller`). Confirm the reap via\n    /// [`PtySession::wait`] / [`PtySession::try_wait`].\n    pub fn kill(&self) -> Result<(), SurfaceError> {\n        let res = self.killer.lock().unwrap().kill();\n        #[cfg(windows)]\n        {\n            // portable-pty 0.8's Windows `ChildKiller` returns the spurious\n            // `last_os_error` even when `TerminateProcess` *succeeds* (the\n            // upstream success check is inverted; `WinChild::kill` swallows it,\n            // the cloned killer does not). Its Result is therefore untrustworthy\n            // — kill is best-effort; confirm death by reaping.\n            let _ = res;\n            Ok(())\n        }\n        #[cfg(unix)]\n        {\n            res.map_err(SurfaceError::Io)\n        }\n    }\n\n    /// The child's OS process id, if the backend exposes one.\n    pub fn process_id(&self) -> Option<u32> {\n        self.pid\n    }\n}\n\n// [impl->REQ-TERM-1]\nimpl SessionSurface for PtySession {\n    fn write_input(&self, bytes: &[u8]) -> Result<(), SurfaceError> {\n        let mut w = self.writer.lock().unwrap();\n        w.write_all(bytes).map_err(SurfaceError::Io)?;\n        w.flush().map_err(SurfaceError::Io)\n    }\n\n    fn resize(&self, size: SurfaceSize) -> Result<(), SurfaceError> {\n        // Hold the master lock so resize never races a concurrent reader/resize\n        // (Spike #5: resize races the reader on Windows).\n        self.master\n            .lock()\n            .unwrap()\n            .resize(size.into())\n            .map_err(|e| SurfaceError::Io(io_other(e)))\n    }\n}\n\n/// Fold a `portable-pty` error (a private `anyhow::Error` alias) into a\n/// `std::io::Error` so the crate's public surface never leaks `anyhow`. Generic\n/// over `Display` to avoid naming the un-exported error type.\nfn io_other<E: std::fmt::Display>(e: E) -> std::io::Error {\n    std::io::Error::other(e.to_string())\n}\n"}],"details":{"displayContent":{"text":"//! Native-PTY session backend — ConPTY on Windows 10+, `forkpty(3)` on Unix,\r\n//! both via `portable-pty` (the exact crate + handoff shape Spikes #1 / #4\r\n//! proved).\r\n//!\r\n//! [`PtySession`] spawns a child under a real PTY, owns the master reader and\r\n//! writer, and serves the [`SessionSurface`] contract. It is **single-surface\r\n//! per handle** — one child's PTY, not the multiplexed fleet (that supervisor is\r\n//! the M3b broker).\r\n//!\r\n//! ## Concurrency discipline (Spike #5, binding)\r\n//!\r\n//! `resize()` races the reader thread on Windows; the master is therefore held\r\n//! behind a `Mutex` and every `resize` takes that lock. The writer is a shared\r\n//! `Arc<Mutex<…>>` so the A2 DSR drain thread can answer ConPTY's startup\r\n//! cursor query through the same serialized writer the caller injects input\r\n//! through — no torn writes.\r\n\r\nuse std::io::{Read, Write};\r\nuse std::sync::{Arc, Mutex};\r\n\r\nuse portable_pty::{native_pty_system, Child, ChildKiller, CommandBuilder, ExitStatus, MasterPty};\r\n\r\nuse crate::surface::{SessionSurface, SurfaceError, SurfaceSize};\r\n\r\n/// Shared, serialized handle to the PTY master writer. Cloned to the A2 drain\r\n/// thread so the DSR auto-answer and caller input never interleave mid-write.\r\npub(crate) type SharedWriter = Arc<Mutex<Box<dyn Write + Send>>>;\r\n\r\n/// A child process running under a native PTY, exposed as a [`SessionSurface`].\r\n///\r\n/// Build one with [`PtySession::spawn`]; drive input via [`SessionSurface::write_input`]\r\n/// (or the A3 `send_keys`/`send_line` helpers), drain output via\r\n/// [`PtySession::take_reader`], and observe lifecycle via [`PtySession::try_wait`] /\r\n/// [`PtySession::wait`] / [`PtySession::kill`].\r\npub struct PtySession {\r\n    /// The master end, behind a lock so `resize` never races the reader (Spike #5).\r\n    master: Mutex<Box<dyn MasterPty + Send>>,\r\n    /// The single PTY writer, shared so the A2 drain thread can answer DSR.\r\n    writer: SharedWriter,\r\n    /// The spawned child; behind a lock for `wait`/`try_wait`.\r\n    child: Mutex<Box<dyn Child + Send + Sync>>,\r\n    /// A kill handle split from the child so we can terminate from another\r\n    /// thread even while `wait` blocks (`portable-pty` `ChildKiller`).\r\n    killer: Mutex<Box<dyn ChildKiller + Send + Sync>>,\r\n    /// The master reader, taken at most once (`take_reader`).\r\n    reader: Mutex<Option<Box<dyn Read + Send>>>,\r\n    /// The child OS pid, captured at spawn.\r\n    pid: Option<u32>,\r\n}\r\n\r\nimpl PtySession {\r\n    /// Spawn `cmd` under a fresh native PTY sized to `size`.\r\n    ///\r\n    /// The slave end is dropped immediately after the child is spawned: the\r\n    /// child holds the only remaining slave handle, which lets EOF propagate on\r\n    /// the Unix raw-pipe backend once the child exits. (On Windows the no-EOF\r\n    /// behaviour is governed by the writer, handled by the A2 drain discipline.)\r\n    //\r\n    // [impl->REQ-TERM-1]\r\n    pub fn spawn(cmd: CommandBuilder, size: SurfaceSize) -> Result<Self, SurfaceError> {\r\n        let pty_system = native_pty_system();\r\n        let pair = pty_system\r\n            .openpty(size.into())\r\n            .map_err(|e| SurfaceError::OpenPty(e.to_string()))?;\r\n\r\n        let child = pair\r\n            .slave\r\n            .spawn_command(cmd)\r\n            .map_err(|e| SurfaceError::Spawn(e.to_string()))?;\r\n        // Drop the slave so the child owns the only slave-side handle.\r\n        drop(pair.slave);\r\n\r\n        let reader = pair\r\n            .master\r\n            .try_clone_reader()\r\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\r\n        let writer = pair\r\n            .master\r\n            .take_writer()\r\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\r\n        let killer = child.clone_killer();\r\n        let pid = child.process_id();\r\n\r\n        Ok(Self {\r\n            master: Mutex::new(pair.master),\r\n            writer: Arc::new(Mutex::new(writer)),\r\n            child: Mutex::new(child),\r\n            killer: Mutex::new(killer),\r\n            reader: Mutex::new(Some(reader)),\r\n            pid,\r\n        })\r\n    }\r\n\r\n    /// Convenience: spawn `program` with `args` under a PTY sized to `size`,\r\n    /// inheriting the caller's working directory.\r\n    pub fn spawn_program<P, A, S>(\r\n        program: P,\r\n        args: A,\r\n        size: SurfaceSize,\r\n    ) -> Result<Self, SurfaceError>\r\n    where\r\n        P: AsRef<std::ffi::OsStr>,\r\n        A: IntoIterator<Item = S>,\r\n        S: AsRef<std::ffi::OsStr>,\r\n    {\r\n        Self::spawn_program_in(program, args, size, None::<&std::ffi::OsStr>)\r\n    }\r\n\r\n    /// Spawn `program` with `args` under a PTY sized to `size`, in `cwd` when\r\n    /// `Some` (REQ-HOST-RUN-2: a project-scoped working directory for the\r\n    /// spawned child) — `None` inherits the caller's cwd, identical to\r\n    /// [`Self::spawn_program`].\r\n    // [impl->REQ-HOST-RUN-2]\r\n    pub fn spawn_program_in<P, A, S, D>(\r\n        program: P,\r\n        args: A,\r\n        size: SurfaceSize,\r\n        cwd: Option<D>,\r\n    ) -> Result<Self, SurfaceError>\r\n    where\r\n        P: AsRef<std::ffi::OsStr>,\r\n        A: IntoIterator<Item = S>,\r\n        S: AsRef<std::ffi::OsStr>,\r\n        D: AsRef<std::ffi::OsStr>,\r\n    {\r\n        Self::spawn_program_in_env(program, args, size, cwd, std::iter::empty::<(&str, &str)>())\r\n    }\r\n\r\n    /// Like [`Self::spawn_program_in`] but also sets `env` vars on the child\r\n    /// (manifest `[env.<VAR>]` direction = inject — REQ-HAZARD-ENV-SUBST). Each\r\n    /// `(key, value)` is applied to the spawned process's environment ON TOP of\r\n    /// the inherited env, so an adapter's per-endpoint injects (e.g.\r\n    /// `SPT_ENDPOINT_ID = {id}`) actually reach the harness child.\r\n    // [impl->REQ-HAZARD-ENV-SUBST]\r\n    // [impl->REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE]\r\n    pub fn spawn_program_in_env<P, A, S, D, E, K, V>(\r\n        program: P,\r\n        args: A,\r\n        size: SurfaceSize,\r\n        cwd: Option<D>,\r\n        env: E,\r\n    ) -> Result<Self, SurfaceError>\r\n    where\r\n        P: AsRef<std::ffi::OsStr>,\r\n        A: IntoIterator<Item = S>,\r\n        S: AsRef<std::ffi::OsStr>,\r\n        D: AsRef<std::ffi::OsStr>,\r\n        E: IntoIterator<Item = (K, V)>,\r\n        K: AsRef<std::ffi::OsStr>,\r\n        V: AsRef<std::ffi::OsStr>,\r\n    {\r\n        // Resolve the program for the OS spawn before portable-pty's own `which`\r\n        // can pick an extensionless shebang shim that CreateProcessW rejects\r\n        // (os error 193). On Windows this PATHEXT-resolves a bare name and wraps a\r\n        // non-PE target (.cmd/.bat → cmd.exe, .ps1 → powershell); off Windows it\r\n        // is a passthrough. The wrap prefix args precede the caller's args.\r\n        // [impl->REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE]\r\n        let (program, prefix) = crate::winprog::resolve_for_pty(program.as_ref());\r\n        let mut cmd = CommandBuilder::new(&program);\r\n        for a in prefix {\r\n            cmd.arg(a);\r\n        }\r\n        for a in args {\r\n            cmd.arg(a);\r\n        }\r\n        if let Some(dir) = cwd {\r\n            cmd.cwd(dir);\r\n        }\r\n        for (k, v) in env {\r\n            cmd.env(k, v);\r\n        }\r\n        Self::spawn(cmd, size)\r\n    }\r\n\r\n    /// Take the master reader. Returns [`SurfaceError::ReaderTaken`] on the\r\n    /// second call — output is drained by exactly one consumer (the A2 drain\r\n    /// thread in the hosted path; a test consumer otherwise).\r\n    pub fn take_reader(&self) -> Result<Box<dyn Read + Send>, SurfaceError> {\r\n        self.reader\r\n            .lock()\r\n            .unwrap()\r\n            .take()\r\n            .ok_or(SurfaceError::ReaderTaken)\r\n    }\r\n\r\n    /// The shared writer handle — cloned to the A2 DSR drain thread so its\r\n    /// auto-answer goes through the same serialized writer the caller injects\r\n    /// input through (no torn writes).\r\n    pub(crate) fn shared_writer(&self) -> SharedWriter {\r\n        Arc::clone(&self.writer)\r\n    }\r\n\r\n    /// Poll for child exit without blocking.\r\n    pub fn try_wait(&self) -> Result<Option<ExitStatus>, SurfaceError> {\r\n        self.child\r\n            .lock()\r\n            .unwrap()\r\n            .try_wait()\r\n            .map_err(SurfaceError::Io)\r\n    }\r\n\r\n    /// Block until the child exits, yielding its status.\r\n    pub fn wait(&self) -> Result<ExitStatus, SurfaceError> {\r\n        self.child.lock().unwrap().wait().map_err(SurfaceError::Io)\r\n    }\r\n\r\n    /// Terminate the child. Safe to call from another thread while `wait`\r\n    /// blocks (uses the split `ChildKiller`). Confirm the reap via\r\n    /// [`PtySession::wait`] / [`PtySession::try_wait`].\r\n    pub fn kill(&self) -> Result<(), SurfaceError> {\r\n        let res = self.killer.lock().unwrap().kill();\r\n        #[cfg(windows)]\r\n        {\r\n            // portable-pty 0.8's Windows `ChildKiller` returns the spurious\r\n            // `last_os_error` even when `TerminateProcess` *succeeds* (the\r\n            // upstream success check is inverted; `WinChild::kill` swallows it,\r\n            // the cloned killer does not). Its Result is therefore untrustworthy\r\n            // — kill is best-effort; confirm death by reaping.\r\n            let _ = res;\r\n            Ok(())\r\n        }\r\n        #[cfg(unix)]\r\n        {\r\n            res.map_err(SurfaceError::Io)\r\n        }\r\n    }\r\n\r\n    /// The child's OS process id, if the backend exposes one.\r\n    pub fn process_id(&self) -> Option<u32> {\r\n        self.pid\r\n    }\r\n}\r\n\r\n// [impl->REQ-TERM-1]\r\nimpl SessionSurface for PtySession {\r\n    fn write_input(&self, bytes: &[u8]) -> Result<(), SurfaceError> {\r\n        let mut w = self.writer.lock().unwrap();\r\n        w.write_all(bytes).map_err(SurfaceError::Io)?;\r\n        w.flush().map_err(SurfaceError::Io)\r\n    }\r\n\r\n    fn resize(&self, size: SurfaceSize) -> Result<(), SurfaceError> {\r\n        // Hold the master lock so resize never races a concurrent reader/resize\r\n        // (Spike #5: resize races the reader on Windows).\r\n        self.master\r\n            .lock()\r\n            .unwrap()\r\n            .resize(size.into())\r\n            .map_err(|e| SurfaceError::Io(io_other(e)))\r\n    }\r\n}\r\n\r\n/// Fold a `portable-pty` error (a private `anyhow::Error` alias) into a\r\n/// `std::io::Error` so the crate's public surface never leaks `anyhow`. Generic\r\n/// over `Display` to avoid naming the un-exported error type.\r\nfn io_other<E: std::fmt::Display>(e: E) -> std::io::Error {\r\n    std::io::Error::other(e.to_string())\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,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\pty.rs"}}},"isError":false,"timestamp":1784271500135}}
{"type":"message","id":"8f8f8b60","parentId":"a6508147","timestamp":"2026-07-17T06:58:20.174Z","message":{"role":"toolResult","toolCallId":"call_ehLbtVO8ddy71IjhWqOoGN03|fc_0a061eb498f0e908016a59d28bff348196bc6821d2449d400b","toolName":"read","content":[{"type":"text","text":"    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n…\n        loop {\n…\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n        // then stomped info.json, routing injects to a contended record). The claim +\n        // the live-session check are read together under one atomic critical section so\n        // a concurrent spawn either sees our claim or its registered session — never a\n        // gap; NO I/O under the lock (process_id reads a cached pid). An empty endpoint\n        // is an ad-hoc/legacy spawn (no id to dedup on) → never gated. `_wake_claim`\n        // holds the claim to fn end, releasing (RAII) after the session is table-visible\n        // or on any early error.\n        // [impl->REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\n        let _wake_claim: Option<WakeClaimGuard> = if req.endpoint.is_empty() {\n            None\n        } else {\n            let deadline = Instant::now() + WAKE_DEDUP_WAIT;\n            loop {\n                enum Gate<'a> {\n                    Claimed(WakeClaimGuard<'a>),\n                    AlreadyLive(u64, Option<u32>),\n                    Racing,\n                }\n                let gate = {\n                    let sessions = recover(&self.sessions);\n                    let mut inflight = recover(&self.wake_inflight);\n                    let live = sessions\n                        .iter()\n                        .find(|(_, h)| h.endpoint == req.endpoint)\n                        .map(|(sid, h)| (*sid, h.session.process_id()));\n                    match wake_gate_decision(\n                        live.is_some(),\n                        inflight.contains(&req.endpoint),\n                        Instant::now() >= deadline,\n                    ) {\n                        WakeGate::AlreadyLive => {\n                            let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");\n                            Gate::AlreadyLive(sid, spid)\n                        }\n…\n                    }\n                };\n…\n            }\n        };\n…\n    }\n\n[Showing lines 3259-3338 of 6298. Use :3339 to continue]"}],"details":{"truncation":{"content":"        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n        // then stomped info.json, routing injects to a contended record). The claim +\n        // the live-session check are read together under one atomic critical section so\n        // a concurrent spawn either sees our claim or its registered session — never a\n        // gap; NO I/O under the lock (process_id reads a cached pid). An empty endpoint\n        // is an ad-hoc/legacy spawn (no id to dedup on) → never gated. `_wake_claim`\n        // holds the claim to fn end, releasing (RAII) after the session is table-visible\n        // or on any early error.\n        // [impl->REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\n        let _wake_claim: Option<WakeClaimGuard> = if req.endpoint.is_empty() {\n            None\n        } else {\n            let deadline = Instant::now() + WAKE_DEDUP_WAIT;\n            loop {\n                enum Gate<'a> {\n                    Claimed(WakeClaimGuard<'a>),\n                    AlreadyLive(u64, Option<u32>),\n                    Racing,\n                }\n                let gate = {\n                    let sessions = recover(&self.sessions);\n                    let mut inflight = recover(&self.wake_inflight);\n                    let live = sessions\n                        .iter()\n                        .find(|(_, h)| h.endpoint == req.endpoint)\n                        .map(|(sid, h)| (*sid, h.session.process_id()));\n                    match wake_gate_decision(\n                        live.is_some(),\n                        inflight.contains(&req.endpoint),\n                        Instant::now() >= deadline,\n                    ) {\n                        WakeGate::AlreadyLive => {\n                            let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");\n                            Gate::AlreadyLive(sid, spid)","truncated":true,"truncatedBy":"lines","totalLines":3040,"totalBytes":4250,"outputLines":80,"outputBytes":4250,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n…\n        loop {\n…\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n        // then stomped info.json, routing injects to a contended record). The claim +\n        // the live-session check are read together under one atomic critical section so\n        // a concurrent spawn either sees our claim or its registered session — never a\n        // gap; NO I/O under the lock (process_id reads a cached pid). An empty endpoint\n        // is an ad-hoc/legacy spawn (no id to dedup on) → never gated. `_wake_claim`\n        // holds the claim to fn end, releasing (RAII) after the session is table-visible\n        // or on any early error.\n        // [impl->REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\n        let _wake_claim: Option<WakeClaimGuard> = if req.endpoint.is_empty() {\n            None\n        } else {\n            let deadline = Instant::now() + WAKE_DEDUP_WAIT;\n            loop {\n                enum Gate<'a> {\n                    Claimed(WakeClaimGuard<'a>),\n                    AlreadyLive(u64, Option<u32>),\n                    Racing,\n                }\n                let gate = {\n                    let sessions = recover(&self.sessions);\n                    let mut inflight = recover(&self.wake_inflight);\n                    let live = sessions\n                        .iter()\n                        .find(|(_, h)| h.endpoint == req.endpoint)\n                        .map(|(sid, h)| (*sid, h.session.process_id()));\n                    match wake_gate_decision(\n                        live.is_some(),\n                        inflight.contains(&req.endpoint),\n                        Instant::now() >= deadline,\n                    ) {\n                        WakeGate::AlreadyLive => {\n                            let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");\n                            Gate::AlreadyLive(sid, spid)\n                        }\n…\n                    }\n                };\n…\n            }\n        };\n…\n    }","startLine":3025,"lineNumbers":[3025,null,3055,null,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,null,3348,3349,null,3368,3369,null,3512]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":4250,"outputLines":80,"outputBytes":4250,"shownRange":{"start":3259,"end":3338},"nextOffset":3339}}},"isError":false,"timestamp":1784271500173}}
{"type":"message","id":"9d75523e","parentId":"8f8f8b60","timestamp":"2026-07-17T06:58:55.854Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Calculating OS thread usage per IPC connection**\n\n**Analyzing lifecycle of broker IPC threads and potential leaks**\n\n**Assessing Brain object thread lifespan and connection counts**"},{"type":"thinking","thinking":"**Evaluating non-invasive CPU profiling methods**\n\n**Planning safe thread and IPC handle inspection**"},{"type":"toolCall","id":"call_A3adzpA8qMwtTkdGoi8nDYP4|fc_0a061eb498f0e908016a59d2afc84481969733f79b2cce0b38","name":"read","arguments":{"i":"Reading translation process threads","path":"crates/spt-daemon/src/translation.rs","selector":null}},{"type":"toolCall","id":"call_XQjBpi0JxfbX8pvNPFVyxu1q|fc_0a061eb498f0e908016a59d2afc858819681762851c3b4bab7","name":"grep","arguments":{"i":"Finding seat capacity and presence","pattern":"SUBSCRIBER_QUEUE_CAP|SubscriberSeat::install|begin_attach|detach_if|struct PresenceLog|subscribe_presence|detach_presence","path":"crates/spt-daemon/src/nethost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_gaIm5nQX53QE4u2tzvWY1SYa|fc_0a061eb498f0e908016a59d2afc85c81968459c78ef4755a5c","name":"read","arguments":{"i":"Reading watchdog completion loop","path":"crates/spt-daemon/src/conn.rs","selector":"330-415,470-640"}},{"type":"toolCall","id":"call_5NCzP8UySUiZru4io5w4yrjY|fc_0a061eb498f0e908016a59d2afc8648196acd326b926ae8fb1","name":"grep","arguments":{"i":"Finding session deletion paths","pattern":"sessions.*remove|remove\\(&id\\)|dispatch_kill|session\\.kill|request_stop|\\.join\\(\\)","path":"crates/spt-daemon/src/broker.rs; crates/spt-term/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_xmrIgZDkvT4BCCThSNMhdiQs|fc_0a061eb498f0e908016a59d2afc86c819692d7e2be7eb40c63","name":"grep","arguments":{"i":"Finding stream table removal","pattern":"streams\\s*\\.lock|\\.streams|retain\\(|remove\\(","path":"crates/spt-daemon/src/nethost.rs","selector":"900-1950","case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_qUMCjE9JB4rMDcXIhdxxegEw|fc_0a061eb498f0e908016a59d2afc8708196a4526a3be71b7d84","name":"grep","arguments":{"i":"Finding version changes","pattern":"SubscriberSeat|conn-watchdog|BrokerConn|retire_stream|REDISPATCH|finished.*retire","path":"CHANGELOG.md; docs; crates/spt-daemon","selector":null,"case":false,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":16116,"output":1319,"cacheRead":99840,"cacheWrite":0,"totalTokens":117275,"reasoningTokens":922,"cost":{"input":0.08058000000000001,"output":0.03957,"cacheRead":0.04992,"cacheWrite":0,"total":0.17007}},"stopReason":"toolUse","timestamp":1784271500212,"responseId":"resp_0a061eb498f0e908016a59d28c83a48196a6bb2edaf42cfa3e","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d290079481969cfa2d8a33f23c3a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdKelEYgjVDS8DViC57-hjxqTUVc8MEpdteMqbg7wjdnLO1CnwnIv2QYQclPjqqZZxhbOIPN2PPP7V-kn0EFjsp8vBtwJgVXsoSu7AdKYRwEAT4hCE3WoC4FHdostyiwpt7J52bvzSk4ROBG9H7vvD2Le9G9C7-7U3cIBM51vv4s6UXt5S2LeVC8blPOGYqQ5ozgCGRoE-_vEXKfgsm6XU09T6TU16O2qHobKVnDnQU30NZ0_UIJFpqMBBWlhOBUXLtFUQoP6Q3echqd5zafZtj9ZMwBBMS5T2sGZcFA6cnvwNL_j2_qc6knb0vb-QkcxWL6srb_EIv640YxGA75lZk_NCcqqzQ4LAQe-rrQZnJhh42kFluDjuMBdw1-jhS03MD-bggR9yZ5Pw3s9RBxgr7joXbTp7aLEuPgGGUtA0irTRldJYxx2TK2wvSItdTeJ9kyYjoQW9Un_qvlVXJX_JmN63I_IicHYf8Q09NoMuA5r6o9WYY1IponiNyV4PKCG3E3VkAMGwRJbNH2S05N-NQIBnehUyXCpf8eWl2ChXaCYxz6wWeP69hpJvit0ujcfilOM1kBPu_kjT2M-8ERQKb8yKZ6V6rk-mGR6bjSSySvS3M2eEXzw4FRcs2eKB5sJGu0Z9gmRdIdrzgUVM_16bouBrXpSTK3FCx4vsJt2-g6SH3u616Rerxqr19OjMMkWkUAXNqK7KCQKtAnFErGBlv0lco7rjduLbh-mCgcshoGVIUfYK9Mi6ki2Mn7xR1icBWb8aH0DY7hJCM6xh4QNR0XbbKFlVEtU3wgbI1TayEykW1jUU7ME6pUEufwt_033ncVFdVPuX1BNnlsHwYC8DiIX9blykZxbOvC_p5O5wDjUg_8zrlhXlMDRlc7VkOzI7L-AD06udVlNtmutlTjjqKvplDGLQZd7nhiOURV3a1mRh06rVLkXz9ibMsRE0SVu57cBRNeNvvSUF1ShuVYCrrubf1qP6zKvFVR2CfHl65Mz4_LKBinfpSI4JdcQIaBZ4IL1MDc_jA7pGAqPVkEqvPdgWAB9dzS8gN5vl-GExEFwYPpmEDHFqiwn02Pff14dPthbKlQ5u_uoxKGlUv792mtvbI7YJJyV_eu-9TogDWOcLvSattFAvQAotuxdxS3p4Ur8Cp0LuxyEpYVo5-UMFODn9ln6LvZnANa5TXL91iOxEX01364K3cxekcK2iqovDxFQ7cFmDmMhDpEugcy7zrJL3yoWNqINXrVoYJGAcAX4SbkYvAEpVoeZgSaTn6xb94AF-xtl-P8WGGDxxxoc6ZqHXk7cFJkhm-24vv9A-mTVOUIOScMoJW36wGxuS44FRWrYfnr_oIcQewRNPgZVlpRfy2bErJYZ1jPQtTOSK6X539mjwPOqqzM--DxCFLUHEe52OEn359IBjR8TtrFoVJe3latLJm7LFwzv_S14s-1-vnmoLl5Xk-uaOhunZ60ttWWFAQ7xt9L8jtz14QI5YdwOPS0d8K_QpWJ0OYknrVRZ00-b3qnuaFxuPO2LSZnmze40rnRBvBM-GQfuBgjr8tlMoLOXWl2y5iZNMb7uttN0Zw0r32P7W0eAw7CJUkSpOQ-1A2E_d7Qhqy7eEpyNseGmo606tAA39jNnDnwNWDeE703CzUYzjs-qujWpBKGVQvttxDDlEuUONVus6W5ZLtC4hbSO4J-X2hxvrQX4vthH8e7ZNZN2ES_rSM-kyEe1dMyhlVnh1cDJrKbYH-CvPaY2UcP05dTTMaLQ3hKbglxlP1ToBfc-HdWUz4AMY45tOVSPGBXS38uy2KYsHdNUOubSWT8gJOWkqissG7LeUIHmNfw21zZRrxbSDQDMk7f9cSqh1qQU5FyyNSEdrZjKX9Vwj0jBXO3uibU4raai9_jASdEfq_cFVWW6uI0hPhnDs_M-G9_ZHKsinZrPWeu3XP2oCD50rWX4Zswxqa4HjwsJsNdIa94QgR9b3JOK_28b0sp8_DpuQWXzp6TjbZucAmOM2kycZuGYu46iCv9R5Ztpp8PVdbaYNgqQxH2oLJyQy_Suridr81blYTisKgQlLPYpQoTx31A_sTGt3Gu8CH0LPixHrGGVlUXn9uaNVlh46XXU_xc952vsnARBSKV_XlnS4eTNuOqvLeNPpw4HhzO_RM9DD38nAbLSHhHWG5u4cbL9h9j7d9ZVfz5NIBOKM23Owqq503oNBCr1prWBlKvd7l6nnI64RA79CdKxIVmYPvGv6xLupW6fcz3R07MM1_y27snd5qHKF3vr4NYe1PaOlUs7uHWhEDiRcgD_sYQJIJg_kRBDUCtZdkbrK50lgoePrordMoo2lg2NhkEDQhHmiqXDIjUFpjFzVo6yB5IZX3w3f0hPL2avvaXsymVu34MioXtj3G_RfQaCqbr9PdzPQqSM9l6-X40mT7Yt5pRZ7Zq7qQbo988WR5W-PzbSxxAx1jzjX4MSrR3sS31iGfGmX5ydqbcH89X-4P4z-j-2JKNOlnWx0MOxzCF9XKCelKWluNZ6ENaAQ-QeWRoe_aas17a7fTG-TylAjMewxObRpFA4pDCTcNaaR74yyl9aTpRzwKi5SNAvRSGA9XhyUGY-DtZWGbxj40qC8ZqUhW-0JbVZ4fJUAncjK3vWiFlxjOLLsMpULz9gcuq4W4lL6Qdz36V-AOoaW5cjZmgdBb82_UW6ryv-7rIGHExvX171bvb2EaHLAoHqkwoXDubnbGgwUfy1Dwf2sAsytCcb6-V0ENdQM2OSzGiOJ9_IfVzhzBj-DWDQPJId7uahCaPvS68tAi5lXs1XZqpIG_qGIzbS2Eeu1n5uW29WayoSHpYNaio-1hqsbnasel8rfIgTOe71S28pBOdx62qkl34JW8Dc2hKpzMQcYhkw_Ar9szN4pAlLmdTYk2vz7DAb-1BDTy0UYewJCboe8WxtWnFBXfqRXcGANqJm4C4k0NpdHo5H9dRa714uOxplsOVVwRBuMP_JIr6IIY9K92ezySnubJ7BjUI3lrtPjYlT5GXkZJL5FSCenX_q-D--hPr7o4cMvsZclXK6PNFQ3I5qmt39jp__TM7Xmlf32S09Qjw4XMSfoJKp339naJ3Ikk4IIyMTQRtfjPme_8BEdp9tUvel-IHZzNlsG34w3nGO9VooM_O2iG21Yv6T1k2dvzasW8G50TSfMZbm5c6uA_Ca3zHIvO5BNRCNo7O5cQPc-CCxHw6pKN-3KRkNmzpcDrJZPvKgTeISPx-VOPpQ2xCVqyFCG9qZPvOnDcY-gIUfcBe3KEJoc7wJ8wSL6lvalD1BBjnzqOmdLmmnpKyFNuqVIhEigeCPGnjxOa-W27OcVjjV-sfPxzdjnkRUvd7dGA_auIITCP2uo8dZQ06KCSehCFYKYq8esPRZQ6jROmp62hwvX380Nulk77T-hSgBY9URJEMZtaYzDyNhCtFgTnYxbDEeS9D2gcElJhxvz7526s3j9uZfKFAy_IFjfPOK3CEGUMut8jMbUBI56jXzoFMCEv5i4biEPzUwBCrzhs7Idf03w01HmwS9f6Cp2xkl55Tp5DCzyNXxRA4ZFZC92Knm6f9OR2zIPDwiLKhzLoU38QwG1hCJYgawqODYGw0zLFfoIpLuggmQrRPSsxIt1xJmxlCAmshNvz6RE-0kxDm7A6pQSzAUQYggmCHperIbkoaY3_7GyYUzvakKMVjs4AfL5BeNxmAnRL1Al7-Wbio5t_4mDnMElU-xgUskeRXW2NZx710gwuNnTDU36ctNzvBRIxbo--CWh48TZgwCNvkuQozwcJNaWhI86mMs42MB6bigw_MMFJerGSXEo0VFcb5zqKEjIRigEpI-AW6Xe28S3KWTsk6mytFQQnVUOqgu-LUxdnu85y5M5hYmbvBJmunau_-4nlwKtryBPBpz2JEG03Bt-m6dhdms-Tqc1-DhZm_R31X44ifXEclaZznecc6pbbSvCA7m6SKZCJnuoaQXFUUFeT1Ctu8RqeFoMwvOrpBq6nI0DxI7K0XODGZrn1CA2Iy4_Xx06y3MRQmQEtFAhwzJ0r8FcE9jYICLWWE6u_apNCrykidtRirvt2CTGoioHIhqwiuhAS7xSW2IQ1hfa21XJ3GI-hkGAiI8_NxbtHAstv_7ZVKZpzUhPPOUKm4UMkFa8faxUtUoynC9pVb7V5U1OLhRh3UadPH54KvWgHk9jmyVrmn7mCD5DqSKla3LPIhzLCZnRsk2UmWozKI6i1svkwIaEPVzK-JQUz9jVcS-SuasU2ykFkute-psrtTCSjLBAALKfPI09KWWDMnKx8ErHFCphuwiqvXIuHnibPQrFzUaNapK0rP6151onJUM7BvriQVQdzA","summary":[{"type":"summary_text","text":"**Calculating OS thread usage per IPC connection**"},{"type":"summary_text","text":"**Analyzing lifecycle of broker IPC threads and potential leaks**"},{"type":"summary_text","text":"**Assessing Brain object thread lifespan and connection counts**"}]},{"id":"rs_0a061eb498f0e908016a59d29ec898819691115db8e7b4a2f9","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdKvCIw0eGaJXtoL3ZBDvB4O8a_KcaeepmPyHVc1-RVgzyOOnTbWaM_xsvigNAnVfnl6djJcxk2gE6N_V9c5gctmt6yxZ9zh8ezUl6q-vv0ub9pNPYXJms2f94oGZNCIxcCS2wLgfUjvCY3063wMyiw01tdfTH_V6axsy9jCZY5zgmHUwR-IeQrpLwqwLHHu8LID8ryu2_miRBpirFT7ORGEApvRFgOQ2TSwivfWShyCSSysTMAbtk5U6-BqYEn0wc_Bb7b2kwLCOHr_F_cJ6rN3Xo7VlkDjAMzGDYM6wTBAbGWHHKbJaa0PgSRZxz52KLjR9z1fY8BPaMviAS7fD0oDtRWr4AVlZq472UOqHqGg7cqteHk3FGMFmum2qG-cl1YTm1dxxpEGmZUbyhU6oDYRetW_mNU3tH-7TQgeOJ1aosfcbRGpl9cNiH8Wyn-CF2fVxn8yMixKf8USiFDpfurQiId4L5Yp9QwkIgxEpQQgJ3GDWFWeOLmAajt-7pnkvLVoOG3_GMuKd5rnfV7nMXN8yu_ijB4c1Vl5wCmOIEquR93jiRPDrJpRNibVrv9NHUALm80H254JPmy0AvsUY5Mm7RUTEA7PQgTSSdLiLXMEJ-xYAJNBC1oZstrwp3Vg_gbdU-YIWf2oEJaNDsiR8dUTs6kd6XGZ9HK7CYIWepWEXlHbzI5ajiVH17NUeTXcqbbWj0nVTU-6YXuHHVkdlr2YzJbyNm_R0tpluLCeNs0SRPaQj-x0pc94wev8E-0zgrQAS60E7stW7pDTW92iQWU8DVo2wpZ1ms3tOC4kqCv-doi1IMkidUNRYT5e858mtVi4F-HCGUdU7iCk3AAog_YPDGz0CcL6SrJbEfLgFK_gGghqbFPQ4_fDM2htEiOQDrxmUpRr51m-GPxX1N6RI0SQlnKazV1jLAjHBkQ51z7y4x9vngSJPKhayC2v7_T0uE8luzQ1Ce2aSX7ioOraNebmbeKch_EwHyvCaTH3rvconINAM5VYcHCt1g8DYWY3W71ck8Q2KzaVZu_ccQYPUx2JWUl01Rl6AeaBhUtV71KSkYE36zHzvyBHOwdlfVCN8krwajkYn9LHAvkE6B5f6Abd_bZ5PBJffC6kHjKYn8CsRF6G_GUAZiUoPa-VglPVpwQjCG_daqGGrNU-FbtpDmgS3kviuoeI1F4DIaXh3NgtgWz9jkXrKsh-Dk6uGUql6wDdYWlfbyqkE5lRG2zrzjbgHt-d8i3u8_4HyLkXIvuZi6YH5p2OHgUQV9vJz-l1xSZXC0PlPbEToKkWC68z2MLoTIzXO_wsukmlM2sYzYqj-SlGMPM1fz9Spn6QR3Cs5HT-dAwFGY6oEUTptjuDaTUneijCLGtUsv0qPVo4LFzHLNn6cYrCb_2zhfltHrnNtWWRw7-LYtf7OP9C2fKOsQznaJZuR1JAZAVPn2HdIjoAWmaf-O7wzQqvzJrHjWpz6VUNsfk1y6tBVhf2OI2ued6WvKeAa9JQPpB_R217gHsvcJ0cxpY_V4N1367DdpaWIhYUjMmr6KfyA8343DGmi6L6oC9Yob3z7ig0jY0UmmrFmiec7m2j818YdEPkx8j5D50qlb0LajRLTNkjYvX5AXadHumMIdYBE76HzprvPS3uS-iWtK9LT2-3-CxJ8vDyvA9IPbaQXHtrA2_b3DJatwYHAr02zyMHX-sjVxd1yrXmNJ4VbrKt6x-wPamXHysYQ7H0hxYQqm7vBqRMNTvhTg3xjRQR3VXWrzn75VncAq0iAfzr_mUuyX201hUApxs8b1vcv8chhr2y95QtID3RMdHqrb_RVxQebZ-5TEisAYn6iQFY-PuoV2Ea_dTVe0xfDzG2KYlFskVcQEvdgf1GqM48HlWZKbtB5vW1i-Ne3IFLA6ZxJ2nPWlTeyRUFPR6uDWgh6Te8FdTzYwnXGB9anOlCSyTp8Rn93NZ3OCkpF5moY7BiIToVcftkfARjwEl5lz9Nc5Vq7u_jFrkoArKvQbpUn3NalLg8RxSw7O1mri_Gub-wDK1e3I1H4lcY39BftaT7s-46hLt7TEv73eL5dJpEtjy_ndUUMAOS0_mFt9L2xhdqK0BQsYuKV3wf5GfiELsNYy6UsxiYXyKv4eQVB4uHzcTiBTbeoc3yisjqWc6BcdKFBssH4WWNGitiD24r9ynuMuNrugy0BV0UAmoIMTx7NpWUdKMyLP5Sar8OTE9v4K-1PGKorRMtRhXKsZJlDnXN_39dcNcqJFfB1rtAznv2Y224B28CLKrnfB2Al1QNh5NWuCG2L-e6-yaTiCtXWsRjYeFSPS6Xfc8DRogG1NNYauRlXb9v1nLm8GZFNL_WSvWTdb3FfLep2cWrOC3xl7JMGmPYH-Y2YxXqaBmeWXeYGG0nYxdSo3HtzrXEBhU49woiGP2AqtsokgOeGkAV2_qgJYwPpg6XCM_Im4P3zFL-pSI2Kkb4HtLKKsrDkNQLyKG9WF5-t0lQEqXak0MX4OXa2HG0wquOoub9SH51clLesvz6QqJ_ld0eQYuUNlnQbUWTki7oS0miR-3tJ3inbj7xxdEPJ0UErotmz1SRbkIehYSjXeIa-zlglcnz4_Y4PTFQxI6WzGQoYMWtKD8h27PRNTBGuHVDHL5iyxJ_rgYLzO-Sn0_zVVy5zb8qH8yVvJStXE5kXryguP8SXOC-CptNoul4O2nCxzChlA_tgZfdgaDsEMcWvf7Orsx2e-9ZWHiSnox15X1YmWyM3p9NmzYtjFOWA4yF7bS6E71Gc0slVcObSPdEIcQ-3IKiIj_RZIVjSq47PfwszqrVlPMkBktfm7kAQWmwX6IiCdfsgcJL_i5DahPKPZswDloAM7IXHAcduyTK23K0xocxvo0go9E5SlcJrr3zs7wfjK5hZsJy8-ePojAzLfD0q4RBiWHSi5qAdLoztrbMtgBTWjcVSg4KsFlK742Sb-CZlWY1lbfw1sAHtrt5g07kYgIxSUjiGAmxzCEJWo2pmldB6yqwq0DC793RKDIARBVfgQpc82EANGY65AAXWre4BBfH13wtdpRowhxatwAH9O4lfCLLWqkwCupRTpe_HU5f8x1_36Xmz-UrD23akRzb4286iY_Imtt0MG225fJy2o-yMGjjZE0lMjuG0oq3Ru0lfj9M4TPDUWVWvgNvoRudD6wn9KAVMdb76MainiqW-T-EKGaOp9a4TYNhP1LRrMg-qZIo_q8Iy83wjQaLMs4_G9dmayHgOdqfzxdZrKwR5kwA-eS2Rj92","summary":[{"type":"summary_text","text":"**Evaluating non-invasive CPU profiling methods**"},{"type":"summary_text","text":"**Planning safe thread and IPC handle inspection**"}]},{"id":"fc_0a061eb498f0e908016a59d2afc84481969733f79b2cce0b38","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading translation process threads\",\"path\":\"crates/spt-daemon/src/translation.rs\",\"selector\":null}","call_id":"call_A3adzpA8qMwtTkdGoi8nDYP4","name":"read"},{"id":"fc_0a061eb498f0e908016a59d2afc858819681762851c3b4bab7","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding seat capacity and presence\",\"pattern\":\"SUBSCRIBER_QUEUE_CAP|SubscriberSeat::install|begin_attach|detach_if|struct PresenceLog|subscribe_presence|detach_presence\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_XQjBpi0JxfbX8pvNPFVyxu1q","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d2afc85c81968459c78ef4755a5c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading watchdog completion loop\",\"path\":\"crates/spt-daemon/src/conn.rs\",\"selector\":\"330-415,470-640\"}","call_id":"call_gaIm5nQX53QE4u2tzvWY1SYa","name":"read"},{"id":"fc_0a061eb498f0e908016a59d2afc8648196acd326b926ae8fb1","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding session deletion paths\",\"pattern\":\"sessions.*remove|remove\\\\(&id\\\\)|dispatch_kill|session\\\\.kill|request_stop|\\\\.join\\\\(\\\\)\",\"path\":\"crates/spt-daemon/src/broker.rs; crates/spt-term/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_5NCzP8UySUiZru4io5w4yrjY","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d2afc86c819692d7e2be7eb40c63","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding stream table removal\",\"pattern\":\"streams\\\\s*\\\\.lock|\\\\.streams|retain\\\\(|remove\\\\(\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"900-1950\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_xmrIgZDkvT4BCCThSNMhdiQs","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d2afc8708196a4526a3be71b7d84","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding version changes\",\"pattern\":\"SubscriberSeat|conn-watchdog|BrokerConn|retire_stream|REDISPATCH|finished.*retire\",\"path\":\"CHANGELOG.md; docs; crates/spt-daemon\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_qUMCjE9JB4rMDcXIhdxxegEw","name":"grep"}]},"duration":35639.88379999995,"ttft":3831.8488000035286,"contextSnapshot":{"promptTokens":115956,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_A3adzpA8qMwtTkdGoi8nDYP4|fc_0a061eb498f0e908016a59d2afc84481969733f79b2cce0b38","toolName":"read","startedAt":"2026-07-17T06:58:55.855Z","args":{"path":"crates/spt-daemon/src/translation.rs"},"intent":"Reading translation process threads"},"id":"92c9d7de","parentId":"9d75523e","timestamp":"2026-07-17T06:58:55.855Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_XQjBpi0JxfbX8pvNPFVyxu1q|fc_0a061eb498f0e908016a59d2afc858819681762851c3b4bab7","toolName":"grep","startedAt":"2026-07-17T06:58:55.855Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Finding seat capacity and presence"},"id":"dae3d8eb","parentId":"92c9d7de","timestamp":"2026-07-17T06:58:55.855Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_gaIm5nQX53QE4u2tzvWY1SYa|fc_0a061eb498f0e908016a59d2afc85c81968459c78ef4755a5c","toolName":"read","startedAt":"2026-07-17T06:58:55.855Z","args":{"path":"crates/spt-daemon/src/conn.rs"},"intent":"Reading watchdog completion loop"},"id":"7baddb77","parentId":"dae3d8eb","timestamp":"2026-07-17T06:58:55.855Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_5NCzP8UySUiZru4io5w4yrjY|fc_0a061eb498f0e908016a59d2afc8648196acd326b926ae8fb1","toolName":"grep","startedAt":"2026-07-17T06:58:55.855Z","args":{"path":"crates/spt-daemon/src/broker.rs; crates/spt-term/src"},"intent":"Finding session deletion paths"},"id":"7e8e4631","parentId":"7baddb77","timestamp":"2026-07-17T06:58:55.855Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_xmrIgZDkvT4BCCThSNMhdiQs|fc_0a061eb498f0e908016a59d2afc86c819692d7e2be7eb40c63","toolName":"grep","startedAt":"2026-07-17T06:58:55.855Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Finding stream table removal"},"id":"a8327c10","parentId":"7e8e4631","timestamp":"2026-07-17T06:58:55.855Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qUMCjE9JB4rMDcXIhdxxegEw|fc_0a061eb498f0e908016a59d2afc8708196a4526a3be71b7d84","toolName":"grep","startedAt":"2026-07-17T06:58:55.855Z","args":{"path":"CHANGELOG.md; docs; crates/spt-daemon"},"intent":"Finding version changes"},"id":"7f42c843","parentId":"a8327c10","timestamp":"2026-07-17T06:58:55.855Z"}
{"type":"message","id":"78eba58d","parentId":"7f42c843","timestamp":"2026-07-17T06:58:55.859Z","message":{"role":"toolResult","toolCallId":"call_XQjBpi0JxfbX8pvNPFVyxu1q|fc_0a061eb498f0e908016a59d2afc858819681762851c3b4bab7","toolName":"grep","content":[{"type":"text","text":" 126|/// resumes from its cursor (the existing gapless-resume contract).\n*127|const SUBSCRIBER_QUEUE_CAP: usize = 1024;\n 128|\n 129|/// Why a subscriber seat rejected a frame — the caller removes the seat on\n 130|/// either, but only a POISON (real write failure on the conn) cancels the\n...\n 189|    ) -> SubscriberSeat {\n*190|        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n 191|        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n 192|        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n 193|        let writer_sub = Arc::clone(&sub);\n...\n 508|    /// replay-then-live seq order is structural (see\n*509|    /// [`SubscriberSeat::install`]), while every conn write still happens\n 510|    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n 511|    /// under the lock with discarded write errors, the exact serial-poison\n 512|    /// engine of the v0.34 field stalls). Returns the replay frame count.\n...\n 517|    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n*518|    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n 519|        if let Some(prior) = &self.subscriber {\n 520|            // No-reinstall-until-gone applies to the POISON class only\n 521|            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n...\n 569|        let replay_len = replay.len();\n*570|        self.subscriber = Some(SubscriberSeat::install(\n 571|            sub,\n 572|            replay,\n 573|            Some(Arc::clone(&self.lease)),\n...\n 579|    /// not unsubscribe a newer brain).\n*580|    fn detach_if(&mut self, sub: &SharedSend) {\n 581|        if let Some(cur) = &self.subscriber {\n 582|            if cur.is(sub) {\n 583|                self.subscriber = None;\n...\n 595|// [impl->REQ-EP-4]\n*596|struct PresenceLog {\n 597|    next_seq: u64,\n 598|    ring: VecDeque<NetPresenceEvent>,\n 599|    cap_events: usize,\n...\n 689|    /// order structural, conn I/O outside this mutex — same discipline as\n*690|    /// [`StreamLog::begin_attach`]. Returns the replay event count.\n 691|    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n*692|    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n 693|        if let Some(prior) = &self.subscriber {\n*694|            // Poison-class only (see StreamLog::begin_attach): a healthy\n 695|            // prior presence subscriber is displaced by the newer brain.\n 696|            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n 697|                return Err(io::Error::new(\n...\n 716|        // No lease on the presence channel (it has no paired serve leg).\n*717|        self.subscriber = Some(SubscriberSeat::install(sub, replay, None));\n 718|        Ok(replay_len)\n 719|    }\n 720|\n...\n 722|    /// not unsubscribe a newer brain).\n*723|    fn detach_if(&mut self, sub: &SharedSend) {\n 724|        if let Some(cur) = &self.subscriber {\n 725|            if cur.is(sub) {\n 726|                self.subscriber = None;\n...\n 1974|        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n*1975|        log.lock().unwrap().begin_attach(Arc::clone(&sub), from_seq)?;\n 1976|        Ok(())\n 1977|    }\n 1978|\n...\n 1986|        if let Some(log) = log {\n*1987|            log.lock().unwrap().detach_if(sub);\n 1988|        }\n 1989|    }\n 1990|\n...\n 1993|    // [impl->REQ-EP-4]\n*1994|    pub(crate) fn subscribe_presence(&self, sub: SharedSend, from_seq: u64) {\n 1995|        // Same atomic install-with-replay discipline as subscribe_stream\n 1996|        // (the PresenceLog mirror): the seat's writer drains the replay\n 1997|        // before any live event, conn I/O outside the mutex. A replay write\n...\n 2005|            .unwrap()\n*2006|            .begin_attach(Arc::clone(&sub), from_seq); // busy refusal: quiet, as before\n 2007|    }\n 2008|\n 2009|    /// Detach `sub` from presence iff it is the current subscriber (brain\n 2010|    /// disconnect cleanup; the log + its ring persist).\n*2011|    pub(crate) fn detach_presence_sub(&self, sub: &SharedSend) {\n*2012|        self.shared.presence.lock().unwrap().detach_if(sub);\n 2013|    }\n 2014|\n 2015|    /// Gracefully close the endpoint: every held connection flushes its QUIC\n...\n 2563|        let mut log = StreamLog::new(7, 64);\n*2564|        assert_eq!(log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\"), 0);\n 2565|        let lease = Arc::clone(&log.lease);\n 2566|\n 2567|        // Kill the conn: the peer side drops, so the writer's next write fails.\n...\n 2589|        let (fresh, _cf, _rf) = seat_socket_pair(Duration::from_secs(5));\n*2590|        log.begin_attach(Arc::clone(&fresh), 0).expect(\"new generation attaches\");\n 2591|        assert!(\n 2592|            !log.lease.is_canceled(),\n 2593|            \"a new subscriber generation renews the serve lease\"\n...\n 2608|        let mut log = StreamLog::new(8, 64);\n*2609|        log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\");\n 2610|        let lease = Arc::clone(&log.lease);\n 2611|\n 2612|        drop(client);\n...\n 2636|    #[test]\n*2637|    fn begin_attach_refuses_only_while_a_poisoned_prior_still_drains() {\n 2638|        let (a, _ca, _ra) = seat_socket_pair(Duration::from_secs(5));\n 2639|        let (b, _cb, _rb) = seat_socket_pair(Duration::from_secs(5));\n 2640|        let mut log = StreamLog::new(3, 64);\n*2641|        log.begin_attach(Arc::clone(&a), 0).expect(\"first attach\");\n 2642|\n 2643|        // Healthy prior → displaced (the legit brain-swap path).\n*2644|        log.begin_attach(Arc::clone(&b), 0).expect(\"healthy displacement\");\n 2645|        assert!(log.subscriber.as_ref().unwrap().is(&b));\n 2646|\n 2647|        // Poisoned but NOT gone (writer still draining) → refuse WouldBlock.\n...\n 2650|        let err = log\n*2651|            .begin_attach(Arc::clone(&a), 0)\n 2652|            .expect_err(\"no reinstall until the prior seat is fully gone\");\n 2653|        assert_eq!(err.kind(), io::ErrorKind::WouldBlock);\n 2654|        assert!(err.to_string().contains(\"subscriber busy\"), \"{err}\");\n...\n 2657|        log.subscriber.as_ref().unwrap().done.store(true, Ordering::Release);\n*2658|        log.begin_attach(Arc::clone(&a), 0).expect(\"gone prior admits the replacement\");\n 2659|        assert!(log.subscriber.as_ref().unwrap().is(&a));\n 2660|    }\n 2661|\n...\n 2671|        let mut log = StreamLog::new(9, 4096);\n*2672|        log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\");\n 2673|        let lease = Arc::clone(&log.lease);\n 2674|\n 2675|        // Park the seat's writer on its first write (the gate pin — bounded\n...\n 2678|        let mut detached_at = None;\n*2679|        for i in 0..(SUBSCRIBER_QUEUE_CAP + 8) {\n 2680|            log.append(&[(i % 251) as u8]);\n 2681|            if log.subscriber.is_none() {\n 2682|                detached_at = Some(i);\n...\n 2687|        assert!(\n*2688|            at >= SUBSCRIBER_QUEUE_CAP,\n*2689|            \"no premature eviction: detached at append {at} with cap {SUBSCRIBER_QUEUE_CAP}\"\n 2690|        );\n 2691|        assert!(\n 2692|            !lease.is_canceled(),\n...\n 2698|        let replayed = log\n*2699|            .begin_attach(Arc::clone(&sub), 5)\n 2700|            .expect(\"the detached brain re-attaches after the overflow\");\n 2701|        assert_eq!(\n 2702|            replayed,\n...\n 2729|        let pin = sub.pin_gate_for_test();\n*2730|        log.begin_attach(Arc::clone(&sub), 0).expect(\"attach with a pending replay\");\n 2731|        // Live appends land while the replay is still entirely undrained.\n 2732|        for i in 6..10u8 {\n 2733|            log.append(&[i]); // live seqs 6..=9\n...\n 2765|        let mut log = StreamLog::new(11, 64);\n*2766|        log.begin_attach(Arc::clone(&a), 0).expect(\"attach A\");\n 2767|        let lease_a = Arc::clone(&log.lease);\n 2768|\n 2769|        // Queue a frame for A's writer and PARK its write (gate pinned) so\n...\n 2774|        // HEALTHY displacement: B takes the seat (the brain-swap contract).\n*2775|        log.begin_attach(Arc::clone(&b), 0).expect(\"healthy displacement\");\n 2776|        let lease_b = Arc::clone(&log.lease);\n 2777|        assert!(\n 2778|            !Arc::ptr_eq(&lease_a, &lease_b),\n...\n 2813|        log.append(\"connected\", 1, \"aa\");\n*2814|        let replayed = log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\");\n 2815|        assert_eq!(replayed, 1, \"retained events replay from the cursor\");\n 2816|\n 2817|        drop(client);\n...\n 2830|        let mut log2 = PresenceLog::new(64);\n*2831|        log2.begin_attach(Arc::clone(&a), 0).expect(\"attach\");\n 2832|        log2.subscriber\n 2833|            .as_ref()\n 2834|            .unwrap()\n...\n 2837|        let err = log2\n*2838|            .begin_attach(Arc::clone(&b), 0)\n 2839|            .expect_err(\"poisoned prior presence seat refuses reinstall\");\n 2840|        assert_eq!(err.kind(), io::ErrorKind::WouldBlock);\n 2841|        assert!(err.to_string().contains(\"subscriber busy\"), \"{err}\");"}],"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":37,"fileCount":1,"files":["crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/nethost.rs","count":37}],"truncated":false,"displayContent":"  126│/// resumes from its cursor (the existing gapless-resume contract).\n *127│const SUBSCRIBER_QUEUE_CAP: usize = 1024;\n  128│\n  129│/// Why a subscriber seat rejected a frame — the caller removes the seat on\n  130│/// either, but only a POISON (real write failure on the conn) cancels the\n     │...\n  189│    ) -> SubscriberSeat {\n *190│        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n  191│        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n  192│        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n  193│        let writer_sub = Arc::clone(&sub);\n     │...\n  508│    /// replay-then-live seq order is structural (see\n *509│    /// [`SubscriberSeat::install`]), while every conn write still happens\n  510│    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n  511│    /// under the lock with discarded write errors, the exact serial-poison\n  512│    /// engine of the v0.34 field stalls). Returns the replay frame count.\n     │...\n  517│    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n *518│    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n  519│        if let Some(prior) = &self.subscriber {\n  520│            // No-reinstall-until-gone applies to the POISON class only\n  521│            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n     │...\n  569│        let replay_len = replay.len();\n *570│        self.subscriber = Some(SubscriberSeat::install(\n  571│            sub,\n  572│            replay,\n  573│            Some(Arc::clone(&self.lease)),\n     │...\n  579│    /// not unsubscribe a newer brain).\n *580│    fn detach_if(&mut self, sub: &SharedSend) {\n  581│        if let Some(cur) = &self.subscriber {\n  582│            if cur.is(sub) {\n  583│                self.subscriber = None;\n     │...\n  595│// [impl->REQ-EP-4]\n *596│struct PresenceLog {\n  597│    next_seq: u64,\n  598│    ring: VecDeque<NetPresenceEvent>,\n  599│    cap_events: usize,\n     │...\n  689│    /// order structural, conn I/O outside this mutex — same discipline as\n *690│    /// [`StreamLog::begin_attach`]. Returns the replay event count.\n  691│    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n *692│    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n  693│        if let Some(prior) = &self.subscriber {\n *694│            // Poison-class only (see StreamLog::begin_attach): a healthy\n  695│            // prior presence subscriber is displaced by the newer brain.\n  696│            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n  697│                return Err(io::Error::new(\n     │...\n  716│        // No lease on the presence channel (it has no paired serve leg).\n *717│        self.subscriber = Some(SubscriberSeat::install(sub, replay, None));\n  718│        Ok(replay_len)\n  719│    }\n  720│\n     │...\n  722│    /// not unsubscribe a newer brain).\n *723│    fn detach_if(&mut self, sub: &SharedSend) {\n  724│        if let Some(cur) = &self.subscriber {\n  725│            if cur.is(sub) {\n  726│                self.subscriber = None;\n     │...\n 1974│        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n*1975│        log.lock().unwrap().begin_attach(Arc::clone(&sub), from_seq)?;\n 1976│        Ok(())\n 1977│    }\n 1978│\n     │...\n 1986│        if let Some(log) = log {\n*1987│            log.lock().unwrap().detach_if(sub);\n 1988│        }\n 1989│    }\n 1990│\n     │...\n 1993│    // [impl->REQ-EP-4]\n*1994│    pub(crate) fn subscribe_presence(&self, sub: SharedSend, from_seq: u64) {\n 1995│        // Same atomic install-with-replay discipline as subscribe_stream\n 1996│        // (the PresenceLog mirror): the seat's writer drains the replay\n 1997│        // before any live event, conn I/O outside the mutex. A replay write\n     │...\n 2005│            .unwrap()\n*2006│            .begin_attach(Arc::clone(&sub), from_seq); // busy refusal: quiet, as before\n 2007│    }\n 2008│\n 2009│    /// Detach `sub` from presence iff it is the current subscriber (brain\n 2010│    /// disconnect cleanup; the log + its ring persist).\n*2011│    pub(crate) fn detach_presence_sub(&self, sub: &SharedSend) {\n*2012│        self.shared.presence.lock().unwrap().detach_if(sub);\n 2013│    }\n 2014│\n 2015│    /// Gracefully close the endpoint: every held connection flushes its QUIC\n     │...\n 2563│        let mut log = StreamLog::new(7, 64);\n*2564│        assert_eq!(log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\"), 0);\n 2565│        let lease = Arc::clone(&log.lease);\n 2566│\n 2567│        // Kill the conn: the peer side drops, so the writer's next write fails.\n     │...\n 2589│        let (fresh, _cf, _rf) = seat_socket_pair(Duration::from_secs(5));\n*2590│        log.begin_attach(Arc::clone(&fresh), 0).expect(\"new generation attaches\");\n 2591│        assert!(\n 2592│            !log.lease.is_canceled(),\n 2593│            \"a new subscriber generation renews the serve lease\"\n     │...\n 2608│        let mut log = StreamLog::new(8, 64);\n*2609│        log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\");\n 2610│        let lease = Arc::clone(&log.lease);\n 2611│\n 2612│        drop(client);\n     │...\n 2636│    #[test]\n*2637│    fn begin_attach_refuses_only_while_a_poisoned_prior_still_drains() {\n 2638│        let (a, _ca, _ra) = seat_socket_pair(Duration::from_secs(5));\n 2639│        let (b, _cb, _rb) = seat_socket_pair(Duration::from_secs(5));\n 2640│        let mut log = StreamLog::new(3, 64);\n*2641│        log.begin_attach(Arc::clone(&a), 0).expect(\"first attach\");\n 2642│\n 2643│        // Healthy prior → displaced (the legit brain-swap path).\n*2644│        log.begin_attach(Arc::clone(&b), 0).expect(\"healthy displacement\");\n 2645│        assert!(log.subscriber.as_ref().unwrap().is(&b));\n 2646│\n 2647│        // Poisoned but NOT gone (writer still draining) → refuse WouldBlock.\n     │...\n 2650│        let err = log\n*2651│            .begin_attach(Arc::clone(&a), 0)\n 2652│            .expect_err(\"no reinstall until the prior seat is fully gone\");\n 2653│        assert_eq!(err.kind(), io::ErrorKind::WouldBlock);\n 2654│        assert!(err.to_string().contains(\"subscriber busy\"), \"{err}\");\n     │...\n 2657│        log.subscriber.as_ref().unwrap().done.store(true, Ordering::Release);\n*2658│        log.begin_attach(Arc::clone(&a), 0).expect(\"gone prior admits the replacement\");\n 2659│        assert!(log.subscriber.as_ref().unwrap().is(&a));\n 2660│    }\n 2661│\n     │...\n 2671│        let mut log = StreamLog::new(9, 4096);\n*2672│        log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\");\n 2673│        let lease = Arc::clone(&log.lease);\n 2674│\n 2675│        // Park the seat's writer on its first write (the gate pin — bounded\n     │...\n 2678│        let mut detached_at = None;\n*2679│        for i in 0..(SUBSCRIBER_QUEUE_CAP + 8) {\n 2680│            log.append(&[(i % 251) as u8]);\n 2681│            if log.subscriber.is_none() {\n 2682│                detached_at = Some(i);\n     │...\n 2687│        assert!(\n*2688│            at >= SUBSCRIBER_QUEUE_CAP,\n*2689│            \"no premature eviction: detached at append {at} with cap {SUBSCRIBER_QUEUE_CAP}\"\n 2690│        );\n 2691│        assert!(\n 2692│            !lease.is_canceled(),\n     │...\n 2698│        let replayed = log\n*2699│            .begin_attach(Arc::clone(&sub), 5)\n 2700│            .expect(\"the detached brain re-attaches after the overflow\");\n 2701│        assert_eq!(\n 2702│            replayed,\n     │...\n 2729│        let pin = sub.pin_gate_for_test();\n*2730│        log.begin_attach(Arc::clone(&sub), 0).expect(\"attach with a pending replay\");\n 2731│        // Live appends land while the replay is still entirely undrained.\n 2732│        for i in 6..10u8 {\n 2733│            log.append(&[i]); // live seqs 6..=9\n     │...\n 2765│        let mut log = StreamLog::new(11, 64);\n*2766│        log.begin_attach(Arc::clone(&a), 0).expect(\"attach A\");\n 2767│        let lease_a = Arc::clone(&log.lease);\n 2768│\n 2769│        // Queue a frame for A's writer and PARK its write (gate pinned) so\n     │...\n 2774│        // HEALTHY displacement: B takes the seat (the brain-swap contract).\n*2775│        log.begin_attach(Arc::clone(&b), 0).expect(\"healthy displacement\");\n 2776│        let lease_b = Arc::clone(&log.lease);\n 2777│        assert!(\n 2778│            !Arc::ptr_eq(&lease_a, &lease_b),\n     │...\n 2813│        log.append(\"connected\", 1, \"aa\");\n*2814│        let replayed = log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\");\n 2815│        assert_eq!(replayed, 1, \"retained events replay from the cursor\");\n 2816│\n 2817│        drop(client);\n     │...\n 2830│        let mut log2 = PresenceLog::new(64);\n*2831│        log2.begin_attach(Arc::clone(&a), 0).expect(\"attach\");\n 2832│        log2.subscriber\n 2833│            .as_ref()\n 2834│            .unwrap()\n     │...\n 2837│        let err = log2\n*2838│            .begin_attach(Arc::clone(&b), 0)\n 2839│            .expect_err(\"poisoned prior presence seat refuses reinstall\");\n 2840│        assert_eq!(err.kind(), io::ErrorKind::WouldBlock);\n 2841│        assert!(err.to_string().contains(\"subscriber busy\"), \"{err}\");"},"isError":false,"timestamp":1784271535859}}
{"type":"message","id":"4d4caf4c","parentId":"78eba58d","timestamp":"2026-07-17T06:58:55.861Z","message":{"role":"toolResult","toolCallId":"call_xmrIgZDkvT4BCCThSNMhdiQs|fc_0a061eb498f0e908016a59d2afc86c819692d7e2be7eb40c63","toolName":"grep","content":[{"type":"text","text":" 955|        conn_close.closed().await;\n*956|        sh_close.conns.lock().unwrap().remove(&id);\n 957|        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n 958|        // — nothing can ever be served on them again, and leaving them makes\n 959|        // every future dispatcher generation replay them (the control-steal\n...\n 963|        sh_close\n*964|            .streams\n 965|            .lock()\n 966|            .unwrap()\n*967|            .retain(|_, e| e.conn_id != id);\n 968|        sh_close\n 969|            .presence\n 970|            .lock()\n...\n 1010|    let room = Arc::new(tokio::sync::Notify::new());\n*1011|    shared.streams.lock().unwrap().insert(\n 1012|        id,\n 1013|        Arc::new(StreamEntry {\n 1014|            conn_id,\n...\n 1744|        self.shared\n*1745|            .streams\n 1746|            .lock()\n 1747|            .unwrap()\n 1748|            .get(&stream_id)\n...\n 1756|        let entry = {\n*1757|            let streams = self.shared.streams.lock().unwrap();\n 1758|            Arc::clone(streams.get(&stream_id).ok_or_else(|| {\n 1759|                io::Error::new(\n 1760|                    io::ErrorKind::NotFound,\n...\n 1794|    pub fn stream_lease(&self, stream_id: u64) -> Option<Arc<StreamLease>> {\n*1795|        let streams = self.shared.streams.lock().unwrap();\n 1796|        streams\n 1797|            .get(&stream_id)\n 1798|            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\n...\n 1805|    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n*1806|        let streams = self.shared.streams.lock().unwrap();\n 1807|        streams\n 1808|            .iter()\n 1809|            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n...\n 1838|            .shared\n*1839|            .streams\n 1840|            .lock()\n 1841|            .unwrap()\n 1842|            .get(&stream_id)\n...\n 1863|    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n*1864|        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n 1865|        // A retired row answers no-such-stream: classification exists only to\n 1866|        // serve, and a retired exchange must never be served again.\n 1867|        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n...\n 1880|    pub fn mark_stream_retentive(&self, stream_id: u64, cap: usize) {\n*1881|        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n 1882|            e.log.lock().unwrap().set_retentive(cap);\n 1883|        }\n 1884|    }\n...\n 1892|    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n*1893|        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n 1894|        let drained = entry.log.lock().unwrap().drain();\n 1895|        // The drain freed ring room — wake a pump that was backpressure-parked.\n 1896|        entry.room.notify_one();\n...\n 1904|        self.shared\n*1905|            .streams\n 1906|            .lock()\n 1907|            .unwrap()\n 1908|            .get(&stream_id)\n...\n 1916|        self.shared\n*1917|            .streams\n 1918|            .lock()\n 1919|            .unwrap()\n 1920|            .iter()"}],"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":14,"fileCount":1,"files":["crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/nethost.rs","count":14}],"truncated":false,"displayContent":"  955│        conn_close.closed().await;\n *956│        sh_close.conns.lock().unwrap().remove(&id);\n  957│        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n  958│        // — nothing can ever be served on them again, and leaving them makes\n  959│        // every future dispatcher generation replay them (the control-steal\n     │...\n  963│        sh_close\n *964│            .streams\n  965│            .lock()\n  966│            .unwrap()\n *967│            .retain(|_, e| e.conn_id != id);\n  968│        sh_close\n  969│            .presence\n  970│            .lock()\n     │...\n 1010│    let room = Arc::new(tokio::sync::Notify::new());\n*1011│    shared.streams.lock().unwrap().insert(\n 1012│        id,\n 1013│        Arc::new(StreamEntry {\n 1014│            conn_id,\n     │...\n 1744│        self.shared\n*1745│            .streams\n 1746│            .lock()\n 1747│            .unwrap()\n 1748│            .get(&stream_id)\n     │...\n 1756│        let entry = {\n*1757│            let streams = self.shared.streams.lock().unwrap();\n 1758│            Arc::clone(streams.get(&stream_id).ok_or_else(|| {\n 1759│                io::Error::new(\n 1760│                    io::ErrorKind::NotFound,\n     │...\n 1794│    pub fn stream_lease(&self, stream_id: u64) -> Option<Arc<StreamLease>> {\n*1795│        let streams = self.shared.streams.lock().unwrap();\n 1796│        streams\n 1797│            .get(&stream_id)\n 1798│            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\n     │...\n 1805│    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n*1806│        let streams = self.shared.streams.lock().unwrap();\n 1807│        streams\n 1808│            .iter()\n 1809│            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n     │...\n 1838│            .shared\n*1839│            .streams\n 1840│            .lock()\n 1841│            .unwrap()\n 1842│            .get(&stream_id)\n     │...\n 1863│    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n*1864│        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n 1865│        // A retired row answers no-such-stream: classification exists only to\n 1866│        // serve, and a retired exchange must never be served again.\n 1867│        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n     │...\n 1880│    pub fn mark_stream_retentive(&self, stream_id: u64, cap: usize) {\n*1881│        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n 1882│            e.log.lock().unwrap().set_retentive(cap);\n 1883│        }\n 1884│    }\n     │...\n 1892│    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n*1893│        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n 1894│        let drained = entry.log.lock().unwrap().drain();\n 1895│        // The drain freed ring room — wake a pump that was backpressure-parked.\n 1896│        entry.room.notify_one();\n     │...\n 1904│        self.shared\n*1905│            .streams\n 1906│            .lock()\n 1907│            .unwrap()\n 1908│            .get(&stream_id)\n     │...\n 1916│        self.shared\n*1917│            .streams\n 1918│            .lock()\n 1919│            .unwrap()\n 1920│            .iter()"},"isError":false,"timestamp":1784271535861}}
{"type":"message","id":"36d9f1fb","parentId":"4d4caf4c","timestamp":"2026-07-17T06:58:55.868Z","message":{"role":"toolResult","toolCallId":"call_gaIm5nQX53QE4u2tzvWY1SYa|fc_0a061eb498f0e908016a59d2afc85c81968459c78ef4755a5c","toolName":"read","content":[{"type":"text","text":"impl Inner {\n…\n    fn sever(&self) {\n…\n        #[cfg(windows)]\n        // SAFETY: as in poison_and_cancel — handle outlives the watchdog.\n        unsafe {\n            let _ = win::DisconnectNamedPipe(self.raw);\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n    }\n\n    /// The watchdog body: park until a write is in flight, then sleep to its\n    /// absolute deadline. If the op is still in flight at the deadline,\n    /// poison + cancel, re-canceling periodically until the op reports\n    /// completion (the writer clears `inflight` the instant `write_frame`\n    /// returns — that return IS the buffer-release handshake), then sever.\n    fn watchdog(&self) {\n        let mut d = recover(&self.dog);\n        loop {\n            // Park until armed (or shutdown).\n            let (op, deadline) = loop {\n                if d.shutdown {\n                    return;\n                }\n                if let Some(armed) = d.inflight {\n                    break armed;\n                }\n                d = self\n                    .dog_cv\n                    .wait(d)\n                    .unwrap_or_else(|p| p.into_inner());\n            };\n            // Sleep toward the deadline while THIS op stays in flight.\n            let fired = loop {\n                if d.shutdown {\n                    return;\n                }\n                match d.inflight {\n                    Some((cur, _)) if cur == op => {}\n                    // Completed (or a newer op armed) before the deadline.\n                    _ => break false,\n                }\n                let now = Instant::now();\n                if now >= deadline {\n                    break true;\n                }\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, deadline - now)\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n            };\n            if !fired {\n                continue;\n            }\n            // Deadline: abort out of band, then wait for the canceled op to\n            // report completion before severing (re-cancel each slice — a\n            // cancel that raced the WriteFileEx issuance reaches nothing, so\n            // one shot is not enough). Latch timed_out FIRST so the aborted\n            // writer observes its failure as a DEADLINE retirement (wedge),\n            // not an organic conn death.\n            drop(d);\n            self.timed_out.store(true, Ordering::Release);\n            self.poison_and_cancel(None);\n            d = recover(&self.dog);\n            while matches!(d.inflight, Some((cur, _)) if cur == op) && !d.shutdown {\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, Duration::from_millis(100))\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n                drop(d);\n                self.poison_and_cancel(None);\n                d = recover(&self.dog);\n            }\n            if d.shutdown {\n                return;\n            }\n            drop(d);\n            self.sever();\n            d = recover(&self.dog);\n        }\n    }\n}\n\n/// The shared, serialized, BOUNDED send side of one physical broker\n/// connection — what [`crate::broker::SharedSend`] now aliases. Owns the\n/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n…\n}\n…\nimpl BrokerConn {\n…\n    pub(crate) fn describe(&self, fact: &str) {\n…\n        if l.ends_with('…') {\n            return;\n        }\n        if l.len() + fact.len() + 1 > LABEL_CAP {\n            l.push('…');\n            return;\n        }\n        if !l.is_empty() {\n            l.push(' ');\n        }\n        l.push_str(fact);\n    }\n\n    /// Emit a bounded per-conn lifecycle record through this conn's shared\n    /// attribution format — the broker's sink machinery uses it for\n    /// `writer-exit`, attach/replace, and detach events (leg d).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn lifecycle_event(&self, event: &str, extra: &str) {\n        self.inner.lifecycle(event, extra);\n    }\n\n    /// Bounded framed write. See [`Self::write_gated`].\n    pub(crate) fn write(&self, env: &Envelope) -> io::Result<ConnWrite> {\n        self.write_gated(env, || true)\n    }\n\n    /// Bounded framed write with a pre-write gate closure, run AFTER the\n    /// serialized gate is acquired and BEFORE any byte is written — the same\n    /// serialization point the old epoch-check-under-`send.lock()` had, so a\n    /// superseded controller writer still bails atomically with respect to\n    /// its successor's writes (P1c, REQ-HAZARD-CONTROLLER-WRITER-REORDER).\n    /// `pre` returning false → `Ok(ConnWrite::Superseded)`, nothing written.\n    pub(crate) fn write_gated(\n        &self,\n        env: &Envelope,\n        pre: impl FnOnce() -> bool,\n    ) -> io::Result<ConnWrite> {\n        let inner = &*self.inner;\n        let deadline = Instant::now() + inner.bound;\n\n        // ── Acquire the gate, bounded by the SAME absolute deadline. ──\n        let mut g = recover(&inner.gate);\n        loop {\n            if inner.poisoned.load(Ordering::Acquire) {\n                return Err(poisoned_err());\n            }\n            if g.half.is_some() {\n                break;\n            }\n            let now = Instant::now();\n            if now >= deadline {\n                // The write we queued behind is stuck past OUR whole bound:\n                // that op is the wedge. Abort it out of band and fail — the\n                // watchdog's own deadline (armed at that op's entry) is also\n                // in flight; both paths converge on the same idempotent\n                // poison/cancel.\n                drop(g);\n                inner.timed_out.store(true, Ordering::Release);\n                inner.poison_and_cancel(None);\n                return Err(timeout_err());\n            }\n            let (g2, _) = inner\n                .gate_cv\n                .wait_timeout(g, deadline - now)\n                .unwrap_or_else(|p| p.into_inner());\n            g = g2;\n        }\n\n        if !pre() {\n            return Ok(ConnWrite::Superseded);\n        }\n\n        // Once-per-conn `write-start` lifecycle record (leg d): marks the conn's\n        // first committed write, so a conn that later retires can be correlated\n        // to when it went active (fresh-carrier churn shows as open→start→retire\n        // triplets with fresh ids).\n        if !inner.first_write_logged.swap(true, Ordering::AcqRel) {\n            inner.lifecycle(\"write-start\", \"\");\n        }\n\n        // ── Check out the half + arm the watchdog, then write OUT of locks. ──\n        let mut half = g.half.take().expect(\"gate half present at checkout\");\n        let op = inner.op_seq.fetch_add(1, Ordering::Relaxed) + 1;\n        {\n            let mut d = recover(&inner.dog);\n            d.inflight = Some((op, deadline));\n            inner.dog_cv.notify_all();\n        }\n        drop(g);\n\n        let res = write_frame(&mut half, env);\n\n        // Completion handshake: `write_frame` has returned, so the OS op —\n        // canceled or not — reported completion and the frame buffer is\n        // released. Clear the arm BEFORE deciding health, so the watchdog\n        // never severs while the op is formally in flight.\n        {\n            let mut d = recover(&inner.dog);\n            d.inflight = None;\n            inner.dog_cv.notify_all();\n        }\n\n        let mut g = recover(&inner.gate);\n        if res.is_ok() && !inner.poisoned.load(Ordering::Acquire) {\n            g.half = Some(half);\n            drop(g);\n            inner.gate_cv.notify_all();\n            return Ok(ConnWrite::Done);\n        }\n\n        // ── Retire: poison the whole conn, abort the read side so\n        // `handle_conn` reaches EOF cleanup, sever, and park the half in the\n        // graveyard (its handle must outlive any late raw abort; never\n        // re-gated, never reused — a timed-out length-prefixed frame may be\n        // partially written). ──\n        drop(g);\n        inner.poison_and_cancel(res.as_ref().err());\n        inner.sever();\n        *recover(&inner.graveyard) = Some(half);\n        inner.gate_cv.notify_all();\n        // A DEADLINE retirement (the watchdog aborted OUR op, or the conn was\n        // already deadline-poisoned) surfaces as TimedOut — the caller can\n        // count the wedge (W2 stall-evict tally). An organic I/O failure\n        // (peer death) keeps its own error.\n        if inner.timed_out.load(Ordering::Acquire) {\n            return Err(timeout_err());\n        }\n        Err(match res {\n            Err(e) => e,\n            Ok(()) => poisoned_err(),\n        })\n    }\n}\n\n/// TEST-ONLY determinism lever: holds the serialized write gate (the half is\n/// checked out) so every writer parks AT THE GATE until the pin drops — the\n/// round-4 analog of pinning the old `Mutex<SendHalf>` across a registration\n/// window (the P1c epoch-gate keystone unit relies on it).\n#[cfg(test)]\npub(crate) struct TestGatePin {\n    inner: Arc<Inner>,\n    half: Option<SendHalf>,\n}\n\n#[cfg(test)]\nimpl Drop for TestGatePin {\n    fn drop(&mut self) {\n        let mut g = recover(&self.inner.gate);\n        g.half = self.half.take();\n        drop(g);\n        self.inner.gate_cv.notify_all();\n    }\n}\n\n#[cfg(test)]\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n…\n    }\n}"}],"details":{"displayContent":{"text":"impl Inner {\n…\n    fn sever(&self) {\n…\n        #[cfg(windows)]\n        // SAFETY: as in poison_and_cancel — handle outlives the watchdog.\n        unsafe {\n            let _ = win::DisconnectNamedPipe(self.raw);\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n    }\n\n    /// The watchdog body: park until a write is in flight, then sleep to its\n    /// absolute deadline. If the op is still in flight at the deadline,\n    /// poison + cancel, re-canceling periodically until the op reports\n    /// completion (the writer clears `inflight` the instant `write_frame`\n    /// returns — that return IS the buffer-release handshake), then sever.\n    fn watchdog(&self) {\n        let mut d = recover(&self.dog);\n        loop {\n            // Park until armed (or shutdown).\n            let (op, deadline) = loop {\n                if d.shutdown {\n                    return;\n                }\n                if let Some(armed) = d.inflight {\n                    break armed;\n                }\n                d = self\n                    .dog_cv\n                    .wait(d)\n                    .unwrap_or_else(|p| p.into_inner());\n            };\n            // Sleep toward the deadline while THIS op stays in flight.\n            let fired = loop {\n                if d.shutdown {\n                    return;\n                }\n                match d.inflight {\n                    Some((cur, _)) if cur == op => {}\n                    // Completed (or a newer op armed) before the deadline.\n                    _ => break false,\n                }\n                let now = Instant::now();\n                if now >= deadline {\n                    break true;\n                }\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, deadline - now)\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n            };\n            if !fired {\n                continue;\n            }\n            // Deadline: abort out of band, then wait for the canceled op to\n            // report completion before severing (re-cancel each slice — a\n            // cancel that raced the WriteFileEx issuance reaches nothing, so\n            // one shot is not enough). Latch timed_out FIRST so the aborted\n            // writer observes its failure as a DEADLINE retirement (wedge),\n            // not an organic conn death.\n            drop(d);\n            self.timed_out.store(true, Ordering::Release);\n            self.poison_and_cancel(None);\n            d = recover(&self.dog);\n            while matches!(d.inflight, Some((cur, _)) if cur == op) && !d.shutdown {\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, Duration::from_millis(100))\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n                drop(d);\n                self.poison_and_cancel(None);\n                d = recover(&self.dog);\n            }\n            if d.shutdown {\n                return;\n            }\n            drop(d);\n            self.sever();\n            d = recover(&self.dog);\n        }\n    }\n}\n\n/// The shared, serialized, BOUNDED send side of one physical broker\n/// connection — what [`crate::broker::SharedSend`] now aliases. Owns the\n/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n…\n}\n…\nimpl BrokerConn {\n…\n    pub(crate) fn describe(&self, fact: &str) {\n…\n        if l.ends_with('…') {\n            return;\n        }\n        if l.len() + fact.len() + 1 > LABEL_CAP {\n            l.push('…');\n            return;\n        }\n        if !l.is_empty() {\n            l.push(' ');\n        }\n        l.push_str(fact);\n    }\n\n    /// Emit a bounded per-conn lifecycle record through this conn's shared\n    /// attribution format — the broker's sink machinery uses it for\n    /// `writer-exit`, attach/replace, and detach events (leg d).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn lifecycle_event(&self, event: &str, extra: &str) {\n        self.inner.lifecycle(event, extra);\n    }\n\n    /// Bounded framed write. See [`Self::write_gated`].\n    pub(crate) fn write(&self, env: &Envelope) -> io::Result<ConnWrite> {\n        self.write_gated(env, || true)\n    }\n\n    /// Bounded framed write with a pre-write gate closure, run AFTER the\n    /// serialized gate is acquired and BEFORE any byte is written — the same\n    /// serialization point the old epoch-check-under-`send.lock()` had, so a\n    /// superseded controller writer still bails atomically with respect to\n    /// its successor's writes (P1c, REQ-HAZARD-CONTROLLER-WRITER-REORDER).\n    /// `pre` returning false → `Ok(ConnWrite::Superseded)`, nothing written.\n    pub(crate) fn write_gated(\n        &self,\n        env: &Envelope,\n        pre: impl FnOnce() -> bool,\n    ) -> io::Result<ConnWrite> {\n        let inner = &*self.inner;\n        let deadline = Instant::now() + inner.bound;\n\n        // ── Acquire the gate, bounded by the SAME absolute deadline. ──\n        let mut g = recover(&inner.gate);\n        loop {\n            if inner.poisoned.load(Ordering::Acquire) {\n                return Err(poisoned_err());\n            }\n            if g.half.is_some() {\n                break;\n            }\n            let now = Instant::now();\n            if now >= deadline {\n                // The write we queued behind is stuck past OUR whole bound:\n                // that op is the wedge. Abort it out of band and fail — the\n                // watchdog's own deadline (armed at that op's entry) is also\n                // in flight; both paths converge on the same idempotent\n                // poison/cancel.\n                drop(g);\n                inner.timed_out.store(true, Ordering::Release);\n                inner.poison_and_cancel(None);\n                return Err(timeout_err());\n            }\n            let (g2, _) = inner\n                .gate_cv\n                .wait_timeout(g, deadline - now)\n                .unwrap_or_else(|p| p.into_inner());\n            g = g2;\n        }\n\n        if !pre() {\n            return Ok(ConnWrite::Superseded);\n        }\n\n        // Once-per-conn `write-start` lifecycle record (leg d): marks the conn's\n        // first committed write, so a conn that later retires can be correlated\n        // to when it went active (fresh-carrier churn shows as open→start→retire\n        // triplets with fresh ids).\n        if !inner.first_write_logged.swap(true, Ordering::AcqRel) {\n            inner.lifecycle(\"write-start\", \"\");\n        }\n\n        // ── Check out the half + arm the watchdog, then write OUT of locks. ──\n        let mut half = g.half.take().expect(\"gate half present at checkout\");\n        let op = inner.op_seq.fetch_add(1, Ordering::Relaxed) + 1;\n        {\n            let mut d = recover(&inner.dog);\n            d.inflight = Some((op, deadline));\n            inner.dog_cv.notify_all();\n        }\n        drop(g);\n\n        let res = write_frame(&mut half, env);\n\n        // Completion handshake: `write_frame` has returned, so the OS op —\n        // canceled or not — reported completion and the frame buffer is\n        // released. Clear the arm BEFORE deciding health, so the watchdog\n        // never severs while the op is formally in flight.\n        {\n            let mut d = recover(&inner.dog);\n            d.inflight = None;\n            inner.dog_cv.notify_all();\n        }\n\n        let mut g = recover(&inner.gate);\n        if res.is_ok() && !inner.poisoned.load(Ordering::Acquire) {\n            g.half = Some(half);\n            drop(g);\n            inner.gate_cv.notify_all();\n            return Ok(ConnWrite::Done);\n        }\n\n        // ── Retire: poison the whole conn, abort the read side so\n        // `handle_conn` reaches EOF cleanup, sever, and park the half in the\n        // graveyard (its handle must outlive any late raw abort; never\n        // re-gated, never reused — a timed-out length-prefixed frame may be\n        // partially written). ──\n        drop(g);\n        inner.poison_and_cancel(res.as_ref().err());\n        inner.sever();\n        *recover(&inner.graveyard) = Some(half);\n        inner.gate_cv.notify_all();\n        // A DEADLINE retirement (the watchdog aborted OUR op, or the conn was\n        // already deadline-poisoned) surfaces as TimedOut — the caller can\n        // count the wedge (W2 stall-evict tally). An organic I/O failure\n        // (peer death) keeps its own error.\n        if inner.timed_out.load(Ordering::Acquire) {\n            return Err(timeout_err());\n        }\n        Err(match res {\n            Err(e) => e,\n            Ok(()) => poisoned_err(),\n        })\n    }\n}\n\n/// TEST-ONLY determinism lever: holds the serialized write gate (the half is\n/// checked out) so every writer parks AT THE GATE until the pin drops — the\n/// round-4 analog of pinning the old `Mutex<SendHalf>` across a registration\n/// window (the P1c epoch-gate keystone unit relies on it).\n#[cfg(test)]\npub(crate) struct TestGatePin {\n    inner: Arc<Inner>,\n    half: Option<SendHalf>,\n}\n\n#[cfg(test)]\nimpl Drop for TestGatePin {\n    fn drop(&mut self) {\n        let mut g = recover(&self.inner.gate);\n        g.half = self.half.take();\n        drop(g);\n        self.inner.gate_cv.notify_all();\n    }\n}\n\n#[cfg(test)]\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n…\n    }\n}","startLine":219,"lineNumbers":[219,null,326,null,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,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,null,420,null,422,null,468,null,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,null,662,663]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\conn.rs"}}},"isError":false,"timestamp":1784271535868}}
{"type":"message","id":"66977101","parentId":"36d9f1fb","timestamp":"2026-07-17T06:58:55.870Z","message":{"role":"toolResult","toolCallId":"call_5NCzP8UySUiZru4io5w4yrjY|fc_0a061eb498f0e908016a59d2afc8648196acd326b926ae8fb1","toolName":"grep","content":[{"type":"text","text":"# crates/\n\n## spt-daemon/src/\n### broker.rs\n 3085|                KIND_KILL => {\n*3086|                    if let Err(msg) = self.dispatch_kill(env) {\n 3087|                        send_error(&send, &msg);\n 3088|                    }\n 3089|                }\n...\n 3460|            // Reap the dead session from the table.\n*3461|            recover(&sessions_exit).remove(&id);\n 3462|        });\n 3463|\n 3464|        // Layer C: if the spawn carried a translation binary, bring it up with the\n...\n 4456|    /// reaps the session once the child is dead.\n*4457|    fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {\n 4458|        let req: KillReq =\n 4459|            serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;\n 4460|        let sessions = recover(&self.sessions);\n...\n 4463|            .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n*4464|        h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))\n 4465|    }\n 4466|\n 4467|    /// W3d (ADR-0025): apply a live adapter update to every session running\n...\n 4791|            drop(tx);\n*4792|            writer.join().expect(\"evicted writer joins\");\n 4793|\n 4794|            let mut client = client;\n 4795|            let env = read_frame(&mut client).expect(\"an evicted close writes a final frame\");\n...\n 4816|            drop(tx);\n*4817|            writer.join().expect(\"normal writer joins\");\n 4818|            // Drop the broker's send-half clone so the client read sees EOF (otherwise\n 4819|            // the half stays open and the blocking read would hang).\n 4820|            drop(send);\n...\n 5196|        })\n*5197|        .join();\n 5198|        assert!(floor.is_poisoned(), \"precondition: the floor mutex is poisoned\");\n 5199|        // The fix: the recovered guard is fully usable — open() takes, is_held reads.\n 5200|        lock_floor(&floor).open();\n...\n 5223|        })\n*5224|        .join();\n 5225|        assert!(sessions.is_poisoned(), \"precondition: the sessions mutex is poisoned\");\n 5226|        // The fix: the recovered guard is fully usable — the prior row survives and a\n 5227|        // NEW attach can still insert/look up (no permanent wedge).\n...\n 5281|        })\n*5282|        .join();\n 5283|        assert!(log.is_poisoned(), \"precondition: the log mutex is poisoned\");\n 5284|        let g = recover_log(&log);\n 5285|        assert!(g.ring.is_empty(), \"recover_log clamps the torn ring to empty on recovery\");\n\n## spt-term/src/\n### reader.rs\n 88|    /// down — the no-EOF-while-writer-held discipline).\n*89|    pub fn request_stop(&self) {\n 90|        self.stop.store(true, Ordering::Relaxed);\n 91|    }\n 92|\n...\n 97|        if let Some(h) = self.handle.take() {\n*98|            let _ = h.join();\n 99|        }\n 100|    }\n 101|}\n...\n 250|        });\n*251|        drain.join(); // ScriptedReader EOFs, so this returns\n 252|\n 253|        assert_eq!(\n 254|            &*written.lock().unwrap(),\n...\n 281|        let answered = drain.dsr_answered();\n*282|        drain.join();\n 283|        assert_eq!(answered, 0, \"no DSR query → no CPR answer\");\n 284|        assert!(written.lock().unwrap().is_empty(), \"nothing written back\");\n 285|    }\n### stream.rs\n 55|\n*56|    /// Ask the pump to stop (cooperative — see [`Drain::request_stop`]).\n*57|    pub fn request_stop(&self) {\n*58|        self.drain.request_stop();\n 59|    }\n 60|}\n 61|"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs, crates/spt-term/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":16,"fileCount":3,"files":["crates/spt-daemon/src/broker.rs","crates/spt-term/src/reader.rs","crates/spt-term/src/stream.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":9},{"path":"crates/spt-term/src/reader.rs","count":4},{"path":"crates/spt-term/src/stream.rs","count":3}],"truncated":false,"displayContent":"# crates/\n\n## spt-daemon/src/\n### broker.rs\n 3085│                KIND_KILL => {\n*3086│                    if let Err(msg) = self.dispatch_kill(env) {\n 3087│                        send_error(&send, &msg);\n 3088│                    }\n 3089│                }\n     │...\n 3460│            // Reap the dead session from the table.\n*3461│            recover(&sessions_exit).remove(&id);\n 3462│        });\n 3463│\n 3464│        // Layer C: if the spawn carried a translation binary, bring it up with the\n     │...\n 4456│    /// reaps the session once the child is dead.\n*4457│    fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {\n 4458│        let req: KillReq =\n 4459│            serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;\n 4460│        let sessions = recover(&self.sessions);\n     │...\n 4463│            .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n*4464│        h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))\n 4465│    }\n 4466│\n 4467│    /// W3d (ADR-0025): apply a live adapter update to every session running\n     │...\n 4791│            drop(tx);\n*4792│            writer.join().expect(\"evicted writer joins\");\n 4793│\n 4794│            let mut client = client;\n 4795│            let env = read_frame(&mut client).expect(\"an evicted close writes a final frame\");\n     │...\n 4816│            drop(tx);\n*4817│            writer.join().expect(\"normal writer joins\");\n 4818│            // Drop the broker's send-half clone so the client read sees EOF (otherwise\n 4819│            // the half stays open and the blocking read would hang).\n 4820│            drop(send);\n     │...\n 5196│        })\n*5197│        .join();\n 5198│        assert!(floor.is_poisoned(), \"precondition: the floor mutex is poisoned\");\n 5199│        // The fix: the recovered guard is fully usable — open() takes, is_held reads.\n 5200│        lock_floor(&floor).open();\n     │...\n 5223│        })\n*5224│        .join();\n 5225│        assert!(sessions.is_poisoned(), \"precondition: the sessions mutex is poisoned\");\n 5226│        // The fix: the recovered guard is fully usable — the prior row survives and a\n 5227│        // NEW attach can still insert/look up (no permanent wedge).\n     │...\n 5281│        })\n*5282│        .join();\n 5283│        assert!(log.is_poisoned(), \"precondition: the log mutex is poisoned\");\n 5284│        let g = recover_log(&log);\n 5285│        assert!(g.ring.is_empty(), \"recover_log clamps the torn ring to empty on recovery\");\n\n## spt-term/src/\n### reader.rs\n  88│    /// down — the no-EOF-while-writer-held discipline).\n *89│    pub fn request_stop(&self) {\n  90│        self.stop.store(true, Ordering::Relaxed);\n  91│    }\n  92│\n    │...\n  97│        if let Some(h) = self.handle.take() {\n *98│            let _ = h.join();\n  99│        }\n 100│    }\n 101│}\n    │...\n 250│        });\n*251│        drain.join(); // ScriptedReader EOFs, so this returns\n 252│\n 253│        assert_eq!(\n 254│            &*written.lock().unwrap(),\n    │...\n 281│        let answered = drain.dsr_answered();\n*282│        drain.join();\n 283│        assert_eq!(answered, 0, \"no DSR query → no CPR answer\");\n 284│        assert!(written.lock().unwrap().is_empty(), \"nothing written back\");\n 285│    }\n### stream.rs\n 55│\n*56│    /// Ask the pump to stop (cooperative — see [`Drain::request_stop`]).\n*57│    pub fn request_stop(&self) {\n*58│        self.drain.request_stop();\n 59│    }\n 60│}\n 61│"},"isError":false,"timestamp":1784271535870}}
{"type":"message","id":"7573a6d5","parentId":"66977101","timestamp":"2026-07-17T06:58:55.877Z","message":{"role":"toolResult","toolCallId":"call_A3adzpA8qMwtTkdGoi8nDYP4|fc_0a061eb498f0e908016a59d2afc84481969733f79b2cce0b38","toolName":"read","content":[{"type":"text","text":"//! ADR-0022 idle-delivery **translation-binary** driver (v0.13.0 W2 Layer B).\n//!\n//! An adapter may declare a `[message-idle-translation-binary]` (see\n//! [`spt_runtime::manifest::IdleTranslationBinary`]). It is a **pure\n//! stdin→stdout JSON-lines filter** spt-core lifecycle-manages: spt-core feeds it\n//! the inbound `<EVENT>` feed plus content-free user-activity pings, and reads\n//! back keystroke-commands which spt-core (NOT the binary) applies to the\n//! broker-held PTY. The binary never touches the PTY — that is what lets injection\n//! coexist atomically with a live `spt rc` controller (the W1 coordination,\n//! REQ-HAZARD-INJECT-CONTROL-COEXIST). This module owns only the **process + wire**\n//! seam (spawn, the two JSON-lines protocols, the send-keys byte map, and a\n//! bounded reap); the atomic PTY apply + controller-input buffering lives in the\n//! broker (Layer C).\n//!\n//! **Privacy invariant (doyle gate #1):** the `input` ping is CONTENT-FREE — the\n//! operator's PTY keystrokes are never duplicated into the binary's stdin. See\n//! [`ToBinary::Input`].\n//!\n//! **No-zombie invariant (doyle gate #2):** dropping a [`TranslationChild`] closes\n//! its stdin (EOF → a well-behaved filter exits), waits a bounded window, then\n//! kills + reaps — a session-down never leaks a translation child.\n//\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n\nuse std::io::{self, BufRead, BufReader, Write};\nuse std::process::{Child, ChildStdin, Command, Stdio};\nuse std::sync::mpsc::Sender;\nuse std::sync::Mutex;\nuse std::thread::{self, JoinHandle};\nuse std::time::{Duration, Instant};\n\nuse serde::{Deserialize, Serialize};\n\n/// Bounded window a dropped child gets to exit on its own (after stdin EOF)\n/// before it is killed — the no-zombie reap bound (doyle gate #2). Kept short:\n/// a translation filter has nothing to flush on EOF.\nconst REAP_GRACE: Duration = Duration::from_millis(500);\n/// Poll interval while waiting out [`REAP_GRACE`].\nconst REAP_POLL: Duration = Duration::from_millis(20);\n\n/// One stdin line, spt-core → binary (internally tagged on `type`).\n#[derive(Debug, Clone, PartialEq, Eq, Serialize)]\n#[serde(tag = \"type\", rename_all = \"snake_case\")]\npub enum ToBinary {\n    /// First line: identity. `{\"type\":\"init\",\"endpoint_id\":…,\"node\":…}`.\n    Init { endpoint_id: String, node: String },\n    /// Per inbound message: the whole ADR-0020 `<EVENT>` envelope, verbatim.\n    /// `{\"type\":\"event\",\"envelope\":\"<EVENT…>\"}`.\n    Event { envelope: String },\n    /// A CONTENT-FREE ping each time the operator types, so the binary can track\n    /// user-idle state for its own idle-gated buffering. `{\"type\":\"input\"}`.\n    /// **The PTY input bytes are NEVER included** (doyle gate #1, privacy).\n    Input,\n}\n\n/// One stdout line, binary → spt-core: a single keystroke-command. **Untagged** —\n/// each line carries exactly one command shape (no discriminator field), matching\n/// the ADR-0022 wire (`{key}` / `{text}` / `{delay_ms}` / `{commit}`). Unknown\n/// extra fields on a recognized shape are ignored (forward-compat); a line\n/// matching no shape is a parse error the reader logs and skips (one bad line\n/// never kills the binary).\n#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]\n#[serde(untagged)]\npub enum KeyCmd {\n    /// A named key or `ctrl+<x>` chord → mapped to PTY bytes by [`key_to_bytes`].\n    Key { key: String },\n    /// Literal text typed verbatim into the PTY (the message payload).\n    Text { text: String },\n    /// Pause this many milliseconds between keystrokes (the choreography's stash\n    /// settle, e.g. `{\"delay_ms\":50}`). Carried in the sequence, applied by the\n    /// broker's atomic applier.\n    Delay { delay_ms: u64 },\n    /// Sequence terminator (doyle OPT-1 ruling, pending confirm): the binary\n    /// emits `{\"commit\":true}` after the last keystroke of its response to an\n    /// event, so the broker knows the atomic sequence is complete and can flush\n    /// the buffered controller input race-free. (The v0.11.0 raw-inject —\n    /// `{text:payload}{key:\"enter\"}` — was removed as a delivery path: it did not\n    /// submit on a modern TUI; idle inbound now spools when no binary delivers.)\n    Commit { commit: bool },\n}\n\n/// Map a `{key}` command name to the raw PTY bytes (the \"send-keys\" API).\n///\n/// Returns `None` for an unknown key name — skipped, never a panic (the opaque\n/// adapter-template stance: a bad key silences itself rather than wedging the\n/// applier). `Delay`/`Commit` are not keys and are handled by the applier, not\n/// here.\n///\n/// Vocabulary: the common control keys, the four arrows + Home/End/PageUp/\n/// PageDown/Delete/Insert as xterm CSI sequences, `ctrl+<letter|char>` chords, and\n/// a single literal character passed through as itself (so `{key:\"y\"}` works).\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\npub fn key_to_bytes(key: &str) -> Option<Vec<u8>> {\n    let k = key.trim();\n    let lower = k.to_ascii_lowercase();\n    let named: &[u8] = match lower.as_str() {\n        \"enter\" | \"return\" | \"cr\" => b\"\\r\",\n        \"newline\" | \"lf\" => b\"\\n\",\n        \"tab\" => b\"\\t\",\n        \"esc\" | \"escape\" => b\"\\x1b\",\n        \"backspace\" | \"bs\" => b\"\\x7f\",\n        \"space\" => b\" \",\n        \"up\" => b\"\\x1b[A\",\n        \"down\" => b\"\\x1b[B\",\n        \"right\" => b\"\\x1b[C\",\n        \"left\" => b\"\\x1b[D\",\n        \"home\" => b\"\\x1b[H\",\n        \"end\" => b\"\\x1b[F\",\n        \"pageup\" | \"pgup\" => b\"\\x1b[5~\",\n        \"pagedown\" | \"pgdn\" => b\"\\x1b[6~\",\n        \"delete\" | \"del\" => b\"\\x1b[3~\",\n        \"insert\" | \"ins\" => b\"\\x1b[2~\",\n        _ => {\n            // ctrl+<x>: a control byte. `ctrl+s` → 0x13, `ctrl+space` → NUL,\n            // `ctrl+[` → ESC, etc. Only single-char chords are mapped.\n            if let Some(rest) = lower.strip_prefix(\"ctrl+\").or_else(|| lower.strip_prefix(\"c-\")) {\n                return ctrl_byte(rest).map(|b| vec![b]);\n            }\n            // A single literal character → its own bytes (e.g. `{key:\"y\"}`).\n            let mut chars = k.chars();\n            if let (Some(c), None) = (chars.next(), chars.next()) {\n                return Some(c.to_string().into_bytes());\n            }\n            return None;\n        }\n    };\n    Some(named.to_vec())\n}\n\n/// The control byte for a `ctrl+<x>` chord. ASCII letters map to `0x01..=0x1a`;\n/// the conventional symbol chords (`@ [ \\ ] ^ _ space`) map to `0x00..=0x1f`.\nfn ctrl_byte(rest: &str) -> Option<u8> {\n    if rest == \"space\" {\n        return Some(0x00);\n    }\n    let mut chars = rest.chars();\n    let (c, None) = (chars.next()?, chars.next()) else {\n        return None;\n    };\n    let b = c as u32;\n    match c {\n        'a'..='z' => Some((b as u8) & 0x1f),\n        'A'..='Z' => Some((b as u8) & 0x1f),\n        '@' => Some(0x00),\n        '[' => Some(0x1b),\n        '\\\\' => Some(0x1c),\n        ']' => Some(0x1d),\n        '^' => Some(0x1e),\n        '_' => Some(0x1f),\n        '?' => Some(0x7f),\n        _ => None,\n    }\n}\n\n/// The per-session controller-input buffer + inject-floor flag (W2 Layer C,\n/// REQ-HAZARD-INJECT-CONTROL-COEXIST / the W1 coordination mechanism).\n///\n/// While the floor is **held** (an injected keystroke sequence is mid-flight,\n/// between a `{type:event}` dispatch and its `{commit}`), the operator's\n/// keystrokes from `dispatch_input` are **buffered here** instead of hitting the\n/// PTY; on commit (or the commit deadline) the buffer is flushed to the PTY\n/// **after** the injected bytes. So a stash/restore choreography\n/// (`ctrl+s … ctrl+s`) can never be clobbered by an operator keystroke landing\n/// mid-sequence. spt-core owning every PTY write is what makes this possible.\n///\n/// Pure state (no I/O) so it is unit-testable; the broker holds it behind a\n/// `Mutex` and does the actual `write_input` off-lock (the W1 lesson: never block\n/// a PTY write under a lock the hot input path needs).\n#[derive(Debug, Default)]\npub struct InjectFloor {\n    held: bool,\n    buffer: Vec<u8>,\n}\n\nimpl InjectFloor {\n    /// Open the floor for a new injected sequence (clears any stale buffer — a\n    /// prior sequence always drains to empty before release, so this is belt-and-\n    /// braces). Subsequent operator input buffers until [`take_or_release`].\n    ///\n    /// [`take_or_release`]: InjectFloor::take_or_release\n    pub fn open(&mut self) {\n        self.held = true;\n        self.buffer.clear();\n    }\n\n    /// Whether the floor is currently held (a sequence is mid-flight).\n    pub fn is_held(&self) -> bool {\n        self.held\n    }\n\n    /// Route one operator-input chunk: if the floor is held, buffer it and return\n    /// `true` (the caller must NOT write to the PTY now — it is flushed after the\n    /// sequence); if free, return `false` (the caller writes through its normal\n    /// path).\n    pub fn buffer_if_held(&mut self, bytes: &[u8]) -> bool {\n        if self.held {\n            self.buffer.extend_from_slice(bytes);\n            true\n        } else {\n            false\n        }\n    }\n\n    /// One flush step — call in a loop after `{commit}` / the deadline. If the\n    /// buffer holds bytes, take them to write **off-lock** while the floor STAYS\n    /// held (so input arriving mid-flush keeps buffering → strict order); when the\n    /// buffer is empty, RELEASE the floor and return `None`. Looping until `None`\n    /// drains everything and leaves the floor free.\n    pub fn take_or_release(&mut self) -> Option<Vec<u8>> {\n        if self.buffer.is_empty() {\n            self.held = false;\n            None\n        } else {\n            Some(std::mem::take(&mut self.buffer))\n        }\n    }\n}\n\n/// A live translation-binary child process: its piped stdin (for [`ToBinary`]\n/// lines) plus a reader thread that parses [`KeyCmd`] lines off its stdout and\n/// forwards them on the caller-supplied channel. The broker owns the receiving\n/// end and the atomic PTY apply.\npub struct TranslationChild {\n    /// `None` once reaped — behind a `Mutex` so [`terminate`](Self::terminate) is\n    /// callable through a shared `Arc` (the broker shares the child between the\n    /// inject worker, which kills it on FAULT, and `dispatch_input`, which fires\n    /// content-free pings — Layer C).\n    child: Mutex<Option<Child>>,\n    /// `None` after [`close_stdin`](Self::close_stdin) / reap has taken it.\n    stdin: Mutex<Option<ChildStdin>>,\n    _reader: JoinHandle<()>,\n    pid: Option<u32>,\n}\n\nimpl TranslationChild {\n    /// Spawn `argv` (program + args) as a stdin→stdout filter, forwarding each\n    /// parsed [`KeyCmd`] on `cmds`. stderr is inherited so an adapter author can\n    /// see the binary's own diagnostics. Fails closed: a missing/unspawnable\n    /// binary returns the OS error (the broker logs it and `None` → idle inbound\n    /// spools, never raw-injected). `argv[0]` is the (install-dir-resolved) program;\n    /// `argv[1..]` are the resolved `command` args (ADR-0029).\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n    // [impl->REQ-TRANSLATE-COMMAND]\n    // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\n        let (program, args) = argv\n            .split_first()\n            .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, \"empty translation argv\"))?;\n        let mut command = Command::new(program);\n        command.args(args);\n        command\n            .stdin(Stdio::piped())\n            .stdout(Stdio::piped())\n            .stderr(Stdio::inherit());\n        // On Windows a GUI-subsystem parent (the harness) spawning this console\n        // child pops a VISIBLE console window; CREATE_NO_WINDOW suppresses it\n        // without detaching (the raw `Command::new` bypassed ManifestRuntime, which\n        // sets this for its spawns — runtime/brainproc parity). No-op elsewhere.\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\n        #[cfg(windows)]\n        {\n            use std::os::windows::process::CommandExt;\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\n            command.creation_flags(CREATE_NO_WINDOW);\n        }\n        let mut child = command.spawn()?;\n        let pid = child.id().into();\n        let stdout = child\n            .stdout\n            .take()\n            .expect(\"stdout piped at spawn\");\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\n        let reader = thread::spawn(move || {\n            let buf = BufReader::new(stdout);\n            for line in buf.lines() {\n                let Ok(line) = line else { break }; // child stdout closed\n                let trimmed = line.trim();\n                if trimmed.is_empty() {\n                    continue;\n                }\n                match serde_json::from_str::<KeyCmd>(trimmed) {\n                    Ok(cmd) => {\n                        if cmds.send(cmd).is_err() {\n                            break; // broker dropped the receiver — stop reading\n                        }\n                    }\n                    Err(e) => {\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\n                    }\n                }\n            }\n        });\n        Ok(TranslationChild {\n            child: Mutex::new(Some(child)),\n            stdin: Mutex::new(Some(stdin)),\n            _reader: reader,\n            pid,\n        })\n    }\n\n…\n}\n\n[Showing lines 1-300 of 508. Use :301 to continue]"}],"details":{"truncation":{"content":"//! ADR-0022 idle-delivery **translation-binary** driver (v0.13.0 W2 Layer B).\r\n//!\r\n//! An adapter may declare a `[message-idle-translation-binary]` (see\r\n//! [`spt_runtime::manifest::IdleTranslationBinary`]). It is a **pure\r\n//! stdin→stdout JSON-lines filter** spt-core lifecycle-manages: spt-core feeds it\r\n//! the inbound `<EVENT>` feed plus content-free user-activity pings, and reads\r\n//! back keystroke-commands which spt-core (NOT the binary) applies to the\r\n//! broker-held PTY. The binary never touches the PTY — that is what lets injection\r\n//! coexist atomically with a live `spt rc` controller (the W1 coordination,\r\n//! REQ-HAZARD-INJECT-CONTROL-COEXIST). This module owns only the **process + wire**\r\n//! seam (spawn, the two JSON-lines protocols, the send-keys byte map, and a\r\n//! bounded reap); the atomic PTY apply + controller-input buffering lives in the\r\n//! broker (Layer C).\r\n//!\r\n//! **Privacy invariant (doyle gate #1):** the `input` ping is CONTENT-FREE — the\r\n//! operator's PTY keystrokes are never duplicated into the binary's stdin. See\r\n//! [`ToBinary::Input`].\r\n//!\r\n//! **No-zombie invariant (doyle gate #2):** dropping a [`TranslationChild`] closes\r\n//! its stdin (EOF → a well-behaved filter exits), waits a bounded window, then\r\n//! kills + reaps — a session-down never leaks a translation child.\r\n//\r\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n\r\nuse std::io::{self, BufRead, BufReader, Write};\r\nuse std::process::{Child, ChildStdin, Command, Stdio};\r\nuse std::sync::mpsc::Sender;\r\nuse std::sync::Mutex;\r\nuse std::thread::{self, JoinHandle};\r\nuse std::time::{Duration, Instant};\r\n\r\nuse serde::{Deserialize, Serialize};\r\n\r\n/// Bounded window a dropped child gets to exit on its own (after stdin EOF)\r\n/// before it is killed — the no-zombie reap bound (doyle gate #2). Kept short:\r\n/// a translation filter has nothing to flush on EOF.\r\nconst REAP_GRACE: Duration = Duration::from_millis(500);\r\n/// Poll interval while waiting out [`REAP_GRACE`].\r\nconst REAP_POLL: Duration = Duration::from_millis(20);\r\n\r\n/// One stdin line, spt-core → binary (internally tagged on `type`).\r\n#[derive(Debug, Clone, PartialEq, Eq, Serialize)]\r\n#[serde(tag = \"type\", rename_all = \"snake_case\")]\r\npub enum ToBinary {\r\n    /// First line: identity. `{\"type\":\"init\",\"endpoint_id\":…,\"node\":…}`.\r\n    Init { endpoint_id: String, node: String },\r\n    /// Per inbound message: the whole ADR-0020 `<EVENT>` envelope, verbatim.\r\n    /// `{\"type\":\"event\",\"envelope\":\"<EVENT…>\"}`.\r\n    Event { envelope: String },\r\n    /// A CONTENT-FREE ping each time the operator types, so the binary can track\r\n    /// user-idle state for its own idle-gated buffering. `{\"type\":\"input\"}`.\r\n    /// **The PTY input bytes are NEVER included** (doyle gate #1, privacy).\r\n    Input,\r\n}\r\n\r\n/// One stdout line, binary → spt-core: a single keystroke-command. **Untagged** —\r\n/// each line carries exactly one command shape (no discriminator field), matching\r\n/// the ADR-0022 wire (`{key}` / `{text}` / `{delay_ms}` / `{commit}`). Unknown\r\n/// extra fields on a recognized shape are ignored (forward-compat); a line\r\n/// matching no shape is a parse error the reader logs and skips (one bad line\r\n/// never kills the binary).\r\n#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]\r\n#[serde(untagged)]\r\npub enum KeyCmd {\r\n    /// A named key or `ctrl+<x>` chord → mapped to PTY bytes by [`key_to_bytes`].\r\n    Key { key: String },\r\n    /// Literal text typed verbatim into the PTY (the message payload).\r\n    Text { text: String },\r\n    /// Pause this many milliseconds between keystrokes (the choreography's stash\r\n    /// settle, e.g. `{\"delay_ms\":50}`). Carried in the sequence, applied by the\r\n    /// broker's atomic applier.\r\n    Delay { delay_ms: u64 },\r\n    /// Sequence terminator (doyle OPT-1 ruling, pending confirm): the binary\r\n    /// emits `{\"commit\":true}` after the last keystroke of its response to an\r\n    /// event, so the broker knows the atomic sequence is complete and can flush\r\n    /// the buffered controller input race-free. (The v0.11.0 raw-inject —\r\n    /// `{text:payload}{key:\"enter\"}` — was removed as a delivery path: it did not\r\n    /// submit on a modern TUI; idle inbound now spools when no binary delivers.)\r\n    Commit { commit: bool },\r\n}\r\n\r\n/// Map a `{key}` command name to the raw PTY bytes (the \"send-keys\" API).\r\n///\r\n/// Returns `None` for an unknown key name — skipped, never a panic (the opaque\r\n/// adapter-template stance: a bad key silences itself rather than wedging the\r\n/// applier). `Delay`/`Commit` are not keys and are handled by the applier, not\r\n/// here.\r\n///\r\n/// Vocabulary: the common control keys, the four arrows + Home/End/PageUp/\r\n/// PageDown/Delete/Insert as xterm CSI sequences, `ctrl+<letter|char>` chords, and\r\n/// a single literal character passed through as itself (so `{key:\"y\"}` works).\r\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\npub fn key_to_bytes(key: &str) -> Option<Vec<u8>> {\r\n    let k = key.trim();\r\n    let lower = k.to_ascii_lowercase();\r\n    let named: &[u8] = match lower.as_str() {\r\n        \"enter\" | \"return\" | \"cr\" => b\"\\r\",\r\n        \"newline\" | \"lf\" => b\"\\n\",\r\n        \"tab\" => b\"\\t\",\r\n        \"esc\" | \"escape\" => b\"\\x1b\",\r\n        \"backspace\" | \"bs\" => b\"\\x7f\",\r\n        \"space\" => b\" \",\r\n        \"up\" => b\"\\x1b[A\",\r\n        \"down\" => b\"\\x1b[B\",\r\n        \"right\" => b\"\\x1b[C\",\r\n        \"left\" => b\"\\x1b[D\",\r\n        \"home\" => b\"\\x1b[H\",\r\n        \"end\" => b\"\\x1b[F\",\r\n        \"pageup\" | \"pgup\" => b\"\\x1b[5~\",\r\n        \"pagedown\" | \"pgdn\" => b\"\\x1b[6~\",\r\n        \"delete\" | \"del\" => b\"\\x1b[3~\",\r\n        \"insert\" | \"ins\" => b\"\\x1b[2~\",\r\n        _ => {\r\n            // ctrl+<x>: a control byte. `ctrl+s` → 0x13, `ctrl+space` → NUL,\r\n            // `ctrl+[` → ESC, etc. Only single-char chords are mapped.\r\n            if let Some(rest) = lower.strip_prefix(\"ctrl+\").or_else(|| lower.strip_prefix(\"c-\")) {\r\n                return ctrl_byte(rest).map(|b| vec![b]);\r\n            }\r\n            // A single literal character → its own bytes (e.g. `{key:\"y\"}`).\r\n            let mut chars = k.chars();\r\n            if let (Some(c), None) = (chars.next(), chars.next()) {\r\n                return Some(c.to_string().into_bytes());\r\n            }\r\n            return None;\r\n        }\r\n    };\r\n    Some(named.to_vec())\r\n}\r\n\r\n/// The control byte for a `ctrl+<x>` chord. ASCII letters map to `0x01..=0x1a`;\r\n/// the conventional symbol chords (`@ [ \\ ] ^ _ space`) map to `0x00..=0x1f`.\r\nfn ctrl_byte(rest: &str) -> Option<u8> {\r\n    if rest == \"space\" {\r\n        return Some(0x00);\r\n    }\r\n    let mut chars = rest.chars();\r\n    let (c, None) = (chars.next()?, chars.next()) else {\r\n        return None;\r\n    };\r\n    let b = c as u32;\r\n    match c {\r\n        'a'..='z' => Some((b as u8) & 0x1f),\r\n        'A'..='Z' => Some((b as u8) & 0x1f),\r\n        '@' => Some(0x00),\r\n        '[' => Some(0x1b),\r\n        '\\\\' => Some(0x1c),\r\n        ']' => Some(0x1d),\r\n        '^' => Some(0x1e),\r\n        '_' => Some(0x1f),\r\n        '?' => Some(0x7f),\r\n        _ => None,\r\n    }\r\n}\r\n\r\n/// The per-session controller-input buffer + inject-floor flag (W2 Layer C,\r\n/// REQ-HAZARD-INJECT-CONTROL-COEXIST / the W1 coordination mechanism).\r\n///\r\n/// While the floor is **held** (an injected keystroke sequence is mid-flight,\r\n/// between a `{type:event}` dispatch and its `{commit}`), the operator's\r\n/// keystrokes from `dispatch_input` are **buffered here** instead of hitting the\r\n/// PTY; on commit (or the commit deadline) the buffer is flushed to the PTY\r\n/// **after** the injected bytes. So a stash/restore choreography\r\n/// (`ctrl+s … ctrl+s`) can never be clobbered by an operator keystroke landing\r\n/// mid-sequence. spt-core owning every PTY write is what makes this possible.\r\n///\r\n/// Pure state (no I/O) so it is unit-testable; the broker holds it behind a\r\n/// `Mutex` and does the actual `write_input` off-lock (the W1 lesson: never block\r\n/// a PTY write under a lock the hot input path needs).\r\n#[derive(Debug, Default)]\r\npub struct InjectFloor {\r\n    held: bool,\r\n    buffer: Vec<u8>,\r\n}\r\n\r\nimpl InjectFloor {\r\n    /// Open the floor for a new injected sequence (clears any stale buffer — a\r\n    /// prior sequence always drains to empty before release, so this is belt-and-\r\n    /// braces). Subsequent operator input buffers until [`take_or_release`].\r\n    ///\r\n    /// [`take_or_release`]: InjectFloor::take_or_release\r\n    pub fn open(&mut self) {\r\n        self.held = true;\r\n        self.buffer.clear();\r\n    }\r\n\r\n    /// Whether the floor is currently held (a sequence is mid-flight).\r\n    pub fn is_held(&self) -> bool {\r\n        self.held\r\n    }\r\n\r\n    /// Route one operator-input chunk: if the floor is held, buffer it and return\r\n    /// `true` (the caller must NOT write to the PTY now — it is flushed after the\r\n    /// sequence); if free, return `false` (the caller writes through its normal\r\n    /// path).\r\n    pub fn buffer_if_held(&mut self, bytes: &[u8]) -> bool {\r\n        if self.held {\r\n            self.buffer.extend_from_slice(bytes);\r\n            true\r\n        } else {\r\n            false\r\n        }\r\n    }\r\n\r\n    /// One flush step — call in a loop after `{commit}` / the deadline. If the\r\n    /// buffer holds bytes, take them to write **off-lock** while the floor STAYS\r\n    /// held (so input arriving mid-flush keeps buffering → strict order); when the\r\n    /// buffer is empty, RELEASE the floor and return `None`. Looping until `None`\r\n    /// drains everything and leaves the floor free.\r\n    pub fn take_or_release(&mut self) -> Option<Vec<u8>> {\r\n        if self.buffer.is_empty() {\r\n            self.held = false;\r\n            None\r\n        } else {\r\n            Some(std::mem::take(&mut self.buffer))\r\n        }\r\n    }\r\n}\r\n\r\n/// A live translation-binary child process: its piped stdin (for [`ToBinary`]\r\n/// lines) plus a reader thread that parses [`KeyCmd`] lines off its stdout and\r\n/// forwards them on the caller-supplied channel. The broker owns the receiving\r\n/// end and the atomic PTY apply.\r\npub struct TranslationChild {\r\n    /// `None` once reaped — behind a `Mutex` so [`terminate`](Self::terminate) is\r\n    /// callable through a shared `Arc` (the broker shares the child between the\r\n    /// inject worker, which kills it on FAULT, and `dispatch_input`, which fires\r\n    /// content-free pings — Layer C).\r\n    child: Mutex<Option<Child>>,\r\n    /// `None` after [`close_stdin`](Self::close_stdin) / reap has taken it.\r\n    stdin: Mutex<Option<ChildStdin>>,\r\n    _reader: JoinHandle<()>,\r\n    pid: Option<u32>,\r\n}\r\n\r\nimpl TranslationChild {\r\n    /// Spawn `argv` (program + args) as a stdin→stdout filter, forwarding each\r\n    /// parsed [`KeyCmd`] on `cmds`. stderr is inherited so an adapter author can\r\n    /// see the binary's own diagnostics. Fails closed: a missing/unspawnable\r\n    /// binary returns the OS error (the broker logs it and `None` → idle inbound\r\n    /// spools, never raw-injected). `argv[0]` is the (install-dir-resolved) program;\r\n    /// `argv[1..]` are the resolved `command` args (ADR-0029).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    // [impl->REQ-TRANSLATE-COMMAND]\r\n    // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\r\n        let (program, args) = argv\r\n            .split_first()\r\n            .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, \"empty translation argv\"))?;\r\n        let mut command = Command::new(program);\r\n        command.args(args);\r\n        command\r\n            .stdin(Stdio::piped())\r\n            .stdout(Stdio::piped())\r\n            .stderr(Stdio::inherit());\r\n        // On Windows a GUI-subsystem parent (the harness) spawning this console\r\n        // child pops a VISIBLE console window; CREATE_NO_WINDOW suppresses it\r\n        // without detaching (the raw `Command::new` bypassed ManifestRuntime, which\r\n        // sets this for its spawns — runtime/brainproc parity). No-op elsewhere.\r\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\r","truncated":true,"truncatedBy":"lines","totalLines":508,"totalBytes":13556,"outputLines":300,"outputBytes":13556,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! ADR-0022 idle-delivery **translation-binary** driver (v0.13.0 W2 Layer B).\r\n//!\r\n//! An adapter may declare a `[message-idle-translation-binary]` (see\r\n//! [`spt_runtime::manifest::IdleTranslationBinary`]). It is a **pure\r\n//! stdin→stdout JSON-lines filter** spt-core lifecycle-manages: spt-core feeds it\r\n//! the inbound `<EVENT>` feed plus content-free user-activity pings, and reads\r\n//! back keystroke-commands which spt-core (NOT the binary) applies to the\r\n//! broker-held PTY. The binary never touches the PTY — that is what lets injection\r\n//! coexist atomically with a live `spt rc` controller (the W1 coordination,\r\n//! REQ-HAZARD-INJECT-CONTROL-COEXIST). This module owns only the **process + wire**\r\n//! seam (spawn, the two JSON-lines protocols, the send-keys byte map, and a\r\n//! bounded reap); the atomic PTY apply + controller-input buffering lives in the\r\n//! broker (Layer C).\r\n//!\r\n//! **Privacy invariant (doyle gate #1):** the `input` ping is CONTENT-FREE — the\r\n//! operator's PTY keystrokes are never duplicated into the binary's stdin. See\r\n//! [`ToBinary::Input`].\r\n//!\r\n//! **No-zombie invariant (doyle gate #2):** dropping a [`TranslationChild`] closes\r\n//! its stdin (EOF → a well-behaved filter exits), waits a bounded window, then\r\n//! kills + reaps — a session-down never leaks a translation child.\r\n//\r\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n\r\nuse std::io::{self, BufRead, BufReader, Write};\r\nuse std::process::{Child, ChildStdin, Command, Stdio};\r\nuse std::sync::mpsc::Sender;\r\nuse std::sync::Mutex;\r\nuse std::thread::{self, JoinHandle};\r\nuse std::time::{Duration, Instant};\r\n\r\nuse serde::{Deserialize, Serialize};\r\n\r\n/// Bounded window a dropped child gets to exit on its own (after stdin EOF)\r\n/// before it is killed — the no-zombie reap bound (doyle gate #2). Kept short:\r\n/// a translation filter has nothing to flush on EOF.\r\nconst REAP_GRACE: Duration = Duration::from_millis(500);\r\n/// Poll interval while waiting out [`REAP_GRACE`].\r\nconst REAP_POLL: Duration = Duration::from_millis(20);\r\n\r\n/// One stdin line, spt-core → binary (internally tagged on `type`).\r\n#[derive(Debug, Clone, PartialEq, Eq, Serialize)]\r\n#[serde(tag = \"type\", rename_all = \"snake_case\")]\r\npub enum ToBinary {\r\n    /// First line: identity. `{\"type\":\"init\",\"endpoint_id\":…,\"node\":…}`.\r\n    Init { endpoint_id: String, node: String },\r\n    /// Per inbound message: the whole ADR-0020 `<EVENT>` envelope, verbatim.\r\n    /// `{\"type\":\"event\",\"envelope\":\"<EVENT…>\"}`.\r\n    Event { envelope: String },\r\n    /// A CONTENT-FREE ping each time the operator types, so the binary can track\r\n    /// user-idle state for its own idle-gated buffering. `{\"type\":\"input\"}`.\r\n    /// **The PTY input bytes are NEVER included** (doyle gate #1, privacy).\r\n    Input,\r\n}\r\n\r\n/// One stdout line, binary → spt-core: a single keystroke-command. **Untagged** —\r\n/// each line carries exactly one command shape (no discriminator field), matching\r\n/// the ADR-0022 wire (`{key}` / `{text}` / `{delay_ms}` / `{commit}`). Unknown\r\n/// extra fields on a recognized shape are ignored (forward-compat); a line\r\n/// matching no shape is a parse error the reader logs and skips (one bad line\r\n/// never kills the binary).\r\n#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]\r\n#[serde(untagged)]\r\npub enum KeyCmd {\r\n    /// A named key or `ctrl+<x>` chord → mapped to PTY bytes by [`key_to_bytes`].\r\n    Key { key: String },\r\n    /// Literal text typed verbatim into the PTY (the message payload).\r\n    Text { text: String },\r\n    /// Pause this many milliseconds between keystrokes (the choreography's stash\r\n    /// settle, e.g. `{\"delay_ms\":50}`). Carried in the sequence, applied by the\r\n    /// broker's atomic applier.\r\n    Delay { delay_ms: u64 },\r\n    /// Sequence terminator (doyle OPT-1 ruling, pending confirm): the binary\r\n    /// emits `{\"commit\":true}` after the last keystroke of its response to an\r\n    /// event, so the broker knows the atomic sequence is complete and can flush\r\n    /// the buffered controller input race-free. (The v0.11.0 raw-inject —\r\n    /// `{text:payload}{key:\"enter\"}` — was removed as a delivery path: it did not\r\n    /// submit on a modern TUI; idle inbound now spools when no binary delivers.)\r\n    Commit { commit: bool },\r\n}\r\n\r\n/// Map a `{key}` command name to the raw PTY bytes (the \"send-keys\" API).\r\n///\r\n/// Returns `None` for an unknown key name — skipped, never a panic (the opaque\r\n/// adapter-template stance: a bad key silences itself rather than wedging the\r\n/// applier). `Delay`/`Commit` are not keys and are handled by the applier, not\r\n/// here.\r\n///\r\n/// Vocabulary: the common control keys, the four arrows + Home/End/PageUp/\r\n/// PageDown/Delete/Insert as xterm CSI sequences, `ctrl+<letter|char>` chords, and\r\n/// a single literal character passed through as itself (so `{key:\"y\"}` works).\r\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\npub fn key_to_bytes(key: &str) -> Option<Vec<u8>> {\r\n    let k = key.trim();\r\n    let lower = k.to_ascii_lowercase();\r\n    let named: &[u8] = match lower.as_str() {\r\n        \"enter\" | \"return\" | \"cr\" => b\"\\r\",\r\n        \"newline\" | \"lf\" => b\"\\n\",\r\n        \"tab\" => b\"\\t\",\r\n        \"esc\" | \"escape\" => b\"\\x1b\",\r\n        \"backspace\" | \"bs\" => b\"\\x7f\",\r\n        \"space\" => b\" \",\r\n        \"up\" => b\"\\x1b[A\",\r\n        \"down\" => b\"\\x1b[B\",\r\n        \"right\" => b\"\\x1b[C\",\r\n        \"left\" => b\"\\x1b[D\",\r\n        \"home\" => b\"\\x1b[H\",\r\n        \"end\" => b\"\\x1b[F\",\r\n        \"pageup\" | \"pgup\" => b\"\\x1b[5~\",\r\n        \"pagedown\" | \"pgdn\" => b\"\\x1b[6~\",\r\n        \"delete\" | \"del\" => b\"\\x1b[3~\",\r\n        \"insert\" | \"ins\" => b\"\\x1b[2~\",\r\n        _ => {\r\n            // ctrl+<x>: a control byte. `ctrl+s` → 0x13, `ctrl+space` → NUL,\r\n            // `ctrl+[` → ESC, etc. Only single-char chords are mapped.\r\n            if let Some(rest) = lower.strip_prefix(\"ctrl+\").or_else(|| lower.strip_prefix(\"c-\")) {\r\n                return ctrl_byte(rest).map(|b| vec![b]);\r\n            }\r\n            // A single literal character → its own bytes (e.g. `{key:\"y\"}`).\r\n            let mut chars = k.chars();\r\n            if let (Some(c), None) = (chars.next(), chars.next()) {\r\n                return Some(c.to_string().into_bytes());\r\n            }\r\n            return None;\r\n        }\r\n    };\r\n    Some(named.to_vec())\r\n}\r\n\r\n/// The control byte for a `ctrl+<x>` chord. ASCII letters map to `0x01..=0x1a`;\r\n/// the conventional symbol chords (`@ [ \\ ] ^ _ space`) map to `0x00..=0x1f`.\r\nfn ctrl_byte(rest: &str) -> Option<u8> {\r\n    if rest == \"space\" {\r\n        return Some(0x00);\r\n    }\r\n    let mut chars = rest.chars();\r\n    let (c, None) = (chars.next()?, chars.next()) else {\r\n        return None;\r\n    };\r\n    let b = c as u32;\r\n    match c {\r\n        'a'..='z' => Some((b as u8) & 0x1f),\r\n        'A'..='Z' => Some((b as u8) & 0x1f),\r\n        '@' => Some(0x00),\r\n        '[' => Some(0x1b),\r\n        '\\\\' => Some(0x1c),\r\n        ']' => Some(0x1d),\r\n        '^' => Some(0x1e),\r\n        '_' => Some(0x1f),\r\n        '?' => Some(0x7f),\r\n        _ => None,\r\n    }\r\n}\r\n\r\n/// The per-session controller-input buffer + inject-floor flag (W2 Layer C,\r\n/// REQ-HAZARD-INJECT-CONTROL-COEXIST / the W1 coordination mechanism).\r\n///\r\n/// While the floor is **held** (an injected keystroke sequence is mid-flight,\r\n/// between a `{type:event}` dispatch and its `{commit}`), the operator's\r\n/// keystrokes from `dispatch_input` are **buffered here** instead of hitting the\r\n/// PTY; on commit (or the commit deadline) the buffer is flushed to the PTY\r\n/// **after** the injected bytes. So a stash/restore choreography\r\n/// (`ctrl+s … ctrl+s`) can never be clobbered by an operator keystroke landing\r\n/// mid-sequence. spt-core owning every PTY write is what makes this possible.\r\n///\r\n/// Pure state (no I/O) so it is unit-testable; the broker holds it behind a\r\n/// `Mutex` and does the actual `write_input` off-lock (the W1 lesson: never block\r\n/// a PTY write under a lock the hot input path needs).\r\n#[derive(Debug, Default)]\r\npub struct InjectFloor {\r\n    held: bool,\r\n    buffer: Vec<u8>,\r\n}\r\n\r\nimpl InjectFloor {\r\n    /// Open the floor for a new injected sequence (clears any stale buffer — a\r\n    /// prior sequence always drains to empty before release, so this is belt-and-\r\n    /// braces). Subsequent operator input buffers until [`take_or_release`].\r\n    ///\r\n    /// [`take_or_release`]: InjectFloor::take_or_release\r\n    pub fn open(&mut self) {\r\n        self.held = true;\r\n        self.buffer.clear();\r\n    }\r\n\r\n    /// Whether the floor is currently held (a sequence is mid-flight).\r\n    pub fn is_held(&self) -> bool {\r\n        self.held\r\n    }\r\n\r\n    /// Route one operator-input chunk: if the floor is held, buffer it and return\r\n    /// `true` (the caller must NOT write to the PTY now — it is flushed after the\r\n    /// sequence); if free, return `false` (the caller writes through its normal\r\n    /// path).\r\n    pub fn buffer_if_held(&mut self, bytes: &[u8]) -> bool {\r\n        if self.held {\r\n            self.buffer.extend_from_slice(bytes);\r\n            true\r\n        } else {\r\n            false\r\n        }\r\n    }\r\n\r\n    /// One flush step — call in a loop after `{commit}` / the deadline. If the\r\n    /// buffer holds bytes, take them to write **off-lock** while the floor STAYS\r\n    /// held (so input arriving mid-flush keeps buffering → strict order); when the\r\n    /// buffer is empty, RELEASE the floor and return `None`. Looping until `None`\r\n    /// drains everything and leaves the floor free.\r\n    pub fn take_or_release(&mut self) -> Option<Vec<u8>> {\r\n        if self.buffer.is_empty() {\r\n            self.held = false;\r\n            None\r\n        } else {\r\n            Some(std::mem::take(&mut self.buffer))\r\n        }\r\n    }\r\n}\r\n\r\n/// A live translation-binary child process: its piped stdin (for [`ToBinary`]\r\n/// lines) plus a reader thread that parses [`KeyCmd`] lines off its stdout and\r\n/// forwards them on the caller-supplied channel. The broker owns the receiving\r\n/// end and the atomic PTY apply.\r\npub struct TranslationChild {\r\n    /// `None` once reaped — behind a `Mutex` so [`terminate`](Self::terminate) is\r\n    /// callable through a shared `Arc` (the broker shares the child between the\r\n    /// inject worker, which kills it on FAULT, and `dispatch_input`, which fires\r\n    /// content-free pings — Layer C).\r\n    child: Mutex<Option<Child>>,\r\n    /// `None` after [`close_stdin`](Self::close_stdin) / reap has taken it.\r\n    stdin: Mutex<Option<ChildStdin>>,\r\n    _reader: JoinHandle<()>,\r\n    pid: Option<u32>,\r\n}\r\n\r\nimpl TranslationChild {\r\n    /// Spawn `argv` (program + args) as a stdin→stdout filter, forwarding each\r\n    /// parsed [`KeyCmd`] on `cmds`. stderr is inherited so an adapter author can\r\n    /// see the binary's own diagnostics. Fails closed: a missing/unspawnable\r\n    /// binary returns the OS error (the broker logs it and `None` → idle inbound\r\n    /// spools, never raw-injected). `argv[0]` is the (install-dir-resolved) program;\r\n    /// `argv[1..]` are the resolved `command` args (ADR-0029).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    // [impl->REQ-TRANSLATE-COMMAND]\r\n    // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\r\n        let (program, args) = argv\r\n            .split_first()\r\n            .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, \"empty translation argv\"))?;\r\n        let mut command = Command::new(program);\r\n        command.args(args);\r\n        command\r\n            .stdin(Stdio::piped())\r\n            .stdout(Stdio::piped())\r\n            .stderr(Stdio::inherit());\r\n        // On Windows a GUI-subsystem parent (the harness) spawning this console\r\n        // child pops a VISIBLE console window; CREATE_NO_WINDOW suppresses it\r\n        // without detaching (the raw `Command::new` bypassed ManifestRuntime, which\r\n        // sets this for its spawns — runtime/brainproc parity). No-op elsewhere.\r\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\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,359]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\translation.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":508,"totalBytes":13556,"outputLines":300,"outputBytes":13556,"shownRange":{"start":1,"end":300},"nextOffset":301}}},"isError":false,"timestamp":1784271535877}}
{"type":"message","id":"b6cb7a25","parentId":"7573a6d5","timestamp":"2026-07-17T06:58:55.907Z","message":{"role":"toolResult","toolCallId":"call_qUMCjE9JB4rMDcXIhdxxegEw|fc_0a061eb498f0e908016a59d2afc8708196a4526a3be71b7d84","toolName":"grep","content":[{"type":"text","text":"# docs/\n## KNOWN-HAZARDS.md\n 641|- **Invariant:** every write on a physical broker connection rides ONE broker-owned bounded/cancelable framed-write primitive with an **independent out-of-band aborter**. The `SendHalf` never leaves the conn object (a bypass cannot compile). An ABSOLUTE deadline stamped at write entry covers BOTH the serialized gate-wait AND OS write completion; a per-conn watchdog fires at that deadline and aborts the in-flight op — never relying on the write returning or on opportunistic stall-evict sampling. On dead...\n*642|- **spt-core mapping:** `spt-daemon/src/conn.rs` `BrokerConn` (Condvar-gated serialized write gate + poisoned state + per-in-flight op id + watchdog + `abort_physical()`: cfg(windows) `CancelIoEx` → completion handshake → `DisconnectNamedPipe` raw kernel32 externs; cfg(unix) `UnixStream::shutdown(Both)`); `broker.rs` `SharedSend = Arc<BrokerConn>` + `controller_writer`/`viewer_writer`/`send_frame`/`send_error` routed; `nethost.rs` stream-log/presence sends routed. int = `brain_decouple.rs` `non_drain...\n 643|- **Source:** UPDATE-WEDGE round-4 (hertz root doc `docs/UPDATE-WEDGE-ROOT-CAUSE.md` @f8596ca; doyle gate ruling `docs/UPDATE-WEDGE-RCA-DISPATCH-todlando.md`; todlando build 2026-07-09). The residual 7.36 left open: logical eviction without physical retirement.\n 644|\n 645|---\n...\n 664|\n*665|### 7.41 A fresh dispatcher must NEVER re-serve a terminal stream — historical replay must not steal or clear a live controller  `[REQ-HAZARD-REDISPATCH-CONTROL-STEAL]`\n*666|<!-- [doc->REQ-HAZARD-REDISPATCH-CONTROL-STEAL] -->\n 667|- **Failure (paid-for, hertz field RCA 2026-07-16 — 4/5 endpoints frozen, twice in one day):** every brain cycle (`spt daemon refresh`, `spt update` apply — same `applyhost.rs` path) launches a fresh `dispatch::run_dispatch_loop` whose EMPTY per-process `claimed` set enumerates every broker-held peer stream. `NetShared.streams` has NO removal path (`StreamLog::finish` only marks) and the claim condition has no finished filter → the fresh dispatcher replays FINISHED historical attach streams. A repl...\n*668|- **Invariant:** redispatch eligibility is LIFECYCLE-gated: a finished/terminal stream row is retired from the dispatcher's enumeration (a fresh dispatcher never re-serves a terminal Attach); classification identity is restart-durable and independent of the evictable data ring (immutable opener fact pinned per stream until close); claims are retryable on transient worker-setup failure and terminal on terminal outcomes (no hot-loop). The legitimate same-`by` successor re-take after a brain restart still s...\n 669|- **spt-core mapping:** `spt-daemon/src/dispatch.rs` `run_dispatch_loop` claim condition + `peek_first_line` classification + worker spawn; `spt-daemon/src/nethost.rs` `NetShared.streams` insert/finish + `DEFAULT_STREAM_RING_CHUNKS`; `spt-daemon/src/applyhost.rs` (the brain-cycle trigger).\n*670|- **Source:** REDISPATCH-TRUTH W1 (hertz source-level RCA `.claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt`, doyle seam-verified; ADR-0038; distinct from the CLOSED 0.30.x session-cursor resume-steal saga).\n 671|\n 672|---\n 673|\n...\n 682|\n*683|### 7.43 One wedged stream subscriber must NEVER stall stream serving — replay halts at the first failed write, a poisoned subscriber is removed, and recovery machinery must not manufacture new replay victims  `[REQ-HAZARD-REDISPATCH-STALL]`\n*684|<!-- [doc->REQ-HAZARD-REDISPATCH-STALL] -->\n 685|- **Failure (paid-for, hertz field RCA 2026-07-16 — live v0.34 boxes, recurrent 20–30s PTY/RC freezes, DISPATCH tails 17–62s):** a COMPOSITION, not one new timer. The dispatcher's retryable claims (500ms/1s ×3) re-drove the opener fallback whose guard arm is a broad `Err(_)` (`dispatch.rs:414` — comment intends old-broker-only; catches transport timeout/EOF/poison), each pass installing a throwaway peek subscriber. `StreamLog::attach` synchronously replays the ENTIRE retained ring under the per-...\n*686|- **Invariant:** subscriber I/O never holds the `StreamLog` mutex (enqueue-under-lock, I/O outside, bounded per-subscriber queue; overflow = detach + resume-from-cursor); replay and fan-out halt at the FIRST failed subscriber write and the failed subscriber is REMOVED (attach + append + finish, all sites, `PresenceLog` mirrors included); the ring-peek fallback fires ONLY on the explicit unsupported-verb/old-broker answer; a deadline-poisoned replay is circuit-broken (global backoff, no reinstall until th...\n 687|- **spt-core mapping:** `spt-daemon/src/nethost.rs` `StreamLog::attach`/`push`/`finish` + `PresenceLog` mirrors + serve/wire worker pairing; `spt-daemon/src/dispatch.rs` `first_line` fallback arm + claim retry/backoff + worker spawn; SharedSend bounded-write deadline (round-4, KH 7.7 kin).\n*688|- **Source:** REDISPATCH-STALL W1 (hertz v0.34 field RCA 2026-07-16, doyle seam-verified same day; ADR-0038 Amendment 2026-07-16; `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`; distinct from `update --restart`'s bounded 30s rc reconnect loop).\n 689|\n 690|---\n 691|\n...\n 758|<!-- [doc->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION] -->\n*759|| 7.38 | Every physical broker-conn write bounded + cancelable + poison-on-failure (independent watchdog aborter; poisoned conn never reused; SendHalf never leaves the conn object) | broker `conn.rs` `BrokerConn`, all write sites (`controller_writer`/`viewer_writer`/`send_frame`/nethost), int `brain_decouple.rs` |\n 760|| 7.31 | The Psyche failure budget counts REAL per-event attempts — every bounded per-event turn feeds a consecutive-N budget (default 3), so per-event churn a resident rate-guard was blind to now counts by construction. Fixes hall-bf's ~12/min re-host churn that ran invisibly (boot records weren't ledger boundaries to the old guard) | `lifecycle.rs` `note_turn_outcome`/`psyche_turn_strikes_exhausted` (stamps `psyche_host_error` on exhaustion, no `status` de-stamp), unit synthetic failure-loop trips th...\n 761|<!-- [doc->REQ-HAZARD-THRASH-GUARD-BLIND] -->\n 762|<!-- [doc->REQ-HAZARD-STORE-INIT-RACE] -->\n## REDISPATCH-STALL-TRIAGE.md\n*1|# REDISPATCH-STALL — wave triage (doyle, 2026-07-16)\n 2|\n*3|<!-- [doc->REQ-HAZARD-REDISPATCH-STALL] -->\n 4|\n*5|**Wave:** stop the v0.34 field stalls — REDISPATCH-TRUTH W1's claim retry and\n 6|the broad `Err(_)` opener fallback repeatedly drive `StreamLog::attach`'s\n 7|discard-errors replay-under-mutex into serial 15s subscriber-poison windows\n 8|that compose into 17–62s PTY/RC freezes. Counter-63 fast-follow after\n...\n 11|**Canonical RCA:** hertz 2026-07-16, doyle seam-verified the same day; repo\n*12|summary `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`.\n 13|**Decision record:** ADR-0038 **Amendment (2026-07-16)**.\n 14|**Hazard:** KNOWN-HAZARDS 7.43.\n 15|**Field incident:** live v0.34 boxes, recurrent 20–30s freezes, DISPATCH tails\n...\n 89|\n*90|**Binding on every leg:** redispatch D1/D1b stay green (the retire/steal\n 91|regressions are substrate, not victims).\n 92|\n 93|**Missing-coverage census (fair, rides the wave):** D3 never poisons an\n...\n 141|doyle triaged (this doc) → todlando builds (branch\n*142|`build/redispatch-stall-w1`, all five REQs, flip `required_stages` at build\n 143|start per [[traceable-per-wave-activation]]) → doyle gates (rulings above) →\n 144|deployah releases (counter 63 fast-follow, bump-in-PR, counter from published\n 145|metadata) → hertz field-verify (discriminators above; they own the incident\n## REDISPATCH-TRUTH-TRIAGE.md\n*1|# REDISPATCH-TRUTH — milestone triage (JIT)\n 2|\n 3|> Doyle triage 2026-07-16, dispatched at the v0.33.0 boundary (ranked-first\n 4|> from the hertz same-day RCA; displaces MESH-RECOVERY). Canonical RCA:\n*5|> `.claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt`\n 6|> (hertz source-level, doyle seam-verified same day). Decision record:\n 7|> ADR-0038. Lane: doyle triages → todlando builds → doyle gates → deployah\n 8|> releases → hertz field-verify (they hold the incident logs).\n...\n 13|freezes active remote `spt rc` sessions. The PTYs and broker-held QUIC\n*14|streams survive by construction — the freeze is a **production redispatch\n 15|bug** in the fresh brain's stream reconstruction:\n 16|\n 17|1. **Stale replay steals live controllers.** The fresh\n...\n 57|Broker stream-table rows gain explicit **lifecycle truth**, and the\n*58|dispatcher redispatches only what is genuinely live:\n 59|\n*60|- **A — finished rows retire from redispatch eligibility.** A fresh\n 61|  dispatcher must never re-serve a terminal Attach request. Retain only the\n 62|  lifecycle state genuinely needed after EOF (presence/log reads); the\n*63|  redispatch enumeration must not see terminal rows.\n 64|- **B — restart-durable opener/classification metadata.** Pin the\n 65|  per-stream immutable opener fact (or the complete first NDJSON record)\n 66|  OUTSIDE the evictable data ring, held until stream close. Recovery\n...\n 84|### W1 — the fix cluster (single build wave; todlando)\n*85|- **REQ-HAZARD-REDISPATCH-CONTROL-STEAL** — the invariant (KNOWN-HAZARDS\n 86|  7.41) + regression D1.\n*87|- **REQ-REDISPATCH-FINISHED-RETIRE** — mechanism A.\n 88|- **REQ-STREAM-OPENER-DURABLE** — mechanism B + regression D2.\n 89|- **REQ-DISPATCH-CLAIM-RETRY** — mechanism C + regression D3.\n 90|\n\n## adr/\n### 0038-broker-stream-lifecycle-truth.md\n*1|# ADR-0038: Broker stream-table lifecycle truth (redispatch eligibility)\n 2|\n*3|- **Status:** accepted (hertz RCA + doyle seam-verify 2026-07-16, dispatched same day); **amended 2026-07-16 (REDISPATCH-STALL — see Amendment below)**\n*4|- **Context:** REDISPATCH-TRUTH milestone; RCA `.claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt`\n 5|\n 6|## Context\n 7|\n...\n 10|no removal or retirement path exists. Stream *classification* is derived at\n*11|redispatch time by peeking ring seq 0, but the `StreamLog` data ring is\n 12|bounded (4096 transport chunks) and evicts the protocol opener under\n 13|traffic. Dispatcher claims are a per-process one-shot `HashSet` insert\n 14|performed before worker spawn, never cleared or retried.\n...\n 26|## Decision\n*27|<!-- [doc->REQ-REDISPATCH-FINISHED-RETIRE] -->\n 28|\n*29|Stream rows carry explicit **lifecycle truth**, and redispatch consumes it:\n 30|\n*31|1. **Finished is terminal for redispatch.** A finished/terminal stream row\n*32|   is retired from redispatch eligibility (removed from the enumeration the\n 33|   dispatcher claims from, or excluded by lifecycle state). Only the\n 34|   post-EOF state genuinely needed by other readers (presence, log reads)\n 35|   survives. A fresh dispatcher never re-serves a terminal Attach.\n...\n 72|\n*73|## Amendment — REDISPATCH-STALL (2026-07-16)\n 74|<!-- [doc->REQ-DISPATCH-FALLBACK-CIRCUIT] -->\n 75|<!-- [doc->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE] -->\n 76|<!-- [doc->REQ-SERVE-OWNERSHIP-GENERATION] -->\n...\n 80|  day, both hours apart); RCA summary\n*81|  `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`; hazard\n*82|  KNOWN-HAZARDS 7.43; build shape `docs/REDISPATCH-STALL-TRIAGE.md`.\n 83|\n 84|The W1 machinery this ADR shipped is field-correct on its own terms (D1/D1b\n 85|hold: finished rows never serve) but two of its legs COMPOSE into a stall\n...\n 121|   retirement cannot see.\n*122|6. **(new — dispatcher hygiene + telemetry)** The redispatch worker pool is\n 123|   bounded with batched cold enumeration and NO claim/sessions locks held\n 124|   across I/O (clone-then-drop before `detach_if`/`info.json` writes, KH 7.12\n 125|   kin); dispatch telemetry is keyed per\n\n# crates/spt-daemon/\n## Cargo.toml\n 7|\n*8|# Test-only REDISPATCH-TRUTH dispatcher-generation fixture for\n*9|# `tests/redispatch.rs` (REQ-HAZARD-REDISPATCH-CONTROL-STEAL /\n 10|# REQ-STREAM-OPENER-DURABLE / REQ-DISPATCH-CLAIM-RETRY): the REAL\n 11|# `run_dispatch_loop` as a KILLABLE child process — a killed generation drops\n 12|# its workers' broker conns exactly like a production brain death. Same\n\n## src/\n### brain.rs\n 1446|\n*1447|    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A).\n 1448|    /// The dispatcher calls this when a serve loop runs to completion, so no\n 1449|    /// future dispatcher generation rediscovers and replays the stream\n 1450|    /// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker\n...\n 1452|    /// broker to cycle onto the new binary).\n*1453|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 1454|    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n 1455|        self.send(\n 1456|            KIND_NET_STREAM_RETIRE,\n### broker.rs\n 49|use crate::codec::read_frame;\n*50|use crate::conn::{BrokerConn, ConnWrite};\n 51|use crate::effect::{EffectJournal, EffectKey, EffectKind, Minter, Outcome};\n 52|use crate::frame::{Envelope, Role};\n 53|use crate::msg::{\n...\n 79|/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw\n*80|/// `Arc<Mutex<SendHalf>>` — [`BrokerConn`] owns the half and every write is\n 81|/// bounded + cancelable + poison-on-failure (see [`crate::conn`]). Identity\n 82|/// matching stays `Arc::ptr_eq`.\n*83|pub(crate) type SharedSend = Arc<BrokerConn>;\n 84|\n 85|/// Default bounded output-log depth (chunks). Large enough that a brain restart\n 86|/// window never evicts unreplayed output in practice; the bound is what keeps a\n...\n 2832|    /// whose writer thread only drains its channel (it NEVER calls\n*2833|    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical\n 2834|    /// bound cannot clear the injected wedge). Lets an integration rig\n 2835|    /// exercise the REQ-UPDATE-PROMOTE-DRAINED gate DECISION in isolation —\n 2836|    /// the physical bound itself is `brain_decouple.rs`'s concern. The wedge\n...\n 2874|        let (_recv, send_half) = server.split();\n*2875|        let send: SharedSend = Arc::new(BrokerConn::new(send_half, brain_write_deadline()));\n 2876|        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n 2877|        // Drain-forever (never a socket write, never finishes while tx lives):\n 2878|        // stays un-reapable as a live-but-wedged writer even under child output.\n...\n 3041|        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*3042|        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n 3043|        // Base attribution fact (F-039 leg b): broker clients are brains; role\n 3044|        // facts (controller/viewer/presence/stream subscriber) accrete at the\n 3045|        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n...\n 4378|\n*4379|    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A):\n 4380|    /// the dispatcher reports a serve loop that ran to completion, and the row\n 4381|    /// leaves the table so no future dispatcher generation can rediscover and\n 4382|    /// replay it (the KNOWN-HAZARDS 7.41 control-steal class).\n*4383|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 4384|    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n 4385|        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n 4386|            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4387|        let host = self.net.get().ok_or(\"net disabled\")?;\n*4388|        let removed = host.retire_stream(req.stream_id);\n 4389|        let frame = Envelope::new(\n 4390|            KIND_NET_STREAM_RETIRED,\n 4391|            serde_json::to_value(NetStreamRetired {\n...\n 5589|        (\n*5590|            Arc::new(BrokerConn::new(send, brain_write_deadline())),\n 5591|            client,\n 5592|            recv,\n 5593|        )\n...\n 5709|    /// stale Request — an UNFINISHED backlog row whose viewport died raw, the\n*5710|    /// shape finished-row retirement cannot see — carries an OLDER generation\n 5711|    /// than the live replacement controller and must be REFUSED busy, never\n 5712|    /// silently steal the slot. `0` on either side keeps the N-1/local legacy\n 5713|    /// re-take (a legacy peer must not be locked out).\n### conn.rs\n 19|//!\n*20|//! [`BrokerConn`] owns the send half outright — it never leaves this module,\n 21|//! so an unbounded bypass write cannot compile. Every write:\n 22|//!\n 23|//! 1. acquires the serialized write GATE with a bounded wait (an ABSOLUTE\n...\n 73|/// Stable per-physical-conn identity mint — a monotonic u64 stamped at\n*74|/// [`BrokerConn::new`]. Before this the only conn identity was `Arc::ptr_eq`,\n 75|/// which does not survive a log line: per-line CONN_WRITE_POISONED churn was\n 76|/// UNDECIDABLE between fresh-carrier churn and stderr interleave (the F-039\n 77|/// RCA's terminal fork). Every lifecycle record carries `conn=<id>`.\n...\n 134|    inflight: Option<(u64, Instant)>,\n*135|    /// Raised by [`BrokerConn::drop`]; the watchdog exits.\n 136|    shutdown: bool,\n 137|}\n 138|\n*139|/// The state shared with the watchdog thread (no `Arc<BrokerConn>` cycle —\n 140|/// the watchdog must not keep the conn alive).\n 141|struct Inner {\n 142|    /// Stable per-physical-conn id ([`CONN_ID_SEQ`]) — on every lifecycle record.\n...\n 144|    /// Accreted attribution facts (subscriber role, endpoint/session where\n*145|    /// known — [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].\n 146|    label: Mutex<String>,\n 147|    /// Latch: the once-per-conn `write-start` lifecycle record fired.\n 148|    first_write_logged: AtomicBool,\n...\n 164|    /// A retired (poisoned) half parks here so its OS handle stays alive\n*165|    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\n 166|    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\n 167|    graveyard: Mutex<Option<SendHalf>>,\n 168|    /// Monotonic per-write op identity (the watchdog cancels a SPECIFIC op).\n...\n 266|    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n*267|    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n 268|    /// timeout/cancel leg is the retirement record itself.\n 269|    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 270|    fn lifecycle(&self, event: &str, extra: &str) {\n...\n 414|/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\n*415|pub(crate) struct BrokerConn {\n 416|    inner: Arc<Inner>,\n 417|    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n 418|    /// watchdog aborts through strictly outlives every raw use.\n...\n 421|\n*422|impl BrokerConn {\n 423|    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n 424|    /// deadline (gate-wait + OS write completion) — the broker passes its\n 425|    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n...\n 448|        let dog = thread::Builder::new()\n*449|            .name(\"conn-watchdog\".into())\n 450|            .spawn(move || dog_inner.watchdog())\n 451|            .ok();\n*452|        BrokerConn { inner, dog }\n 453|    }\n 454|\n 455|    /// The stable per-physical-conn id — what lifecycle records key on\n...\n 624|#[cfg(test)]\n*625|impl BrokerConn {\n 626|    /// Check the half out of the gate without arming the watchdog — writers\n 627|    /// queue behind the gate (bounded by their own deadlines) until the\n 628|    /// returned pin drops. Test-only; never a production path.\n...\n 638|\n*639|impl Drop for BrokerConn {\n 640|    fn drop(&mut self) {\n 641|        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n 642|        // is about to close — the terminal record of this conn id's life, with\n...\n 689|    /// it to force an ORGANIC write failure.\n*690|    fn make_conn() -> (BrokerConn, Stream) {\n 691|        static SEQ: AtomicU32 = AtomicU32::new(0);\n 692|        let name = format!(\n 693|            \"spt-daemon-connattr-{}-{}.sock\",\n...\n 701|        (\n*702|            BrokerConn::new(send, Duration::from_millis(2000)),\n 703|            client,\n 704|        )\n 705|    }\n### dispatch.rs\n 347|/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n*348|/// redispatch — retire unserved, never replay?\n 349|///\n 350|/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n 351|/// would be a regression: the request/reply families FIN their send WITH the\n...\n 364|/// else = a pending request — serve it.\n*365|// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*366|// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\n 367|fn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {\n 368|    finished && family == StreamFamily::Attach\n 369|}\n...\n 504|                if let DispatchOutcome::Served(detail) = &outcome {\n*505|                    // Retirement (ADR-0038 A, REQ-REDISPATCH-FINISHED-RETIRE):\n 506|                    // this stream's exchange is over — take its row out of\n 507|                    // every FUTURE dispatcher generation's enumeration (the\n 508|                    // KNOWN-HAZARDS 7.41 control-steal class). Best-effort:\n...\n 517|                    // AND zero its doubling ladder mid-wedge. A real serve\n*518|                    // (including a finished-attach retirement) resets.\n 519|                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n 520|                    if !detail.contains(\"terminal pre-serve\") {\n 521|                        breaker_done.lock().unwrap().reset();\n...\n 581|\n*582|/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream\n 583|/// table claims at most this many rows per poll tick.\n 584|const MAX_DISPATCH_WORKERS: usize = 8;\n 585|\n...\n 777|        return WorkerReport {\n*778|            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n 779|            family: Some(family),\n 780|            endpoint,\n 781|        };\n...\n 1526|\n*1527|    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] the lifecycle+family\n 1528|    // discriminator (gate round 1): a finished ATTACH is terminal for\n*1529|    // redispatch (the operator detached — replay = the 7.41 controller\n 1530|    // steal), while a finished REQUEST/REPLY stream is NOT — sync and update\n 1531|    // requesters FIN their send WITH the request (sync.rs request_sync /\n 1532|    // propagate.rs fetch_update) and await the reply, so a bare finished\n### msg.rs\n 152|/// the caller treats retire as best-effort).\n*153|// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 154|pub const KIND_NET_STREAM_RETIRE: &str = \"net-stream-retire\";\n 155|/// Broker→brain: the retire ack (`removed` = a row actually left the table).\n 156|pub const KIND_NET_STREAM_RETIRED: &str = \"net-stream-retired\";\n...\n 820|pub struct NetStreamRetireReq {\n*821|    /// The completed stream to retire from redispatch eligibility.\n 822|    pub stream_id: u64,\n 823|}\n 824|\n### nethost.rs\n 153|// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n*154|struct SubscriberSeat {\n 155|    sub: SharedSend,\n 156|    tx: std::sync::mpsc::SyncSender<Envelope>,\n 157|    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n...\n 164|\n*165|impl SubscriberSeat {\n 166|    /// Install a seat: spawn its writer thread and hand back the handle.\n 167|    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n 168|    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n...\n 188|        lease: Option<Arc<StreamLease>>,\n*189|    ) -> SubscriberSeat {\n 190|        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n 191|        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n 192|        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n...\n 221|        });\n*222|        SubscriberSeat {\n 223|            sub,\n 224|            tx,\n 225|            done,\n...\n 350|    /// under this log's mutex.\n*351|    subscriber: Option<SubscriberSeat>,\n 352|    /// The stream's serve lease (Amendment fix 4): canceled on subscriber\n 353|    /// POISON so the paired serve/wire worker's sends refuse.\n 354|    lease: Arc<StreamLease>,\n...\n 508|    /// replay-then-live seq order is structural (see\n*509|    /// [`SubscriberSeat::install`]), while every conn write still happens\n 510|    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n 511|    /// under the lock with discarded write errors, the exact serial-poison\n 512|    /// engine of the v0.34 field stalls). Returns the replay frame count.\n...\n 569|        let replay_len = replay.len();\n*570|        self.subscriber = Some(SubscriberSeat::install(\n 571|            sub,\n 572|            replay,\n 573|            Some(Arc::clone(&self.lease)),\n...\n 601|    /// Amendment fixes 2+3 — the PresenceLog mirrors ride the same change).\n*602|    subscriber: Option<SubscriberSeat>,\n 603|}\n 604|\n 605|impl PresenceLog {\n...\n 716|        // No lease on the presence channel (it has no paired serve leg).\n*717|        self.subscriber = Some(SubscriberSeat::install(sub, replay, None));\n 718|        Ok(replay_len)\n 719|    }\n 720|\n...\n 798|    /// is load-bearing; physical teardown belongs to the conn-close sweep only.\n*799|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 800|    retired: std::sync::atomic::AtomicBool,\n 801|}\n 802|\n...\n 961|        // else reads a dead conn's stream ring.\n*962|        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 963|        sh_close\n 964|            .streams\n 965|            .lock()\n...\n 1834|    /// call newly retired the row (idempotent; absent row = false).\n*1835|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1836|    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1837|        let Some(entry) = self\n 1838|            .shared\n 1839|            .streams\n...\n 2385|\n*2386|    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] retirement hides EXACTLY the\n 2387|    // named row from dispatch eligibility: the retired stream leaves the\n 2388|    // dispatch enumeration (stream_infos) while the active sibling stays\n 2389|    // claimable, a second retire is a no-op, and the pinned-opener query\n...\n 2413|\n*2414|        assert!(host.retire_stream(shell), \"first retire hides the row\");\n 2415|        let ids: Vec<u64> = host.stream_infos().iter().map(|s| s.stream_id).collect();\n 2416|        assert!(!ids.contains(&shell), \"retired row left the enumeration\");\n 2417|        assert!(ids.contains(&owner), \"the active sibling row stays\");\n*2418|        assert!(!host.retire_stream(shell), \"second retire is a no-op\");\n 2419|        assert!(\n 2420|            host.stream_opener(shell).is_none(),\n 2421|            \"a retired stream answers no-such-stream\"\n...\n 2424|\n*2425|    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] retirement never severs the\n 2426|    // transport: a reply sent AFTER the row was retired still flushes to the\n 2427|    // peer. This is the field race's lost ordering made deterministic — the\n 2428|    // worker's reply send is fire-and-forget (brain returns before the broker\n...\n 2447|        // Retire FIRST — the ordering the race loses in the field.\n*2448|        assert!(host.retire_stream(shell), \"retire the serving row\");\n 2449|\n 2450|        // The worker's reply lands AFTER retirement and must still deliver.\n 2451|        host.send_stream(shell, b\"{\\\"kind\\\":\\\"reply\\\",\\\"outcome\\\":\\\"edge\\\"}\\n\", true)\n...\n 2470|\n*2471|    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] a dead CONNECTION retires its\n 2472|    // stream rows with it: the closed-watcher sweep leaves nothing for a\n 2473|    // future dispatcher generation to replay on a transport that can never\n 2474|    // serve again (the field bug's historical-rows-forever half).\n...\n 2535|        (\n*2536|            Arc::new(crate::conn::BrokerConn::new(send, bound)),\n 2537|            client,\n 2538|            recv,\n 2539|        )\n\n## tests/\n### brain_resume_conn_deadlock.rs\n 256|/// which went stale after the r4 Option-C fix bounded every physical-conn write (the\n*257|/// `BrokerConn` watchdog retires a blocked write at `brain_write_deadline()`), so a\n 258|/// non-draining subscriber no longer starves the heartbeat to ~0 and the timing-based\n 259|/// proof was invalidated — it failed REAL on kitsubito Linux CI (\"worst completed 10\").\n 260|/// doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md` (2026-07-10). The two\n### inject_control_wedge.rs\n 522|        std::env::set_var(\"SPT_HOME\", dir.path());\n*523|        // F-036 env-inheritance scrub (doyle RCA, REDISPATCH-STALL gate round\n 524|        // 1): a live-agent dev shell exports SPT_INJECT_VERIFY_ECHO, the\n 525|        // in-process test broker inherits it, Layer-2 echo-verify force-\n 526|        // enables host-wide, and the mock PTY children here never re-render\n### redispatch.rs\n*1|//! REDISPATCH-TRUTH W1 — the three production-path regressions (ADR-0038 D,\n 2|//! KNOWN-HAZARDS 7.41): every leg drives the REAL\n 3|//! `dispatch::run_dispatch_loop` (as a killable `dispatch_fixture` child —\n 4|//! a dispatcher GENERATION whose death drops its workers' broker conns\n...\n 211|\n*212|// [int->REQ-HAZARD-REDISPATCH-CONTROL-STEAL] D1 — the field bug, end to end\n 213|// through PRODUCTION rediscovery: a finished historical Attach and a current\n 214|// active Attach on the same endpoint/origin; only the dispatcher generation\n 215|// restarts. The historical stream must neither take nor clear the current\n...\n 219|// and the retired row is GONE from the broker's enumeration\n*220|// (REQ-REDISPATCH-FINISHED-RETIRE observed at the seam that matters).\n 221|#[test]\n 222|fn finished_historical_attach_neither_takes_nor_clears_current_controller() {\n 223|    init_home();\n...\n 255|    while peer_stream_ids(&mut probe).contains(&s1_a) {\n*256|        assert!(Instant::now() < end, \"the finished attach row never retired from the table\");\n 257|        thread::sleep(Duration::from_millis(50));\n 258|    }\n 259|\n...\n 302|\n*303|// [int->REQ-HAZARD-REDISPATCH-CONTROL-STEAL] D1b (gate round 1) — the\n*304|// finished-UNRETIRED orderings the Served-report path can never see: the\n 305|// pre-existing backlog and the brain-down-detach window. s1 is attached and\n 306|// driven under gen1, gen1 is KILLED mid-serve (no Served report), THEN the\n 307|// operator detaches (the row finishes with no dispatcher alive; the conn\n 308|// stays open, so the conn-close sweep does not fire either). gen2 starts and\n*309|// serves a fresh current attach: the finished s1 row must be retired\n 310|// UNSERVED (the family-aware terminal check — pre-fix, the pinned opener\n 311|// made this replay PERFECTLY: seeded attach_as steals the current\n 312|// controller, replayed input re-types, replayed EOF clears). The current\n...\n 315|// ever being served (retire-on-sight drains the backlog).\n*316|// [int->REQ-REDISPATCH-FINISHED-RETIRE]\n 317|#[test]\n*318|fn finished_unretired_attach_is_skipped_and_drained_not_replayed() {\n 319|    init_home();\n 320|    let dir = tempfile::tempdir().expect(\"tempdir\");\n 321|    let (name_a, name_b) = (unique_name(), unique_name());\n...\n 399|        while peer_stream_ids(&mut probe).contains(&s1_a) {\n*400|            assert!(Instant::now() < end, \"the finished-unretired row never drained from the table\");\n 401|            thread::sleep(Duration::from_millis(50));\n 402|        }\n 403|    }\n...\n 406|        !gen2_log.contains(&format!(\"DISPATCH:{s1_a}:\")),\n*407|        \"gen2 replayed the finished-unretired stream {s1_a}: {gen2_log}\"\n 408|    );\n 409|\n 410|    gen2.kill();\n...\n 413|\n*414|// [int->REQ-REDISPATCH-FINISHED-RETIRE] the GUARD leg for the family-aware\n 415|// discriminator (gate round 1 counter-check): a request/reply stream reads\n 416|// `finished=true` the moment its requester FINs with the request — sync's\n 417|// `request_sync` does exactly that — so a finished row must NOT be blanket-\n### redispatch_stall.rs\n*1|//! REDISPATCH-STALL W1 — the seven-leg production-path matrix (ADR-0038\n*2|//! Amendment, KNOWN-HAZARDS 7.43, docs/REDISPATCH-STALL-TRIAGE.md): the v0.34\n 3|//! field stalls (20-30s PTY/RC freezes, 17-62s DISPATCH tails) were claim\n 4|//! retries × the broad `Err(_)` opener fallback manufacturing throwaway peek\n 5|//! subscribers whose `StreamLog::attach` replayed the whole ring UNDER the\n...\n 23|//!   - T6 `stale_unfinished_attach_...`: an UNFINISHED-stale attach row\n*24|//!     (raw-close viewport, no FIN — the shape finished-row retirement cannot\n 25|//!     see) replayed by a fresh generation neither takes nor clears the live\n 26|//!     replacement controller (ownership/generation validation).\n 27|//!   - T7 `old_broker_fallback_...`: mixed-image N-1 with REAL\n...\n 31|//!\n*32|//! Binding: redispatch D1/D1b stay green every leg (run the `redispatch`\n 33|//! binary alongside — the retire/steal regressions are substrate).\n 34|//!\n 35|//! HEAVY AT BIRTH (FLAKE-LEDGER #15): every test spins real hermetic QUIC\n...\n 122|\n*123|/// One REAL dispatcher generation (the redispatch.rs harness): the\n 124|/// `dispatch_fixture` child running production `run_dispatch_loop`. Killed =\n 125|/// brain death. Stderr lands in `log`.\n 126|struct Generation {\n...\n 167|\n*168|/// Render the operator's viewport until `needle` appears (the redispatch.rs\n 169|/// helper, verbatim). Returns whether an EOF for the stream arrived.\n 170|fn render_until(\n 171|    operator: &mut Brain,\n...\n 308|\n*309|// [int->REQ-HAZARD-REDISPATCH-STALL]\n 310|// [int->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n 311|// T1 (poisoned-replay halt) + T3 (producer latency flat), one incident on the\n 312|// production broker subscribe path: a REAL subscriber conn that attaches with\n...\n 642|// died raw with no FIN (its brain generation was killed mid-serve), which\n*643|// finished-row retirement (D1/D1b) definitionally cannot see — plus a LIVE\n 644|// replacement controller from the same operator identity on the same\n 645|// session. The fresh dispatcher generation replays BOTH rows; the stale\n 646|// row's replayed Request carries an OLDER attach generation than the\n...\n 683|    // The raw-close: kill gen1 mid-serve. NO detach follows — s1 stays\n*684|    // UNFINISHED (and unretired) on a live conn: invisible to the\n*685|    // finished-row discriminator, eligible for redispatch.\n 686|    gen1.kill();\n 687|    {\n 688|        // Sanity: the row is genuinely unfinished (the T6 precondition that\n*689|        // separates this from D1b's finished-unretired shape).\n 690|        let rows = probe.net_streams().expect(\"net-streams\").streams;\n 691|        let row = rows.iter().find(|s| s.stream_id == s1_a).expect(\"s1 row\");\n 692|        assert!(!row.finished, \"T6 precondition: the stale row must be UNFINISHED\");\n\n### fixtures/\n#### dispatch_fixture.rs\n*1|//! Test-only dispatcher-generation fixture (REDISPATCH-TRUTH D-regressions,\n*2|//! `tests/redispatch.rs`): runs the REAL `dispatch::run_dispatch_loop` against\n 3|//! the named broker, as a child process the test can KILL — a killed\n 4|//! generation drops its workers' broker connections exactly like a production\n 5|//! brain death, which no in-process thread can simulate (a parked serve-loop\n\n[Some lines truncated to 512 chars]"}],"details":{"scopePath":"CHANGELOG.md, docs, crates/spt-daemon","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":124,"fileCount":16,"files":["docs/KNOWN-HAZARDS.md","docs/REDISPATCH-STALL-TRIAGE.md","docs/REDISPATCH-TRUTH-TRIAGE.md","docs/adr/0038-broker-stream-lifecycle-truth.md","crates/spt-daemon/Cargo.toml","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/msg.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/tests/brain_resume_conn_deadlock.rs","crates/spt-daemon/tests/fixtures/dispatch_fixture.rs","crates/spt-daemon/tests/inject_control_wedge.rs","crates/spt-daemon/tests/redispatch.rs","crates/spt-daemon/tests/redispatch_stall.rs"],"fileMatches":[{"path":"docs/KNOWN-HAZARDS.md","count":10},{"path":"docs/REDISPATCH-STALL-TRIAGE.md","count":6},{"path":"docs/REDISPATCH-TRUTH-TRIAGE.md","count":8},{"path":"docs/adr/0038-broker-stream-lifecycle-truth.md","count":12},{"path":"crates/spt-daemon/Cargo.toml","count":2},{"path":"crates/spt-daemon/src/brain.rs","count":2},{"path":"crates/spt-daemon/src/broker.rs","count":11},{"path":"crates/spt-daemon/src/conn.rs","count":15},{"path":"crates/spt-daemon/src/dispatch.rs","count":9},{"path":"crates/spt-daemon/src/msg.rs","count":2},{"path":"crates/spt-daemon/src/nethost.rs","count":20},{"path":"crates/spt-daemon/tests/brain_resume_conn_deadlock.rs","count":1},{"path":"crates/spt-daemon/tests/fixtures/dispatch_fixture.rs","count":2},{"path":"crates/spt-daemon/tests/inject_control_wedge.rs","count":1},{"path":"crates/spt-daemon/tests/redispatch.rs","count":12},{"path":"crates/spt-daemon/tests/redispatch_stall.rs","count":11}],"truncated":true,"displayContent":"# docs/\n## KNOWN-HAZARDS.md\n 641│- **Invariant:** every write on a physical broker connection rides ONE broker-owned bounded/cancelable framed-write primitive with an **independent out-of-band aborter**. The `SendHalf` never leaves the conn object (a bypass cannot compile). An ABSOLUTE deadline stamped at write entry covers BOTH the serialized gate-wait AND OS write completion; a per-conn watchdog fires at that deadline and aborts the in-flight op — never relying on the write returning or on opportunistic stall-evict sampling. On dead...\n*642│- **spt-core mapping:** `spt-daemon/src/conn.rs` `BrokerConn` (Condvar-gated serialized write gate + poisoned state + per-in-flight op id + watchdog + `abort_physical()`: cfg(windows) `CancelIoEx` → completion handshake → `DisconnectNamedPipe` raw kernel32 externs; cfg(unix) `UnixStream::shutdown(Both)`); `broker.rs` `SharedSend = Arc<BrokerConn>` + `controller_writer`/`viewer_writer`/`send_frame`/`send_error` routed; `nethost.rs` stream-log/presence sends routed. int = `brain_decouple.rs` `non_drain...\n 643│- **Source:** UPDATE-WEDGE round-4 (hertz root doc `docs/UPDATE-WEDGE-ROOT-CAUSE.md` @f8596ca; doyle gate ruling `docs/UPDATE-WEDGE-RCA-DISPATCH-todlando.md`; todlando build 2026-07-09). The residual 7.36 left open: logical eviction without physical retirement.\n 644│\n 645│---\n    │...\n 664│\n*665│### 7.41 A fresh dispatcher must NEVER re-serve a terminal stream — historical replay must not steal or clear a live controller  `[REQ-HAZARD-REDISPATCH-CONTROL-STEAL]`\n*666│<!-- [doc->REQ-HAZARD-REDISPATCH-CONTROL-STEAL] -->\n 667│- **Failure (paid-for, hertz field RCA 2026-07-16 — 4/5 endpoints frozen, twice in one day):** every brain cycle (`spt daemon refresh`, `spt update` apply — same `applyhost.rs` path) launches a fresh `dispatch::run_dispatch_loop` whose EMPTY per-process `claimed` set enumerates every broker-held peer stream. `NetShared.streams` has NO removal path (`StreamLog::finish` only marks) and the claim condition has no finished filter → the fresh dispatcher replays FINISHED historical attach streams. A repl...\n*668│- **Invariant:** redispatch eligibility is LIFECYCLE-gated: a finished/terminal stream row is retired from the dispatcher's enumeration (a fresh dispatcher never re-serves a terminal Attach); classification identity is restart-durable and independent of the evictable data ring (immutable opener fact pinned per stream until close); claims are retryable on transient worker-setup failure and terminal on terminal outcomes (no hot-loop). The legitimate same-`by` successor re-take after a brain restart still s...\n 669│- **spt-core mapping:** `spt-daemon/src/dispatch.rs` `run_dispatch_loop` claim condition + `peek_first_line` classification + worker spawn; `spt-daemon/src/nethost.rs` `NetShared.streams` insert/finish + `DEFAULT_STREAM_RING_CHUNKS`; `spt-daemon/src/applyhost.rs` (the brain-cycle trigger).\n*670│- **Source:** REDISPATCH-TRUTH W1 (hertz source-level RCA `.claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt`, doyle seam-verified; ADR-0038; distinct from the CLOSED 0.30.x session-cursor resume-steal saga).\n 671│\n 672│---\n 673│\n    │...\n 682│\n*683│### 7.43 One wedged stream subscriber must NEVER stall stream serving — replay halts at the first failed write, a poisoned subscriber is removed, and recovery machinery must not manufacture new replay victims  `[REQ-HAZARD-REDISPATCH-STALL]`\n*684│<!-- [doc->REQ-HAZARD-REDISPATCH-STALL] -->\n 685│- **Failure (paid-for, hertz field RCA 2026-07-16 — live v0.34 boxes, recurrent 20–30s PTY/RC freezes, DISPATCH tails 17–62s):** a COMPOSITION, not one new timer. The dispatcher's retryable claims (500ms/1s ×3) re-drove the opener fallback whose guard arm is a broad `Err(_)` (`dispatch.rs:414` — comment intends old-broker-only; catches transport timeout/EOF/poison), each pass installing a throwaway peek subscriber. `StreamLog::attach` synchronously replays the ENTIRE retained ring under the per-...\n*686│- **Invariant:** subscriber I/O never holds the `StreamLog` mutex (enqueue-under-lock, I/O outside, bounded per-subscriber queue; overflow = detach + resume-from-cursor); replay and fan-out halt at the FIRST failed subscriber write and the failed subscriber is REMOVED (attach + append + finish, all sites, `PresenceLog` mirrors included); the ring-peek fallback fires ONLY on the explicit unsupported-verb/old-broker answer; a deadline-poisoned replay is circuit-broken (global backoff, no reinstall until th...\n 687│- **spt-core mapping:** `spt-daemon/src/nethost.rs` `StreamLog::attach`/`push`/`finish` + `PresenceLog` mirrors + serve/wire worker pairing; `spt-daemon/src/dispatch.rs` `first_line` fallback arm + claim retry/backoff + worker spawn; SharedSend bounded-write deadline (round-4, KH 7.7 kin).\n*688│- **Source:** REDISPATCH-STALL W1 (hertz v0.34 field RCA 2026-07-16, doyle seam-verified same day; ADR-0038 Amendment 2026-07-16; `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`; distinct from `update --restart`'s bounded 30s rc reconnect loop).\n 689│\n 690│---\n 691│\n    │...\n 758│<!-- [doc->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION] -->\n*759│| 7.38 | Every physical broker-conn write bounded + cancelable + poison-on-failure (independent watchdog aborter; poisoned conn never reused; SendHalf never leaves the conn object) | broker `conn.rs` `BrokerConn`, all write sites (`controller_writer`/`viewer_writer`/`send_frame`/nethost), int `brain_decouple.rs` |\n 760│| 7.31 | The Psyche failure budget counts REAL per-event attempts — every bounded per-event turn feeds a consecutive-N budget (default 3), so per-event churn a resident rate-guard was blind to now counts by construction. Fixes hall-bf's ~12/min re-host churn that ran invisibly (boot records weren't ledger boundaries to the old guard) | `lifecycle.rs` `note_turn_outcome`/`psyche_turn_strikes_exhausted` (stamps `psyche_host_error` on exhaustion, no `status` de-stamp), unit synthetic failure-loop trips th...\n 761│<!-- [doc->REQ-HAZARD-THRASH-GUARD-BLIND] -->\n 762│<!-- [doc->REQ-HAZARD-STORE-INIT-RACE] -->\n## REDISPATCH-STALL-TRIAGE.md\n  *1│# REDISPATCH-STALL — wave triage (doyle, 2026-07-16)\n   2│\n  *3│<!-- [doc->REQ-HAZARD-REDISPATCH-STALL] -->\n   4│\n  *5│**Wave:** stop the v0.34 field stalls — REDISPATCH-TRUTH W1's claim retry and\n   6│the broad `Err(_)` opener fallback repeatedly drive `StreamLog::attach`'s\n   7│discard-errors replay-under-mutex into serial 15s subscriber-poison windows\n   8│that compose into 17–62s PTY/RC freezes. Counter-63 fast-follow after\n    │...\n  11│**Canonical RCA:** hertz 2026-07-16, doyle seam-verified the same day; repo\n *12│summary `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`.\n  13│**Decision record:** ADR-0038 **Amendment (2026-07-16)**.\n  14│**Hazard:** KNOWN-HAZARDS 7.43.\n  15│**Field incident:** live v0.34 boxes, recurrent 20–30s freezes, DISPATCH tails\n    │...\n  89│\n *90│**Binding on every leg:** redispatch D1/D1b stay green (the retire/steal\n  91│regressions are substrate, not victims).\n  92│\n  93│**Missing-coverage census (fair, rides the wave):** D3 never poisons an\n    │...\n 141│doyle triaged (this doc) → todlando builds (branch\n*142│`build/redispatch-stall-w1`, all five REQs, flip `required_stages` at build\n 143│start per [[traceable-per-wave-activation]]) → doyle gates (rulings above) →\n 144│deployah releases (counter 63 fast-follow, bump-in-PR, counter from published\n 145│metadata) → hertz field-verify (discriminators above; they own the incident\n## REDISPATCH-TRUTH-TRIAGE.md\n *1│# REDISPATCH-TRUTH — milestone triage (JIT)\n  2│\n  3│> Doyle triage 2026-07-16, dispatched at the v0.33.0 boundary (ranked-first\n  4│> from the hertz same-day RCA; displaces MESH-RECOVERY). Canonical RCA:\n *5│> `.claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt`\n  6│> (hertz source-level, doyle seam-verified same day). Decision record:\n  7│> ADR-0038. Lane: doyle triages → todlando builds → doyle gates → deployah\n  8│> releases → hertz field-verify (they hold the incident logs).\n   │...\n 13│freezes active remote `spt rc` sessions. The PTYs and broker-held QUIC\n*14│streams survive by construction — the freeze is a **production redispatch\n 15│bug** in the fresh brain's stream reconstruction:\n 16│\n 17│1. **Stale replay steals live controllers.** The fresh\n   │...\n 57│Broker stream-table rows gain explicit **lifecycle truth**, and the\n*58│dispatcher redispatches only what is genuinely live:\n 59│\n*60│- **A — finished rows retire from redispatch eligibility.** A fresh\n 61│  dispatcher must never re-serve a terminal Attach request. Retain only the\n 62│  lifecycle state genuinely needed after EOF (presence/log reads); the\n*63│  redispatch enumeration must not see terminal rows.\n 64│- **B — restart-durable opener/classification metadata.** Pin the\n 65│  per-stream immutable opener fact (or the complete first NDJSON record)\n 66│  OUTSIDE the evictable data ring, held until stream close. Recovery\n   │...\n 84│### W1 — the fix cluster (single build wave; todlando)\n*85│- **REQ-HAZARD-REDISPATCH-CONTROL-STEAL** — the invariant (KNOWN-HAZARDS\n 86│  7.41) + regression D1.\n*87│- **REQ-REDISPATCH-FINISHED-RETIRE** — mechanism A.\n 88│- **REQ-STREAM-OPENER-DURABLE** — mechanism B + regression D2.\n 89│- **REQ-DISPATCH-CLAIM-RETRY** — mechanism C + regression D3.\n 90│\n\n## adr/\n### 0038-broker-stream-lifecycle-truth.md\n  *1│# ADR-0038: Broker stream-table lifecycle truth (redispatch eligibility)\n   2│\n  *3│- **Status:** accepted (hertz RCA + doyle seam-verify 2026-07-16, dispatched same day); **amended 2026-07-16 (REDISPATCH-STALL — see Amendment below)**\n  *4│- **Context:** REDISPATCH-TRUTH milestone; RCA `.claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt`\n   5│\n   6│## Context\n   7│\n    │...\n  10│no removal or retirement path exists. Stream *classification* is derived at\n *11│redispatch time by peeking ring seq 0, but the `StreamLog` data ring is\n  12│bounded (4096 transport chunks) and evicts the protocol opener under\n  13│traffic. Dispatcher claims are a per-process one-shot `HashSet` insert\n  14│performed before worker spawn, never cleared or retried.\n    │...\n  26│## Decision\n *27│<!-- [doc->REQ-REDISPATCH-FINISHED-RETIRE] -->\n  28│\n *29│Stream rows carry explicit **lifecycle truth**, and redispatch consumes it:\n  30│\n *31│1. **Finished is terminal for redispatch.** A finished/terminal stream row\n *32│   is retired from redispatch eligibility (removed from the enumeration the\n  33│   dispatcher claims from, or excluded by lifecycle state). Only the\n  34│   post-EOF state genuinely needed by other readers (presence, log reads)\n  35│   survives. A fresh dispatcher never re-serves a terminal Attach.\n    │...\n  72│\n *73│## Amendment — REDISPATCH-STALL (2026-07-16)\n  74│<!-- [doc->REQ-DISPATCH-FALLBACK-CIRCUIT] -->\n  75│<!-- [doc->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE] -->\n  76│<!-- [doc->REQ-SERVE-OWNERSHIP-GENERATION] -->\n    │...\n  80│  day, both hours apart); RCA summary\n *81│  `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`; hazard\n *82│  KNOWN-HAZARDS 7.43; build shape `docs/REDISPATCH-STALL-TRIAGE.md`.\n  83│\n  84│The W1 machinery this ADR shipped is field-correct on its own terms (D1/D1b\n  85│hold: finished rows never serve) but two of its legs COMPOSE into a stall\n    │...\n 121│   retirement cannot see.\n*122│6. **(new — dispatcher hygiene + telemetry)** The redispatch worker pool is\n 123│   bounded with batched cold enumeration and NO claim/sessions locks held\n 124│   across I/O (clone-then-drop before `detach_if`/`info.json` writes, KH 7.12\n 125│   kin); dispatch telemetry is keyed per\n\n# crates/spt-daemon/\n## Cargo.toml\n  7│\n *8│# Test-only REDISPATCH-TRUTH dispatcher-generation fixture for\n *9│# `tests/redispatch.rs` (REQ-HAZARD-REDISPATCH-CONTROL-STEAL /\n 10│# REQ-STREAM-OPENER-DURABLE / REQ-DISPATCH-CLAIM-RETRY): the REAL\n 11│# `run_dispatch_loop` as a KILLABLE child process — a killed generation drops\n 12│# its workers' broker conns exactly like a production brain death. Same\n\n## src/\n### brain.rs\n 1446│\n*1447│    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A).\n 1448│    /// The dispatcher calls this when a serve loop runs to completion, so no\n 1449│    /// future dispatcher generation rediscovers and replays the stream\n 1450│    /// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker\n     │...\n 1452│    /// broker to cycle onto the new binary).\n*1453│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 1454│    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n 1455│        self.send(\n 1456│            KIND_NET_STREAM_RETIRE,\n### broker.rs\n   49│use crate::codec::read_frame;\n  *50│use crate::conn::{BrokerConn, ConnWrite};\n   51│use crate::effect::{EffectJournal, EffectKey, EffectKind, Minter, Outcome};\n   52│use crate::frame::{Envelope, Role};\n   53│use crate::msg::{\n     │...\n   79│/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw\n  *80│/// `Arc<Mutex<SendHalf>>` — [`BrokerConn`] owns the half and every write is\n   81│/// bounded + cancelable + poison-on-failure (see [`crate::conn`]). Identity\n   82│/// matching stays `Arc::ptr_eq`.\n  *83│pub(crate) type SharedSend = Arc<BrokerConn>;\n   84│\n   85│/// Default bounded output-log depth (chunks). Large enough that a brain restart\n   86│/// window never evicts unreplayed output in practice; the bound is what keeps a\n     │...\n 2832│    /// whose writer thread only drains its channel (it NEVER calls\n*2833│    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical\n 2834│    /// bound cannot clear the injected wedge). Lets an integration rig\n 2835│    /// exercise the REQ-UPDATE-PROMOTE-DRAINED gate DECISION in isolation —\n 2836│    /// the physical bound itself is `brain_decouple.rs`'s concern. The wedge\n     │...\n 2874│        let (_recv, send_half) = server.split();\n*2875│        let send: SharedSend = Arc::new(BrokerConn::new(send_half, brain_write_deadline()));\n 2876│        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n 2877│        // Drain-forever (never a socket write, never finishes while tx lives):\n 2878│        // stays un-reapable as a live-but-wedged writer even under child output.\n     │...\n 3041│        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*3042│        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n 3043│        // Base attribution fact (F-039 leg b): broker clients are brains; role\n 3044│        // facts (controller/viewer/presence/stream subscriber) accrete at the\n 3045│        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 4378│\n*4379│    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A):\n 4380│    /// the dispatcher reports a serve loop that ran to completion, and the row\n 4381│    /// leaves the table so no future dispatcher generation can rediscover and\n 4382│    /// replay it (the KNOWN-HAZARDS 7.41 control-steal class).\n*4383│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 4384│    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n 4385│        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n 4386│            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4387│        let host = self.net.get().ok_or(\"net disabled\")?;\n*4388│        let removed = host.retire_stream(req.stream_id);\n 4389│        let frame = Envelope::new(\n 4390│            KIND_NET_STREAM_RETIRED,\n 4391│            serde_json::to_value(NetStreamRetired {\n     │...\n 5589│        (\n*5590│            Arc::new(BrokerConn::new(send, brain_write_deadline())),\n 5591│            client,\n 5592│            recv,\n 5593│        )\n     │...\n 5709│    /// stale Request — an UNFINISHED backlog row whose viewport died raw, the\n*5710│    /// shape finished-row retirement cannot see — carries an OLDER generation\n 5711│    /// than the live replacement controller and must be REFUSED busy, never\n 5712│    /// silently steal the slot. `0` on either side keeps the N-1/local legacy\n 5713│    /// re-take (a legacy peer must not be locked out).\n### conn.rs\n  19│//!\n *20│//! [`BrokerConn`] owns the send half outright — it never leaves this module,\n  21│//! so an unbounded bypass write cannot compile. Every write:\n  22│//!\n  23│//! 1. acquires the serialized write GATE with a bounded wait (an ABSOLUTE\n    │...\n  73│/// Stable per-physical-conn identity mint — a monotonic u64 stamped at\n *74│/// [`BrokerConn::new`]. Before this the only conn identity was `Arc::ptr_eq`,\n  75│/// which does not survive a log line: per-line CONN_WRITE_POISONED churn was\n  76│/// UNDECIDABLE between fresh-carrier churn and stderr interleave (the F-039\n  77│/// RCA's terminal fork). Every lifecycle record carries `conn=<id>`.\n    │...\n 134│    inflight: Option<(u64, Instant)>,\n*135│    /// Raised by [`BrokerConn::drop`]; the watchdog exits.\n 136│    shutdown: bool,\n 137│}\n 138│\n*139│/// The state shared with the watchdog thread (no `Arc<BrokerConn>` cycle —\n 140│/// the watchdog must not keep the conn alive).\n 141│struct Inner {\n 142│    /// Stable per-physical-conn id ([`CONN_ID_SEQ`]) — on every lifecycle record.\n    │...\n 144│    /// Accreted attribution facts (subscriber role, endpoint/session where\n*145│    /// known — [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].\n 146│    label: Mutex<String>,\n 147│    /// Latch: the once-per-conn `write-start` lifecycle record fired.\n 148│    first_write_logged: AtomicBool,\n    │...\n 164│    /// A retired (poisoned) half parks here so its OS handle stays alive\n*165│    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\n 166│    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\n 167│    graveyard: Mutex<Option<SendHalf>>,\n 168│    /// Monotonic per-write op identity (the watchdog cancels a SPECIFIC op).\n    │...\n 266│    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n*267│    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n 268│    /// timeout/cancel leg is the retirement record itself.\n 269│    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 270│    fn lifecycle(&self, event: &str, extra: &str) {\n    │...\n 414│/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\n*415│pub(crate) struct BrokerConn {\n 416│    inner: Arc<Inner>,\n 417│    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n 418│    /// watchdog aborts through strictly outlives every raw use.\n    │...\n 421│\n*422│impl BrokerConn {\n 423│    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n 424│    /// deadline (gate-wait + OS write completion) — the broker passes its\n 425│    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n    │...\n 448│        let dog = thread::Builder::new()\n*449│            .name(\"conn-watchdog\".into())\n 450│            .spawn(move || dog_inner.watchdog())\n 451│            .ok();\n*452│        BrokerConn { inner, dog }\n 453│    }\n 454│\n 455│    /// The stable per-physical-conn id — what lifecycle records key on\n    │...\n 624│#[cfg(test)]\n*625│impl BrokerConn {\n 626│    /// Check the half out of the gate without arming the watchdog — writers\n 627│    /// queue behind the gate (bounded by their own deadlines) until the\n 628│    /// returned pin drops. Test-only; never a production path.\n    │...\n 638│\n*639│impl Drop for BrokerConn {\n 640│    fn drop(&mut self) {\n 641│        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n 642│        // is about to close — the terminal record of this conn id's life, with\n    │...\n 689│    /// it to force an ORGANIC write failure.\n*690│    fn make_conn() -> (BrokerConn, Stream) {\n 691│        static SEQ: AtomicU32 = AtomicU32::new(0);\n 692│        let name = format!(\n 693│            \"spt-daemon-connattr-{}-{}.sock\",\n    │...\n 701│        (\n*702│            BrokerConn::new(send, Duration::from_millis(2000)),\n 703│            client,\n 704│        )\n 705│    }\n### dispatch.rs\n  347│/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n *348│/// redispatch — retire unserved, never replay?\n  349│///\n  350│/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n  351│/// would be a regression: the request/reply families FIN their send WITH the\n     │...\n  364│/// else = a pending request — serve it.\n *365│// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n *366│// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\n  367│fn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {\n  368│    finished && family == StreamFamily::Attach\n  369│}\n     │...\n  504│                if let DispatchOutcome::Served(detail) = &outcome {\n *505│                    // Retirement (ADR-0038 A, REQ-REDISPATCH-FINISHED-RETIRE):\n  506│                    // this stream's exchange is over — take its row out of\n  507│                    // every FUTURE dispatcher generation's enumeration (the\n  508│                    // KNOWN-HAZARDS 7.41 control-steal class). Best-effort:\n     │...\n  517│                    // AND zero its doubling ladder mid-wedge. A real serve\n *518│                    // (including a finished-attach retirement) resets.\n  519│                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n  520│                    if !detail.contains(\"terminal pre-serve\") {\n  521│                        breaker_done.lock().unwrap().reset();\n     │...\n  581│\n *582│/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream\n  583│/// table claims at most this many rows per poll tick.\n  584│const MAX_DISPATCH_WORKERS: usize = 8;\n  585│\n     │...\n  777│        return WorkerReport {\n *778│            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n  779│            family: Some(family),\n  780│            endpoint,\n  781│        };\n     │...\n 1526│\n*1527│    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] the lifecycle+family\n 1528│    // discriminator (gate round 1): a finished ATTACH is terminal for\n*1529│    // redispatch (the operator detached — replay = the 7.41 controller\n 1530│    // steal), while a finished REQUEST/REPLY stream is NOT — sync and update\n 1531│    // requesters FIN their send WITH the request (sync.rs request_sync /\n 1532│    // propagate.rs fetch_update) and await the reply, so a bare finished\n### msg.rs\n 152│/// the caller treats retire as best-effort).\n*153│// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 154│pub const KIND_NET_STREAM_RETIRE: &str = \"net-stream-retire\";\n 155│/// Broker→brain: the retire ack (`removed` = a row actually left the table).\n 156│pub const KIND_NET_STREAM_RETIRED: &str = \"net-stream-retired\";\n    │...\n 820│pub struct NetStreamRetireReq {\n*821│    /// The completed stream to retire from redispatch eligibility.\n 822│    pub stream_id: u64,\n 823│}\n 824│\n### nethost.rs\n  153│// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n *154│struct SubscriberSeat {\n  155│    sub: SharedSend,\n  156│    tx: std::sync::mpsc::SyncSender<Envelope>,\n  157│    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n     │...\n  164│\n *165│impl SubscriberSeat {\n  166│    /// Install a seat: spawn its writer thread and hand back the handle.\n  167│    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n  168│    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n     │...\n  188│        lease: Option<Arc<StreamLease>>,\n *189│    ) -> SubscriberSeat {\n  190│        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n  191│        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n  192│        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n     │...\n  221│        });\n *222│        SubscriberSeat {\n  223│            sub,\n  224│            tx,\n  225│            done,\n     │...\n  350│    /// under this log's mutex.\n *351│    subscriber: Option<SubscriberSeat>,\n  352│    /// The stream's serve lease (Amendment fix 4): canceled on subscriber\n  353│    /// POISON so the paired serve/wire worker's sends refuse.\n  354│    lease: Arc<StreamLease>,\n     │...\n  508│    /// replay-then-live seq order is structural (see\n *509│    /// [`SubscriberSeat::install`]), while every conn write still happens\n  510│    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n  511│    /// under the lock with discarded write errors, the exact serial-poison\n  512│    /// engine of the v0.34 field stalls). Returns the replay frame count.\n     │...\n  569│        let replay_len = replay.len();\n *570│        self.subscriber = Some(SubscriberSeat::install(\n  571│            sub,\n  572│            replay,\n  573│            Some(Arc::clone(&self.lease)),\n     │...\n  601│    /// Amendment fixes 2+3 — the PresenceLog mirrors ride the same change).\n *602│    subscriber: Option<SubscriberSeat>,\n  603│}\n  604│\n  605│impl PresenceLog {\n     │...\n  716│        // No lease on the presence channel (it has no paired serve leg).\n *717│        self.subscriber = Some(SubscriberSeat::install(sub, replay, None));\n  718│        Ok(replay_len)\n  719│    }\n  720│\n     │...\n  798│    /// is load-bearing; physical teardown belongs to the conn-close sweep only.\n *799│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n  800│    retired: std::sync::atomic::AtomicBool,\n  801│}\n  802│\n     │...\n  961│        // else reads a dead conn's stream ring.\n *962│        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n  963│        sh_close\n  964│            .streams\n  965│            .lock()\n     │...\n 1834│    /// call newly retired the row (idempotent; absent row = false).\n*1835│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1836│    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1837│        let Some(entry) = self\n 1838│            .shared\n 1839│            .streams\n     │...\n 2385│\n*2386│    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] retirement hides EXACTLY the\n 2387│    // named row from dispatch eligibility: the retired stream leaves the\n 2388│    // dispatch enumeration (stream_infos) while the active sibling stays\n 2389│    // claimable, a second retire is a no-op, and the pinned-opener query\n     │...\n 2413│\n*2414│        assert!(host.retire_stream(shell), \"first retire hides the row\");\n 2415│        let ids: Vec<u64> = host.stream_infos().iter().map(|s| s.stream_id).collect();\n 2416│        assert!(!ids.contains(&shell), \"retired row left the enumeration\");\n 2417│        assert!(ids.contains(&owner), \"the active sibling row stays\");\n*2418│        assert!(!host.retire_stream(shell), \"second retire is a no-op\");\n 2419│        assert!(\n 2420│            host.stream_opener(shell).is_none(),\n 2421│            \"a retired stream answers no-such-stream\"\n     │...\n 2424│\n*2425│    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] retirement never severs the\n 2426│    // transport: a reply sent AFTER the row was retired still flushes to the\n 2427│    // peer. This is the field race's lost ordering made deterministic — the\n 2428│    // worker's reply send is fire-and-forget (brain returns before the broker\n     │...\n 2447│        // Retire FIRST — the ordering the race loses in the field.\n*2448│        assert!(host.retire_stream(shell), \"retire the serving row\");\n 2449│\n 2450│        // The worker's reply lands AFTER retirement and must still deliver.\n 2451│        host.send_stream(shell, b\"{\\\"kind\\\":\\\"reply\\\",\\\"outcome\\\":\\\"edge\\\"}\\n\", true)\n     │...\n 2470│\n*2471│    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] a dead CONNECTION retires its\n 2472│    // stream rows with it: the closed-watcher sweep leaves nothing for a\n 2473│    // future dispatcher generation to replay on a transport that can never\n 2474│    // serve again (the field bug's historical-rows-forever half).\n     │...\n 2535│        (\n*2536│            Arc::new(crate::conn::BrokerConn::new(send, bound)),\n 2537│            client,\n 2538│            recv,\n 2539│        )\n\n## tests/\n### brain_resume_conn_deadlock.rs\n 256│/// which went stale after the r4 Option-C fix bounded every physical-conn write (the\n*257│/// `BrokerConn` watchdog retires a blocked write at `brain_write_deadline()`), so a\n 258│/// non-draining subscriber no longer starves the heartbeat to ~0 and the timing-based\n 259│/// proof was invalidated — it failed REAL on kitsubito Linux CI (\"worst completed 10\").\n 260│/// doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md` (2026-07-10). The two\n### inject_control_wedge.rs\n 522│        std::env::set_var(\"SPT_HOME\", dir.path());\n*523│        // F-036 env-inheritance scrub (doyle RCA, REDISPATCH-STALL gate round\n 524│        // 1): a live-agent dev shell exports SPT_INJECT_VERIFY_ECHO, the\n 525│        // in-process test broker inherits it, Layer-2 echo-verify force-\n 526│        // enables host-wide, and the mock PTY children here never re-render\n### redispatch.rs\n  *1│//! REDISPATCH-TRUTH W1 — the three production-path regressions (ADR-0038 D,\n   2│//! KNOWN-HAZARDS 7.41): every leg drives the REAL\n   3│//! `dispatch::run_dispatch_loop` (as a killable `dispatch_fixture` child —\n   4│//! a dispatcher GENERATION whose death drops its workers' broker conns\n    │...\n 211│\n*212│// [int->REQ-HAZARD-REDISPATCH-CONTROL-STEAL] D1 — the field bug, end to end\n 213│// through PRODUCTION rediscovery: a finished historical Attach and a current\n 214│// active Attach on the same endpoint/origin; only the dispatcher generation\n 215│// restarts. The historical stream must neither take nor clear the current\n    │...\n 219│// and the retired row is GONE from the broker's enumeration\n*220│// (REQ-REDISPATCH-FINISHED-RETIRE observed at the seam that matters).\n 221│#[test]\n 222│fn finished_historical_attach_neither_takes_nor_clears_current_controller() {\n 223│    init_home();\n    │...\n 255│    while peer_stream_ids(&mut probe).contains(&s1_a) {\n*256│        assert!(Instant::now() < end, \"the finished attach row never retired from the table\");\n 257│        thread::sleep(Duration::from_millis(50));\n 258│    }\n 259│\n    │...\n 302│\n*303│// [int->REQ-HAZARD-REDISPATCH-CONTROL-STEAL] D1b (gate round 1) — the\n*304│// finished-UNRETIRED orderings the Served-report path can never see: the\n 305│// pre-existing backlog and the brain-down-detach window. s1 is attached and\n 306│// driven under gen1, gen1 is KILLED mid-serve (no Served report), THEN the\n 307│// operator detaches (the row finishes with no dispatcher alive; the conn\n 308│// stays open, so the conn-close sweep does not fire either). gen2 starts and\n*309│// serves a fresh current attach: the finished s1 row must be retired\n 310│// UNSERVED (the family-aware terminal check — pre-fix, the pinned opener\n 311│// made this replay PERFECTLY: seeded attach_as steals the current\n 312│// controller, replayed input re-types, replayed EOF clears). The current\n    │...\n 315│// ever being served (retire-on-sight drains the backlog).\n*316│// [int->REQ-REDISPATCH-FINISHED-RETIRE]\n 317│#[test]\n*318│fn finished_unretired_attach_is_skipped_and_drained_not_replayed() {\n 319│    init_home();\n 320│    let dir = tempfile::tempdir().expect(\"tempdir\");\n 321│    let (name_a, name_b) = (unique_name(), unique_name());\n    │...\n 399│        while peer_stream_ids(&mut probe).contains(&s1_a) {\n*400│            assert!(Instant::now() < end, \"the finished-unretired row never drained from the table\");\n 401│            thread::sleep(Duration::from_millis(50));\n 402│        }\n 403│    }\n    │...\n 406│        !gen2_log.contains(&format!(\"DISPATCH:{s1_a}:\")),\n*407│        \"gen2 replayed the finished-unretired stream {s1_a}: {gen2_log}\"\n 408│    );\n 409│\n 410│    gen2.kill();\n    │...\n 413│\n*414│// [int->REQ-REDISPATCH-FINISHED-RETIRE] the GUARD leg for the family-aware\n 415│// discriminator (gate round 1 counter-check): a request/reply stream reads\n 416│// `finished=true` the moment its requester FINs with the request — sync's\n 417│// `request_sync` does exactly that — so a finished row must NOT be blanket-\n### redispatch_stall.rs\n  *1│//! REDISPATCH-STALL W1 — the seven-leg production-path matrix (ADR-0038\n  *2│//! Amendment, KNOWN-HAZARDS 7.43, docs/REDISPATCH-STALL-TRIAGE.md): the v0.34\n   3│//! field stalls (20-30s PTY/RC freezes, 17-62s DISPATCH tails) were claim\n   4│//! retries × the broad `Err(_)` opener fallback manufacturing throwaway peek\n   5│//! subscribers whose `StreamLog::attach` replayed the whole ring UNDER the\n    │...\n  23│//!   - T6 `stale_unfinished_attach_...`: an UNFINISHED-stale attach row\n *24│//!     (raw-close viewport, no FIN — the shape finished-row retirement cannot\n  25│//!     see) replayed by a fresh generation neither takes nor clears the live\n  26│//!     replacement controller (ownership/generation validation).\n  27│//!   - T7 `old_broker_fallback_...`: mixed-image N-1 with REAL\n    │...\n  31│//!\n *32│//! Binding: redispatch D1/D1b stay green every leg (run the `redispatch`\n  33│//! binary alongside — the retire/steal regressions are substrate).\n  34│//!\n  35│//! HEAVY AT BIRTH (FLAKE-LEDGER #15): every test spins real hermetic QUIC\n    │...\n 122│\n*123│/// One REAL dispatcher generation (the redispatch.rs harness): the\n 124│/// `dispatch_fixture` child running production `run_dispatch_loop`. Killed =\n 125│/// brain death. Stderr lands in `log`.\n 126│struct Generation {\n    │...\n 167│\n*168│/// Render the operator's viewport until `needle` appears (the redispatch.rs\n 169│/// helper, verbatim). Returns whether an EOF for the stream arrived.\n 170│fn render_until(\n 171│    operator: &mut Brain,\n    │...\n 308│\n*309│// [int->REQ-HAZARD-REDISPATCH-STALL]\n 310│// [int->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n 311│// T1 (poisoned-replay halt) + T3 (producer latency flat), one incident on the\n 312│// production broker subscribe path: a REAL subscriber conn that attaches with\n    │...\n 642│// died raw with no FIN (its brain generation was killed mid-serve), which\n*643│// finished-row retirement (D1/D1b) definitionally cannot see — plus a LIVE\n 644│// replacement controller from the same operator identity on the same\n 645│// session. The fresh dispatcher generation replays BOTH rows; the stale\n 646│// row's replayed Request carries an OLDER attach generation than the\n    │...\n 683│    // The raw-close: kill gen1 mid-serve. NO detach follows — s1 stays\n*684│    // UNFINISHED (and unretired) on a live conn: invisible to the\n*685│    // finished-row discriminator, eligible for redispatch.\n 686│    gen1.kill();\n 687│    {\n 688│        // Sanity: the row is genuinely unfinished (the T6 precondition that\n*689│        // separates this from D1b's finished-unretired shape).\n 690│        let rows = probe.net_streams().expect(\"net-streams\").streams;\n 691│        let row = rows.iter().find(|s| s.stream_id == s1_a).expect(\"s1 row\");\n 692│        assert!(!row.finished, \"T6 precondition: the stale row must be UNFINISHED\");\n\n### fixtures/\n#### dispatch_fixture.rs\n*1│//! Test-only dispatcher-generation fixture (REDISPATCH-TRUTH D-regressions,\n*2│//! `tests/redispatch.rs`): runs the REAL `dispatch::run_dispatch_loop` against\n 3│//! the named broker, as a child process the test can KILL — a killed\n 4│//! generation drops its workers' broker connections exactly like a production\n 5│//! brain death, which no in-process thread can simulate (a parked serve-loop","linesTruncated":true,"meta":{"limits":{"columnTruncated":{"maxColumn":512}}}},"isError":false,"timestamp":1784271535907}}
{"type":"message","id":"23f126e1","parentId":"b6cb7a25","timestamp":"2026-07-17T06:59:02.368Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Implementing remainder drop semantics**"},{"type":"toolCall","id":"call_TWT89YSKKcSBNKM4UCJqOsyg|fc_0a061eb498f0e908016a59d2b64d148196b732500d0e7f7bc2","name":"read","arguments":{"i":"Reading translation reap semantics","path":"crates/spt-daemon/src/translation.rs","selector":"260-410"}},{"type":"toolCall","id":"call_iOb8FfB3I8yNyYuV3itqF5gh|fc_0a061eb498f0e908016a59d2b64d2c819680ecbc0e59c0d9dd","name":"read","arguments":{"i":"Reading presence seat lifecycle","path":"crates/spt-daemon/src/nethost.rs","selector":"110-235,590-735,1940-2025"}},{"type":"toolCall","id":"call_Lzr38WWyTTFpfOOk3j1nBROZ|fc_0a061eb498f0e908016a59d2b64d34819683cb76f9ad5d286b","name":"read","arguments":{"i":"Reading daemon broker startup threads","path":"crates/spt-daemon/src/daemon.rs","selector":"150-315"}},{"type":"toolCall","id":"call_JiqQgwuYSgL2YGeU6DtC7beY|fc_0a061eb498f0e908016a59d2b64d3c81969c8001c2f790acee","name":"read","arguments":{"i":"Reading broker kill path","path":"crates/spt-daemon/src/broker.rs","selector":"4435-4470"}},{"type":"toolCall","id":"call_yhdJYoQC33wHSVkI7I6Fxhcg|fc_0a061eb498f0e908016a59d2b64d44819694fddf0e7eaa1059","name":"read","arguments":{"i":"Reading redispatch worker bound","path":"crates/spt-daemon/src/dispatch.rs","selector":"470-610"}},{"type":"toolCall","id":"call_f18EmBjfQPRXGMDd6LsI2aI3|fc_0a061eb498f0e908016a59d2b64d4c81968a27ad8d2f5d111c","name":"read","arguments":{"i":"Reading release notes","path":"docs/adr/0038-broker-stream-lifecycle-truth.md","selector":"73-135"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":22365,"output":264,"cacheRead":115200,"cacheWrite":0,"totalTokens":137829,"reasoningTokens":14,"cost":{"input":0.11182500000000001,"output":0.00792,"cacheRead":0.0576,"cacheWrite":0,"total":0.177345}},"stopReason":"toolUse","timestamp":1784271535960,"responseId":"resp_0a061eb498f0e908016a59d2b03a108196abbdf731b25a34f4","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d2b18680819696d6552c42ead3a1","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdK2S88JkOsbCdGFdwAjQpScXRqarrqNBUL3vUfI1Wj6DiZaBWY6D8lezTBzByDOVM7ZUqezuihQKNY0-vOl_OliFtqrfB5-okI7b8IIqfqpfpJBfd4FtsjRhQsd3rz3eM4z3BRchJ_gt6BV-xA5-QeWf9tPBX1kCeX3wpJ6TgUXm2Q_gYCypmlisnLCWv74lUVsl7XZcu97Pt3Z5nNvQWPqZAZKxn1ycQqcotd5nEzl_2b8NZou7O65EyPuy0WalciolcNiVERKAKuVjOrrrMbtPfI4FgDuNtLVkilNxVVCgoVU8FM5hkusPTeJ1hTZVuuITw2W6zCkFWI6wOhimns0TmvibAKrd20hA28qlzVpjKBz9eOe4eWK1PK49pxrkPQe54zSZ5Lvje-eXAqQjyCFRC-CR75ES880Fle4UQLFG8Cc_t6LvJCfgXg_SXVweDlQgtydSJ59HCTdyysx1A2WRpFyH4j2w0Qrr7Auc0P1CKZKtfOU0oHgYqQOCvD3Kv2HKCZSzRPtslfrqxpYWA_ZnOu2G-K9oPym2_Bm-CFpHjdgSd4Y6gtHPq_aVWND-L9Qeu9EO6AxMVGBATB2TOVjcqAuca4HFAMaFouQy4HQlqzPLFwkVEaattokC_Puw5srmHP-x-K5vY1ihvkrUBSMVWgakHUn_7JVro9ngnjQhQnp7w7ywK5UbxkdJ3d0RT-f6aDsxcyPaBtlNZyzvaoAgkJrt-Kd_LUbZ9LgyhFsp9gccfRtR3CE0gX4v3mDAK2Jjbw8uVPrHrE01T5-_C7T7fRj5p7m7F8-mE26-sG4mTaYRj-Hub12q3LJjQQnxtF-RxytI8WWKQxqPVLNXkihGGKIV1ghY6Ot143x9FC2fHFcKbuF_U2ygZK5f56JyHlFFXtK-f5Y4TFyo6RkxPfCy2nmoeE2Y4460X3dqhSIrbdPk1PEn8JmFkl651K1AT_q7al3e7q90mXyUz4eTbcT0A9i8SRf-Ah-_DdqDDuuWjg=","summary":[{"type":"summary_text","text":"**Implementing remainder drop semantics**"}]},{"id":"fc_0a061eb498f0e908016a59d2b64d148196b732500d0e7f7bc2","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading translation reap semantics\",\"path\":\"crates/spt-daemon/src/translation.rs\",\"selector\":\"260-410\"}","call_id":"call_TWT89YSKKcSBNKM4UCJqOsyg","name":"read"},{"id":"fc_0a061eb498f0e908016a59d2b64d2c819680ecbc0e59c0d9dd","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading presence seat lifecycle\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"110-235,590-735,1940-2025\"}","call_id":"call_iOb8FfB3I8yNyYuV3itqF5gh","name":"read"},{"id":"fc_0a061eb498f0e908016a59d2b64d34819683cb76f9ad5d286b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading daemon broker startup threads\",\"path\":\"crates/spt-daemon/src/daemon.rs\",\"selector\":\"150-315\"}","call_id":"call_Lzr38WWyTTFpfOOk3j1nBROZ","name":"read"},{"id":"fc_0a061eb498f0e908016a59d2b64d3c81969c8001c2f790acee","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker kill path\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"4435-4470\"}","call_id":"call_JiqQgwuYSgL2YGeU6DtC7beY","name":"read"},{"id":"fc_0a061eb498f0e908016a59d2b64d44819694fddf0e7eaa1059","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading redispatch worker bound\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"470-610\"}","call_id":"call_yhdJYoQC33wHSVkI7I6Fxhcg","name":"read"},{"id":"fc_0a061eb498f0e908016a59d2b64d4c81968a27ad8d2f5d111c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading release notes\",\"path\":\"docs/adr/0038-broker-stream-lifecycle-truth.md\",\"selector\":\"73-135\"}","call_id":"call_f18EmBjfQPRXGMDd6LsI2aI3","name":"read"}]},"duration":6406.8763999938965,"ttft":1579.8069999963045,"contextSnapshot":{"promptTokens":137565,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_TWT89YSKKcSBNKM4UCJqOsyg|fc_0a061eb498f0e908016a59d2b64d148196b732500d0e7f7bc2","toolName":"read","startedAt":"2026-07-17T06:59:02.369Z","args":{"path":"crates/spt-daemon/src/translation.rs"},"intent":"Reading translation reap semantics"},"id":"a2664921","parentId":"23f126e1","timestamp":"2026-07-17T06:59:02.369Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_iOb8FfB3I8yNyYuV3itqF5gh|fc_0a061eb498f0e908016a59d2b64d2c819680ecbc0e59c0d9dd","toolName":"read","startedAt":"2026-07-17T06:59:02.369Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading presence seat lifecycle"},"id":"9549eb65","parentId":"a2664921","timestamp":"2026-07-17T06:59:02.369Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Lzr38WWyTTFpfOOk3j1nBROZ|fc_0a061eb498f0e908016a59d2b64d34819683cb76f9ad5d286b","toolName":"read","startedAt":"2026-07-17T06:59:02.369Z","args":{"path":"crates/spt-daemon/src/daemon.rs"},"intent":"Reading daemon broker startup threads"},"id":"585ea1f5","parentId":"9549eb65","timestamp":"2026-07-17T06:59:02.369Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_JiqQgwuYSgL2YGeU6DtC7beY|fc_0a061eb498f0e908016a59d2b64d3c81969c8001c2f790acee","toolName":"read","startedAt":"2026-07-17T06:59:02.369Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker kill path"},"id":"19ef4ed8","parentId":"585ea1f5","timestamp":"2026-07-17T06:59:02.369Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_yhdJYoQC33wHSVkI7I6Fxhcg|fc_0a061eb498f0e908016a59d2b64d44819694fddf0e7eaa1059","toolName":"read","startedAt":"2026-07-17T06:59:02.369Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading redispatch worker bound"},"id":"576f575d","parentId":"19ef4ed8","timestamp":"2026-07-17T06:59:02.369Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_f18EmBjfQPRXGMDd6LsI2aI3|fc_0a061eb498f0e908016a59d2b64d4c81968a27ad8d2f5d111c","toolName":"read","startedAt":"2026-07-17T06:59:02.369Z","args":{"path":"docs/adr/0038-broker-stream-lifecycle-truth.md"},"intent":"Reading release notes"},"id":"c074e299","parentId":"576f575d","timestamp":"2026-07-17T06:59:02.369Z"}
{"type":"message","id":"a2ecb283","parentId":"c074e299","timestamp":"2026-07-17T06:59:02.388Z","message":{"role":"toolResult","toolCallId":"call_iOb8FfB3I8yNyYuV3itqF5gh|fc_0a061eb498f0e908016a59d2b64d2c819680ecbc0e59c0d9dd","toolName":"read","content":[{"type":"text","text":"/// unreplayed chunks in practice; bounded so an unsubscribed stream can't\n/// buffer without limit.\nconst DEFAULT_STREAM_RING_CHUNKS: usize = 4096;\n\n/// Max bytes pulled per stream read (one ring chunk).\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\n\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\n/// no newline is not speaking an NDJSON protocol — capture gives up\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\nconst OPENER_PIN_MAX: usize = 64 * 1024;\n\n/// How many frames a subscriber's writer queue holds before the subscriber is\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\n/// is a subscriber problem, never a producer stall — the detached brain\n/// resumes from its cursor (the existing gapless-resume contract).\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\n\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\n/// either, but only a POISON (real write failure on the conn) cancels the\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum SeatFail {\n    /// The writer thread died on a failed conn write (the 15s bounded-write\n    /// poison class) — halt-at-first-failure already happened writer-side.\n    Poisoned,\n    /// The bounded queue is full — the subscriber cannot keep up.\n    Overflow,\n}\n\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\n///\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\n/// sender — the writer drains what it holds and exits.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\nstruct SubscriberSeat {\n    sub: SharedSend,\n    tx: std::sync::mpsc::SyncSender<Envelope>,\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n    /// and a replacement may install (the no-reinstall-until-gone rule,\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\n    done: Arc<std::sync::atomic::AtomicBool>,\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\n}\n\nimpl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n                    writer_done.store(true, Ordering::Release);\n                    return;\n                }\n            }\n            // Then live frames, same halt discipline.\n            while let Ok(frame) = rx.recv() {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"live write failed\");\n                    break;\n                }\n            }\n            writer_done.store(true, Ordering::Release);\n        });\n        SubscriberSeat {\n            sub,\n            tx,\n            done,\n            poisoned,\n        }\n    }\n\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\n    /// push). `Err` means the seat must be removed.\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\n        if self.poisoned.load(Ordering::Acquire) {\n            return Err(SeatFail::Poisoned);\n        }\n…\n    }\n…\n}\n…\n/// PresenceChannel seam (D4c, REQ-EP-4): the StreamLog ring/cursor discipline\n/// applied to the conn table itself. `register_conn` appends `connected`; each\n/// connection's closed-watcher appends `disconnected` after removing the row.\n/// A brain subscribes with a cursor and replays events produced while it was\n/// down, so presence survives a brain restart exactly like stream reads do.\n// [impl->REQ-EP-4]\nstruct PresenceLog {\n    next_seq: u64,\n    ring: VecDeque<NetPresenceEvent>,\n    cap_events: usize,\n    /// Behind the same bounded writer-queue seat as `StreamLog` (ADR-0038\n    /// Amendment fixes 2+3 — the PresenceLog mirrors ride the same change).\n    subscriber: Option<SubscriberSeat>,\n}\n\nimpl PresenceLog {\n    fn new(cap_events: usize) -> Self {\n        PresenceLog {\n            next_seq: 0,\n            ring: VecDeque::new(),\n            cap_events,\n            subscriber: None,\n        }\n    }\n\n    /// Append a liveness event: assign the next `seq`, retain it in the bounded\n    /// ring, live-send to the current subscriber. Producers: `register_conn`\n    /// (connected) and the per-conn closed-watchers (disconnected) — every\n    /// append serializes on the enclosing `Mutex`, so subscriber frames arrive\n    /// in strict `seq` order.\n    fn append(&mut self, kind: &str, conn_id: u64, remote_id_hex: &str) {\n        self.push(NetPresenceEvent {\n            seq: 0, // assigned in push\n            kind: kind.to_string(),\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            reason: None,\n            remote_addr: serde_json::Value::Null,\n        });\n    }\n\n    /// A `connected` event carrying the connection's OBSERVED remote address\n    /// (REQ-CONV-1): the async-dial write-back seed the blocking `net-dialed`\n    /// reply used to carry — now it rides the presence stream so the pump seeds\n    /// `peer-addrs.json` from a non-blocking dial the same way.\n    // [impl->REQ-CONV-1]\n    fn append_connected(&mut self, conn_id: u64, remote_id_hex: &str, remote_addr: serde_json::Value) {\n        self.push(NetPresenceEvent {\n            seq: 0,\n            kind: PRESENCE_CONNECTED.to_string(),\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            reason: None,\n            remote_addr,\n        });\n    }\n\n    /// A `dial-failed` event (PUMP-TRUTH W2): a non-blocking [`KIND_NET_DIAL_SUBMIT`]\n    /// dial failed. No connection opened → the documented `conn_id: 0` sentinel;\n    /// the pump correlates by `remote_id_hex` + `kind`, never `conn_id`.\n    // [impl->REQ-PUMP-PEER-ISOLATION]\n    fn append_dial_failed(&mut self, remote_id_hex: &str, reason: String) {\n        self.push(NetPresenceEvent {\n            seq: 0,\n            kind: PRESENCE_DIAL_FAILED.to_string(),\n            conn_id: 0,\n            remote_id_hex: remote_id_hex.to_string(),\n            reason: Some(reason),\n            remote_addr: serde_json::Value::Null,\n        });\n    }\n\n    /// Assign the next `seq`, retain in the bounded ring, live-send to the\n    /// current subscriber. Every append serializes on the enclosing `Mutex`, so\n    /// subscriber frames arrive in strict `seq` order.\n    fn push(&mut self, mut ev: NetPresenceEvent) {\n        ev.seq = self.next_seq;\n        self.next_seq += 1;\n        self.ring.push_back(ev.clone());\n        while self.ring.len() > self.cap_events {\n            self.ring.pop_front();\n        }\n        if let Some(seat) = &self.subscriber {\n            let frame = net_presence_event_envelope(&ev);\n            // Enqueue only; halt-and-remove on failure — the PresenceLog\n            // mirror of the StreamLog discipline (Amendment fix 2).\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                if let Some(seat) = self.subscriber.take() {\n                    seat.sub\n                        .lifecycle_event(\"presence-sub-halt\", &format!(\"reason={fail:?}\"));\n                }\n            }\n        }\n    }\n\n    /// Attach `sub` as the subscriber, replaying every retained event with\n    /// `seq >= from_seq` before live streaming (the gapless-resume attach).\n    /// The replay snapshot rides the seat's writer thread — replay-then-live\n    /// order structural, conn I/O outside this mutex — same discipline as\n    /// [`StreamLog::begin_attach`]. Returns the replay event count.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // Poison-class only (see StreamLog::begin_attach): a healthy\n            // prior presence subscriber is displaced by the newer brain.\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    \"presence subscriber busy: prior subscriber still draining\",\n                ));\n            }\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): presence-subscriber role fact + attach\n        // record — the OTHER RCA-pinned shared carrier (the per-dial-failure\n        // presence push rides this conn). [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(\"presence-subscriber\");\n        sub.lifecycle_event(\"presence-sub-attach\", &format!(\"from_seq={from_seq}\"));\n        let replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|e| e.seq >= from_seq)\n            .map(net_presence_event_envelope)\n            .collect();\n        let replay_len = replay.len();\n        // No lease on the presence channel (it has no paired serve leg).\n        self.subscriber = Some(SubscriberSeat::install(sub, replay, None));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n}\n\n/// A stream's send half — the same two transports as [`ConnKind`]. The\n/// `serve_attach`/operator pump and the `StreamLog` read discipline are\n/// IDENTICAL across both; only this leaf write differs (QUIC stream vs the\n/// write end of an in-process duplex). That is the M12 W1.5 one-pump invariant\n…\nimpl NetHost {\n…\n    pub fn open_loopback_pair(&self) -> io::Result<(u64, u64)> {\n…\n        let shell_stream = self\n…\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    /// 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    }\n\n    /// Gracefully close the endpoint: every held connection flushes its QUIC\n    /// CLOSE so peers' closed-watchers fire promptly (a bare host drop kills\n    /// the runtime first and leaves peers to an idle timeout).\n    pub fn close(&self) {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            endpoint.close().await;\n        });\n    }\n}\n"}],"details":{"displayContent":{"text":"/// unreplayed chunks in practice; bounded so an unsubscribed stream can't\n/// buffer without limit.\nconst DEFAULT_STREAM_RING_CHUNKS: usize = 4096;\n\n/// Max bytes pulled per stream read (one ring chunk).\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\n\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\n/// no newline is not speaking an NDJSON protocol — capture gives up\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\nconst OPENER_PIN_MAX: usize = 64 * 1024;\n\n/// How many frames a subscriber's writer queue holds before the subscriber is\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\n/// is a subscriber problem, never a producer stall — the detached brain\n/// resumes from its cursor (the existing gapless-resume contract).\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\n\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\n/// either, but only a POISON (real write failure on the conn) cancels the\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum SeatFail {\n    /// The writer thread died on a failed conn write (the 15s bounded-write\n    /// poison class) — halt-at-first-failure already happened writer-side.\n    Poisoned,\n    /// The bounded queue is full — the subscriber cannot keep up.\n    Overflow,\n}\n\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\n///\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\n/// sender — the writer drains what it holds and exits.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\nstruct SubscriberSeat {\n    sub: SharedSend,\n    tx: std::sync::mpsc::SyncSender<Envelope>,\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n    /// and a replacement may install (the no-reinstall-until-gone rule,\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\n    done: Arc<std::sync::atomic::AtomicBool>,\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\n}\n\nimpl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n                    writer_done.store(true, Ordering::Release);\n                    return;\n                }\n            }\n            // Then live frames, same halt discipline.\n            while let Ok(frame) = rx.recv() {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"live write failed\");\n                    break;\n                }\n            }\n            writer_done.store(true, Ordering::Release);\n        });\n        SubscriberSeat {\n            sub,\n            tx,\n            done,\n            poisoned,\n        }\n    }\n\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\n    /// push). `Err` means the seat must be removed.\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\n        if self.poisoned.load(Ordering::Acquire) {\n            return Err(SeatFail::Poisoned);\n        }\n…\n    }\n…\n}\n…\n/// PresenceChannel seam (D4c, REQ-EP-4): the StreamLog ring/cursor discipline\n/// applied to the conn table itself. `register_conn` appends `connected`; each\n/// connection's closed-watcher appends `disconnected` after removing the row.\n/// A brain subscribes with a cursor and replays events produced while it was\n/// down, so presence survives a brain restart exactly like stream reads do.\n// [impl->REQ-EP-4]\nstruct PresenceLog {\n    next_seq: u64,\n    ring: VecDeque<NetPresenceEvent>,\n    cap_events: usize,\n    /// Behind the same bounded writer-queue seat as `StreamLog` (ADR-0038\n    /// Amendment fixes 2+3 — the PresenceLog mirrors ride the same change).\n    subscriber: Option<SubscriberSeat>,\n}\n\nimpl PresenceLog {\n    fn new(cap_events: usize) -> Self {\n        PresenceLog {\n            next_seq: 0,\n            ring: VecDeque::new(),\n            cap_events,\n            subscriber: None,\n        }\n    }\n\n    /// Append a liveness event: assign the next `seq`, retain it in the bounded\n    /// ring, live-send to the current subscriber. Producers: `register_conn`\n    /// (connected) and the per-conn closed-watchers (disconnected) — every\n    /// append serializes on the enclosing `Mutex`, so subscriber frames arrive\n    /// in strict `seq` order.\n    fn append(&mut self, kind: &str, conn_id: u64, remote_id_hex: &str) {\n        self.push(NetPresenceEvent {\n            seq: 0, // assigned in push\n            kind: kind.to_string(),\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            reason: None,\n            remote_addr: serde_json::Value::Null,\n        });\n    }\n\n    /// A `connected` event carrying the connection's OBSERVED remote address\n    /// (REQ-CONV-1): the async-dial write-back seed the blocking `net-dialed`\n    /// reply used to carry — now it rides the presence stream so the pump seeds\n    /// `peer-addrs.json` from a non-blocking dial the same way.\n    // [impl->REQ-CONV-1]\n    fn append_connected(&mut self, conn_id: u64, remote_id_hex: &str, remote_addr: serde_json::Value) {\n        self.push(NetPresenceEvent {\n            seq: 0,\n            kind: PRESENCE_CONNECTED.to_string(),\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            reason: None,\n            remote_addr,\n        });\n    }\n\n    /// A `dial-failed` event (PUMP-TRUTH W2): a non-blocking [`KIND_NET_DIAL_SUBMIT`]\n    /// dial failed. No connection opened → the documented `conn_id: 0` sentinel;\n    /// the pump correlates by `remote_id_hex` + `kind`, never `conn_id`.\n    // [impl->REQ-PUMP-PEER-ISOLATION]\n    fn append_dial_failed(&mut self, remote_id_hex: &str, reason: String) {\n        self.push(NetPresenceEvent {\n            seq: 0,\n            kind: PRESENCE_DIAL_FAILED.to_string(),\n            conn_id: 0,\n            remote_id_hex: remote_id_hex.to_string(),\n            reason: Some(reason),\n            remote_addr: serde_json::Value::Null,\n        });\n    }\n\n    /// Assign the next `seq`, retain in the bounded ring, live-send to the\n    /// current subscriber. Every append serializes on the enclosing `Mutex`, so\n    /// subscriber frames arrive in strict `seq` order.\n    fn push(&mut self, mut ev: NetPresenceEvent) {\n        ev.seq = self.next_seq;\n        self.next_seq += 1;\n        self.ring.push_back(ev.clone());\n        while self.ring.len() > self.cap_events {\n            self.ring.pop_front();\n        }\n        if let Some(seat) = &self.subscriber {\n            let frame = net_presence_event_envelope(&ev);\n            // Enqueue only; halt-and-remove on failure — the PresenceLog\n            // mirror of the StreamLog discipline (Amendment fix 2).\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                if let Some(seat) = self.subscriber.take() {\n                    seat.sub\n                        .lifecycle_event(\"presence-sub-halt\", &format!(\"reason={fail:?}\"));\n                }\n            }\n        }\n    }\n\n    /// Attach `sub` as the subscriber, replaying every retained event with\n    /// `seq >= from_seq` before live streaming (the gapless-resume attach).\n    /// The replay snapshot rides the seat's writer thread — replay-then-live\n    /// order structural, conn I/O outside this mutex — same discipline as\n    /// [`StreamLog::begin_attach`]. Returns the replay event count.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // Poison-class only (see StreamLog::begin_attach): a healthy\n            // prior presence subscriber is displaced by the newer brain.\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    \"presence subscriber busy: prior subscriber still draining\",\n                ));\n            }\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): presence-subscriber role fact + attach\n        // record — the OTHER RCA-pinned shared carrier (the per-dial-failure\n        // presence push rides this conn). [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(\"presence-subscriber\");\n        sub.lifecycle_event(\"presence-sub-attach\", &format!(\"from_seq={from_seq}\"));\n        let replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|e| e.seq >= from_seq)\n            .map(net_presence_event_envelope)\n            .collect();\n        let replay_len = replay.len();\n        // No lease on the presence channel (it has no paired serve leg).\n        self.subscriber = Some(SubscriberSeat::install(sub, replay, None));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n}\n\n/// A stream's send half — the same two transports as [`ConnKind`]. The\n/// `serve_attach`/operator pump and the `StreamLog` read discipline are\n/// IDENTICAL across both; only this leaf write differs (QUIC stream vs the\n/// write end of an in-process duplex). That is the M12 W1.5 one-pump invariant\n…\nimpl NetHost {\n…\n    pub fn open_loopback_pair(&self) -> io::Result<(u64, u64)> {\n…\n        let shell_stream = self\n…\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    /// 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    }\n\n    /// Gracefully close the endpoint: every held connection flushes its QUIC\n    /// CLOSE so peers' closed-watchers fire promptly (a bare host drop kills\n    /// the runtime first and leaves peers to an idle timeout).\n    pub fn close(&self) {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            endpoint.close().await;\n        });\n    }\n}\n","startLine":110,"lineNumbers":[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,null,241,null,252,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,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,1166,null,1933,null,1938,null,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784271542388}}
{"type":"message","id":"169d526a","parentId":"a2ecb283","timestamp":"2026-07-17T06:59:02.396Z","message":{"role":"toolResult","toolCallId":"call_TWT89YSKKcSBNKM4UCJqOsyg|fc_0a061eb498f0e908016a59d2b64d148196b732500d0e7f7bc2","toolName":"read","content":[{"type":"text","text":"impl TranslationChild {\n…\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\n…\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\n        #[cfg(windows)]\n        {\n            use std::os::windows::process::CommandExt;\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\n            command.creation_flags(CREATE_NO_WINDOW);\n        }\n        let mut child = command.spawn()?;\n        let pid = child.id().into();\n        let stdout = child\n            .stdout\n            .take()\n            .expect(\"stdout piped at spawn\");\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\n        let reader = thread::spawn(move || {\n            let buf = BufReader::new(stdout);\n            for line in buf.lines() {\n                let Ok(line) = line else { break }; // child stdout closed\n                let trimmed = line.trim();\n                if trimmed.is_empty() {\n                    continue;\n                }\n                match serde_json::from_str::<KeyCmd>(trimmed) {\n                    Ok(cmd) => {\n                        if cmds.send(cmd).is_err() {\n                            break; // broker dropped the receiver — stop reading\n                        }\n                    }\n                    Err(e) => {\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\n                    }\n                }\n            }\n        });\n        Ok(TranslationChild {\n            child: Mutex::new(Some(child)),\n            stdin: Mutex::new(Some(stdin)),\n            _reader: reader,\n            pid,\n        })\n    }\n\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\n    pub fn pid(&self) -> Option<u32> {\n        self.pid\n    }\n\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\n        let mut guard = self.stdin.lock().unwrap();\n        if let Some(w) = guard.as_mut() {\n            w.write_all(line.as_bytes())?;\n            w.write_all(b\"\\n\")?;\n            w.flush()?;\n        }\n        Ok(())\n    }\n\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\n    /// exits on its own. Idempotent.\n    fn close_stdin(&self) {\n        let _ = self.stdin.lock().unwrap().take();\n    }\n\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\n    /// (`None`) returns immediately, and every step swallows errors (a child that\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\n    /// the binary; Drop reaps on teardown).\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n    pub fn terminate(&self) {\n        self.close_stdin();\n        let mut guard = self.child.lock().unwrap();\n        let Some(child) = guard.as_mut() else {\n            return; // already reaped\n        };\n        let deadline = Instant::now() + REAP_GRACE;\n        loop {\n            match child.try_wait() {\n                Ok(Some(_)) => {\n                    *guard = None;\n                    return; // exited on its own after EOF\n                }\n                Ok(None) => {\n                    if Instant::now() >= deadline {\n                        break;\n                    }\n                    thread::sleep(REAP_POLL);\n                }\n                Err(_) => break,\n            }\n        }\n        let _ = child.kill();\n        let _ = child.wait();\n        *guard = None;\n    }\n}\n\nimpl Drop for TranslationChild {\n    fn drop(&mut self) {\n        self.terminate();\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\n    #[test]\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\n        assert_eq!(\n            serde_json::to_string(&ToBinary::Init {\n                endpoint_id: \"doyle\".into(),\n                node: \"n1\".into(),\n            })\n            .unwrap(),\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\n        );\n        assert_eq!(\n            serde_json::to_string(&ToBinary::Event {\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\n            })\n            .unwrap(),\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\n        );\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\n        // Privacy invariant, structurally: the only field is `type`.\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\n        assert_eq!(\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\n            vec![\"type\"],\n            \"the input ping must carry no field other than `type` — no PTY content\"\n        );\n    }\n\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\n    // verified by the live watcher); this proves the flagged spawn still starts a live\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\n    #[test]\n    fn flagged_spawn_still_starts() {\n        // A no-arg program present on each platform that TranslationChild can spawn as\n        // a stdin→stdout child (it need not speak the protocol — we only assert the\n        // CREATE_NO_WINDOW spawn succeeds, then reap via terminate/Drop).\n        #[cfg(windows)]\n        let prog = \"cmd\";\n…\n    }\n…\n}\n\n[Showing lines 259-413 of 508. Use :414 to continue]"}],"details":{"truncation":{"content":"        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\r\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\r\n    pub fn pid(&self) -> Option<u32> {\r\n        self.pid\r\n    }\r\n\r\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\r\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\r\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\r\n        let mut guard = self.stdin.lock().unwrap();\r\n        if let Some(w) = guard.as_mut() {\r\n            w.write_all(line.as_bytes())?;\r\n            w.write_all(b\"\\n\")?;\r\n            w.flush()?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\r\n    /// exits on its own. Idempotent.\r\n    fn close_stdin(&self) {\r\n        let _ = self.stdin.lock().unwrap().take();\r\n    }\r\n\r\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\r\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\r\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\r\n    /// (`None`) returns immediately, and every step swallows errors (a child that\r\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\r\n    /// the binary; Drop reaps on teardown).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn terminate(&self) {\r\n        self.close_stdin();\r\n        let mut guard = self.child.lock().unwrap();\r\n        let Some(child) = guard.as_mut() else {\r\n            return; // already reaped\r\n        };\r\n        let deadline = Instant::now() + REAP_GRACE;\r\n        loop {\r\n            match child.try_wait() {\r\n                Ok(Some(_)) => {\r\n                    *guard = None;\r\n                    return; // exited on its own after EOF\r\n                }\r\n                Ok(None) => {\r\n                    if Instant::now() >= deadline {\r\n                        break;\r\n                    }\r\n                    thread::sleep(REAP_POLL);\r\n                }\r\n                Err(_) => break,\r\n            }\r\n        }\r\n        let _ = child.kill();\r\n        let _ = child.wait();\r\n        *guard = None;\r\n    }\r\n}\r\n\r\nimpl Drop for TranslationChild {\r\n    fn drop(&mut self) {\r\n        self.terminate();\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\r\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\r\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\r\n    #[test]\r\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Init {\r\n                endpoint_id: \"doyle\".into(),\r\n                node: \"n1\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\r\n        );\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Event {\r\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\r\n        );\r\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\r\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\r\n        // Privacy invariant, structurally: the only field is `type`.\r\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\r\n        assert_eq!(\r\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\r\n            vec![\"type\"],\r\n            \"the input ping must carry no field other than `type` — no PTY content\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\r\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\r\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\r\n    // verified by the live watcher); this proves the flagged spawn still starts a live\r\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\r\n    #[test]\r\n    fn flagged_spawn_still_starts() {\r\n        // A no-arg program present on each platform that TranslationChild can spawn as\r\n        // a stdin→stdout child (it need not speak the protocol — we only assert the\r\n        // CREATE_NO_WINDOW spawn succeeds, then reap via terminate/Drop).\r\n        #[cfg(windows)]\r\n        let prog = \"cmd\";\r","truncated":true,"truncatedBy":"lines","totalLines":250,"totalBytes":6062,"outputLines":155,"outputBytes":6062,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl TranslationChild {\n…\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\n…\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\r\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\r\n    pub fn pid(&self) -> Option<u32> {\r\n        self.pid\r\n    }\r\n\r\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\r\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\r\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\r\n        let mut guard = self.stdin.lock().unwrap();\r\n        if let Some(w) = guard.as_mut() {\r\n            w.write_all(line.as_bytes())?;\r\n            w.write_all(b\"\\n\")?;\r\n            w.flush()?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\r\n    /// exits on its own. Idempotent.\r\n    fn close_stdin(&self) {\r\n        let _ = self.stdin.lock().unwrap().take();\r\n    }\r\n\r\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\r\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\r\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\r\n    /// (`None`) returns immediately, and every step swallows errors (a child that\r\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\r\n    /// the binary; Drop reaps on teardown).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn terminate(&self) {\r\n        self.close_stdin();\r\n        let mut guard = self.child.lock().unwrap();\r\n        let Some(child) = guard.as_mut() else {\r\n            return; // already reaped\r\n        };\r\n        let deadline = Instant::now() + REAP_GRACE;\r\n        loop {\r\n            match child.try_wait() {\r\n                Ok(Some(_)) => {\r\n                    *guard = None;\r\n                    return; // exited on its own after EOF\r\n                }\r\n                Ok(None) => {\r\n                    if Instant::now() >= deadline {\r\n                        break;\r\n                    }\r\n                    thread::sleep(REAP_POLL);\r\n                }\r\n                Err(_) => break,\r\n            }\r\n        }\r\n        let _ = child.kill();\r\n        let _ = child.wait();\r\n        *guard = None;\r\n    }\r\n}\r\n\r\nimpl Drop for TranslationChild {\r\n    fn drop(&mut self) {\r\n        self.terminate();\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\r\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\r\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\r\n    #[test]\r\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Init {\r\n                endpoint_id: \"doyle\".into(),\r\n                node: \"n1\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\r\n        );\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Event {\r\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\r\n        );\r\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\r\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\r\n        // Privacy invariant, structurally: the only field is `type`.\r\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\r\n        assert_eq!(\r\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\r\n            vec![\"type\"],\r\n            \"the input ping must carry no field other than `type` — no PTY content\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\r\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\r\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\r\n    // verified by the live watcher); this proves the flagged spawn still starts a live\r\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\r\n    #[test]\r\n    fn flagged_spawn_still_starts() {\r\n        // A no-arg program present on each platform that TranslationChild can spawn as\r\n        // a stdin→stdout child (it need not speak the protocol — we only assert the\r\n        // CREATE_NO_WINDOW spawn succeeds, then reap via terminate/Drop).\r\n        #[cfg(windows)]\r\n        let prog = \"cmd\";\r\n…\n    }\n…\n}","startLine":235,"lineNumbers":[235,null,245,null,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,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,null,423,null,507]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\translation.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":508,"totalBytes":6062,"outputLines":155,"outputBytes":6062,"shownRange":{"start":259,"end":413},"nextOffset":414}}},"isError":false,"timestamp":1784271542396}}
{"type":"message","id":"4082534f","parentId":"169d526a","timestamp":"2026-07-17T06:59:02.398Z","message":{"role":"toolResult","toolCallId":"call_f18EmBjfQPRXGMDd6LsI2aI3|fc_0a061eb498f0e908016a59d2b64d4c81968a27ad8d2f5d111c","toolName":"read","content":[{"type":"text","text":"# ADR-0038: Broker stream-table lifecycle truth (redispatch eligibility)\n…\n## Consequences\n…\n- Brain cycles (refresh/update) stop being a controller-integrity hazard:\n…\n- Rejected alternatives: clearing the whole stream table on brain restart\n…\n\n## Amendment — REDISPATCH-STALL (2026-07-16)\n<!-- [doc->REQ-DISPATCH-FALLBACK-CIRCUIT] -->\n<!-- [doc->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE] -->\n<!-- [doc->REQ-SERVE-OWNERSHIP-GENERATION] -->\n<!-- [doc->REQ-DISPATCH-HYGIENE-TELEMETRY] -->\n\n- **Status:** accepted (hertz v0.34 field-stall RCA + doyle seam-verify, same\n  day, both hours apart); RCA summary\n  `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`; hazard\n  KNOWN-HAZARDS 7.43; build shape `docs/REDISPATCH-STALL-TRIAGE.md`.\n\nThe W1 machinery this ADR shipped is field-correct on its own terms (D1/D1b\nhold: finished rows never serve) but two of its legs COMPOSE into a stall\nengine on live v0.34: Decision 3's retryable claims re-drive Decision 2's N-1\nring-peek fallback, whose guard arm is a broad `Err(_)`\n(`dispatch.rs:414` — intended old-broker-only, catches transport\ntimeout/EOF/poison too), each pass installing a throwaway peek subscriber\nwhose `StreamLog::attach` replays the whole retained ring UNDER the per-stream\nmutex with discarded write errors — one wedged subscriber conn = serial 15s\nbounded-write poison windows (33 observed, all 15,000–15,154 ms) composing\ninto 17–62s PTY/RC stalls.\n\nAmended decisions:\n\n1. **(amends Decision 2)** The ring-peek fallback fires ONLY on the explicit\n   unsupported-verb/old-broker answer. Every other opener-query error\n   (transport timeout, EOF, poison) is `Failed` → the bounded claim requeue —\n   never a second replay subscriber.\n2. **(new — subscriber write discipline)** Replay and live fan-out stop at\n   the FIRST failed subscriber write, and the failed subscriber is REMOVED\n   (attach replay, append, finish — all three sites). Subscriber I/O moves\n   OFF the `StreamLog` mutex: a bounded per-subscriber writer queue,\n   enqueue-under-lock / I/O-outside; queue overflow = detach that subscriber\n   + resume-from-cursor (the existing gapless-resume contract), never a\n   producer stall.\n3. **(new — bounded forwarding)** Attach worker completion and forwarding are\n   BOUNDED and cancelable: a poisoned brain subscriber cancels its paired\n   serve/wire worker (no orphan forwarding legs). Coordinate at build with\n   the DAEMON-LIFECYCLE C2 stream-lease work — same neighborhood, build once.\n4. **(amends Decision 3)** Retries are CLASSIFIED: a pre-setup transient may\n   retry; a deadline-poisoned replay is CIRCUIT-BROKEN (global backoff), and\n   a replacement subscriber is never installed until the prior subscriber is\n   fully gone. This is an upgrade of the bounded backoff, NOT a revert to the\n   v0.33 burn-the-claim abandonment (explicitly rejected).\n5. **(new — serve-side validation)** Terminal-exclusion is enforced pre-serve,\n   and attach/detach validate ownership/generation — a stale worker can never\n   detach a replacement controller. This also covers the UNFINISHED-stale-row\n   steal shape (raw-close no-FIN viewports) that Decision 1's finished-row\n   retirement cannot see.\n6. **(new — dispatcher hygiene + telemetry)** The redispatch worker pool is\n   bounded with batched cold enumeration and NO claim/sessions locks held\n   across I/O (clone-then-drop before `detach_if`/`info.json` writes, KH 7.12\n   kin); dispatch telemetry is keyed per\n   gen/stream/family/endpoint/attempt/conn with\n   replay/poison/cancel/worker-outcome events and gauges.\n\nRejected here: reverting retryable claims (restores permanent abandonment);\nwidening any write deadline (hides the composition instead of removing it);\ntearing down all subscribers on any poison (punishes healthy streams for a\nwedged conn).\n"}],"details":{"displayContent":{"text":"# ADR-0038: Broker stream-table lifecycle truth (redispatch eligibility)\n…\n## Consequences\n…\n- Brain cycles (refresh/update) stop being a controller-integrity hazard:\n…\n- Rejected alternatives: clearing the whole stream table on brain restart\n…\n\r\n## Amendment — REDISPATCH-STALL (2026-07-16)\r\n<!-- [doc->REQ-DISPATCH-FALLBACK-CIRCUIT] -->\r\n<!-- [doc->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE] -->\r\n<!-- [doc->REQ-SERVE-OWNERSHIP-GENERATION] -->\r\n<!-- [doc->REQ-DISPATCH-HYGIENE-TELEMETRY] -->\r\n\r\n- **Status:** accepted (hertz v0.34 field-stall RCA + doyle seam-verify, same\r\n  day, both hours apart); RCA summary\r\n  `.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`; hazard\r\n  KNOWN-HAZARDS 7.43; build shape `docs/REDISPATCH-STALL-TRIAGE.md`.\r\n\r\nThe W1 machinery this ADR shipped is field-correct on its own terms (D1/D1b\r\nhold: finished rows never serve) but two of its legs COMPOSE into a stall\r\nengine on live v0.34: Decision 3's retryable claims re-drive Decision 2's N-1\r\nring-peek fallback, whose guard arm is a broad `Err(_)`\r\n(`dispatch.rs:414` — intended old-broker-only, catches transport\r\ntimeout/EOF/poison too), each pass installing a throwaway peek subscriber\r\nwhose `StreamLog::attach` replays the whole retained ring UNDER the per-stream\r\nmutex with discarded write errors — one wedged subscriber conn = serial 15s\r\nbounded-write poison windows (33 observed, all 15,000–15,154 ms) composing\r\ninto 17–62s PTY/RC stalls.\r\n\r\nAmended decisions:\r\n\r\n1. **(amends Decision 2)** The ring-peek fallback fires ONLY on the explicit\r\n   unsupported-verb/old-broker answer. Every other opener-query error\r\n   (transport timeout, EOF, poison) is `Failed` → the bounded claim requeue —\r\n   never a second replay subscriber.\r\n2. **(new — subscriber write discipline)** Replay and live fan-out stop at\r\n   the FIRST failed subscriber write, and the failed subscriber is REMOVED\r\n   (attach replay, append, finish — all three sites). Subscriber I/O moves\r\n   OFF the `StreamLog` mutex: a bounded per-subscriber writer queue,\r\n   enqueue-under-lock / I/O-outside; queue overflow = detach that subscriber\r\n   + resume-from-cursor (the existing gapless-resume contract), never a\r\n   producer stall.\r\n3. **(new — bounded forwarding)** Attach worker completion and forwarding are\r\n   BOUNDED and cancelable: a poisoned brain subscriber cancels its paired\r\n   serve/wire worker (no orphan forwarding legs). Coordinate at build with\r\n   the DAEMON-LIFECYCLE C2 stream-lease work — same neighborhood, build once.\r\n4. **(amends Decision 3)** Retries are CLASSIFIED: a pre-setup transient may\r\n   retry; a deadline-poisoned replay is CIRCUIT-BROKEN (global backoff), and\r\n   a replacement subscriber is never installed until the prior subscriber is\r\n   fully gone. This is an upgrade of the bounded backoff, NOT a revert to the\r\n   v0.33 burn-the-claim abandonment (explicitly rejected).\r\n5. **(new — serve-side validation)** Terminal-exclusion is enforced pre-serve,\r\n   and attach/detach validate ownership/generation — a stale worker can never\r\n   detach a replacement controller. This also covers the UNFINISHED-stale-row\r\n   steal shape (raw-close no-FIN viewports) that Decision 1's finished-row\r\n   retirement cannot see.\r\n6. **(new — dispatcher hygiene + telemetry)** The redispatch worker pool is\r\n   bounded with batched cold enumeration and NO claim/sessions locks held\r\n   across I/O (clone-then-drop before `detach_if`/`info.json` writes, KH 7.12\r\n   kin); dispatch telemetry is keyed per\r\n   gen/stream/family/endpoint/attempt/conn with\r\n   replay/poison/cancel/worker-outcome events and gauges.\r\n\r\nRejected here: reverting retryable claims (restores permanent abandonment);\r\nwidening any write deadline (hides the composition instead of removing it);\r\ntearing down all subscribers on any poison (punishes healthy streams for a\r\nwedged conn).\r\n","startLine":1,"lineNumbers":[1,null,55,null,57,null,65,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\docs\\adr\\0038-broker-stream-lifecycle-truth.md"}}},"isError":false,"timestamp":1784271542398}}
{"type":"message","id":"4c5659c9","parentId":"4082534f","timestamp":"2026-07-17T06:59:02.408Z","message":{"role":"toolResult","toolCallId":"call_yhdJYoQC33wHSVkI7I6Fxhcg|fc_0a061eb498f0e908016a59d2b64d44819694fddf0e7eaa1059","toolName":"read","content":[{"type":"text","text":"pub fn run_dispatch_loop(\n…\n) -> io::Result<()> {\n…\n    while !stop.load(Ordering::Relaxed) {\n…\n        for s in reply.streams {\n…\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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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\n[Showing lines 469-613 of 1558. Use :614 to continue]"}],"details":{"truncation":{"content":"            // 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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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}","truncated":true,"truncatedBy":"lines","totalLines":1090,"totalBytes":6528,"outputLines":145,"outputBytes":6528,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub fn run_dispatch_loop(\n…\n) -> io::Result<()> {\n…\n    while !stop.load(Ordering::Relaxed) {\n…\n        for s in reply.streams {\n…\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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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}","startLine":429,"lineNumbers":[429,null,435,null,455,null,464,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":6528,"outputLines":145,"outputBytes":6528,"shownRange":{"start":469,"end":613},"nextOffset":614}}},"isError":false,"timestamp":1784271542408}}
{"type":"message","id":"34118a29","parentId":"4c5659c9","timestamp":"2026-07-17T06:59:02.420Z","message":{"role":"toolResult","toolCallId":"call_Lzr38WWyTTFpfOOk3j1nBROZ|fc_0a061eb498f0e908016a59d2b64d34819683cb76f9ad5d286b","toolName":"read","content":[{"type":"text","text":"        {\n…\n            if let Err(e) = att.save() {\n…\n            }\n            for name in &att.detached {\n                // Plain prose (no Markdown markers): spt-daemon can't import the\n                // bin-local helpfmt renderer, so this one source string is authored\n                // marker-free rather than rendered. The `SUBNET_DETACHED:{name}`\n                // token is the machine contract; the rest is a human hint.\n                // [impl->REQ-CLI-OUTPUT-MARKDOWN]\n                eprintln!(\"SUBNET_DETACHED:{name} (startup default — run: spt subnet attach {name})\");\n            }\n        }\n\n        // The broker's network host (D4a, ADR-0004 §B): the node's iroh endpoint\n        // + live QUIC connections live in the broker so they survive a brain\n        // restart. Identity is the durable node.key (stable name across daemon\n        // restarts); relay stance comes from daemon.json; mDNS rides the\n        // endpoint (closing the §B mDNS/relay-session row by construction). A\n        // net failure degrades to a net-less broker — it must not cost PTY\n        // hosting (mirrors the broker-bind soft-fail below).\n        // [impl->REQ-DAEMON-2]\n        // Identity (the durable node.key) decides node_hex independently of the\n        // net bring-up: a NET_BIND_FAIL (e.g. the autostart beat the network up\n        // at boot — REQ-DAEMON-9) is transient and retried, but a broken\n        // identity is not, so we only arm the retry when identity is sound.\n        let node_hex: Option<String> = spt_store::nodeid::load_or_create()\n            .ok()\n            .map(|i| i.public_key().to_hex());\n        let net = if node_hex.is_some() {\n            try_start_net()\n        } else {\n            eprintln!(\"NODE_KEY_FAIL: identity unavailable — broker runs net-less, no retry\");\n            None\n        };\n\n        // The broker hosts PTYs (B1/B2) + the net endpoint (D4a). Serve it on a\n        // background thread; a bind failure there must not stop the seed channel\n        // (the B6 surface) — the PTY-hosting consumers arrive in B7/B8.\n        let net_up = net.is_some();\n        // Keep the broker handle alive past the bind so the brain supervisor's\n        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\n        // `KIND_BRAIN_RESTART` verb the broker serves must reach the supervisor.\n        let broker_handle: Option<Arc<Broker>> =\n            match Broker::bind_in_with_net(&broker_socket_name(), default_journal_path(), net) {\n                Ok(broker) => {\n                    let serve_broker = Arc::clone(&broker);\n                    thread::spawn(move || {\n                        let _ = serve_broker.serve();\n                    });\n                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n                // the BRAIN child (restoration D2-1): they are pure IPC clients,\n                // so they live with the restartable brain and respawn with it.\n                // The broker keeps only the NetHost bring-up and the boot-race\n                // self-heal that binds it; the brain polls `net-status` and\n                // starts the consumers once net reports enabled.\n                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n                    if !net_up && node_hex.is_some() {\n                        // Boot-race self-heal (REQ-DAEMON-9): net failed to bind\n                        // but identity is sound — almost always the autostart\n                        // racing the network up at boot. Retry net in the\n                        // background and attach it to the broker when it\n                        // succeeds, so the node becomes reachable WITHOUT a\n                        // manual restart; the brain notices `net-status` flip\n                        // enabled and starts the consumers then.\n                        // [impl->REQ-DAEMON-9]\n                        let broker = Arc::clone(&broker);\n                        thread::spawn(move || net_retry_attach(broker));\n                    }\n                    // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):\n                    // bring saved startup defaults back up against the broker we\n                    // just bound. Background thread — a saved endpoint that fails\n                    // to come up logs loud and never blocks daemon start, the\n                    // seed channel, or the other replays.\n                    // [impl->REQ-ENDPOINT-AUTOSTART]\n                    thread::spawn(|| {\n                        crate::autostart::replay_startup_endpoints(&broker_socket_name());\n                    });\n                    // The node-local docs server (ADR-0036 §4): broker-side so\n                    // docs are up whenever the daemon is. Loopback only; a bind\n                    // failure (port squatted) logs loud and the daemon runs on —\n                    // docs are a degradable surface, never a boot blocker.\n                    // [impl->REQ-DOCS-LOCAL-SERVER]\n                    {\n                        let port = crate::docshost::resolve_docs_port(\n                            crate::config::DaemonConfig::load().docs_port,\n                            std::env::var(crate::docshost::DOCS_PORT_ENV).ok().as_deref(),\n                        );\n                        let docs_root = spt_store::perch::spt_home().join(\"docs\");\n                        match crate::docshost::start(docs_root, port) {\n                            Ok(bound) => eprintln!(\n                                \"DOCS_SERVER_UP: {}\",\n                                crate::docshost::docs_url(bound)\n                            ),\n                            Err(e) => eprintln!(\n                                \"DOCS_SERVER_BIND_FAIL: port {port}: {e} — docs surface \\\n                                 unavailable this run (daemon continues)\"\n                            ),\n                        }\n                    }\n                    Some(broker)\n                }\n                Err(e) => {\n                    eprintln!(\"BROKER_BIND_FAIL: {e}\");\n                    None\n                }\n            };\n\n        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\n        // the digest-control channel serves `spt digest <id>` snapshot pulls +\n        // delta-stream subscribes against it. Served on a background thread like\n        // the broker. The per-session feed that *populates* the hub is driven by\n        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\n        // sessions are spawned through the broker; a bare daemon serves the\n        // channel and answers \"no live digest\" until a session is hosted.\n        let digest_hub = Arc::new(DigestHub::new());\n        {\n            let hub = Arc::clone(&digest_hub);\n            thread::spawn(move || {\n                let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);\n            });\n        }\n\n        // The drive hub (M11-W2, REQ-SHELL-3) holds the per-shell ephemeral drive\n        // slot — the owner→shell control surface. Broker-held like the digest hub\n        // (the daemon-lifetime CLI-reachable anchor; a brain restart loses\n        // nothing — the slot is ephemeral control, a restart correctly drops it).\n        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\n        // [impl->REQ-SHELL-3]\n        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\n        {\n            let hub = Arc::clone(&drive_hub);\n            thread::spawn(move || {\n                let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);\n            });\n        }\n\n        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\n        // reliable-ordered byte stream's identifier map. Broker-held like the drive\n        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\n        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\n        // the shell binary's `api tunnel` resolve their stream end through it.\n        // [impl->REQ-SHELL-4]\n        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\n        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\n        // so it serves only when the broker bound; a net-less daemon has no tunnel.\n        if let Some(broker) = &broker_handle {\n            let hub = Arc::clone(&tunnel_hub);\n            let broker = Arc::clone(broker);\n            thread::spawn(move || {\n                let _ = crate::tunnelhub::serve_tunnel_control(\n                    &crate::endpoint::tunnel_socket_name(),\n                    hub,\n                    broker,\n                );\n            });\n        }\n\n        // Shell wake-watchers (M5-D4b) — the offline half of the shell\n        // online/offline exclusivity — now run in the BRAIN child (restoration\n        // D2-2): shellwake is brain-owned logic (ADR-0018 Q5 exception), a pure\n        // disk-reconciler whose boot sweep re-reconciles the watcher children on\n        // every brain start. The broker no longer hosts it; see\n        // [`crate::brainproc::run_brain`].\n        // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n\n        // Brain process supervisor (ADR-0018 Q2/Q3 — broker/brain process\n        // restoration): the broker is the always-up per-machine anchor; it spawns\n        // `spt daemon brain` as a supervised child and respawns it on exit. D3-3\n        // makes an update a *planned* restart on this same path: the supervisor's\n        // `BrainRestart` signal is wired into the broker so the `KIND_BRAIN_RESTART`\n        // verb (sent by `spt update apply` after the binary swap) cycles the brain\n        // onto the new binary with `start-reason=update`. The stop flag is held\n\n[Showing lines 149-318 of 1725. Use :319 to continue]"}],"details":{"truncation":{"content":"            }\r\n            for name in &att.detached {\r\n                // Plain prose (no Markdown markers): spt-daemon can't import the\r\n                // bin-local helpfmt renderer, so this one source string is authored\r\n                // marker-free rather than rendered. The `SUBNET_DETACHED:{name}`\r\n                // token is the machine contract; the rest is a human hint.\r\n                // [impl->REQ-CLI-OUTPUT-MARKDOWN]\r\n                eprintln!(\"SUBNET_DETACHED:{name} (startup default — run: spt subnet attach {name})\");\r\n            }\r\n        }\r\n\r\n        // The broker's network host (D4a, ADR-0004 §B): the node's iroh endpoint\r\n        // + live QUIC connections live in the broker so they survive a brain\r\n        // restart. Identity is the durable node.key (stable name across daemon\r\n        // restarts); relay stance comes from daemon.json; mDNS rides the\r\n        // endpoint (closing the §B mDNS/relay-session row by construction). A\r\n        // net failure degrades to a net-less broker — it must not cost PTY\r\n        // hosting (mirrors the broker-bind soft-fail below).\r\n        // [impl->REQ-DAEMON-2]\r\n        // Identity (the durable node.key) decides node_hex independently of the\r\n        // net bring-up: a NET_BIND_FAIL (e.g. the autostart beat the network up\r\n        // at boot — REQ-DAEMON-9) is transient and retried, but a broken\r\n        // identity is not, so we only arm the retry when identity is sound.\r\n        let node_hex: Option<String> = spt_store::nodeid::load_or_create()\r\n            .ok()\r\n            .map(|i| i.public_key().to_hex());\r\n        let net = if node_hex.is_some() {\r\n            try_start_net()\r\n        } else {\r\n            eprintln!(\"NODE_KEY_FAIL: identity unavailable — broker runs net-less, no retry\");\r\n            None\r\n        };\r\n\r\n        // The broker hosts PTYs (B1/B2) + the net endpoint (D4a). Serve it on a\r\n        // background thread; a bind failure there must not stop the seed channel\r\n        // (the B6 surface) — the PTY-hosting consumers arrive in B7/B8.\r\n        let net_up = net.is_some();\r\n        // Keep the broker handle alive past the bind so the brain supervisor's\r\n        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\r\n        // `KIND_BRAIN_RESTART` verb the broker serves must reach the supervisor.\r\n        let broker_handle: Option<Arc<Broker>> =\r\n            match Broker::bind_in_with_net(&broker_socket_name(), default_journal_path(), net) {\r\n                Ok(broker) => {\r\n                    let serve_broker = Arc::clone(&broker);\r\n                    thread::spawn(move || {\r\n                        let _ = serve_broker.serve();\r\n                    });\r\n                // Inbound net dispatch + outbound peer pump (D9-1) now run in\r\n                // the BRAIN child (restoration D2-1): they are pure IPC clients,\r\n                // so they live with the restartable brain and respawn with it.\r\n                // The broker keeps only the NetHost bring-up and the boot-race\r\n                // self-heal that binds it; the brain polls `net-status` and\r\n                // starts the consumers once net reports enabled.\r\n                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n                    if !net_up && node_hex.is_some() {\r\n                        // Boot-race self-heal (REQ-DAEMON-9): net failed to bind\r\n                        // but identity is sound — almost always the autostart\r\n                        // racing the network up at boot. Retry net in the\r\n                        // background and attach it to the broker when it\r\n                        // succeeds, so the node becomes reachable WITHOUT a\r\n                        // manual restart; the brain notices `net-status` flip\r\n                        // enabled and starts the consumers then.\r\n                        // [impl->REQ-DAEMON-9]\r\n                        let broker = Arc::clone(&broker);\r\n                        thread::spawn(move || net_retry_attach(broker));\r\n                    }\r\n                    // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):\r\n                    // bring saved startup defaults back up against the broker we\r\n                    // just bound. Background thread — a saved endpoint that fails\r\n                    // to come up logs loud and never blocks daemon start, the\r\n                    // seed channel, or the other replays.\r\n                    // [impl->REQ-ENDPOINT-AUTOSTART]\r\n                    thread::spawn(|| {\r\n                        crate::autostart::replay_startup_endpoints(&broker_socket_name());\r\n                    });\r\n                    // The node-local docs server (ADR-0036 §4): broker-side so\r\n                    // docs are up whenever the daemon is. Loopback only; a bind\r\n                    // failure (port squatted) logs loud and the daemon runs on —\r\n                    // docs are a degradable surface, never a boot blocker.\r\n                    // [impl->REQ-DOCS-LOCAL-SERVER]\r\n                    {\r\n                        let port = crate::docshost::resolve_docs_port(\r\n                            crate::config::DaemonConfig::load().docs_port,\r\n                            std::env::var(crate::docshost::DOCS_PORT_ENV).ok().as_deref(),\r\n                        );\r\n                        let docs_root = spt_store::perch::spt_home().join(\"docs\");\r\n                        match crate::docshost::start(docs_root, port) {\r\n                            Ok(bound) => eprintln!(\r\n                                \"DOCS_SERVER_UP: {}\",\r\n                                crate::docshost::docs_url(bound)\r\n                            ),\r\n                            Err(e) => eprintln!(\r\n                                \"DOCS_SERVER_BIND_FAIL: port {port}: {e} — docs surface \\\r\n                                 unavailable this run (daemon continues)\"\r\n                            ),\r\n                        }\r\n                    }\r\n                    Some(broker)\r\n                }\r\n                Err(e) => {\r\n                    eprintln!(\"BROKER_BIND_FAIL: {e}\");\r\n                    None\r\n                }\r\n            };\r\n\r\n        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\r\n        // the digest-control channel serves `spt digest <id>` snapshot pulls +\r\n        // delta-stream subscribes against it. Served on a background thread like\r\n        // the broker. The per-session feed that *populates* the hub is driven by\r\n        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\r\n        // sessions are spawned through the broker; a bare daemon serves the\r\n        // channel and answers \"no live digest\" until a session is hosted.\r\n        let digest_hub = Arc::new(DigestHub::new());\r\n        {\r\n            let hub = Arc::clone(&digest_hub);\r\n            thread::spawn(move || {\r\n                let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);\r\n            });\r\n        }\r\n\r\n        // The drive hub (M11-W2, REQ-SHELL-3) holds the per-shell ephemeral drive\r\n        // slot — the owner→shell control surface. Broker-held like the digest hub\r\n        // (the daemon-lifetime CLI-reachable anchor; a brain restart loses\r\n        // nothing — the slot is ephemeral control, a restart correctly drops it).\r\n        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\r\n        // [impl->REQ-SHELL-3]\r\n        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\r\n        {\r\n            let hub = Arc::clone(&drive_hub);\r\n            thread::spawn(move || {\r\n                let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);\r\n            });\r\n        }\r\n\r\n        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\r\n        // reliable-ordered byte stream's identifier map. Broker-held like the drive\r\n        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\r\n        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\r\n        // the shell binary's `api tunnel` resolve their stream end through it.\r\n        // [impl->REQ-SHELL-4]\r\n        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\r\n        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\r\n        // so it serves only when the broker bound; a net-less daemon has no tunnel.\r\n        if let Some(broker) = &broker_handle {\r\n            let hub = Arc::clone(&tunnel_hub);\r\n            let broker = Arc::clone(broker);\r\n            thread::spawn(move || {\r\n                let _ = crate::tunnelhub::serve_tunnel_control(\r\n                    &crate::endpoint::tunnel_socket_name(),\r\n                    hub,\r\n                    broker,\r\n                );\r\n            });\r\n        }\r\n\r\n        // Shell wake-watchers (M5-D4b) — the offline half of the shell\r\n        // online/offline exclusivity — now run in the BRAIN child (restoration\r\n        // D2-2): shellwake is brain-owned logic (ADR-0018 Q5 exception), a pure\r\n        // disk-reconciler whose boot sweep re-reconciles the watcher children on\r\n        // every brain start. The broker no longer hosts it; see\r\n        // [`crate::brainproc::run_brain`].\r\n        // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n\r\n        // Brain process supervisor (ADR-0018 Q2/Q3 — broker/brain process\r\n        // restoration): the broker is the always-up per-machine anchor; it spawns\r\n        // `spt daemon brain` as a supervised child and respawns it on exit. D3-3\r\n        // makes an update a *planned* restart on this same path: the supervisor's\r\n        // `BrainRestart` signal is wired into the broker so the `KIND_BRAIN_RESTART`\r\n        // verb (sent by `spt update apply` after the binary swap) cycles the brain\r\n        // onto the new binary with `start-reason=update`. The stop flag is held\r","truncated":true,"truncatedBy":"lines","totalLines":1577,"totalBytes":9955,"outputLines":170,"outputBytes":9955,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"        {\n…\n            if let Err(e) = att.save() {\n…\n            }\r\n            for name in &att.detached {\r\n                // Plain prose (no Markdown markers): spt-daemon can't import the\r\n                // bin-local helpfmt renderer, so this one source string is authored\r\n                // marker-free rather than rendered. The `SUBNET_DETACHED:{name}`\r\n                // token is the machine contract; the rest is a human hint.\r\n                // [impl->REQ-CLI-OUTPUT-MARKDOWN]\r\n                eprintln!(\"SUBNET_DETACHED:{name} (startup default — run: spt subnet attach {name})\");\r\n            }\r\n        }\r\n\r\n        // The broker's network host (D4a, ADR-0004 §B): the node's iroh endpoint\r\n        // + live QUIC connections live in the broker so they survive a brain\r\n        // restart. Identity is the durable node.key (stable name across daemon\r\n        // restarts); relay stance comes from daemon.json; mDNS rides the\r\n        // endpoint (closing the §B mDNS/relay-session row by construction). A\r\n        // net failure degrades to a net-less broker — it must not cost PTY\r\n        // hosting (mirrors the broker-bind soft-fail below).\r\n        // [impl->REQ-DAEMON-2]\r\n        // Identity (the durable node.key) decides node_hex independently of the\r\n        // net bring-up: a NET_BIND_FAIL (e.g. the autostart beat the network up\r\n        // at boot — REQ-DAEMON-9) is transient and retried, but a broken\r\n        // identity is not, so we only arm the retry when identity is sound.\r\n        let node_hex: Option<String> = spt_store::nodeid::load_or_create()\r\n            .ok()\r\n            .map(|i| i.public_key().to_hex());\r\n        let net = if node_hex.is_some() {\r\n            try_start_net()\r\n        } else {\r\n            eprintln!(\"NODE_KEY_FAIL: identity unavailable — broker runs net-less, no retry\");\r\n            None\r\n        };\r\n\r\n        // The broker hosts PTYs (B1/B2) + the net endpoint (D4a). Serve it on a\r\n        // background thread; a bind failure there must not stop the seed channel\r\n        // (the B6 surface) — the PTY-hosting consumers arrive in B7/B8.\r\n        let net_up = net.is_some();\r\n        // Keep the broker handle alive past the bind so the brain supervisor's\r\n        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\r\n        // `KIND_BRAIN_RESTART` verb the broker serves must reach the supervisor.\r\n        let broker_handle: Option<Arc<Broker>> =\r\n            match Broker::bind_in_with_net(&broker_socket_name(), default_journal_path(), net) {\r\n                Ok(broker) => {\r\n                    let serve_broker = Arc::clone(&broker);\r\n                    thread::spawn(move || {\r\n                        let _ = serve_broker.serve();\r\n                    });\r\n                // Inbound net dispatch + outbound peer pump (D9-1) now run in\r\n                // the BRAIN child (restoration D2-1): they are pure IPC clients,\r\n                // so they live with the restartable brain and respawn with it.\r\n                // The broker keeps only the NetHost bring-up and the boot-race\r\n                // self-heal that binds it; the brain polls `net-status` and\r\n                // starts the consumers once net reports enabled.\r\n                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n                    if !net_up && node_hex.is_some() {\r\n                        // Boot-race self-heal (REQ-DAEMON-9): net failed to bind\r\n                        // but identity is sound — almost always the autostart\r\n                        // racing the network up at boot. Retry net in the\r\n                        // background and attach it to the broker when it\r\n                        // succeeds, so the node becomes reachable WITHOUT a\r\n                        // manual restart; the brain notices `net-status` flip\r\n                        // enabled and starts the consumers then.\r\n                        // [impl->REQ-DAEMON-9]\r\n                        let broker = Arc::clone(&broker);\r\n                        thread::spawn(move || net_retry_attach(broker));\r\n                    }\r\n                    // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):\r\n                    // bring saved startup defaults back up against the broker we\r\n                    // just bound. Background thread — a saved endpoint that fails\r\n                    // to come up logs loud and never blocks daemon start, the\r\n                    // seed channel, or the other replays.\r\n                    // [impl->REQ-ENDPOINT-AUTOSTART]\r\n                    thread::spawn(|| {\r\n                        crate::autostart::replay_startup_endpoints(&broker_socket_name());\r\n                    });\r\n                    // The node-local docs server (ADR-0036 §4): broker-side so\r\n                    // docs are up whenever the daemon is. Loopback only; a bind\r\n                    // failure (port squatted) logs loud and the daemon runs on —\r\n                    // docs are a degradable surface, never a boot blocker.\r\n                    // [impl->REQ-DOCS-LOCAL-SERVER]\r\n                    {\r\n                        let port = crate::docshost::resolve_docs_port(\r\n                            crate::config::DaemonConfig::load().docs_port,\r\n                            std::env::var(crate::docshost::DOCS_PORT_ENV).ok().as_deref(),\r\n                        );\r\n                        let docs_root = spt_store::perch::spt_home().join(\"docs\");\r\n                        match crate::docshost::start(docs_root, port) {\r\n                            Ok(bound) => eprintln!(\r\n                                \"DOCS_SERVER_UP: {}\",\r\n                                crate::docshost::docs_url(bound)\r\n                            ),\r\n                            Err(e) => eprintln!(\r\n                                \"DOCS_SERVER_BIND_FAIL: port {port}: {e} — docs surface \\\r\n                                 unavailable this run (daemon continues)\"\r\n                            ),\r\n                        }\r\n                    }\r\n                    Some(broker)\r\n                }\r\n                Err(e) => {\r\n                    eprintln!(\"BROKER_BIND_FAIL: {e}\");\r\n                    None\r\n                }\r\n            };\r\n\r\n        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\r\n        // the digest-control channel serves `spt digest <id>` snapshot pulls +\r\n        // delta-stream subscribes against it. Served on a background thread like\r\n        // the broker. The per-session feed that *populates* the hub is driven by\r\n        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\r\n        // sessions are spawned through the broker; a bare daemon serves the\r\n        // channel and answers \"no live digest\" until a session is hosted.\r\n        let digest_hub = Arc::new(DigestHub::new());\r\n        {\r\n            let hub = Arc::clone(&digest_hub);\r\n            thread::spawn(move || {\r\n                let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);\r\n            });\r\n        }\r\n\r\n        // The drive hub (M11-W2, REQ-SHELL-3) holds the per-shell ephemeral drive\r\n        // slot — the owner→shell control surface. Broker-held like the digest hub\r\n        // (the daemon-lifetime CLI-reachable anchor; a brain restart loses\r\n        // nothing — the slot is ephemeral control, a restart correctly drops it).\r\n        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\r\n        // [impl->REQ-SHELL-3]\r\n        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\r\n        {\r\n            let hub = Arc::clone(&drive_hub);\r\n            thread::spawn(move || {\r\n                let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);\r\n            });\r\n        }\r\n\r\n        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\r\n        // reliable-ordered byte stream's identifier map. Broker-held like the drive\r\n        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\r\n        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\r\n        // the shell binary's `api tunnel` resolve their stream end through it.\r\n        // [impl->REQ-SHELL-4]\r\n        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\r\n        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\r\n        // so it serves only when the broker bound; a net-less daemon has no tunnel.\r\n        if let Some(broker) = &broker_handle {\r\n            let hub = Arc::clone(&tunnel_hub);\r\n            let broker = Arc::clone(broker);\r\n            thread::spawn(move || {\r\n                let _ = crate::tunnelhub::serve_tunnel_control(\r\n                    &crate::endpoint::tunnel_socket_name(),\r\n                    hub,\r\n                    broker,\r\n                );\r\n            });\r\n        }\r\n\r\n        // Shell wake-watchers (M5-D4b) — the offline half of the shell\r\n        // online/offline exclusivity — now run in the BRAIN child (restoration\r\n        // D2-2): shellwake is brain-owned logic (ADR-0018 Q5 exception), a pure\r\n        // disk-reconciler whose boot sweep re-reconciles the watcher children on\r\n        // every brain start. The broker no longer hosts it; see\r\n        // [`crate::brainproc::run_brain`].\r\n        // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n\r\n        // Brain process supervisor (ADR-0018 Q2/Q3 — broker/brain process\r\n        // restoration): the broker is the always-up per-machine anchor; it spawns\r\n        // `spt daemon brain` as a supervised child and respawns it on exit. D3-3\r\n        // makes an update a *planned* restart on this same path: the supervisor's\r\n        // `BrainRestart` signal is wired into the broker so the `KIND_BRAIN_RESTART`\r\n        // verb (sent by `spt update apply` after the binary swap) cycles the brain\r\n        // onto the new binary with `start-reason=update`. The stop flag is held\r","startLine":143,"lineNumbers":[143,null,147,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\daemon.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1725,"totalBytes":9955,"outputLines":170,"outputBytes":9955,"shownRange":{"start":149,"end":318},"nextOffset":319}}},"isError":false,"timestamp":1784271542420}}
{"type":"message","id":"ca10cc4a","parentId":"34118a29","timestamp":"2026-07-17T06:59:02.459Z","message":{"role":"toolResult","toolCallId":"call_JiqQgwuYSgL2YGeU6DtC7beY|fc_0a061eb498f0e908016a59d2b64d3c81969c8001c2f790acee","toolName":"read","content":[{"type":"text","text":"    fn dispatch_net_stream_subscribe(\n…\n    ) -> Result<u64, String> {\n…\n        host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)\n            .map_err(|e| e.to_string())?;\n        Ok(req.stream_id)\n    }\n\n    /// Attach a brain to the conn-liveness event log from a cursor (D4c) — the\n    /// PresenceChannel broker seam: gapless resume over connection presence,\n    /// same discipline as a stream subscribe.\n    // [impl->REQ-EP-4]\n    fn dispatch_net_presence_subscribe(\n        &self,\n        env: Envelope,\n        send: &SharedSend,\n    ) -> Result<(), String> {\n        let req: NetPresenceSubscribeReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-presence-subscribe payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        host.subscribe_presence(Arc::clone(send), req.from_seq);\n        Ok(())\n    }\n\n    /// Terminate a session's child. The exit waiter emits the `exit` frame and\n    /// reaps the session once the child is dead.\n    fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {\n        let req: KillReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;\n        let sessions = recover(&self.sessions);\n        let h = sessions\n            .get(&req.session_id)\n            .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n        h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))\n    }\n\n    /// W3d (ADR-0025): apply a live adapter update to every session running\n    /// `req.adapter`. LOCK DISCIPLINE (binding): the sessions `Mutex` is never held\n    /// across the bounded `terminate()` or the CRC swap — only across the\n    /// snapshot, the per-session `input` fetch, and the re-insert.\n    ///\n    /// 1. snapshot the affected `(id, endpoint, old translation)` under the lock,\n    ///    then RELEASE it;\n\n[Showing lines 4434-4473 of 6298. Use :4474 to continue]"}],"details":{"truncation":{"content":"        host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)\n            .map_err(|e| e.to_string())?;\n        Ok(req.stream_id)\n    }\n\n    /// Attach a brain to the conn-liveness event log from a cursor (D4c) — the\n    /// PresenceChannel broker seam: gapless resume over connection presence,\n    /// same discipline as a stream subscribe.\n    // [impl->REQ-EP-4]\n    fn dispatch_net_presence_subscribe(\n        &self,\n        env: Envelope,\n        send: &SharedSend,\n    ) -> Result<(), String> {\n        let req: NetPresenceSubscribeReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-presence-subscribe payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        host.subscribe_presence(Arc::clone(send), req.from_seq);\n        Ok(())\n    }\n\n    /// Terminate a session's child. The exit waiter emits the `exit` frame and\n    /// reaps the session once the child is dead.\n    fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {\n        let req: KillReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;\n        let sessions = recover(&self.sessions);\n        let h = sessions\n            .get(&req.session_id)\n            .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n        h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))\n    }\n\n    /// W3d (ADR-0025): apply a live adapter update to every session running\n    /// `req.adapter`. LOCK DISCIPLINE (binding): the sessions `Mutex` is never held\n    /// across the bounded `terminate()` or the CRC swap — only across the\n    /// snapshot, the per-session `input` fetch, and the re-insert.\n    ///\n    /// 1. snapshot the affected `(id, endpoint, old translation)` under the lock,\n    ///    then RELEASE it;","truncated":true,"truncatedBy":"lines","totalLines":1865,"totalBytes":1822,"outputLines":40,"outputBytes":1822,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn dispatch_net_stream_subscribe(\n…\n    ) -> Result<u64, String> {\n…\n        host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)\n            .map_err(|e| e.to_string())?;\n        Ok(req.stream_id)\n    }\n\n    /// Attach a brain to the conn-liveness event log from a cursor (D4c) — the\n    /// PresenceChannel broker seam: gapless resume over connection presence,\n    /// same discipline as a stream subscribe.\n    // [impl->REQ-EP-4]\n    fn dispatch_net_presence_subscribe(\n        &self,\n        env: Envelope,\n        send: &SharedSend,\n    ) -> Result<(), String> {\n        let req: NetPresenceSubscribeReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-presence-subscribe payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        host.subscribe_presence(Arc::clone(send), req.from_seq);\n        Ok(())\n    }\n\n    /// Terminate a session's child. The exit waiter emits the `exit` frame and\n    /// reaps the session once the child is dead.\n    fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {\n        let req: KillReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;\n        let sessions = recover(&self.sessions);\n        let h = sessions\n            .get(&req.session_id)\n            .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n        h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))\n    }\n\n    /// W3d (ADR-0025): apply a live adapter update to every session running\n    /// `req.adapter`. LOCK DISCIPLINE (binding): the sessions `Mutex` is never held\n    /// across the bounded `terminate()` or the CRC swap — only across the\n    /// snapshot, the per-session `input` fetch, and the re-insert.\n    ///\n    /// 1. snapshot the affected `(id, endpoint, old translation)` under the lock,\n    ///    then RELEASE it;","startLine":4426,"lineNumbers":[4426,null,4430,null,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":1822,"outputLines":40,"outputBytes":1822,"shownRange":{"start":4434,"end":4473},"nextOffset":4474}}},"isError":false,"timestamp":1784271542459}}
{"type":"message","id":"5deb76fe","parentId":"ca10cc4a","timestamp":"2026-07-17T07:00:34.823Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Assessing broker thread management limits**\n\n**Analyzing Drain drop and EOF behavior**\n\n**Identifying Windows PTY reader thread leak**"},{"type":"thinking","thinking":"**Analyzing watchdog leak causes**\n\n**Investigating ConPTY teardown and drain cleanup**\n\n**Confirming drain thread leak from session reuse**"},{"type":"thinking","thinking":"**Analyzing connection leak causes**\n\n**Investigating session write blocking and thread leaks**\n\n**Tracing high-throughput PTY output behavior**"},{"type":"thinking","thinking":"**Identifying resource leak in retired QUIC streams**\n\n**Tracing thread leaks from retained subscriber seats**\n\n**Mapping subscription and retirement code paths**"},{"type":"thinking","thinking":"**Assessing subscriber detachment on connection close**\n\n**Analyzing Brain connection lifecycle and subscriber cleanup**\n\n**Calculating thread usage for PTY sessions and viewers**"},{"type":"thinking","thinking":"**Evaluating thread legitimacy per session count**\n\n**Detailing long-lived broker thread types**\n\n**Clarifying control hub connection threading scope**"},{"type":"thinking","thinking":"**Searching daemon thread startup paths**"},{"type":"toolCall","id":"call_SdlSwuGgf3ZVfkZadrhs0sHU|fc_0a061eb498f0e908016a59d312c1688196b244609de0cd444b","name":"grep","arguments":{"i":"Finding daemon startup spawns","pattern":"spawn_[a-zA-Z_]+\\(|thread::spawn|std::thread::spawn|Builder::new\\(\\)","path":"crates/spt-daemon/src/daemon.rs","selector":"300-450","case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_s7D62QfFLCMJu1j45qsLPnvt|fc_0a061eb498f0e908016a59d312c18481968e13b3f69b59b214","name":"grep","arguments":{"i":"Finding broker control acceptors","pattern":"pub fn serve|fn serve|listener\\.accept|thread::spawn|std::thread::spawn","path":"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_zYYz6oyEd6iIYhDAYvjaJ5gM|fc_0a061eb498f0e908016a59d312c190819698b948e3b87b4009","name":"grep","arguments":{"i":"Finding stream consumer lifetimes","pattern":"cold_start|net_stream_subscribe|net_presence_subscribe|net_stream_retire|serve_attach|Brain","path":"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/attach.rs; crates/spt-daemon/src/sync.rs; crates/spt-daemon/src/xfer.rs; crates/spt-daemon/src/propagate.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_6TjSxbzPEgzCqJVnS0Vk8uN3|fc_0a061eb498f0e908016a59d312c1988196940a4728f282d978","name":"grep","arguments":{"i":"Finding viewer count storage","pattern":"viewer_count|controlled|driven_by","path":"crates/spt-store/src; crates/spt-daemon/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_EJZP0uSgTUNHsCW4NEAo5I3w|fc_0a061eb498f0e908016a59d312c1a08196906114f11e7d8a0e","name":"read","arguments":{"i":"Reading dispatch worker connection","path":"crates/spt-daemon/src/dispatch.rs","selector":"730-850"}},{"type":"toolCall","id":"call_bqGZM1LEKHLlHDhOcL7zaHwa|fc_0a061eb498f0e908016a59d312c1ac8196a3bbd6a505713001","name":"read","arguments":{"i":"Reading attach serve connection","path":"crates/spt-daemon/src/attach.rs","selector":"230-340,500-625"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":11519,"output":3635,"cacheRead":136704,"cacheWrite":0,"totalTokens":151858,"reasoningTokens":3179,"cost":{"input":0.05759500000000001,"output":0.10905000000000001,"cacheRead":0.068352,"cacheWrite":0,"total":0.234997}},"stopReason":"toolUse","timestamp":1784271542500,"responseId":"resp_0a061eb498f0e908016a59d2b6c3548196948192e626c997a6","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d2b84b008196b4de0834e0f01e93","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdLGefwJn2pPgbn0esfHGZFD9gnITx5oIeuWfsGKUCOTH7MYZQJlBKNC5mrm8orziu-yMyYp6xhhs3I_IH8sylcFX-LapVZUB_weuUBQTJ383YBsYHT7CwmPEpxo-rK3MHJI-d1XETn-1FBHRmfM9X083UMInot2nOXWW0qcWqfF1IvnE_xUWb4RFypNgSNN9ij6-VqKJ7Bo-XMYxJLyGPndT0NlOMo9BJ3neaDU5wZBtfdc-qYqI80ew_16Jn3RZNZnqjsx4OxKst_XWJdIQGP0-mg09mk5_ajNjjTGYOgz-PKUUgeUWF4JL6wt79Dvoy2Zw29xDIomkqqD-qeWzE7CrCRj41Xbih_d-scpY8DN2d0yNplnQGkmzJbJOCqFXd-xoZeG83P88FqFQcWM7tTvk50y36qnU-hwi88-yeQUalpXOlUs67ZcuJ0x5MGf3zlpPr9Bzq8V0WmZRQ4LECSgKr5a_Bov5SO290nob1MofkB3uhSfuf0B16Ol92UfIqoNTWodsRx9tIY3xdwf2svpsRuYqrpS3vN3qVu1kqCgGMCPBtn64ukozD6OnZVYgQJBzUMOplxH-G-srpcWJf1hQckO82fQNssMB_LgFNJstObz8FipFhsQeBNOCBdw1T5-9p2jB_ULiAJ5s9JyB0BVfA9PjIED-Iezpmn67SLq04cghV1J4qn2zuFetzS-Yjj-OsKmoYNlOEOuF3pMs9RQIXyqBQsaD14BdE4TGfM4iaPBL0UKchvZW6QwbLomPH4gnsJ5_sNUrCt6eVZQs542sgbm6cmE79bC0h9LkeNKCzsyILpXzBUOr9Pg39Mvbj8Qyl7tfM4XyaAwIfwfJQ-QCWf0GqULFZcaJVhlaebjyfHMlvCesBPjTfpJWqenpwJmJOfBiT1JzecQi5y0ofrN37vDtIoHVFJ3HqMkGOcJkBICe9kE1eezv4KouXmEeeulIrF_hwCPY-2N_VrAa6_ZLMVdYF8M4JMf5k__uc1XW8CWYysPk4xhA8cKYQrxh5EAed1L1zdgNA_J26zfeSv02pFn_9H5-mP29a7hEgL9XFHf6Igy7Mmqook5jPyY948z156Lwwmw-p3DufJ3BIXhw_3AobJWw4ikC-JLGcsfXCZP31GSo9XnSpoOf6iK93Y7XxYpLVsJO97frw5lrpJE7FPuWRnvjC3X3DkmFWg3SMTbPSQF5LeP04OLPrOg0e-k4cGjDpnEC-Szgw_1RVdUHEhVMIM0AKDoBnwDMOTw-Q-2irtvi0lwGskklXpFtq4AWn-Y4k3mO8NI0K1DBjGOSS2wAxeGfNYU6kNQQ4WPrhCMNpAxLawB2iSZxrqMTDmIgWLjizkL0SliD_EKn9HbEVPz5JXaBqiMCQM6Xg_BFe-ml0aqsbQhfX2QQOp69JV-NLYovcxxXFWAojXapVforpZv9lSYeFKJN4WdMnX1WP52sB52bVvW-AHra75N2F10s36D92dfqtf9Au60712ABrP_V35BZc-0ENH4znOzzDLCfcanpBi31dWcUiQcKbsnC0ANXq8TCwdtKD4Mq5NPdHEDhvvhr2YeBh65vAwXLypGTZjp1LqM0KQJ29E77-mRQl2m2D9Arfwml2__yzKA7hVtZnn8s0CJIDEG4Odhlj6gcK5ievzfjj91QWxJ4IgeJFNueysSQ5U1V9ZS-IeWNdsp2r_9DTDsGc5hMmBm_voBRMS0kwiZzThvLoreIgOsWOnf3YOcOt6-PhbepJYWM1N6TzQYTHiJoR_KKTAHkQjbdUZcGpKYCmO8tNaBbGT6T8pwuBbagHhrmSSXAIAgHQn9GNI1M4Y-N-NW44WgosRkaQrRb-2_RHhMHq5hiSH6PatJ5a-xb1STfoQVo0eHX8fe11QMEr31Q9fX_GawxckJk-9aZxmpvVx6PE8FLHon2LITFegPIe_Yx72ya9olAP_YzyUa34A1hAoQD4DFgwkMxVGw6G0b5RfKEgP86oAXGwvXvPg5ytC4JMGIPXPgqu8NVdc_wkV38dCFJbK3IJOGykmBqkwAlmRZJEmFg8x88D-hnBihR4q1XYA8_vuAwZ__XZvWWhsqIP19KoHNqE0BYeD49H6c7kbkQl_urh4yFe65FTP7M5a-_uFdWq1WJzY8gH64FcUOc40TnkKsBTY8z0IvqnI0WRxAoupQzR32r2Wu1C-r1otvoI_ICK8gnAQ1ryCui4vYuSYIVxCqDL01H1tqdZ6AemJpPsMQWgjXFnAGTaMgFlAgHjZFa0dJNhC2ButquLwJz68ZVgm7GampjgkT8yNJ4jzHTg7ow511vpccYo6hjzh15Nq_5uayZISP-rNypR2xGq1eZthj_FzmEeUEtHyUNJ92gHFmtynUpCsUSSSuc5pchhrWuJzw7cySyEZip1G2hOoPyMSGlyLApdz_ZVIj5RXNymvVQMF3MtBrigdIHKfJVRMuGDZNsNGQFZol2N9NyUUF26skQSyL01A94zbFOYgznMCG4-yguUGcfgko9RFU3hYHFtJbFWUQjHUc6NoqKjwkL7jYh5XM0k1g_UNdcWqr-lr05OCKk3Yh8bUW3MhrH7d9MqkegzaBOAfyQkRP2lZT89zaKsU5y4B6iT7MyW-8LsRycr_2mIVdFrefMdnJbz_V1CuCL9loJFPcfPMqaSwtokQYEo1cUZ22b7akg3QUmBUEZxM6qh2dsXev4pP3Iu4Ov7Grfrgg2YxK0i-fGXu8_Ry65eZcFC95Nz4nEDSSrV2b0cgjSBASwPEu7HroSSWB3Tp-j43Mwf-j3URGkD0FmPSyV2gRDfYmzQhxQlmIQMdT8N0bTzV3xIPS-RmS3Ki_Av775s38VekVpCu72LNkYghr_Zm3L67qvdh1o6IydhGfxWHeHpVu9bAI7ZPSHRquH5yH6AdbDxScaEmw4bDwVh_M8Eeu6SfZsD3pbcXknCVzvTzCzI-o2eB_0sDhWOxuAOFzUIaZjJoMCoyBsnErF0XUozJs5esuHtsvAsC8Gr-iE3Mj2yPMSBflsUvISaYIXouBd67o8u-JdiHbsCBMNtxTk3dn8F7_bFHl7e5gDj8nxFwNM6N9yW6dxZdGCM3f8DqvgxYK6Mr354Z5zGobRs_b6y3-skTB5X4eAUlLgiT9EXk_n-Lo6Z1uZMq2LogqXz8zjRgZOu37kUi7tcfRb80BLHtHEa1dbuZT5JLSurA5M81Vm-ljx_UEQ7R-BRMu3OxnPkCz0Z5v_7_37yjbxhAtX4h0zhCNLkvoBWLFwTuIMOli5-522EQ4EY-N-RrSo0ptYO6evpOpK4nXSmOCvT4IdPKksuYPJ_dWoqichHyRycyEghO8N-CTcI8nLoYXlQGPpQ0RWvMdV4q0rjWCFCw1tMBok9SLY0rglAi1f_mrbq1Fw5sc1Zz6JAcV6SghifpzfFd8Y-o4oarABagQ7Cv9y875WWQvrLQJ8gM2vb1fv9Br2Mhn5OgLPLhMtiSiWYupNAcV6UCjxMLlW_O7d8m3oPazxDpEgwBqT7Q5eOJOlaT9tMJUy2Aa0i6eZ_Cpkyjrdrjk7hVYyE7gvLSEZO8F_KONipVzQC7sP4xvY3FnqS22hsoLxyr2cX_X6ipuV4Ot_sjyU2JrrzRziL5y_Aiwz_Qu0zUOU9OC7cryRMXQLSDSPhyW8O3lqqEXXh4lGHGlNODYG2ZRJhhpDAtRSCeIp62y3IFlIlmhubiSRowDcZiSDdZVUpzhk0-yieBhFzwxFA5zWS_lJmTbdu8LQtBhjEmaIhr4qNVTlCiOnsU7NUaI-rriwmvoXNQWW7PLNuP7V0-yGEFeRkXG8Aq-BgsCuo3CEYf7JhxtX3JkRJSRc9wtwRjbNDUHU0fEvaX5oFYxOmMd0ioxDSyT8mPJgAq4Y0Ia71IpojgCWlyIhrLdouVi3lAyY8sUmELzBowgmT29qp3P4XNbstx3GPR0sBYI2AOs3yaViaCq6c9iyt47P-hBvrOSh6hHv0pP3i54gMq9pwjiN3D7n7caPe18a83__Aqx7QYcARCPu2Jb1AJQFKoxGml0I70_Z_WuZsBtHtPovCaHG9xE6qd7eAsQkziFH28_ExkFBCra6FLsMwJdoeS76YYIKSTHxZtnRF0kHfyLnhpjOvdxlJJEJGhxtFeObWtMWrAtdUjnceuO_1Sa2SlFKDsm25FDrLI0yOF7iu96P0SEGbvUfr8LsxgTBAUwhXBReJFhD9kk8r8a-dSdLsSIQ2zNhNETJ2NeM4jsQ8u2vrycVI_XCMY5hfaWCIh0ZrZlzu4lQnrcQpXDR57n8voeSRQx1j9-1wa3V3zUDsmo59Y9NVNBBUpjRaaeX4RRpdRjwyDU2PMUT302AzO5OTtq","summary":[{"type":"summary_text","text":"**Assessing broker thread management limits**"},{"type":"summary_text","text":"**Analyzing Drain drop and EOF behavior**"},{"type":"summary_text","text":"**Identifying Windows PTY reader thread leak**"}]},{"id":"rs_0a061eb498f0e908016a59d2c668c88196a7b697a21a8e4a95","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdLTcXhTu0XzrWMx_-piHvlXbDEcwrdDgx99j8frfSZ86cQUtySlh-Xgx_gpeZDc4eGISm3H6252zAlnEEoLcXFaRcfjqCyaIAM06wYNhZPtrA4z326wJdU6dp9pzpRcJyM8v28Zsqho7P_qfxDE768qm-PQ6L5ex0kPvhzi8YToIMqO19ZSWM1tax_Egn3FEqfac1a2sZxj6G91Phgx8CvgibrabFgE39W3kAMwKein41shD2hegBfGAX4hBZ_Xuksz9B1YCz_7XksiIKSS4OkPsWl9Wb5qZSvurMlCuxlSFvOkpNJirREf2A-T5NxLelAox1FlJwvNHJWkplTgjNPifIsWeSFb3V02sOSa609bgsTAPylG72-wY-OQz9if3Xis9leimsTwo5QXC54_0OS8IVD0hfflC5mrI_MuGCEssUWorzDDGXpeOrACK-Rm0dfZwluu3mQ3OnqzrmEae5wS_06ByLY8rCo7-B9nGzfcQRdjycPBfynUTMFf8rJSAfo32j-crk0HZRwDXwghjU217QsUmXnWVemu0G5cTGiNuszgobWj4I76icXt7etrRBuerxQZeTizqWf4mFFva2C8gQEqWnReQa-WXtytOY655CXqXUC_LyxHWECmJXVvk7aRT10xlR4F71u-PbIih9VLQ1_OPa4RUvQEeOuvr5M_eTv2Ak74b0ClNirBWZzasX1E8rq7cT6bfY9rKDXVjCF4s8PjPejO3ymGDS1es6txFlKk9S-fhPRLFCsOkSa8W04g7Ep8q48t7U7b6Hxnj9m82LBkcKhbUdhH6Dwrk65KDJHK27Ok8bwzFxhPmzAKODTNCnk2H1kBxUJjORD5SLMOpVkWuoa3-aCVT-rrmXTgyLanxU9G3GhmPf4ZXEsyMeJPXruUt4Wjn9O-LReBPFaI4RT56Rzw0iM7BNJQtvE-1QtPgRncouVJXVltNiyJrJqe70u95-ZMnlFXBjTNjJnIJRA62Q4kHRE4luMvMFY1fwrpdqMj4jRY0CKrUAh4VkM0zmScbe2DjXnKzEuSKu778GiGQDt6DsuUe1vHCDp3mICM5Elksk07PVqlEe1beukw1LNAQjGZj3cZ_etWRdA2vo-9vMKtL_U3YMJ2LQjYdlZTZB2yb-ZerLQr8kR2rbPlmiq1-jC2hYQYdxw7dv1FXC6ArmX8Ij8Rtop6T2jswo0usMuJAfdFxfnxoG2tt38mLqTKx4zgGO9z4lHpS1ksSf-9iyznfzBBS3dYsAHBz-pEdxaiFlQAJY3RHV8-C6eRAvpjNqecnVlkcPVzTdoJg7GxHUIVFi8EyO3hO5Y5-Tr5XYmqibq2kn8h7Rwujs9xVAs0GazjkFeIecXZBOzj-WMsJm9jz6lgffxm0xaI6Lz_AjhpGjV_gEL24Aa6m2kPeriEi_UnteKUm4_8MHvUUXWjqtqUeag5ctL9gI97Guko5sAcQOvFfktlTzATz_dXBEEhZqd7wnJ2DrvuRb184JTcfptRwSiFAxHzsvmNbfqaG69anxYykhMQXShqVEazsAOThqEZ90RByDAXmxUcifbRoZrpZxSMv6NglL53Yp8rBYd037R93LTDit1fVZ7yGrk3O0SmcmuiQGHaFJq8L2lQp5ohmkp9-mV-diynV4_D7HO8l1yn0YmRONpBnOcbgKgSQqZHMH14ntrMu_swQqIGn27AVb5BnkoIO1gCzJK_dDZqYtjpDxfICMBzPmA1DJYbGZPjTJKt5d3gODnKZ6o68bcnwZHtdGhE820ZdpDE_TKL2_Bgnieop7-YHd2c5J3XjKFNCgo4P6CxAOfE5EgEKreboTMnp0dPpFukQjvUBw3k4Ue4pFVYY4Fagwo5FQhglJjwVgZcVq-bDNEOaC7bBLRnBbySGjaQnJPO8GNtOKIqvoOJ9VeJubbgQh9MU5Jw8zR1bXDVadHIOFTjCTfbrgGUYKcQcLYEy7vJEloElOznibsRsVBnuFkXgV0ig5JZjZ-lyz9bRJaYVU86k5npgplcr0vTXzD25X5AuqetDlAOZ50nu9_vxjtd_p9cLAdtM0fsCgyRrfFTczVk0mQT1gu2-yMqwsX8DSz0QKt6OWZYRV4vRciyxmFdp3lHXhzVHo0SIATFaCkYk5nnR6I3z1R7qwdJiYY_glJiMco3pTpXksP3bTMwOOfUwzHruabMSChtuIUcAJrkeZERYw4KFX0YB6k7dXbw7S8e0M2nNQRmDDpU_1JNEtRLy9liiDYQ5t2LcLwcrtHA3UkLGWI8fwqNrpj36Y2WBj6QpTpfltoTBhFkn9cUlUQjDx-nUsRoke0X7ZN1KoORp1cOOurt_BhvQYLIaC2sUKWJs58wLqm5mmreKJWAjigyNcqm2bTd5czL87TsYCgxwW43railXV46qT75SWprWWvvc0ZunSlSm0SLdtnGxlkX4itnACyhTcrmESeV2ukKO2p-fyq4eiH1SysC3OqPkK6bZGmLU8MQBeaR7YM2EbXXqeBeEIpc22eA_3BfkG2LquIzso-ogwDWDQZru1Q-3mbB3G55T9kLpWfbGGxIAlYw0Annb2iu7mEb5iW62_zoanLAHeFAEXmCq4cW_MVADXl8aWh4Otvq1HaoeY6q_WtMRdTKkxDhawdjXVKRcwOG2JIEiL0AY2OCA6WiZCMSuQrU7aNZs9_rwGkgH-FTGIkQMH484dN8Sg5KNEd_uO44JSmHKmWpwp4zcwqZh61Wfi7jOzyAgrJivj0QN-kb0Ie4UJo4q9QYaISWsah-WcI3yfibLo5Y_RkiC7zMQy5BXB-tXHLZ7NAZQiA7lxC8JmZn93wz176wxL9oYP0YlZnbYA_mdvIagQJlKFIQbJYsDTRZBTnnDN9GY1dssScU0lZVCFHuEjAg8EVxitZx3vcbMhzc0WaWWnJStfBmtSbSeooD5AV3fTJkWBnydoz2__7rijBZM9DiaI_vgOhzB-y8XLkZo0xqSkDP0VF5q-dr5fZ8y3V2kcUy_DxbI8lYFHNeLWSbE49qx7p7AEx1eFnYYi9b_mDZtHw_s0WWx6XUB5sCFayRHo4p79Tew8KrIlJ3vafH6MdkG0Ofbxe0UsFX0kFgitXsZBiwU4fr0lc9OmcgQsh2FYpb6jkJ3yA19VJINHXijHfxtxEk2j4CsA-W-Znw0Ij6533NKjFs4T4sHnzPp2N-BwPCn4iRyIJkvI5OfkiGI7gcUZN0OtNi-RTGLCnUJlphOAaZY_TRtiacTc9v0-6qK-rYpysY2PKJH1x_kYgnf2SL_0koZKzaTeqnt61h-gtkOT5dPMfqAQJ-Y5Hi7VC_-f876kS_iYHFmaj6ctiTHwy2WHvyLKHChODa0-RI4-8oVMSDoN5rxTgljG6o5ENVhq_mlPLLNi3dDe0UP-ZoKPfmwD9Emd5UvzM_rSnk1ytHHCtWnQ-S42r64rNjYKsTsigT3Vqt728dfqIyrbDfUCNM6HpHvxuEQt9ppNhLgVKNCjmsoK0ngEp3PxFn1q8udwSt8-mTAKnH1XvXBgU61h6cIoGEQjyP2atLxWnvhcNcKLSsDDZsU5o96c_aoiP7dyxL8zA5xD2zcJs-rd1rT8Jumcjsu6NYCI6aUfGyMeligcnEQoy_UL8OBNuHuYhXGZRp6qUA72cuKC1GnkI1tWvvzig-eAIBnDIBROJ9aYGUNlVhIpZTKdb2jmKe3Pziy5AOAANIW7Ixg595J77z4xHpNuWlE7aICptELZzIbfkM_-ETTXueLwNtxZOG86S-ZfELZnvjQIvDi9wxCkTRlzI85wF7aoX_tr7lTraGDSznZ9Ep1Edjldt0VgFtg3w_xFShg3yGkEX_qtD6ZT-rLx9EwxU9ejYAYKGmzN9eO3PSSehQjAFO7yTw8ogCFWJ7GPkyXVDwjBQqYu_3r_BfHWnYirXcdmnKGQRzVBbYYiuCrZDBRHktl3mQjSRWubbqFczOue743tqYxf89ysls_s8UvFBkRDME3IlWzir9KV8ItbAjqkhKhgEvPrUoAd47F0baWtMtzIYS7pZniefJCFhxFpDdDXeT_2xIdyZTAFsWQlKU_MBkvUhDbB-bRVQYlb38_M8Wp3WiYbL4bSIXLQuobqrNvGa9nM4ycAbF7M77i9iCIFhSqXklNB4dsQW59OFhWEuuapbIqPvklDksEa9yB16wOdoDWSUHNwYLwO5zHa4WRMyx-M2mPo_IHrFXQN5Yxd6rYCwrCo051v9OGlvAG5CTy1MSV-hZdxjDMP-QBfNdMs1t9QBMYyLgXlEbR7dwWSSJ73G7QZVOxfH-0p0Es8WpjLTuTDUoOeX4CFUfktcIpT2BzWnSRU7E_vw=","summary":[{"type":"summary_text","text":"**Analyzing watchdog leak causes**"},{"type":"summary_text","text":"**Investigating ConPTY teardown and drain cleanup**"},{"type":"summary_text","text":"**Confirming drain thread leak from session reuse**"}]},{"id":"rs_0a061eb498f0e908016a59d2d386f081968a104111628c53db","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdLkVlMvFIslMlvVM_hOI_BUWqq0RrnhP-HPTW75JmNoNQdtw7o9JDU5YT0BffDUH7wSGWYsdAhI5tPN5CFMcCyzUDcQbIVhtdjp5mAjzHuNYvfXOEW7rtqWzL3VCkqZCzKo6lAstWCPmTgxOzpkZt-0KwS9eUmHvkQLJWg-9tv2MqHIbSh5Hy_uEnYn_XJfVX7Uzo0RnmFBn1Aa9gVEp3W-plPotIeoG9ZU7ELNmX-WxFJOlGKfrNtytcndVYSncEpLYM1GRZTvvUwd3dtJUjeuiTRt2mfev8mVEC9ObqMqlnhzd9OLU2Tx-KNyGdTqN-_3HMpbJCxBfB3KcSePrNl_fgpVRp_-ZxFecE3uICW7e3W5wAjos_PnaJI0PhJFLzGRza-axxBiRp_iNEgklqPBuBwSNumetsd37P_9ahpGD1lax64E0HtTF8gDTG3SBTH659HZ5hqaNjwt_4ZpY7q_gkJXQlkSYDyMd33i5FmPKtqW7R-aG3AbN7APBdFImqQ4QNlw0Y-3sRbR3fy5vj_6jpJFlneI3VDBoJw1YlGfqasW-etlil7l6z90wtifYBS4HvGBs6UWhEwNjejQT8AEPYOMV5Xr8u0HuiVWtsi6rIfKe1HA7EBGuANw96LtHcSL5cBOhytvvEYSf7lQZNd9QBYglx6UyjDmcXlGv0z_SE4JTCQqzmU9sN66KIzdV4-JkzQ2YWR-V5WsZwKr4CJgF71nC4RsW0jOdVLdiuDlthQXLTC1-yR2lOYcWOJVijQi48oOMm0_G64eB3-0XbYyNYgyK1osznmluyr1CTE3qX_2ZeeimwCQ4kln9REdo_Q4d3ewfYgd9l-wLnlWWInT-ezI_5X0xAMZsNM303Zf-_vQZIUcjL6WRGwcWTgjmc3FM6QivrUR_kiPYjgDMgOzJYjap4h086xGJ3zrP7E39Xg9cjv6gHGZ7n8SnxJOMUZPlpLtj4dEH0c6bbV39ZtPOqwHINjO94jH6buR-ivdNG-XmDnVFI6wk2F_ykY5LWwPCGZMPt5-8vSejkj1RgdjCaJuh_EHGulcCDfuO4zFqvlSh0g7hnDwdw1-oToJm-KD2cwqQjyPzSejhFgMSN4IiYMTZX325eNuLkJ5Qf6rOnFgwqpevSpYnRL9QWpUgnvH14yvXZLwBnh611senszpn2sYaKt-Yq6F3kVlVVRU48v93KhUEEYS4H8ZrP_ouxavzgBniyjg_O9Vc-yj6b_tNbAeAj8dAT86xm6LdFzWEj_u2e89vYi1hN50YMdHzsdfU34zfTxNJgj_ZaUicKvYUSee6FAxw2ulCamUWRS1MzkK0xPY3EXAafNU81vbsAVaBFuCVunTAtrtVhrSj8eWlIrcVXo0SWJyI5x8wP4e68ofq4nMmIUxgHWu7p9V1E-kEpfJiz1_1J1ZM6hSqm8bBmu-58zSe1DllxqqmsCzDIj4Co64WR8WbTLe5Jg_HyiXv1SUxs3YxmQuSS3Xup9GNFc5ToTciYUlfYZdUNH_BjI9X_KMH_cCIbVaPSdZNtgDkJMqKuES1R2ieat1YBSv7Un33ZBiFbA1gDgGL6brXCjouRm0LFTOvwAlUs9xsllDXKMbqCfpP2PoxsTJuEMGAr_JNFORFlYUEcJtGNQ6p8grzw7C8wKEQOXcMkODLGdfCFZO1WhKPEig9r40jVQ9MfRHJq57ijvEKbzU2TGw8dA-fFw161_woUs2jq8Apa0bNq_xGE-vAEEldFsO6tG-tMfsgGKMxNpkoReH335GgMmmf2FN4Z0kFd2nYqMj9X3l6aPP2GMXxak4xX2DJi4yDoascaa1cNhRRL5asbIwgV4y2RdTwMd4WEwtkPPgbvpaRc3gNEyOtJk5tOZiVgkrf_6Hzl7h6bCLmRMdOVl_nWDm2qyZxTJqdI0KQF0BGpjcEHvFgWnv1pz8aORfUFU2TAwnz7JmMH2E52oYoJTV6f8RDXQJW5SdaQRi3ApjE3fJkLU2w9AWra-NELVfyRI8pyT18FpAdQ2OrF71kEXsf-lAmrDWSngcX7RYKBs93gWpBUkMcQNG6oah_PsvJEmsv2uttvVHIqDQKIlVQ-VVNuEtMOCj9PRXdUF7Qx3nSPVvntrrDMNEfI71uUsuoJD-lKT7pbn4mCYQV5Lcrhky5qBe0UJv38dhOapokJjX5L3c7inoK3E__kcFwcohc4N4YdPWg3sAucm0zEZkowQPFE7u-M_azX2u4I57-TNz3kijlvMPW_V0ifjopkbQPj5JnvnZD2_ckv70ZYgEzNt4ZKTQVxmC3ALZMaeN6vpVpOvGlm3r2vYlZxDBSF5dqvRO0GwDiY_xBolv6mcUZaY4Onr-8DEQoTSZz3sh6ILZhKnkpf6F5rjpPEJDUlUd5SfF-hcwY5ClV0tIwtoXj28V4epJLWfSXIGOK-3OoTZSs_jUHpzw_OJ4THAkoEb1tw-Dpty-3xVUJCOC0CymK1IU7ENn1KhA65Uj76OZreqszz9cagMjlbjijiCC1_CbQon6VAX5H6g8Kf4yqEJ1AxS3Qd8_sjH3jP3NwThi0LJZ3jWVlmAg7HPnwSlGAMrRq5M_Uo-5JfvLXJw-YSnjAK9iIU9X7FXuewqQ7B0Kez-hNKZkX8Cb_Pi8SLbYeeLOUv8FshyJ1Ph5RESAtGaCpURjQ5DYutjg4QVeR3Hqe8AmJ2tifoazUEjoOwM7-ECwJeI1I4P9UJH3_ulZPiMBIs_CTbqGPUTlyHEwjezLBbO6Zip8bmwjkraj3FqHg5GuiKJIEKyoHNwl3mA3YobFWk5cFbeHHOINSERmxedB0HIIsokobGMiOMXNf_puxhSxgAbTJhrp0a4dR6rTg9IZJj4jEJEoLKWI90Wvya6s9k-gpO1C5XPqjVO75-urrJEuYCLTcXebtElShoWgvLePfyGD2Od4IBAeRGUHgUR8du6J0soYQklnalABn-SzwtzFjikiNhxcpxgxseV5B7DwDUxOxi0lOeqFKqelJI7rhbbbWo5lh41Y16ALoltjBtcWCaBNDHzgs4zklZNiPvCCycxgEyPjBMWTX4c1s4V5AoQ-Rttjr-ZDAESEnNc2XFu_z_eAFvMH6_3MUw9oPxT1NFx3HeMDkMrwtil_ZkVtPQSKitKPTaNFLKo4Up0jqSvf8RTu8QEMKEfpD0dlOB8-EE0ELCH7h1fqlNV6XeoWTARYeJPoGydYt66GjkbGCUvWOUqR77lYvmQu9Sc2PALtFxK8Ks65LR-kdu8urlCwYf_RnxL3mWQxs07j5QGG_iGlJcG350amzhhV4mQso72kQTEfR2AM4ujOUQBqtKhNzXDm-bN6dGH-7EFFSy2nVZL6JqcIksppxrUoMg8cwDVCE81SL8cBc3BdT_cB2hQZydp0zb68WVA5UqIbvZMSe91ZdiDIt02PRv_fJSkU-KVGX62VPjQNlUZdz_y_zvAC2ffGHLEhPhOaA-9HhbCwugyC0ylJ7FEwH-PoDikh9drTqZIzWOsJ18l3uTsqirbsn4RHXH7ukpevxlqE8ATXDk8YFipH197hxujF9gTIpA26fxvriH9jW7d8pQIOgQQwoubrTNOhBL7tsOWtO4D_ilBM3egeuFLZxUrsrK9JXRGqxzjYwMvsM1Xxsmsk05pW2cvB0zQwxnAoWUyDMs6Z33zlMHWG51jeDV0ElBi3dMUQzjRf9-7sIDRT1z3zmZXpTsYey_80hjwR1Pimn-yBW0eP1VXQII75N7txrwM0ZFbQvckjbPpxtZBHrRDfmdjn0Y1gK099HehgupoOPCsY-oPEDmGyygbnbBECzLz4ULXmxIjJSAysPfgGA2J9YPYkSSEdADcXxYN0NIaxebgSuG0ZV69F6OfouQp2glMsp6USiDgw9MePVh-Zqsia4FAC5Tk3oYCloMtzXZDcpAclrW1bnHisVlVksMfzlXc6xfeS7xJ_aLHUcNLzuk7niB9HWCYfI0rR1EGyEEC5yobRUZRfU8qUhZjekjI8FW-mGdJu7gr9hNj4tRpNdxNDkoXLlQ_lDGTrQGHpXxaWUd1z2la2sd7sFJ-_7NIHLBcQ-SqVpCIvLlh0Gt0ZRYt4xUMQkX2j1cOY4AcPZ_vGRP7oYh3T6tVrNg==","summary":[{"type":"summary_text","text":"**Analyzing connection leak causes**"},{"type":"summary_text","text":"**Investigating session write blocking and thread leaks**"},{"type":"summary_text","text":"**Tracing high-throughput PTY output behavior**"}]},{"id":"rs_0a061eb498f0e908016a59d2e4e6c88196bb9c2da175ded876","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdLx8IyvU9Eb6XYExlx2zQZCPq3O_wrhScu8rtvw1mxQBXYbpbo0LAWA7n1MTZKdwLOccDk2C7p9zi0dWU5CGslDmf0KCVd_jYd1cs047CPKsl_dMjkfubwYKu05LTPFHGbCPqlxnyEIvpWf3uKSUZZnL9kZEPfjfKYNAHTsAqWDpnzr8hmk0tlENwBG9DlFOcbsWqk4aF5TyVdRTEao2XFPteWHT8-mnEbfAjGvBbXJ1iuq_siOhY4pFIXEC0N21_Q_Wly-C81XPMPp8kQe4D39UiwElcjDdtzxd2U_LoirxsvjwRtddHKX_rR__vTFPSkyTNKhBmiYF9fd7bdheJ9OTVju75QsXY3HqqxaUEZpLLQ46c47CEByHFGmP2Ivn1UWsWqIXeoQpqkHyMyng75X2xJ2NDbXrLqieKWi7e7eDig5Uvdkz-dKVzIwI2mB7cFoaU3n_1tu0rSpZniXDHydWVCkpfhyfctJ0Mqg-PNySna7w69GbMgPF-QEEZ8q6A0HjbDATQdU_Ga0L1HTGg9_YahadVZPzkHniDZTaiwllHUPTiThW4jMXQJUml_hnyrfSomU9BhilhmT4RoZm7ORctfGeAeGtwNWYff92-jgSvlwDSpyrg33HT6MP4EfADdb5mMO1eCSNOHRrTgV-Tx9dv-r9t7pDMCPKI5SDLpC41W5aYrcUkVUj-uceW7tI3CZIl7L5JbES77fjjf40rNHhmzc2ZTg5wXCZj1zNxm7PMMVxGbLVb-ciP7ubA24T0VnF1treUjc8yR9nU46kqdO8iAiutPHuKUpnW8_jA4YQCVAQ7NdNg7Frnn5LI-7GwvkYNFZ4xwrWNaEU3aJqNZ8DvRNauEbBNwlz-fINksBPgQvBnHxjF74SNRw9QmmbAc33v4NHqhe8Jq8miRjaiPNpxy_9jUg_WSGmExpgND3NQf7u366D-0xic0n16Udq7rAj6gejyCfZc1EPuI1oOsnbKPZibB7JDkx9HhPofBzdAjJMl5ot2gyxiRwIfejnMfzvf8TCnA2Es7mY4L_ilwuJVlIBmzxiVXX9e1GnWwfZFpUEZtpbZ48ztxNiqVi_g8lNjOpoZ12ML4UAa5nGVKkVi6fxjhSalrp9o3dmZ3qdq7pCfn4cP-Jvqp2MabPDeRVj9cj7HN1OVuXZRywo37L-2OxMpEWMfGmIY30vh8Dciz4UF7wmsB_9MpOBK2aofJbPzMYd8qyXY4NcpxalTV3E81mmeVbNkzkJUfV_peoPgMmjICe586BFLJBjCXJ16r8JI8_6pJR30vrQNLnxDIp93BPDwTbGJCDKqRuXGlJ42u6q4eAYvp2zyS4YXEZ7Kse0nM2n2dFW7NDOhNjGM8WWcv6FMDO6EX8X6vo_oiOxkxA4unfVF8d_IXEzLOOi5-Jzah0HNHMbBFVys4tpaSiwOBfK2odRF1GnC8Nk62JruSbHxgrRNatMrwNVl2ohEb7Sy_1sDz51CeNS1zqC6quVvzZVBdib3B3CbjVm5oiRW1ofeihejMQY1zDJWvRPwCiIecPay2QevynX48DOLAcas2mTE1r_HE_DsNodjSA2Q2oIk-6A3iWi68H7vtbWlHVRAU47oYQdm6fkCeduSJvEmsMMt6CBu1hOZppbeowAO6ZdTRi4x1h1s4BeL4R7uGkG_zQSBKbBsNWPvQ1jDDdRnA4JMHMoJf_zvJSPaerj4O42YsfM1OTEclLSjrsAzDitZixP4VnNyjZAF72HPMAjWNLe2418z2yeARY5pZDBjSBG6E-BcGhKQ4sov37DehimWSwzk8VQ1WRPsy1h8uKKwHDsmW9c1fETpBgPRT181GT_PdVTpw-hp2c-GHR-6Q7PrGgCyyYipBBhRNayX0BVsToTIlqQ3eIsNQIO6lUDU_KIa5gh9ToE4N7yoxv1TVLQXYryuBRJhc9JIEasnqExZbJatcpHY4bq_gVMjaGgsC4WEThqSfTk6LssBLBKxJAQU3JoRKw1LlYjhWaviYZA46O9xwHrXpb59Hyg2n7bxDrZIylPhLUgI8eKdfk5v1-ywvYJ8Nf7X2SmaYmsfcwSxKUFNHmuX-1IntRppjBuawVzastwZhW3eu70ijaiWj1QZsmySWMyidL0QKqnVn1qZ3EpsBTOcjl2DRGrrD2ElgD-590bQTDKh3EU3uSFMLRVpJ7y2fAnPtO3oc_liWM1rzlh2Q5poHHu6IN56l-6eVbsGdfDU0GS1jVCXX5LHhb9hznyU_2_2C1rb23A1hU4E9YT1vzsdTidJplY6qXr9ce9XzMdHdAMiJpHoKgJNwLVNbBJbL6dPX7RAiiJ0Z1rh7OEtAX6IXLsHcobGHt16d48G7xGFev5m5UIOEyF2tNKsxmFvA8x1QDnnnUaGAiINrbqWbtktiTxuwJvD0kj9cFxDjLl27ePPcl5DvB9PjmIz0vC2HhNHBHAH9xFFLUUEjqMzdF9jLBcy0K80nruJIzLZpZ3uvliPz--2ELw2PCbJtUw81Vu3ghK2davwifJeQJgKqtNWklwFK4_rN7T5yXTJobAxmSb7mdR87W3Npf764gCdyDRRqWaG3E5H2FmSXT1mLA9NRtHHzbtBtxt24NeVdYiGlsA4hokCbrHhi65m8oGjC5kIv5_xoZW2x8Hqcr2keb0JR4cs8RYlx-p5BjIjZwJfkEKt51-AR-8xyLhWVj9Qcoe-mxn_cfzX_sKCa4wT2m7pZ29cfYR2DaVsrmXBssqU_kbJZmsxwqcZKi-GQ_YlbCttATgfIGgeL2LlLWiLW5LdsVlx6KAOYnKDqLK9OekY0wjNU7tTUuLWv0ccQhqxUr6HfvIWfKqndgp9dGtU5ua7eLQUtwm18tSLOrzTMg0MehBhn0MAm2eDmJ-DWyBYyTmV3yRNH7pjg6NAxg_RpPqUakIol_ZjRSkt9TawVofkTU7Vc0tHcAtRN5IVemRpepB62wY4iew2D2hi-Qxs5xQT0AbXrPaqB9iBncKLRfNjSnHKhoABXn_tPiwtsTFQdlczHA81p0MHmXWX1tebtTTsk7Y8x9xPUTxtecdKnJyaAwcRi3L36ZvIvHGKoLJVNMDD3Hu_14Sp8irSX2qclZ5UaOfvJhtNzWtrB_WmSqgogUMGwNpU-MAo13rXw_MFaF5HiUl34XIT1K1vkJtqnHdXLQQS3rvlfoCh_ifapSY3hmxs7IQWHZZdXF62q2IGwok_3XkGtq5vT4Ci1RalfWa526sE8p_wKDOKiY6E5Phh3vb0mm8BK0SVp7H2lV6kQnssJ-FU1S0thIOWT1TSv5G1VHVsFddOrT4h0K2xsenaO5pPaH4IdfKduezyvrcj23vX4oSkRx5umr79iVs39KWxmqu61vE9uIyk4UT6RkrtsSBXVejz9z-YlNHiFyJquBbwHCEAGzi3FsxpcBZ-8d9plT_OA3dqV-Bn5HJbAe6a2PRxdiF0SPgRZvuWNyWOxBrzfltt9Cs6a2Da5a3hB80K2j-UGSCWWIIvGs5vC97rbakIg6l6eCMaOd6Jt-AWPRGjRfwM6JEkJGL9QFA_7dMjRiNM1CR7Mokbq1Fyo_kCWupGDdstUQwW9tXAS8CAon0bQ3ir5L3o3anD4zFo7GJbBo8IrYNAjwy60PTxsoPQ3WUlWMbyAWbsoIDu1Uru2YV4EgP4i0F6FMjbCcq3lsB5ZhpuWn6_hU7VK8yga25cU7UrSEJJdwRzobQAiAoRA6kT0xDVwkf9FUng4w42PrepTwnWZm5sXpspuvrjurgrwe0dzNE04N58VtZ13FWtTJ-4f0r0a0MqihnVqldbkQ4-OfkH_DlSOw5O7IQf9GpqUjrTCa6KVCK92LxkRPfvA9GoD4ioGDt8qlSQppuVn5QTHHWvMIzAQ9on1HKMXK5hrNNNJM76KhayJfFM0lWp2wypmqUtB-OKjMRiNprAjUWA_LvJNF7yo90WtAA-rxtcG1yXIko3e7Dr2lmZbvW_-djETxrq1BwuXfMVUgT0Hz-wVIb2fNxD0INoZqd7fgr9GSfZRjG9x6pK2h1d-Wh4eV6A3zcdnY2IEu1qYrtfvgkbSvmhp-hMaZ0pbxEo6h20UzqeoqDRkbitCT21X9Qq-lOnmDzojI5km54g==","summary":[{"type":"summary_text","text":"**Identifying resource leak in retired QUIC streams**"},{"type":"summary_text","text":"**Tracing thread leaks from retained subscriber seats**"},{"type":"summary_text","text":"**Mapping subscription and retirement code paths**"}]},{"id":"rs_0a061eb498f0e908016a59d2f164e4819690e54499903a3c70","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdMAu_cHrq9n8MSKEo07QkGcXcyPbz9-b_rSSV2t7WykoZQY5mhe3zWfmhh0L6Tga03OXYBIlGBAhgIs2Olr8opJyD6gxke-AZGOz5-WMOUU6YiI6LcmnUcyO7GFR5-ks4UTQ41jA4yETfTLkaoI2DzwDI8U5UmYvghp6vxfCT0MkI8BltoyQWBRxHUr5utkC4GMyEhwV9ejsVt_Xp5mSi3QsjRFXumPSmOS4qvX_MSDjHTg2eKKGSV194rXx-x3NrJyp7h1qWdVYAtLusyHoSkl3b0H4zqc25BIZ9DeMb7vsdcMV7LrVHhHv1tpLm2d4hWtIEtXmqfDKkaIOgKEFn4jICRn7dskF4vrzoBDEeWgh5AHkwZBrml0Zs990UTg8Up8TjKF8O6cp0q3wkkmn4YZf-J9c1o9Y4WaJNS_8a8p3icP0VKT9hcSJZZcoTSXUZ8_LPGYlnGB4W2x1JDtCdYc7iDTMEKBXXutCqqaeDiCI4wOxCLtzN5UxJC2yTv-1TIC92oa0qImgSne6BOZFXAzqiOR20SOXNaMCoZ8oylJvSl3VAqOv6NjWotTU3sbBy2ILCsnfkwoPeQQlF81e7v4pD_XsNiBLpbvEQSbw4wysibU-0N0nOGMzWpYNXC1YnYhcsSm5_IEEU_4THYUHOEUJdEZyM0oot1Z3egErnrGkVlkWAejghpVTphtnNAC6h2NOs4GDYCnPLpRNSSrE2qlIfXx9u1tx0Z6f-1i2Jo4XLRRBp8WEpzcajFIUfkA1BTg4sFFXd4vgvOGVrRrjsWTYFAw-dUkZ_xmWV2-0mjOf_03ZGBigAPL1d5rh9KUoyz3MK6CbUiZpGv9kI9gpncbHxQLf9vVt1shi496uNlD7umL7lCbbZt38-Gey2rskW2MwT2C-hPJ7rZab9CI9kXSKDAbNo8PgxFyGHhfxhBP30bJhux8hLcJ_3YBhMoD7jmQJdLBAtExza5boOa4m5MaL7gkpfLD3k1aGMOWixHDcmcrlt4PclQDh-vWxW3AcnTw0u24sZR_9yLVgD6emGEZpBQZfcajwOMzkwyyR_FtR0Y1QoH2C84h97gp1--1o7TiwchLBAeaVKx0LsQtiU26mg39FkgorvcFtIOzBFR34oDyYlpKINmyRRVQGxQulQ7uxZ6XIiQLjJ1kkuDbaFFuJ09MaY04DRU6O5oiJE7B_H0dHtMZ3SvvJqr2kNZyDITG46B_2FsmZ46POkPqyY74D1VpvRe6D1uhaT7V9-9bkirHrdo-Bq7Ymgcm8hyzEXrvMeL66ECaz1_W2jHcBRTl5UnBTsRn1JgVhFhoDfp7JpqE73H2bNu-DS5DlbK236RziYFfkzU8tbEtnUtx5BUOV85JTNi0-9xmGPXt4ukeW8NAM1l13LVrTJ1c7jP8t-FeSMTIMyIApxY46PNzqnae2JjAlJkRhJUuMI3O1j-pBaeTQH9rbxXwXedqO0-Uoc3hGFtPzRDYfFKzYU5fVSoIMpBjxCz9eFYRupNNeU7Jif1CK9615zeFTFFWnTxveGHZUFi-621XleEg_HX7TUyV6fnF9tmlcEZPkBaWnvFrdXuQkLSO9DZ9Vs1m0tW_H6ND3CleVIMgpObLorvbHxrTt--oCSrdoofKJH-jP8sN55zz1pwjU8ETcN1ziovTqVW3tXYiqHvm6E_aVR-MVKYDKcCtvCiooO_xzkHfi_s1tFiMrqVhXS9vhoQnaeMwXeR9jGgSKsu5ZXwBJ2064stACySMSKXr468EtKF-TTOzlsH8Rg134Lnkl1CF0CGUZCQWuvUR_S-s-FDZUUm7F0YxMNeMQX_1f5nlRnT6wTSM7JgX4obMxHBlT4TRJfw34NWp4WQRGY0brkirtuS7S67ehCxZDpkE_jk-ksfQniIx-gUeeExVoeTmbyX0aCnqDLnxYePQQ5GThvquZommbhPu0lS8E0dKr8xzVN80mUiCgn3EVs0AB_VCqWAwqNenn8PQWGLvePgPsvTt1RcmIs1xlJlqmtbHvvEYH5azCeosPpL63XHsJasJqQPj9RXlLHz9CgBv_gzec5I2qXbJE2uLJlapagxa1x1Fy9GDxEaxGEPygo37NOgRhkUN3nMxk1mwxHYQj88rxv2ndVEVEpIbOwI1S8VSNk1QaZAnZ12EvVJzJ38-U3Hqs1foOTl3IleOLX0azsnMoOzshXSC87tV4hSPSBkkTUZrOIrdYh9JDDt5DnUApRQmbktNisKxHvX6sIqj66WVCci1CNbn0Ij7rGRnZXhvhxhVjECi08EYMEjHILYf6vknU3QyqqhLtUWrXIqh5fEVXC4VtAu5uaQHo0Be5ovKBFArWZO9TqPQIrho2LKsj23fjFIDnPorkInSCxPf5-cKTeXSOxnHCTPVqOwG39nrdRsnb49XBEnHyt3ov5kZ5IH1NuT4HaBSv5P9sUJ7Mu7sdeLwVvz7yOMREeD_dvnjHljuSPCMOqH9yjUrG-rlzBMgcr_ddKVGgKJS1QA6FzD0MgQxeRkLBC1X4WjZj1sY7Ik6kHaZtMSxZFAP0pj1TQ2rAA7gu0eN6Icv-c816p1o85h2oBy7gPI3DJ6EpRohVtlz1sG5pCvjno_m_DEMigPCxoYgh0NGe2rpeEXv_2612Ru76LCgbC1NQ5sH3JNba2dH6VD577qMwxni5WR96p4Kcn5u5wIGlASZrB2NBMYw0YKAmjrTNyS6rePAcwTpcDWjemYHbdUKlwsHIVVStgda2Zxyak7z8PiPiedloFv9pHKwoVTOJteKHqf47YYgaP_5CIC0u81gJzEI3tCeZ_mt978NKojU4kCzk1p7GHgIbEXvBaIAOuM4KpPHgPmVCEePH14AqCLsk5_dr_zP-QWHB8SYcQjiLiPScB-IRnLqDUABU9OixZjawbt4U6UyTNqRnaM7FiyTclIL7lImB3Te8zYI9U_8j-6s25-DGdKlIWZm3lucgJwnUFqyRBxb0xbp4gZ-Sd6CARmn1GViAVmn5J1a0yrUL811Sf3en-GIODKyicXyMEtZx-HNqSyTZNNa4nfOKaOgMh_UDJfbHpFPNwtk9Vd3wbCeWFHZNNewiXHYfHZH0flG3LaTePrpbLs_yChPeZkGQ86c8_tPmFf5xemzqqN3Ro51BUtxp5glnXs1nZph7HdAeTmnME2J-h6QLwfx8Zz-RcmuKibtDnlRJ1ULW7Byok-fmUa7ch54HUGL7034jn9448yEAIljTeJbW3LvTJBqJt3DVkNbJU7yCuQBzH7AcYZ13G-Awidsm2KS5Bcf8VcddQabMPX_8I_7rJ0CjjgspYbIct77aVcbelwUHDg8RACym1Rlw3zRUVWECRPXummvjyej6GLY86fhPJftn-RXED7n5f0tv30hZ5bvVnmN2x0nx7ArLZhU78SE8QBkY3A2AjredtIigxVZpPMEX6jV0YhCOqHCmewsLcKsjhi5EUqWQi-7UCAtPfAtgc8CqPN_ETJjwFe4etmmBOssUJAj2VohH_-53AKnQ6UeOxII5M3SrnyZ3Oeii0XBfiEooyihGecVlAo12wNz1KbIHEEWCJ1gHWEHr7rxtwnuYf-m0a82ADwajmCb87mtrKnAN7ke_cODfdROwa5BuCJSDo4T-Mg9iQJP36vaFOkolKnwieFyf6BNc8WYQXF6lATeoLPEP32uD7H3tREJVBl1A0I6goEmAgLxmYEIbab54DctsSfk3W3q4JdGOPlmTjr8-M0ASZ5e9csEHdwTQGXnxCw9va7wzJirbPK1SBaFcND0_gnTr0yk-nl7oyzqBKnt5W8QYZi7_dNr3oL7WqqCdgew6mHggdg9AbKwo9dYIDFsN5k-5z59IMJMScjikZQmqD0XuHryEfa7I-9ihhFTMSIr19omI4e2md2wFlC7ji4Cw0fX-WvMyg8rjlL86UmrlWOXP4vp1yv3_JJtmmnYMvgCRo8DWm0inIahllY4oeYTwRL9dUWTCIYf9XSmHIGNyzEoaauO9sMYDcrVM382O7jF0UBarQsjhLY9cDZDZ8ttAS8qrwKvGDvjOxFE8RdP4kiTl3PC_KdxZWo2OI9AC--2lLuegHbPd2kYGf8NPewjc6_C3W0KVt9gIAiHP_Bsp9dJ2ajPeCwfPVnn8tH4YTr0iwXMGMB69QKnu7WSsFGESLGEhzA0q93CiW-Yxr1JvUXtO1ssTGJowd4Ym3YghWPVrhqhMDBqFQvSnTHEXputoUhgSLFDUKrV6qs9bf-b3vB9K-gxMjwAp1tuBobgFzhaqYDUM_TqS5VlAqep-ngVzn1jB-MIo5nnX7CwSBTsIjGQt97rSJbFWO-LQUJUbO1D06A2Ur9Xtlh9OYYQg3-Fn0mZ","summary":[{"type":"summary_text","text":"**Assessing subscriber detachment on connection close**"},{"type":"summary_text","text":"**Analyzing Brain connection lifecycle and subscriber cleanup**"},{"type":"summary_text","text":"**Calculating thread usage for PTY sessions and viewers**"}]},{"id":"rs_0a061eb498f0e908016a59d300e3d08196813f5ab5e357ea46","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdMKa8LyIZPv4Sw23AcfS_WTjK5yF16XwtUoYYzaqsrBM0b20p3ZqWjIGDo6UbnFqEGF-Wv9Ka1IL-O4sdKByDI5zb0lVOpAhw2BfAxF5duqadORQBlOJ0vGnPhQoYQ3mlSBGuNRnfJUVYmnZpij7T479_-xuZ3YGq5b8TZTbmWegcIF1q43aSHnbbDYAOQj_NoQybYzSx8g9PNm-twdo2i3qninoyGuuRnBEVKK9ifFvNpAfgwamTo7c-8-7EVSv1iNYfkVcvdBH7x1l8_-SoV68kbcVuul1ResUb0SahXBr2Kzy2oDJI1mIZ_NAx6JZlSJ2nSSH-mIl0rUzgTR36aZRLk5OjchEnCuYf_P4-IoRC_5jgFh4TZdrfXasIxiKqm3yAoVcHdLfouKedLksGw3BZpLbKiN084PFj8ms6FxtolPJ72ZpXbVW44qlON6lwxuKSm8WJ8vUrmPgCLS4IomWpQQZdPzXkI55DHP4_gRJ3IBjhG-aJ8X3uo83SwwbUJTAtY92W9q5axPFGtYuFbd5a9Zokdo6ZmbgSZrp9wC8_mA7nZzfQ31TFk2khta9Sh9sxl_-qtTRg1d5x7pugln9zshQFJZNPsAQgrSSVOoezvDJ-BGeBAjdxlyz6B3kAY1Ph9c1Wa1hO_phjn6Z8AyL7OIcmM0nX0Jqe-rgkZ6SxVOnH9yjIl-LoeiHK5NmE9NcKhCSqDmeXtiAhm5-sNOEGJ-bNy9z7IqtXq60HRrh-VbRbtfpM2HGwb69JWHtobiEGiaoGzXpa-n1Jf0rPgwfy2ZyLGxZN6yz-F_qOy4hqYch34rIWIcvsio4CmKC_aGAiupI-TnkpMMAmf2qyntkEYNEtuL6jxCqHS7J7tK1k-j3RISRFeQpg60EPXBM7c-6GIYJyiqjVraGtb3tqTnn4Puv7Xo3dpyilKn7hZluzynaud7FNhdpGJEyLucrCZjqEFno9mmkZSL7OVwyTYa_R9jv7JQTrh4mcFTFEYIesFIFIfmxuu1lnR8LgSU_H4dkO3sI33apTgGIqGJuaMS-JNQCh5zcBK7w9L1G7CuyDWLJgP_2GHLJ_sk74-y5kj3QXkrZC2z-gsH_kpeCJqF5EW3mWqr5BMP-416b1NJjLDQgx04S6GMqUOuXMuOONNZGwErMwnyltDP0LKNHb9ydVIa4xziiiiZufbYGMHDWlTgw1rRQ6kD0r9-Y0Op6DIGgGhVZ0MBip5dCy1w4Hsl_PbX61D6c2_RWks6nbS_Bum6szfaah7K4ccRmN7gBIEIFGaRBeFGouLCUDPQr0wbFFkCV6Ogh89vLgTNIn9WI4jdqPrR-P2AVXMaW4qR-4K2coEvN2KRSN8XNRnz42JJkalyTIkJLhw4jSDt4YHyem7GmFicfoLwNPgXitPNwqt9jiTkK6FrlVK7Rsp4OHbx1NIm_iLWxPvO8xso61hhUHddbH7OfECRyH1He5ljimM1yc_RL-ThekueLwg24_1vlGOEGM7BW_wxLZLmvsJ1KpngdibrOmQ_EJe2JQWPKDQDwll3cmP0DLEVKglyNrGmHGDsTBvMFSHJIClLTZv9l8xWUjp3eTYJPg0a6OZTmb-1pUJLzptxFNuo4tGx2XzhUmSRfh2l6B_1iRjOak6gPxcyuG2WCwX4IlB9unlWbS7CU7FcGf5dqISmWf_aTUbutUzLJO8pqt9F_yGZna6K2L2RxaEdNwGacuHLemOObMPZ7Ssh640RcKxRNHH7CycGAxT_Pe4J0DXbiGRitsfQ7FuZ2jXldWZKkLxolhItXp79OyU6m50v--C1phTodOyJ4_qj4Tjda2b40aSFD30X4bMhXAI2ygky1d8rqaTqjptz-S5r2VT8w6lmTLqb8Hp3MFb1C-Se3YbL7H5rvkWGqBqVo7cnjE7zJg3yE09ehYdifOV8dGU1pmfhH6HYSzMDaGg_XF_aAnKVvOvsM1ADylokzOjPW-YiTRj7uUQpAVmgqV_nCc4DN65YYvD9YsqPZLaLGCOFQoSAIqqxcqxPWYv-Bh1GFh3NQKY2s_47HtS5yyWyTz0LJmz-PPBkeSvozj22zbGKZ9XmY0Wk1xKawnEVh4vNiFc2Mpdp3XVyuBzttjEsmyPtSns5nFDRVi73iSIQDxtLKziB3jeZUVHCSILK8zl6BloJAMLIzeR4P23kxJOM_kmTjGwUqLPPLJ4f8WvDQ8Zkq-eiz3qXWLrE3S33GOcgwaQPI0k8J423jLZBHRsJ6See5Nj20DTntCTzDwjJie-jBOsu2C4xUSbXiZZII4k0qtf4O2t_wHiou-7rmgl77iEFOukFykTLIz8zI2_sRSetiZrIWun6HwWRgzvDqOGggoMBkfsWSVUbEpgbTk14kiBsezCwLa6iEsDrbK_aGkb2YHYsO3eoyGSRro06aBpsQk3L7kK3HySjQWPNILGsD9iHMV1MaOr7daLNZ294MIVG3MO3deJnp4g-Q7J8yYVA0FiDLCBLihoplF2hlyHLwPu-8M9nyHsgjjVBwbjTKcxQu1UI3abYEqh-lSpTq_7ipfvBaKT9ZMAMq3OvnhJaNnzrlFpXuaXtfEc6jI4DT3YVLWZSPv8PBYxhbb8G7X8LEmtAoZWr-1jKIC_biIKQDYa1w9YyGAoAv59sjKWTO-iVES3DmpOSZdYiCasyo830VuIzHYw8QlWuOmRUfpKjkaPz5SlzumrR_QEdFYvY7VJCLzuRnhb17tqLbH2VgWIi7FN0dmzQkUx1-OdeMriiDl5btDxYrbAMpxRAeSiFN7WSA1u-5zo5rWrdpIbdQL1FghflPt4-eUd3w39PPHe9JSPXKjrQZ0l9osMyXIyJ_EDAJFYeA3MxeToe00fzkO2aT67z_TOQ5iVG50Qm93J3QtQpjxwqDjDPm8YJVm5Alr29IczB637yDLTrI6hg1Or11b9mVgb5q5tqnEliaBoFVE9bjiHVrfgg8IeybMXYwZt3fZZVM7CMZrUdM0DkRg_VgVpYoDCK-ZZrf_vZPTGNH65Q-qV4DDAwoZEsR_pgKMMO96cENH9GlCQngQBZlFSH2j6H3OqIrjO1SY7gn_Ruzixf_fcjlGOhLumYNmMGzzbO0uttjimuIeN46akxqCG5IJ0bxEBCVNK0rOoORHr--pMKUOUwiV1Ccmsrb3FUo2agQp4PEydjMtJaitIpxWCv1D5RtMsn_xIbCLOxIBIr7flZ0PaXwaBj6fT4olFg4TpU8GffLAfYjhRwSACgtjiIv7qToRidCHl0iUKpNVyxh0dGYIjrCtLclyhVfot9wl0Lzgxcuc616SIZBe4TEOeXwFudJyvqMnqz6bz-W-lIVjIefYWwhMqYR28azCgDYGgdDf5P7gphseK8TF7p_B2G4BKVWyslSy6J6Tkoocz66lfWlURAxaH_z3c2ExTO-diT9L4T3zWgRooK2_J7fS4fhTSM0P6sNIcLRde-YBKV6RCfOT4z2Q2AMdQ8jXox69EhGEiZYlJ6x6tO4EmKGSV-jceJ31GFNslnNlk_fqF7OCTm2rOfM2BTvtEMsDFPeHN9LnYX_DuQkM3WMWo9yfqq195tdQE2w4-0vHjyWg1R6L3BRxkDpcjspy0bDgymTmPmYmemFCLw_EJEf3ng3Cxxz2rCp64JrtH1x_pOTErhQ_91zzrA-7bTL1WHb-ZDXY8VygE5gh6qDjU5VHMHnkyvnqYydd-O7egCU6NTeULE0S-Iig1JIwoAdtsX-z93PiHrkGw6VGvhBH4hxhKM6MBNjO89CzVBUKg-z7Scr0N7KvD-JNLMWgYtuWay4STrd_8nfG_VFTJ-5Hkr3SRdO3RRNdBWUqQJCqyz9De4FKZyTdWqZsS5o6be9D5ZjUNC6cZDKrNgyvCctMCLfCQOQMaJEmnXRRcWDLQcl4dd3GurdhN5P_xDcgyXr-IlPG31MtbEEetsWddzqkRmYtfnflay6xvTAyCfSfSRNnwPWd5e0YJWiQM_aJB4YXbWxryjqmKG-BrweOLgVinmnuoAJ18dKcxYpeGBoWBF1AWaNBUmFNaOLdlwM0Mg1gXsiRc4_LrH-NgIjsW-CpLo8dP0ZITpk-ukoyNqOP5Z43d4","summary":[{"type":"summary_text","text":"**Evaluating thread legitimacy per session count**"},{"type":"summary_text","text":"**Detailing long-lived broker thread types**"},{"type":"summary_text","text":"**Clarifying control hub connection threading scope**"}]},{"id":"rs_0a061eb498f0e908016a59d30a786c8196a490cf7b216529f3","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdMSq3myoAy-dXwPdPSsBVgs0zjySGeyWrWEVRCybh6n5snF0j0YLJLPl3EjGWEkYaGW2kNNaVuO1khYbMiP_5IIaEn9_Wtgyyxh5TRKLLBXc2V4d4v3YmKyr3v3N8-DgWGPyDJqH2WWZMocA-uUQCj4UrjsPne-cIuU89kLmJHWAYe4EWcnXzeEQ5QibZB72i5r1MBxHYtvRNwM0T7dDMKJn-LQUug4Nas9YjQAPPu9rxN0RNVtxNXklwHTTMZodh0NLSp_F8IfYT9zpq6HWUc2rGKY0wXiE03kNoTYToK--s4lIWK9Tpt8emmOm1dZlNon11fzw6KBjBdWBWcTM9TxyjXjwZo6f4MTOLDLvpfeEKrcXro110lPYxzQxwkn4OG1bsNYdSx3P60iDVYvzSoYbA5_hX6YsKPoP-QmnL3syoPf2cZxLAMDJLI382l8s9ehARKFw_Qh_TPigY6RsdQKaw9d4LdpR9-z39Idgh1QK_QbxGq52Yv1ZXuWZ1nYaM4GgJ-MOIDHDOEPrsIycWrsCgvsWyuufZ_jMCKygm0sY1gTQ_-mVr7Pc_hHSLH2KVDwMSLayd-jZiu97izVmqb0TKmUmiN_tMRrSqlSVr-kYlJaJOng0Lkgme_E58-SBpasu4TIsuA1JoNpnPHGaco4s7KwxCy5JxpbPhccjJVmCe0ceoLdtEfw5f7XivgiRBnfuuR2JreH0nvwQcdGiVcCbZrevWQOcOmnBVohtL5Grn4etoSZjHNgpxoZyqrpfLb-TvObzJWncMcRH-qd-aiuDBKomPunsBNpD_AfUO1rtxRH5ppAGgUEoGlwfeRMwzDk2MX6bCGk2ypBPeirEM5o66h_wbcUh9iG7JVOcoAgLJAJzgd0oOmtfNn8m8u2x0kTNsiu3YdTaCbnuzqcklGFXxjtfX2V5Htw1dnMFYYy3gAJ2YfrZe7qasCXhuUk7T348UIhSMebQMtC8K1BQXezk-k_XtsnnAXjyTr8WYPCj33L59iyRbZ1saPveb56Ynr4ofB-yhCk9dO4McCvIxjLHNkjTLXiZLeRbowgDdI_JqmoVsyqJxHULQ2nNI2lO9vA37hEDT-IjjOx_fZEhoTJaWHBH7fOUT_OIa3JlgkaDOySRWCzwzoLBQmcNPFOBWdjsCxS1y_aONUOu7IFYG5WlFMISYhpu_Ql0lvtLT9xlC56zndO3YfCzQSSaJyrBWqAbye5Cs6PAZQrEvH2dKWUPndhJokT5OQeIl6x6OenOLQTFF6J3R-j2NOF3Re0ZBuHs6vaE-WFSlDq_DOUQeA1QMNlINgswdlsa9uMkwPqg-D-wCI7szG0ps7cqEV7T-8eD4hJY_DAKSteUKATFgRC7w==","summary":[{"type":"summary_text","text":"**Searching daemon thread startup paths**"}]},{"id":"fc_0a061eb498f0e908016a59d312c1688196b244609de0cd444b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding daemon startup spawns\",\"pattern\":\"spawn_[a-zA-Z_]+\\\\(|thread::spawn|std::thread::spawn|Builder::new\\\\(\\\\)\",\"path\":\"crates/spt-daemon/src/daemon.rs\",\"selector\":\"300-450\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_SdlSwuGgf3ZVfkZadrhs0sHU","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d312c18481968e13b3f69b59b214","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding broker control acceptors\",\"pattern\":\"pub fn serve|fn serve|listener\\\\.accept|thread::spawn|std::thread::spawn\",\"path\":\"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_s7D62QfFLCMJu1j45qsLPnvt","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d312c190819698b948e3b87b4009","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding stream consumer lifetimes\",\"pattern\":\"cold_start|net_stream_subscribe|net_presence_subscribe|net_stream_retire|serve_attach|Brain\",\"path\":\"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/attach.rs; crates/spt-daemon/src/sync.rs; crates/spt-daemon/src/xfer.rs; crates/spt-daemon/src/propagate.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_zYYz6oyEd6iIYhDAYvjaJ5gM","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d312c1988196940a4728f282d978","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding viewer count storage\",\"pattern\":\"viewer_count|controlled|driven_by\",\"path\":\"crates/spt-store/src; crates/spt-daemon/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_6TjSxbzPEgzCqJVnS0Vk8uN3","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d312c1a08196906114f11e7d8a0e","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatch worker connection\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"730-850\"}","call_id":"call_EJZP0uSgTUNHsCW4NEAo5I3w","name":"read"},{"id":"fc_0a061eb498f0e908016a59d312c1ac8196a3bbd6a505713001","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading attach serve connection\",\"path\":\"crates/spt-daemon/src/attach.rs\",\"selector\":\"230-340,500-625\"}","call_id":"call_bqGZM1LEKHLlHDhOcL7zaHwa","name":"read"}]},"duration":92321.94439999759,"ttft":1810.7780999988317,"contextSnapshot":{"promptTokens":148223,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_SdlSwuGgf3ZVfkZadrhs0sHU|fc_0a061eb498f0e908016a59d312c1688196b244609de0cd444b","toolName":"grep","startedAt":"2026-07-17T07:00:34.824Z","args":{"path":"crates/spt-daemon/src/daemon.rs"},"intent":"Finding daemon startup spawns"},"id":"443543a6","parentId":"5deb76fe","timestamp":"2026-07-17T07:00:34.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_s7D62QfFLCMJu1j45qsLPnvt|fc_0a061eb498f0e908016a59d312c18481968e13b3f69b59b214","toolName":"grep","startedAt":"2026-07-17T07:00:34.824Z","args":{"path":"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs"},"intent":"Finding broker control acceptors"},"id":"6ade92b6","parentId":"443543a6","timestamp":"2026-07-17T07:00:34.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zYYz6oyEd6iIYhDAYvjaJ5gM|fc_0a061eb498f0e908016a59d312c190819698b948e3b87b4009","toolName":"grep","startedAt":"2026-07-17T07:00:34.824Z","args":{"path":"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/attach.rs; crates/spt-daemon/src/sync.rs; crates/spt-daemon/src/xfer.rs; crates/spt-daemon/src/propagate.rs"},"intent":"Finding stream consumer lifetimes"},"id":"82b0595f","parentId":"6ade92b6","timestamp":"2026-07-17T07:00:34.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_6TjSxbzPEgzCqJVnS0Vk8uN3|fc_0a061eb498f0e908016a59d312c1988196940a4728f282d978","toolName":"grep","startedAt":"2026-07-17T07:00:34.824Z","args":{"path":"crates/spt-store/src; crates/spt-daemon/src"},"intent":"Finding viewer count storage"},"id":"0f954417","parentId":"82b0595f","timestamp":"2026-07-17T07:00:34.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_EJZP0uSgTUNHsCW4NEAo5I3w|fc_0a061eb498f0e908016a59d312c1a08196906114f11e7d8a0e","toolName":"read","startedAt":"2026-07-17T07:00:34.824Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatch worker connection"},"id":"0fb7eabf","parentId":"0f954417","timestamp":"2026-07-17T07:00:34.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_bqGZM1LEKHLlHDhOcL7zaHwa|fc_0a061eb498f0e908016a59d312c1ac8196a3bbd6a505713001","toolName":"read","startedAt":"2026-07-17T07:00:34.824Z","args":{"path":"crates/spt-daemon/src/attach.rs"},"intent":"Reading attach serve connection"},"id":"ef496447","parentId":"0fb7eabf","timestamp":"2026-07-17T07:00:34.824Z"}
{"type":"message","id":"fca1d474","parentId":"ef496447","timestamp":"2026-07-17T07:00:34.828Z","message":{"role":"toolResult","toolCallId":"call_SdlSwuGgf3ZVfkZadrhs0sHU|fc_0a061eb498f0e908016a59d312c1688196b244609de0cd444b","toolName":"grep","content":[{"type":"text","text":" 334|        {\n*335|            let (_handle, restart) = crate::brainproc::spawn_brain_supervisor(\n 336|                Arc::clone(&brain_stop),\n 337|                Arc::clone(&reaper),\n 338|                // The DRAINED promotion gate (REQ-UPDATE-PROMOTE-DRAINED) reads this"}],"details":{"scopePath":"crates/spt-daemon/src/daemon.rs","searchPath":"C:/Users/decid/Documents/projects/spt-core/crates/spt-daemon/src/daemon.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":1,"fileCount":1,"files":["crates/spt-daemon/src/daemon.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/daemon.rs","count":1}],"truncated":false,"displayContent":" 334│        {\n*335│            let (_handle, restart) = crate::brainproc::spawn_brain_supervisor(\n 336│                Arc::clone(&brain_stop),\n 337│                Arc::clone(&reaper),\n 338│                // The DRAINED promotion gate (REQ-UPDATE-PROMOTE-DRAINED) reads this"},"isError":false,"timestamp":1784271634828}}
{"type":"message","id":"16fe6833","parentId":"fca1d474","timestamp":"2026-07-17T07:00:34.828Z","message":{"role":"toolResult","toolCallId":"call_s7D62QfFLCMJu1j45qsLPnvt|fc_0a061eb498f0e908016a59d312c18481968e13b3f69b59b214","toolName":"grep","content":[{"type":"text","text":"Skipped due to queued user message. Do not count this skipped result as completed work or verification. After the queued message is handled on the next step, retry the skipped tool if it is still needed."}],"details":{},"isError":true,"timestamp":1784271634828}}
{"type":"message","id":"bffcefdd","parentId":"16fe6833","timestamp":"2026-07-17T07:00:34.828Z","message":{"role":"toolResult","toolCallId":"call_zYYz6oyEd6iIYhDAYvjaJ5gM|fc_0a061eb498f0e908016a59d312c190819698b948e3b87b4009","toolName":"grep","content":[{"type":"text","text":"Skipped due to queued user message. Do not count this skipped result as completed work or verification. After the queued message is handled on the next step, retry the skipped tool if it is still needed."}],"details":{},"isError":true,"timestamp":1784271634828}}
{"type":"message","id":"63a74a5e","parentId":"bffcefdd","timestamp":"2026-07-17T07:00:34.828Z","message":{"role":"toolResult","toolCallId":"call_6TjSxbzPEgzCqJVnS0Vk8uN3|fc_0a061eb498f0e908016a59d312c1988196940a4728f282d978","toolName":"grep","content":[{"type":"text","text":"Skipped due to queued user message. Do not count this skipped result as completed work or verification. After the queued message is handled on the next step, retry the skipped tool if it is still needed."}],"details":{},"isError":true,"timestamp":1784271634828}}
{"type":"message","id":"2c6e67be","parentId":"63a74a5e","timestamp":"2026-07-17T07:00:34.837Z","message":{"role":"toolResult","toolCallId":"call_bqGZM1LEKHLlHDhOcL7zaHwa|fc_0a061eb498f0e908016a59d312c1ac8196a3bbd6a505713001","toolName":"read","content":[{"type":"text","text":"/// - Role-aware subscribe (REQ-RCVIEW-1): the broker resolves controller /\n///   viewer / busy / take by intent + origin and replies a `Subscribed`;\n///   driven_by / viewer_count are BROKER-owned (single writer). A VIEWER\n///   attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);\n///   the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).\n// [impl->REQ-RC-CROSS-NODE-ATTACH]\n// [impl->REQ-HAZARD-VIEWER-RING-ROLL-SNAP]\n#[allow(clippy::too_many_arguments)]\nfn handle_attach_request(\n    brain: &mut Brain,\n    wire: &mut Brain,\n    stream_id: u64,\n    endpoint: &str,\n    origin_node: &str,\n    remote_session: Option<u64>,\n    session_id: u64,\n    from_seq: u64,\n    req_intent: AttachIntent,\n    req_gen: u64,\n    intent: &mut AttachIntent,\n    attached_session: &mut Option<u64>,\n    attached: &mut bool,\n    serve_gen: &mut u64,\n) -> io::Result<Option<AttachServeOutcome>> {\n    if access_check(endpoint, origin_node, InboundClass::Unsolicited) == AccessDecision::Deny {\n        wire.net_stream_send(stream_id, &[], None, true)?;\n        return Ok(Some(AttachServeOutcome::Refused));\n    }\n    let sid = remote_session.unwrap_or(session_id);\n    *intent = req_intent;\n    *attached_session = Some(sid);\n    if req_intent == AttachIntent::Viewer {\n        brain.attach_as_viewer_snap(sid, from_seq, Some(origin_node))?;\n    } else {\n        brain.attach_as(sid, from_seq, req_intent, req_gen, Some(origin_node))?;\n        *serve_gen = req_gen;\n    }\n    *attached = true;\n    Ok(None)\n}\n\n/// Serve one attach stream against this brain's broker, blocking until the\n/// session exits, the operator detaches, or the gate refuses.\n///\n/// `origin_node` MUST be the handshake-proven remote id from the broker's\n/// stream table (`NetStreamInfo::remote_id_hex`) — never payload bytes\n/// (REQ-HAZARD-WAN-ORIGIN-AUTH). `endpoint` names the endpoint whose session\n/// is being attached, for the gate. `net_from_seq` is this brain's resume\n/// cursor on the attach stream (0 cold — also the safe post-restart choice:\n/// the replayed `Request`/`Input` records re-gate and dedup at the PTY\n/// journal, and re-pumped output dedups at the operator's render cursor).\n///\n/// `remote_session` is `Some(sid)` ONLY on the cross-node leg (#4,\n/// REQ-RC-CROSS-NODE-ATTACH): the dispatcher has ALREADY resolved endpoint→our\n/// session id ([`resolve_local_session`]) BEFORE this serve loop subscribed, so\n/// the wire's placeholder `session_id` (0) is overridden here with the resolved\n/// id. It is passed down — never re-queried mid-loop — because a `sessions()`\n/// round-trip inside the event loop would swallow interleaved attach records\n/// (`Input`/`Subscribed`) the loop must see. `None` = the local path, which uses\n/// the wire `session_id`.\n///\n/// `seed_request` is the broker-pinned opener Request (ADR-0038 B): after the\n/// bounded ring rolls, the wire replay no longer carries the stream's Request\n/// record — a reconstruction that waited for one would idle forever. The\n/// dispatcher hands the durable opener here and it is handled EXACTLY like a\n/// wire-arriving Request (same gate, same subscribe); a Request that then\n/// replays from the ring anyway re-runs the same-identity re-take, which is\n/// silent and idempotent (the successor-re-take parity the fix must keep).\n// [impl->REQ-INST-8]\n// [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n// [impl->REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT]\n// [impl->REQ-RC-CROSS-NODE-ATTACH]\n// [impl->REQ-STREAM-OPENER-DURABLE]\n#[allow(clippy::too_many_arguments)]\npub fn serve_attach(\n    brain: &mut Brain,\n    broker_name: &str,\n    stream_id: u64,\n    endpoint: &str,\n    origin_node: &str,\n    net_from_seq: u64,\n    remote_session: Option<u64>,\n    seed_request: Option<AttachRecord>,\n) -> io::Result<AttachServeOutcome> {\n    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n    // TWO-CONN SPLIT (REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT): the wire FORWARDS\n    // (session Output / Size / Exit / Displaced / detach-finish onto the operator\n    // stream) ride a SEPARATE broker connection from `brain`. `brain` RECEIVES\n    // session output (broker→serve) — including the controller's synchronous,\n    // inline, multi-frame ring replay (`become_controller`), which holds the\n    // broker's single-threaded per-conn handler for the whole replay. If the\n    // forwards rode `brain` too, that stuck handler could not read them →\n    // serve→broker backs up while broker→serve replay backs up → mutual IPC\n    // backpressure DEADLOCK, and the operator receives ZERO bytes (the bug: an\n    // attach to an ALREADY-PRODUCING endpoint-run harness, non-empty ring). The\n    // two directions on independent single-threaded handlers cannot block each\n    // other. `send_stream` is stream_id-keyed (conn-agnostic), so forwarding from\n    // a second conn is correct. Order is preserved: this one serve thread reads\n    // every Output in seq order on `brain` and forwards it in that same order on\n    // `wire`. (DEEPER ROOT, post-v0.12.1 follow-up: the CONTROLLER replay is a\n    // SYNCHRONOUS inline write, while VIEWERS use the async dedicated-writer-\n    // thread + bounded-channel pattern (`add_viewer`/`viewer_writer`); unifying\n    // the controller onto that async path would remove the inline-replay block at\n    // the source, but it touches the authoritative cursor-advancing path.)\n    let mut wire = Brain::cold_start(broker_name, now_ms())?;\n    let mut decoder = AttachDecoder::new();\n    let mut attached = false;\n    // The Request's intent — gates wire input (a viewer's keystrokes never reach\n    // the PTY) independent of the broker's later role reply (no IPC-ordering\n    // race on the input gate).\n    let mut intent = AttachIntent::Control;\n…\n            BrokerEvent::NetStreamData {\n…\n            } if sid == stream_id => {\n                for rec in decoder.push(&bytes) {\n                    match rec {\n…\n                        AttachRecord::Resize { rows, cols }\n                            if attached && intent != AttachIntent::Viewer =>\n                        {\n                            // Controller → PTY resize (controller-EXCLUSIVE; the\n                            // broker rejects it on a viewer's stream). A viewer's\n                            // Resize is dropped here by the intent gate too.\n                            let _ = brain.resize(rows, cols);\n                        }\n                        // Input/Resize before Request, a viewer's input/resize,\n                        // or target-direction records echoed back: noise — ignore.\n                        _ => {}\n                    }\n                }\n            }\n\n            // ── Broker → loop: the resolved controller/viewer role. ─────────\n            BrokerEvent::Subscribed { outcome, .. } => {\n                use crate::msg::SubscribeOutcome as O;\n                match outcome {\n                    O::Controller | O::TookControl => {\n                        role = Some(ServeRole::Controller);\n                        // A driver attached — the wake edge (controller-only;\n                        // idempotent on an already-active seat).\n                        feed_rest(endpoint, crate::resting::RestEvent::Wake);\n                        // Flush any input that raced ahead of the reply (operator-\n                        // minted ops carry the `rc` tag).\n                        for (op, b) in pending_input.drain(..) {\n                            brain.send_effect(MintedOp::new(Minter::Rc, op), &b)?;\n                        }\n                    }\n                    O::Viewer => {\n                        role = Some(ServeRole::Viewer);\n                        // Wake-neutral: a viewer never wakes the endpoint, never\n                        // keeps it awake (Gap B). Discard any racing input.\n                        pending_input.clear();\n                    }\n                    O::BusyControlled { .. } => {\n                        // A different operator controls it — refuse (no PTY input\n                        // ever reached it; the buffer is discarded). The rc\n                        // renders the busy guidance client-side from driven_by.\n                        wire.net_stream_send(stream_id, &[], None, true)?;\n                        return Ok(AttachServeOutcome::Refused);\n                    }\n                }\n            }\n            // Viewer letterbox feed: the current PTY size (on attach + resize).\n            BrokerEvent::Size { rows, cols, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Size { rows, cols });\n                wire.net_stream_send(stream_id, &line, None, false)?;\n            }\n            // This controller was kicked by a different operator's `--take`.\n            BrokerEvent::Displaced { by, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Displaced { by });\n                wire.net_stream_send(stream_id, &line, None, true)?;\n                // No dormant edge: the endpoint stays driven by the taker (whose\n                // own serve loop already fired the wake).\n                return Ok(AttachServeOutcome::Displaced);\n            }\n\n            // This VIEWER overflowed its broker subscription queue and was evicted\n            // (it forwards slower than the drain fans out under flood). SKIP TO\n            // LIVE — re-subscribe from the current ring floor — instead of tearing\n            // the attach down: DISTINCT from a session-exit EOF. Rate-limited\n            // (RESUBSCRIBE_INTERVAL) so a hopelessly-behind viewer under sustained\n            // flood sees intermittent LIVE bursts, never an evict→resubscribe CPU\n            // spin. The next live Output carries a forward seq jump; the operator's\n            // render cursor snaps to it (tail -f reconnect). VIEWER-only → B2-safe.\n            // [impl->REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT]\n            BrokerEvent::ViewerEvicted { session_id: sid }\n                if attached && Some(sid) == attached_session =>\n            {\n                if let Some(prev) = last_resubscribe {\n                    let since = prev.elapsed();\n                    if since < RESUBSCRIBE_INTERVAL {\n                        std::thread::sleep(RESUBSCRIBE_INTERVAL - since);\n                    }\n                }\n                brain.attach_skip_to_live(sid, Some(origin_node))?;\n                last_resubscribe = Some(Instant::now());\n            }\n\n            // The operator closed its send side: the viewport is over.\n            BrokerEvent::NetStreamEof { stream_id: sid, .. } if sid == stream_id => {\n                wire.net_stream_send(stream_id, &[], None, true)?;\n                // ORDER MATTERS: feed the resting edge FIRST (it read-modify-writes\n                // info.json, carrying the current driven_by through), THEN release\n                // the role over IPC so the broker's driven_by=None is the LAST\n                // write — otherwise a concurrent resting RMW restores the stale\n                // marker (the clear-race the broker-single-writer model averts).\n                if role == Some(ServeRole::Controller) {\n                    // The driver detached — the endpoint rests warm (controller-\n                    // only; a viewer leaving is wake-neutral).\n                    feed_rest(endpoint, crate::resting::RestEvent::Detach);\n                }\n                if let Some(sid) = attached_session {\n                    let _ = brain.detach_session_gen(sid, Some(serve_gen)); // release ONLY our generation\n                }\n                return Ok(AttachServeOutcome::Detached);\n            }\n\n            // ── Session → wire: output and exit. ────────────────────────────\n            BrokerEvent::Output { seq, bytes, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Output {\n                    seq,\n                    data_b64: encode_bytes(&bytes),\n                });\n                // Unjournaled by design (see module docs): `seq` rides inside\n                // the record, and the operator's render cursor is the dedup.\n                wire.net_stream_send(stream_id, &line, None, false)?;\n            }\n            BrokerEvent::Exit { code, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Exit { code });\n                wire.net_stream_send(stream_id, &line, None, true)?;\n                if role == Some(ServeRole::Controller) {\n                    feed_rest(endpoint, crate::resting::RestEvent::Detach);\n                }\n                return Ok(AttachServeOutcome::Exited(code));\n            }\n\n            BrokerEvent::Error { message } => {\n                if role == Some(ServeRole::Controller) {\n                    feed_rest(endpoint, crate::resting::RestEvent::Detach);\n                }\n                return Err(io::Error::other(message));\n            }\n            // Applied/NetSent acks and unrelated events: not ours to handle.\n            _ => {}\n…\n}"}],"details":{"displayContent":{"text":"/// - Role-aware subscribe (REQ-RCVIEW-1): the broker resolves controller /\n///   viewer / busy / take by intent + origin and replies a `Subscribed`;\n///   driven_by / viewer_count are BROKER-owned (single writer). A VIEWER\n///   attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);\n///   the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).\n// [impl->REQ-RC-CROSS-NODE-ATTACH]\n// [impl->REQ-HAZARD-VIEWER-RING-ROLL-SNAP]\n#[allow(clippy::too_many_arguments)]\nfn handle_attach_request(\n    brain: &mut Brain,\n    wire: &mut Brain,\n    stream_id: u64,\n    endpoint: &str,\n    origin_node: &str,\n    remote_session: Option<u64>,\n    session_id: u64,\n    from_seq: u64,\n    req_intent: AttachIntent,\n    req_gen: u64,\n    intent: &mut AttachIntent,\n    attached_session: &mut Option<u64>,\n    attached: &mut bool,\n    serve_gen: &mut u64,\n) -> io::Result<Option<AttachServeOutcome>> {\n    if access_check(endpoint, origin_node, InboundClass::Unsolicited) == AccessDecision::Deny {\n        wire.net_stream_send(stream_id, &[], None, true)?;\n        return Ok(Some(AttachServeOutcome::Refused));\n    }\n    let sid = remote_session.unwrap_or(session_id);\n    *intent = req_intent;\n    *attached_session = Some(sid);\n    if req_intent == AttachIntent::Viewer {\n        brain.attach_as_viewer_snap(sid, from_seq, Some(origin_node))?;\n    } else {\n        brain.attach_as(sid, from_seq, req_intent, req_gen, Some(origin_node))?;\n        *serve_gen = req_gen;\n    }\n    *attached = true;\n    Ok(None)\n}\n\n/// Serve one attach stream against this brain's broker, blocking until the\n/// session exits, the operator detaches, or the gate refuses.\n///\n/// `origin_node` MUST be the handshake-proven remote id from the broker's\n/// stream table (`NetStreamInfo::remote_id_hex`) — never payload bytes\n/// (REQ-HAZARD-WAN-ORIGIN-AUTH). `endpoint` names the endpoint whose session\n/// is being attached, for the gate. `net_from_seq` is this brain's resume\n/// cursor on the attach stream (0 cold — also the safe post-restart choice:\n/// the replayed `Request`/`Input` records re-gate and dedup at the PTY\n/// journal, and re-pumped output dedups at the operator's render cursor).\n///\n/// `remote_session` is `Some(sid)` ONLY on the cross-node leg (#4,\n/// REQ-RC-CROSS-NODE-ATTACH): the dispatcher has ALREADY resolved endpoint→our\n/// session id ([`resolve_local_session`]) BEFORE this serve loop subscribed, so\n/// the wire's placeholder `session_id` (0) is overridden here with the resolved\n/// id. It is passed down — never re-queried mid-loop — because a `sessions()`\n/// round-trip inside the event loop would swallow interleaved attach records\n/// (`Input`/`Subscribed`) the loop must see. `None` = the local path, which uses\n/// the wire `session_id`.\n///\n/// `seed_request` is the broker-pinned opener Request (ADR-0038 B): after the\n/// bounded ring rolls, the wire replay no longer carries the stream's Request\n/// record — a reconstruction that waited for one would idle forever. The\n/// dispatcher hands the durable opener here and it is handled EXACTLY like a\n/// wire-arriving Request (same gate, same subscribe); a Request that then\n/// replays from the ring anyway re-runs the same-identity re-take, which is\n/// silent and idempotent (the successor-re-take parity the fix must keep).\n// [impl->REQ-INST-8]\n// [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n// [impl->REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT]\n// [impl->REQ-RC-CROSS-NODE-ATTACH]\n// [impl->REQ-STREAM-OPENER-DURABLE]\n#[allow(clippy::too_many_arguments)]\npub fn serve_attach(\n    brain: &mut Brain,\n    broker_name: &str,\n    stream_id: u64,\n    endpoint: &str,\n    origin_node: &str,\n    net_from_seq: u64,\n    remote_session: Option<u64>,\n    seed_request: Option<AttachRecord>,\n) -> io::Result<AttachServeOutcome> {\n    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n    // TWO-CONN SPLIT (REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT): the wire FORWARDS\n    // (session Output / Size / Exit / Displaced / detach-finish onto the operator\n    // stream) ride a SEPARATE broker connection from `brain`. `brain` RECEIVES\n    // session output (broker→serve) — including the controller's synchronous,\n    // inline, multi-frame ring replay (`become_controller`), which holds the\n    // broker's single-threaded per-conn handler for the whole replay. If the\n    // forwards rode `brain` too, that stuck handler could not read them →\n    // serve→broker backs up while broker→serve replay backs up → mutual IPC\n    // backpressure DEADLOCK, and the operator receives ZERO bytes (the bug: an\n    // attach to an ALREADY-PRODUCING endpoint-run harness, non-empty ring). The\n    // two directions on independent single-threaded handlers cannot block each\n    // other. `send_stream` is stream_id-keyed (conn-agnostic), so forwarding from\n    // a second conn is correct. Order is preserved: this one serve thread reads\n    // every Output in seq order on `brain` and forwards it in that same order on\n    // `wire`. (DEEPER ROOT, post-v0.12.1 follow-up: the CONTROLLER replay is a\n    // SYNCHRONOUS inline write, while VIEWERS use the async dedicated-writer-\n    // thread + bounded-channel pattern (`add_viewer`/`viewer_writer`); unifying\n    // the controller onto that async path would remove the inline-replay block at\n    // the source, but it touches the authoritative cursor-advancing path.)\n    let mut wire = Brain::cold_start(broker_name, now_ms())?;\n    let mut decoder = AttachDecoder::new();\n    let mut attached = false;\n    // The Request's intent — gates wire input (a viewer's keystrokes never reach\n    // the PTY) independent of the broker's later role reply (no IPC-ordering\n    // race on the input gate).\n    let mut intent = AttachIntent::Control;\n…\n            BrokerEvent::NetStreamData {\n…\n            } if sid == stream_id => {\n                for rec in decoder.push(&bytes) {\n                    match rec {\n…\n                        AttachRecord::Resize { rows, cols }\n                            if attached && intent != AttachIntent::Viewer =>\n                        {\n                            // Controller → PTY resize (controller-EXCLUSIVE; the\n                            // broker rejects it on a viewer's stream). A viewer's\n                            // Resize is dropped here by the intent gate too.\n                            let _ = brain.resize(rows, cols);\n                        }\n                        // Input/Resize before Request, a viewer's input/resize,\n                        // or target-direction records echoed back: noise — ignore.\n                        _ => {}\n                    }\n                }\n            }\n\n            // ── Broker → loop: the resolved controller/viewer role. ─────────\n            BrokerEvent::Subscribed { outcome, .. } => {\n                use crate::msg::SubscribeOutcome as O;\n                match outcome {\n                    O::Controller | O::TookControl => {\n                        role = Some(ServeRole::Controller);\n                        // A driver attached — the wake edge (controller-only;\n                        // idempotent on an already-active seat).\n                        feed_rest(endpoint, crate::resting::RestEvent::Wake);\n                        // Flush any input that raced ahead of the reply (operator-\n                        // minted ops carry the `rc` tag).\n                        for (op, b) in pending_input.drain(..) {\n                            brain.send_effect(MintedOp::new(Minter::Rc, op), &b)?;\n                        }\n                    }\n                    O::Viewer => {\n                        role = Some(ServeRole::Viewer);\n                        // Wake-neutral: a viewer never wakes the endpoint, never\n                        // keeps it awake (Gap B). Discard any racing input.\n                        pending_input.clear();\n                    }\n                    O::BusyControlled { .. } => {\n                        // A different operator controls it — refuse (no PTY input\n                        // ever reached it; the buffer is discarded). The rc\n                        // renders the busy guidance client-side from driven_by.\n                        wire.net_stream_send(stream_id, &[], None, true)?;\n                        return Ok(AttachServeOutcome::Refused);\n                    }\n                }\n            }\n            // Viewer letterbox feed: the current PTY size (on attach + resize).\n            BrokerEvent::Size { rows, cols, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Size { rows, cols });\n                wire.net_stream_send(stream_id, &line, None, false)?;\n            }\n            // This controller was kicked by a different operator's `--take`.\n            BrokerEvent::Displaced { by, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Displaced { by });\n                wire.net_stream_send(stream_id, &line, None, true)?;\n                // No dormant edge: the endpoint stays driven by the taker (whose\n                // own serve loop already fired the wake).\n                return Ok(AttachServeOutcome::Displaced);\n            }\n\n            // This VIEWER overflowed its broker subscription queue and was evicted\n            // (it forwards slower than the drain fans out under flood). SKIP TO\n            // LIVE — re-subscribe from the current ring floor — instead of tearing\n            // the attach down: DISTINCT from a session-exit EOF. Rate-limited\n            // (RESUBSCRIBE_INTERVAL) so a hopelessly-behind viewer under sustained\n            // flood sees intermittent LIVE bursts, never an evict→resubscribe CPU\n            // spin. The next live Output carries a forward seq jump; the operator's\n            // render cursor snaps to it (tail -f reconnect). VIEWER-only → B2-safe.\n            // [impl->REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT]\n            BrokerEvent::ViewerEvicted { session_id: sid }\n                if attached && Some(sid) == attached_session =>\n            {\n                if let Some(prev) = last_resubscribe {\n                    let since = prev.elapsed();\n                    if since < RESUBSCRIBE_INTERVAL {\n                        std::thread::sleep(RESUBSCRIBE_INTERVAL - since);\n                    }\n                }\n                brain.attach_skip_to_live(sid, Some(origin_node))?;\n                last_resubscribe = Some(Instant::now());\n            }\n\n            // The operator closed its send side: the viewport is over.\n            BrokerEvent::NetStreamEof { stream_id: sid, .. } if sid == stream_id => {\n                wire.net_stream_send(stream_id, &[], None, true)?;\n                // ORDER MATTERS: feed the resting edge FIRST (it read-modify-writes\n                // info.json, carrying the current driven_by through), THEN release\n                // the role over IPC so the broker's driven_by=None is the LAST\n                // write — otherwise a concurrent resting RMW restores the stale\n                // marker (the clear-race the broker-single-writer model averts).\n                if role == Some(ServeRole::Controller) {\n                    // The driver detached — the endpoint rests warm (controller-\n                    // only; a viewer leaving is wake-neutral).\n                    feed_rest(endpoint, crate::resting::RestEvent::Detach);\n                }\n                if let Some(sid) = attached_session {\n                    let _ = brain.detach_session_gen(sid, Some(serve_gen)); // release ONLY our generation\n                }\n                return Ok(AttachServeOutcome::Detached);\n            }\n\n            // ── Session → wire: output and exit. ────────────────────────────\n            BrokerEvent::Output { seq, bytes, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Output {\n                    seq,\n                    data_b64: encode_bytes(&bytes),\n                });\n                // Unjournaled by design (see module docs): `seq` rides inside\n                // the record, and the operator's render cursor is the dedup.\n                wire.net_stream_send(stream_id, &line, None, false)?;\n            }\n            BrokerEvent::Exit { code, .. } if attached => {\n                let line = ndjson::encode_line(&AttachRecord::Exit { code });\n                wire.net_stream_send(stream_id, &line, None, true)?;\n                if role == Some(ServeRole::Controller) {\n                    feed_rest(endpoint, crate::resting::RestEvent::Detach);\n                }\n                return Ok(AttachServeOutcome::Exited(code));\n            }\n\n            BrokerEvent::Error { message } => {\n                if role == Some(ServeRole::Controller) {\n                    feed_rest(endpoint, crate::resting::RestEvent::Detach);\n                }\n                return Err(io::Error::other(message));\n            }\n            // Applied/NetSent acks and unrelated events: not ours to handle.\n            _ => {}\n…\n}","startLine":230,"lineNumbers":[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,432,null,436,437,438,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,null,628]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\attach.rs"}}},"isError":false,"timestamp":1784271634837}}
{"type":"message","id":"3023aedc","parentId":"2c6e67be","timestamp":"2026-07-17T07:00:34.852Z","message":{"role":"toolResult","toolCallId":"call_EJZP0uSgTUNHsCW4NEAo5I3w|fc_0a061eb498f0e908016a59d312c1a08196906114f11e7d8a0e","toolName":"read","content":[{"type":"text","text":"#[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    // 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            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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            };\n…\n        }\n…\n    };\n…\n}\n\n[Showing lines 729-853 of 1558. Use :854 to continue]"}],"details":{"truncation":{"content":"#[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    // 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            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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())","truncated":true,"truncatedBy":"lines","totalLines":830,"totalBytes":5706,"outputLines":125,"outputBytes":5706,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"#[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    // 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            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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            };\n…\n        }\n…\n    };\n…\n}","startLine":729,"lineNumbers":[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,854,null,873,null,902,null,962,null,968]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":5706,"outputLines":125,"outputBytes":5706,"shownRange":{"start":729,"end":853},"nextOffset":854}}},"isError":false,"timestamp":1784271634852}}
{"type":"message","id":"bac1ce07","parentId":"3023aedc","timestamp":"2026-07-17T07:00:34.875Z","message":{"role":"user","content":"Your current interruptible wait was interrupted because an IRC message arrived from your parent agent `Main`.\n\nParent IRC message:\n\nFresh v0.36 evidence: repeated Registry-family stream subscriber poison. Examples stream 524/1161/1347/3053/3810: CONN_WRITE_POISONED after ~15s, DISPATCH_EV family=Registry endpoint=- elapsed 15.5-16.4s. Current broker ~550 threads; brain reads ~64 MiB/s. Investigate Registry stream lifecycle/replay specifically.","attribution":"agent","timestamp":1784271582387,"steering":true}}
{"type":"message","id":"c7f595cc","parentId":"bac1ce07","timestamp":"2026-07-17T07:00:47.339Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Prioritizing registry feed investigation**"},{"type":"toolCall","id":"call_nkpg4zRw3B0QZxlQkVLiCSTM|fc_0a061eb498f0e908016a59d31f3f4881969f6c464ad899cfe3","name":"grep","arguments":{"i":"Tracing registry stream family","pattern":"Registry|serve_registry_feed|registry-feed|registry_feed|StreamFamily::Registry|KIND_REGISTRY|retire","path":"crates/spt-daemon/src; crates/spt-net/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_GNgpNWps8gjEwQcpGuC48ACz|fc_0a061eb498f0e908016a59d31f3f608196bad9d5b5ec839bdf","name":"grep","arguments":{"i":"Finding registry request producers","pattern":"RegistryRecord|registry.*stream|open_stream|net_stream_open|net_stream_send|subscribe_stream","path":"crates/spt-daemon/src/registryhost.rs; crates/spt-daemon/src/pump; crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brainproc.rs","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_j4d1p1cuiRAX2cyEHdUrTXiV|fc_0a061eb498f0e908016a59d31f3f6c8196aa00e4eaaf7de08b","name":"grep","arguments":{"i":"Finding registry replay behavior","pattern":"fn first_line|peek_first_line|net_stream_opener|fallback|from_seq|floor_seq","path":"crates/spt-daemon/src/dispatch.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_ar2PhpYSfw6oO33co681QcLl|fc_0a061eb498f0e908016a59d31f3f7881969b9330901f42037d","name":"grep","arguments":{"i":"Finding broker control acceptors","pattern":"pub fn serve|fn serve|listener\\.accept|thread::spawn|std::thread::spawn","path":"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_XJ8alAv3b7n7xi2sqYGi0Mc2|fc_0a061eb498f0e908016a59d31f3f808196a84af86218495d87","name":"grep","arguments":{"i":"Finding viewer count storage","pattern":"viewer_count|controlled|driven_by","path":"crates/spt-store/src; crates/spt-daemon/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_IrDxlGQ5OWWyT6k5FZsmwHI9|fc_0a061eb498f0e908016a59d31f3f8881969e5e75904db09065","name":"read","arguments":{"i":"Reading registry dispatch arm","path":"crates/spt-daemon/src/dispatch.rs","selector":"840-960"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8488,"output":517,"cacheRead":147968,"cacheWrite":0,"totalTokens":156973,"reasoningTokens":46,"cost":{"input":0.042440000000000005,"output":0.015510000000000001,"cacheRead":0.073984,"cacheWrite":0,"total":0.131934}},"stopReason":"toolUse","timestamp":1784271634895,"responseId":"resp_0a061eb498f0e908016a59d31332b8819683e6360638e75152","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d315e44c8196805e56646c21453c","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdMfEwey9kn9-W5qSNg-WIcaGkX0-OLP1HWtmk5w8nkqQ9ltDi_MjEaBUr_jdIqpwZu_xbROCazUe5gG7uWKPBFeHzMy05xRKyCVv2ZBu5J_BDJhCPBvzSI6RKN3nN2xTZJfh3WFdmp7QADyPHyIhNXXuS6R5YxBQly_00I8tjN8McpYXhHgzlrEyG9xJF8NeWfuJYGy7I3D2WvFepUwbGbl2EaFcjwvTZXb5kEeNWHb5njCxnI3ummzRfp8uC7yE0DOfqiPvFBb1nZuP32Eo7MsmTd-UWwgBFJZ3pBjKI4tRrk5nr40iRwRJmX-hsbShIIy6sxmEfvHUos0LrX9IkkDaHUPqN9v3p48zwZd7wHXRc5APUqXDNT5kcEDU84xOwirb80tNpM7gBJcPbSj7tfIxMN00UyShVroJb6SaBkrf0JhghAMj9d7II4uA53OfN680yo1qc3XxAM1LS8OJQydJ06NmwwNkJSPFI2ujKpznEDQf-75bWBL02n7s2G7KbxH08sW8Rs5D5L8Bdf-yA9VBIkT3Hnr_fGqKkGx1-s0iIw8qhH3gEJ28KViDYmdGWjBXvYN-cfWcOBm_iRbzmyt4_q1FgO7yCNhO6nMRp3Hvi5wxepqbPnYZc6XxTv8FyDSG2HHjDi1RitqqBYjN8b5JG41kf5ZJSMFUCjRpQ0Zk5ntMYhx-4VS08IlgiQ_53QHlzzWiOW7nRlI36t0k3Q9kxVD1tqBHNHYcVPTdHhad6ZpmncdQXaORn_tXi3g4Kvef4XnIL3MjJVQyRwWN-pRcvU6Z7E-JX-Q8B5Dk5gQ3hqG4bZHZ3w3Swc3lJtYj2g6HGf4VT03DygXbgXH9fMhacvPsSK5qm1qxEbq2IR1KFH76F4tRCF4UcvvP7Kn9E2cCWcjrZYNE0JQD7Z9B4cLop2_TZruwsP1XJ0mRBMIuW9JStndoefviRmr8HV8VzyYrcu0eia0J1v9lQx0YJCdc-rgZMAPxQcThrdAsXKGfKGEC-gbk8L6b5_c3J_FnBF_pdM1LceEnIJUWOG-OcOx--Z7ZdtfRR812XAYrIRMEMlIzRZxiyfNj2kqoijUweemsqhsO3qV7ja8X-z-uMjEXkmzH9TTit__2hghNNVINgtAoxWdRBQDtWlmILBKVrIfo94OLwKNONa15Rm-hm27aPUAhD3Ge8SIrJ0KIheM5FMX8Ithj8REsFwJ9XN07JeNZpQbkZUSzDTB25pR1LOssjskFdjpA0IjJjk7jH5PiWM=","summary":[{"type":"summary_text","text":"**Prioritizing registry feed investigation**"}]},{"id":"fc_0a061eb498f0e908016a59d31f3f4881969f6c464ad899cfe3","type":"function_call","status":"completed","arguments":"{\"i\":\"Tracing registry stream family\",\"pattern\":\"Registry|serve_registry_feed|registry-feed|registry_feed|StreamFamily::Registry|KIND_REGISTRY|retire\",\"path\":\"crates/spt-daemon/src; crates/spt-net/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_nkpg4zRw3B0QZxlQkVLiCSTM","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d31f3f608196bad9d5b5ec839bdf","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry request producers\",\"pattern\":\"RegistryRecord|registry.*stream|open_stream|net_stream_open|net_stream_send|subscribe_stream\",\"path\":\"crates/spt-daemon/src/registryhost.rs; crates/spt-daemon/src/pump; crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brainproc.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_GNgpNWps8gjEwQcpGuC48ACz","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d31f3f6c8196aa00e4eaaf7de08b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry replay behavior\",\"pattern\":\"fn first_line|peek_first_line|net_stream_opener|fallback|from_seq|floor_seq\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_j4d1p1cuiRAX2cyEHdUrTXiV","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d31f3f7881969b9330901f42037d","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding broker control acceptors\",\"pattern\":\"pub fn serve|fn serve|listener\\\\.accept|thread::spawn|std::thread::spawn\",\"path\":\"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_ar2PhpYSfw6oO33co681QcLl","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d31f3f808196a84af86218495d87","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding viewer count storage\",\"pattern\":\"viewer_count|controlled|driven_by\",\"path\":\"crates/spt-store/src; crates/spt-daemon/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_XJ8alAv3b7n7xi2sqYGi0Mc2","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d31f3f8881969e5e75904db09065","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry dispatch arm\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"840-960\"}","call_id":"call_IrDxlGQ5OWWyT6k5FZsmwHI9","name":"read"}]},"duration":12443.472099989653,"ttft":3042.995499998331,"contextSnapshot":{"promptTokens":156456,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_nkpg4zRw3B0QZxlQkVLiCSTM|fc_0a061eb498f0e908016a59d31f3f4881969f6c464ad899cfe3","toolName":"grep","startedAt":"2026-07-17T07:00:47.340Z","args":{"path":"crates/spt-daemon/src; crates/spt-net/src"},"intent":"Tracing registry stream family"},"id":"bbb39638","parentId":"c7f595cc","timestamp":"2026-07-17T07:00:47.340Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GNgpNWps8gjEwQcpGuC48ACz|fc_0a061eb498f0e908016a59d31f3f608196bad9d5b5ec839bdf","toolName":"grep","startedAt":"2026-07-17T07:00:47.340Z","args":{"path":"crates/spt-daemon/src/registryhost.rs; crates/spt-daemon/src/pump; crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brainproc.rs"},"intent":"Finding registry request producers"},"id":"04311981","parentId":"bbb39638","timestamp":"2026-07-17T07:00:47.340Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_j4d1p1cuiRAX2cyEHdUrTXiV|fc_0a061eb498f0e908016a59d31f3f6c8196aa00e4eaaf7de08b","toolName":"grep","startedAt":"2026-07-17T07:00:47.340Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Finding registry replay behavior"},"id":"849644f1","parentId":"04311981","timestamp":"2026-07-17T07:00:47.340Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ar2PhpYSfw6oO33co681QcLl|fc_0a061eb498f0e908016a59d31f3f7881969b9330901f42037d","toolName":"grep","startedAt":"2026-07-17T07:00:47.340Z","args":{"path":"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs"},"intent":"Finding broker control acceptors"},"id":"21548292","parentId":"849644f1","timestamp":"2026-07-17T07:00:47.340Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_XJ8alAv3b7n7xi2sqYGi0Mc2|fc_0a061eb498f0e908016a59d31f3f808196a84af86218495d87","toolName":"grep","startedAt":"2026-07-17T07:00:47.340Z","args":{"path":"crates/spt-store/src; crates/spt-daemon/src"},"intent":"Finding viewer count storage"},"id":"86b94dcd","parentId":"21548292","timestamp":"2026-07-17T07:00:47.340Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_IrDxlGQ5OWWyT6k5FZsmwHI9|fc_0a061eb498f0e908016a59d31f3f8881969e5e75904db09065","toolName":"read","startedAt":"2026-07-17T07:00:47.340Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading registry dispatch arm"},"id":"67bd383d","parentId":"86b94dcd","timestamp":"2026-07-17T07:00:47.340Z"}
{"type":"message","id":"9bda883b","parentId":"67bd383d","timestamp":"2026-07-17T07:00:47.343Z","message":{"role":"toolResult","toolCallId":"call_j4d1p1cuiRAX2cyEHdUrTXiV|fc_0a061eb498f0e908016a59d31f3f6c8196aa00e4eaaf7de08b","toolName":"grep","content":[{"type":"text","text":" 489|            let conn_id = s.conn_id;\n*490|            let floor_seq = s.floor_seq;\n 491|            let finished = s.finished;\n 492|            let p = paths.clone();\n 493|            let reg = Arc::clone(&registry);\n...\n 499|                let started = Instant::now();\n*500|                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n 501|                pool.fetch_sub(1, Ordering::Relaxed);\n 502|                let outcome = report.outcome;\n 503|                let elapsed_ms = started.elapsed().as_millis();\n...\n 619|/// (terminal); `Err` = transient (the claim requeues bounded).\n*620|fn first_line(\n 621|    broker_name: &str,\n 622|    stream_id: u64,\n*623|    floor_seq: u64,\n 624|) -> io::Result<Option<serde_json::Value>> {\n*625|    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n 626|        // Pinned: classify from the durable fact. A pinned line that does not\n 627|        // parse is terminally unclassifiable (same contract as the peek path).\n 628|        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n...\n 649|    }\n*650|    peek_first_line(broker_name, stream_id, floor_seq)\n 651|}\n 652|\n 653|/// Peek the stream's first retained NDJSON line on a throwaway brain\n*654|/// connection (the pre-ADR-0038 fallback — subject to ring eviction, kept\n*655|/// only for the older-broker window). Subscribes from `floor_seq` (the oldest\n 656|/// retained chunk) so a rolled ring replays instead of tripping the brain's\n 657|/// gap check.\n*658|fn peek_first_line(\n 659|    broker_name: &str,\n 660|    stream_id: u64,\n*661|    floor_seq: u64,\n 662|) -> io::Result<Option<serde_json::Value>> {\n 663|    let mut brain = connect(broker_name)?;\n*664|    brain.net_stream_subscribe(stream_id, floor_seq)?;\n 665|    let mut buf: Vec<u8> = Vec::new();\n 666|    loop {\n 667|        match brain.read_event()? {\n...\n 733|    origin: &str,\n*734|    floor_seq: u64,\n 735|    finished: bool,\n 736|    paths: &DispatchPaths,\n 737|    registry: &RegistryHost,\n...\n 748|    }\n*749|    let line = match first_line(broker_name, stream_id, floor_seq) {\n 750|        Ok(Some(v)) => v,\n 751|        Ok(None) => return WorkerReport::bare(DispatchOutcome::Unknown),\n 752|        // Pre-serve terminal exclusion (Amendment fix 6 rider): a row that\n...\n 888|                    origin,\n*889|                    floor_seq,\n 890|                    remote_session,\n 891|                    serde_json::from_value(line.clone()).ok(),\n 892|                ) {\n...\n 1223|\n*1224|        let attach = json!({\"kind\": \"request\", \"session_id\": 3, \"from_seq\": 0});\n 1225|        assert_eq!(classify_first_line(&attach), StreamFamily::Attach);\n 1226|\n 1227|        // [unit->REQ-INST-6] the rest op's opener disambiguates by shape too.\n...\n 1348|\n*1349|    // [unit->REQ-DISPATCH-FALLBACK-CIRCUIT] fallback narrowing (Amendment\n 1350|    // fix 1): ONLY the old broker's literal `unknown command kind` answer may\n 1351|    // fall back to the ring peek. Transport timeout / EOF / poison — the\n 1352|    // pre-Amendment broad Err(_) classes that manufactured throwaway replay"}],"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":"  489│            let conn_id = s.conn_id;\n *490│            let floor_seq = s.floor_seq;\n  491│            let finished = s.finished;\n  492│            let p = paths.clone();\n  493│            let reg = Arc::clone(&registry);\n     │...\n  499│                let started = Instant::now();\n *500│                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n  501│                pool.fetch_sub(1, Ordering::Relaxed);\n  502│                let outcome = report.outcome;\n  503│                let elapsed_ms = started.elapsed().as_millis();\n     │...\n  619│/// (terminal); `Err` = transient (the claim requeues bounded).\n *620│fn first_line(\n  621│    broker_name: &str,\n  622│    stream_id: u64,\n *623│    floor_seq: u64,\n  624│) -> io::Result<Option<serde_json::Value>> {\n *625│    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n  626│        // Pinned: classify from the durable fact. A pinned line that does not\n  627│        // parse is terminally unclassifiable (same contract as the peek path).\n  628│        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n     │...\n  649│    }\n *650│    peek_first_line(broker_name, stream_id, floor_seq)\n  651│}\n  652│\n  653│/// Peek the stream's first retained NDJSON line on a throwaway brain\n *654│/// connection (the pre-ADR-0038 fallback — subject to ring eviction, kept\n *655│/// only for the older-broker window). Subscribes from `floor_seq` (the oldest\n  656│/// retained chunk) so a rolled ring replays instead of tripping the brain's\n  657│/// gap check.\n *658│fn peek_first_line(\n  659│    broker_name: &str,\n  660│    stream_id: u64,\n *661│    floor_seq: u64,\n  662│) -> io::Result<Option<serde_json::Value>> {\n  663│    let mut brain = connect(broker_name)?;\n *664│    brain.net_stream_subscribe(stream_id, floor_seq)?;\n  665│    let mut buf: Vec<u8> = Vec::new();\n  666│    loop {\n  667│        match brain.read_event()? {\n     │...\n  733│    origin: &str,\n *734│    floor_seq: u64,\n  735│    finished: bool,\n  736│    paths: &DispatchPaths,\n  737│    registry: &RegistryHost,\n     │...\n  748│    }\n *749│    let line = match first_line(broker_name, stream_id, floor_seq) {\n  750│        Ok(Some(v)) => v,\n  751│        Ok(None) => return WorkerReport::bare(DispatchOutcome::Unknown),\n  752│        // Pre-serve terminal exclusion (Amendment fix 6 rider): a row that\n     │...\n  888│                    origin,\n *889│                    floor_seq,\n  890│                    remote_session,\n  891│                    serde_json::from_value(line.clone()).ok(),\n  892│                ) {\n     │...\n 1223│\n*1224│        let attach = json!({\"kind\": \"request\", \"session_id\": 3, \"from_seq\": 0});\n 1225│        assert_eq!(classify_first_line(&attach), StreamFamily::Attach);\n 1226│\n 1227│        // [unit->REQ-INST-6] the rest op's opener disambiguates by shape too.\n     │...\n 1348│\n*1349│    // [unit->REQ-DISPATCH-FALLBACK-CIRCUIT] fallback narrowing (Amendment\n 1350│    // fix 1): ONLY the old broker's literal `unknown command kind` answer may\n 1351│    // fall back to the ring peek. Transport timeout / EOF / poison — the\n 1352│    // pre-Amendment broad Err(_) classes that manufactured throwaway replay"},"isError":false,"timestamp":1784271647342}}
{"type":"message","id":"342a1560","parentId":"9bda883b","timestamp":"2026-07-17T07:00:47.358Z","message":{"role":"toolResult","toolCallId":"call_IrDxlGQ5OWWyT6k5FZsmwHI9|fc_0a061eb498f0e908016a59d31f3f8881969e5e75904db09065","toolName":"read","content":[{"type":"text","text":"    let outcome = match family {\n…\n        StreamFamily::Attach => {\n…\n            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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    WorkerReport {\n…\n    }\n\n[Showing lines 839-963 of 1558. Use :964 to continue]"}],"details":{"truncation":{"content":"            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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    WorkerReport {","truncated":true,"truncatedBy":"lines","totalLines":720,"totalBytes":6527,"outputLines":125,"outputBytes":6527,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    let outcome = match family {\n…\n        StreamFamily::Attach => {\n…\n            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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    WorkerReport {\n…\n    }","startLine":795,"lineNumbers":[795,null,832,null,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,null,967]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":6527,"outputLines":125,"outputBytes":6527,"shownRange":{"start":839,"end":963},"nextOffset":964}}},"isError":false,"timestamp":1784271647357}}
{"type":"message","id":"4ece699e","parentId":"342a1560","timestamp":"2026-07-17T07:00:47.368Z","message":{"role":"toolResult","toolCallId":"call_ar2PhpYSfw6oO33co681QcLl|fc_0a061eb498f0e908016a59d31f3f7881969b9330901f42037d","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## digesthub.rs\n 174|/// would stall every other client.\n*175|pub fn serve_digest_control(name: &str, hub: Arc<DigestHub>) -> io::Result<()> {\n 176|    let listener = LocalSocketTransport::bind(name)?;\n 177|    loop {\n*178|        let conn = listener.accept()?;\n 179|        let hub = Arc::clone(&hub);\n*180|        thread::spawn(move || {\n 181|            let _ = handle_conn(conn, &hub);\n 182|        });\n 183|    }\n## drivehub.rs\n 180|/// Thread-per-connection (mirroring the digest / broker / seed-control channels).\n*181|pub fn serve_drive_control(name: &str, hub: Arc<DriveHub>) -> io::Result<()> {\n 182|    let listener = LocalSocketTransport::bind(name)?;\n 183|    loop {\n*184|        let conn = listener.accept()?;\n 185|        let hub = Arc::clone(&hub);\n*186|        thread::spawn(move || {\n 187|            let _ = handle_conn(conn, &hub);\n 188|        });\n 189|    }\n## tunnelhub.rs\n 272|// [impl->REQ-SHELL-4]\n*273|pub fn serve_tunnel_control(name: &str, hub: Arc<TunnelHub>, broker: Arc<Broker>) -> io::Result<()> {\n 274|    let listener = LocalSocketTransport::bind(name)?;\n 275|    loop {\n*276|        let conn = listener.accept()?;\n 277|        let hub = Arc::clone(&hub);\n 278|        let broker = Arc::clone(&broker);\n*279|        thread::spawn(move || {\n 280|            let _ = handle_conn(conn, &hub, &broker);\n 281|        });\n 282|    }\n## docshost.rs\n 148|// [impl->REQ-DOCS-LOCAL-SERVER]\n*149|fn serve_path(docs_root: &Path, uri_path: &str, head_only: bool) -> Response<Full<Bytes>> {\n 150|    let respond = |status: StatusCode, ctype: &'static str, body: Vec<u8>| {\n 151|        let body = if head_only { Vec::new() } else { body };\n 152|        Response::builder()\n...\n 229|    loop {\n*230|        let Ok((stream, _peer)) = listener.accept().await else {\n 231|            continue;\n 232|        };\n 233|        let io = hyper_util::rt::TokioIo::new(stream);"}],"details":{"scopePath":"crates/spt-daemon/src/digesthub.rs, crates/spt-daemon/src/drivehub.rs, crates/spt-daemon/src/tunnelhub.rs, crates/spt-daemon/src/docshost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":11,"fileCount":4,"files":["crates/spt-daemon/src/digesthub.rs","crates/spt-daemon/src/drivehub.rs","crates/spt-daemon/src/tunnelhub.rs","crates/spt-daemon/src/docshost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/digesthub.rs","count":3},{"path":"crates/spt-daemon/src/drivehub.rs","count":3},{"path":"crates/spt-daemon/src/tunnelhub.rs","count":3},{"path":"crates/spt-daemon/src/docshost.rs","count":2}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## digesthub.rs\n 174│/// would stall every other client.\n*175│pub fn serve_digest_control(name: &str, hub: Arc<DigestHub>) -> io::Result<()> {\n 176│    let listener = LocalSocketTransport::bind(name)?;\n 177│    loop {\n*178│        let conn = listener.accept()?;\n 179│        let hub = Arc::clone(&hub);\n*180│        thread::spawn(move || {\n 181│            let _ = handle_conn(conn, &hub);\n 182│        });\n 183│    }\n## drivehub.rs\n 180│/// Thread-per-connection (mirroring the digest / broker / seed-control channels).\n*181│pub fn serve_drive_control(name: &str, hub: Arc<DriveHub>) -> io::Result<()> {\n 182│    let listener = LocalSocketTransport::bind(name)?;\n 183│    loop {\n*184│        let conn = listener.accept()?;\n 185│        let hub = Arc::clone(&hub);\n*186│        thread::spawn(move || {\n 187│            let _ = handle_conn(conn, &hub);\n 188│        });\n 189│    }\n## tunnelhub.rs\n 272│// [impl->REQ-SHELL-4]\n*273│pub fn serve_tunnel_control(name: &str, hub: Arc<TunnelHub>, broker: Arc<Broker>) -> io::Result<()> {\n 274│    let listener = LocalSocketTransport::bind(name)?;\n 275│    loop {\n*276│        let conn = listener.accept()?;\n 277│        let hub = Arc::clone(&hub);\n 278│        let broker = Arc::clone(&broker);\n*279│        thread::spawn(move || {\n 280│            let _ = handle_conn(conn, &hub, &broker);\n 281│        });\n 282│    }\n## docshost.rs\n 148│// [impl->REQ-DOCS-LOCAL-SERVER]\n*149│fn serve_path(docs_root: &Path, uri_path: &str, head_only: bool) -> Response<Full<Bytes>> {\n 150│    let respond = |status: StatusCode, ctype: &'static str, body: Vec<u8>| {\n 151│        let body = if head_only { Vec::new() } else { body };\n 152│        Response::builder()\n    │...\n 229│    loop {\n*230│        let Ok((stream, _peer)) = listener.accept().await else {\n 231│            continue;\n 232│        };\n 233│        let io = hyper_util::rt::TokioIo::new(stream);"},"isError":false,"timestamp":1784271647368}}
{"type":"message","id":"d19f5964","parentId":"4ece699e","timestamp":"2026-07-17T07:00:47.376Z","message":{"role":"toolResult","toolCallId":"call_XJ8alAv3b7n7xi2sqYGi0Mc2|fc_0a061eb498f0e908016a59d31f3f808196a84af86218495d87","toolName":"grep","content":[{"type":"text","text":"# crates/\n\n## spt-store/src/\n### info.rs\n 99|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*100|    pub driven_by: Option<String>,\n 101|    /// Whether ANY operator — local OR remote — currently drives this endpoint's\n 102|    /// session (#3, REQ-GOSSIP-CONTROLLED-ANY). The BROKER is the single writer,\n*103|    /// stamped alongside `driven_by` on every controller add/clear. DISTINCT from\n*104|    /// `driven_by`, which is `Some` ONLY for a REMOTE controller (a local-only\n*105|    /// controller must NOT latch `driven_by` — KH 7.15 /\n*106|    /// `REQ-HAZARD-DRIVEN-BY-SELFHEAL`): `driven_by` answers \"is a remote node\n*107|    /// driving me\", `controlled` answers \"is ANYONE driving me\", so a\n*108|    /// locally-controlled endpoint still gossips as controlled to remote viewers.\n 109|    /// `default false` so a pre-#3 record parses.\n 110|    #[serde(default)]\n*111|    pub controlled: bool,\n 112|    /// The number of read-only viewers currently attached to this endpoint's\n 113|    /// session under the W2.5 controller/viewer model (REQ-RCVIEW-1). The BROKER\n 114|    /// is the single writer (it owns the viewers map), stamped on every viewer\n*115|    /// add/remove/evict; the picker renders `controlled by <driven_by> (+N\n 116|    /// viewing)`. Absent / `0` ⇒ no viewers (or a pre-W2.5 record). Same\n*117|    /// best-effort/self-heal caveat as `driven_by`. `default` so older records\n 118|    /// still parse.\n 119|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*120|    pub viewer_count: Option<u32>,\n 121|    /// The daemon-owned resting state (D9-2, REQ-INST-3): `\"active\"` /\n 122|    /// `\"dormant\"` / `\"suspended\"` — the explicit instance state machine's\n 123|    /// durable record (`spt_daemon::resting` owns the transitions; this field\n...\n 210|    /// no backpressure (or a pre-P0 record). `default` so every older record parses\n*211|    /// (N-1-safe, additive); same best-effort/self-heal caveat as `viewer_count`.\n 212|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 213|    pub input_backpressure: Option<bool>,\n 214|    /// The CURRENT translation-binary fault surface (F029 C-1,\n...\n 272|            last_active_ms: None,\n*273|            driven_by: None,\n*274|            controlled: false,\n*275|            viewer_count: None,\n 276|            rest_state: None,\n 277|            dormant_since_ms: None,\n 278|            auto_suspend_after_ms: None,\n...\n 377|\n*378|/// Stamp (or clear, with `None`) the `driven_by` remote-drive marker (REQ-REACH-1):\n 379|/// which node's operator is driving this endpoint's session. Serialized via\n 380|/// [`mutate_info`].\n 381|// [impl->REQ-REACH-1]\n*382|pub fn set_driven_by(perch_path: &Path, node: Option<&str>) -> std::io::Result<()> {\n*383|    mutate_info(perch_path, |rec| rec.driven_by = node.map(str::to_string))\n 384|}\n 385|\n*386|/// Stamp the `controlled` any-controller marker (#3, REQ-GOSSIP-CONTROLLED-ANY):\n 387|/// whether ANY operator (local or remote) currently drives this endpoint. The\n*388|/// broker is the single writer, stamped alongside [`set_driven_by`]. Kept SEPARATE\n\n## spt-daemon/src/\n### attach.rs\n 58|/// gate-armed for the endpoint's own pulse loop). Best-effort exactly like\n*59|/// [`mark_driven_by`]: a session served without a perch has no resting\n 60|/// record to move.\n 61|// [impl->REQ-INST-3]\n 62|fn feed_rest(endpoint: &str, event: crate::resting::RestEvent) {\n...\n 71|    /// REQ-RCVIEW-1) — nothing was served. The operator's `rc` renders the\n*72|    /// busy guidance client-side from the endpoint's `driven_by`.\n 73|    Refused,\n 74|    /// The session's child exited; the `Exit` record was sent and the stream\n 75|    /// finished.\n...\n 231|///   viewer / busy / take by intent + origin and replies a `Subscribed`;\n*232|///   driven_by / viewer_count are BROKER-owned (single writer). A VIEWER\n 233|///   attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);\n 234|///   the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).\n 235|// [impl->REQ-RC-CROSS-NODE-ATTACH]\n...\n 347|    // The attached session — captured from the Request so the terminal paths can\n*348|    // explicitly release this worker's role (clearing driven_by / viewer_count\n 349|    // promptly, not only on connection drop).\n 350|    let mut attached_session: Option<u64> = None;\n 351|    // This worker's attach GENERATION (ADR-0038 Amendment fix 6) — set when\n...\n 537|                        // ever reached it; the buffer is discarded). The rc\n*538|                        // renders the busy guidance client-side from driven_by.\n 539|                        wire.net_stream_send(stream_id, &[], None, true)?;\n 540|                        return Ok(AttachServeOutcome::Refused);\n 541|                    }\n...\n 583|                // ORDER MATTERS: feed the resting edge FIRST (it read-modify-writes\n*584|                // info.json, carrying the current driven_by through), THEN release\n*585|                // the role over IPC so the broker's driven_by=None is the LAST\n 586|                // write — otherwise a concurrent resting RMW restores the stale\n 587|                // marker (the clear-race the broker-single-writer model averts).\n 588|                if role == Some(ServeRole::Controller) {\n### brain.rs\n 1673|    /// (REQ-RCVIEW-1) — the explicit detach a `serve_attach` worker sends when\n*1674|    /// the viewport ends so the broker clears `driven_by` / `viewer_count`\n 1675|    /// promptly. Best-effort: a dropped connection clears the role anyway.\n 1676|    pub fn detach_session(&mut self, session_id: u64) -> io::Result<()> {\n 1677|        self.detach_session_gen(session_id, None)\n### broker.rs\n 165|/// output, so `append`/`mark_controller_gone` never runs, and the stalled\n*166|/// controller would otherwise latch `driven_by` forever (reattach refused, `--take`\n 167|/// blocked). The brain aggregates every session + psyche + WAN feed, so its drain\n 168|/// is bursty; 15 s tolerates a normal burst-stall while still bounding the wedge.\n 169|/// A slow-but-DRAINING brain never trips it — the clock only advances while a write\n...\n 570|    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test).\n*571|    /// The broker is the SINGLE writer of `driven_by` + `viewer_count` on this\n 572|    /// perch (REQ-RCVIEW-1, resolves the clear-race); empty ⇒ nowhere to stamp.\n 573|    endpoint: String,\n 574|    /// Last-known PTY size — seeded at spawn, updated on a controller resize.\n...\n 626|/// (REQ-HAZARD-CONTROL-STAMP-CONVERGENCE): does the perch's RECORDED\n*627|/// (`driven_by`, `controlled`, `viewer_count`) differ from the live session TRUTH?\n 628|/// Returns `(control_write_needed, viewer_write_needed)` — the divergence gate that\n 629|/// keeps the per-poll re-assert from writing (fsync) when nothing changed.\n 630|// [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n 631|fn stamp_divergence(\n*632|    rec_driven_by: Option<&str>,\n*633|    rec_controlled: bool,\n 634|    rec_viewers: u32,\n*635|    want_driven_by: Option<&str>,\n*636|    want_controlled: bool,\n 637|    want_viewers: u32,\n 638|) -> (bool, bool) {\n*639|    let control = rec_driven_by != want_driven_by || rec_controlled != want_controlled;\n 640|    let viewer = rec_viewers != want_viewers;\n 641|    (control, viewer)\n 642|}\n...\n 646|/// this closes the STAMP-BEFORE-BIND loss — a picker-created endpoint's spawn stamps\n*647|/// `controlled=true` BEFORE the adapter binds its perch, so `mutate_info` returns\n 648|/// `NotFound` and the edge stamp is swallowed; the adapter's bind then writes\n*649|/// `controlled:false` and no later edge re-stamps, so the endpoint reads uncontrolled\n 650|/// forever while driven. This DIVERGENCE-GATED re-assert (on the `KIND_SESSIONS` poll,\n 651|/// bounded by the reconcile cadence) writes ONLY on a real difference — no fsync storm.\n 652|/// Best-effort: an unbound / corrupt / perch-less endpoint has nowhere to converge yet.\n...\n 655|    endpoint: &str,\n*656|    want_driven_by: Option<&str>,\n*657|    want_controlled: bool,\n 658|    want_viewers: u32,\n 659|) {\n 660|    if endpoint.is_empty() {\n...\n 667|    let (control, viewer) = stamp_divergence(\n*668|        rec.driven_by.as_deref(),\n*669|        rec.controlled,\n*670|        rec.viewer_count.unwrap_or(0),\n*671|        want_driven_by,\n*672|        want_controlled,\n 673|        want_viewers,\n 674|    );\n 675|    if control {\n*676|        let _ = spt_store::info::set_driven_by(&perch, want_driven_by);\n*677|        let _ = spt_store::info::set_controlled(&perch, want_controlled);\n 678|    }\n 679|    if viewer {\n*680|        let _ = spt_store::info::set_viewer_count(&perch, want_viewers);\n 681|    }\n 682|}\n 683|\n### livehost.rs\n 686|        // broker session that owns them. A spt-hosted (controllable Some(true)) live\n*687|        // agent with NO live broker session must carry NEITHER `controlled` NOR\n*688|        // `driven_by` — reaped here REGARDLESS of status so a perch that is ALREADY\n*689|        // OFFLINE yet still reads controlled=true / driven_by=Some (the sticky stamp\n*690|        // that survived clean-exit AND a daemon restart — perri F-b, controlled >20min\n 691|        // + across a bounce) is swept, not only on the online->offline transition\n 692|        // below. `attached_node` derives from these two honest stamps, so clearing\n 693|        // both clears it. RACE-FREE: with no live session there is no controller to\n 694|        // re-stamp concurrently (the broker single-writer invariant is uncontended —\n*695|        // the same argument as the Gap-B driven_by self-heal). A harness-hosted relay\n 696|        // (controllable Some(false)) never carries these stamps (no broker PTY to\n 697|        // drive), so the controllable gate is exact. This is also the BOOT-TIME sweep\n 698|        // (path iv): the caller runs the reconcile from boot tick 1.\n...\n 701|            && info.controllable == Some(true)\n*702|            && (info.controlled || info.driven_by.is_some())\n 703|        {\n*704|            let _ = spt_store::info::set_controlled(&perch, false);\n*705|            let _ = spt_store::info::set_driven_by(&perch, None);\n 706|            eprintln!(\n*707|                \"CONTROL_REAP_NO_SESSION:{id}: cleared stale controlled/driven_by (no broker session)\"\n 708|            );\n 709|        }\n 710|\n...\n 727|            BrainLifecycle::mark_offline(&perch);\n*728|            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\n*729|            // a stale `driven_by = Some` — its broker session (the single writer)\n 730|            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\n 731|            // it. The B3 control-reap above already cleared it for a controllable\n 732|            // Some(true) perch; this belt covers an unbound skeleton (controllable\n...\n 735|            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\n*736|            if info.driven_by.is_some() {\n*737|                let _ = spt_store::info::set_driven_by(&perch, None);\n*738|                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\n 739|            }\n 740|            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\n 741|            offlined.push(id);\n...\n 1129|    // ALSO covers W5 Gap B (REQ-HAZARD-DRIVEN-BY-SELFHEAL): each spt-hosted perch is\n*1130|    // pre-stamped `driven_by = Some(\"node\")` (the lost-detach latch). After the\n*1131|    // reconcile the sessionless `dead` perch must have driven_by CLEARED to None\n 1132|    // (an OFFLINE endpoint must never render phantom CONTROLLED), while the\n*1133|    // session-backed `alive` perch and the exempt `relay` keep driven_by UNTOUCHED\n 1134|    // (the reconcile must not touch live or exempt perches — the live-session clear\n 1135|    // is the deferred broker-side path, not this reconcile read).\n 1136|    #[test]\n...\n 1148|            };\n*1149|            // Pre-stamp the driven_by + controlled latch on every spt-hosted live_agent\n 1150|            // perch so the Gap-B clear, the B3 control-reap, and the must-not-touch\n 1151|            // invariants are all observable.\n 1152|            let latch = |id: &str| {\n 1153|                let perch = perch::resolve_perch_path(id, ParentHint::Infer);\n*1154|                spt_store::info::set_driven_by(&perch, Some(node)).unwrap();\n*1155|                spt_store::info::set_controlled(&perch, true).unwrap();\n 1156|            };\n 1157|            seed(\"alive\", \"live_agent\", Some(true)); // has a session → stays\n 1158|            seed(\"dead\", \"live_agent\", Some(true)); // no session → offlined\n### msg.rs\n 31|/// (W2.5, REQ-RCVIEW-1) — the explicit detach a `serve_attach` worker sends when\n*32|/// the operator's viewport ends, so `driven_by` / `viewer_count` clear promptly\n 33|/// even if the serving brain connection lives on (a connection drop also clears\n 34|/// the role, so this is idempotent belt-and-braces).\n 35|pub const KIND_UNSUBSCRIBE: &str = \"unsubscribe\";\n...\n 56|/// operator (busy). A normal reply, not a new wire frame (the busy refusal is\n*57|/// rendered client-side by `rc` from the endpoint's `driven_by`).\n 58|pub const KIND_SUBSCRIBED: &str = \"subscribed\";\n 59|/// Broker→brain: the current PTY size of a session, pushed to a VIEWER on\n 60|/// attach and to every viewer on a controller resize (REQ-RCVIEW-1). The\n...\n 877|    /// `by = None`. So `controller_by == None` does NOT by itself mean \"no\n*878|    /// controller\" — it cannot be used as a standalone `driven_by` clear trigger\n 879|    /// without false-clearing a live, locally-driven session.\n 880|    ///\n 881|    /// Currently consumed by the W5 self-heal CHARACTERIZATION (the real-broker\n...\n 884|    /// controller on an idle session\" latch, where this field STAYS `Some(origin)`\n*885|    /// (the broker still thinks it is controlled) and so the brain reconcile cannot\n 886|    /// detect it. The shipped W5 reconcile self-heal (Gap B, no session) needs no\n 887|    /// controller signal at all.\n 888|    ///\n### notif.rs\n 711|                    recent_projects: Vec::new(),\n*712|                    controlled: false,\n 713|                },\n 714|            );\n 715|            let mut regs = std::collections::BTreeMap::new();\n### presence.rs\n 232|            recent_projects: Vec::new(),\n*233|            controlled: false,\n 234|        }\n 235|    }\n 236|\n### reconcile.rs\n 64|            recent_projects: Vec::new(),\n*65|            controlled: false,\n 66|        }\n 67|    }\n 68|\n### registryhost.rs\n 451|            // the SAME local facts the picker's `local_rows` reads off info.json,\n*452|            // now GOSSIPED so a remote viewer renders bound/controlled/harness-only\n 453|            // identically instead of reducing every remote row to plain green.\n 454|            //  - bound: a bound live broker session (`is_perch_alive` is bound-gated,\n 455|            //    so an UNBOUND perch reads false — exactly the fill duality the\n 456|            //    picker keys on).\n*457|            //  - controller_node: the broker-owned `driven_by` (the driving node),\n*458|            //    if any → the remote blue \"controlled\" + `controlled by <node>` pin.\n 459|            //  - harness_only: a LiveAgent with no broker PTY seat — mirrors the\n 460|            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\n 461|            //    None self-corrects on the next bind, so it advertises harness-only\n...\n 465|            // #3 (REQ-GOSSIP-CONTROLLED-ANY): gossip ANY controller, not just a\n*466|            // remote one. `driven_by` is remote-only (KH 7.15); a LOCAL controller\n*467|            // sets the separate `controlled` flag instead, and its driving node IS\n 468|            // this node — so advertise `self.node_hex`. A remote controller keeps\n 469|            // its own origin. This is what lets a remote viewer see a\n*470|            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\n 471|            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\n 472|            let controller_node = gossip_controller_node(\n*473|                info.as_ref().and_then(|i| i.driven_by.as_deref()),\n*474|                info.as_ref().is_some_and(|i| i.controlled),\n 475|                &self.node_hex,\n 476|            );\n 477|            let harness_only = info.as_ref().is_some_and(|i| {\n...\n 485|            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n*486|            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n*487|            //    a local controller has driven_by=None so that WHO datum undercounts it).\n 488|            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 489|            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n*490|            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n 491|            let recent_projects = recent_projects_for(&perch_path, owlery);\n 492|            let last_active_ms = info.and_then(|i| i.last_active_ms);\n 493|            for sub in &subnets.subnets {\n...\n 515|                    // The unified subnet-display parity datums — gossiped so a\n*516|                    // remote picker renders bound/controlled/harness-only with the\n 517|                    // same fidelity as the home node (REQ-SUBNET-DISPLAY-PARITY).\n 518|                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n 519|                    bound,\n...\n 525|                    recent_projects: recent_projects.clone(),\n*526|                    controlled,\n 527|                };\n 528|                let reg = regs.entry(sub.name.clone()).or_default();\n 529|                match advertise_if_visible(\n...\n 595|                    recent_projects: Vec::new(),\n*596|                    controlled: false,\n 597|                };\n 598|                reg.merge_instance(&id, instance.clone());\n 599|                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n...\n 863|/// The controlling node to gossip on an Instance (#3, REQ-GOSSIP-CONTROLLED-ANY).\n*864|/// A REMOTE controller keeps its own `driven_by` origin. A LOCAL controller (the\n*865|/// separate `controlled` flag, with `driven_by` = None per KH 7.15) is driven from\n 866|/// THIS node, so it gossips `self_node`. An undriven endpoint gossips `None`. Pure\n 867|/// over its inputs so the any-controller mapping is unit-tested.\n 868|// [impl->REQ-GOSSIP-CONTROLLED-ANY]\n 869|fn gossip_controller_node(\n*870|    driven_by: Option<&str>,\n*871|    controlled: bool,\n 872|    self_node: &str,\n 873|) -> Option<String> {\n*874|    match driven_by {\n 875|        Some(remote) => Some(remote.to_string()),\n*876|        None if controlled => Some(self_node.to_string()),\n 877|        None => None,\n 878|    }\n 879|}\n### shelldisc.rs\n 336|            recent_projects: Vec::new(),\n*337|            controlled: false,\n 338|        };\n 339|        let mut reg = SubnetRegistry::new();\n 340|        // Two endpoints on the same remote node carry the same node-level\n### wan.rs\n 431|            recent_projects: Vec::new(),\n*432|            controlled: false,\n 433|        };\n 434|        let proven = \"aa11node\";\n 435|"}],"details":{"scopePath":"crates/spt-store/src, crates/spt-daemon/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":97,"fileCount":12,"files":["crates/spt-store/src/info.rs","crates/spt-daemon/src/attach.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/msg.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"],"fileMatches":[{"path":"crates/spt-store/src/info.rs","count":20},{"path":"crates/spt-daemon/src/attach.rs","count":7},{"path":"crates/spt-daemon/src/brain.rs","count":1},{"path":"crates/spt-daemon/src/broker.rs","count":20},{"path":"crates/spt-daemon/src/livehost.rs","count":20},{"path":"crates/spt-daemon/src/msg.rs","count":4},{"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":20},{"path":"crates/spt-daemon/src/shelldisc.rs","count":1},{"path":"crates/spt-daemon/src/wan.rs","count":1}],"truncated":true,"perFileLimitReached":20,"displayContent":"# crates/\n\n## spt-store/src/\n### info.rs\n  99│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*100│    pub driven_by: Option<String>,\n 101│    /// Whether ANY operator — local OR remote — currently drives this endpoint's\n 102│    /// session (#3, REQ-GOSSIP-CONTROLLED-ANY). The BROKER is the single writer,\n*103│    /// stamped alongside `driven_by` on every controller add/clear. DISTINCT from\n*104│    /// `driven_by`, which is `Some` ONLY for a REMOTE controller (a local-only\n*105│    /// controller must NOT latch `driven_by` — KH 7.15 /\n*106│    /// `REQ-HAZARD-DRIVEN-BY-SELFHEAL`): `driven_by` answers \"is a remote node\n*107│    /// driving me\", `controlled` answers \"is ANYONE driving me\", so a\n*108│    /// locally-controlled endpoint still gossips as controlled to remote viewers.\n 109│    /// `default false` so a pre-#3 record parses.\n 110│    #[serde(default)]\n*111│    pub controlled: bool,\n 112│    /// The number of read-only viewers currently attached to this endpoint's\n 113│    /// session under the W2.5 controller/viewer model (REQ-RCVIEW-1). The BROKER\n 114│    /// is the single writer (it owns the viewers map), stamped on every viewer\n*115│    /// add/remove/evict; the picker renders `controlled by <driven_by> (+N\n 116│    /// viewing)`. Absent / `0` ⇒ no viewers (or a pre-W2.5 record). Same\n*117│    /// best-effort/self-heal caveat as `driven_by`. `default` so older records\n 118│    /// still parse.\n 119│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*120│    pub viewer_count: Option<u32>,\n 121│    /// The daemon-owned resting state (D9-2, REQ-INST-3): `\"active\"` /\n 122│    /// `\"dormant\"` / `\"suspended\"` — the explicit instance state machine's\n 123│    /// durable record (`spt_daemon::resting` owns the transitions; this field\n    │...\n 210│    /// no backpressure (or a pre-P0 record). `default` so every older record parses\n*211│    /// (N-1-safe, additive); same best-effort/self-heal caveat as `viewer_count`.\n 212│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 213│    pub input_backpressure: Option<bool>,\n 214│    /// The CURRENT translation-binary fault surface (F029 C-1,\n    │...\n 272│            last_active_ms: None,\n*273│            driven_by: None,\n*274│            controlled: false,\n*275│            viewer_count: None,\n 276│            rest_state: None,\n 277│            dormant_since_ms: None,\n 278│            auto_suspend_after_ms: None,\n    │...\n 377│\n*378│/// Stamp (or clear, with `None`) the `driven_by` remote-drive marker (REQ-REACH-1):\n 379│/// which node's operator is driving this endpoint's session. Serialized via\n 380│/// [`mutate_info`].\n 381│// [impl->REQ-REACH-1]\n*382│pub fn set_driven_by(perch_path: &Path, node: Option<&str>) -> std::io::Result<()> {\n*383│    mutate_info(perch_path, |rec| rec.driven_by = node.map(str::to_string))\n 384│}\n 385│\n*386│/// Stamp the `controlled` any-controller marker (#3, REQ-GOSSIP-CONTROLLED-ANY):\n 387│/// whether ANY operator (local or remote) currently drives this endpoint. The\n*388│/// broker is the single writer, stamped alongside [`set_driven_by`]. Kept SEPARATE\n\n## spt-daemon/src/\n### attach.rs\n  58│/// gate-armed for the endpoint's own pulse loop). Best-effort exactly like\n *59│/// [`mark_driven_by`]: a session served without a perch has no resting\n  60│/// record to move.\n  61│// [impl->REQ-INST-3]\n  62│fn feed_rest(endpoint: &str, event: crate::resting::RestEvent) {\n    │...\n  71│    /// REQ-RCVIEW-1) — nothing was served. The operator's `rc` renders the\n *72│    /// busy guidance client-side from the endpoint's `driven_by`.\n  73│    Refused,\n  74│    /// The session's child exited; the `Exit` record was sent and the stream\n  75│    /// finished.\n    │...\n 231│///   viewer / busy / take by intent + origin and replies a `Subscribed`;\n*232│///   driven_by / viewer_count are BROKER-owned (single writer). A VIEWER\n 233│///   attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);\n 234│///   the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).\n 235│// [impl->REQ-RC-CROSS-NODE-ATTACH]\n    │...\n 347│    // The attached session — captured from the Request so the terminal paths can\n*348│    // explicitly release this worker's role (clearing driven_by / viewer_count\n 349│    // promptly, not only on connection drop).\n 350│    let mut attached_session: Option<u64> = None;\n 351│    // This worker's attach GENERATION (ADR-0038 Amendment fix 6) — set when\n    │...\n 537│                        // ever reached it; the buffer is discarded). The rc\n*538│                        // renders the busy guidance client-side from driven_by.\n 539│                        wire.net_stream_send(stream_id, &[], None, true)?;\n 540│                        return Ok(AttachServeOutcome::Refused);\n 541│                    }\n    │...\n 583│                // ORDER MATTERS: feed the resting edge FIRST (it read-modify-writes\n*584│                // info.json, carrying the current driven_by through), THEN release\n*585│                // the role over IPC so the broker's driven_by=None is the LAST\n 586│                // write — otherwise a concurrent resting RMW restores the stale\n 587│                // marker (the clear-race the broker-single-writer model averts).\n 588│                if role == Some(ServeRole::Controller) {\n### brain.rs\n 1673│    /// (REQ-RCVIEW-1) — the explicit detach a `serve_attach` worker sends when\n*1674│    /// the viewport ends so the broker clears `driven_by` / `viewer_count`\n 1675│    /// promptly. Best-effort: a dropped connection clears the role anyway.\n 1676│    pub fn detach_session(&mut self, session_id: u64) -> io::Result<()> {\n 1677│        self.detach_session_gen(session_id, None)\n### broker.rs\n 165│/// output, so `append`/`mark_controller_gone` never runs, and the stalled\n*166│/// controller would otherwise latch `driven_by` forever (reattach refused, `--take`\n 167│/// blocked). The brain aggregates every session + psyche + WAN feed, so its drain\n 168│/// is bursty; 15 s tolerates a normal burst-stall while still bounding the wedge.\n 169│/// A slow-but-DRAINING brain never trips it — the clock only advances while a write\n    │...\n 570│    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test).\n*571│    /// The broker is the SINGLE writer of `driven_by` + `viewer_count` on this\n 572│    /// perch (REQ-RCVIEW-1, resolves the clear-race); empty ⇒ nowhere to stamp.\n 573│    endpoint: String,\n 574│    /// Last-known PTY size — seeded at spawn, updated on a controller resize.\n    │...\n 626│/// (REQ-HAZARD-CONTROL-STAMP-CONVERGENCE): does the perch's RECORDED\n*627│/// (`driven_by`, `controlled`, `viewer_count`) differ from the live session TRUTH?\n 628│/// Returns `(control_write_needed, viewer_write_needed)` — the divergence gate that\n 629│/// keeps the per-poll re-assert from writing (fsync) when nothing changed.\n 630│// [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n 631│fn stamp_divergence(\n*632│    rec_driven_by: Option<&str>,\n*633│    rec_controlled: bool,\n 634│    rec_viewers: u32,\n*635│    want_driven_by: Option<&str>,\n*636│    want_controlled: bool,\n 637│    want_viewers: u32,\n 638│) -> (bool, bool) {\n*639│    let control = rec_driven_by != want_driven_by || rec_controlled != want_controlled;\n 640│    let viewer = rec_viewers != want_viewers;\n 641│    (control, viewer)\n 642│}\n    │...\n 646│/// this closes the STAMP-BEFORE-BIND loss — a picker-created endpoint's spawn stamps\n*647│/// `controlled=true` BEFORE the adapter binds its perch, so `mutate_info` returns\n 648│/// `NotFound` and the edge stamp is swallowed; the adapter's bind then writes\n*649│/// `controlled:false` and no later edge re-stamps, so the endpoint reads uncontrolled\n 650│/// forever while driven. This DIVERGENCE-GATED re-assert (on the `KIND_SESSIONS` poll,\n 651│/// bounded by the reconcile cadence) writes ONLY on a real difference — no fsync storm.\n 652│/// Best-effort: an unbound / corrupt / perch-less endpoint has nowhere to converge yet.\n    │...\n 655│    endpoint: &str,\n*656│    want_driven_by: Option<&str>,\n*657│    want_controlled: bool,\n 658│    want_viewers: u32,\n 659│) {\n 660│    if endpoint.is_empty() {\n    │...\n 667│    let (control, viewer) = stamp_divergence(\n*668│        rec.driven_by.as_deref(),\n*669│        rec.controlled,\n*670│        rec.viewer_count.unwrap_or(0),\n*671│        want_driven_by,\n*672│        want_controlled,\n 673│        want_viewers,\n 674│    );\n 675│    if control {\n*676│        let _ = spt_store::info::set_driven_by(&perch, want_driven_by);\n*677│        let _ = spt_store::info::set_controlled(&perch, want_controlled);\n 678│    }\n 679│    if viewer {\n*680│        let _ = spt_store::info::set_viewer_count(&perch, want_viewers);\n 681│    }\n 682│}\n 683│\n### livehost.rs\n  686│        // broker session that owns them. A spt-hosted (controllable Some(true)) live\n *687│        // agent with NO live broker session must carry NEITHER `controlled` NOR\n *688│        // `driven_by` — reaped here REGARDLESS of status so a perch that is ALREADY\n *689│        // OFFLINE yet still reads controlled=true / driven_by=Some (the sticky stamp\n *690│        // that survived clean-exit AND a daemon restart — perri F-b, controlled >20min\n  691│        // + across a bounce) is swept, not only on the online->offline transition\n  692│        // below. `attached_node` derives from these two honest stamps, so clearing\n  693│        // both clears it. RACE-FREE: with no live session there is no controller to\n  694│        // re-stamp concurrently (the broker single-writer invariant is uncontended —\n *695│        // the same argument as the Gap-B driven_by self-heal). A harness-hosted relay\n  696│        // (controllable Some(false)) never carries these stamps (no broker PTY to\n  697│        // drive), so the controllable gate is exact. This is also the BOOT-TIME sweep\n  698│        // (path iv): the caller runs the reconcile from boot tick 1.\n     │...\n  701│            && info.controllable == Some(true)\n *702│            && (info.controlled || info.driven_by.is_some())\n  703│        {\n *704│            let _ = spt_store::info::set_controlled(&perch, false);\n *705│            let _ = spt_store::info::set_driven_by(&perch, None);\n  706│            eprintln!(\n *707│                \"CONTROL_REAP_NO_SESSION:{id}: cleared stale controlled/driven_by (no broker session)\"\n  708│            );\n  709│        }\n  710│\n     │...\n  727│            BrainLifecycle::mark_offline(&perch);\n *728│            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\n *729│            // a stale `driven_by = Some` — its broker session (the single writer)\n  730│            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\n  731│            // it. The B3 control-reap above already cleared it for a controllable\n  732│            // Some(true) perch; this belt covers an unbound skeleton (controllable\n     │...\n  735│            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\n *736│            if info.driven_by.is_some() {\n *737│                let _ = spt_store::info::set_driven_by(&perch, None);\n *738│                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\n  739│            }\n  740│            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\n  741│            offlined.push(id);\n     │...\n 1129│    // ALSO covers W5 Gap B (REQ-HAZARD-DRIVEN-BY-SELFHEAL): each spt-hosted perch is\n*1130│    // pre-stamped `driven_by = Some(\"node\")` (the lost-detach latch). After the\n*1131│    // reconcile the sessionless `dead` perch must have driven_by CLEARED to None\n 1132│    // (an OFFLINE endpoint must never render phantom CONTROLLED), while the\n*1133│    // session-backed `alive` perch and the exempt `relay` keep driven_by UNTOUCHED\n 1134│    // (the reconcile must not touch live or exempt perches — the live-session clear\n 1135│    // is the deferred broker-side path, not this reconcile read).\n 1136│    #[test]\n     │...\n 1148│            };\n*1149│            // Pre-stamp the driven_by + controlled latch on every spt-hosted live_agent\n 1150│            // perch so the Gap-B clear, the B3 control-reap, and the must-not-touch\n 1151│            // invariants are all observable.\n 1152│            let latch = |id: &str| {\n 1153│                let perch = perch::resolve_perch_path(id, ParentHint::Infer);\n*1154│                spt_store::info::set_driven_by(&perch, Some(node)).unwrap();\n*1155│                spt_store::info::set_controlled(&perch, true).unwrap();\n 1156│            };\n 1157│            seed(\"alive\", \"live_agent\", Some(true)); // has a session → stays\n 1158│            seed(\"dead\", \"live_agent\", Some(true)); // no session → offlined\n### msg.rs\n  31│/// (W2.5, REQ-RCVIEW-1) — the explicit detach a `serve_attach` worker sends when\n *32│/// the operator's viewport ends, so `driven_by` / `viewer_count` clear promptly\n  33│/// even if the serving brain connection lives on (a connection drop also clears\n  34│/// the role, so this is idempotent belt-and-braces).\n  35│pub const KIND_UNSUBSCRIBE: &str = \"unsubscribe\";\n    │...\n  56│/// operator (busy). A normal reply, not a new wire frame (the busy refusal is\n *57│/// rendered client-side by `rc` from the endpoint's `driven_by`).\n  58│pub const KIND_SUBSCRIBED: &str = \"subscribed\";\n  59│/// Broker→brain: the current PTY size of a session, pushed to a VIEWER on\n  60│/// attach and to every viewer on a controller resize (REQ-RCVIEW-1). The\n    │...\n 877│    /// `by = None`. So `controller_by == None` does NOT by itself mean \"no\n*878│    /// controller\" — it cannot be used as a standalone `driven_by` clear trigger\n 879│    /// without false-clearing a live, locally-driven session.\n 880│    ///\n 881│    /// Currently consumed by the W5 self-heal CHARACTERIZATION (the real-broker\n    │...\n 884│    /// controller on an idle session\" latch, where this field STAYS `Some(origin)`\n*885│    /// (the broker still thinks it is controlled) and so the brain reconcile cannot\n 886│    /// detect it. The shipped W5 reconcile self-heal (Gap B, no session) needs no\n 887│    /// controller signal at all.\n 888│    ///\n### notif.rs\n 711│                    recent_projects: Vec::new(),\n*712│                    controlled: false,\n 713│                },\n 714│            );\n 715│            let mut regs = std::collections::BTreeMap::new();\n### presence.rs\n 232│            recent_projects: Vec::new(),\n*233│            controlled: false,\n 234│        }\n 235│    }\n 236│\n### reconcile.rs\n 64│            recent_projects: Vec::new(),\n*65│            controlled: false,\n 66│        }\n 67│    }\n 68│\n### registryhost.rs\n 451│            // the SAME local facts the picker's `local_rows` reads off info.json,\n*452│            // now GOSSIPED so a remote viewer renders bound/controlled/harness-only\n 453│            // identically instead of reducing every remote row to plain green.\n 454│            //  - bound: a bound live broker session (`is_perch_alive` is bound-gated,\n 455│            //    so an UNBOUND perch reads false — exactly the fill duality the\n 456│            //    picker keys on).\n*457│            //  - controller_node: the broker-owned `driven_by` (the driving node),\n*458│            //    if any → the remote blue \"controlled\" + `controlled by <node>` pin.\n 459│            //  - harness_only: a LiveAgent with no broker PTY seat — mirrors the\n 460│            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\n 461│            //    None self-corrects on the next bind, so it advertises harness-only\n    │...\n 465│            // #3 (REQ-GOSSIP-CONTROLLED-ANY): gossip ANY controller, not just a\n*466│            // remote one. `driven_by` is remote-only (KH 7.15); a LOCAL controller\n*467│            // sets the separate `controlled` flag instead, and its driving node IS\n 468│            // this node — so advertise `self.node_hex`. A remote controller keeps\n 469│            // its own origin. This is what lets a remote viewer see a\n*470│            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\n 471│            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\n 472│            let controller_node = gossip_controller_node(\n*473│                info.as_ref().and_then(|i| i.driven_by.as_deref()),\n*474│                info.as_ref().is_some_and(|i| i.controlled),\n 475│                &self.node_hex,\n 476│            );\n 477│            let harness_only = info.as_ref().is_some_and(|i| {\n    │...\n 485│            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n*486│            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n*487│            //    a local controller has driven_by=None so that WHO datum undercounts it).\n 488│            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 489│            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n*490│            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n 491│            let recent_projects = recent_projects_for(&perch_path, owlery);\n 492│            let last_active_ms = info.and_then(|i| i.last_active_ms);\n 493│            for sub in &subnets.subnets {\n    │...\n 515│                    // The unified subnet-display parity datums — gossiped so a\n*516│                    // remote picker renders bound/controlled/harness-only with the\n 517│                    // same fidelity as the home node (REQ-SUBNET-DISPLAY-PARITY).\n 518│                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n 519│                    bound,\n    │...\n 525│                    recent_projects: recent_projects.clone(),\n*526│                    controlled,\n 527│                };\n 528│                let reg = regs.entry(sub.name.clone()).or_default();\n 529│                match advertise_if_visible(\n    │...\n 595│                    recent_projects: Vec::new(),\n*596│                    controlled: false,\n 597│                };\n 598│                reg.merge_instance(&id, instance.clone());\n 599│                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n    │...\n 863│/// The controlling node to gossip on an Instance (#3, REQ-GOSSIP-CONTROLLED-ANY).\n*864│/// A REMOTE controller keeps its own `driven_by` origin. A LOCAL controller (the\n*865│/// separate `controlled` flag, with `driven_by` = None per KH 7.15) is driven from\n 866│/// THIS node, so it gossips `self_node`. An undriven endpoint gossips `None`. Pure\n 867│/// over its inputs so the any-controller mapping is unit-tested.\n 868│// [impl->REQ-GOSSIP-CONTROLLED-ANY]\n 869│fn gossip_controller_node(\n*870│    driven_by: Option<&str>,\n*871│    controlled: bool,\n 872│    self_node: &str,\n 873│) -> Option<String> {\n*874│    match driven_by {\n 875│        Some(remote) => Some(remote.to_string()),\n*876│        None if controlled => Some(self_node.to_string()),\n 877│        None => None,\n 878│    }\n 879│}\n### shelldisc.rs\n 336│            recent_projects: Vec::new(),\n*337│            controlled: false,\n 338│        };\n 339│        let mut reg = SubnetRegistry::new();\n 340│        // Two endpoints on the same remote node carry the same node-level\n### wan.rs\n 431│            recent_projects: Vec::new(),\n*432│            controlled: false,\n 433│        };\n 434│        let proven = \"aa11node\";\n 435│"},"isError":false,"timestamp":1784271647376}}
{"type":"message","id":"239d16cb","parentId":"d19f5964","timestamp":"2026-07-17T07:00:47.383Z","message":{"role":"toolResult","toolCallId":"call_nkpg4zRw3B0QZxlQkVLiCSTM|fc_0a061eb498f0e908016a59d31f3f4881969f6c464ad899cfe3","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## brain.rs\n 75|/// **Test-only continuity (restoration D4-3, ADR-0018 Q6).** This brain→brain\n*76|/// frame is **retired from the production path**: a brain the broker's supervisor\n 77|/// respawns reconstructs continuity by querying the broker\n 78|/// ([`Brain::resume_sessions`] over the broker's cursor-of-record), never this\n 79|/// message. `BrainState` / [`Brain::handoff`] / [`Brain::snapshot`] stay `pub`\n...\n 283|    /// continuity state a cold-started brain rebuilds from the broker via\n*284|    /// [`Brain::resume_sessions`], replacing the retired single-session\n 285|    /// `BrainState` handoff. A session present here is in **resume mode** — its\n 286|    /// `KIND_OUTPUT` dedup is **dedup-below + snap-above, NO reject-gap** (seeded\n 287|    /// at the broker's `resume_seq`): drop `seq < cursor` (the at-least-once\n...\n 1009|    /// from the broker's per-session delivered cursor (`resume_seq`). This is the\n*1010|    /// production replacement for the retired single-session `BrainState` handoff\n 1011|    /// frame — a brain the supervisor respawns (crash *or* update) reconstructs\n 1012|    /// all session continuity by querying the persistent side, never a brain→brain\n 1013|    /// message. Returns the ids re-attached (empty when the broker hosts none —\n...\n 1450|    /// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker\n*1451|    /// answers `error` (KH-2.3 N-1 window — retirement then waits for the\n 1452|    /// broker to cycle onto the new binary).\n 1453|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1454|    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n 1455|        self.send(\n 1456|            KIND_NET_STREAM_RETIRE,\n 1457|            serde_json::to_value(NetStreamRetireReq { stream_id })\n## brainproc.rs\n 67|/// broker *observes* every respawn, so it alone is authoritative (strictly more\n*68|/// reliable than a brain→brain frame, which retires in D4).\n 69|///\n 70|/// Parsing is **lenient** (KH-2.3 forward-compat): an unrecognized value — a\n 71|/// reason a *future* broker adds that this brain predates — defaults to `Cold`,\n...\n 169|    // generation is broker-owned custody of the KH-2.4 counter (no longer the\n*170|    // brain→brain BrainState.generation, which retires in D4), and the reason is\n 171|    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\n 172|    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\n 173|    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\n...\n 182|    // continuity from the broker — re-attach EVERY hosted session in resume mode\n*183|    // from its delivered cursor, the production replacement for the retired\n 184|    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\n 185|    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\n 186|    // so this is a no-op now and forward-correct when daemon-hosted sessions land\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## broker.rs\n 1195|            // whose viewport died raw, no FIN — the shape finished-row\n*1196|            // retirement cannot see) carries an OLDER generation than the\n 1197|            // live replacement controller and is REFUSED busy: lifecycle is\n 1198|            // still the discriminator, never origin identity. `0` on either\n 1199|            // side (local / N-1) keeps the legacy re-take.\n...\n 1449|        // Bounded, cancelable conn write (round-4): a viewer that stops\n*1450|        // reading poisons + retires ITS conn at the deadline instead of\n 1451|        // parking this thread in the OS write forever.\n 1452|        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 1453|        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n...\n 1477|/// Round-4 observability bridge: a controller writer whose bounded conn write\n*1478|/// was DEADLINE-retired (`TimedOut` — the conn watchdog aborted a wedged\n 1479|/// write, or a gate-wait behind one exhausted the bound) IS the\n 1480|/// brain-subscriber stall-evict fact the W2 tally counts. Pre-round-4 that\n 1481|/// wedge aged until a logical sampler (`stall_evict_controller`) observed it;\n...\n 1486|// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n*1487|fn note_controller_write_retired(sid: u64, conn: u64, e: &io::Error) {\n 1488|    if e.kind() != io::ErrorKind::TimedOut {\n 1489|        return;\n 1490|    }\n...\n 1493|        \"BRAIN_SUBSCRIBER_STALL_EVICT:{sid} conn={conn} {} — controller conn write \\\n*1494|         exceeded its bound; physical conn poisoned + retired (writer released, EOF \\\n 1495|         cleanup follows) [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n 1496|        crate::conn::log_stamp()\n 1497|    );\n...\n 1587|        // Round-4: the write itself is bounded + cancelable — a non-draining\n*1588|        // consumer poisons + retires the physical conn at the deadline instead\n 1589|        // of wedging this thread in the OS write forever.\n 1590|        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 1591|        mark_blocked(true);\n...\n 1606|            Err(e) => {\n*1607|                note_controller_write_retired(sid, send.id(), &e);\n 1608|                send.lifecycle_event(\n 1609|                    \"writer-exit\",\n 1610|                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n...\n 1635|            Err(e) => {\n*1636|                note_controller_write_retired(sid, send.id(), &e);\n 1637|                // Bounded writer-exit record (F-039 leg d).\n 1638|                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 1639|                send.lifecycle_event(\n...\n 2599|    /// REQ-SPAWN-COLLISION-GUARD-LIVE-DUP). The broker is the sole spawner post-W3 (the\n*2600|    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n 2601|    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n 2602|    /// perch-record claim (that would add another info.json writer, the exact\n 2603|    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n...\n 3039|        // primitive from birth — every write on this physical connection is\n*3040|        // deadline-bounded, and a wedge poisons + retires the conn.\n 3041|        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 3042|        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n 3043|        // Base attribution fact (F-039 leg b): broker clients are brains; role\n...\n 3146|                KIND_NET_STREAM_RETIRE => {\n*3147|                    if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {\n 3148|                        send_error(&send, &msg);\n 3149|                    }\n 3150|                }\n...\n 3583|    /// written twice), and either outcome — fresh apply or dedup — is acked back\n*3584|    /// with an [`crate::msg::KIND_APPLIED`] frame so the brain can retire the\n 3585|    /// effect (B5 / KNOWN-HAZARDS 7.2). Without an `op_id` it is the legacy\n 3586|    /// direct write (no dedup, no ack).\n 3587|    // [impl->REQ-HAZARD-RESTART-IDEMPOTENT]\n...\n 4383|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*4384|    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n 4385|        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n*4386|            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4387|        let host = self.net.get().ok_or(\"net disabled\")?;\n*4388|        let removed = host.retire_stream(req.stream_id);\n 4389|        let frame = Envelope::new(\n 4390|            KIND_NET_STREAM_RETIRED,\n 4391|            serde_json::to_value(NetStreamRetired {\n...\n 5709|    /// stale Request — an UNFINISHED backlog row whose viewport died raw, the\n*5710|    /// shape finished-row retirement cannot see — carries an OLDER generation\n 5711|    /// than the live replacement controller and must be REFUSED busy, never\n 5712|    /// silently steal the slot. `0` on either side keeps the N-1/local legacy\n 5713|    /// re-take (a legacy peer must not be locked out).\n## config.rs\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## conn.rs\n 37|//!\n*38|//! ## Poison / retire invariant (both OSes)\n 39|//!\n 40|//! On deadline, write failure, or cancellation: (1) the WHOLE physical\n 41|//! connection is poisoned, idempotently — a length-prefixed frame may have\n...\n 45|//! completion (`write_frame` returns only after the completion APC — the\n*46|//! synchronous return IS the completion handshake); (4) the retired half is\n 47|//! parked in a graveyard slot — never dropped while the watchdog might still\n 48|//! touch the raw handle (drop = `CloseHandle`, and a recycled handle value\n 49|//! must never see a late `CancelIoEx`), and never re-gated; (5) on Windows the\n...\n 58|//! (recorded mid-frame corruption risk). Unix keeps its existing semantics for\n*59|//! healthy connections; only the poison/retire path is new.\n 60|// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 61|\n 62|use std::io;\n...\n 125|/// The serialized write gate. `half: Some` = free; `None` = a write is in\n*126|/// flight (checked out) or the conn has retired (then `poisoned` is set).\n 127|struct Gate {\n 128|    half: Option<SendHalf>,\n 129|}\n...\n 155|    poisoned: AtomicBool,\n*156|    /// Latched when the retirement was DEADLINE-driven (watchdog fired, or a\n 157|    /// gate-waiter exhausted its bound) — as opposed to an organic I/O error\n 158|    /// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can\n 159|    /// count the wedge (the W2 stall-evict tally) without conflating it with\n...\n 163|    severed: AtomicBool,\n*164|    /// A retired (poisoned) half parks here so its OS handle stays alive\n 165|    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\n 166|    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\n 167|    graveyard: Mutex<Option<SendHalf>>,\n...\n 228|\n*229|    /// Render the once-per-conn retirement record — the F-039 token split\n 230|    /// (leg a): `CONN_WRITE_POISONED` is RESERVED for the deadline class\n 231|    /// (`timed_out` latched — the wedge observable blackhole-controller.ps1\n 232|    /// watches); an ORGANIC write failure (peer death / broken pipe on an\n...\n 234|    /// distinct `CONN_WRITE_RETIRED` token carrying the error kind and the\n*235|    /// SAME attribution fields — quieter class, never thinner (the retired\n 236|    /// class is what discriminates fresh-carrier churn from interleave\n 237|    /// artifact in the field). Behavior is identical either way: poison,\n*238|    /// abort, retire, never reuse.\n 239|    // [impl->REQ-CONN-POISON-DIAL-SCOPE]\n*240|    fn render_retirement(&self, timed_out: bool, cause: Option<&io::Error>) -> String {\n 241|        if timed_out {\n 242|            format!(\n*243|                \"CONN_WRITE_POISONED: {} — physical broker conn retired: a write \\\n 244|                 exceeded its {}ms bound; in-flight I/O aborted, conn never reused \\\n 245|                 [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\",\n 246|                self.attribution(),\n...\n 255|                \"CONN_WRITE_RETIRED: {} — organic write failure ({cause}); physical \\\n*256|                 broker conn poisoned + retired, never reused (same retire behavior \\\n 257|                 as POISONED — only the failure class differs) \\\n 258|                 [REQ-CONN-POISON-DIAL-SCOPE]\",\n 259|                self.attribution()\n...\n 267|    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n*268|    /// timeout/cancel leg is the retirement record itself.\n 269|    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 270|    fn lifecycle(&self, event: &str, extra: &str) {\n 271|        let sep = if extra.is_empty() { \"\" } else { \" \" };\n...\n 282|    /// AFTER a cancel (cancellation only reaches ALREADY-issued ops).\n*283|    /// `cause` (the organic caller's write error) rides the retirement record\n*284|    /// when the retirement is NOT deadline-driven.\n 285|    fn poison_and_cancel(&self, cause: Option<&io::Error>) {\n 286|        if !self.poisoned.swap(true, Ordering::AcqRel) {\n 287|            // First poison of this conn: loud, once. The token is class-split\n...\n 291|                \"{}\",\n*292|                self.render_retirement(self.timed_out.load(Ordering::Acquire), cause)\n 293|            );\n 294|        }\n 295|        #[cfg(windows)]\n...\n 385|            // one shot is not enough). Latch timed_out FIRST so the aborted\n*386|            // writer observes its failure as a DEADLINE retirement (wedge),\n 387|            // not an organic conn death.\n 388|            drop(d);\n 389|            self.timed_out.store(true, Ordering::Release);\n...\n 542|        // Once-per-conn `write-start` lifecycle record (leg d): marks the conn's\n*543|        // first committed write, so a conn that later retires can be correlated\n*544|        // to when it went active (fresh-carrier churn shows as open→start→retire\n 545|        // triplets with fresh ids).\n 546|        if !inner.first_write_logged.swap(true, Ordering::AcqRel) {\n 547|            inner.lifecycle(\"write-start\", \"\");\n...\n 589|        inner.gate_cv.notify_all();\n*590|        // A DEADLINE retirement (the watchdog aborted OUR op, or the conn was\n 591|        // already deadline-poisoned) surfaces as TimedOut — the caller can\n 592|        // count the wedge (W2 stall-evict tally). An organic I/O failure\n 593|        // (peer death) keeps its own error.\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...\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 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 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## dispatch.rs\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 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 347|/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n*348|/// redispatch — retire unserved, never replay?\n 349|///\n 350|/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n 351|/// would be a regression: the request/reply families FIN their send WITH the\n...\n 361|/// backlog on long-lived conns, and the brain-down-detach window that\n*362|/// Served-report retirement can never see). So: finished + Attach = terminal\n*363|/// (retired unserved via the worker's Served report); finished + anything\n 364|/// else = a pending request — serve it.\n 365|// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 366|// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\n...\n 431|    paths: &DispatchPaths,\n*432|    registry: Arc<RegistryHost>,\n 433|    stop: &AtomicBool,\n 434|    poll: Duration,\n 435|) -> io::Result<()> {\n...\n 509|                    // an older broker without the verb answers error (KH-2.3)\n*510|                    // and the row retires when the broker cycles.\n*511|                    if let Ok(mut retire_brain) = connect(&name) {\n*512|                        let _ = retire_brain.net_stream_retire(stream_id);\n 513|                    }\n 514|                    // Breaker reset = REAL progress only (gate round 1): a row\n 515|                    // that vanished before serve proves nothing about the\n...\n 517|                    // AND zero its doubling ladder mid-wedge. A real serve\n*518|                    // (including a finished-attach retirement) resets.\n 519|                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n 520|                    if !detail.contains(\"terminal pre-serve\") {\n 521|                        breaker_done.lock().unwrap().reset();\n...\n 736|    paths: &DispatchPaths,\n*737|    registry: &RegistryHost,\n 738|) -> WorkerReport {\n 739|    if take_injected_transient() {\n 740|        return WorkerReport::bare(DispatchOutcome::Failed(\n...\n 752|        // Pre-serve terminal exclusion (Amendment fix 6 rider): a row that\n*753|        // vanished between enumeration and this query (retired by a sibling\n 754|        // worker's Served report, or conn-swept) is TERMINAL — report Served\n 755|        // so the claim closes now, instead of burning three transient\n 756|        // retries against a stream that no longer exists.\n...\n 767|\n*768|    // Gate round 1 (retire-on-sight, KNOWN-HAZARDS 7.41): a finished ATTACH\n 769|    // row's exchange is over — the operator detached — and replaying it would\n 770|    // take the live controller (pre-existing backlog + brain-down-detach\n 771|    // orderings, which the Served-report path can never see). Report Served\n*772|    // WITHOUT serving: the loop's completion path retires the row, so the\n 773|    // backlog also drains from the table. Finished request/reply rows fall\n 774|    // through — their FIN is protocol, not completion (see\n 775|    // `finished_row_is_terminal`).\n...\n 777|        return WorkerReport {\n*778|            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n 779|            family: Some(family),\n 780|            endpoint,\n 781|        };\n...\n 830|        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n*831|        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n 832|        StreamFamily::Attach => {\n 833|            // The gate subject is the session's OWNING endpoint, resolved\n 834|            // from the broker's table (the spawn's label) — never from wire\n## docshost.rs\n 6|//! This is the canonical docs surface (supersedes the public Pages URL,\n*7|//! ADR-0014→ADR-0036). The URL-path surface matches the retired Pages site\n 8|//! verbatim: `/llms-full.txt`, append-`.md` raw-markdown twins,\n 9|//! `/manifest.schema.json`. Never LAN-exposed — a non-loopback bind would\n 10|//! re-publish what privating hid, so the bind address is NOT configurable;\n## drivehub.rs\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## effect.rs\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 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 774|            1 => EffectKind::Spool,\n*775|            _ => EffectKind::Registry,\n 776|        }\n 777|    }\n 778|\n## frame.rs\n 29|/// The oldest peer `protocol_version` this build will still handshake with.\n*30|/// Held at `1` for v1; raised only when an old version is genuinely retired.\n 31|pub const MIN_COMPATIBLE_VERSION: u32 = 1;\n 32|\n 33|/// Which side of the IPC a connecting peer is. The broker is the stable kernel;\n## lib.rs\n 255|};\n*256|pub use seedmap::{put_seed, take_seed, SeedRegistry};\n 257|pub use sync::{\n 258|    reconcile_after_sync, request_sync, select_refs, serve_sync, ReconcileWiring, SyncPolicy,\n 259|    SyncPullReport, SyncServeOutcome,\n## lifecycle.rs\n 14|//! driven in-brain (`BrainLifecycle::run_psyche_event_turn`, F-030 — the\n*15|//! resident `spawn_psyche` seam retired); the ordering invariants\n 16|//! (echo-before-signoff 3.3, grace-before-signoff 1.1, stale-sweep 3.2) live\n 17|//! where they always have.\n 18|// [impl->REQ-DAEMON-1]\n...\n 784|    ///\n*785|    /// Registry advertisement follows on the pump's next `advertise_local`\n 786|    /// scan — the persisted record is what it reads, epoch-bumped per row.\n 787|    // [impl->REQ-INST-3]\n 788|    // [impl->REQ-INST-4]\n...\n 1001|        // A bounded per-event turn holds the psyche image only for its duration, so it\n*1002|        // needs no `.live-bin` own-copy (unlike the retired resident spawn) — the\n 1003|        // install-dir/PATH snapshot is correct here (same class as translate/digest).\n 1004|        //\n 1005|        // F-027 Half-B env parity (REQ-PSYCHE-SPAWN-ENV-PARITY): thread the PARENT\n...\n 1166|    /// consecutive failures accrue strikes; on exhaustion stamp the PARENT perch\n*1167|    /// `psyche_host_error` (harness-reachable — the sibling of the retired residency/\n 1168|    /// spawn-Err stamps) and reset the counter so the next stamp needs a fresh budget\n 1169|    /// of consecutive failures (a bounded re-stamp cooldown — nothing resident to\n 1170|    /// respawn). A clean fire resets the counter AND clears any prior stamp (a\n...\n 1175|    /// F-030 W3: this consecutive-N turn-failure budget IS the thrash guard\n*1176|    /// (REQ-HAZARD-THRASH-GUARD-BLIND). The retired resident ledger-rate guard was\n 1177|    /// blind to ~12/min churn (boot records were not ledger boundaries to it); here\n 1178|    /// EVERY real per-event turn attempt feeds the budget, so a failure loop trips it\n 1179|    /// by construction — and the stamp lands on `psyche_host_error` ONLY, never the\n...\n 1644|    // [unit->REQ-HAZARD-THRASH-GUARD-BLIND] the W3 thrash guard IS the consecutive-N\n*1645|    // turn-failure budget (evidence #6: the retired resident guard let ~12/min churn\n 1646|    // run INVISIBLY because boot records were not ledger boundaries to it). A synthetic\n 1647|    // all-failure loop — 12 consecutive `Err` fed to `note_turn_outcome`, pure/no-sleep,\n 1648|    // the 12/min churn shape — MUST trip the budget (stamp psyche_host_error) WITHOUT\n...\n 1732|        );\n*1733|        // The fill carries the PATH, NOT the body — and the retired {psyche_context}\n 1734|        // body key is GONE (F-030 W4 file-always).\n 1735|        assert_eq!(\n 1736|            first.get(\"psyche_context_file\").map(String::as_str),\n...\n 2260|    // NOTE (F-030 W5): the daemon-crate `daemon_hosted_psyche_liveness_is_status_not_pid`\n*2261|    // unit was removed with the retired `BrainLifecycle::spawn_psyche`. The\n 2262|    // REQ-HAZARD-DAEMON-HOSTED-LIVENESS `unit` stage stays covered by the status-vs-pid\n 2263|    // liveness units in spt-store (liveness.rs / info.rs / registry.rs); the `int` stage\n 2264|    // is the daemon E2E (daemon_e2e.rs), which binds the hosted psyche perch directly.\n...\n 2883|    // NOTE (F-030 W5): the `.live-bin` psyche own-copy tests (copy_if_changed +\n*2884|    // psyche_spawn_runtime own-copy/degrade) were removed with the retired own-copy\n 2885|    // machinery — a per-event psyche turn is TURN-BOUNDED (same image-lock class as\n 2886|    // translate/digest) and spawns from the install-dir/PATH snapshot, so no\n 2887|    // per-endpoint copy is needed. REQ-INSTALL-11's `unit` stage stays covered by the\n## livehost.rs\n 18|//! `status`-ABSENT (not \"online\"), so this scan ignores them — no double-host in\n*19|//! the W0.1→W0.2 window. W0.2 retires the interim and makes the brain the\n 20|//! first-host (it sets `status=online` on a live `listen`/`bind`); from then this\n 21|//! reconcile reacts within one tick, the same way the shell waker reacts to a\n 22|//! CLI-process status flip. The full bind→online→brain-restart→re-host arc is\n...\n 55|/// handle and no residency anchor — a psyche is a bounded per-event turn, never a\n*56|/// process to own/reap (the resident residency/reap machinery retired here).\n 57|struct HostedLife {\n 58|    stop: Arc<AtomicBool>,\n 59|    thread: JoinHandle<()>,\n...\n 126|            // no resident child, so joining the driver thread + de-tabling above is the\n*127|            // whole un-host (the resident-psyche handle-reap + orphan-reap retired with\n 128|            // the residency machinery). Un-hosting a genuinely-offline endpoint is legit.\n 129|        }\n 130|    }\n...\n 175|        }\n*176|        // F-030 W3: the residency-confirm + thrash-detect + orphan-reap arms retired\n 177|        // with the resident psyche (a psyche is now a bounded per-event turn, not a\n 178|        // process to confirm resident / rate-limit / reap). A psyche that cannot work\n 179|        // is surfaced by the W1 per-event turn-failure budget (`note_turn_outcome`\n...\n 230|        // same dir Feature E's api seam uses (mod.rs::resolve_ctx_manifest). The\n*231|        // daemon-host site is the heir to the retired in-process spawn's\n 232|        // install-dir resolution: without it the daemon-hosted Psyche resolves a\n 233|        // copy-mode psyche binary only via PATH, not its install dir.\n 234|        let parent = adapter.split(':').next().unwrap_or(adapter);\n...\n 629|    // The pulse loop STAYS as the daemon-side scheduler; only what a fire DOES\n*630|    // changed. W3 retired the resident residency/reap machinery entirely: there is no\n 631|    // psyche handle to own, no residency anchor to stamp, nothing to reap on un-host.\n 632|    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\n 633|    // [impl->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION]\n...\n 663|/// not the broker-session arm's concern. (The former residency-confirm arm that\n*664|/// once handled it was retired with the resident-Psyche model in F-030; a\n 665|/// genuinely stranded pre-upgrade resident is now reaped by the one-shot\n 666|/// legacy-resident sweep at brain start.)\n 667|///\n...\n 895|/// F-030 W5 ONE-SHOT brain-start GC of stranded `.live-bin` own-copy dirs (design\n*896|/// §W5, [`REQ-PSYCHE-LEGACY-RESIDENT-SWEEP`]). The retired resident spawn kept a\n 897|/// per-endpoint `<perch>/.live-bin/<prog>` PRIVATE COPY of the psyche binary; the\n 898|/// ephemeral per-event turn needs none (it runs from the install-dir/PATH snapshot,\n 899|/// image-lock exposure now turn-bounded), so a cross-version upgrade leaves a multi-MB\n...\n 985|            // blocked forever on `spt ready --once`; the per-event driver never delivers to\n*986|            // it). Fires exactly once at brain start (never per-reconcile) — the retired\n 987|            // residency machinery's corpse-burial, not its resurrection.\n 988|            // [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\n 989|            let owlery = perch::owlery_dir();\n## msg.rs\n 81|/// learns its effect landed, and a replay after a crash is acknowledged the same\n*82|/// way so the brain can retire it (B5 / KNOWN-HAZARDS 7.2).\n 83|pub const KIND_APPLIED: &str = \"applied\";\n 84|/// Broker→brain: a command failed (carries an operator-facing message).\n 85|pub const KIND_ERROR: &str = \"error\";\n...\n 147|pub const KIND_NET_STREAM_EOF: &str = \"net-stream-eof\";\n*148|/// Brain→broker (ADR-0038 A): retire a stream row whose serve loop completed —\n 149|/// its exchange is terminal, so no future dispatcher generation may rediscover\n 150|/// and replay it (KNOWN-HAZARDS 7.41). Answered with\n 151|/// [`KIND_NET_STREAM_RETIRED`]. An older broker answers `error` (KH-2.3:\n*152|/// the caller treats retire as best-effort).\n 153|// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*154|pub const KIND_NET_STREAM_RETIRE: &str = \"net-stream-retire\";\n*155|/// Broker→brain: the retire ack (`removed` = a row actually left the table).\n*156|pub const KIND_NET_STREAM_RETIRED: &str = \"net-stream-retired\";\n 157|/// Brain→broker (ADR-0038 B): fetch a stream's pinned opener line — the\n 158|/// restart-durable classification fact, independent of the evictable data\n 159|/// ring. Answered with [`KIND_NET_STREAM_OPENER_REPLY`]. An older broker\n...\n 817|\n*818|/// `net-stream-retire` payload (ADR-0038 A).\n 819|#[derive(Debug, Clone, Serialize, Deserialize)]\n 820|pub struct NetStreamRetireReq {\n*821|    /// The completed stream to retire from redispatch eligibility.\n 822|    pub stream_id: u64,\n 823|}\n 824|\n*825|/// `net-stream-retired` payload — the retire ack.\n 826|#[derive(Debug, Clone, Serialize, Deserialize)]\n 827|pub struct NetStreamRetired {\n*828|    /// The stream the retire targeted.\n 829|    pub stream_id: u64,\n 830|    /// Whether a row actually left the table (false = already gone).\n 831|    #[serde(default)]\n## nethost.rs\n 793|    /// Retired = invisible to dispatch eligibility (ADR-0038 A), NOT torn down:\n*794|    /// retire must never sever the transport — the worker's reply send is\n*795|    /// fire-and-forget, so a retire that dropped this entry could overtake the\n 796|    /// still-queued reply inside the broker and reset the never-finished QUIC\n 797|    /// send half (requester sees torn-EOF, no reply). The reply-flush ordering\n 798|    /// is load-bearing; physical teardown belongs to the conn-close sweep only.\n 799|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*800|    retired: std::sync::atomic::AtomicBool,\n 801|}\n 802|\n 803|/// Tables shared between the host's sync surface and its runtime tasks\n...\n 1019|            room: Arc::clone(&room),\n*1020|            retired: std::sync::atomic::AtomicBool::new(false),\n 1021|        }),\n 1022|    );\n 1023|\n...\n 1808|            .iter()\n*1809|            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n 1810|            .map(|(id, e)| {\n 1811|                let log = e.log.lock().unwrap();\n 1812|                NetStreamInfo {\n...\n 1830|    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n*1831|    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n*1832|    /// reply sends when it removed the entry (see the `retired` field note).\n 1833|    /// Physical teardown stays with the conn-close sweep. Returns whether this\n*1834|    /// call newly retired the row (idempotent; absent row = false).\n 1835|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1836|    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1837|        let Some(entry) = self\n 1838|            .shared\n 1839|            .streams\n...\n 1847|        let newly = !entry\n*1848|            .retired\n 1849|            .swap(true, std::sync::atomic::Ordering::SeqCst);\n 1850|        if newly {\n*1851|            // A retired exchange's request bytes are dead weight — free the\n 1852|            // ring; the pinned opener and cursors stay (cheap, bounded).\n 1853|            entry.log.lock().unwrap().ring.clear();\n 1854|        }\n...\n 1864|        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n*1865|        // A retired row answers no-such-stream: classification exists only to\n*1866|        // serve, and a retired exchange must never be served again.\n*1867|        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n 1868|            return None;\n 1869|        }\n 1870|        let line = entry.log.lock().unwrap().opener_line();\n...\n 2385|\n*2386|    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] retirement hides EXACTLY the\n*2387|    // named row from dispatch eligibility: the retired stream leaves the\n 2388|    // dispatch enumeration (stream_infos) while the active sibling stays\n*2389|    // claimable, a second retire is a no-op, and the pinned-opener query\n 2390|    // answers no-such-stream afterwards. Retirement is visibility, not\n 2391|    // teardown — the transport half of the contract is the sibling test\n*2392|    // `retired_row_still_flushes_a_late_reply`.\n 2393|    #[test]\n*2394|    fn retire_hides_the_row_while_active_rows_stay() {\n 2395|        let host = NetHost::start(hermetic(&Identity::generate())).expect(\"host start\");\n 2396|        let (owner, shell) = host.open_loopback_pair().expect(\"open pair\");\n 2397|        host.send_stream(owner, b\"{\\\"kind\\\":\\\"request\\\",\\\"session_id\\\":1}\\n\", false)\n...\n 2413|\n*2414|        assert!(host.retire_stream(shell), \"first retire hides the row\");\n 2415|        let ids: Vec<u64> = host.stream_infos().iter().map(|s| s.stream_id).collect();\n## notif.rs\n 220|    local_node: &str,\n*221|    regs: &std::collections::BTreeMap<String, spt_net::net::registry::SubnetRegistry>,\n 222|    now_ms: u64,\n 223|) -> Result<FirstFireOutcome, String> {\n 224|    let Some(target) = crate::presence::most_recently_active_in_subnet(\n...\n 693|\n*694|            let mut reg = spt_net::net::registry::SubnetRegistry::new();\n 695|            reg.merge_instance(\n 696|                \"ling\",\n 697|                spt_net::net::registry::Instance {\n## notifsync.rs\n 38|    /// The membership directory (Mesh-D5, REQ-MESH-5) — authorization is live\n*39|    /// roster membership, not a pairwise pin (see `RegistryGatePolicy::roster`).\n 40|    pub roster: RosterStore,\n 41|}\n 42|\n## presence.rs\n 32|\n*33|use spt_net::net::registry::SubnetRegistry;\n 34|\n 35|use crate::consent::ConsentTarget;\n 36|use crate::notif::{most_recently_active_where, NotifSurfacePolicy};\n...\n 57|/// exactly the pre-D6 behavior (the stale-tolerant reader contract).\n*58|pub fn load_registry_snapshots(dir: &Path) -> BTreeMap<String, SubnetRegistry> {\n 59|    let mut out = BTreeMap::new();\n 60|    let Ok(entries) = std::fs::read_dir(dir) else {\n 61|        return out;\n...\n 73|        };\n*74|        let Ok(reg) = serde_json::from_str::<SubnetRegistry>(&raw) else {\n 75|            continue;\n 76|        };\n 77|        out.insert(stem.to_string(), reg);\n...\n 107|    owlery: &Path,\n*108|    regs: &BTreeMap<String, SubnetRegistry>,\n 109|    local_node: &str,\n 110|    admit_local: impl Fn(&str) -> bool,\n 111|    admit_row: impl Fn(&str, &str) -> bool,\n...\n 163|    owlery: &Path,\n*164|    regs: &BTreeMap<String, SubnetRegistry>,\n 165|    local_node: &str,\n 166|    policy: &NotifSurfacePolicy,\n 167|    subnet: &str,\n...\n 182|    owlery: &Path,\n*183|    regs: &BTreeMap<String, SubnetRegistry>,\n 184|    local_node: &str,\n 185|    policy: &NotifSurfacePolicy,\n 186|) -> Option<PresenceTarget> {\n...\n 253|\n*254|        let mut reg = SubnetRegistry::new();\n 255|        reg.merge_instance(\"ling\", row(\"remote-hex\", Status::Active, Some(5_000)));\n 256|        let mut regs = BTreeMap::new();\n 257|        regs.insert(\"home\".to_string(), reg);\n...\n 291|        live_perch(&owlery, \"ling\", Some(1_000));\n*292|        let mut reg = SubnetRegistry::new();\n 293|        // Own-node row with an absurdly fresh stamp: skipped (stale echo of\n 294|        // our own advertisement must not shadow the live local read).\n 295|        reg.merge_instance(\"ling\", row(\"my-hex\", Status::Active, Some(99_000)));\n...\n 320|\n*321|        let mut home = SubnetRegistry::new();\n 322|        home.merge_instance(\"oak\", row(\"remote-hex\", Status::Active, Some(2_000)));\n*323|        let mut work = SubnetRegistry::new();\n 324|        work.merge_instance(\"oak\", row(\"remote-hex\", Status::Active, Some(99_000)));\n 325|        let mut regs = BTreeMap::new();\n 326|        regs.insert(\"home\".to_string(), home);\n...\n 351|        std::fs::write(d.join(\"note.txt\"), \"{}\").unwrap();\n*352|        let mut reg = SubnetRegistry::new();\n 353|        reg.merge_instance(\"ling\", row(\"n1\", Status::Active, Some(5)));\n 354|        std::fs::write(d.join(\"home.json\"), serde_json::to_string(&reg).unwrap()).unwrap();\n 355|        let regs = load_registry_snapshots(&d);\n## projwriter.rs\n 1119|    // same ids, same dirs, same display names, same newest-first order (order\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...\n 1166|\n*1167|        // THE ORACLE: the retired picker wiring, reconstructed verbatim from\n 1168|        // the same public APIs it used (git-backed, newest-first).\n 1169|        let owlery = fx.paths.owlery.clone();\n 1170|        let seed_git = fx.paths.seed_git.clone();\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-net/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":143,"fileCount":20,"files":["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/daemon.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/docshost.rs","crates/spt-daemon/src/drivehub.rs","crates/spt-daemon/src/effect.rs","crates/spt-daemon/src/frame.rs","crates/spt-daemon/src/lib.rs","crates/spt-daemon/src/lifecycle.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/msg.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/notif.rs","crates/spt-daemon/src/notifsync.rs","crates/spt-daemon/src/presence.rs","crates/spt-daemon/src/projwriter.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brain.rs","count":5},{"path":"crates/spt-daemon/src/brainproc.rs","count":4},{"path":"crates/spt-daemon/src/broker.rs","count":16},{"path":"crates/spt-daemon/src/config.rs","count":1},{"path":"crates/spt-daemon/src/conn.rs","count":20},{"path":"crates/spt-daemon/src/daemon.rs","count":4},{"path":"crates/spt-daemon/src/dispatch.rs","count":20},{"path":"crates/spt-daemon/src/docshost.rs","count":1},{"path":"crates/spt-daemon/src/drivehub.rs","count":1},{"path":"crates/spt-daemon/src/effect.rs","count":5},{"path":"crates/spt-daemon/src/frame.rs","count":1},{"path":"crates/spt-daemon/src/lib.rs","count":1},{"path":"crates/spt-daemon/src/lifecycle.rs","count":9},{"path":"crates/spt-daemon/src/livehost.rs","count":9},{"path":"crates/spt-daemon/src/msg.rs","count":10},{"path":"crates/spt-daemon/src/nethost.rs","count":20},{"path":"crates/spt-daemon/src/notif.rs","count":2},{"path":"crates/spt-daemon/src/notifsync.rs","count":1},{"path":"crates/spt-daemon/src/presence.rs","count":11},{"path":"crates/spt-daemon/src/projwriter.rs","count":2}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## brain.rs\n   75│/// **Test-only continuity (restoration D4-3, ADR-0018 Q6).** This brain→brain\n  *76│/// frame is **retired from the production path**: a brain the broker's supervisor\n   77│/// respawns reconstructs continuity by querying the broker\n   78│/// ([`Brain::resume_sessions`] over the broker's cursor-of-record), never this\n   79│/// message. `BrainState` / [`Brain::handoff`] / [`Brain::snapshot`] stay `pub`\n     │...\n  283│    /// continuity state a cold-started brain rebuilds from the broker via\n *284│    /// [`Brain::resume_sessions`], replacing the retired single-session\n  285│    /// `BrainState` handoff. A session present here is in **resume mode** — its\n  286│    /// `KIND_OUTPUT` dedup is **dedup-below + snap-above, NO reject-gap** (seeded\n  287│    /// at the broker's `resume_seq`): drop `seq < cursor` (the at-least-once\n     │...\n 1009│    /// from the broker's per-session delivered cursor (`resume_seq`). This is the\n*1010│    /// production replacement for the retired single-session `BrainState` handoff\n 1011│    /// frame — a brain the supervisor respawns (crash *or* update) reconstructs\n 1012│    /// all session continuity by querying the persistent side, never a brain→brain\n 1013│    /// message. Returns the ids re-attached (empty when the broker hosts none —\n     │...\n 1450│    /// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker\n*1451│    /// answers `error` (KH-2.3 N-1 window — retirement then waits for the\n 1452│    /// broker to cycle onto the new binary).\n 1453│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1454│    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n 1455│        self.send(\n 1456│            KIND_NET_STREAM_RETIRE,\n 1457│            serde_json::to_value(NetStreamRetireReq { stream_id })\n## brainproc.rs\n  67│/// broker *observes* every respawn, so it alone is authoritative (strictly more\n *68│/// reliable than a brain→brain frame, which retires in D4).\n  69│///\n  70│/// Parsing is **lenient** (KH-2.3 forward-compat): an unrecognized value — a\n  71│/// reason a *future* broker adds that this brain predates — defaults to `Cold`,\n    │...\n 169│    // generation is broker-owned custody of the KH-2.4 counter (no longer the\n*170│    // brain→brain BrainState.generation, which retires in D4), and the reason is\n 171│    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\n 172│    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\n 173│    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\n    │...\n 182│    // continuity from the broker — re-attach EVERY hosted session in resume mode\n*183│    // from its delivered cursor, the production replacement for the retired\n 184│    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\n 185│    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\n 186│    // so this is a no-op now and forward-correct when daemon-hosted sessions land\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## broker.rs\n 1195│            // whose viewport died raw, no FIN — the shape finished-row\n*1196│            // retirement cannot see) carries an OLDER generation than the\n 1197│            // live replacement controller and is REFUSED busy: lifecycle is\n 1198│            // still the discriminator, never origin identity. `0` on either\n 1199│            // side (local / N-1) keeps the legacy re-take.\n     │...\n 1449│        // Bounded, cancelable conn write (round-4): a viewer that stops\n*1450│        // reading poisons + retires ITS conn at the deadline instead of\n 1451│        // parking this thread in the OS write forever.\n 1452│        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 1453│        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n     │...\n 1477│/// Round-4 observability bridge: a controller writer whose bounded conn write\n*1478│/// was DEADLINE-retired (`TimedOut` — the conn watchdog aborted a wedged\n 1479│/// write, or a gate-wait behind one exhausted the bound) IS the\n 1480│/// brain-subscriber stall-evict fact the W2 tally counts. Pre-round-4 that\n 1481│/// wedge aged until a logical sampler (`stall_evict_controller`) observed it;\n     │...\n 1486│// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\n*1487│fn note_controller_write_retired(sid: u64, conn: u64, e: &io::Error) {\n 1488│    if e.kind() != io::ErrorKind::TimedOut {\n 1489│        return;\n 1490│    }\n     │...\n 1493│        \"BRAIN_SUBSCRIBER_STALL_EVICT:{sid} conn={conn} {} — controller conn write \\\n*1494│         exceeded its bound; physical conn poisoned + retired (writer released, EOF \\\n 1495│         cleanup follows) [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n 1496│        crate::conn::log_stamp()\n 1497│    );\n     │...\n 1587│        // Round-4: the write itself is bounded + cancelable — a non-draining\n*1588│        // consumer poisons + retires the physical conn at the deadline instead\n 1589│        // of wedging this thread in the OS write forever.\n 1590│        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 1591│        mark_blocked(true);\n     │...\n 1606│            Err(e) => {\n*1607│                note_controller_write_retired(sid, send.id(), &e);\n 1608│                send.lifecycle_event(\n 1609│                    \"writer-exit\",\n 1610│                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n     │...\n 1635│            Err(e) => {\n*1636│                note_controller_write_retired(sid, send.id(), &e);\n 1637│                // Bounded writer-exit record (F-039 leg d).\n 1638│                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 1639│                send.lifecycle_event(\n     │...\n 2599│    /// REQ-SPAWN-COLLISION-GUARD-LIVE-DUP). The broker is the sole spawner post-W3 (the\n*2600│    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n 2601│    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n 2602│    /// perch-record claim (that would add another info.json writer, the exact\n 2603│    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n     │...\n 3039│        // primitive from birth — every write on this physical connection is\n*3040│        // deadline-bounded, and a wedge poisons + retires the conn.\n 3041│        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 3042│        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n 3043│        // Base attribution fact (F-039 leg b): broker clients are brains; role\n     │...\n 3146│                KIND_NET_STREAM_RETIRE => {\n*3147│                    if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {\n 3148│                        send_error(&send, &msg);\n 3149│                    }\n 3150│                }\n     │...\n 3583│    /// written twice), and either outcome — fresh apply or dedup — is acked back\n*3584│    /// with an [`crate::msg::KIND_APPLIED`] frame so the brain can retire the\n 3585│    /// effect (B5 / KNOWN-HAZARDS 7.2). Without an `op_id` it is the legacy\n 3586│    /// direct write (no dedup, no ack).\n 3587│    // [impl->REQ-HAZARD-RESTART-IDEMPOTENT]\n     │...\n 4383│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*4384│    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n 4385│        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n*4386│            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4387│        let host = self.net.get().ok_or(\"net disabled\")?;\n*4388│        let removed = host.retire_stream(req.stream_id);\n 4389│        let frame = Envelope::new(\n 4390│            KIND_NET_STREAM_RETIRED,\n 4391│            serde_json::to_value(NetStreamRetired {\n     │...\n 5709│    /// stale Request — an UNFINISHED backlog row whose viewport died raw, the\n*5710│    /// shape finished-row retirement cannot see — carries an OLDER generation\n 5711│    /// than the live replacement controller and must be REFUSED busy, never\n 5712│    /// silently steal the slot. `0` on either side keeps the N-1/local legacy\n 5713│    /// re-take (a legacy peer must not be locked out).\n## config.rs\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## conn.rs\n  37│//!\n *38│//! ## Poison / retire invariant (both OSes)\n  39│//!\n  40│//! On deadline, write failure, or cancellation: (1) the WHOLE physical\n  41│//! connection is poisoned, idempotently — a length-prefixed frame may have\n    │...\n  45│//! completion (`write_frame` returns only after the completion APC — the\n *46│//! synchronous return IS the completion handshake); (4) the retired half is\n  47│//! parked in a graveyard slot — never dropped while the watchdog might still\n  48│//! touch the raw handle (drop = `CloseHandle`, and a recycled handle value\n  49│//! must never see a late `CancelIoEx`), and never re-gated; (5) on Windows the\n    │...\n  58│//! (recorded mid-frame corruption risk). Unix keeps its existing semantics for\n *59│//! healthy connections; only the poison/retire path is new.\n  60│// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n  61│\n  62│use std::io;\n    │...\n 125│/// The serialized write gate. `half: Some` = free; `None` = a write is in\n*126│/// flight (checked out) or the conn has retired (then `poisoned` is set).\n 127│struct Gate {\n 128│    half: Option<SendHalf>,\n 129│}\n    │...\n 155│    poisoned: AtomicBool,\n*156│    /// Latched when the retirement was DEADLINE-driven (watchdog fired, or a\n 157│    /// gate-waiter exhausted its bound) — as opposed to an organic I/O error\n 158│    /// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can\n 159│    /// count the wedge (the W2 stall-evict tally) without conflating it with\n    │...\n 163│    severed: AtomicBool,\n*164│    /// A retired (poisoned) half parks here so its OS handle stays alive\n 165│    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\n 166│    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\n 167│    graveyard: Mutex<Option<SendHalf>>,\n    │...\n 228│\n*229│    /// Render the once-per-conn retirement record — the F-039 token split\n 230│    /// (leg a): `CONN_WRITE_POISONED` is RESERVED for the deadline class\n 231│    /// (`timed_out` latched — the wedge observable blackhole-controller.ps1\n 232│    /// watches); an ORGANIC write failure (peer death / broken pipe on an\n    │...\n 234│    /// distinct `CONN_WRITE_RETIRED` token carrying the error kind and the\n*235│    /// SAME attribution fields — quieter class, never thinner (the retired\n 236│    /// class is what discriminates fresh-carrier churn from interleave\n 237│    /// artifact in the field). Behavior is identical either way: poison,\n*238│    /// abort, retire, never reuse.\n 239│    // [impl->REQ-CONN-POISON-DIAL-SCOPE]\n*240│    fn render_retirement(&self, timed_out: bool, cause: Option<&io::Error>) -> String {\n 241│        if timed_out {\n 242│            format!(\n*243│                \"CONN_WRITE_POISONED: {} — physical broker conn retired: a write \\\n 244│                 exceeded its {}ms bound; in-flight I/O aborted, conn never reused \\\n 245│                 [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\",\n 246│                self.attribution(),\n    │...\n 255│                \"CONN_WRITE_RETIRED: {} — organic write failure ({cause}); physical \\\n*256│                 broker conn poisoned + retired, never reused (same retire behavior \\\n 257│                 as POISONED — only the failure class differs) \\\n 258│                 [REQ-CONN-POISON-DIAL-SCOPE]\",\n 259│                self.attribution()\n    │...\n 267│    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n*268│    /// timeout/cancel leg is the retirement record itself.\n 269│    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n 270│    fn lifecycle(&self, event: &str, extra: &str) {\n 271│        let sep = if extra.is_empty() { \"\" } else { \" \" };\n    │...\n 282│    /// AFTER a cancel (cancellation only reaches ALREADY-issued ops).\n*283│    /// `cause` (the organic caller's write error) rides the retirement record\n*284│    /// when the retirement is NOT deadline-driven.\n 285│    fn poison_and_cancel(&self, cause: Option<&io::Error>) {\n 286│        if !self.poisoned.swap(true, Ordering::AcqRel) {\n 287│            // First poison of this conn: loud, once. The token is class-split\n    │...\n 291│                \"{}\",\n*292│                self.render_retirement(self.timed_out.load(Ordering::Acquire), cause)\n 293│            );\n 294│        }\n 295│        #[cfg(windows)]\n    │...\n 385│            // one shot is not enough). Latch timed_out FIRST so the aborted\n*386│            // writer observes its failure as a DEADLINE retirement (wedge),\n 387│            // not an organic conn death.\n 388│            drop(d);\n 389│            self.timed_out.store(true, Ordering::Release);\n    │...\n 542│        // Once-per-conn `write-start` lifecycle record (leg d): marks the conn's\n*543│        // first committed write, so a conn that later retires can be correlated\n*544│        // to when it went active (fresh-carrier churn shows as open→start→retire\n 545│        // triplets with fresh ids).\n 546│        if !inner.first_write_logged.swap(true, Ordering::AcqRel) {\n 547│            inner.lifecycle(\"write-start\", \"\");\n    │...\n 589│        inner.gate_cv.notify_all();\n*590│        // A DEADLINE retirement (the watchdog aborted OUR op, or the conn was\n 591│        // already deadline-poisoned) surfaces as TimedOut — the caller can\n 592│        // count the wedge (W2 stall-evict tally). An organic I/O failure\n 593│        // (peer death) keeps its own error.\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     │...\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 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 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## dispatch.rs\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  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 347│/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n*348│/// redispatch — retire unserved, never replay?\n 349│///\n 350│/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n 351│/// would be a regression: the request/reply families FIN their send WITH the\n    │...\n 361│/// backlog on long-lived conns, and the brain-down-detach window that\n*362│/// Served-report retirement can never see). So: finished + Attach = terminal\n*363│/// (retired unserved via the worker's Served report); finished + anything\n 364│/// else = a pending request — serve it.\n 365│// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n 366│// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\n    │...\n 431│    paths: &DispatchPaths,\n*432│    registry: Arc<RegistryHost>,\n 433│    stop: &AtomicBool,\n 434│    poll: Duration,\n 435│) -> io::Result<()> {\n    │...\n 509│                    // an older broker without the verb answers error (KH-2.3)\n*510│                    // and the row retires when the broker cycles.\n*511│                    if let Ok(mut retire_brain) = connect(&name) {\n*512│                        let _ = retire_brain.net_stream_retire(stream_id);\n 513│                    }\n 514│                    // Breaker reset = REAL progress only (gate round 1): a row\n 515│                    // that vanished before serve proves nothing about the\n    │...\n 517│                    // AND zero its doubling ladder mid-wedge. A real serve\n*518│                    // (including a finished-attach retirement) resets.\n 519│                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n 520│                    if !detail.contains(\"terminal pre-serve\") {\n 521│                        breaker_done.lock().unwrap().reset();\n    │...\n 736│    paths: &DispatchPaths,\n*737│    registry: &RegistryHost,\n 738│) -> WorkerReport {\n 739│    if take_injected_transient() {\n 740│        return WorkerReport::bare(DispatchOutcome::Failed(\n    │...\n 752│        // Pre-serve terminal exclusion (Amendment fix 6 rider): a row that\n*753│        // vanished between enumeration and this query (retired by a sibling\n 754│        // worker's Served report, or conn-swept) is TERMINAL — report Served\n 755│        // so the claim closes now, instead of burning three transient\n 756│        // retries against a stream that no longer exists.\n    │...\n 767│\n*768│    // Gate round 1 (retire-on-sight, KNOWN-HAZARDS 7.41): a finished ATTACH\n 769│    // row's exchange is over — the operator detached — and replaying it would\n 770│    // take the live controller (pre-existing backlog + brain-down-detach\n 771│    // orderings, which the Served-report path can never see). Report Served\n*772│    // WITHOUT serving: the loop's completion path retires the row, so the\n 773│    // backlog also drains from the table. Finished request/reply rows fall\n 774│    // through — their FIN is protocol, not completion (see\n 775│    // `finished_row_is_terminal`).\n    │...\n 777│        return WorkerReport {\n*778│            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n 779│            family: Some(family),\n 780│            endpoint,\n 781│        };\n    │...\n 830│        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n*831│        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n 832│        StreamFamily::Attach => {\n 833│            // The gate subject is the session's OWNING endpoint, resolved\n 834│            // from the broker's table (the spawn's label) — never from wire\n## docshost.rs\n  6│//! This is the canonical docs surface (supersedes the public Pages URL,\n *7│//! ADR-0014→ADR-0036). The URL-path surface matches the retired Pages site\n  8│//! verbatim: `/llms-full.txt`, append-`.md` raw-markdown twins,\n  9│//! `/manifest.schema.json`. Never LAN-exposed — a non-loopback bind would\n 10│//! re-publish what privating hid, so the bind address is NOT configurable;\n## drivehub.rs\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## effect.rs\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 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 774│            1 => EffectKind::Spool,\n*775│            _ => EffectKind::Registry,\n 776│        }\n 777│    }\n 778│\n## frame.rs\n 29│/// The oldest peer `protocol_version` this build will still handshake with.\n*30│/// Held at `1` for v1; raised only when an old version is genuinely retired.\n 31│pub const MIN_COMPATIBLE_VERSION: u32 = 1;\n 32│\n 33│/// Which side of the IPC a connecting peer is. The broker is the stable kernel;\n## lib.rs\n 255│};\n*256│pub use seedmap::{put_seed, take_seed, SeedRegistry};\n 257│pub use sync::{\n 258│    reconcile_after_sync, request_sync, select_refs, serve_sync, ReconcileWiring, SyncPolicy,\n 259│    SyncPullReport, SyncServeOutcome,\n## lifecycle.rs\n   14│//! driven in-brain (`BrainLifecycle::run_psyche_event_turn`, F-030 — the\n  *15│//! resident `spawn_psyche` seam retired); the ordering invariants\n   16│//! (echo-before-signoff 3.3, grace-before-signoff 1.1, stale-sweep 3.2) live\n   17│//! where they always have.\n   18│// [impl->REQ-DAEMON-1]\n     │...\n  784│    ///\n *785│    /// Registry advertisement follows on the pump's next `advertise_local`\n  786│    /// scan — the persisted record is what it reads, epoch-bumped per row.\n  787│    // [impl->REQ-INST-3]\n  788│    // [impl->REQ-INST-4]\n     │...\n 1001│        // A bounded per-event turn holds the psyche image only for its duration, so it\n*1002│        // needs no `.live-bin` own-copy (unlike the retired resident spawn) — the\n 1003│        // install-dir/PATH snapshot is correct here (same class as translate/digest).\n 1004│        //\n 1005│        // F-027 Half-B env parity (REQ-PSYCHE-SPAWN-ENV-PARITY): thread the PARENT\n     │...\n 1166│    /// consecutive failures accrue strikes; on exhaustion stamp the PARENT perch\n*1167│    /// `psyche_host_error` (harness-reachable — the sibling of the retired residency/\n 1168│    /// spawn-Err stamps) and reset the counter so the next stamp needs a fresh budget\n 1169│    /// of consecutive failures (a bounded re-stamp cooldown — nothing resident to\n 1170│    /// respawn). A clean fire resets the counter AND clears any prior stamp (a\n     │...\n 1175│    /// F-030 W3: this consecutive-N turn-failure budget IS the thrash guard\n*1176│    /// (REQ-HAZARD-THRASH-GUARD-BLIND). The retired resident ledger-rate guard was\n 1177│    /// blind to ~12/min churn (boot records were not ledger boundaries to it); here\n 1178│    /// EVERY real per-event turn attempt feeds the budget, so a failure loop trips it\n 1179│    /// by construction — and the stamp lands on `psyche_host_error` ONLY, never the\n     │...\n 1644│    // [unit->REQ-HAZARD-THRASH-GUARD-BLIND] the W3 thrash guard IS the consecutive-N\n*1645│    // turn-failure budget (evidence #6: the retired resident guard let ~12/min churn\n 1646│    // run INVISIBLY because boot records were not ledger boundaries to it). A synthetic\n 1647│    // all-failure loop — 12 consecutive `Err` fed to `note_turn_outcome`, pure/no-sleep,\n 1648│    // the 12/min churn shape — MUST trip the budget (stamp psyche_host_error) WITHOUT\n     │...\n 1732│        );\n*1733│        // The fill carries the PATH, NOT the body — and the retired {psyche_context}\n 1734│        // body key is GONE (F-030 W4 file-always).\n 1735│        assert_eq!(\n 1736│            first.get(\"psyche_context_file\").map(String::as_str),\n     │...\n 2260│    // NOTE (F-030 W5): the daemon-crate `daemon_hosted_psyche_liveness_is_status_not_pid`\n*2261│    // unit was removed with the retired `BrainLifecycle::spawn_psyche`. The\n 2262│    // REQ-HAZARD-DAEMON-HOSTED-LIVENESS `unit` stage stays covered by the status-vs-pid\n 2263│    // liveness units in spt-store (liveness.rs / info.rs / registry.rs); the `int` stage\n 2264│    // is the daemon E2E (daemon_e2e.rs), which binds the hosted psyche perch directly.\n     │...\n 2883│    // NOTE (F-030 W5): the `.live-bin` psyche own-copy tests (copy_if_changed +\n*2884│    // psyche_spawn_runtime own-copy/degrade) were removed with the retired own-copy\n 2885│    // machinery — a per-event psyche turn is TURN-BOUNDED (same image-lock class as\n 2886│    // translate/digest) and spawns from the install-dir/PATH snapshot, so no\n 2887│    // per-endpoint copy is needed. REQ-INSTALL-11's `unit` stage stays covered by the\n## livehost.rs\n  18│//! `status`-ABSENT (not \"online\"), so this scan ignores them — no double-host in\n *19│//! the W0.1→W0.2 window. W0.2 retires the interim and makes the brain the\n  20│//! first-host (it sets `status=online` on a live `listen`/`bind`); from then this\n  21│//! reconcile reacts within one tick, the same way the shell waker reacts to a\n  22│//! CLI-process status flip. The full bind→online→brain-restart→re-host arc is\n    │...\n  55│/// handle and no residency anchor — a psyche is a bounded per-event turn, never a\n *56│/// process to own/reap (the resident residency/reap machinery retired here).\n  57│struct HostedLife {\n  58│    stop: Arc<AtomicBool>,\n  59│    thread: JoinHandle<()>,\n    │...\n 126│            // no resident child, so joining the driver thread + de-tabling above is the\n*127│            // whole un-host (the resident-psyche handle-reap + orphan-reap retired with\n 128│            // the residency machinery). Un-hosting a genuinely-offline endpoint is legit.\n 129│        }\n 130│    }\n    │...\n 175│        }\n*176│        // F-030 W3: the residency-confirm + thrash-detect + orphan-reap arms retired\n 177│        // with the resident psyche (a psyche is now a bounded per-event turn, not a\n 178│        // process to confirm resident / rate-limit / reap). A psyche that cannot work\n 179│        // is surfaced by the W1 per-event turn-failure budget (`note_turn_outcome`\n    │...\n 230│        // same dir Feature E's api seam uses (mod.rs::resolve_ctx_manifest). The\n*231│        // daemon-host site is the heir to the retired in-process spawn's\n 232│        // install-dir resolution: without it the daemon-hosted Psyche resolves a\n 233│        // copy-mode psyche binary only via PATH, not its install dir.\n 234│        let parent = adapter.split(':').next().unwrap_or(adapter);\n    │...\n 629│    // The pulse loop STAYS as the daemon-side scheduler; only what a fire DOES\n*630│    // changed. W3 retired the resident residency/reap machinery entirely: there is no\n 631│    // psyche handle to own, no residency anchor to stamp, nothing to reap on un-host.\n 632│    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\n 633│    // [impl->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION]\n    │...\n 663│/// not the broker-session arm's concern. (The former residency-confirm arm that\n*664│/// once handled it was retired with the resident-Psyche model in F-030; a\n 665│/// genuinely stranded pre-upgrade resident is now reaped by the one-shot\n 666│/// legacy-resident sweep at brain start.)\n 667│///\n    │...\n 895│/// F-030 W5 ONE-SHOT brain-start GC of stranded `.live-bin` own-copy dirs (design\n*896│/// §W5, [`REQ-PSYCHE-LEGACY-RESIDENT-SWEEP`]). The retired resident spawn kept a\n 897│/// per-endpoint `<perch>/.live-bin/<prog>` PRIVATE COPY of the psyche binary; the\n 898│/// ephemeral per-event turn needs none (it runs from the install-dir/PATH snapshot,\n 899│/// image-lock exposure now turn-bounded), so a cross-version upgrade leaves a multi-MB\n    │...\n 985│            // blocked forever on `spt ready --once`; the per-event driver never delivers to\n*986│            // it). Fires exactly once at brain start (never per-reconcile) — the retired\n 987│            // residency machinery's corpse-burial, not its resurrection.\n 988│            // [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\n 989│            let owlery = perch::owlery_dir();\n## msg.rs\n  81│/// learns its effect landed, and a replay after a crash is acknowledged the same\n *82│/// way so the brain can retire it (B5 / KNOWN-HAZARDS 7.2).\n  83│pub const KIND_APPLIED: &str = \"applied\";\n  84│/// Broker→brain: a command failed (carries an operator-facing message).\n  85│pub const KIND_ERROR: &str = \"error\";\n    │...\n 147│pub const KIND_NET_STREAM_EOF: &str = \"net-stream-eof\";\n*148│/// Brain→broker (ADR-0038 A): retire a stream row whose serve loop completed —\n 149│/// its exchange is terminal, so no future dispatcher generation may rediscover\n 150│/// and replay it (KNOWN-HAZARDS 7.41). Answered with\n 151│/// [`KIND_NET_STREAM_RETIRED`]. An older broker answers `error` (KH-2.3:\n*152│/// the caller treats retire as best-effort).\n 153│// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*154│pub const KIND_NET_STREAM_RETIRE: &str = \"net-stream-retire\";\n*155│/// Broker→brain: the retire ack (`removed` = a row actually left the table).\n*156│pub const KIND_NET_STREAM_RETIRED: &str = \"net-stream-retired\";\n 157│/// Brain→broker (ADR-0038 B): fetch a stream's pinned opener line — the\n 158│/// restart-durable classification fact, independent of the evictable data\n 159│/// ring. Answered with [`KIND_NET_STREAM_OPENER_REPLY`]. An older broker\n    │...\n 817│\n*818│/// `net-stream-retire` payload (ADR-0038 A).\n 819│#[derive(Debug, Clone, Serialize, Deserialize)]\n 820│pub struct NetStreamRetireReq {\n*821│    /// The completed stream to retire from redispatch eligibility.\n 822│    pub stream_id: u64,\n 823│}\n 824│\n*825│/// `net-stream-retired` payload — the retire ack.\n 826│#[derive(Debug, Clone, Serialize, Deserialize)]\n 827│pub struct NetStreamRetired {\n*828│    /// The stream the retire targeted.\n 829│    pub stream_id: u64,\n 830│    /// Whether a row actually left the table (false = already gone).\n 831│    #[serde(default)]\n## nethost.rs\n  793│    /// Retired = invisible to dispatch eligibility (ADR-0038 A), NOT torn down:\n *794│    /// retire must never sever the transport — the worker's reply send is\n *795│    /// fire-and-forget, so a retire that dropped this entry could overtake the\n  796│    /// still-queued reply inside the broker and reset the never-finished QUIC\n  797│    /// send half (requester sees torn-EOF, no reply). The reply-flush ordering\n  798│    /// is load-bearing; physical teardown belongs to the conn-close sweep only.\n  799│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n *800│    retired: std::sync::atomic::AtomicBool,\n  801│}\n  802│\n  803│/// Tables shared between the host's sync surface and its runtime tasks\n     │...\n 1019│            room: Arc::clone(&room),\n*1020│            retired: std::sync::atomic::AtomicBool::new(false),\n 1021│        }),\n 1022│    );\n 1023│\n     │...\n 1808│            .iter()\n*1809│            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n 1810│            .map(|(id, e)| {\n 1811│                let log = e.log.lock().unwrap();\n 1812│                NetStreamInfo {\n     │...\n 1830│    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n*1831│    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n*1832│    /// reply sends when it removed the entry (see the `retired` field note).\n 1833│    /// Physical teardown stays with the conn-close sweep. Returns whether this\n*1834│    /// call newly retired the row (idempotent; absent row = false).\n 1835│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1836│    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1837│        let Some(entry) = self\n 1838│            .shared\n 1839│            .streams\n     │...\n 1847│        let newly = !entry\n*1848│            .retired\n 1849│            .swap(true, std::sync::atomic::Ordering::SeqCst);\n 1850│        if newly {\n*1851│            // A retired exchange's request bytes are dead weight — free the\n 1852│            // ring; the pinned opener and cursors stay (cheap, bounded).\n 1853│            entry.log.lock().unwrap().ring.clear();\n 1854│        }\n     │...\n 1864│        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n*1865│        // A retired row answers no-such-stream: classification exists only to\n*1866│        // serve, and a retired exchange must never be served again.\n*1867│        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n 1868│            return None;\n 1869│        }\n 1870│        let line = entry.log.lock().unwrap().opener_line();\n     │...\n 2385│\n*2386│    // [unit->REQ-REDISPATCH-FINISHED-RETIRE] retirement hides EXACTLY the\n*2387│    // named row from dispatch eligibility: the retired stream leaves the\n 2388│    // dispatch enumeration (stream_infos) while the active sibling stays\n*2389│    // claimable, a second retire is a no-op, and the pinned-opener query\n 2390│    // answers no-such-stream afterwards. Retirement is visibility, not\n 2391│    // teardown — the transport half of the contract is the sibling test\n*2392│    // `retired_row_still_flushes_a_late_reply`.\n 2393│    #[test]\n*2394│    fn retire_hides_the_row_while_active_rows_stay() {\n 2395│        let host = NetHost::start(hermetic(&Identity::generate())).expect(\"host start\");\n 2396│        let (owner, shell) = host.open_loopback_pair().expect(\"open pair\");\n 2397│        host.send_stream(owner, b\"{\\\"kind\\\":\\\"request\\\",\\\"session_id\\\":1}\\n\", false)\n     │...\n 2413│\n*2414│        assert!(host.retire_stream(shell), \"first retire hides the row\");\n 2415│        let ids: Vec<u64> = host.stream_infos().iter().map(|s| s.stream_id).collect();\n## notif.rs\n 220│    local_node: &str,\n*221│    regs: &std::collections::BTreeMap<String, spt_net::net::registry::SubnetRegistry>,\n 222│    now_ms: u64,\n 223│) -> Result<FirstFireOutcome, String> {\n 224│    let Some(target) = crate::presence::most_recently_active_in_subnet(\n    │...\n 693│\n*694│            let mut reg = spt_net::net::registry::SubnetRegistry::new();\n 695│            reg.merge_instance(\n 696│                \"ling\",\n 697│                spt_net::net::registry::Instance {\n## notifsync.rs\n 38│    /// The membership directory (Mesh-D5, REQ-MESH-5) — authorization is live\n*39│    /// roster membership, not a pairwise pin (see `RegistryGatePolicy::roster`).\n 40│    pub roster: RosterStore,\n 41│}\n 42│\n## presence.rs\n  32│\n *33│use spt_net::net::registry::SubnetRegistry;\n  34│\n  35│use crate::consent::ConsentTarget;\n  36│use crate::notif::{most_recently_active_where, NotifSurfacePolicy};\n    │...\n  57│/// exactly the pre-D6 behavior (the stale-tolerant reader contract).\n *58│pub fn load_registry_snapshots(dir: &Path) -> BTreeMap<String, SubnetRegistry> {\n  59│    let mut out = BTreeMap::new();\n  60│    let Ok(entries) = std::fs::read_dir(dir) else {\n  61│        return out;\n    │...\n  73│        };\n *74│        let Ok(reg) = serde_json::from_str::<SubnetRegistry>(&raw) else {\n  75│            continue;\n  76│        };\n  77│        out.insert(stem.to_string(), reg);\n    │...\n 107│    owlery: &Path,\n*108│    regs: &BTreeMap<String, SubnetRegistry>,\n 109│    local_node: &str,\n 110│    admit_local: impl Fn(&str) -> bool,\n 111│    admit_row: impl Fn(&str, &str) -> bool,\n    │...\n 163│    owlery: &Path,\n*164│    regs: &BTreeMap<String, SubnetRegistry>,\n 165│    local_node: &str,\n 166│    policy: &NotifSurfacePolicy,\n 167│    subnet: &str,\n    │...\n 182│    owlery: &Path,\n*183│    regs: &BTreeMap<String, SubnetRegistry>,\n 184│    local_node: &str,\n 185│    policy: &NotifSurfacePolicy,\n 186│) -> Option<PresenceTarget> {\n    │...\n 253│\n*254│        let mut reg = SubnetRegistry::new();\n 255│        reg.merge_instance(\"ling\", row(\"remote-hex\", Status::Active, Some(5_000)));\n 256│        let mut regs = BTreeMap::new();\n 257│        regs.insert(\"home\".to_string(), reg);\n    │...\n 291│        live_perch(&owlery, \"ling\", Some(1_000));\n*292│        let mut reg = SubnetRegistry::new();\n 293│        // Own-node row with an absurdly fresh stamp: skipped (stale echo of\n 294│        // our own advertisement must not shadow the live local read).\n 295│        reg.merge_instance(\"ling\", row(\"my-hex\", Status::Active, Some(99_000)));\n    │...\n 320│\n*321│        let mut home = SubnetRegistry::new();\n 322│        home.merge_instance(\"oak\", row(\"remote-hex\", Status::Active, Some(2_000)));\n*323│        let mut work = SubnetRegistry::new();\n 324│        work.merge_instance(\"oak\", row(\"remote-hex\", Status::Active, Some(99_000)));\n 325│        let mut regs = BTreeMap::new();\n 326│        regs.insert(\"home\".to_string(), home);\n    │...\n 351│        std::fs::write(d.join(\"note.txt\"), \"{}\").unwrap();\n*352│        let mut reg = SubnetRegistry::new();\n 353│        reg.merge_instance(\"ling\", row(\"n1\", Status::Active, Some(5)));\n 354│        std::fs::write(d.join(\"home.json\"), serde_json::to_string(&reg).unwrap()).unwrap();\n 355│        let regs = load_registry_snapshots(&d);\n## projwriter.rs\n 1119│    // same ids, same dirs, same display names, same newest-first order (order\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     │...\n 1166│\n*1167│        // THE ORACLE: the retired picker wiring, reconstructed verbatim from\n 1168│        // the same public APIs it used (git-backed, newest-first).\n 1169│        let owlery = fx.paths.owlery.clone();\n 1170│        let seed_git = fx.paths.seed_git.clone();"},"isError":false,"timestamp":1784271647383}}
{"type":"message","id":"b219b2bd","parentId":"239d16cb","timestamp":"2026-07-17T07:00:47.391Z","message":{"role":"toolResult","toolCallId":"call_GNgpNWps8gjEwQcpGuC48ACz|fc_0a061eb498f0e908016a59d31f3f608196bad9d5b5ec839bdf","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## dispatch.rs\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 18|//! never inferred.\n 19|//!\n 20|//! ## Classification (first-record demux)\n...\n 352|/// request and await the reply on the same stream (sync.rs `request_sync` and\n*353|/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n 354|/// opener), so every pull that arrives while the brain is down reads\n 355|/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n 356|/// across exactly the refresh window this milestone fixes.\n...\n 624|) -> io::Result<Option<serde_json::Value>> {\n*625|    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n 626|        // Pinned: classify from the durable fact. A pinned line that does not\n 627|        // parse is terminally unclassifiable (same contract as the peek path).\n 628|        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n...\n 830|        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n*831|        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n 832|        StreamFamily::Attach => {\n 833|            // The gate subject is the session's OWNING endpoint, resolved\n 834|            // from the broker's table (the spawn's label) — never from wire\n...\n 897|                    // Refuse politely: finish our send side, claim stays.\n*898|                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n 899|                    DispatchOutcome::Served(\"attach refused: unlabeled/unknown session\".into())\n 900|                }\n 901|            }\n...\n 922|                None => {\n*923|                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n 924|                    DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())\n 925|                }\n 926|            }\n...\n 1174|                        };\n*1175|                        let _ = brain.net_stream_send(\n 1176|                            stream_id,\n 1177|                            &reply.encode_line(),\n 1178|                            None,\n...\n 1317|    // the bounded Transient budget. The strings are load-bearing wire facts:\n*1318|    // begin_attach's \"subscriber busy\", subscribe_stream's \"replay halted\",\n 1319|    // send_stream's \"lease canceled\".\n 1320|    #[test]\n 1321|    fn classify_failure_seat_blocked_is_exactly_the_three_discipline_strings() {\n\n## pump/\n### mod.rs\n 49|//! Every pump write is fire-and-forget (`op_id: None`) — a journaled\n*50|//! `net_stream_send` blocks on its ack and DISCARDS interleaved events\n 51|//! (gotcha #1). Stream opens for push feeds carry no op either: the feeds\n 52|//! are idempotent by construction. The sync pull's `open_op` IS durable\n 53|//! (exactly-once open identity), minted from a dedicated [`EpochSource`]\n...\n 784|/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n*785|/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\n 786|/// a SUPERVISED RESTART: a dead BROKER conn restarts the pump; a dead PEER never\n 787|/// does (the decouple W2 delivers).\n 788|// [impl->REQ-PUMP-PEER-ISOLATION]\n...\n 1119|fn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n*1120|    let opened = brain.net_open_stream(conn_id, None)?;\n*1121|    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n 1122|    Ok(())\n 1123|}\n 1124|\n### registry.rs\n 63|/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\n*64|/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\n 65|/// re-advertises its own rows; peers reconverge within one cadence\n 66|/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\n 67|/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10)."}],"details":{"scopePath":"crates/spt-daemon/src/registryhost.rs, crates/spt-daemon/src/pump, crates/spt-daemon/src/dispatch.rs, crates/spt-daemon/src/brainproc.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":13,"fileCount":3,"files":["crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/pump/registry.rs","crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/pump/mod.rs","count":4},{"path":"crates/spt-daemon/src/pump/registry.rs","count":1},{"path":"crates/spt-daemon/src/dispatch.rs","count":8}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## dispatch.rs\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   18│//! never inferred.\n   19│//!\n   20│//! ## Classification (first-record demux)\n     │...\n  352│/// request and await the reply on the same stream (sync.rs `request_sync` and\n *353│/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n  354│/// opener), so every pull that arrives while the brain is down reads\n  355│/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n  356│/// across exactly the refresh window this milestone fixes.\n     │...\n  624│) -> io::Result<Option<serde_json::Value>> {\n *625│    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n  626│        // Pinned: classify from the durable fact. A pinned line that does not\n  627│        // parse is terminally unclassifiable (same contract as the peek path).\n  628│        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n     │...\n  830│        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n *831│        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n  832│        StreamFamily::Attach => {\n  833│            // The gate subject is the session's OWNING endpoint, resolved\n  834│            // from the broker's table (the spawn's label) — never from wire\n     │...\n  897│                    // Refuse politely: finish our send side, claim stays.\n *898│                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n  899│                    DispatchOutcome::Served(\"attach refused: unlabeled/unknown session\".into())\n  900│                }\n  901│            }\n     │...\n  922│                None => {\n *923│                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n  924│                    DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())\n  925│                }\n  926│            }\n     │...\n 1174│                        };\n*1175│                        let _ = brain.net_stream_send(\n 1176│                            stream_id,\n 1177│                            &reply.encode_line(),\n 1178│                            None,\n     │...\n 1317│    // the bounded Transient budget. The strings are load-bearing wire facts:\n*1318│    // begin_attach's \"subscriber busy\", subscribe_stream's \"replay halted\",\n 1319│    // send_stream's \"lease canceled\".\n 1320│    #[test]\n 1321│    fn classify_failure_seat_blocked_is_exactly_the_three_discipline_strings() {\n\n## pump/\n### mod.rs\n   49│//! Every pump write is fire-and-forget (`op_id: None`) — a journaled\n  *50│//! `net_stream_send` blocks on its ack and DISCARDS interleaved events\n   51│//! (gotcha #1). Stream opens for push feeds carry no op either: the feeds\n   52│//! are idempotent by construction. The sync pull's `open_op` IS durable\n   53│//! (exactly-once open identity), minted from a dedicated [`EpochSource`]\n     │...\n  784│/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n *785│/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\n  786│/// a SUPERVISED RESTART: a dead BROKER conn restarts the pump; a dead PEER never\n  787│/// does (the decouple W2 delivers).\n  788│// [impl->REQ-PUMP-PEER-ISOLATION]\n     │...\n 1119│fn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n*1120│    let opened = brain.net_open_stream(conn_id, None)?;\n*1121│    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n 1122│    Ok(())\n 1123│}\n 1124│\n### registry.rs\n 63│/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\n*64│/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\n 65│/// re-advertises its own rows; peers reconverge within one cadence\n 66│/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\n 67│/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10)."},"isError":false,"timestamp":1784271647391}}
{"type":"message","id":"84d01483","parentId":"b219b2bd","timestamp":"2026-07-17T07:00:54.981Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning to read and pump registry feed**"},{"type":"toolCall","id":"call_JY16JPGJ3BhBrIvy5KY693sa|fc_0a061eb498f0e908016a59d326e33481968068e4a84692743f","name":"grep","arguments":{"i":"Locating registry serve function","pattern":"fn serve_registry_feed|pub fn serve_registry_feed","path":"crates/spt-daemon/src/dispatch.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_Ns7e1Vh0moOFMaynDMCyzNGB|fc_0a061eb498f0e908016a59d326e35081969d32e91e733911d4","name":"read","arguments":{"i":"Reading registry pump cadence","path":"crates/spt-daemon/src/pump/registry.rs","selector":"1-180"}},{"type":"toolCall","id":"call_jITde0AvYFJjk1RSTwUKHzPd|fc_0a061eb498f0e908016a59d326e35c8196b278052183c89bf1","name":"read","arguments":{"i":"Reading pump feed send loop","path":"crates/spt-daemon/src/pump/mod.rs","selector":"1080-1140"}},{"type":"toolCall","id":"call_sc6AWRSQ5RQrYmPQM0oCIlTM|fc_0a061eb498f0e908016a59d326e36481968d59cb0e246726f6","name":"read","arguments":{"i":"Reading dispatcher classification","path":"crates/spt-daemon/src/dispatch.rs","selector":"80-170,330-375,615-710"}},{"type":"toolCall","id":"call_oZwGHQTSbWc1FwROpJeN3ywB|fc_0a061eb498f0e908016a59d326e36c8196aff7e3bc9de59cab","name":"grep","arguments":{"i":"Finding registry feed loop","pattern":"RegistryDecoder|RegistryGatePolicy|receive|decode|read_event|NetStreamEof","path":"crates/spt-daemon/src/dispatch.rs","selector":"960-1200","case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_gI3zYhkz8KTBtQ9ZlDgxYYj4|fc_0a061eb498f0e908016a59d326e3748196a3282c3774748e1c","name":"read","arguments":{"i":"Reading registry pump config","path":"crates/spt-daemon/src/config.rs","selector":"130-170,240-300"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":20849,"output":323,"cacheRead":156160,"cacheWrite":0,"totalTokens":177332,"reasoningTokens":13,"cost":{"input":0.104245,"output":0.00969,"cacheRead":0.07808,"cacheWrite":0,"total":0.192015}},"stopReason":"toolUse","timestamp":1784271647437,"responseId":"resp_0a061eb498f0e908016a59d31faaa0819685fe093dd7f2f19c","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d321b2508196a00d252f8a75f3f9","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdMmqbkPf_f9DPHB-FK9EeQVGcgJFiWzrswKOYL7xgjEBxcmrlL_IE-LKwJ8GZGBwrO0xf1z2HiaTXJOKizftBi-aD1pqnNK3RN-09GDQJBwMci1dLsQTNm7Mf7V-XZ4D4vu7y6xY3Ol-qmb3vqGmHnEI9kuAIPDN-mmQy116b9gLjihfwkbJc-cVExKHrCXWQIrSysaTOt0B2Fv0P69td3Enw-ezg6M4hx-TP502mgQ_j-_86tT-7m4LxSYG5twlzh0STOkWxF860nghIkVVIJZ-d2z97sZ9QzqoY-XGqN7nKsnXyouLbauDS6OXgcqXAvrTSOvPFf7QNP4m0kcmNto3VqLmFG92AoyrMJHpjnqssb2miIQyCxmyMDBNpAN6GSIY96b--HbewJT7dUeiogCrPWHwkm96TCTd3zwiTl32O4El3W6mjYrFBw1zfmL_A_xhEYuPBAvVGX817cBPIhNUkAnWddQTiErJr2tDShLH_gH1usMPYRvTNB2VEQbBQABZvnZjETMIyVnU5Z4TvvWtiJqCJ19tUO7Hf5XQj7Cenn4HVrT9w0KFe3BIz4ITpz116tJ-67I2QLB_PI5QlW3DXO0zaYOQ1v-yRGfUgnwFBKU0FDhscr5d-Hw662mFWPxbtrRnujoIAbDth-uO6Ipdj7XKAw6KFThawHrDusLXEZFLqZnb98mG92C8Djy2sFMWFyfTKL1OkJU82LB0X2f0JaTSjGrV8HJjruR_8wTdUl3lS0P0GXtaM2c1l9OBKc3zTr-oot1dXYjYYFw_Kn3rwvZJbiaxuavRsmKYbNH-SibzvdkuiH3A4NjKJoGLGVgvswR0gMKUJdDQUq-QNIZRaiTcQtsXFo9C934l5CYJEdl4raOj-kwm-TBV6SgYVrOkAGXU3LAP9D7xzsupYKTDIS8dp3j2yQNaxk9VzU56HjMlWrw0CZWis-8QPpITEcAMQm7qDrjwiQ7ClB-bTAHzOrm7qpgUL8X9uYHenKyTpE=","summary":[{"type":"summary_text","text":"**Planning to read and pump registry feed**"}]},{"id":"fc_0a061eb498f0e908016a59d326e33481968068e4a84692743f","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating registry serve function\",\"pattern\":\"fn serve_registry_feed|pub fn serve_registry_feed\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_JY16JPGJ3BhBrIvy5KY693sa","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d326e35081969d32e91e733911d4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry pump cadence\",\"path\":\"crates/spt-daemon/src/pump/registry.rs\",\"selector\":\"1-180\"}","call_id":"call_Ns7e1Vh0moOFMaynDMCyzNGB","name":"read"},{"id":"fc_0a061eb498f0e908016a59d326e35c8196b278052183c89bf1","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump feed send loop\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"1080-1140\"}","call_id":"call_jITde0AvYFJjk1RSTwUKHzPd","name":"read"},{"id":"fc_0a061eb498f0e908016a59d326e36481968d59cb0e246726f6","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatcher classification\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"80-170,330-375,615-710\"}","call_id":"call_sc6AWRSQ5RQrYmPQM0oCIlTM","name":"read"},{"id":"fc_0a061eb498f0e908016a59d326e36c8196aff7e3bc9de59cab","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry feed loop\",\"pattern\":\"RegistryDecoder|RegistryGatePolicy|receive|decode|read_event|NetStreamEof\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"960-1200\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_oZwGHQTSbWc1FwROpJeN3ywB","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d326e3748196a3282c3774748e1c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry pump config\",\"path\":\"crates/spt-daemon/src/config.rs\",\"selector\":\"130-170,240-300\"}","call_id":"call_gI3zYhkz8KTBtQ9ZlDgxYYj4","name":"read"}]},"duration":7542.318400010467,"ttft":2275.9431000053883,"contextSnapshot":{"promptTokens":177009,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_JY16JPGJ3BhBrIvy5KY693sa|fc_0a061eb498f0e908016a59d326e33481968068e4a84692743f","toolName":"grep","startedAt":"2026-07-17T07:00:54.982Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Locating registry serve function"},"id":"5bd90c26","parentId":"84d01483","timestamp":"2026-07-17T07:00:54.982Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Ns7e1Vh0moOFMaynDMCyzNGB|fc_0a061eb498f0e908016a59d326e35081969d32e91e733911d4","toolName":"read","startedAt":"2026-07-17T07:00:54.982Z","args":{"path":"crates/spt-daemon/src/pump/registry.rs"},"intent":"Reading registry pump cadence"},"id":"ec4d2d90","parentId":"5bd90c26","timestamp":"2026-07-17T07:00:54.982Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_jITde0AvYFJjk1RSTwUKHzPd|fc_0a061eb498f0e908016a59d326e35c8196b278052183c89bf1","toolName":"read","startedAt":"2026-07-17T07:00:54.982Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump feed send loop"},"id":"fb70305a","parentId":"ec4d2d90","timestamp":"2026-07-17T07:00:54.982Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_sc6AWRSQ5RQrYmPQM0oCIlTM|fc_0a061eb498f0e908016a59d326e36481968d59cb0e246726f6","toolName":"read","startedAt":"2026-07-17T07:00:54.982Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatcher classification"},"id":"c40ad045","parentId":"fb70305a","timestamp":"2026-07-17T07:00:54.982Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_oZwGHQTSbWc1FwROpJeN3ywB|fc_0a061eb498f0e908016a59d326e36c8196aff7e3bc9de59cab","toolName":"grep","startedAt":"2026-07-17T07:00:54.982Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Finding registry feed loop"},"id":"e9d59e31","parentId":"c40ad045","timestamp":"2026-07-17T07:00:54.982Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_gI3zYhkz8KTBtQ9ZlDgxYYj4|fc_0a061eb498f0e908016a59d326e3748196a3282c3774748e1c","toolName":"read","startedAt":"2026-07-17T07:00:54.982Z","args":{"path":"crates/spt-daemon/src/config.rs"},"intent":"Reading registry pump config"},"id":"da6305f6","parentId":"e9d59e31","timestamp":"2026-07-17T07:00:54.982Z"}
{"type":"message","id":"ec6c0066","parentId":"da6305f6","timestamp":"2026-07-17T07:00:54.985Z","message":{"role":"toolResult","toolCallId":"call_JY16JPGJ3BhBrIvy5KY693sa|fc_0a061eb498f0e908016a59d326e33481968068e4a84692743f","toolName":"grep","content":[{"type":"text","text":" 983|// [impl->REQ-INST-7]\n*984|fn serve_registry_feed(\n 985|    brain: &mut Brain,\n 986|    stream_id: u64,\n 987|    origin: &str,"}],"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":1,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":1}],"truncated":false,"displayContent":" 983│// [impl->REQ-INST-7]\n*984│fn serve_registry_feed(\n 985│    brain: &mut Brain,\n 986│    stream_id: u64,\n 987│    origin: &str,"},"isError":false,"timestamp":1784271654985}}
{"type":"message","id":"08378364","parentId":"ec6c0066","timestamp":"2026-07-17T07:00:54.986Z","message":{"role":"toolResult","toolCallId":"call_oZwGHQTSbWc1FwROpJeN3ywB|fc_0a061eb498f0e908016a59d326e36c8196aff7e3bc9de59cab","toolName":"grep","content":[{"type":"text","text":" 969|\n*970|/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into\n 971|/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧\n 972|/// origin trusted in that subnet), until the peer finishes.\n 973|///\n...\n 989|) -> DispatchOutcome {\n*990|    let policy = RegistryGatePolicy::load();\n 991|    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 992|        return DispatchOutcome::Failed(e.to_string());\n 993|    }\n*994|    let mut decoder = RegistryDecoder::new();\n 995|    let mut merged = 0usize;\n 996|    loop {\n*997|        match brain.read_event() {\n 998|            Ok(BrokerEvent::NetStreamData {\n 999|                stream_id: sid,\n 1000|                bytes,\n...\n 1002|            }) if sid == stream_id => {\n*1003|                let records = decoder.push(&bytes);\n 1004|                if records.is_empty() {\n 1005|                    continue;\n 1006|                }\n...\n 1040|            }\n*1041|            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1042|                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\n 1043|            }\n 1044|            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n...\n 1050|\n*1051|/// Notif feed arm: decode rows as they arrive, apply each batch under the\n 1052|/// fail-closed gate, until the peer finishes. The policy re-loads per feed\n 1053|/// (not per record) — the same freshness the other arms get per request.\n 1054|///\n...\n 1078|    }\n*1079|    let mut decoder = NotifDecoder::new();\n 1080|    let mut applied = 0usize;\n 1081|    loop {\n*1082|        match brain.read_event() {\n 1083|            Ok(BrokerEvent::NetStreamData {\n 1084|                stream_id: sid,\n 1085|                bytes,\n...\n 1087|            }) if sid == stream_id => {\n*1088|                let records = decoder.push(&bytes);\n 1089|                if records.is_empty() {\n 1090|                    continue;\n 1091|                }\n...\n 1099|            }\n*1100|            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1101|                return DispatchOutcome::Served(format!(\"notif feed: {applied} record(s)\"));\n 1102|            }\n 1103|            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n...\n 1138|\n*1139|/// WAN message arm: decode `WanMessage` lines, funnel each through the\n 1140|/// access-gate + op-id-dedup path, until the peer finishes.\n 1141|// [impl->REQ-NET-1]\n 1142|fn serve_wan_feed(\n...\n 1151|    }\n*1152|    let mut decoder = WanDecoder::new();\n 1153|    let mut handled = 0usize;\n 1154|    let mut replied = false;\n 1155|    loop {\n*1156|        match brain.read_event() {\n 1157|            Ok(BrokerEvent::NetStreamData {\n 1158|                stream_id: sid,\n 1159|                bytes,\n...\n 1161|            }) if sid == stream_id => {\n*1162|                for msg in decoder.push(&bytes) {\n*1163|                    let outcome = receive_wan(&msg, origin, &paths.owlery, registry);\n 1164|                    handled += 1;\n 1165|                    // #9/#10 (REQ-WAN-SEND-DELIVERY): reply the outcome so the\n 1166|                    // sender reports an HONEST SENT (was: outcome discarded, sender\n...\n 1184|            }\n*1185|            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1186|                return DispatchOutcome::Served(format!(\"wan feed: {handled} record(s)\"));\n 1187|            }\n 1188|            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),"}],"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":17,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":17}],"truncated":false,"displayContent":"  969│\n *970│/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into\n  971│/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧\n  972│/// origin trusted in that subnet), until the peer finishes.\n  973│///\n     │...\n  989│) -> DispatchOutcome {\n *990│    let policy = RegistryGatePolicy::load();\n  991│    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n  992│        return DispatchOutcome::Failed(e.to_string());\n  993│    }\n *994│    let mut decoder = RegistryDecoder::new();\n  995│    let mut merged = 0usize;\n  996│    loop {\n *997│        match brain.read_event() {\n  998│            Ok(BrokerEvent::NetStreamData {\n  999│                stream_id: sid,\n 1000│                bytes,\n     │...\n 1002│            }) if sid == stream_id => {\n*1003│                let records = decoder.push(&bytes);\n 1004│                if records.is_empty() {\n 1005│                    continue;\n 1006│                }\n     │...\n 1040│            }\n*1041│            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1042│                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\n 1043│            }\n 1044│            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n     │...\n 1050│\n*1051│/// Notif feed arm: decode rows as they arrive, apply each batch under the\n 1052│/// fail-closed gate, until the peer finishes. The policy re-loads per feed\n 1053│/// (not per record) — the same freshness the other arms get per request.\n 1054│///\n     │...\n 1078│    }\n*1079│    let mut decoder = NotifDecoder::new();\n 1080│    let mut applied = 0usize;\n 1081│    loop {\n*1082│        match brain.read_event() {\n 1083│            Ok(BrokerEvent::NetStreamData {\n 1084│                stream_id: sid,\n 1085│                bytes,\n     │...\n 1087│            }) if sid == stream_id => {\n*1088│                let records = decoder.push(&bytes);\n 1089│                if records.is_empty() {\n 1090│                    continue;\n 1091│                }\n     │...\n 1099│            }\n*1100│            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1101│                return DispatchOutcome::Served(format!(\"notif feed: {applied} record(s)\"));\n 1102│            }\n 1103│            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n     │...\n 1138│\n*1139│/// WAN message arm: decode `WanMessage` lines, funnel each through the\n 1140│/// access-gate + op-id-dedup path, until the peer finishes.\n 1141│// [impl->REQ-NET-1]\n 1142│fn serve_wan_feed(\n     │...\n 1151│    }\n*1152│    let mut decoder = WanDecoder::new();\n 1153│    let mut handled = 0usize;\n 1154│    let mut replied = false;\n 1155│    loop {\n*1156│        match brain.read_event() {\n 1157│            Ok(BrokerEvent::NetStreamData {\n 1158│                stream_id: sid,\n 1159│                bytes,\n     │...\n 1161│            }) if sid == stream_id => {\n*1162│                for msg in decoder.push(&bytes) {\n*1163│                    let outcome = receive_wan(&msg, origin, &paths.owlery, registry);\n 1164│                    handled += 1;\n 1165│                    // #9/#10 (REQ-WAN-SEND-DELIVERY): reply the outcome so the\n 1166│                    // sender reports an HONEST SENT (was: outcome discarded, sender\n     │...\n 1184│            }\n*1185│            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1186│                return DispatchOutcome::Served(format!(\"wan feed: {handled} record(s)\"));\n 1187│            }\n 1188│            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),"},"isError":false,"timestamp":1784271654986}}
{"type":"message","id":"cb228f9c","parentId":"08378364","timestamp":"2026-07-17T07:00:54.997Z","message":{"role":"toolResult","toolCallId":"call_sc6AWRSQ5RQrYmPQM0oCIlTM|fc_0a061eb498f0e908016a59d326e36481968d59cb0e246726f6","toolName":"read","content":[{"type":"text","text":"use crate::relcache::ReleaseCache;\nuse crate::sync::{serve_sync, SyncPolicy};\nuse crate::wan::receive_wan;\nuse crate::xfer::serve_xfer;\n\n/// Poll cadence for the stream-table watch (the dispatcher's only busy-wait;\n/// workers block on their stream's event feed).\npub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n\n/// What protocol a peer-initiated stream speaks, by its first record's shape.\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum StreamFamily {\n    /// A context sync pull (`SyncRecord::Request`).\n    Sync,\n    /// An update pull (`UpdRecord::Query`).\n    Update,\n    /// A notif replication feed (`NotifRecord::Row`).\n    Notif,\n    /// A WAN message feed (untagged `WanMessage` lines).\n    WanMsg,\n    /// A registry replication feed (untagged `RegistryUpdate` lines).\n    Registry,\n    /// A remote-drive attach (`AttachRecord::Request`).\n    Attach,\n    /// A file transfer (`XferRecord::Fetch`/`Push`).\n    Xfer,\n    /// A remote rest op (`RestRecord::Request` — suspend/wake from another\n    /// node, M5-D5b).\n    Rest,\n    /// A cross-node shell-link op (`ShellLinkRecord::Request` — relink/cmd\n    /// against an owner's shell on this node, M5-D8c).\n    ShellLink,\n    /// A subnet-scoped liveness probe (`ServeProbeRecord::Request` — \"serving\n    /// subnet X?\", the `--nodes` view's detach-aware refinement, REQ-SUBNET-5).\n    ServeProbe,\n    /// Unclassifiable — dropped.\n    Unknown,\n}\n\n/// Classify one decoded first line by shape (module-docs demux table).\npub fn classify_first_line(line: &serde_json::Value) -> StreamFamily {\n    match line.get(\"kind\").and_then(|k| k.as_str()) {\n        Some(\"request\") if line.get(\"sync_id\").is_some() => StreamFamily::Sync,\n        Some(\"request\") if line.get(\"session_id\").is_some() => StreamFamily::Attach,\n        Some(\"request\") if line.get(\"endpoint\").is_some() && line.get(\"event\").is_some() => {\n            StreamFamily::Rest\n        }\n        Some(\"request\") if line.get(\"owner\").is_some() && line.get(\"shell_ref\").is_some() => {\n            StreamFamily::ShellLink\n        }\n        Some(\"request\") if line.get(\"serve_probe\").is_some() => StreamFamily::ServeProbe,\n        Some(\"query\") => StreamFamily::Update,\n        // The status-only convergence query rides the update family (M8\n        // decision 19, REQ-UPD-6) — same serve loop, no artifact bytes.\n        Some(\"status_query\") => StreamFamily::Update,\n        Some(\"row\") => StreamFamily::Notif,\n        Some(\"fetch\") | Some(\"push\") => StreamFamily::Xfer,\n        Some(_) => StreamFamily::Unknown,\n        None => {\n            if line.get(\"target\").is_some() && line.get(\"op_id\").is_some() {\n                StreamFamily::WanMsg\n            } else if line.get(\"subnet\").is_some() && line.get(\"instance\").is_some() {\n                StreamFamily::Registry\n            } else if line.get(\"subnet\").is_some()\n                && line.get(\"node\").is_some()\n                && line.get(\"label\").is_some()\n            {\n                // A node-level label feed (REQ-SUBNET-3): an endpoint-less peer\n                // sends label records first (no instance rows), so the feed's\n                // first line is a NodeLabelUpdate. Same serve arm, same gate.\n                StreamFamily::Registry\n            } else {\n                StreamFamily::Unknown\n            }\n        }\n    }\n}\n\n/// Why a dispatched stream's worker ended — loud + typed, never silent.\n#[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…\nfn outcome_transition(\n…\n) -> ClaimState {\n    match outcome {\n…\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\n            FailClass::SeatBlocked => ClaimState::Retry {\n…\n            },\n            FailClass::Transient => {\n                let attempts = attempts + 1;\n                if attempts >= MAX_DISPATCH_ATTEMPTS {\n                    ClaimState::Terminal\n                } else {\n                    ClaimState::Retry {\n                        attempts,\n                        next_at: now + retry_backoff(attempts),\n                    }\n                }\n            }\n        },\n    }\n}\n\n/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's\n/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n/// redispatch — retire unserved, never replay?\n///\n/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n/// would be a regression: the request/reply families FIN their send WITH the\n/// request and await the reply on the same stream (sync.rs `request_sync` and\n/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n/// opener), so every pull that arrives while the brain is down reads\n/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n/// across exactly the refresh window this milestone fixes.\n///\n/// The steal class is ATTACH-specific: `finished` on an attach stream is the\n/// operator's clean detach — its exchange is definitionally over, and a\n/// replay takes a live controller (KNOWN-HAZARDS 7.41: the pre-existing\n/// backlog on long-lived conns, and the brain-down-detach window that\n/// Served-report retirement can never see). So: finished + Attach = terminal\n/// (retired unserved via the worker's Served report); finished + anything\n/// else = a pending request — serve it.\n// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\nfn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {\n    finished && family == StreamFamily::Attach\n}\n\n/// TEST-RIG-ONLY (the D3 regression): `SPT_DISPATCH_INJECT_TRANSIENT_ONCE`\n/// set at dispatcher start makes exactly ONE worker fail before setup —\n/// proving a transient worker-start failure requeues and recovers through\n/// the REAL claim path. Never set in production; the latch arms once per\n/// process and disarms on first take.\n…\n/// The stream's first NDJSON line, restart-durable (ADR-0038 B,\n/// REQ-STREAM-OPENER-DURABLE): read the broker-pinned opener fact first —\n/// it survives any ring roll — and fall back to the ring peek only when the\n/// broker predates the verb (KH-2.3 N-1 window). `Ok(None)` = unclassifiable\n/// (terminal); `Err` = transient (the claim requeues bounded).\nfn first_line(\n    broker_name: &str,\n    stream_id: u64,\n    floor_seq: u64,\n) -> io::Result<Option<serde_json::Value>> {\n    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n        // Pinned: classify from the durable fact. A pinned line that does not\n        // parse is terminally unclassifiable (same contract as the peek path).\n        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n        // The broker holds the stream but no opener is pinned yet (first\n        // newline still in flight, or the capture gave up bounded). The\n        // next_seq guard proved bytes exist, so treat as transient — the\n        // bounded claim retry re-reads it shortly, and a stream that never\n        // pins goes terminal when the budget is spent (no hot loop).\n        Ok(None) => {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id}: opener not pinned yet\"\n            )))\n        }\n        // ONLY the old broker's explicit unknown-verb answer falls through\n        // to the ring peek (ADR-0038 Amendment fix 1) — the pre-Amendment\n        // broad Err(_) arm caught transport timeout/EOF/poison too, and each\n        // retry then manufactured a throwaway replay subscriber against a\n        // possibly-wedged conn (the v0.34 stall engine's first gear).\n        // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n        Err(e) if is_unsupported_verb(&e) => {}\n        // Everything else is a transient: Failed -> classified bounded\n        // requeue, never a second replay subscriber.\n        Err(e) => return Err(e),\n    }\n    peek_first_line(broker_name, stream_id, floor_seq)\n}\n\n/// Peek the stream's first retained NDJSON line on a throwaway brain\n/// connection (the pre-ADR-0038 fallback — subject to ring eviction, kept\n/// only for the older-broker window). Subscribes from `floor_seq` (the oldest\n/// retained chunk) so a rolled ring replays instead of tripping the brain's\n/// gap check.\nfn peek_first_line(\n    broker_name: &str,\n    stream_id: u64,\n    floor_seq: u64,\n) -> io::Result<Option<serde_json::Value>> {\n    let mut brain = connect(broker_name)?;\n    brain.net_stream_subscribe(stream_id, floor_seq)?;\n    let mut buf: Vec<u8> = Vec::new();\n    loop {\n        match brain.read_event()? {\n            BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            } if sid == stream_id => {\n                buf.extend_from_slice(&bytes);\n                if let Some(nl) = buf.iter().position(|&b| b == b'\\n') {\n                    return Ok(serde_json::from_slice(&buf[..nl]).ok());\n                }\n            }\n            BrokerEvent::NetStreamEof { stream_id: sid, .. } if sid == stream_id => {\n                // Finished without a complete line: classify what we have\n                // (a line without a trailing newline before EOF still counts).\n                return Ok(serde_json::from_slice(&buf).ok());\n            }\n            BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n            _ => {}\n        }\n    }\n}\n\n/// One claimed stream's worker: peek → classify → run the family's serve\n/// loop on a fresh brain connection.\n/// The endpoint identity a stream's opener names, where the family carries\n/// one (Amendment fix 9 — hertz's live catch on stream 7058 could not bind\n/// the stalled stream to an endpoint; this key is what makes the next catch\n/// a bound stream→endpoint proof). Families without an endpoint concept\n/// answer `None` honestly.\n// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\nfn line_endpoint(family: StreamFamily, line: &serde_json::Value) -> Option<String> {\n    let key = match family {\n        StreamFamily::Attach => \"endpoint_id\",\n        StreamFamily::Rest | StreamFamily::Xfer => \"endpoint\",\n        StreamFamily::ShellLink => \"owner\",\n        StreamFamily::WanMsg => \"target\",\n        _ => return None,\n    };\n    line.get(key)\n        .and_then(|v| v.as_str())\n        .filter(|s| !s.is_empty())\n        .map(str::to_string)\n}\n"}],"details":{"displayContent":{"text":"use crate::relcache::ReleaseCache;\nuse crate::sync::{serve_sync, SyncPolicy};\nuse crate::wan::receive_wan;\nuse crate::xfer::serve_xfer;\n\n/// Poll cadence for the stream-table watch (the dispatcher's only busy-wait;\n/// workers block on their stream's event feed).\npub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n\n/// What protocol a peer-initiated stream speaks, by its first record's shape.\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum StreamFamily {\n    /// A context sync pull (`SyncRecord::Request`).\n    Sync,\n    /// An update pull (`UpdRecord::Query`).\n    Update,\n    /// A notif replication feed (`NotifRecord::Row`).\n    Notif,\n    /// A WAN message feed (untagged `WanMessage` lines).\n    WanMsg,\n    /// A registry replication feed (untagged `RegistryUpdate` lines).\n    Registry,\n    /// A remote-drive attach (`AttachRecord::Request`).\n    Attach,\n    /// A file transfer (`XferRecord::Fetch`/`Push`).\n    Xfer,\n    /// A remote rest op (`RestRecord::Request` — suspend/wake from another\n    /// node, M5-D5b).\n    Rest,\n    /// A cross-node shell-link op (`ShellLinkRecord::Request` — relink/cmd\n    /// against an owner's shell on this node, M5-D8c).\n    ShellLink,\n    /// A subnet-scoped liveness probe (`ServeProbeRecord::Request` — \"serving\n    /// subnet X?\", the `--nodes` view's detach-aware refinement, REQ-SUBNET-5).\n    ServeProbe,\n    /// Unclassifiable — dropped.\n    Unknown,\n}\n\n/// Classify one decoded first line by shape (module-docs demux table).\npub fn classify_first_line(line: &serde_json::Value) -> StreamFamily {\n    match line.get(\"kind\").and_then(|k| k.as_str()) {\n        Some(\"request\") if line.get(\"sync_id\").is_some() => StreamFamily::Sync,\n        Some(\"request\") if line.get(\"session_id\").is_some() => StreamFamily::Attach,\n        Some(\"request\") if line.get(\"endpoint\").is_some() && line.get(\"event\").is_some() => {\n            StreamFamily::Rest\n        }\n        Some(\"request\") if line.get(\"owner\").is_some() && line.get(\"shell_ref\").is_some() => {\n            StreamFamily::ShellLink\n        }\n        Some(\"request\") if line.get(\"serve_probe\").is_some() => StreamFamily::ServeProbe,\n        Some(\"query\") => StreamFamily::Update,\n        // The status-only convergence query rides the update family (M8\n        // decision 19, REQ-UPD-6) — same serve loop, no artifact bytes.\n        Some(\"status_query\") => StreamFamily::Update,\n        Some(\"row\") => StreamFamily::Notif,\n        Some(\"fetch\") | Some(\"push\") => StreamFamily::Xfer,\n        Some(_) => StreamFamily::Unknown,\n        None => {\n            if line.get(\"target\").is_some() && line.get(\"op_id\").is_some() {\n                StreamFamily::WanMsg\n            } else if line.get(\"subnet\").is_some() && line.get(\"instance\").is_some() {\n                StreamFamily::Registry\n            } else if line.get(\"subnet\").is_some()\n                && line.get(\"node\").is_some()\n                && line.get(\"label\").is_some()\n            {\n                // A node-level label feed (REQ-SUBNET-3): an endpoint-less peer\n                // sends label records first (no instance rows), so the feed's\n                // first line is a NodeLabelUpdate. Same serve arm, same gate.\n                StreamFamily::Registry\n            } else {\n                StreamFamily::Unknown\n            }\n        }\n    }\n}\n\n/// Why a dispatched stream's worker ended — loud + typed, never silent.\n#[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…\nfn outcome_transition(\n…\n) -> ClaimState {\n    match outcome {\n…\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\n            FailClass::SeatBlocked => ClaimState::Retry {\n…\n            },\n            FailClass::Transient => {\n                let attempts = attempts + 1;\n                if attempts >= MAX_DISPATCH_ATTEMPTS {\n                    ClaimState::Terminal\n                } else {\n                    ClaimState::Retry {\n                        attempts,\n                        next_at: now + retry_backoff(attempts),\n                    }\n                }\n            }\n        },\n    }\n}\n\n/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's\n/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n/// redispatch — retire unserved, never replay?\n///\n/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n/// would be a regression: the request/reply families FIN their send WITH the\n/// request and await the reply on the same stream (sync.rs `request_sync` and\n/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n/// opener), so every pull that arrives while the brain is down reads\n/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n/// across exactly the refresh window this milestone fixes.\n///\n/// The steal class is ATTACH-specific: `finished` on an attach stream is the\n/// operator's clean detach — its exchange is definitionally over, and a\n/// replay takes a live controller (KNOWN-HAZARDS 7.41: the pre-existing\n/// backlog on long-lived conns, and the brain-down-detach window that\n/// Served-report retirement can never see). So: finished + Attach = terminal\n/// (retired unserved via the worker's Served report); finished + anything\n/// else = a pending request — serve it.\n// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\nfn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {\n    finished && family == StreamFamily::Attach\n}\n\n/// TEST-RIG-ONLY (the D3 regression): `SPT_DISPATCH_INJECT_TRANSIENT_ONCE`\n/// set at dispatcher start makes exactly ONE worker fail before setup —\n/// proving a transient worker-start failure requeues and recovers through\n/// the REAL claim path. Never set in production; the latch arms once per\n/// process and disarms on first take.\n…\n/// The stream's first NDJSON line, restart-durable (ADR-0038 B,\n/// REQ-STREAM-OPENER-DURABLE): read the broker-pinned opener fact first —\n/// it survives any ring roll — and fall back to the ring peek only when the\n/// broker predates the verb (KH-2.3 N-1 window). `Ok(None)` = unclassifiable\n/// (terminal); `Err` = transient (the claim requeues bounded).\nfn first_line(\n    broker_name: &str,\n    stream_id: u64,\n    floor_seq: u64,\n) -> io::Result<Option<serde_json::Value>> {\n    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n        // Pinned: classify from the durable fact. A pinned line that does not\n        // parse is terminally unclassifiable (same contract as the peek path).\n        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n        // The broker holds the stream but no opener is pinned yet (first\n        // newline still in flight, or the capture gave up bounded). The\n        // next_seq guard proved bytes exist, so treat as transient — the\n        // bounded claim retry re-reads it shortly, and a stream that never\n        // pins goes terminal when the budget is spent (no hot loop).\n        Ok(None) => {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id}: opener not pinned yet\"\n            )))\n        }\n        // ONLY the old broker's explicit unknown-verb answer falls through\n        // to the ring peek (ADR-0038 Amendment fix 1) — the pre-Amendment\n        // broad Err(_) arm caught transport timeout/EOF/poison too, and each\n        // retry then manufactured a throwaway replay subscriber against a\n        // possibly-wedged conn (the v0.34 stall engine's first gear).\n        // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n        Err(e) if is_unsupported_verb(&e) => {}\n        // Everything else is a transient: Failed -> classified bounded\n        // requeue, never a second replay subscriber.\n        Err(e) => return Err(e),\n    }\n    peek_first_line(broker_name, stream_id, floor_seq)\n}\n\n/// Peek the stream's first retained NDJSON line on a throwaway brain\n/// connection (the pre-ADR-0038 fallback — subject to ring eviction, kept\n/// only for the older-broker window). Subscribes from `floor_seq` (the oldest\n/// retained chunk) so a rolled ring replays instead of tripping the brain's\n/// gap check.\nfn peek_first_line(\n    broker_name: &str,\n    stream_id: u64,\n    floor_seq: u64,\n) -> io::Result<Option<serde_json::Value>> {\n    let mut brain = connect(broker_name)?;\n    brain.net_stream_subscribe(stream_id, floor_seq)?;\n    let mut buf: Vec<u8> = Vec::new();\n    loop {\n        match brain.read_event()? {\n            BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            } if sid == stream_id => {\n                buf.extend_from_slice(&bytes);\n                if let Some(nl) = buf.iter().position(|&b| b == b'\\n') {\n                    return Ok(serde_json::from_slice(&buf[..nl]).ok());\n                }\n            }\n            BrokerEvent::NetStreamEof { stream_id: sid, .. } if sid == stream_id => {\n                // Finished without a complete line: classify what we have\n                // (a line without a trailing newline before EOF still counts).\n                return Ok(serde_json::from_slice(&buf).ok());\n            }\n            BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n            _ => {}\n        }\n    }\n}\n\n/// One claimed stream's worker: peek → classify → run the family's serve\n/// loop on a fresh brain connection.\n/// The endpoint identity a stream's opener names, where the family carries\n/// one (Amendment fix 9 — hertz's live catch on stream 7058 could not bind\n/// the stalled stream to an endpoint; this key is what makes the next catch\n/// a bound stream→endpoint proof). Families without an endpoint concept\n/// answer `None` honestly.\n// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\nfn line_endpoint(family: StreamFamily, line: &serde_json::Value) -> Option<String> {\n    let key = match family {\n        StreamFamily::Attach => \"endpoint_id\",\n        StreamFamily::Rest | StreamFamily::Xfer => \"endpoint\",\n        StreamFamily::ShellLink => \"owner\",\n        StreamFamily::WanMsg => \"target\",\n        _ => return None,\n    };\n    line.get(key)\n        .and_then(|v| v.as_str())\n        .filter(|s| !s.is_empty())\n        .map(str::to_string)\n}\n","startLine":80,"lineNumbers":[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,null,318,null,323,324,null,326,327,null,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,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"}}},"isError":false,"timestamp":1784271654997}}
{"type":"message","id":"1b10538a","parentId":"cb228f9c","timestamp":"2026-07-17T07:00:55.005Z","message":{"role":"toolResult","toolCallId":"call_gI3zYhkz8KTBtQ9ZlDgxYYj4|fc_0a061eb498f0e908016a59d326e3748196a3282c3774748e1c","toolName":"read","content":[{"type":"text","text":"/// (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…\n}\n…\n    /// degrades to the default (a broken config must never wedge the daemon).\n    pub fn load_from(path: &Path) -> Self {\n        let Ok(raw) = std::fs::read_to_string(path) else {\n            return Self::default();\n        };\n        let file: DaemonConfigFile = match serde_json::from_str(&raw) {\n            Ok(f) => f,\n            Err(_) => return Self::default(),\n        };\n        Self::from_file(file)\n    }\n\n    fn from_file(file: DaemonConfigFile) -> Self {\n        let d = DaemonConfig::default();\n        DaemonConfig {\n            pulse_period: file\n                .pulse_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.pulse_period),\n            protection_window_ms: file.protection_window_ms.unwrap_or(d.protection_window_ms),\n            crash_grace: file\n                .crash_grace_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.crash_grace),\n            full_auto_update: file.full_auto_update.unwrap_or(d.full_auto_update),\n            relay: match file.relay.as_deref() {\n                Some(\"disabled\") => RelayChoice::Disabled,\n                // \"n0\", absent, or an unrecognized future value → the default.\n                _ => d.relay,\n            },\n            peer_pump: file.peer_pump.unwrap_or(d.peer_pump),\n            registry_pump_period: file\n                .registry_pump_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.registry_pump_period),\n            registry_evict_after: file\n                .registry_evict_after_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.registry_evict_after),\n            notif_pump_period: file\n                .notif_pump_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.notif_pump_period),\n            sync_pull_period: file\n                .sync_pull_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.sync_pull_period),\n            update_check_period: file\n                .update_check_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.update_check_period),\n            auto_suspend_after_ms: file.auto_suspend_after_ms,\n            resources_blurb: file.resources_blurb,\n            detached_subnets: file.detached_subnets.unwrap_or_default(),\n            worker_reap_ttl_secs: file.worker_reap_ttl_secs.unwrap_or(d.worker_reap_ttl_secs),\n            startup_endpoints: file.startup_endpoints.unwrap_or_default(),\n            docs_port: file.docs_port,\n        }\n    }\n\n    /// Persist this config to an explicit path (for `spt` to write the knob)."}],"details":{"displayContent":{"text":"/// (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…\n}\n…\n    /// degrades to the default (a broken config must never wedge the daemon).\n    pub fn load_from(path: &Path) -> Self {\n        let Ok(raw) = std::fs::read_to_string(path) else {\n            return Self::default();\n        };\n        let file: DaemonConfigFile = match serde_json::from_str(&raw) {\n            Ok(f) => f,\n            Err(_) => return Self::default(),\n        };\n        Self::from_file(file)\n    }\n\n    fn from_file(file: DaemonConfigFile) -> Self {\n        let d = DaemonConfig::default();\n        DaemonConfig {\n            pulse_period: file\n                .pulse_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.pulse_period),\n            protection_window_ms: file.protection_window_ms.unwrap_or(d.protection_window_ms),\n            crash_grace: file\n                .crash_grace_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.crash_grace),\n            full_auto_update: file.full_auto_update.unwrap_or(d.full_auto_update),\n            relay: match file.relay.as_deref() {\n                Some(\"disabled\") => RelayChoice::Disabled,\n                // \"n0\", absent, or an unrecognized future value → the default.\n                _ => d.relay,\n            },\n            peer_pump: file.peer_pump.unwrap_or(d.peer_pump),\n            registry_pump_period: file\n                .registry_pump_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.registry_pump_period),\n            registry_evict_after: file\n                .registry_evict_after_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.registry_evict_after),\n            notif_pump_period: file\n                .notif_pump_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.notif_pump_period),\n            sync_pull_period: file\n                .sync_pull_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.sync_pull_period),\n            update_check_period: file\n                .update_check_period_ms\n                .map(Duration::from_millis)\n                .unwrap_or(d.update_check_period),\n            auto_suspend_after_ms: file.auto_suspend_after_ms,\n            resources_blurb: file.resources_blurb,\n            detached_subnets: file.detached_subnets.unwrap_or_default(),\n            worker_reap_ttl_secs: file.worker_reap_ttl_secs.unwrap_or(d.worker_reap_ttl_secs),\n            startup_endpoints: file.startup_endpoints.unwrap_or_default(),\n            docs_port: file.docs_port,\n        }\n    }\n\n    /// Persist this config to an explicit path (for `spt` to write the knob).","startLine":130,"lineNumbers":[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,null,200,null,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\\config.rs"}}},"isError":false,"timestamp":1784271655005}}
{"type":"message","id":"a06b8686","parentId":"1b10538a","timestamp":"2026-07-17T07:00:55.008Z","message":{"role":"toolResult","toolCallId":"call_Ns7e1Vh0moOFMaynDMCyzNGB|fc_0a061eb498f0e908016a59d326e35081969d32e91e733911d4","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…\n}\n\n[Showing lines 1-183 of 334. Use :184 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","truncated":true,"truncatedBy":"lines","totalLines":334,"totalBytes":8202,"outputLines":183,"outputBytes":8202,"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…\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,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":8202,"outputLines":183,"outputBytes":8202,"shownRange":{"start":1,"end":183},"nextOffset":184}}},"isError":false,"timestamp":1784271655008}}
{"type":"message","id":"2d73e748","parentId":"a06b8686","timestamp":"2026-07-17T07:00:55.021Z","message":{"role":"toolResult","toolCallId":"call_jITde0AvYFJjk1RSTwUKHzPd|fc_0a061eb498f0e908016a59d326e35c8196b278052183c89bf1","toolName":"read","content":[{"type":"text","text":"fn startup_reconcile_peeraddrs(paths: &PumpPaths, self_hex: &str) {\n…\n    for k in invalid {\n        eprintln!(\n            \"PEERADDR_INVARIANT_REPAIR:{k}: dropped a cached row whose address.id does not match its key (no roster repair available) [REQ-PEERADDR-INVARIANT]\"\n        );\n        changed |= pa.forget(&k);\n    }\n    if changed {\n        let _ = pa.save_to(&paths.peer_addrs);\n    }\n}\n\n/// The roster leg of the route chain: any subnet's `RosterEntry` for\n/// `peer_hex` whose advertised address passes id-match validation (gate\n/// ruling 4 — an address claiming a different identity resolves NOTHING).\n// [impl->REQ-PEER-ROUTE-CHAIN]\nfn roster_route(\n    roster: &spt_store::roster::RosterStore,\n    peer_hex: &str,\n) -> Option<serde_json::Value> {\n    roster\n        .members\n        .iter()\n        .filter(|m| m.pubkey_hex == peer_hex)\n        .filter_map(|m| m.address.as_ref())\n        .find(|a| spt_store::peeraddrs::addr_peer_id(a) == Some(peer_hex))\n        .cloned()\n}\n\n/// Monotonic milliseconds since the process's first stamp — the `mono_ms`\n/// half of the stamped failure lines (REQ-PUMP-STAGE-TRUTH): wall time can\n/// step; this cannot, so intra-incident ordering is trustworthy.\nfn mono_ms() -> u64 {\n    use std::sync::OnceLock;\n    static BASE: OnceLock<Instant> = OnceLock::new();\n    BASE.get_or_init(Instant::now).elapsed().as_millis() as u64\n}\n\n/// Open a fresh stream on `conn_id`, write one whole feed fire-and-forget,\n/// and finish it (the receiver's dispatcher classifies + applies). One\n/// stream per feed: streams are single-purpose by the demux contract.\nfn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n    let opened = brain.net_open_stream(conn_id, None)?;\n    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n    Ok(())\n}\n\n/// Connect a fresh brain IPC client in PUMP mode (retrying through broker\n/// startup): the carrier is split at construction with the per-call deadline\n/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\n/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\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_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\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\n[Showing lines 1079-1143 of 1982. Use :1144 to continue]"}],"details":{"truncation":{"content":"    for k in invalid {\r\n        eprintln!(\r\n            \"PEERADDR_INVARIANT_REPAIR:{k}: dropped a cached row whose address.id does not match its key (no roster repair available) [REQ-PEERADDR-INVARIANT]\"\r\n        );\r\n        changed |= pa.forget(&k);\r\n    }\r\n    if changed {\r\n        let _ = pa.save_to(&paths.peer_addrs);\r\n    }\r\n}\r\n\r\n/// The roster leg of the route chain: any subnet's `RosterEntry` for\r\n/// `peer_hex` whose advertised address passes id-match validation (gate\r\n/// ruling 4 — an address claiming a different identity resolves NOTHING).\r\n// [impl->REQ-PEER-ROUTE-CHAIN]\r\nfn roster_route(\r\n    roster: &spt_store::roster::RosterStore,\r\n    peer_hex: &str,\r\n) -> Option<serde_json::Value> {\r\n    roster\r\n        .members\r\n        .iter()\r\n        .filter(|m| m.pubkey_hex == peer_hex)\r\n        .filter_map(|m| m.address.as_ref())\r\n        .find(|a| spt_store::peeraddrs::addr_peer_id(a) == Some(peer_hex))\r\n        .cloned()\r\n}\r\n\r\n/// Monotonic milliseconds since the process's first stamp — the `mono_ms`\r\n/// half of the stamped failure lines (REQ-PUMP-STAGE-TRUTH): wall time can\r\n/// step; this cannot, so intra-incident ordering is trustworthy.\r\nfn mono_ms() -> u64 {\r\n    use std::sync::OnceLock;\r\n    static BASE: OnceLock<Instant> = OnceLock::new();\r\n    BASE.get_or_init(Instant::now).elapsed().as_millis() as u64\r\n}\r\n\r\n/// Open a fresh stream on `conn_id`, write one whole feed fire-and-forget,\r\n/// and finish it (the receiver's dispatcher classifies + applies). One\r\n/// stream per feed: streams are single-purpose by the demux contract.\r\nfn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\r\n    let opened = brain.net_open_stream(conn_id, None)?;\r\n    brain.net_stream_send(opened.stream_id, feed, None, true)?;\r\n    Ok(())\r\n}\r\n\r\n/// Connect a fresh brain IPC client in PUMP mode (retrying through broker\r\n/// startup): the carrier is split at construction with the per-call deadline\r\n/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\r\n/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\r\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\nfn connect(broker_name: &str) -> io::Result<Brain> {\r\n    let mut last = io::Error::other(\"broker never answered\");\r\n    for _ in 0..300 {\r\n        match Brain::cold_start_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\r\n            Ok(b) => return Ok(b),\r\n            Err(e) => last = e,\r\n        }\r\n        thread::sleep(Duration::from_millis(10));\r\n    }\r\n    Err(last)\r\n}\r\n\r\nfn now_ms() -> u64 {\r\n    std::time::SystemTime::now()\r","truncated":true,"truncatedBy":"lines","totalLines":904,"totalBytes":2556,"outputLines":65,"outputBytes":2556,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn startup_reconcile_peeraddrs(paths: &PumpPaths, self_hex: &str) {\n…\n    for k in invalid {\r\n        eprintln!(\r\n            \"PEERADDR_INVARIANT_REPAIR:{k}: dropped a cached row whose address.id does not match its key (no roster repair available) [REQ-PEERADDR-INVARIANT]\"\r\n        );\r\n        changed |= pa.forget(&k);\r\n    }\r\n    if changed {\r\n        let _ = pa.save_to(&paths.peer_addrs);\r\n    }\r\n}\r\n\r\n/// The roster leg of the route chain: any subnet's `RosterEntry` for\r\n/// `peer_hex` whose advertised address passes id-match validation (gate\r\n/// ruling 4 — an address claiming a different identity resolves NOTHING).\r\n// [impl->REQ-PEER-ROUTE-CHAIN]\r\nfn roster_route(\r\n    roster: &spt_store::roster::RosterStore,\r\n    peer_hex: &str,\r\n) -> Option<serde_json::Value> {\r\n    roster\r\n        .members\r\n        .iter()\r\n        .filter(|m| m.pubkey_hex == peer_hex)\r\n        .filter_map(|m| m.address.as_ref())\r\n        .find(|a| spt_store::peeraddrs::addr_peer_id(a) == Some(peer_hex))\r\n        .cloned()\r\n}\r\n\r\n/// Monotonic milliseconds since the process's first stamp — the `mono_ms`\r\n/// half of the stamped failure lines (REQ-PUMP-STAGE-TRUTH): wall time can\r\n/// step; this cannot, so intra-incident ordering is trustworthy.\r\nfn mono_ms() -> u64 {\r\n    use std::sync::OnceLock;\r\n    static BASE: OnceLock<Instant> = OnceLock::new();\r\n    BASE.get_or_init(Instant::now).elapsed().as_millis() as u64\r\n}\r\n\r\n/// Open a fresh stream on `conn_id`, write one whole feed fire-and-forget,\r\n/// and finish it (the receiver's dispatcher classifies + applies). One\r\n/// stream per feed: streams are single-purpose by the demux contract.\r\nfn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\r\n    let opened = brain.net_open_stream(conn_id, None)?;\r\n    brain.net_stream_send(opened.stream_id, feed, None, true)?;\r\n    Ok(())\r\n}\r\n\r\n/// Connect a fresh brain IPC client in PUMP mode (retrying through broker\r\n/// startup): the carrier is split at construction with the per-call deadline\r\n/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\r\n/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\r\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\nfn connect(broker_name: &str) -> io::Result<Brain> {\r\n    let mut last = io::Error::other(\"broker never answered\");\r\n    for _ in 0..300 {\r\n        match Brain::cold_start_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\r\n            Ok(b) => return Ok(b),\r\n            Err(e) => last = e,\r\n        }\r\n        thread::sleep(Duration::from_millis(10));\r\n    }\r\n    Err(last)\r\n}\r\n\r\nfn now_ms() -> u64 {\r\n    std::time::SystemTime::now()\r\n        .duration_since(std::time::UNIX_EPOCH)\n        .map(|d| d.as_millis() as u64)\n        .unwrap_or(0)\n}","startLine":1064,"lineNumbers":[1064,null,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]},"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":1982,"totalBytes":2556,"outputLines":65,"outputBytes":2556,"shownRange":{"start":1079,"end":1143},"nextOffset":1144}}},"isError":false,"timestamp":1784271655021}}
{"type":"message","id":"8dfbaaf7","parentId":"2d73e748","timestamp":"2026-07-17T07:01:09.144Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing registry feed replay issues**\n\n**Diagnosing connection wedging and registry merge load**"},{"type":"toolCall","id":"call_3NyW2SCBMPzG15cl53xHFHYo|fc_0a061eb498f0e908016a59d334efb88196bfb36681e461e740","name":"read","arguments":{"i":"Reading registry serve loop","path":"crates/spt-daemon/src/dispatch.rs","selector":"969-1050"}},{"type":"toolCall","id":"call_HFUXChwWESsMayXQAQpa4p4Q|fc_0a061eb498f0e908016a59d334efc481968d1055afc7e09052","name":"grep","arguments":{"i":"Finding registry merge methods","pattern":"pub fn merge|fn merge|apply.*feed|merge_feed|admit|RegistryGatePolicy","path":"crates/spt-daemon/src/registryhost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_nbVme3AzraLW83BvyjlRLD7T|fc_0a061eb498f0e908016a59d334efcc819693b74fd6576c1835","name":"read","arguments":{"i":"Reading pump peer loop lifecycle","path":"crates/spt-daemon/src/pump/mod.rs","selector":"560-850"}},{"type":"toolCall","id":"call_PfmZ4eqfiBEM6YBCUFKUdGGA|fc_0a061eb498f0e908016a59d334efd0819684f20d640d168e8d","name":"grep","arguments":{"i":"Finding registry defaults","pattern":"DEFAULT_REGISTRY|registry_pump_period|registry: Duration|PumpCadence","path":"crates/spt-daemon/src/config.rs; crates/spt-daemon/src/pump/mod.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_klkq5aNb9Ooq4FFu0TvaYs81|fc_0a061eb498f0e908016a59d334efd88196ae1a340af31a3b61","name":"grep","arguments":{"i":"Finding registry persistence writes","pattern":"fs::write|save_to|save\\(|atomic|snapshot|write","path":"crates/spt-daemon/src/registryhost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_CJDhyB6m3YwQa34RUl50Pr3J|fc_0a061eb498f0e908016a59d334efdc8196b8679f14c7032beb","name":"grep","arguments":{"i":"Finding pump connection ownership","pattern":"struct PeerIo|impl PeerIo|push_feed|Brain|peer_step|for .*peer|run_round","path":"crates/spt-daemon/src/pump/mod.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8257,"output":644,"cacheRead":176640,"cacheWrite":0,"totalTokens":185541,"reasoningTokens":264,"cost":{"input":0.041285,"output":0.01932,"cacheRead":0.08832,"cacheWrite":0,"total":0.148925}},"stopReason":"toolUse","timestamp":1784271655070,"responseId":"resp_0a061eb498f0e908016a59d3274db8819693ad65e04d06aceb","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d3287f4081968690c4de024dcac4","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdM0JrXOcUzBewu0xp2Jr-GAdvC4OgoDCICe1AUix5lqQQDJDiKs7Fke55Ux8F4QvtVcR1UbBwh0T8zkJm6yL4xB_OWvFfB0Vf5ZchPADkPvFMGNPVCBa9SJl0mbewYTga1N6zBwI9RyGw9VuEFI7h8gBdxXTBJpVZKkhFoFiUeO_pfmencYkjsQvzXsF9eetQexIzqVFmrz16se0UgNJG-rbr8Xj-iKwvTt1E4SuhBgbVTDW8HZjb6Inrj3ZxvqkUvhDEIMfxw7P8hltT4pksfJZcWozUGgQl7O0Dj88zpjVb4Cf9XjexB_D9__ujsw7HbINMF1DintmWnV9N-UT7wx0WqMPreNtf4cFQcz4AszUFCpPg78pC2usRHIKHvnW2hmXEUECDQFFU2WqCC3Lk21xzfssp8UDCM2qI4n1G3ealxsJmzWDz8psH1fahzkjHvn7EW2wYpE-WgDMGl3ND3jRzYAl8N1x43sfWLrwMvpxBb41hxsEk4ktF7jh3hxqzlI_sEZhF0HKEYO610mG56-jVlUoD41Ato2kzaHm33LQ3GXfzBEBnxUGptf23VbQII0pUfR995ZCUIQT_iduRNtK_2FaoP13xW-UTe3zF5gJ7DLFmMFCYE_wvGNeQEmwxReTPpiPbhUdsyb8_7WqCNp74VFgFGvNUbrGEIRnG7jloF_NDRjFcrpZ_W5V-zVEJ7fOwJXZ9i6JfSHpYVHWRJTNSwN1Ts9VfkuZ9tlxgmTKMZMbl6lZwrCcnHNj_o1t_T-vWVJIdGqUNCCmKcO_mktfgdvhVIisRxq7w5QypPc9A-Vq2dI3CGAuZ79X1gDAhB2KS5OIq-4GIOBVuhWkgPus9RJ2gLWUKpWyZnmtoUriiQ9FWmOlCuYlTkqevEUmGFzfpzSoz7Ge3iBW1qnFQFvDDot7exYyRbgUzK5tHxfwqvklGgxuDElvuaaI_t-4jBrzWnPfIJkGPUpEJsB1ZFhqczA8ewfQzW9YJOphgXvAtTqUFczFVoJUlYM_aqdYB5a4rW0mkQf51arvaVfbobFocyKuPn_5o1tUw-8zUDx9VUL8ILSVkqSTpVSs7b5UJoPjKezHxJeUn1IbD_YDq4TsXS2jLwTa9nS0iq8TGYmVVm0-jZZa1ZOtMII79svYseg2B-6z-sonCE8yf--t9q1b5rFLZaA5tBTea2IUdXi9Z0wcu01UicVa3E8K1sRse8eBg3wTAYmv3q7EpbfIWqsTUzq6ZC8IqJMVdBOOzORAjANb92yRQJEix_x6E1bJtkOWW50Yt400-uqqEu6vkHQS8CfOfi0bptw-jo5WMh1n_sSA1IzCU7HmOk5ZSD-f3707stigFFeDvNj3mxj3oqnN_uxseeoj-R0YI8tfaId4HWoCx-Ag4-R8BGIRL-hDF1YPdsjyxEXGK6ef-rX4XxAAiPK-c--hGsCRVhlEZTi0-QMWhOT4Fc5kcZphcaHF-Mfo9cOWGWQuYFIhougY7Njrr8_Z-MUm-WZb5oFBNhzHcKRhMD1a3CgNRMHuaZzr5dStgoKHlUfIsbQsZDRnfyVyvFjbQWaCe8lW3gaKOY8pGkf6E53lc7DofX2rLWsNAQuMbeDiBT20fkqMHRjWIlP67JIX2Qx5qr8S3JPMoidCEWEl_HnV1FT4DwGKpGERC8FVU_G_cy_wtixdYrhSIe-M3rZZ3OimFPL1d1YeO8CYOaXoiZFY5ghQiTPJJYGFio_2sDv9Sp06K4E0rq-WV8YeFVJGMvBHi6wYS8aOCRxbZkOvq3zvH4DsYk2chUAejE2dDLHkRfIcDAyj-pBc1AtDIb2cHdbuIT9zfegOkAp49Anw2IlbhLOhNebSfY9vxHwEVIx5u7HIbs1xKNXEQfqg__1sEVV5j9wBKi_Jmr-i4RvNuPdGpdpiCcReLSGW_JCfHJAevkV4KTX73p7J69BiPqQEAb_ZCp93fDQ2p29FMn9avXwirrVd9V_a2WhRb8lC_9n_ESXjtAcl1AkIjSdS284YEZFSFhiUYmbSIljMDYkkfec-TgWRiLLcGmJ4wdN4poNHsdk_eKZzsFp-cRiMNipcPbDlrKOOCWRYrcXu38PGOyNMs-BNhhUNMOHHFtu3BBBgJY76oqzziqGlRa4OsSLnhfR1LksInR1_b8-0pa6Kjp-UPaspQQOAORVE5RekbjHL__W903zKy84KCaG9L--ezqo68WUooiRV47_KcrXivkh61TutwHo-IRqdFSSzNbL3wGXiys1KReJEmXoQNyCsp31dBfdqykP9ezDIHDdHsjbv3BJZn142bGGF63hX7VFqU5hUBGKqtJGK_4quNL2isZ0CoxzDyUwZeYkhpmoNLbTGl2t9ertW6EuMC-mpfMGqRDeqAdtltR6EfrgDjqd1k1oqB2ElgdjWv7N3gHnTykX4RWYhgcG2ZPLwPUfPqXz2-kwlJAVV8Dqb_GFRqtNoQWIQbo2Gak_fkG2p2A1rhZHKCKrrAanwFAQmKcX4XpiDetMk6wUO38Yl5BdKq29xqQVayg6HUdjA0spx8XfxxapET0h770ZmOAa_AXwtLLw-5UKcWjNfQDo_n3VDl2Yc1_i6kmC3j2zxtW5YONwmuAec0EauCzOLwbT6_rdHa9YqWf6jj7FTb86I31-cmI7T-vSTdi9ern4zh_lthXym-9Y5aCEYza8lkEi_JVtAXFmzeFCzv6uBnablGiISA==","summary":[{"type":"summary_text","text":"**Analyzing registry feed replay issues**"},{"type":"summary_text","text":"**Diagnosing connection wedging and registry merge load**"}]},{"id":"fc_0a061eb498f0e908016a59d334efb88196bfb36681e461e740","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry serve loop\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"969-1050\"}","call_id":"call_3NyW2SCBMPzG15cl53xHFHYo","name":"read"},{"id":"fc_0a061eb498f0e908016a59d334efc481968d1055afc7e09052","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry merge methods\",\"pattern\":\"pub fn merge|fn merge|apply.*feed|merge_feed|admit|RegistryGatePolicy\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_HFUXChwWESsMayXQAQpa4p4Q","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d334efcc819693b74fd6576c1835","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump peer loop lifecycle\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"560-850\"}","call_id":"call_nbVme3AzraLW83BvyjlRLD7T","name":"read"},{"id":"fc_0a061eb498f0e908016a59d334efd0819684f20d640d168e8d","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry defaults\",\"pattern\":\"DEFAULT_REGISTRY|registry_pump_period|registry: Duration|PumpCadence\",\"path\":\"crates/spt-daemon/src/config.rs; crates/spt-daemon/src/pump/mod.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_PfmZ4eqfiBEM6YBCUFKUdGGA","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d334efd88196ae1a340af31a3b61","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry persistence writes\",\"pattern\":\"fs::write|save_to|save\\\\(|atomic|snapshot|write\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_klkq5aNb9Ooq4FFu0TvaYs81","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d334efdc8196b8679f14c7032beb","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding pump connection ownership\",\"pattern\":\"struct PeerIo|impl PeerIo|push_feed|Brain|peer_step|for .*peer|run_round\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_CJDhyB6m3YwQa34RUl50Pr3J","name":"grep"}]},"duration":14073.415300011635,"ttft":1444.0279000103474,"contextSnapshot":{"promptTokens":184897,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_3NyW2SCBMPzG15cl53xHFHYo|fc_0a061eb498f0e908016a59d334efb88196bfb36681e461e740","toolName":"read","startedAt":"2026-07-17T07:01:09.144Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading registry serve loop"},"id":"c96d19f0","parentId":"8dfbaaf7","timestamp":"2026-07-17T07:01:09.144Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_HFUXChwWESsMayXQAQpa4p4Q|fc_0a061eb498f0e908016a59d334efc481968d1055afc7e09052","toolName":"grep","startedAt":"2026-07-17T07:01:09.144Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Finding registry merge methods"},"id":"b2fc1f0f","parentId":"c96d19f0","timestamp":"2026-07-17T07:01:09.144Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_nbVme3AzraLW83BvyjlRLD7T|fc_0a061eb498f0e908016a59d334efcc819693b74fd6576c1835","toolName":"read","startedAt":"2026-07-17T07:01:09.144Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump peer loop lifecycle"},"id":"27e2f89b","parentId":"b2fc1f0f","timestamp":"2026-07-17T07:01:09.144Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_PfmZ4eqfiBEM6YBCUFKUdGGA|fc_0a061eb498f0e908016a59d334efd0819684f20d640d168e8d","toolName":"grep","startedAt":"2026-07-17T07:01:09.144Z","args":{"path":"crates/spt-daemon/src/config.rs; crates/spt-daemon/src/pump/mod.rs"},"intent":"Finding registry defaults"},"id":"9cdd8f85","parentId":"27e2f89b","timestamp":"2026-07-17T07:01:09.144Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_klkq5aNb9Ooq4FFu0TvaYs81|fc_0a061eb498f0e908016a59d334efd88196ae1a340af31a3b61","toolName":"grep","startedAt":"2026-07-17T07:01:09.145Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Finding registry persistence writes"},"id":"462c8617","parentId":"9cdd8f85","timestamp":"2026-07-17T07:01:09.145Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_CJDhyB6m3YwQa34RUl50Pr3J|fc_0a061eb498f0e908016a59d334efdc8196b8679f14c7032beb","toolName":"grep","startedAt":"2026-07-17T07:01:09.145Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Finding pump connection ownership"},"id":"c62b1f3a","parentId":"462c8617","timestamp":"2026-07-17T07:01:09.145Z"}
{"type":"message","id":"cd7a7d8d","parentId":"c62b1f3a","timestamp":"2026-07-17T07:01:09.150Z","message":{"role":"toolResult","toolCallId":"call_klkq5aNb9Ooq4FFu0TvaYs81|fc_0a061eb498f0e908016a59d334efd88196ae1a340af31a3b61","toolName":"grep","content":[{"type":"text","text":" 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...\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 108|    /// When each peer node was last *heard* (an admitted inbound feed,\n...\n 111|    /// a probe; only stale rows get dialed. Local-only (never on the wire);\n*112|    /// mirrored to `heard.meta` beside the snapshots for the CLI reader.\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...\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|}\n 126|\n 127|impl RegistryHost {\n 128|    /// Stand the host up for this node, with the canonical epoch counter and\n*129|    /// snapshot dir under the spt home. Reads the OS hostname here — daemon\n 130|    /// startup IS the label's re-check point (REQ-SUBNET-3).\n 131|    pub fn new(node_hex: &str) -> RegistryHost {\n 132|        RegistryHost::new_at(\n...\n 141|    /// Explicit-paths constructor (tests; the pump E2E gives each in-process\n*142|    /// \"node\" its own counter + snapshot dir). No label by default — tests\n 143|    /// stay hostname-independent; chain [`with_node_label`](Self::with_node_label).\n*144|    pub fn new_at(node_hex: &str, epoch: EpochSource, snapshot_dir: PathBuf) -> RegistryHost {\n 145|        RegistryHost {\n 146|            node_hex: node_hex.to_string(),\n 147|            node_label: None,\n...\n 149|            heard: Mutex::new(BTreeMap::new()),\n*150|            last_admit_ms: std::sync::atomic::AtomicU64::new(0),\n 151|            regs: Mutex::new(BTreeMap::new()),\n 152|            epoch: Mutex::new(epoch),\n*153|            snapshot_dir,\n 154|        }\n 155|    }\n 156|\n...\n 294|        }\n*295|        self.write_snapshots();\n 296|        (verdicts, flips)\n 297|    }\n 298|\n...\n 341|        }\n*342|        self.write_snapshots();\n 343|        verdicts\n 344|    }\n 345|\n...\n 349|        self.last_admit_ms\n*350|            .store(wall_ms(), std::sync::atomic::Ordering::Relaxed);\n 351|    }\n 352|\n 353|    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\n...\n 358|            .last_admit_ms\n*359|            .load(std::sync::atomic::Ordering::Relaxed)\n 360|        {\n 361|            0 => None,\n 362|            ms => Some(ms),\n...\n 382|        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\n*383|            let _ = vis.save();\n 384|        }\n 385|        let vis = vis;\n 386|        // The node-level resource-blurb seed (D9-4): an endpoint that has not\n...\n 507|                    // The hashed machine id rides beside it (M8 decision\n*508|                    // 13/22) — the re-pair overwrite anchor.\n 509|                    // [impl->REQ-SUBNET-7]\n 510|                    machine_id: self.machine_id.clone(),\n 511|                    // The endpoint's own type tag (REQ-MSG-6) — read by the\n...\n 545|                        // this subnet): loud skip — resolution is the user's\n*546|                        // rename (D3f), never a silent overwrite.\n 547|                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\n 548|                    }\n 549|                }\n...\n 611|        // than rendering a bare key-prefix. Rides the same epoch lease; merged\n*612|        // into our own registry too so the snapshot carries it. Emitted every\n 613|        // round regardless of endpoint count — redundant-but-robust when rows\n 614|        // exist (the render prefers a trust/instance label anyway), the SOLE\n 615|        // carrier when they don't.\n...\n 631|        drop(regs);\n*632|        self.write_snapshots();\n 633|        out\n 634|    }\n 635|\n...\n 638|    /// within `ttl` has its rows removed from every subnet registry and the\n*639|    /// snapshots rewritten, so a dead node identity can no longer poison\n 640|    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n 641|    /// node authors them fresh each pump tick and is never in its own heard\n 642|    /// map). A row whose author has NO heard stamp is treated as silent —\n...\n 676|        if evicted > 0 {\n*677|            self.write_snapshots();\n 678|        }\n 679|        evicted\n 680|    }\n...\n 712|        if evicted > 0 {\n*713|            self.write_snapshots();\n 714|        }\n 715|        evicted\n 716|    }\n...\n 729|    /// A point-in-time clone of one subnet's registry (resolution input).\n*730|    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\n 731|        self.regs.lock().unwrap().get(subnet).cloned()\n 732|    }\n 733|\n 734|    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\n*735|    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\n*736|    /// readers. Best-effort: a failed snapshot write must not fail the merge\n 737|    /// that triggered it (readers tolerate staleness by contract).\n*738|    fn write_snapshots(&self) {\n 739|        let regs = self.regs.lock().unwrap();\n 740|        if regs.is_empty() {\n 741|            return;\n 742|        }\n*743|        if std::fs::create_dir_all(&self.snapshot_dir).is_err() {\n 744|            return;\n 745|        }\n 746|        for (subnet, reg) in regs.iter() {\n...\n 749|            };\n*750|            let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);\n 751|        }\n 752|        drop(regs);\n 753|        // The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:\n*754|        // the snapshot reader globs `<subnet>.json`, so this can never shadow\n 755|        // a subnet (even one literally named \"heard\").\n 756|        let heard = self.heard.lock().unwrap();\n 757|        if !heard.is_empty() {\n 758|            if let Ok(json) = serde_json::to_vec_pretty(&*heard) {\n*759|                let _ = atomic_write(&Self::heard_path(&self.snapshot_dir), &json);\n 760|            }\n 761|        }\n 762|    }\n 763|\n*764|    /// The snapshot path for one subnet (the CLI reader's contract).\n*765|    pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {\n 766|        dir.join(format!(\"{subnet}.json\"))\n 767|    }\n 768|\n...\n 778|    /// consumed by the pump's registry tick so the IN-MEMORY rows go too\n*779|    /// (a disk-only eviction would be resurrected by the next snapshot\n 780|    /// mirror). `.meta` for the same can't-shadow-a-subnet reason as the\n 781|    /// heard map.\n 782|    pub fn repair_evict_path(dir: &Path) -> PathBuf {\n...\n 787|    /// pattern — take is the remove): evict every noted identity's rows\n*788|    /// from the in-memory registries + the heard map, and rewrite the\n*789|    /// snapshots. No marker = no-op. Returns evicted row count.\n 790|    // [impl->REQ-SUBNET-7]\n 791|    pub fn consume_repair_evictions(&self) -> usize {\n*792|        let path = Self::repair_evict_path(&self.snapshot_dir);\n 793|        let Ok(raw) = std::fs::read_to_string(&path) else {\n 794|            return 0;\n 795|        };\n...\n 818|        if evicted > 0 {\n*819|            self.write_snapshots();\n 820|        }\n 821|        evicted\n 822|    }\n...\n 959|\n*960|/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run\n 961|/// by the pairing host AFTER a completed ceremony: resolve the superseded\n*962|/// identities from the subnet's snapshot, tombstone their roster entries (this\n 963|/// subnet's scope — the ceremony proved control of THIS subnet's code, nothing\n*964|/// about others), rewrite the disk snapshot, and note the hexes in the eviction\n 965|/// marker so the pump clears the in-memory rows on its next tick. The caller\n 966|/// persists `roster`. Returns one [`RekeyNotice`] per superseded identity (the\n 967|/// demoted warn-on-change, REQ-MESH-5) — empty when nothing supersedes.\n...\n 985|) -> Vec<RekeyNotice> {\n*986|    let snap_path = RegistryHost::snapshot_path(snap_dir, subnet);\n 987|    let Some(mut reg) = std::fs::read_to_string(&snap_path)\n 988|        .ok()\n 989|        .and_then(|s| serde_json::from_str::<SubnetRegistry>(&s).ok())\n...\n 1021|    if let Ok(json) = serde_json::to_vec_pretty(&reg) {\n*1022|        let _ = atomic_write(&snap_path, &json);\n 1023|    }\n 1024|    // Merge into the marker (several re-pairs can land between pump ticks).\n 1025|    let marker = RegistryHost::repair_evict_path(snap_dir);\n...\n 1031|    if let Ok(json) = serde_json::to_vec_pretty(&all) {\n*1032|        let _ = atomic_write(&marker, &json);\n 1033|    }\n 1034|    notices\n 1035|}\n...\n 1057|    }\n*1058|    let _ = std::fs::write(&marker, b\"\");\n 1059|}\n 1060|\n 1061|/// Consume the advertise-now marker: `true` exactly once per drop (the\n...\n 1076|\n*1077|/// tmp-write + atomic rename with the 5.2 Windows-EBUSY retry posture.\n*1078|fn atomic_write(path: &Path, bytes: &[u8]) -> io::Result<()> {\n 1079|    let tmp = path.with_extension(\"json.tmp\");\n*1080|    std::fs::write(&tmp, bytes)?;\n 1081|    for attempt in 0..5 {\n 1082|        match std::fs::rename(&tmp, path) {\n 1083|            Ok(()) => return Ok(()),\n...\n 1132|        }\n*1133|        std::fs::write(perch.join(spt_store::sessions::LEDGER_FILE), body).unwrap();\n 1134|\n 1135|        let got = recent_projects_for(&perch, &owlery);\n 1136|        // newest-first, owlery excluded, alpha deduped to its newest slot.\n...\n 1302|    // `is_member` — and returns a machine_id-anchored rekey awareness notice\n*1303|    // (the demoted warn-on-change, never a block). Rewrites the disk snapshot\n 1304|    // without its rows, notes it in the marker; the host's consume then clears\n 1305|    // the in-memory rows + the heard entry. A no-match intro (and an intro\n 1306|    // with no machine id) evicts nothing and raises no notice.\n 1307|    #[test]\n*1308|    fn repair_evict_tombstones_roster_snapshot_and_notices() {\n 1309|        let dir = tempfile::tempdir().unwrap();\n 1310|        let snap_dir = dir.path().join(\"registry\");\n 1311|        let h = RegistryHost::new_at(\n...\n 1327|        // Snapshot mirrored to disk by the merge.\n*1328|        assert!(RegistryHost::snapshot_path(&snap_dir, \"home\").exists());\n 1329|\n 1330|        // Roster membership in both subnets — the gate-relevant state (D5a).\n 1331|        let mut roster = RosterStore::default();\n...\n 1363|        let on_disk: SubnetRegistry = serde_json::from_str(\n*1364|            &std::fs::read_to_string(RegistryHost::snapshot_path(&snap_dir, \"home\")).unwrap(),\n 1365|        )\n 1366|        .unwrap();\n 1367|        assert!(\n 1368|            on_disk.instances(\"ling\").is_empty(),\n*1369|            \"superseded rows gone from the disk snapshot\"\n 1370|        );\n 1371|        // The marker holds the hex; consume clears the IN-MEMORY rows too\n*1372|        // (else the next snapshot mirror would resurrect the disk eviction).\n 1373|        assert!(RegistryHost::repair_evict_path(&snap_dir).exists());\n 1374|        assert_eq!(h.consume_repair_evictions(), 1, \"in-memory row evicted\");\n 1375|        assert!(h.rows(\"home\", \"ling\").is_empty());\n...\n 1393|\n*1394|        // Absent machine id: a FRESH gossip snapshot with a labeled identity;\n 1395|        // an intro carrying the same label but NO machine id must not supersede\n 1396|        // it (REQ-MESH-5 absent-id rule) — no eviction, no notice. Fresh dir so\n 1397|        // the match has a real row to (not) hit, unlike the already-evicted one.\n...\n 1424|    // [unit->REQ-INST-7] inbound feeds gate fail-closed: non-member subnet\n*1425|    // and untrusted origin write nothing; an admitted row merges and the\n 1426|    // epoch lease still drops a stale follow-up.\n 1427|    #[test]\n 1428|    fn apply_feed_gates_and_merges_under_the_lease() {\n...\n 1438|            h.rows(\"home\", \"ling\").is_empty(),\n*1439|            \"refused feeds write nothing\"\n 1440|        );\n 1441|\n 1442|        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n...\n 1464|                let rec = InfoJson::new(id, \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1465|                info::write_info(&p, &rec).unwrap();\n 1466|            }\n 1467|            let authored = perch::resolve_perch_path_in(&owlery, \"authored\", ParentHint::Infer);\n 1468|            info::set_resources(&authored, Some(\"rust builds\")).unwrap();\n...\n 1471|            subnets.create_subnet(\"home\").unwrap();\n*1472|            subnets.save().unwrap();\n 1473|            // The node seed: daemon.json under the canonical home.\n 1474|            let cfg = crate::config::DaemonConfig {\n 1475|                resources_blurb: Some(\"general node services\".to_string()),\n...\n 1477|            };\n*1478|            cfg.save_to(&crate::config::DaemonConfig::default_path())\n 1479|                .unwrap();\n 1480|\n 1481|            let h = host(home);\n...\n 1518|                let rec = InfoJson::new(id, \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1519|                info::write_info(&p, &rec).unwrap();\n 1520|            }\n 1521|            let stamped = perch::resolve_perch_path_in(&owlery, \"stamped\", ParentHint::Infer);\n 1522|            info::set_last_active(&stamped, 7_000).unwrap();\n...\n 1525|            subnets.create_subnet(\"home\").unwrap();\n*1526|            subnets.save().unwrap();\n 1527|\n 1528|            let h = host(home);\n 1529|            h.advertise_local(&owlery);\n...\n 1693|        // The label landed and is the only carrier — no endpoint row created.\n*1694|        let snap = RegistryHost::snapshot_path(&dir.path().join(\"registry\"), \"home\");\n 1695|        let reg: SubnetRegistry =\n 1696|            serde_json::from_slice(&std::fs::read(&snap).unwrap()).unwrap();\n 1697|        assert_eq!(reg.node_labels().collect::<Vec<_>>(), vec![(\"bb22\", \"RENAMED\")]);\n...\n 1712|            let rec = InfoJson::new(\"ling\", \"now\", std::process::id(), \"s\", \"live_agent\");\n*1713|            info::write_info(&p, &rec).unwrap();\n 1714|            let mut subnets = SubnetStore::load();\n 1715|            subnets.create_subnet(\"home\").unwrap();\n*1716|            subnets.save().unwrap();\n 1717|\n 1718|            let h = host(home);\n 1719|\n...\n 1730|            // strictly greater epoch.\n*1731|            crate::resting::write_rest(&p, crate::resting::RestState::Dormant, 1_000).unwrap();\n 1732|            h.advertise_local(&owlery);\n 1733|            let dormant = h.rows(\"home\", \"ling\")[0].clone();\n 1734|            assert_eq!(\n...\n 1744|            // dormant → suspended.\n*1745|            crate::resting::write_rest(&p, crate::resting::RestState::Suspended, 2_000).unwrap();\n 1746|            h.advertise_local(&owlery);\n 1747|            let suspended = h.rows(\"home\", \"ling\")[0].clone();\n 1748|            assert_eq!(suspended.status, Status::Suspended);\n...\n 1751|            // wake: suspended → active again.\n*1752|            crate::resting::write_rest(&p, crate::resting::RestState::Active, 3_000).unwrap();\n 1753|            h.advertise_local(&owlery);\n 1754|            assert_eq!(\n 1755|                h.rows(\"home\", \"ling\")[0].status,\n...\n 1785|            let alive = mk(\"alive\");\n*1786|            info::write_info(\n 1787|                &alive,\n 1788|                &InfoJson::new(\"alive\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1789|            )\n...\n 1794|            let unbound = mk(\"unbound\");\n*1795|            info::write_info(\n 1796|                &unbound,\n 1797|                &InfoJson::new(\"unbound\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1798|            )\n...\n 1809|            let cold = mk(\"cold\");\n*1810|            info::write_info(\n 1811|                &cold,\n 1812|                &InfoJson::new(\"cold\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1813|            )\n...\n 1823|            let dead = mk(\"dead\");\n*1824|            info::write_info(\n 1825|                &dead,\n 1826|                &InfoJson::new(\"dead\", \"now\", DEAD_PID, \"s\", \"live_agent\"),\n 1827|            )\n...\n 1839|            let corrupt = mk(\"corrupt\");\n*1840|            std::fs::write(corrupt.join(\"info.json\"), [0u8; 360]).unwrap();\n 1841|            assert_eq!(\n 1842|                advertised_status(&corrupt),\n 1843|                Status::Suspended,\n...\n 1858|            std::fs::create_dir_all(&p).unwrap();\n*1859|            info::write_info(\n 1860|                &p,\n 1861|                &InfoJson::new(\"live\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1862|            )\n...\n 1886|            let rec = InfoJson::new(\"ghost-ag\", \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1887|            info::write_info(&p, &rec).unwrap();\n 1888|            let mut subnets = SubnetStore::load();\n 1889|            subnets.create_subnet(\"adv\").unwrap();\n*1890|            subnets.save().unwrap();\n 1891|\n 1892|            let h = host(home);\n 1893|            h.advertise_local(&owlery);\n...\n 1939|                let rec = InfoJson::new(id, \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1940|                info::write_info(&p, &rec).unwrap();\n 1941|            }\n 1942|            let mut subnets = SubnetStore::load();\n 1943|            subnets.create_subnet(\"adv\").unwrap();\n*1944|            subnets.save().unwrap();\n 1945|            let mut vis = VisibilityStore::load();\n 1946|            vis.set_override(\"hid-ag\", \"adv\", Some(true)); // hidden ⇒ excluded\n*1947|            vis.save().unwrap();\n 1948|\n 1949|            let h = host(home).with_node_label(Some(\"ADVHOST\".into()));\n 1950|            let out = h.advertise_local(&owlery);\n...\n 1984|\n*1985|            // The snapshot mirror exists and parses back.\n*1986|            let snap = RegistryHost::snapshot_path(&home.join(\"registry\"), \"adv\");\n*1987|            let bytes = std::fs::read(&snap).expect(\"snapshot written\");\n 1988|            let parsed: SubnetRegistry = serde_json::from_slice(&bytes).expect(\"parses\");\n 1989|            assert!(!parsed.instances(\"vis-ag\").is_empty());\n 1990|        });\n...\n 2033|    // (recently-heard = alive, no eviction) and evict once it falls silent\n*2034|    // past it — snapshots rewritten so the CLI reader (spt send's WAN\n 2035|    // resolution) stops seeing the ghost. Idempotent.\n 2036|    #[test]\n*2037|    fn evict_silent_peers_drops_unheard_rows_and_rewrites_snapshots() {\n 2038|        let dir = tempfile::tempdir().unwrap();\n 2039|        let h = host(dir.path()); // node_hex = \"aa11\"\n 2040|        let p = policy(\"home\", \"bb22\");\n...\n 2071|        // THE field shape: the dead identity's sergey row no longer poisons\n*2072|        // resolution — and the snapshot mirror agrees.\n 2073|        assert!(h.rows(\"home\", \"sergey\").is_empty(), \"ghost row evicted\");\n*2074|        let snap = RegistryHost::snapshot_path(&dir.path().join(\"registry\"), \"home\");\n 2075|        let parsed: SubnetRegistry =\n 2076|            serde_json::from_slice(&std::fs::read(&snap).unwrap()).unwrap();\n 2077|        assert!(\n 2078|            parsed.instances(\"sergey\").is_empty(),\n*2079|            \"snapshot rewritten without the ghost\"\n 2080|        );\n 2081|\n 2082|        // Idempotent: a second sweep finds nothing.\n...\n 2099|    // ghost-heal re-advertise) has that row decay once it has been non-routable\n*2100|    // past the grace — snapshots rewritten so the remote viewer's count stops\n 2101|    // accumulating ghosts. Within grace it survives; the sweep is idempotent.\n 2102|    #[test]\n*2103|    fn evict_aged_offline_rows_reaps_ghosts_and_rewrites_snapshots() {\n 2104|        let dir = tempfile::tempdir().unwrap();\n 2105|        let h = host(dir.path()); // node_hex = \"aa11\"\n 2106|        let p = policy(\"home\", \"bb22\");\n...\n 2118|\n*2119|        // Past the grace the aged Offline ghost evicts and the snapshot is rewritten.\n 2120|        let later = 1_000 + 300_000 + 1;\n 2121|        assert_eq!(h.evict_aged_offline_rows_at(grace, later), 1);\n 2122|        assert!(h.rows(\"home\", \"ghost\").is_empty(), \"aged Offline ghost evicted\");\n*2123|        let snap = RegistryHost::snapshot_path(&dir.path().join(\"registry\"), \"home\");\n 2124|        let parsed: SubnetRegistry =\n 2125|            serde_json::from_slice(&std::fs::read(&snap).unwrap()).unwrap();\n 2126|        assert!(\n 2127|            parsed.instances(\"ghost\").is_empty(),\n*2128|            \"snapshot rewritten without the aged Offline ghost\"\n 2129|        );\n 2130|\n 2131|        // Idempotent: a second sweep finds nothing.\n...\n 2144|            let rec = InfoJson::new(\"mine\", \"now\", std::process::id(), \"s\", \"ready_agent\");\n*2145|            info::write_info(&p, &rec).unwrap();\n 2146|            let mut subnets = SubnetStore::load();\n 2147|            subnets.create_subnet(\"home\").unwrap();\n*2148|            subnets.save().unwrap();\n 2149|\n 2150|            let h = host(home); // node_hex = \"aa11\", never in heard\n 2151|            h.advertise_local(&owlery);\n...\n 2178|            let rec = InfoJson::new(\"lab-ag\", \"now\", std::process::id(), \"s\", \"ready_agent\");\n*2179|            info::write_info(&p, &rec).unwrap();\n 2180|            let mut subnets = SubnetStore::load();\n 2181|            subnets.create_subnet(\"lab\").unwrap();\n*2182|            subnets.save().unwrap();\n 2183|\n 2184|            let instance_row = |out: &[RegistryFeedRecord], id: &str| {\n 2185|                out.iter()"}],"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":97,"fileCount":1,"files":["crates/spt-daemon/src/registryhost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/registryhost.rs","count":97}],"truncated":false,"displayContent":"   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     │...\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  108│    /// When each peer node was last *heard* (an admitted inbound feed,\n     │...\n  111│    /// a probe; only stale rows get dialed. Local-only (never on the wire);\n *112│    /// mirrored to `heard.meta` beside the snapshots for the CLI reader.\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     │...\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│}\n  126│\n  127│impl RegistryHost {\n  128│    /// Stand the host up for this node, with the canonical epoch counter and\n *129│    /// snapshot dir under the spt home. Reads the OS hostname here — daemon\n  130│    /// startup IS the label's re-check point (REQ-SUBNET-3).\n  131│    pub fn new(node_hex: &str) -> RegistryHost {\n  132│        RegistryHost::new_at(\n     │...\n  141│    /// Explicit-paths constructor (tests; the pump E2E gives each in-process\n *142│    /// \"node\" its own counter + snapshot dir). No label by default — tests\n  143│    /// stay hostname-independent; chain [`with_node_label`](Self::with_node_label).\n *144│    pub fn new_at(node_hex: &str, epoch: EpochSource, snapshot_dir: PathBuf) -> RegistryHost {\n  145│        RegistryHost {\n  146│            node_hex: node_hex.to_string(),\n  147│            node_label: None,\n     │...\n  149│            heard: Mutex::new(BTreeMap::new()),\n *150│            last_admit_ms: std::sync::atomic::AtomicU64::new(0),\n  151│            regs: Mutex::new(BTreeMap::new()),\n  152│            epoch: Mutex::new(epoch),\n *153│            snapshot_dir,\n  154│        }\n  155│    }\n  156│\n     │...\n  294│        }\n *295│        self.write_snapshots();\n  296│        (verdicts, flips)\n  297│    }\n  298│\n     │...\n  341│        }\n *342│        self.write_snapshots();\n  343│        verdicts\n  344│    }\n  345│\n     │...\n  349│        self.last_admit_ms\n *350│            .store(wall_ms(), std::sync::atomic::Ordering::Relaxed);\n  351│    }\n  352│\n  353│    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\n     │...\n  358│            .last_admit_ms\n *359│            .load(std::sync::atomic::Ordering::Relaxed)\n  360│        {\n  361│            0 => None,\n  362│            ms => Some(ms),\n     │...\n  382│        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\n *383│            let _ = vis.save();\n  384│        }\n  385│        let vis = vis;\n  386│        // The node-level resource-blurb seed (D9-4): an endpoint that has not\n     │...\n  507│                    // The hashed machine id rides beside it (M8 decision\n *508│                    // 13/22) — the re-pair overwrite anchor.\n  509│                    // [impl->REQ-SUBNET-7]\n  510│                    machine_id: self.machine_id.clone(),\n  511│                    // The endpoint's own type tag (REQ-MSG-6) — read by the\n     │...\n  545│                        // this subnet): loud skip — resolution is the user's\n *546│                        // rename (D3f), never a silent overwrite.\n  547│                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\n  548│                    }\n  549│                }\n     │...\n  611│        // than rendering a bare key-prefix. Rides the same epoch lease; merged\n *612│        // into our own registry too so the snapshot carries it. Emitted every\n  613│        // round regardless of endpoint count — redundant-but-robust when rows\n  614│        // exist (the render prefers a trust/instance label anyway), the SOLE\n  615│        // carrier when they don't.\n     │...\n  631│        drop(regs);\n *632│        self.write_snapshots();\n  633│        out\n  634│    }\n  635│\n     │...\n  638│    /// within `ttl` has its rows removed from every subnet registry and the\n *639│    /// snapshots rewritten, so a dead node identity can no longer poison\n  640│    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n  641│    /// node authors them fresh each pump tick and is never in its own heard\n  642│    /// map). A row whose author has NO heard stamp is treated as silent —\n     │...\n  676│        if evicted > 0 {\n *677│            self.write_snapshots();\n  678│        }\n  679│        evicted\n  680│    }\n     │...\n  712│        if evicted > 0 {\n *713│            self.write_snapshots();\n  714│        }\n  715│        evicted\n  716│    }\n     │...\n  729│    /// A point-in-time clone of one subnet's registry (resolution input).\n *730│    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\n  731│        self.regs.lock().unwrap().get(subnet).cloned()\n  732│    }\n  733│\n  734│    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\n *735│    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\n *736│    /// readers. Best-effort: a failed snapshot write must not fail the merge\n  737│    /// that triggered it (readers tolerate staleness by contract).\n *738│    fn write_snapshots(&self) {\n  739│        let regs = self.regs.lock().unwrap();\n  740│        if regs.is_empty() {\n  741│            return;\n  742│        }\n *743│        if std::fs::create_dir_all(&self.snapshot_dir).is_err() {\n  744│            return;\n  745│        }\n  746│        for (subnet, reg) in regs.iter() {\n     │...\n  749│            };\n *750│            let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);\n  751│        }\n  752│        drop(regs);\n  753│        // The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:\n *754│        // the snapshot reader globs `<subnet>.json`, so this can never shadow\n  755│        // a subnet (even one literally named \"heard\").\n  756│        let heard = self.heard.lock().unwrap();\n  757│        if !heard.is_empty() {\n  758│            if let Ok(json) = serde_json::to_vec_pretty(&*heard) {\n *759│                let _ = atomic_write(&Self::heard_path(&self.snapshot_dir), &json);\n  760│            }\n  761│        }\n  762│    }\n  763│\n *764│    /// The snapshot path for one subnet (the CLI reader's contract).\n *765│    pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {\n  766│        dir.join(format!(\"{subnet}.json\"))\n  767│    }\n  768│\n     │...\n  778│    /// consumed by the pump's registry tick so the IN-MEMORY rows go too\n *779│    /// (a disk-only eviction would be resurrected by the next snapshot\n  780│    /// mirror). `.meta` for the same can't-shadow-a-subnet reason as the\n  781│    /// heard map.\n  782│    pub fn repair_evict_path(dir: &Path) -> PathBuf {\n     │...\n  787│    /// pattern — take is the remove): evict every noted identity's rows\n *788│    /// from the in-memory registries + the heard map, and rewrite the\n *789│    /// snapshots. No marker = no-op. Returns evicted row count.\n  790│    // [impl->REQ-SUBNET-7]\n  791│    pub fn consume_repair_evictions(&self) -> usize {\n *792│        let path = Self::repair_evict_path(&self.snapshot_dir);\n  793│        let Ok(raw) = std::fs::read_to_string(&path) else {\n  794│            return 0;\n  795│        };\n     │...\n  818│        if evicted > 0 {\n *819│            self.write_snapshots();\n  820│        }\n  821│        evicted\n  822│    }\n     │...\n  959│\n *960│/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run\n  961│/// by the pairing host AFTER a completed ceremony: resolve the superseded\n *962│/// identities from the subnet's snapshot, tombstone their roster entries (this\n  963│/// subnet's scope — the ceremony proved control of THIS subnet's code, nothing\n *964│/// about others), rewrite the disk snapshot, and note the hexes in the eviction\n  965│/// marker so the pump clears the in-memory rows on its next tick. The caller\n  966│/// persists `roster`. Returns one [`RekeyNotice`] per superseded identity (the\n  967│/// demoted warn-on-change, REQ-MESH-5) — empty when nothing supersedes.\n     │...\n  985│) -> Vec<RekeyNotice> {\n *986│    let snap_path = RegistryHost::snapshot_path(snap_dir, subnet);\n  987│    let Some(mut reg) = std::fs::read_to_string(&snap_path)\n  988│        .ok()\n  989│        .and_then(|s| serde_json::from_str::<SubnetRegistry>(&s).ok())\n     │...\n 1021│    if let Ok(json) = serde_json::to_vec_pretty(&reg) {\n*1022│        let _ = atomic_write(&snap_path, &json);\n 1023│    }\n 1024│    // Merge into the marker (several re-pairs can land between pump ticks).\n 1025│    let marker = RegistryHost::repair_evict_path(snap_dir);\n     │...\n 1031│    if let Ok(json) = serde_json::to_vec_pretty(&all) {\n*1032│        let _ = atomic_write(&marker, &json);\n 1033│    }\n 1034│    notices\n 1035│}\n     │...\n 1057│    }\n*1058│    let _ = std::fs::write(&marker, b\"\");\n 1059│}\n 1060│\n 1061│/// Consume the advertise-now marker: `true` exactly once per drop (the\n     │...\n 1076│\n*1077│/// tmp-write + atomic rename with the 5.2 Windows-EBUSY retry posture.\n*1078│fn atomic_write(path: &Path, bytes: &[u8]) -> io::Result<()> {\n 1079│    let tmp = path.with_extension(\"json.tmp\");\n*1080│    std::fs::write(&tmp, bytes)?;\n 1081│    for attempt in 0..5 {\n 1082│        match std::fs::rename(&tmp, path) {\n 1083│            Ok(()) => return Ok(()),\n     │...\n 1132│        }\n*1133│        std::fs::write(perch.join(spt_store::sessions::LEDGER_FILE), body).unwrap();\n 1134│\n 1135│        let got = recent_projects_for(&perch, &owlery);\n 1136│        // newest-first, owlery excluded, alpha deduped to its newest slot.\n     │...\n 1302│    // `is_member` — and returns a machine_id-anchored rekey awareness notice\n*1303│    // (the demoted warn-on-change, never a block). Rewrites the disk snapshot\n 1304│    // without its rows, notes it in the marker; the host's consume then clears\n 1305│    // the in-memory rows + the heard entry. A no-match intro (and an intro\n 1306│    // with no machine id) evicts nothing and raises no notice.\n 1307│    #[test]\n*1308│    fn repair_evict_tombstones_roster_snapshot_and_notices() {\n 1309│        let dir = tempfile::tempdir().unwrap();\n 1310│        let snap_dir = dir.path().join(\"registry\");\n 1311│        let h = RegistryHost::new_at(\n     │...\n 1327│        // Snapshot mirrored to disk by the merge.\n*1328│        assert!(RegistryHost::snapshot_path(&snap_dir, \"home\").exists());\n 1329│\n 1330│        // Roster membership in both subnets — the gate-relevant state (D5a).\n 1331│        let mut roster = RosterStore::default();\n     │...\n 1363│        let on_disk: SubnetRegistry = serde_json::from_str(\n*1364│            &std::fs::read_to_string(RegistryHost::snapshot_path(&snap_dir, \"home\")).unwrap(),\n 1365│        )\n 1366│        .unwrap();\n 1367│        assert!(\n 1368│            on_disk.instances(\"ling\").is_empty(),\n*1369│            \"superseded rows gone from the disk snapshot\"\n 1370│        );\n 1371│        // The marker holds the hex; consume clears the IN-MEMORY rows too\n*1372│        // (else the next snapshot mirror would resurrect the disk eviction).\n 1373│        assert!(RegistryHost::repair_evict_path(&snap_dir).exists());\n 1374│        assert_eq!(h.consume_repair_evictions(), 1, \"in-memory row evicted\");\n 1375│        assert!(h.rows(\"home\", \"ling\").is_empty());\n     │...\n 1393│\n*1394│        // Absent machine id: a FRESH gossip snapshot with a labeled identity;\n 1395│        // an intro carrying the same label but NO machine id must not supersede\n 1396│        // it (REQ-MESH-5 absent-id rule) — no eviction, no notice. Fresh dir so\n 1397│        // the match has a real row to (not) hit, unlike the already-evicted one.\n     │...\n 1424│    // [unit->REQ-INST-7] inbound feeds gate fail-closed: non-member subnet\n*1425│    // and untrusted origin write nothing; an admitted row merges and the\n 1426│    // epoch lease still drops a stale follow-up.\n 1427│    #[test]\n 1428│    fn apply_feed_gates_and_merges_under_the_lease() {\n     │...\n 1438│            h.rows(\"home\", \"ling\").is_empty(),\n*1439│            \"refused feeds write nothing\"\n 1440│        );\n 1441│\n 1442│        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n     │...\n 1464│                let rec = InfoJson::new(id, \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1465│                info::write_info(&p, &rec).unwrap();\n 1466│            }\n 1467│            let authored = perch::resolve_perch_path_in(&owlery, \"authored\", ParentHint::Infer);\n 1468│            info::set_resources(&authored, Some(\"rust builds\")).unwrap();\n     │...\n 1471│            subnets.create_subnet(\"home\").unwrap();\n*1472│            subnets.save().unwrap();\n 1473│            // The node seed: daemon.json under the canonical home.\n 1474│            let cfg = crate::config::DaemonConfig {\n 1475│                resources_blurb: Some(\"general node services\".to_string()),\n     │...\n 1477│            };\n*1478│            cfg.save_to(&crate::config::DaemonConfig::default_path())\n 1479│                .unwrap();\n 1480│\n 1481│            let h = host(home);\n     │...\n 1518│                let rec = InfoJson::new(id, \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1519│                info::write_info(&p, &rec).unwrap();\n 1520│            }\n 1521│            let stamped = perch::resolve_perch_path_in(&owlery, \"stamped\", ParentHint::Infer);\n 1522│            info::set_last_active(&stamped, 7_000).unwrap();\n     │...\n 1525│            subnets.create_subnet(\"home\").unwrap();\n*1526│            subnets.save().unwrap();\n 1527│\n 1528│            let h = host(home);\n 1529│            h.advertise_local(&owlery);\n     │...\n 1693│        // The label landed and is the only carrier — no endpoint row created.\n*1694│        let snap = RegistryHost::snapshot_path(&dir.path().join(\"registry\"), \"home\");\n 1695│        let reg: SubnetRegistry =\n 1696│            serde_json::from_slice(&std::fs::read(&snap).unwrap()).unwrap();\n 1697│        assert_eq!(reg.node_labels().collect::<Vec<_>>(), vec![(\"bb22\", \"RENAMED\")]);\n     │...\n 1712│            let rec = InfoJson::new(\"ling\", \"now\", std::process::id(), \"s\", \"live_agent\");\n*1713│            info::write_info(&p, &rec).unwrap();\n 1714│            let mut subnets = SubnetStore::load();\n 1715│            subnets.create_subnet(\"home\").unwrap();\n*1716│            subnets.save().unwrap();\n 1717│\n 1718│            let h = host(home);\n 1719│\n     │...\n 1730│            // strictly greater epoch.\n*1731│            crate::resting::write_rest(&p, crate::resting::RestState::Dormant, 1_000).unwrap();\n 1732│            h.advertise_local(&owlery);\n 1733│            let dormant = h.rows(\"home\", \"ling\")[0].clone();\n 1734│            assert_eq!(\n     │...\n 1744│            // dormant → suspended.\n*1745│            crate::resting::write_rest(&p, crate::resting::RestState::Suspended, 2_000).unwrap();\n 1746│            h.advertise_local(&owlery);\n 1747│            let suspended = h.rows(\"home\", \"ling\")[0].clone();\n 1748│            assert_eq!(suspended.status, Status::Suspended);\n     │...\n 1751│            // wake: suspended → active again.\n*1752│            crate::resting::write_rest(&p, crate::resting::RestState::Active, 3_000).unwrap();\n 1753│            h.advertise_local(&owlery);\n 1754│            assert_eq!(\n 1755│                h.rows(\"home\", \"ling\")[0].status,\n     │...\n 1785│            let alive = mk(\"alive\");\n*1786│            info::write_info(\n 1787│                &alive,\n 1788│                &InfoJson::new(\"alive\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1789│            )\n     │...\n 1794│            let unbound = mk(\"unbound\");\n*1795│            info::write_info(\n 1796│                &unbound,\n 1797│                &InfoJson::new(\"unbound\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1798│            )\n     │...\n 1809│            let cold = mk(\"cold\");\n*1810│            info::write_info(\n 1811│                &cold,\n 1812│                &InfoJson::new(\"cold\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1813│            )\n     │...\n 1823│            let dead = mk(\"dead\");\n*1824│            info::write_info(\n 1825│                &dead,\n 1826│                &InfoJson::new(\"dead\", \"now\", DEAD_PID, \"s\", \"live_agent\"),\n 1827│            )\n     │...\n 1839│            let corrupt = mk(\"corrupt\");\n*1840│            std::fs::write(corrupt.join(\"info.json\"), [0u8; 360]).unwrap();\n 1841│            assert_eq!(\n 1842│                advertised_status(&corrupt),\n 1843│                Status::Suspended,\n     │...\n 1858│            std::fs::create_dir_all(&p).unwrap();\n*1859│            info::write_info(\n 1860│                &p,\n 1861│                &InfoJson::new(\"live\", \"now\", std::process::id(), \"s\", \"live_agent\"),\n 1862│            )\n     │...\n 1886│            let rec = InfoJson::new(\"ghost-ag\", \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1887│            info::write_info(&p, &rec).unwrap();\n 1888│            let mut subnets = SubnetStore::load();\n 1889│            subnets.create_subnet(\"adv\").unwrap();\n*1890│            subnets.save().unwrap();\n 1891│\n 1892│            let h = host(home);\n 1893│            h.advertise_local(&owlery);\n     │...\n 1939│                let rec = InfoJson::new(id, \"now\", std::process::id(), \"s\", \"ready_agent\");\n*1940│                info::write_info(&p, &rec).unwrap();\n 1941│            }\n 1942│            let mut subnets = SubnetStore::load();\n 1943│            subnets.create_subnet(\"adv\").unwrap();\n*1944│            subnets.save().unwrap();\n 1945│            let mut vis = VisibilityStore::load();\n 1946│            vis.set_override(\"hid-ag\", \"adv\", Some(true)); // hidden ⇒ excluded\n*1947│            vis.save().unwrap();\n 1948│\n 1949│            let h = host(home).with_node_label(Some(\"ADVHOST\".into()));\n 1950│            let out = h.advertise_local(&owlery);\n     │...\n 1984│\n*1985│            // The snapshot mirror exists and parses back.\n*1986│            let snap = RegistryHost::snapshot_path(&home.join(\"registry\"), \"adv\");\n*1987│            let bytes = std::fs::read(&snap).expect(\"snapshot written\");\n 1988│            let parsed: SubnetRegistry = serde_json::from_slice(&bytes).expect(\"parses\");\n 1989│            assert!(!parsed.instances(\"vis-ag\").is_empty());\n 1990│        });\n     │...\n 2033│    // (recently-heard = alive, no eviction) and evict once it falls silent\n*2034│    // past it — snapshots rewritten so the CLI reader (spt send's WAN\n 2035│    // resolution) stops seeing the ghost. Idempotent.\n 2036│    #[test]\n*2037│    fn evict_silent_peers_drops_unheard_rows_and_rewrites_snapshots() {\n 2038│        let dir = tempfile::tempdir().unwrap();\n 2039│        let h = host(dir.path()); // node_hex = \"aa11\"\n 2040│        let p = policy(\"home\", \"bb22\");\n     │...\n 2071│        // THE field shape: the dead identity's sergey row no longer poisons\n*2072│        // resolution — and the snapshot mirror agrees.\n 2073│        assert!(h.rows(\"home\", \"sergey\").is_empty(), \"ghost row evicted\");\n*2074│        let snap = RegistryHost::snapshot_path(&dir.path().join(\"registry\"), \"home\");\n 2075│        let parsed: SubnetRegistry =\n 2076│            serde_json::from_slice(&std::fs::read(&snap).unwrap()).unwrap();\n 2077│        assert!(\n 2078│            parsed.instances(\"sergey\").is_empty(),\n*2079│            \"snapshot rewritten without the ghost\"\n 2080│        );\n 2081│\n 2082│        // Idempotent: a second sweep finds nothing.\n     │...\n 2099│    // ghost-heal re-advertise) has that row decay once it has been non-routable\n*2100│    // past the grace — snapshots rewritten so the remote viewer's count stops\n 2101│    // accumulating ghosts. Within grace it survives; the sweep is idempotent.\n 2102│    #[test]\n*2103│    fn evict_aged_offline_rows_reaps_ghosts_and_rewrites_snapshots() {\n 2104│        let dir = tempfile::tempdir().unwrap();\n 2105│        let h = host(dir.path()); // node_hex = \"aa11\"\n 2106│        let p = policy(\"home\", \"bb22\");\n     │...\n 2118│\n*2119│        // Past the grace the aged Offline ghost evicts and the snapshot is rewritten.\n 2120│        let later = 1_000 + 300_000 + 1;\n 2121│        assert_eq!(h.evict_aged_offline_rows_at(grace, later), 1);\n 2122│        assert!(h.rows(\"home\", \"ghost\").is_empty(), \"aged Offline ghost evicted\");\n*2123│        let snap = RegistryHost::snapshot_path(&dir.path().join(\"registry\"), \"home\");\n 2124│        let parsed: SubnetRegistry =\n 2125│            serde_json::from_slice(&std::fs::read(&snap).unwrap()).unwrap();\n 2126│        assert!(\n 2127│            parsed.instances(\"ghost\").is_empty(),\n*2128│            \"snapshot rewritten without the aged Offline ghost\"\n 2129│        );\n 2130│\n 2131│        // Idempotent: a second sweep finds nothing.\n     │...\n 2144│            let rec = InfoJson::new(\"mine\", \"now\", std::process::id(), \"s\", \"ready_agent\");\n*2145│            info::write_info(&p, &rec).unwrap();\n 2146│            let mut subnets = SubnetStore::load();\n 2147│            subnets.create_subnet(\"home\").unwrap();\n*2148│            subnets.save().unwrap();\n 2149│\n 2150│            let h = host(home); // node_hex = \"aa11\", never in heard\n 2151│            h.advertise_local(&owlery);\n     │...\n 2178│            let rec = InfoJson::new(\"lab-ag\", \"now\", std::process::id(), \"s\", \"ready_agent\");\n*2179│            info::write_info(&p, &rec).unwrap();\n 2180│            let mut subnets = SubnetStore::load();\n 2181│            subnets.create_subnet(\"lab\").unwrap();\n*2182│            subnets.save().unwrap();\n 2183│\n 2184│            let instance_row = |out: &[RegistryFeedRecord], id: &str| {\n 2185│                out.iter()"},"isError":false,"timestamp":1784271669150}}
{"type":"message","id":"1387d814","parentId":"cd7a7d8d","timestamp":"2026-07-17T07:01:09.153Z","message":{"role":"toolResult","toolCallId":"call_CJDhyB6m3YwQa34RUl50Pr3J|fc_0a061eb498f0e908016a59d334efdc8196b8679f14c7032beb","toolName":"grep","content":[{"type":"text","text":" 7|//! whom* (every roster member of every non-detached member subnet); each worker\n*8|//! owns *what* (its node-local `pre_round` and its per-peer `peer_step`), a thin\n 9|//! call over an already-shipped, idempotent driver. The four legs, in fan-out\n 10|//! order, each in its own module:\n 11|//!\n...\n 34|//! choreography table below): [`compute_due`] (prime-all / wake-forces-one),\n*35|//! [`pre_rounds`] (once per due round, before any peer_step), [`run_due`]\n 36|//! (abort-on-first-fail), [`mark_ran`] (the §V4 stagger), [`fan_targets`]\n 37|//! (detached-skip). LLM-bearing work is never a [`PumpWorker`] (KNOWN-HAZARDS\n 38|//! 7.4) — see the trait's contract.\n...\n 74|\n*75|use crate::brain::{Brain, BrokerEvent, PEER_REPLY_READ_BUDGET};\n 76|use crate::config::DaemonConfig;\n 77|use crate::effect::{Minter, MintedOp};\n 78|use crate::msg::{\n...\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...\n 363|/// (per-subnet × per-roster-member). The pump owns *when* and *toward whom*;\n*364|/// the worker owns *what* — its node-local `pre_round` and its `peer_step`.\n 365|///\n 366|/// **KH 7.4 — never an LLM-bearing worker.** A pump worker is cadenced,\n 367|/// fire-and-forget peer IO. LLM-bearing work (the bounded Psyche reconcile\n...\n 382|\n*383|    /// Node-local work run ONCE per due round, before any `peer_step`.\n 384|    /// Default: nothing.\n 385|    fn pre_round(&mut self, _ctx: &RoundCtx) {}\n 386|\n*387|    /// The per-peer step for one `(subnet, peer)` under this round's context. A\n*388|    /// failure aborts the remaining due workers for THIS peer and drops its\n 389|    /// conn (redial next tick) — abort-on-first-fail, current behaviour.\n*390|    fn peer_step(\n 391|        &mut self,\n 392|        io: &mut PeerIo,\n 393|        subnet: &str,\n...\n 460|    /// A minimal empty round context for worker unit tests whose `pre_round` /\n*461|    /// `peer_step` ignore it (the registry leg keys off its own state, not the\n 462|    /// shared loads).\n 463|    fn for_test() -> RoundCtx {\n 464|        RoundCtx {\n...\n 480|/// epoch-lease double-mint and is forbidden.\n*481|struct PeerIo<'a> {\n 482|    /// The one brain IPC handle.\n*483|    brain: &'a mut Brain,\n 484|    /// The established peer conn id for this step.\n 485|    conn_id: u64,\n 486|    /// The pump's sole durable open-op counter. Workers mint open-ops only\n...\n 491|\n*492|impl PeerIo<'_> {\n 493|    /// Open a fresh stream and write one whole feed fire-and-forget (the\n 494|    /// push-feed discipline — `op_id: None`, finished on send).\n*495|    fn push_feed(&mut self, feed: &[u8]) -> io::Result<()> {\n*496|        push_feed(self.brain, self.conn_id, feed)\n 497|    }\n 498|\n 499|    /// Mint the next durable open-op from the pump's sole counter (exactly-once\n...\n 514|/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\n*515|/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\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...\n 540|    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\n*541|    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\n 542|    // whose reply-reads consume every event kind off their carrier; sharing one\n 543|    // carrier would make a pull-read swallow a presence frame (advancing the\n 544|    // exactly-once cursor while dropping the outcome — the D4c break). Two\n...\n 620|        // Each due worker's node-local pre_round, once per round before ANY\n*621|        // peer_step (only the registry leg does work here — its sweep +\n 622|        // advertise; the rest default to a no-op).\n 623|        pre_rounds(&mut workers, &due_flags, &ctx);\n 624|\n...\n 628|        let mut peer_subnets: HashMap<String, Vec<String>> = HashMap::new();\n*629|        for (sub_name, peer_hex) in fan_targets(&ctx, registry.node_hex()) {\n 630|            peer_subnets.entry(peer_hex).or_default().push(sub_name);\n 631|        }\n 632|        // Health targets = this round's fan-out set; snapshot the registry\n...\n 638|\n*639|        // Submit NON-BLOCKING dials for eligible unconnected peers; run the due\n*640|        // legs NOW for already-connected ones. The live peer advertises without\n 641|        // waiting on a dead one (no head-of-line block) — a dead peer is only a\n 642|        // pending outcome, never a serial blocker.\n*643|        for (peer_hex, subs) in &peer_subnets {\n 644|            if let Some(&conn_id) = conns.get(peer_hex) {\n 645|                run_peer_subnets(\n 646|                    &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n...\n 754|/// Run each due worker's node-local `pre_round` ONCE for the round, before any\n*755|/// peer_step (the registry sweep + advertise; the other legs default no-op).\n 756|fn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\n 757|    for i in 0..workers.len() {\n 758|        if due_flags[i] {\n...\n 780|/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\n*781|/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\n*782|/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\n 783|/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\n 784|/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n 785|/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\n...\n 809|\n*810|/// Run every due worker's `peer_step` for a CONNECTED peer across all subnets it\n 811|/// targets this round (one conn serves them all), applying [`peer_leg_outcome`]\n 812|/// after each — an ordinary failure drops the conn + backs the peer off and stops\n 813|/// this peer's remaining legs; a carrier desync bubbles to a supervised restart.\n...\n 817|fn run_peer_subnets(\n*818|    brain: &mut Brain,\n 819|    ops: &mut EpochSource,\n 820|    workers: &mut [&mut dyn PumpWorker],\n 821|    due_flags: &[bool],\n...\n 836|            };\n*837|            workers[i].peer_step(&mut io, sub_name, peer_hex, ctx)\n 838|        });\n 839|        peer_leg_outcome(outcome, peer_hex, conns, sched, now)?;\n 840|        if !conns.contains_key(peer_hex) {\n...\n 858|    ev: NetPresenceEvent,\n*859|    brain: &mut Brain,\n 860|    ops: &mut EpochSource,\n 861|    workers: &mut [&mut dyn PumpWorker],\n 862|    due_flags: &[bool],\n...\n 990|        }\n*991|        for peer in push_targets(&ctx.policy.roster, &sub.name, self_hex) {\n 992|            out.push((sub.name.clone(), peer));\n 993|        }\n 994|    }\n...\n 1022|///    cold-start fast path that skips the id-only discovery round-trip);\n*1023|/// 2. the VALIDATED `RosterEntry.address` for that peer (`address.id` must\n 1024|///    match the peer key — a poison row never becomes a route): a node\n 1025|///    holding a valid roster address is never route-less, which is exactly\n 1026|///    what the 2026-07-10 field incident falsified about the old shape;\n...\n 1118|/// stream per feed: streams are single-purpose by the demux contract.\n*1119|fn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n 1120|    let opened = brain.net_open_stream(conn_id, None)?;\n 1121|    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n 1122|    Ok(())\n...\n 1126|/// startup): the carrier is split at construction with the per-call deadline\n*1127|/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\n 1128|/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\n 1129|// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*1130|fn connect(broker_name: &str) -> io::Result<Brain> {\n 1131|    let mut last = io::Error::other(\"broker never answered\");\n 1132|    for _ in 0..300 {\n*1133|        match Brain::cold_start_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\n 1134|            Ok(b) => return Ok(b),\n 1135|            Err(e) => last = e,\n 1136|        }\n...\n 1360|    /// A scripted [`PumpWorker`] that records its `pre_round` into a shared log\n*1361|    /// and returns a preset cadence / wake. `peer_step` is never invoked by the\n 1362|    /// kernel tests (they drive `run_due` with a recording closure), so it is a\n 1363|    /// no-op satisfying the trait.\n 1364|    struct RecordingWorker {\n...\n 1380|        }\n*1381|        fn peer_step(\n 1382|            &mut self,\n 1383|            _io: &mut PeerIo,\n 1384|            _subnet: &str,\n...\n 1430|\n*1431|    // Fact 3 — pre_round-once-per-due-round-before-any-peer_step: pre_round\n 1432|    // fires exactly once per DUE worker (never for a not-due one, never per\n*1433|    // peer), and ALL pre_rounds precede ALL peer_steps. Fact (peer_step only\n 1434|    // for due workers) rides along.\n 1435|    #[test]\n*1436|    fn choreography_pre_round_once_and_before_any_peer_step() {\n 1437|        let log = Rc::new(RefCell::new(Vec::new()));\n 1438|        let day = Duration::from_secs(86_400);\n 1439|        let mut a = rec(day, false, &log, 'a');\n...\n 1461|        assert!(!l.iter().any(|e| e == \"pre:b\"), \"not-due leg never pre_rounds\");\n*1462|        // All pre_rounds precede all peer_steps.\n 1463|        let first_step = l.iter().position(|e| e.starts_with(\"step:\")).unwrap();\n 1464|        assert!(\n 1465|            l[..first_step].iter().all(|e| e.starts_with(\"pre:\")),\n*1466|            \"every pre_round runs before any peer_step: {l:?}\"\n 1467|        );\n*1468|        // peer_step runs for due indices only (0 and 2), once per peer (×2).\n 1469|        assert_eq!(l.iter().filter(|e| e.as_str() == \"step:0\").count(), 2);\n 1470|        assert_eq!(l.iter().filter(|e| e.as_str() == \"step:1\").count(), 0, \"not-due skipped\");\n 1471|        assert_eq!(l.iter().filter(|e| e.as_str() == \"step:2\").count(), 2);\n...\n 1473|\n*1474|    // Fact 4 — failed-peer_step-aborts-remaining-due-workers-for-that-peer:\n 1475|    // the first error stops the per-peer fan-out (the caller then drops the\n 1476|    // conn); a not-due index is skipped entirely.\n 1477|    #[test]\n*1478|    fn choreography_peer_step_aborts_on_first_failure() {\n 1479|        // Abort: index 1 fails → index 2 never reached.\n 1480|        let mut seen = Vec::new();\n 1481|        let res = run_due(&[true, true, true], |i| {\n...\n 1679|\n*1680|        // CONNECTED for a peer that is NOT a target → cache but DON'T run legs.\n 1681|        assert!(!presence_state_effect(\n 1682|            &ev(PRESENCE_CONNECTED, 5, \"bystander\"),\n 1683|            &mut conns, &mut sched, &mut pending, &seeds, &mut health, false, now,"}],"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":47,"fileCount":1,"files":["crates/spt-daemon/src/pump/mod.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/pump/mod.rs","count":47}],"truncated":false,"displayContent":"    7│//! whom* (every roster member of every non-detached member subnet); each worker\n   *8│//! owns *what* (its node-local `pre_round` and its per-peer `peer_step`), a thin\n    9│//! call over an already-shipped, idempotent driver. The four legs, in fan-out\n   10│//! order, each in its own module:\n   11│//!\n     │...\n   34│//! choreography table below): [`compute_due`] (prime-all / wake-forces-one),\n  *35│//! [`pre_rounds`] (once per due round, before any peer_step), [`run_due`]\n   36│//! (abort-on-first-fail), [`mark_ran`] (the §V4 stagger), [`fan_targets`]\n   37│//! (detached-skip). LLM-bearing work is never a [`PumpWorker`] (KNOWN-HAZARDS\n   38│//! 7.4) — see the trait's contract.\n     │...\n   74│\n  *75│use crate::brain::{Brain, BrokerEvent, PEER_REPLY_READ_BUDGET};\n   76│use crate::config::DaemonConfig;\n   77│use crate::effect::{Minter, MintedOp};\n   78│use crate::msg::{\n     │...\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     │...\n  363│/// (per-subnet × per-roster-member). The pump owns *when* and *toward whom*;\n *364│/// the worker owns *what* — its node-local `pre_round` and its `peer_step`.\n  365│///\n  366│/// **KH 7.4 — never an LLM-bearing worker.** A pump worker is cadenced,\n  367│/// fire-and-forget peer IO. LLM-bearing work (the bounded Psyche reconcile\n     │...\n  382│\n *383│    /// Node-local work run ONCE per due round, before any `peer_step`.\n  384│    /// Default: nothing.\n  385│    fn pre_round(&mut self, _ctx: &RoundCtx) {}\n  386│\n *387│    /// The per-peer step for one `(subnet, peer)` under this round's context. A\n *388│    /// failure aborts the remaining due workers for THIS peer and drops its\n  389│    /// conn (redial next tick) — abort-on-first-fail, current behaviour.\n *390│    fn peer_step(\n  391│        &mut self,\n  392│        io: &mut PeerIo,\n  393│        subnet: &str,\n     │...\n  460│    /// A minimal empty round context for worker unit tests whose `pre_round` /\n *461│    /// `peer_step` ignore it (the registry leg keys off its own state, not the\n  462│    /// shared loads).\n  463│    fn for_test() -> RoundCtx {\n  464│        RoundCtx {\n     │...\n  480│/// epoch-lease double-mint and is forbidden.\n *481│struct PeerIo<'a> {\n  482│    /// The one brain IPC handle.\n *483│    brain: &'a mut Brain,\n  484│    /// The established peer conn id for this step.\n  485│    conn_id: u64,\n  486│    /// The pump's sole durable open-op counter. Workers mint open-ops only\n     │...\n  491│\n *492│impl PeerIo<'_> {\n  493│    /// Open a fresh stream and write one whole feed fire-and-forget (the\n  494│    /// push-feed discipline — `op_id: None`, finished on send).\n *495│    fn push_feed(&mut self, feed: &[u8]) -> io::Result<()> {\n *496│        push_feed(self.brain, self.conn_id, feed)\n  497│    }\n  498│\n  499│    /// Mint the next durable open-op from the pump's sole counter (exactly-once\n     │...\n  514│/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\n *515│/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\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     │...\n  540│    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\n *541│    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\n  542│    // whose reply-reads consume every event kind off their carrier; sharing one\n  543│    // carrier would make a pull-read swallow a presence frame (advancing the\n  544│    // exactly-once cursor while dropping the outcome — the D4c break). Two\n     │...\n  620│        // Each due worker's node-local pre_round, once per round before ANY\n *621│        // peer_step (only the registry leg does work here — its sweep +\n  622│        // advertise; the rest default to a no-op).\n  623│        pre_rounds(&mut workers, &due_flags, &ctx);\n  624│\n     │...\n  628│        let mut peer_subnets: HashMap<String, Vec<String>> = HashMap::new();\n *629│        for (sub_name, peer_hex) in fan_targets(&ctx, registry.node_hex()) {\n  630│            peer_subnets.entry(peer_hex).or_default().push(sub_name);\n  631│        }\n  632│        // Health targets = this round's fan-out set; snapshot the registry\n     │...\n  638│\n *639│        // Submit NON-BLOCKING dials for eligible unconnected peers; run the due\n *640│        // legs NOW for already-connected ones. The live peer advertises without\n  641│        // waiting on a dead one (no head-of-line block) — a dead peer is only a\n  642│        // pending outcome, never a serial blocker.\n *643│        for (peer_hex, subs) in &peer_subnets {\n  644│            if let Some(&conn_id) = conns.get(peer_hex) {\n  645│                run_peer_subnets(\n  646│                    &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n     │...\n  754│/// Run each due worker's node-local `pre_round` ONCE for the round, before any\n *755│/// peer_step (the registry sweep + advertise; the other legs default no-op).\n  756│fn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\n  757│    for i in 0..workers.len() {\n  758│        if due_flags[i] {\n     │...\n  780│/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\n *781│/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\n *782│/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\n  783│/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\n  784│/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n  785│/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\n     │...\n  809│\n *810│/// Run every due worker's `peer_step` for a CONNECTED peer across all subnets it\n  811│/// targets this round (one conn serves them all), applying [`peer_leg_outcome`]\n  812│/// after each — an ordinary failure drops the conn + backs the peer off and stops\n  813│/// this peer's remaining legs; a carrier desync bubbles to a supervised restart.\n     │...\n  817│fn run_peer_subnets(\n *818│    brain: &mut Brain,\n  819│    ops: &mut EpochSource,\n  820│    workers: &mut [&mut dyn PumpWorker],\n  821│    due_flags: &[bool],\n     │...\n  836│            };\n *837│            workers[i].peer_step(&mut io, sub_name, peer_hex, ctx)\n  838│        });\n  839│        peer_leg_outcome(outcome, peer_hex, conns, sched, now)?;\n  840│        if !conns.contains_key(peer_hex) {\n     │...\n  858│    ev: NetPresenceEvent,\n *859│    brain: &mut Brain,\n  860│    ops: &mut EpochSource,\n  861│    workers: &mut [&mut dyn PumpWorker],\n  862│    due_flags: &[bool],\n     │...\n  990│        }\n *991│        for peer in push_targets(&ctx.policy.roster, &sub.name, self_hex) {\n  992│            out.push((sub.name.clone(), peer));\n  993│        }\n  994│    }\n     │...\n 1022│///    cold-start fast path that skips the id-only discovery round-trip);\n*1023│/// 2. the VALIDATED `RosterEntry.address` for that peer (`address.id` must\n 1024│///    match the peer key — a poison row never becomes a route): a node\n 1025│///    holding a valid roster address is never route-less, which is exactly\n 1026│///    what the 2026-07-10 field incident falsified about the old shape;\n     │...\n 1118│/// stream per feed: streams are single-purpose by the demux contract.\n*1119│fn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n 1120│    let opened = brain.net_open_stream(conn_id, None)?;\n 1121│    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n 1122│    Ok(())\n     │...\n 1126│/// startup): the carrier is split at construction with the per-call deadline\n*1127│/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\n 1128│/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\n 1129│// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*1130│fn connect(broker_name: &str) -> io::Result<Brain> {\n 1131│    let mut last = io::Error::other(\"broker never answered\");\n 1132│    for _ in 0..300 {\n*1133│        match Brain::cold_start_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\n 1134│            Ok(b) => return Ok(b),\n 1135│            Err(e) => last = e,\n 1136│        }\n     │...\n 1360│    /// A scripted [`PumpWorker`] that records its `pre_round` into a shared log\n*1361│    /// and returns a preset cadence / wake. `peer_step` is never invoked by the\n 1362│    /// kernel tests (they drive `run_due` with a recording closure), so it is a\n 1363│    /// no-op satisfying the trait.\n 1364│    struct RecordingWorker {\n     │...\n 1380│        }\n*1381│        fn peer_step(\n 1382│            &mut self,\n 1383│            _io: &mut PeerIo,\n 1384│            _subnet: &str,\n     │...\n 1430│\n*1431│    // Fact 3 — pre_round-once-per-due-round-before-any-peer_step: pre_round\n 1432│    // fires exactly once per DUE worker (never for a not-due one, never per\n*1433│    // peer), and ALL pre_rounds precede ALL peer_steps. Fact (peer_step only\n 1434│    // for due workers) rides along.\n 1435│    #[test]\n*1436│    fn choreography_pre_round_once_and_before_any_peer_step() {\n 1437│        let log = Rc::new(RefCell::new(Vec::new()));\n 1438│        let day = Duration::from_secs(86_400);\n 1439│        let mut a = rec(day, false, &log, 'a');\n     │...\n 1461│        assert!(!l.iter().any(|e| e == \"pre:b\"), \"not-due leg never pre_rounds\");\n*1462│        // All pre_rounds precede all peer_steps.\n 1463│        let first_step = l.iter().position(|e| e.starts_with(\"step:\")).unwrap();\n 1464│        assert!(\n 1465│            l[..first_step].iter().all(|e| e.starts_with(\"pre:\")),\n*1466│            \"every pre_round runs before any peer_step: {l:?}\"\n 1467│        );\n*1468│        // peer_step runs for due indices only (0 and 2), once per peer (×2).\n 1469│        assert_eq!(l.iter().filter(|e| e.as_str() == \"step:0\").count(), 2);\n 1470│        assert_eq!(l.iter().filter(|e| e.as_str() == \"step:1\").count(), 0, \"not-due skipped\");\n 1471│        assert_eq!(l.iter().filter(|e| e.as_str() == \"step:2\").count(), 2);\n     │...\n 1473│\n*1474│    // Fact 4 — failed-peer_step-aborts-remaining-due-workers-for-that-peer:\n 1475│    // the first error stops the per-peer fan-out (the caller then drops the\n 1476│    // conn); a not-due index is skipped entirely.\n 1477│    #[test]\n*1478│    fn choreography_peer_step_aborts_on_first_failure() {\n 1479│        // Abort: index 1 fails → index 2 never reached.\n 1480│        let mut seen = Vec::new();\n 1481│        let res = run_due(&[true, true, true], |i| {\n     │...\n 1679│\n*1680│        // CONNECTED for a peer that is NOT a target → cache but DON'T run legs.\n 1681│        assert!(!presence_state_effect(\n 1682│            &ev(PRESENCE_CONNECTED, 5, \"bystander\"),\n 1683│            &mut conns, &mut sched, &mut pending, &seeds, &mut health, false, now,"},"isError":false,"timestamp":1784271669153}}
{"type":"message","id":"7043ad88","parentId":"1387d814","timestamp":"2026-07-17T07:01:09.156Z","message":{"role":"toolResult","toolCallId":"call_HFUXChwWESsMayXQAQpa4p4Q|fc_0a061eb498f0e908016a59d334efc481968d1055afc7e09052","toolName":"grep","content":[{"type":"text","text":" 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...\n 107|    machine_id: Option<String>,\n*108|    /// When each peer node was last *heard* (an admitted inbound feed,\n 109|    /// wall-clock ms) — the gossip-recency half of the M7 D2 hybrid\n 110|    /// liveness (REQ-SUBNET-1): a recently-heard node renders online without\n 111|    /// a probe; only stale rows get dialed. Local-only (never on the wire);\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...\n 149|            heard: Mutex::new(BTreeMap::new()),\n*150|            last_admit_ms: std::sync::atomic::AtomicU64::new(0),\n 151|            regs: Mutex::new(BTreeMap::new()),\n 152|            epoch: Mutex::new(epoch),\n 153|            snapshot_dir,\n...\n 214|    // [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n*215|    pub fn apply_feed(\n 216|        &self,\n 217|        origin_node: &str,\n 218|        updates: &[RegistryUpdate],\n*219|        policy: &RegistryGatePolicy,\n 220|    ) -> Vec<RegistryApplyVerdict> {\n*221|        self.apply_feed_flips(origin_node, updates, policy).0\n 222|    }\n 223|\n*224|    /// [`apply_feed`](Self::apply_feed) that ALSO reports **attention\n*225|    /// flips** (D9-2, REQ-INST-3): the endpoint ids whose admitted update was\n 226|    /// an observed *transition to `Active` on a peer node* — the wire signal\n 227|    /// that another instance of the id just became the driven one (its\n 228|    /// daemon advertises transitions epoch-bumped), which rests a local\n...\n 240|    // [impl->REQ-INST-3]\n*241|    pub fn apply_feed_flips(\n 242|        &self,\n 243|        origin_node: &str,\n 244|        updates: &[RegistryUpdate],\n*245|        policy: &RegistryGatePolicy,\n 246|    ) -> (Vec<RegistryApplyVerdict>, Vec<String>) {\n 247|        let mut regs = self.regs.lock().unwrap();\n 248|        let mut flips: Vec<String> = Vec::new();\n*249|        let mut admitted_any = false;\n 250|        let verdicts = updates\n 251|            .iter()\n 252|            .map(|u| {\n...\n 259|                }\n*260|                admitted_any = true;\n 261|                let reg = regs.entry(u.subnet.clone()).or_default();\n 262|                let prev = reg\n 263|                    .instances(&u.endpoint_id)\n...\n 287|        // [impl->REQ-SUBNET-1]\n*288|        if admitted_any {\n 289|            self.heard\n 290|                .lock()\n 291|                .unwrap()\n 292|                .insert(origin_node.to_string(), wall_ms());\n*293|            self.stamp_admit();\n 294|        }\n 295|        self.write_snapshots();\n 296|        (verdicts, flips)\n...\n 299|    /// Apply inbound node-level label updates (REQ-SUBNET-3) under the SAME\n*300|    /// fail-closed gate as [`apply_feed_flips`]: a non-member subnet or an\n*301|    /// untrusted origin is refused; an admitted update merges via\n 302|    /// [`SubnetRegistry::merge_node_label`] (epoch lease) and stamps the\n*303|    /// origin's gossip-recency (an admitted label feed proves the peer is up,\n 304|    /// exactly like an instance feed). The endpoint-less carrier: this is how a\n 305|    /// peer with zero endpoints gets its hostname into our `--nodes` view.\n 306|    // [impl->REQ-SUBNET-3]\n...\n 310|        updates: &[NodeLabelUpdate],\n*311|        policy: &RegistryGatePolicy,\n 312|    ) -> Vec<RegistryApplyVerdict> {\n 313|        let mut regs = self.regs.lock().unwrap();\n*314|        let mut admitted_any = false;\n 315|        let verdicts = updates\n 316|            .iter()\n 317|            .map(|u| {\n...\n 324|                }\n*325|                admitted_any = true;\n 326|                let reg = regs.entry(u.subnet.clone()).or_default();\n 327|                RegistryApplyVerdict::Merged(reg.merge_node_label(\n 328|                    &u.node,\n...\n 334|        drop(regs);\n*335|        if admitted_any {\n 336|            self.heard\n 337|                .lock()\n 338|                .unwrap()\n 339|                .insert(origin_node.to_string(), wall_ms());\n*340|            self.stamp_admit();\n 341|        }\n 342|        self.write_snapshots();\n 343|        verdicts\n...\n 345|\n*346|    /// Record an admitted inbound feed (any origin) for the health surface.\n 347|    // [impl->REQ-PUMP-STAGE-TRUTH]\n*348|    fn stamp_admit(&self) {\n*349|        self.last_admit_ms\n 350|            .store(wall_ms(), std::sync::atomic::Ordering::Relaxed);\n 351|    }\n 352|\n*353|    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\n 354|    /// this process lifetime (ADR-0039 Decision 5 status field).\n 355|    // [impl->REQ-PUMP-STAGE-TRUTH]\n*356|    pub fn last_admit_ms(&self) -> Option<u64> {\n 357|        match self\n*358|            .last_admit_ms\n 359|            .load(std::sync::atomic::Ordering::Relaxed)\n 360|        {\n 361|            0 => None,\n...\n 636|    /// Evict every registry row authored by a **silent** peer node\n*637|    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n 638|    /// within `ttl` has its rows removed from every subnet registry and the\n 639|    /// snapshots rewritten, so a dead node identity can no longer poison\n 640|    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n...\n 642|    /// map). A row whose author has NO heard stamp is treated as silent —\n*643|    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\n 644|    /// (own rows, excluded), so an unstamped foreign row is already an\n 645|    /// anomaly and fails toward eviction. A merely-offline peer reconverges\n 646|    /// within one pump cadence of its return (re-advertisement from its\n...\n 769|    /// The heard-map mirror's path (the CLI reader's contract): `node hex →\n*770|    /// last admitted-feed wall ms`.\n 771|    // [impl->REQ-SUBNET-1]\n 772|    pub fn heard_path(dir: &Path) -> PathBuf {\n 773|        dir.join(\"heard.meta\")\n...\n 1203|\n*1204|    fn policy(subnet: &str, trusted: &str) -> RegistryGatePolicy {\n 1205|        let mut roster = RosterStore::default();\n 1206|        roster.merge_entry(member(subnet, trusted));\n*1207|        RegistryGatePolicy {\n 1208|            subnets: vec![subnet.to_string()],\n 1209|            roster,\n 1210|        }\n...\n 1317|        let p = policy(\"home\", \"old-key\");\n*1318|        h.apply_feed(\n 1319|            \"old-key\",\n 1320|            &[RegistryUpdate {\n 1321|                subnet: \"home\".into(),\n...\n 1403|        );\n*1404|        h2.apply_feed(\n 1405|            \"old2\",\n 1406|            &[RegistryUpdate {\n 1407|                subnet: \"home\".into(),\n...\n 1424|    // [unit->REQ-INST-7] inbound feeds gate fail-closed: non-member subnet\n*1425|    // and untrusted origin write nothing; an admitted row merges and the\n 1426|    // epoch lease still drops a stale follow-up.\n 1427|    #[test]\n*1428|    fn apply_feed_gates_and_merges_under_the_lease() {\n 1429|        let dir = tempfile::tempdir().unwrap();\n 1430|        let h = host(dir.path());\n 1431|        let p = policy(\"home\", \"bb22\");\n 1432|\n*1433|        let v = h.apply_feed(\"bb22\", &[upd(\"other\", \"ling\", \"bb22\", 5)], &p);\n 1434|        assert_eq!(v, vec![RegistryApplyVerdict::NotMember]);\n*1435|        let v = h.apply_feed(\"cc33\", &[upd(\"home\", \"ling\", \"cc33\", 5)], &p);\n 1436|        assert_eq!(v, vec![RegistryApplyVerdict::UntrustedOrigin]);\n 1437|        assert!(\n 1438|            h.rows(\"home\", \"ling\").is_empty(),\n...\n 1441|\n*1442|        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 1443|        assert_eq!(\n 1444|            v,\n 1445|            vec![RegistryApplyVerdict::Merged(MergeOutcome::Inserted)]\n...\n 1447|        // A lagging lower-epoch update is dropped by the lease (4.8).\n*1448|        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 4)], &p);\n 1449|        assert_eq!(v, vec![RegistryApplyVerdict::Merged(MergeOutcome::Stale)]);\n 1450|        assert_eq!(h.rows(\"home\", \"ling\")[0].epoch, 5);\n 1451|    }\n...\n 1559|    #[test]\n*1560|    fn apply_feed_flips_only_on_observed_transition_to_active() {\n 1561|        let dir = tempfile::tempdir().unwrap();\n 1562|        let h = host(dir.path()); // node_hex = \"aa11\"\n 1563|        let p = policy(\"home\", \"bb22\");\n...\n 1595|        // First sight of the row (Inserted, Active): NOT a flip.\n*1596|        let (_, flips) = h.apply_feed_flips(\n 1597|            \"bb22\",\n 1598|            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 1)],\n 1599|            &p,\n...\n 1606|        // Periodic re-advertisement (Updated, prev already Active): NOT a flip.\n*1607|        let (_, flips) = h.apply_feed_flips(\n 1608|            \"bb22\",\n 1609|            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 2)],\n 1610|            &p,\n...\n 1617|        // The peer instance rests…\n*1618|        let (_, flips) = h.apply_feed_flips(\n 1619|            \"bb22\",\n 1620|            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Dormant, 3)],\n 1621|            &p,\n...\n 1625|        // …and WAKES: Dormant→Active at a fresh epoch — THE flip.\n*1626|        let (_, flips) = h.apply_feed_flips(\n 1627|            \"bb22\",\n 1628|            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 4)],\n 1629|            &p,\n...\n 1637|        // A lagging stale wake (lower epoch) is dropped by the lease — no flip.\n*1638|        h.apply_feed_flips(\n 1639|            \"bb22\",\n 1640|            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Dormant, 5)],\n 1641|            &p,\n 1642|        );\n*1643|        let (v, flips) = h.apply_feed_flips(\n 1644|            \"bb22\",\n 1645|            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 4)],\n 1646|            &p,\n...\n 1653|    // fail-closed gate as instance feeds: a non-member subnet and an untrusted\n*1654|    // origin are refused (no merge); an admitted label merges under the epoch\n 1655|    // lease and lands in the registry's node-label map — the endpoint-less\n 1656|    // carrier a peer with zero rows uses to name itself.\n 1657|    #[test]\n...\n 1997|    #[test]\n*1998|    fn admitted_feeds_stamp_the_heard_map() {\n 1999|        let dir = tempfile::tempdir().unwrap();\n 2000|        let h = host(dir.path());\n 2001|        let p = policy(\"home\", \"bb22\");\n...\n 2003|        // Refused (untrusted origin): no stamp, no mirror.\n*2004|        h.apply_feed(\"cc33\", &[upd(\"home\", \"ling\", \"cc33\", 5)], &p);\n 2005|        assert!(!RegistryHost::heard_path(&dir.path().join(\"registry\")).exists());\n 2006|\n 2007|        // Admitted: stamped + mirrored.\n*2008|        h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 2009|        let heard_file = RegistryHost::heard_path(&dir.path().join(\"registry\"));\n 2010|        let heard: BTreeMap<String, u64> =\n 2011|            serde_json::from_slice(&std::fs::read(&heard_file).expect(\"mirror written\")).unwrap();\n...\n 2020|        std::thread::sleep(std::time::Duration::from_millis(15));\n*2021|        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 2022|        assert_eq!(v, vec![RegistryApplyVerdict::Merged(MergeOutcome::Stale)]);\n 2023|        let heard: BTreeMap<String, u64> =\n 2024|            serde_json::from_slice(&std::fs::read(&heard_file).unwrap()).unwrap();\n...\n 2042|        // The peer feeds (heard stamped at ~now)…\n*2043|        h.apply_feed(\"bb22\", &[upd(\"home\", \"sergey\", \"bb22\", 5)], &p);\n 2044|        let stamped = {\n 2045|            let heard: BTreeMap<String, u64> = serde_json::from_slice(\n 2046|                &std::fs::read(RegistryHost::heard_path(&dir.path().join(\"registry\"))).unwrap(),\n...\n 2109|        // A still-trusted peer advertises an Offline endpoint (a purge ghost).\n*2110|        h.apply_feed(\"bb22\", &[upd_offline(\"home\", \"ghost\", \"bb22\", 5)], &p);\n 2111|        assert_eq!(h.rows(\"home\", \"ghost\").len(), 1);\n 2112|\n 2113|        // First sweep stamps the receiver-observed offline_since; within the grace"}],"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":62,"fileCount":1,"files":["crates/spt-daemon/src/registryhost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/registryhost.rs","count":62}],"truncated":false,"displayContent":"   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     │...\n  107│    machine_id: Option<String>,\n *108│    /// When each peer node was last *heard* (an admitted inbound feed,\n  109│    /// wall-clock ms) — the gossip-recency half of the M7 D2 hybrid\n  110│    /// liveness (REQ-SUBNET-1): a recently-heard node renders online without\n  111│    /// a probe; only stale rows get dialed. Local-only (never on the wire);\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     │...\n  149│            heard: Mutex::new(BTreeMap::new()),\n *150│            last_admit_ms: std::sync::atomic::AtomicU64::new(0),\n  151│            regs: Mutex::new(BTreeMap::new()),\n  152│            epoch: Mutex::new(epoch),\n  153│            snapshot_dir,\n     │...\n  214│    // [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n *215│    pub fn apply_feed(\n  216│        &self,\n  217│        origin_node: &str,\n  218│        updates: &[RegistryUpdate],\n *219│        policy: &RegistryGatePolicy,\n  220│    ) -> Vec<RegistryApplyVerdict> {\n *221│        self.apply_feed_flips(origin_node, updates, policy).0\n  222│    }\n  223│\n *224│    /// [`apply_feed`](Self::apply_feed) that ALSO reports **attention\n *225│    /// flips** (D9-2, REQ-INST-3): the endpoint ids whose admitted update was\n  226│    /// an observed *transition to `Active` on a peer node* — the wire signal\n  227│    /// that another instance of the id just became the driven one (its\n  228│    /// daemon advertises transitions epoch-bumped), which rests a local\n     │...\n  240│    // [impl->REQ-INST-3]\n *241│    pub fn apply_feed_flips(\n  242│        &self,\n  243│        origin_node: &str,\n  244│        updates: &[RegistryUpdate],\n *245│        policy: &RegistryGatePolicy,\n  246│    ) -> (Vec<RegistryApplyVerdict>, Vec<String>) {\n  247│        let mut regs = self.regs.lock().unwrap();\n  248│        let mut flips: Vec<String> = Vec::new();\n *249│        let mut admitted_any = false;\n  250│        let verdicts = updates\n  251│            .iter()\n  252│            .map(|u| {\n     │...\n  259│                }\n *260│                admitted_any = true;\n  261│                let reg = regs.entry(u.subnet.clone()).or_default();\n  262│                let prev = reg\n  263│                    .instances(&u.endpoint_id)\n     │...\n  287│        // [impl->REQ-SUBNET-1]\n *288│        if admitted_any {\n  289│            self.heard\n  290│                .lock()\n  291│                .unwrap()\n  292│                .insert(origin_node.to_string(), wall_ms());\n *293│            self.stamp_admit();\n  294│        }\n  295│        self.write_snapshots();\n  296│        (verdicts, flips)\n     │...\n  299│    /// Apply inbound node-level label updates (REQ-SUBNET-3) under the SAME\n *300│    /// fail-closed gate as [`apply_feed_flips`]: a non-member subnet or an\n *301│    /// untrusted origin is refused; an admitted update merges via\n  302│    /// [`SubnetRegistry::merge_node_label`] (epoch lease) and stamps the\n *303│    /// origin's gossip-recency (an admitted label feed proves the peer is up,\n  304│    /// exactly like an instance feed). The endpoint-less carrier: this is how a\n  305│    /// peer with zero endpoints gets its hostname into our `--nodes` view.\n  306│    // [impl->REQ-SUBNET-3]\n     │...\n  310│        updates: &[NodeLabelUpdate],\n *311│        policy: &RegistryGatePolicy,\n  312│    ) -> Vec<RegistryApplyVerdict> {\n  313│        let mut regs = self.regs.lock().unwrap();\n *314│        let mut admitted_any = false;\n  315│        let verdicts = updates\n  316│            .iter()\n  317│            .map(|u| {\n     │...\n  324│                }\n *325│                admitted_any = true;\n  326│                let reg = regs.entry(u.subnet.clone()).or_default();\n  327│                RegistryApplyVerdict::Merged(reg.merge_node_label(\n  328│                    &u.node,\n     │...\n  334│        drop(regs);\n *335│        if admitted_any {\n  336│            self.heard\n  337│                .lock()\n  338│                .unwrap()\n  339│                .insert(origin_node.to_string(), wall_ms());\n *340│            self.stamp_admit();\n  341│        }\n  342│        self.write_snapshots();\n  343│        verdicts\n     │...\n  345│\n *346│    /// Record an admitted inbound feed (any origin) for the health surface.\n  347│    // [impl->REQ-PUMP-STAGE-TRUTH]\n *348│    fn stamp_admit(&self) {\n *349│        self.last_admit_ms\n  350│            .store(wall_ms(), std::sync::atomic::Ordering::Relaxed);\n  351│    }\n  352│\n *353│    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\n  354│    /// this process lifetime (ADR-0039 Decision 5 status field).\n  355│    // [impl->REQ-PUMP-STAGE-TRUTH]\n *356│    pub fn last_admit_ms(&self) -> Option<u64> {\n  357│        match self\n *358│            .last_admit_ms\n  359│            .load(std::sync::atomic::Ordering::Relaxed)\n  360│        {\n  361│            0 => None,\n     │...\n  636│    /// Evict every registry row authored by a **silent** peer node\n *637│    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n  638│    /// within `ttl` has its rows removed from every subnet registry and the\n  639│    /// snapshots rewritten, so a dead node identity can no longer poison\n  640│    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n     │...\n  642│    /// map). A row whose author has NO heard stamp is treated as silent —\n *643│    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\n  644│    /// (own rows, excluded), so an unstamped foreign row is already an\n  645│    /// anomaly and fails toward eviction. A merely-offline peer reconverges\n  646│    /// within one pump cadence of its return (re-advertisement from its\n     │...\n  769│    /// The heard-map mirror's path (the CLI reader's contract): `node hex →\n *770│    /// last admitted-feed wall ms`.\n  771│    // [impl->REQ-SUBNET-1]\n  772│    pub fn heard_path(dir: &Path) -> PathBuf {\n  773│        dir.join(\"heard.meta\")\n     │...\n 1203│\n*1204│    fn policy(subnet: &str, trusted: &str) -> RegistryGatePolicy {\n 1205│        let mut roster = RosterStore::default();\n 1206│        roster.merge_entry(member(subnet, trusted));\n*1207│        RegistryGatePolicy {\n 1208│            subnets: vec![subnet.to_string()],\n 1209│            roster,\n 1210│        }\n     │...\n 1317│        let p = policy(\"home\", \"old-key\");\n*1318│        h.apply_feed(\n 1319│            \"old-key\",\n 1320│            &[RegistryUpdate {\n 1321│                subnet: \"home\".into(),\n     │...\n 1403│        );\n*1404│        h2.apply_feed(\n 1405│            \"old2\",\n 1406│            &[RegistryUpdate {\n 1407│                subnet: \"home\".into(),\n     │...\n 1424│    // [unit->REQ-INST-7] inbound feeds gate fail-closed: non-member subnet\n*1425│    // and untrusted origin write nothing; an admitted row merges and the\n 1426│    // epoch lease still drops a stale follow-up.\n 1427│    #[test]\n*1428│    fn apply_feed_gates_and_merges_under_the_lease() {\n 1429│        let dir = tempfile::tempdir().unwrap();\n 1430│        let h = host(dir.path());\n 1431│        let p = policy(\"home\", \"bb22\");\n 1432│\n*1433│        let v = h.apply_feed(\"bb22\", &[upd(\"other\", \"ling\", \"bb22\", 5)], &p);\n 1434│        assert_eq!(v, vec![RegistryApplyVerdict::NotMember]);\n*1435│        let v = h.apply_feed(\"cc33\", &[upd(\"home\", \"ling\", \"cc33\", 5)], &p);\n 1436│        assert_eq!(v, vec![RegistryApplyVerdict::UntrustedOrigin]);\n 1437│        assert!(\n 1438│            h.rows(\"home\", \"ling\").is_empty(),\n     │...\n 1441│\n*1442│        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 1443│        assert_eq!(\n 1444│            v,\n 1445│            vec![RegistryApplyVerdict::Merged(MergeOutcome::Inserted)]\n     │...\n 1447│        // A lagging lower-epoch update is dropped by the lease (4.8).\n*1448│        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 4)], &p);\n 1449│        assert_eq!(v, vec![RegistryApplyVerdict::Merged(MergeOutcome::Stale)]);\n 1450│        assert_eq!(h.rows(\"home\", \"ling\")[0].epoch, 5);\n 1451│    }\n     │...\n 1559│    #[test]\n*1560│    fn apply_feed_flips_only_on_observed_transition_to_active() {\n 1561│        let dir = tempfile::tempdir().unwrap();\n 1562│        let h = host(dir.path()); // node_hex = \"aa11\"\n 1563│        let p = policy(\"home\", \"bb22\");\n     │...\n 1595│        // First sight of the row (Inserted, Active): NOT a flip.\n*1596│        let (_, flips) = h.apply_feed_flips(\n 1597│            \"bb22\",\n 1598│            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 1)],\n 1599│            &p,\n     │...\n 1606│        // Periodic re-advertisement (Updated, prev already Active): NOT a flip.\n*1607│        let (_, flips) = h.apply_feed_flips(\n 1608│            \"bb22\",\n 1609│            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 2)],\n 1610│            &p,\n     │...\n 1617│        // The peer instance rests…\n*1618│        let (_, flips) = h.apply_feed_flips(\n 1619│            \"bb22\",\n 1620│            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Dormant, 3)],\n 1621│            &p,\n     │...\n 1625│        // …and WAKES: Dormant→Active at a fresh epoch — THE flip.\n*1626│        let (_, flips) = h.apply_feed_flips(\n 1627│            \"bb22\",\n 1628│            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 4)],\n 1629│            &p,\n     │...\n 1637│        // A lagging stale wake (lower epoch) is dropped by the lease — no flip.\n*1638│        h.apply_feed_flips(\n 1639│            \"bb22\",\n 1640│            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Dormant, 5)],\n 1641│            &p,\n 1642│        );\n*1643│        let (v, flips) = h.apply_feed_flips(\n 1644│            \"bb22\",\n 1645│            &[upd_with(\"home\", \"ling\", \"bb22\", Status::Active, 4)],\n 1646│            &p,\n     │...\n 1653│    // fail-closed gate as instance feeds: a non-member subnet and an untrusted\n*1654│    // origin are refused (no merge); an admitted label merges under the epoch\n 1655│    // lease and lands in the registry's node-label map — the endpoint-less\n 1656│    // carrier a peer with zero rows uses to name itself.\n 1657│    #[test]\n     │...\n 1997│    #[test]\n*1998│    fn admitted_feeds_stamp_the_heard_map() {\n 1999│        let dir = tempfile::tempdir().unwrap();\n 2000│        let h = host(dir.path());\n 2001│        let p = policy(\"home\", \"bb22\");\n     │...\n 2003│        // Refused (untrusted origin): no stamp, no mirror.\n*2004│        h.apply_feed(\"cc33\", &[upd(\"home\", \"ling\", \"cc33\", 5)], &p);\n 2005│        assert!(!RegistryHost::heard_path(&dir.path().join(\"registry\")).exists());\n 2006│\n 2007│        // Admitted: stamped + mirrored.\n*2008│        h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 2009│        let heard_file = RegistryHost::heard_path(&dir.path().join(\"registry\"));\n 2010│        let heard: BTreeMap<String, u64> =\n 2011│            serde_json::from_slice(&std::fs::read(&heard_file).expect(\"mirror written\")).unwrap();\n     │...\n 2020│        std::thread::sleep(std::time::Duration::from_millis(15));\n*2021│        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 2022│        assert_eq!(v, vec![RegistryApplyVerdict::Merged(MergeOutcome::Stale)]);\n 2023│        let heard: BTreeMap<String, u64> =\n 2024│            serde_json::from_slice(&std::fs::read(&heard_file).unwrap()).unwrap();\n     │...\n 2042│        // The peer feeds (heard stamped at ~now)…\n*2043│        h.apply_feed(\"bb22\", &[upd(\"home\", \"sergey\", \"bb22\", 5)], &p);\n 2044│        let stamped = {\n 2045│            let heard: BTreeMap<String, u64> = serde_json::from_slice(\n 2046│                &std::fs::read(RegistryHost::heard_path(&dir.path().join(\"registry\"))).unwrap(),\n     │...\n 2109│        // A still-trusted peer advertises an Offline endpoint (a purge ghost).\n*2110│        h.apply_feed(\"bb22\", &[upd_offline(\"home\", \"ghost\", \"bb22\", 5)], &p);\n 2111│        assert_eq!(h.rows(\"home\", \"ghost\").len(), 1);\n 2112│\n 2113│        // First sweep stamps the receiver-observed offline_since; within the grace"},"isError":false,"timestamp":1784271669156}}
{"type":"message","id":"35e3e3a0","parentId":"7043ad88","timestamp":"2026-07-17T07:01:09.157Z","message":{"role":"toolResult","toolCallId":"call_PfmZ4eqfiBEM6YBCUFKUdGGA|fc_0a061eb498f0e908016a59d334efd0819684f20d640d168e8d","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\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 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 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 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*158|    /// forever. Default [`DEFAULT_REGISTRY_EVICT_AFTER`].\n 159|    pub registry_evict_after: Duration,\n 160|    /// Notif feed push cadence (D9-1).\n 161|    pub notif_pump_period: Duration,\n...\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 215|            update_check_period: DEFAULT_UPDATE_CHECK_PERIOD,\n...\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 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 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\n## pump/\n### mod.rs\n 294|#[derive(Debug, Clone, Copy)]\n*295|pub struct PumpCadence {\n*296|    pub registry: Duration,\n 297|    pub notif: Duration,\n 298|    pub sync: Duration,\n 299|    pub update: Duration,\n...\n 304|\n*305|impl PumpCadence {\n 306|    /// From the daemon config knobs.\n*307|    pub fn from_config(cfg: &DaemonConfig) -> PumpCadence {\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 320|pub struct PumpConfig {\n*321|    pub cadence: PumpCadence,\n 322|    /// `true` = the explicit opt-in to prompt-free updates; default `false`\n 323|    /// surfaces every staged release as a consent notif.\n 324|    pub full_auto_update: bool,\n...\n 330|        PumpConfig {\n*331|            cadence: PumpCadence::from_config(cfg),\n 332|            full_auto_update: cfg.full_auto_update,\n 333|        }\n 334|    }"}],"details":{"scopePath":"crates/spt-daemon/src/config.rs, crates/spt-daemon/src/pump/mod.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":20,"fileCount":2,"files":["crates/spt-daemon/src/config.rs","crates/spt-daemon/src/pump/mod.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/config.rs","count":12},{"path":"crates/spt-daemon/src/pump/mod.rs","count":8}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\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  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 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 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*158│    /// forever. Default [`DEFAULT_REGISTRY_EVICT_AFTER`].\n 159│    pub registry_evict_after: Duration,\n 160│    /// Notif feed push cadence (D9-1).\n 161│    pub notif_pump_period: Duration,\n    │...\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 215│            update_check_period: DEFAULT_UPDATE_CHECK_PERIOD,\n    │...\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 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 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\n## pump/\n### mod.rs\n 294│#[derive(Debug, Clone, Copy)]\n*295│pub struct PumpCadence {\n*296│    pub registry: Duration,\n 297│    pub notif: Duration,\n 298│    pub sync: Duration,\n 299│    pub update: Duration,\n    │...\n 304│\n*305│impl PumpCadence {\n 306│    /// From the daemon config knobs.\n*307│    pub fn from_config(cfg: &DaemonConfig) -> PumpCadence {\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 320│pub struct PumpConfig {\n*321│    pub cadence: PumpCadence,\n 322│    /// `true` = the explicit opt-in to prompt-free updates; default `false`\n 323│    /// surfaces every staged release as a consent notif.\n 324│    pub full_auto_update: bool,\n    │...\n 330│        PumpConfig {\n*331│            cadence: PumpCadence::from_config(cfg),\n 332│            full_auto_update: cfg.full_auto_update,\n 333│        }\n 334│    }"},"isError":false,"timestamp":1784271669157}}
{"type":"message","id":"835c4cfe","parentId":"35e3e3a0","timestamp":"2026-07-17T07:01:09.172Z","message":{"role":"toolResult","toolCallId":"call_3NyW2SCBMPzG15cl53xHFHYo|fc_0a061eb498f0e908016a59d334efb88196bfb36681e461e740","toolName":"read","content":[{"type":"text","text":"fn worker(\n…\n) -> WorkerReport {\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 merged = 0usize;\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                let records = decoder.push(&bytes);\n                if records.is_empty() {\n                    continue;\n                }\n                // Split the feed into instance rows and node-level labels\n                // (REQ-SUBNET-3) — each goes through its own gated apply path.\n                let mut updates: Vec<RegistryUpdate> = Vec::new();\n                let mut labels: Vec<NodeLabelUpdate> = Vec::new();\n                for rec in records {\n                    match rec {\n                        RegistryFeedRecord::Instance(u) => updates.push(u),\n                        RegistryFeedRecord::NodeLabel(n) => labels.push(n),\n                    }\n                }\n                if !labels.is_empty() {\n                    merged += registry.apply_node_labels(origin, &labels, &policy).len();\n                }\n                if updates.is_empty() {\n                    continue;\n                }\n                let (verdicts, flips) = registry.apply_feed_flips(origin, &updates, &policy);\n                merged += verdicts.len();\n                // Attention shift (D9-2): only ids this node actually hosts\n                // (a perch with a record); everything else is a no-op here.\n                // [impl->REQ-INST-3]\n                for id in flips {\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                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\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/// 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[Showing lines 968-1053 of 1558. Use :1054 to continue]"}],"details":{"truncation":{"content":"}\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 merged = 0usize;\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                let records = decoder.push(&bytes);\n                if records.is_empty() {\n                    continue;\n                }\n                // Split the feed into instance rows and node-level labels\n                // (REQ-SUBNET-3) — each goes through its own gated apply path.\n                let mut updates: Vec<RegistryUpdate> = Vec::new();\n                let mut labels: Vec<NodeLabelUpdate> = Vec::new();\n                for rec in records {\n                    match rec {\n                        RegistryFeedRecord::Instance(u) => updates.push(u),\n                        RegistryFeedRecord::NodeLabel(n) => labels.push(n),\n                    }\n                }\n                if !labels.is_empty() {\n                    merged += registry.apply_node_labels(origin, &labels, &policy).len();\n                }\n                if updates.is_empty() {\n                    continue;\n                }\n                let (verdicts, flips) = registry.apply_feed_flips(origin, &updates, &policy);\n                merged += verdicts.len();\n                // Attention shift (D9-2): only ids this node actually hosts\n                // (a perch with a record); everything else is a no-op here.\n                // [impl->REQ-INST-3]\n                for id in flips {\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                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\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/// 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.","truncated":true,"truncatedBy":"lines","totalLines":591,"totalBytes":3898,"outputLines":86,"outputBytes":3898,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn worker(\n…\n) -> WorkerReport {\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 merged = 0usize;\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                let records = decoder.push(&bytes);\n                if records.is_empty() {\n                    continue;\n                }\n                // Split the feed into instance rows and node-level labels\n                // (REQ-SUBNET-3) — each goes through its own gated apply path.\n                let mut updates: Vec<RegistryUpdate> = Vec::new();\n                let mut labels: Vec<NodeLabelUpdate> = Vec::new();\n                for rec in records {\n                    match rec {\n                        RegistryFeedRecord::Instance(u) => updates.push(u),\n                        RegistryFeedRecord::NodeLabel(n) => labels.push(n),\n                    }\n                }\n                if !labels.is_empty() {\n                    merged += registry.apply_node_labels(origin, &labels, &policy).len();\n                }\n                if updates.is_empty() {\n                    continue;\n                }\n                let (verdicts, flips) = registry.apply_feed_flips(origin, &updates, &policy);\n                merged += verdicts.len();\n                // Attention shift (D9-2): only ids this node actually hosts\n                // (a perch with a record); everything else is a no-op here.\n                // [impl->REQ-INST-3]\n                for id in flips {\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                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\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/// 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.","startLine":730,"lineNumbers":[730,null,738,null,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\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":3898,"outputLines":86,"outputBytes":3898,"shownRange":{"start":968,"end":1053},"nextOffset":1054}}},"isError":false,"timestamp":1784271669172}}
{"type":"message","id":"6a675aee","parentId":"835c4cfe","timestamp":"2026-07-17T07:01:09.187Z","message":{"role":"toolResult","toolCallId":"call_nbVme3AzraLW83BvyjlRLD7T|fc_0a061eb498f0e908016a59d334efcc819693b74fd6576c1835","toolName":"read","content":[{"type":"text","text":"pub fn run_peer_pump(\n…\n) -> io::Result<()> {\n…\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 559-853 of 1982. Use :854 to continue]"}],"details":{"truncation":{"content":"    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":1424,"totalBytes":15121,"outputLines":295,"outputBytes":15121,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub fn run_peer_pump(\n…\n) -> io::Result<()> {\n…\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":519,"lineNumbers":[519,null,527,null,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":1982,"totalBytes":15121,"outputLines":295,"outputBytes":15121,"shownRange":{"start":559,"end":853},"nextOffset":854}}},"isError":false,"timestamp":1784271669187}}
{"type":"message","id":"e564cfe1","parentId":"6a675aee","timestamp":"2026-07-17T07:01:19.407Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Classifying repeated stream failures**"},{"type":"toolCall","id":"call_llHAfwt88zXGDljBkGjirT0H|fc_0a061eb498f0e908016a59d33f581481968accf385c4d12e77","name":"read","arguments":{"i":"Reading dispatch retry policy","path":"crates/spt-daemon/src/dispatch.rs","selector":"180-365,1280-1345"}},{"type":"toolCall","id":"call_7sH2wV7lNfjlNLSNVJ6x2DfJ|fc_0a061eb498f0e908016a59d33f58248196b4c32ec90c93a1b4","name":"read","arguments":{"i":"Reading registry apply writes","path":"crates/spt-daemon/src/registryhost.rs","selector":"210-350,730-765,1070-1100"}},{"type":"toolCall","id":"call_04txdWpGRxm0dDl0W5AR0Wyg|fc_0a061eb498f0e908016a59d33f582c8196acad4e81462765bf","name":"grep","arguments":{"i":"Finding brain stream subscribe semantics","pattern":"pub fn net_stream_subscribe|fn net_stream_subscribe|KIND_NET_STREAM_SUBSCRIBE|read_event_until|read_event\\(","path":"crates/spt-daemon/src/brain.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_AwVsNWMGHu1H9VQOg0iFOTXy|fc_0a061eb498f0e908016a59d33f583481968fae3b666fdf6d75","name":"read","arguments":{"i":"Reading broker status methods","path":"crates/spt-daemon/src/broker.rs","selector":"2890-3010"}},{"type":"toolCall","id":"call_MeFfh7kLUSRYHyVUOA370zME|fc_0a061eb498f0e908016a59d33f5838819696be335b7d3a678a","name":"grep","arguments":{"i":"Finding registry history tests","pattern":"registry.*retire|finished.*registry|Registry.*finished|replay.*registry|Registry.*poison","path":"crates/spt-daemon/tests; crates/spt-daemon/src/dispatch.rs","selector":null,"case":false,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":20800,"output":411,"cacheRead":183808,"cacheWrite":0,"totalTokens":205019,"reasoningTokens":108,"cost":{"input":0.10400000000000001,"output":0.01233,"cacheRead":0.091904,"cacheWrite":0,"total":0.20823400000000003}},"stopReason":"toolUse","timestamp":1784271669841,"responseId":"resp_0a061eb498f0e908016a59d33611fc81969c820322f1548043","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d3376f308196a98c9f65609243ee","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdM_l9EQ1SbHewbgdiPkyCbmQ8QltkIbG1X-_dYTed-jwlsonATMPgusrs7Lz21QO4y2Akle7g4uxDLET9Egn2NQoLV6IcHJkK_8Ao2HrgfEFSRY--X_wRL-d1h7ufwPD3IkmMiN8qT2_uTFaJfm7GwK7Kh0s1szc35dUDL2SsDsEzD-p-_rWY0S3qmjyi3BSiZmpBJsxbKVnHFhE0I5Qk4bzIlMeZ6h7JGaDi2vsExvzuU58Y0onQ7s-5mufeyDWHrzZyxmDGTTx8cV_Bmd55Sx49RC9_DhfWafqC72dRt7N7Yqrs7ZPnDunU_g2tB7yAS6hDFJEY6n58Dk0gsAB-r2gR4vSsKBkdGxLVD_J67r5QQg5jxAK-lPcXyNadHOL3duYSLMYMPdi1VxOq5RUs_HZp8sS8Z-IY1k08-NH3UjrhPHCA5WV7-dakL8Na9UYbkEGcGfNOjMTdMe_rabSRWyBTxFzuF0ZLYnN1GCxUl_tPqxCnOARfUP1APhtRaSGTrziQhScwNHZkHM5r-Vk4OTWVFIwYGg1m39R0vLnXr6V7HRbLCOrahjbzct-Dp41IuEPNxwIaFTM4H8OTHVdxi-G1Q7LNRlQAZU5TWCgTDxxidl0ZJtp1ZEGhM56grFCCYAiSkdREL4NGQJ-IcPB0SRDzr6Iz0OkM1Wp76gxz8Diw81H6xA121Zc2luFel5-jL-hRKGauLO6iFVT38H-UqN3bOihKUOUBqP9OD152FyfiXY7Va6INC3S0tO8BB_BpsD6zUm2DGMdrMPZgiihy34MKX-dPk3CPWR43-MzBtJ7h6nFJb2B8VcE8fHguGP44KAw9x1CfYUfUFjcHmnv6wIV75zuiosIB1qhKn8r11S3LEXMdgCRG8FvktUa5f09TgNImg1z8AUKzULj_p9OMNO98s6PYyPo-jA4gCVtgZVhZxyDI7Rqfnk7FAEvnhCF4OVQcWrc5XXeMAvZBynbh7Th0GrWSVKjC84FItADT5NeFTe09zqQoy1HcM3YGb6gzL8JYNvU95PA1bsTlGmI7JUxFA4HHToUQXrpRWV3G0oPJTL-RIAzY6mWdW8yACtRzBoB7jMDxyvt-tqYX3bWgyBzKWVXnTF7Jrdxdhlw9vnp5oMbiQYyDLngigaP3r60HbFWhwqfcKOwtCGnvxBPEUDGWhLdzEfivz8cRCPtek2EddalMcFs9Kn2ZhOQ2pn1MbQlkSY2S4IOcylaMfUnHhdjISPBABOCG0cFpJaHRSlJEXsocFyyOsn0xLZgAThVeY5wlAAjqVuJHQjrqfCCFACKvbk4NMBjY1gVacZbO3DbEF6_ESJFwj4URADceoAnl5Gdg_8r_Oqc04mv5SJbwS8shZC18dGbrg8_gg0ZNBNl8VgyzgiGGWMOxAsKIvWp8n_z8ntsmsm9yPlRH9qE5nw_gtILOxkDOxcNpV9pDAwqy7N_-NYLWxfKBLga-tGpH854lEb7RlunGAEmo2MWOdhRBNE3tFw1W8_xndFnu_w-I51rkykWGELO-AlNjLkflXkLmSxflxTnx5ZkHL2bF62ay_yto_SChlv-AnEv6gOyosjjJVHSVKPdKy_BE-y3IwT","summary":[{"type":"summary_text","text":"**Classifying repeated stream failures**"}]},{"id":"fc_0a061eb498f0e908016a59d33f581481968accf385c4d12e77","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatch retry policy\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"180-365,1280-1345\"}","call_id":"call_llHAfwt88zXGDljBkGjirT0H","name":"read"},{"id":"fc_0a061eb498f0e908016a59d33f58248196b4c32ec90c93a1b4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry apply writes\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"210-350,730-765,1070-1100\"}","call_id":"call_7sH2wV7lNfjlNLSNVJ6x2DfJ","name":"read"},{"id":"fc_0a061eb498f0e908016a59d33f582c8196acad4e81462765bf","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding brain stream subscribe semantics\",\"pattern\":\"pub fn net_stream_subscribe|fn net_stream_subscribe|KIND_NET_STREAM_SUBSCRIBE|read_event_until|read_event\\\\(\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_04txdWpGRxm0dDl0W5AR0Wyg","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d33f583481968fae3b666fdf6d75","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker status methods\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"2890-3010\"}","call_id":"call_AwVsNWMGHu1H9VQOg0iFOTXy","name":"read"},{"id":"fc_0a061eb498f0e908016a59d33f5838819696be335b7d3a678a","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry history tests\",\"pattern\":\"registry.*retire|finished.*registry|Registry.*finished|replay.*registry|Registry.*poison\",\"path\":\"crates/spt-daemon/tests; crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_MeFfh7kLUSRYHyVUOA370zME","name":"grep"}]},"duration":9563.265300005674,"ttft":1612.2255000025034,"contextSnapshot":{"promptTokens":204608,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_llHAfwt88zXGDljBkGjirT0H|fc_0a061eb498f0e908016a59d33f581481968accf385c4d12e77","toolName":"read","startedAt":"2026-07-17T07:01:19.408Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatch retry policy"},"id":"df4692ec","parentId":"e564cfe1","timestamp":"2026-07-17T07:01:19.408Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_7sH2wV7lNfjlNLSNVJ6x2DfJ|fc_0a061eb498f0e908016a59d33f58248196b4c32ec90c93a1b4","toolName":"read","startedAt":"2026-07-17T07:01:19.408Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading registry apply writes"},"id":"dae5d7b8","parentId":"df4692ec","timestamp":"2026-07-17T07:01:19.408Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_04txdWpGRxm0dDl0W5AR0Wyg|fc_0a061eb498f0e908016a59d33f582c8196acad4e81462765bf","toolName":"grep","startedAt":"2026-07-17T07:01:19.408Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Finding brain stream subscribe semantics"},"id":"2ab6c63b","parentId":"dae5d7b8","timestamp":"2026-07-17T07:01:19.408Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_AwVsNWMGHu1H9VQOg0iFOTXy|fc_0a061eb498f0e908016a59d33f583481968fae3b666fdf6d75","toolName":"read","startedAt":"2026-07-17T07:01:19.408Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker status methods"},"id":"0fa2b76d","parentId":"2ab6c63b","timestamp":"2026-07-17T07:01:19.408Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_MeFfh7kLUSRYHyVUOA370zME|fc_0a061eb498f0e908016a59d33f5838819696be335b7d3a678a","toolName":"grep","startedAt":"2026-07-17T07:01:19.408Z","args":{"path":"crates/spt-daemon/tests; crates/spt-daemon/src/dispatch.rs"},"intent":"Finding registry history tests"},"id":"95974c18","parentId":"0fa2b76d","timestamp":"2026-07-17T07:01:19.408Z"}
{"type":"message","id":"c6d9c871","parentId":"95974c18","timestamp":"2026-07-17T07:01:19.413Z","message":{"role":"toolResult","toolCallId":"call_04txdWpGRxm0dDl0W5AR0Wyg|fc_0a061eb498f0e908016a59d33f582c8196acad4e81462765bf","toolName":"grep","content":[{"type":"text","text":" 53|    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\n*54|    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 55|    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n 56|    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n 57|};\n...\n 339|    /// call deadline of `io_timeout`. This is the peer pump's dedicated client —\n*340|    /// every reply read is bounded ([`Brain::read_event_until`] via\n 341|    /// [`Brain::call_deadline`]) so a black-holed peer can never wedge the\n 342|    /// single-threaded pump. The split is done at CONSTRUCTION (not flipped on a\n 343|    /// live `Whole` after the fact — moving the `Stream` out by value to split it\n...\n 471|        loop {\n*472|            match self.read_event()? {\n 473|                BrokerEvent::Spawned { session_id, pid } => {\n 474|                    self.session_id = Some(session_id);\n 475|                    // A resume-mode brain tracks this fresh session per-session via\n...\n 587|            }\n*588|            match self.read_event()? {\n 589|                BrokerEvent::Output { bytes, .. } => buf.extend_from_slice(&bytes),\n 590|                BrokerEvent::Exit { .. } => {\n 591|                    return Err(io::Error::new(\n...\n 624|\n*625|    pub fn read_event(&mut self) -> io::Result<BrokerEvent> {\n*626|        self.read_event_until(None)\n 627|    }\n 628|\n 629|    /// Like [`Brain::read_event`] but each frame read is bounded by an optional\n...\n 635|    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*636|    pub fn read_event_until(&mut self, deadline: Option<Instant>) -> io::Result<BrokerEvent> {\n 637|        loop {\n 638|            let env = self.read_frame_until(deadline)?;\n 639|            match env.kind.as_str() {\n...\n 876|\n*877|    /// Like [`Self::read_event_until`] but for a PEER-REPLY read (a pump leg\n 878|    /// waiting on a peer's forwarded stream response). A no-progress timeout is\n 879|    /// the peer being connect-then-silent / half-alive — an ORDINARY per-peer\n 880|    /// failure, so it is reclassified OUT of `TimedOut` and the pump's\n...\n 890|    pub fn read_peer_reply_until(&mut self, deadline: Option<Instant>) -> io::Result<BrokerEvent> {\n*891|        self.read_event_until(deadline)\n 892|            .map_err(reclassify_peer_reply_err)\n 893|    }\n 894|\n...\n 1119|        loop {\n*1120|            match self.read_event()? {\n 1121|                BrokerEvent::NetStatus(s) => return Ok(s),\n 1122|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1123|                _ => continue,\n...\n 1229|        loop {\n*1230|            match self.read_event()? {\n 1231|                BrokerEvent::PairJoined(r) => return Ok(r),\n 1232|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1233|                _ => continue,\n...\n 1254|        loop {\n*1255|            match self.read_event()? {\n 1256|                BrokerEvent::MetMember(m) => return Ok(MetOutcome::Met(m)),\n 1257|                BrokerEvent::PairJoined(r) => return Ok(MetOutcome::Failed(r)),\n 1258|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n...\n 1278|        loop {\n*1279|            match self.read_event()? {\n 1280|                BrokerEvent::PairJoined(r) => return Ok(r),\n 1281|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1282|                _ => continue,\n...\n 1308|        loop {\n*1309|            match self.read_event_until(deadline)? {\n 1310|                BrokerEvent::NetDialed(d) => return Ok(d),\n 1311|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1312|                _ => continue,\n...\n 1338|        loop {\n*1339|            match self.read_event_until(deadline)? {\n 1340|                BrokerEvent::NetDialSubmitted => return Ok(()),\n 1341|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1342|                _ => continue,\n...\n 1359|        loop {\n*1360|            match self.read_event_until(deadline)? {\n 1361|                BrokerEvent::NetDialed(d) => return Ok(d),\n 1362|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1363|                _ => continue,\n...\n 1388|        loop {\n*1389|            match self.read_event_until(deadline)? {\n 1390|                BrokerEvent::NetStreamOpened(ev) => return Ok(ev),\n 1391|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1392|                _ => continue,\n...\n 1425|        loop {\n*1426|            match self.read_event_until(deadline)? {\n 1427|                BrokerEvent::NetSent(ev) if Some(ev.op_id) == want_seq => return Ok(Some(ev)),\n 1428|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1429|                _ => continue,\n...\n 1438|        loop {\n*1439|            match self.read_event()? {\n 1440|                BrokerEvent::NetStreams(ev) => return Ok(ev),\n 1441|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1442|                _ => continue,\n...\n 1460|        loop {\n*1461|            match self.read_event()? {\n 1462|                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n 1463|                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n 1464|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n...\n 1486|        loop {\n*1487|            match self.read_event()? {\n 1488|                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_OPENER_REPLY => {\n 1489|                    let reply: NetStreamOpenerReply = serde_json::from_value(env.payload)\n 1490|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n...\n 1520|        loop {\n*1521|            match self.read_event()? {\n 1522|                BrokerEvent::Other(env) if env.kind == KIND_BRAIN_RESTARTED => {\n 1523|                    let reply: BrainRestarted = serde_json::from_value(env.payload)\n 1524|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n...\n 1560|        loop {\n*1561|            match self.read_event()? {\n 1562|                BrokerEvent::Other(env) if env.kind == KIND_ENDPOINT_INJECTED => {\n 1563|                    let reply: EndpointInjected = serde_json::from_value(env.payload)\n 1564|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n...\n 1577|        loop {\n*1578|            match self.read_event()? {\n 1579|                BrokerEvent::Sessions(ev) => return Ok(ev),\n 1580|                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1581|                _ => continue,\n...\n 1589|    // [impl->REQ-DAEMON-2]\n*1590|    pub fn net_stream_subscribe(&mut self, stream_id: u64, from_seq: u64) -> io::Result<()> {\n 1591|        self.net_cursors.insert(stream_id, from_seq);\n 1592|        self.send(\n*1593|            KIND_NET_STREAM_SUBSCRIBE,\n 1594|            serde_json::to_value(NetStreamSubscribeReq {\n 1595|                stream_id,\n 1596|                from_seq,\n...\n 1964|        stub.feed.send(output_envelope(sid, 0, b\"hello\")).unwrap();\n*1965|        match brain.read_event().expect(\"seq 0 accepted\") {\n 1966|            BrokerEvent::Output { seq, bytes, .. } => {\n 1967|                assert_eq!(seq, 0);\n 1968|                assert_eq!(bytes, b\"hello\");\n...\n 1975|        stub.feed.send(output_envelope(sid, 5, b\"jumped\")).unwrap();\n*1976|        let err = brain.read_event().expect_err(\"a cold brain rejects a forward gap\");\n 1977|        assert_eq!(err.kind(), io::ErrorKind::InvalidData);\n 1978|        assert!(\n 1979|            err.to_string().contains(\"output gap\"),\n...\n 2021|                .unwrap();\n*2022|            match brain.read_event().expect(\"contiguous controller frame accepted\") {\n 2023|                BrokerEvent::Output { seq: got, .. } => assert_eq!(got, seq),\n 2024|                other => panic!(\"expected Output({seq}), got {other:?}\"),\n 2025|            }\n...\n 2038|        let err = brain\n*2039|            .read_event()\n 2040|            .expect_err(\"the strict controller path fatals a forward gap\");\n 2041|        assert_eq!(err.kind(), io::ErrorKind::InvalidData);\n 2042|        assert!(\n...\n 2062|                .unwrap();\n*2063|            match brain.read_event().expect(\"ring-replayed floor frame accepted\") {\n 2064|                BrokerEvent::Output { seq: got, .. } => assert_eq!(got, seq),\n 2065|                other => panic!(\"expected re-fetched Output({seq}), got {other:?}\"),\n 2066|            }\n...\n 2084|        let err = brain\n*2085|            .read_event()\n 2086|            .expect_err(\"the ring rolled past the floor — still a gap\");\n 2087|        assert_eq!(err.kind(), io::ErrorKind::InvalidData);\n 2088|        assert!(err.to_string().contains(\"output gap\"));\n...\n 2135|        stub.feed.send(output_envelope(sid, 12, b\"LIVE-A\")).unwrap();\n*2136|        match brain.read_event().expect(\"post-eviction forward jump accepted\") {\n 2137|            BrokerEvent::Output { seq, bytes, .. } => {\n 2138|                assert_eq!(seq, 12, \"the forward-jumped live seq is accepted, not rejected\");\n 2139|                assert_eq!(bytes, b\"LIVE-A\");\n...\n 2155|        for _ in 0..2 {\n*2156|            match brain.read_event().expect(\"subsequent live frames\") {\n 2157|                BrokerEvent::Output { seq, bytes, .. } => accepted.push((seq, bytes)),\n 2158|                other => panic!(\"expected Output, got {other:?}\"),\n 2159|            }\n...\n 2212|        stub.feed.send(output_envelope(sid, 4504, b\"ROLLED\")).unwrap();\n*2213|        match brain.read_event().expect(\"pre-eviction forward ring-roll gap accepted\") {\n 2214|            BrokerEvent::Output { seq, bytes, .. } => {\n 2215|                assert_eq!(seq, 4504, \"the forward-jumped live seq is accepted, not rejected\");\n 2216|                assert_eq!(bytes, b\"ROLLED\");\n...\n 2233|        for _ in 0..2 {\n*2234|            match brain.read_event().expect(\"subsequent live frames\") {\n 2235|                BrokerEvent::Output { seq, bytes, .. } => accepted.push((seq, bytes)),\n 2236|                other => panic!(\"expected Output, got {other:?}\"),\n 2237|            }"}],"details":{"scopePath":"crates/spt-daemon/src/brain.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":36,"fileCount":1,"files":["crates/spt-daemon/src/brain.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brain.rs","count":36}],"truncated":false,"displayContent":"   53│    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\n  *54│    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   55│    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n   56│    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n   57│};\n     │...\n  339│    /// call deadline of `io_timeout`. This is the peer pump's dedicated client —\n *340│    /// every reply read is bounded ([`Brain::read_event_until`] via\n  341│    /// [`Brain::call_deadline`]) so a black-holed peer can never wedge the\n  342│    /// single-threaded pump. The split is done at CONSTRUCTION (not flipped on a\n  343│    /// live `Whole` after the fact — moving the `Stream` out by value to split it\n     │...\n  471│        loop {\n *472│            match self.read_event()? {\n  473│                BrokerEvent::Spawned { session_id, pid } => {\n  474│                    self.session_id = Some(session_id);\n  475│                    // A resume-mode brain tracks this fresh session per-session via\n     │...\n  587│            }\n *588│            match self.read_event()? {\n  589│                BrokerEvent::Output { bytes, .. } => buf.extend_from_slice(&bytes),\n  590│                BrokerEvent::Exit { .. } => {\n  591│                    return Err(io::Error::new(\n     │...\n  624│\n *625│    pub fn read_event(&mut self) -> io::Result<BrokerEvent> {\n *626│        self.read_event_until(None)\n  627│    }\n  628│\n  629│    /// Like [`Brain::read_event`] but each frame read is bounded by an optional\n     │...\n  635│    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n *636│    pub fn read_event_until(&mut self, deadline: Option<Instant>) -> io::Result<BrokerEvent> {\n  637│        loop {\n  638│            let env = self.read_frame_until(deadline)?;\n  639│            match env.kind.as_str() {\n     │...\n  876│\n *877│    /// Like [`Self::read_event_until`] but for a PEER-REPLY read (a pump leg\n  878│    /// waiting on a peer's forwarded stream response). A no-progress timeout is\n  879│    /// the peer being connect-then-silent / half-alive — an ORDINARY per-peer\n  880│    /// failure, so it is reclassified OUT of `TimedOut` and the pump's\n     │...\n  890│    pub fn read_peer_reply_until(&mut self, deadline: Option<Instant>) -> io::Result<BrokerEvent> {\n *891│        self.read_event_until(deadline)\n  892│            .map_err(reclassify_peer_reply_err)\n  893│    }\n  894│\n     │...\n 1119│        loop {\n*1120│            match self.read_event()? {\n 1121│                BrokerEvent::NetStatus(s) => return Ok(s),\n 1122│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1123│                _ => continue,\n     │...\n 1229│        loop {\n*1230│            match self.read_event()? {\n 1231│                BrokerEvent::PairJoined(r) => return Ok(r),\n 1232│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1233│                _ => continue,\n     │...\n 1254│        loop {\n*1255│            match self.read_event()? {\n 1256│                BrokerEvent::MetMember(m) => return Ok(MetOutcome::Met(m)),\n 1257│                BrokerEvent::PairJoined(r) => return Ok(MetOutcome::Failed(r)),\n 1258│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n     │...\n 1278│        loop {\n*1279│            match self.read_event()? {\n 1280│                BrokerEvent::PairJoined(r) => return Ok(r),\n 1281│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1282│                _ => continue,\n     │...\n 1308│        loop {\n*1309│            match self.read_event_until(deadline)? {\n 1310│                BrokerEvent::NetDialed(d) => return Ok(d),\n 1311│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1312│                _ => continue,\n     │...\n 1338│        loop {\n*1339│            match self.read_event_until(deadline)? {\n 1340│                BrokerEvent::NetDialSubmitted => return Ok(()),\n 1341│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1342│                _ => continue,\n     │...\n 1359│        loop {\n*1360│            match self.read_event_until(deadline)? {\n 1361│                BrokerEvent::NetDialed(d) => return Ok(d),\n 1362│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1363│                _ => continue,\n     │...\n 1388│        loop {\n*1389│            match self.read_event_until(deadline)? {\n 1390│                BrokerEvent::NetStreamOpened(ev) => return Ok(ev),\n 1391│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1392│                _ => continue,\n     │...\n 1425│        loop {\n*1426│            match self.read_event_until(deadline)? {\n 1427│                BrokerEvent::NetSent(ev) if Some(ev.op_id) == want_seq => return Ok(Some(ev)),\n 1428│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1429│                _ => continue,\n     │...\n 1438│        loop {\n*1439│            match self.read_event()? {\n 1440│                BrokerEvent::NetStreams(ev) => return Ok(ev),\n 1441│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1442│                _ => continue,\n     │...\n 1460│        loop {\n*1461│            match self.read_event()? {\n 1462│                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n 1463│                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n 1464│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n     │...\n 1486│        loop {\n*1487│            match self.read_event()? {\n 1488│                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_OPENER_REPLY => {\n 1489│                    let reply: NetStreamOpenerReply = serde_json::from_value(env.payload)\n 1490│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n     │...\n 1520│        loop {\n*1521│            match self.read_event()? {\n 1522│                BrokerEvent::Other(env) if env.kind == KIND_BRAIN_RESTARTED => {\n 1523│                    let reply: BrainRestarted = serde_json::from_value(env.payload)\n 1524│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n     │...\n 1560│        loop {\n*1561│            match self.read_event()? {\n 1562│                BrokerEvent::Other(env) if env.kind == KIND_ENDPOINT_INJECTED => {\n 1563│                    let reply: EndpointInjected = serde_json::from_value(env.payload)\n 1564│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n     │...\n 1577│        loop {\n*1578│            match self.read_event()? {\n 1579│                BrokerEvent::Sessions(ev) => return Ok(ev),\n 1580│                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n 1581│                _ => continue,\n     │...\n 1589│    // [impl->REQ-DAEMON-2]\n*1590│    pub fn net_stream_subscribe(&mut self, stream_id: u64, from_seq: u64) -> io::Result<()> {\n 1591│        self.net_cursors.insert(stream_id, from_seq);\n 1592│        self.send(\n*1593│            KIND_NET_STREAM_SUBSCRIBE,\n 1594│            serde_json::to_value(NetStreamSubscribeReq {\n 1595│                stream_id,\n 1596│                from_seq,\n     │...\n 1964│        stub.feed.send(output_envelope(sid, 0, b\"hello\")).unwrap();\n*1965│        match brain.read_event().expect(\"seq 0 accepted\") {\n 1966│            BrokerEvent::Output { seq, bytes, .. } => {\n 1967│                assert_eq!(seq, 0);\n 1968│                assert_eq!(bytes, b\"hello\");\n     │...\n 1975│        stub.feed.send(output_envelope(sid, 5, b\"jumped\")).unwrap();\n*1976│        let err = brain.read_event().expect_err(\"a cold brain rejects a forward gap\");\n 1977│        assert_eq!(err.kind(), io::ErrorKind::InvalidData);\n 1978│        assert!(\n 1979│            err.to_string().contains(\"output gap\"),\n     │...\n 2021│                .unwrap();\n*2022│            match brain.read_event().expect(\"contiguous controller frame accepted\") {\n 2023│                BrokerEvent::Output { seq: got, .. } => assert_eq!(got, seq),\n 2024│                other => panic!(\"expected Output({seq}), got {other:?}\"),\n 2025│            }\n     │...\n 2038│        let err = brain\n*2039│            .read_event()\n 2040│            .expect_err(\"the strict controller path fatals a forward gap\");\n 2041│        assert_eq!(err.kind(), io::ErrorKind::InvalidData);\n 2042│        assert!(\n     │...\n 2062│                .unwrap();\n*2063│            match brain.read_event().expect(\"ring-replayed floor frame accepted\") {\n 2064│                BrokerEvent::Output { seq: got, .. } => assert_eq!(got, seq),\n 2065│                other => panic!(\"expected re-fetched Output({seq}), got {other:?}\"),\n 2066│            }\n     │...\n 2084│        let err = brain\n*2085│            .read_event()\n 2086│            .expect_err(\"the ring rolled past the floor — still a gap\");\n 2087│        assert_eq!(err.kind(), io::ErrorKind::InvalidData);\n 2088│        assert!(err.to_string().contains(\"output gap\"));\n     │...\n 2135│        stub.feed.send(output_envelope(sid, 12, b\"LIVE-A\")).unwrap();\n*2136│        match brain.read_event().expect(\"post-eviction forward jump accepted\") {\n 2137│            BrokerEvent::Output { seq, bytes, .. } => {\n 2138│                assert_eq!(seq, 12, \"the forward-jumped live seq is accepted, not rejected\");\n 2139│                assert_eq!(bytes, b\"LIVE-A\");\n     │...\n 2155│        for _ in 0..2 {\n*2156│            match brain.read_event().expect(\"subsequent live frames\") {\n 2157│                BrokerEvent::Output { seq, bytes, .. } => accepted.push((seq, bytes)),\n 2158│                other => panic!(\"expected Output, got {other:?}\"),\n 2159│            }\n     │...\n 2212│        stub.feed.send(output_envelope(sid, 4504, b\"ROLLED\")).unwrap();\n*2213│        match brain.read_event().expect(\"pre-eviction forward ring-roll gap accepted\") {\n 2214│            BrokerEvent::Output { seq, bytes, .. } => {\n 2215│                assert_eq!(seq, 4504, \"the forward-jumped live seq is accepted, not rejected\");\n 2216│                assert_eq!(bytes, b\"ROLLED\");\n     │...\n 2233│        for _ in 0..2 {\n*2234│            match brain.read_event().expect(\"subsequent live frames\") {\n 2235│                BrokerEvent::Output { seq, bytes, .. } => accepted.push((seq, bytes)),\n 2236│                other => panic!(\"expected Output, got {other:?}\"),\n 2237│            }"},"isError":false,"timestamp":1784271679413}}
{"type":"message","id":"9074bac4","parentId":"c6d9c871","timestamp":"2026-07-17T07:01:19.430Z","message":{"role":"toolResult","toolCallId":"call_llHAfwt88zXGDljBkGjirT0H|fc_0a061eb498f0e908016a59d33f581481968accf385c4d12e77","toolName":"read","content":[{"type":"text","text":"enum ClaimState {\n…\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/// PURE outcome transition: what a finished worker's claim becomes. Served\n/// and Unknown (unclassifiable) are TERMINAL — a terminal classification never\n/// hot-loops. A failure requeues with backoff until the bounded budget is\n/// 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// [impl->REQ-DISPATCH-CLAIM-RETRY]\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\nfn outcome_transition(\n    outcome: &DispatchOutcome,\n    attempts: u32,\n    now: Instant,\n    breaker_window: Duration,\n) -> ClaimState {\n    match outcome {\n        DispatchOutcome::Served(_) | DispatchOutcome::Unknown => ClaimState::Terminal,\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\n            FailClass::SeatBlocked => ClaimState::Retry {\n                attempts,\n                next_at: now + breaker_window,\n            },\n            FailClass::Transient => {\n                let attempts = attempts + 1;\n                if attempts >= MAX_DISPATCH_ATTEMPTS {\n                    ClaimState::Terminal\n                } else {\n                    ClaimState::Retry {\n                        attempts,\n                        next_at: now + retry_backoff(attempts),\n                    }\n                }\n            }\n        },\n    }\n}\n\n/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's\n/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n/// redispatch — retire unserved, never replay?\n///\n/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n/// would be a regression: the request/reply families FIN their send WITH the\n/// request and await the reply on the same stream (sync.rs `request_sync` and\n/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n/// opener), so every pull that arrives while the brain is down reads\n/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n/// across exactly the refresh window this milestone fixes.\n///\n/// The steal class is ATTACH-specific: `finished` on an attach stream is the\n/// operator's clean detach — its exchange is definitionally over, and a\n/// replay takes a live controller (KNOWN-HAZARDS 7.41: the pre-existing\n/// backlog on long-lived conns, and the brain-down-detach window that\n/// Served-report retirement can never see). So: finished + Attach = terminal\n/// (retired unserved via the worker's Served report); finished + anything\n/// else = a pending request — serve it.\n// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n…\n    fn transient_failure_requeues_bounded_and_terminal_never_reenters() {\n…\n        // Fresh row → claimable with zero prior failures.\n        assert_eq!(should_claim(None, now), Some(0));\n        // In flight / terminal → never.\n        assert_eq!(should_claim(Some(&ClaimState::InFlight { attempts: 0 }), now), None);\n        assert_eq!(should_claim(Some(&ClaimState::Terminal), now), None);\n\n        // Failure #1 releases with backoff — NOT claimable before next_at,\n        // claimable at/after it, carrying the attempt count.\n        let failed = DispatchOutcome::Failed(\"io\".into());\n        let s1 = outcome_transition(&failed, 0, now, Duration::ZERO);\n        let ClaimState::Retry { attempts: 1, next_at } = s1 else {\n            panic!(\"failure #1 must requeue, got {s1:?}\");\n        };\n        assert_eq!(next_at, now + retry_backoff(1));\n        assert_eq!(should_claim(Some(&s1), now), None, \"backoff holds the claim\");\n        assert_eq!(should_claim(Some(&s1), next_at), Some(1), \"due → reclaimable\");\n\n        // Backoff doubles per attempt.\n        assert_eq!(retry_backoff(2), retry_backoff(1) * 2);\n\n        // The budget is BOUNDED: the MAX'th failure goes terminal, silent\n        // forever after (no hot loop under a persistently-failing stream).\n        let s2 = outcome_transition(&failed, 1, now, Duration::ZERO);\n        assert!(matches!(s2, ClaimState::Retry { attempts: 2, .. }));\n        let s3 = outcome_transition(&failed, 2, now, Duration::ZERO);\n        assert_eq!(s3, ClaimState::Terminal, \"attempt {MAX_DISPATCH_ATTEMPTS} exhausts the budget\");\n\n        // Terminal CLASSIFICATION outcomes are terminal immediately — a\n        // served exchange and an unclassifiable stream never retry.\n        assert_eq!(outcome_transition(&DispatchOutcome::Served(\"ok\".into()), 0, now, Duration::ZERO), ClaimState::Terminal);\n        assert_eq!(outcome_transition(&DispatchOutcome::Unknown, 0, now, Duration::ZERO), ClaimState::Terminal);\n    }\n\n    // [unit->REQ-DISPATCH-FALLBACK-CIRCUIT] the failure classification table:\n    // exactly the three strings the nethost subscriber discipline emits are\n    // SeatBlocked (they pace on the global breaker, budget-free); everything\n    // else — transport timeouts, EOF, opener-not-pinned, store errors — keeps\n    // the bounded Transient budget. The strings are load-bearing wire facts:\n    // begin_attach's \"subscriber busy\", subscribe_stream's \"replay halted\",\n    // send_stream's \"lease canceled\".\n    #[test]\n    fn classify_failure_seat_blocked_is_exactly_the_three_discipline_strings() {\n        for seat_blocked in [\n            \"stream 7058 subscriber busy: prior subscriber still draining\",\n            \"presence subscriber busy: prior subscriber still draining\",\n            \"stream 7058 replay halted: subscriber write failed\",\n            \"stream 7058 lease canceled (subscriber poisoned) — serve leg terminated\",\n        ] {\n            assert_eq!(\n                classify_failure(seat_blocked),\n                FailClass::SeatBlocked,\n                \"for {seat_blocked:?}\"\n            );\n        }\n        for transient in [\n            \"brain IPC read deadline elapsed\",\n            \"stream 7058: opener not pinned yet\",\n            \"unexpected EOF reading broker frame\",\n            \"no such session 12\",\n            \"\",\n        ] {\n            assert_eq!(\n                classify_failure(transient),\n                FailClass::Transient,\n                \"for {transient:?}\"\n            );\n        }\n    }"}],"details":{"displayContent":{"text":"enum ClaimState {\n…\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/// PURE outcome transition: what a finished worker's claim becomes. Served\n/// and Unknown (unclassifiable) are TERMINAL — a terminal classification never\n/// hot-loops. A failure requeues with backoff until the bounded budget is\n/// 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// [impl->REQ-DISPATCH-CLAIM-RETRY]\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\nfn outcome_transition(\n    outcome: &DispatchOutcome,\n    attempts: u32,\n    now: Instant,\n    breaker_window: Duration,\n) -> ClaimState {\n    match outcome {\n        DispatchOutcome::Served(_) | DispatchOutcome::Unknown => ClaimState::Terminal,\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\n            FailClass::SeatBlocked => ClaimState::Retry {\n                attempts,\n                next_at: now + breaker_window,\n            },\n            FailClass::Transient => {\n                let attempts = attempts + 1;\n                if attempts >= MAX_DISPATCH_ATTEMPTS {\n                    ClaimState::Terminal\n                } else {\n                    ClaimState::Retry {\n                        attempts,\n                        next_at: now + retry_backoff(attempts),\n                    }\n                }\n            }\n        },\n    }\n}\n\n/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's\n/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n/// redispatch — retire unserved, never replay?\n///\n/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n/// would be a regression: the request/reply families FIN their send WITH the\n/// request and await the reply on the same stream (sync.rs `request_sync` and\n/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n/// opener), so every pull that arrives while the brain is down reads\n/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n/// across exactly the refresh window this milestone fixes.\n///\n/// The steal class is ATTACH-specific: `finished` on an attach stream is the\n/// operator's clean detach — its exchange is definitionally over, and a\n/// replay takes a live controller (KNOWN-HAZARDS 7.41: the pre-existing\n/// backlog on long-lived conns, and the brain-down-detach window that\n/// Served-report retirement can never see). So: finished + Attach = terminal\n/// (retired unserved via the worker's Served report); finished + anything\n/// else = a pending request — serve it.\n// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n…\n    fn transient_failure_requeues_bounded_and_terminal_never_reenters() {\n…\n        // Fresh row → claimable with zero prior failures.\n        assert_eq!(should_claim(None, now), Some(0));\n        // In flight / terminal → never.\n        assert_eq!(should_claim(Some(&ClaimState::InFlight { attempts: 0 }), now), None);\n        assert_eq!(should_claim(Some(&ClaimState::Terminal), now), None);\n\n        // Failure #1 releases with backoff — NOT claimable before next_at,\n        // claimable at/after it, carrying the attempt count.\n        let failed = DispatchOutcome::Failed(\"io\".into());\n        let s1 = outcome_transition(&failed, 0, now, Duration::ZERO);\n        let ClaimState::Retry { attempts: 1, next_at } = s1 else {\n            panic!(\"failure #1 must requeue, got {s1:?}\");\n        };\n        assert_eq!(next_at, now + retry_backoff(1));\n        assert_eq!(should_claim(Some(&s1), now), None, \"backoff holds the claim\");\n        assert_eq!(should_claim(Some(&s1), next_at), Some(1), \"due → reclaimable\");\n\n        // Backoff doubles per attempt.\n        assert_eq!(retry_backoff(2), retry_backoff(1) * 2);\n\n        // The budget is BOUNDED: the MAX'th failure goes terminal, silent\n        // forever after (no hot loop under a persistently-failing stream).\n        let s2 = outcome_transition(&failed, 1, now, Duration::ZERO);\n        assert!(matches!(s2, ClaimState::Retry { attempts: 2, .. }));\n        let s3 = outcome_transition(&failed, 2, now, Duration::ZERO);\n        assert_eq!(s3, ClaimState::Terminal, \"attempt {MAX_DISPATCH_ATTEMPTS} exhausts the budget\");\n\n        // Terminal CLASSIFICATION outcomes are terminal immediately — a\n        // served exchange and an unclassifiable stream never retry.\n        assert_eq!(outcome_transition(&DispatchOutcome::Served(\"ok\".into()), 0, now, Duration::ZERO), ClaimState::Terminal);\n        assert_eq!(outcome_transition(&DispatchOutcome::Unknown, 0, now, Duration::ZERO), ClaimState::Terminal);\n    }\n\n    // [unit->REQ-DISPATCH-FALLBACK-CIRCUIT] the failure classification table:\n    // exactly the three strings the nethost subscriber discipline emits are\n    // SeatBlocked (they pace on the global breaker, budget-free); everything\n    // else — transport timeouts, EOF, opener-not-pinned, store errors — keeps\n    // the bounded Transient budget. The strings are load-bearing wire facts:\n    // begin_attach's \"subscriber busy\", subscribe_stream's \"replay halted\",\n    // send_stream's \"lease canceled\".\n    #[test]\n    fn classify_failure_seat_blocked_is_exactly_the_three_discipline_strings() {\n        for seat_blocked in [\n            \"stream 7058 subscriber busy: prior subscriber still draining\",\n            \"presence subscriber busy: prior subscriber still draining\",\n            \"stream 7058 replay halted: subscriber write failed\",\n            \"stream 7058 lease canceled (subscriber poisoned) — serve leg terminated\",\n        ] {\n            assert_eq!(\n                classify_failure(seat_blocked),\n                FailClass::SeatBlocked,\n                \"for {seat_blocked:?}\"\n            );\n        }\n        for transient in [\n            \"brain IPC read deadline elapsed\",\n            \"stream 7058: opener not pinned yet\",\n            \"unexpected EOF reading broker frame\",\n            \"no such session 12\",\n            \"\",\n        ] {\n            assert_eq!(\n                classify_failure(transient),\n                FailClass::Transient,\n                \"for {transient:?}\"\n            );\n        }\n    }","startLine":176,"lineNumbers":[176,null,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,null,1277,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"}}},"isError":false,"timestamp":1784271679430}}
{"type":"message","id":"70d70144","parentId":"9074bac4","timestamp":"2026-07-17T07:01:19.454Z","message":{"role":"toolResult","toolCallId":"call_7sH2wV7lNfjlNLSNVJ6x2DfJ|fc_0a061eb498f0e908016a59d33f58248196b4c32ec90c93a1b4","toolName":"read","content":[{"type":"text","text":"\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 regs = self.regs.lock().unwrap();\n        let mut flips: Vec<String> = Vec::new();\n        let mut admitted_any = false;\n        let verdicts = 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        drop(regs);\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.heard\n                .lock()\n                .unwrap()\n                .insert(origin_node.to_string(), wall_ms());\n            self.stamp_admit();\n        }\n        self.write_snapshots();\n        (verdicts, flips)\n    }\n\n    /// Apply inbound node-level label updates (REQ-SUBNET-3) under the SAME\n    /// fail-closed gate as [`apply_feed_flips`]: a non-member subnet or an\n    /// untrusted origin is refused; an admitted update merges via\n    /// [`SubnetRegistry::merge_node_label`] (epoch lease) and stamps the\n    /// origin's gossip-recency (an admitted label feed proves the peer is up,\n    /// exactly like an instance feed). The endpoint-less carrier: this is how a\n    /// peer with zero endpoints gets its hostname into our `--nodes` view.\n    // [impl->REQ-SUBNET-3]\n    pub fn apply_node_labels(\n        &self,\n        origin_node: &str,\n        updates: &[NodeLabelUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> Vec<RegistryApplyVerdict> {\n        let mut regs = self.regs.lock().unwrap();\n        let mut admitted_any = false;\n        let verdicts = 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                RegistryApplyVerdict::Merged(reg.merge_node_label(\n                    &u.node,\n                    u.label.clone(),\n                    u.epoch,\n                ))\n            })\n            .collect();\n        drop(regs);\n        if admitted_any {\n            self.heard\n                .lock()\n                .unwrap()\n                .insert(origin_node.to_string(), wall_ms());\n            self.stamp_admit();\n        }\n        self.write_snapshots();\n        verdicts\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    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        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…\n    }\n…\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…\n}"}],"details":{"displayContent":{"text":"\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 regs = self.regs.lock().unwrap();\n        let mut flips: Vec<String> = Vec::new();\n        let mut admitted_any = false;\n        let verdicts = 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        drop(regs);\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.heard\n                .lock()\n                .unwrap()\n                .insert(origin_node.to_string(), wall_ms());\n            self.stamp_admit();\n        }\n        self.write_snapshots();\n        (verdicts, flips)\n    }\n\n    /// Apply inbound node-level label updates (REQ-SUBNET-3) under the SAME\n    /// fail-closed gate as [`apply_feed_flips`]: a non-member subnet or an\n    /// untrusted origin is refused; an admitted update merges via\n    /// [`SubnetRegistry::merge_node_label`] (epoch lease) and stamps the\n    /// origin's gossip-recency (an admitted label feed proves the peer is up,\n    /// exactly like an instance feed). The endpoint-less carrier: this is how a\n    /// peer with zero endpoints gets its hostname into our `--nodes` view.\n    // [impl->REQ-SUBNET-3]\n    pub fn apply_node_labels(\n        &self,\n        origin_node: &str,\n        updates: &[NodeLabelUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> Vec<RegistryApplyVerdict> {\n        let mut regs = self.regs.lock().unwrap();\n        let mut admitted_any = false;\n        let verdicts = 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                RegistryApplyVerdict::Merged(reg.merge_node_label(\n                    &u.node,\n                    u.label.clone(),\n                    u.epoch,\n                ))\n            })\n            .collect();\n        drop(regs);\n        if admitted_any {\n            self.heard\n                .lock()\n                .unwrap()\n                .insert(origin_node.to_string(), wall_ms());\n            self.stamp_admit();\n        }\n        self.write_snapshots();\n        verdicts\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    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        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…\n    }\n…\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…\n}","startLine":210,"lineNumbers":[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,null,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,null,767,null,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,null,2237]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"}}},"isError":false,"timestamp":1784271679453}}
{"type":"message","id":"9db251ac","parentId":"70d70144","timestamp":"2026-07-17T07:01:19.454Z","message":{"role":"toolResult","toolCallId":"call_MeFfh7kLUSRYHyVUOA370zME|fc_0a061eb498f0e908016a59d33f5838819696be335b7d3a678a","toolName":"grep","content":[{"type":"text","text":"No matches found"}],"details":{"scopePath":"crates/spt-daemon/tests, crates/spt-daemon/src/dispatch.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":0,"fileCount":0,"files":[],"truncated":false},"isError":false,"useless":true,"timestamp":1784271679454}}
{"type":"message","id":"1e1e7fbd","parentId":"9db251ac","timestamp":"2026-07-17T07:01:19.497Z","message":{"role":"toolResult","toolCallId":"call_AwVsNWMGHu1H9VQOg0iFOTXy|fc_0a061eb498f0e908016a59d33f583481968fae3b666fdf6d75","toolName":"read","content":[{"type":"text","text":"    pub fn test_seed_wedged_local_controller(&self, id: u64, blocked_ms_ago: u64) -> bool {\n…\n        true\n    }\n\n    /// TEST-SUPPORT seam for the round-3 structural resume guard (stale-guard\n    /// swap, doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md`): the\n    /// count of read-only viewers currently attached to hosted session `id`,\n    /// or `None` if no session with that id is hosted. Lets the deterministic\n    /// zero-subscriber resume guard assert — with no timing window — that the\n    /// daemon brain's cursor-only resume attaches NO subscriber to any session,\n    /// while the paired hazard arm (a `resume_sessions` subscribe) is observed\n    /// to raise the same count to >= 1. Follows the exact locking idiom of\n    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n    /// `#[doc(hidden)]` — test support, not a product surface.\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    #[doc(hidden)]\n    pub fn test_session_viewer_count(&self, id: u64) -> Option<usize> {\n        let log = {\n            let sessions = recover(&self.sessions);\n            match sessions.get(&id) {\n                Some(h) => Arc::clone(&h.log),\n                None => return None,\n            }\n        };\n        let count = recover_log(&log).viewers.len();\n        Some(count)\n    }\n\n    /// Live per-connection handler threads (for tests / introspection). The\n    /// UPDATE-WEDGE round-4 gate watches this fall when a poisoned physical conn\n    /// drives its handler to EOF cleanup within the write bound — without the\n    /// black-holed client dropping its end.\n    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n    pub fn conn_handler_count(&self) -> usize {\n        self.conn_handlers.load(Ordering::Acquire)\n    }\n\n    /// The live **resident adapter children** (translation binaries) for\n    /// `endpoint` — the processes a live adapter update (W3d) stops and restarts\n    /// so the install dir's locked binaries free up. The broker `sessions` map IS\n    /// the per-endpoint resident registry (W3a, ADR-0025): each `HostedSession`\n    /// already carries its `endpoint` + lifecycle-managed `translation` child.\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn resident_translations_for_endpoint(&self, endpoint: &str) -> Vec<Arc<Translation>> {\n        let map = recover(&self.sessions);\n        map.values()\n            .filter(|s| s.endpoint == endpoint)\n            .filter_map(|s| s.translation.clone())\n            .collect()\n    }\n\n    /// The live endpoints running `adapter`, each with its install dir — the apply\n    /// targets for a live adapter update (W3d decides daemon-apply vs CLI-direct\n    /// from whether this is empty). Distinct, sorted. (W3a, ADR-0025)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn endpoints_running_adapter(&self, adapter: &str) -> Vec<(String, std::path::PathBuf)> {\n        let rows: Vec<_> = {\n            let map = recover(&self.sessions);\n            map.values()\n                .map(|s| (s.endpoint.clone(), s.adapter.clone(), s.install_dir.clone()))\n                .collect()\n        };\n        select_endpoints_running_adapter(rows, adapter)\n    }\n\n    /// The child pid of a hosted session, if present (tests assert it is stable\n    /// across brain restarts).\n    pub fn session_pid(&self, id: u64) -> Option<u32> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .and_then(|h| h.session.process_id())\n    }\n\n    /// Broker-truth read for the brain promotion DRAINED gate\n    /// (REQ-UPDATE-PROMOTE-DRAINED): is ANY hosted session's LOCAL controller (the\n    /// brain's own `by: None` conn) still WEDGED — blocked in a socket write past the\n    /// brain-write deadline? The brain supervisor (in THIS broker process — no round-\n    /// trip) promotes a ready update candidate only once this reads `false`: an OLD\n    /// generation whose local controller conn is black-holed reads wedged until the W2\n    /// stall-evict releases it, so `brain.ready` inside the 15 s window can no longer\n    /// promote onto a still-frozen control plane (the 22:47 false-promote). A cleanly-\n    /// closed old conn is simply absent → `false` at once (the normal fast promote).\n    /// Follows the established sessions→log lock order (KIND_SESSIONS reap); reads\n    /// only `write_blocked_since` under each log lock, never any I/O.\n    // [impl->REQ-UPDATE-PROMOTE-DRAINED]\n    pub fn any_local_controller_wedged(&self) -> bool {\n        let now = Instant::now();\n        let deadline = brain_write_deadline();\n        let sessions = match self.sessions.lock() {\n            Ok(g) => g,\n            Err(p) => p.into_inner(),\n        };\n        sessions.values().any(|h| {\n            match h.log.lock() {\n                Ok(log) => log.local_controller_wedged(now, deadline),\n                // A poisoned log lock cannot be honestly read — treat as NOT wedged\n                // (fail toward promotion, never a permanent gate that strands apply).\n                Err(_) => false,\n            }\n        })\n    }\n\n    /// The count of live QUIC connections the broker-owned net endpoint holds\n    /// (D4a, ADR-0004 §B), or 0 when net-less. A direct read of the broker's own\n    /// state — the survival-assertion seam for the D7-1 process-level E2E: a QUIC\n    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n…\n    }\n\n[Showing lines 2889-3013 of 6298. Use :3014 to continue]"}],"details":{"truncation":{"content":"        true\n    }\n\n    /// TEST-SUPPORT seam for the round-3 structural resume guard (stale-guard\n    /// swap, doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md`): the\n    /// count of read-only viewers currently attached to hosted session `id`,\n    /// or `None` if no session with that id is hosted. Lets the deterministic\n    /// zero-subscriber resume guard assert — with no timing window — that the\n    /// daemon brain's cursor-only resume attaches NO subscriber to any session,\n    /// while the paired hazard arm (a `resume_sessions` subscribe) is observed\n    /// to raise the same count to >= 1. Follows the exact locking idiom of\n    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n    /// `#[doc(hidden)]` — test support, not a product surface.\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    #[doc(hidden)]\n    pub fn test_session_viewer_count(&self, id: u64) -> Option<usize> {\n        let log = {\n            let sessions = recover(&self.sessions);\n            match sessions.get(&id) {\n                Some(h) => Arc::clone(&h.log),\n                None => return None,\n            }\n        };\n        let count = recover_log(&log).viewers.len();\n        Some(count)\n    }\n\n    /// Live per-connection handler threads (for tests / introspection). The\n    /// UPDATE-WEDGE round-4 gate watches this fall when a poisoned physical conn\n    /// drives its handler to EOF cleanup within the write bound — without the\n    /// black-holed client dropping its end.\n    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n    pub fn conn_handler_count(&self) -> usize {\n        self.conn_handlers.load(Ordering::Acquire)\n    }\n\n    /// The live **resident adapter children** (translation binaries) for\n    /// `endpoint` — the processes a live adapter update (W3d) stops and restarts\n    /// so the install dir's locked binaries free up. The broker `sessions` map IS\n    /// the per-endpoint resident registry (W3a, ADR-0025): each `HostedSession`\n    /// already carries its `endpoint` + lifecycle-managed `translation` child.\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn resident_translations_for_endpoint(&self, endpoint: &str) -> Vec<Arc<Translation>> {\n        let map = recover(&self.sessions);\n        map.values()\n            .filter(|s| s.endpoint == endpoint)\n            .filter_map(|s| s.translation.clone())\n            .collect()\n    }\n\n    /// The live endpoints running `adapter`, each with its install dir — the apply\n    /// targets for a live adapter update (W3d decides daemon-apply vs CLI-direct\n    /// from whether this is empty). Distinct, sorted. (W3a, ADR-0025)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn endpoints_running_adapter(&self, adapter: &str) -> Vec<(String, std::path::PathBuf)> {\n        let rows: Vec<_> = {\n            let map = recover(&self.sessions);\n            map.values()\n                .map(|s| (s.endpoint.clone(), s.adapter.clone(), s.install_dir.clone()))\n                .collect()\n        };\n        select_endpoints_running_adapter(rows, adapter)\n    }\n\n    /// The child pid of a hosted session, if present (tests assert it is stable\n    /// across brain restarts).\n    pub fn session_pid(&self, id: u64) -> Option<u32> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .and_then(|h| h.session.process_id())\n    }\n\n    /// Broker-truth read for the brain promotion DRAINED gate\n    /// (REQ-UPDATE-PROMOTE-DRAINED): is ANY hosted session's LOCAL controller (the\n    /// brain's own `by: None` conn) still WEDGED — blocked in a socket write past the\n    /// brain-write deadline? The brain supervisor (in THIS broker process — no round-\n    /// trip) promotes a ready update candidate only once this reads `false`: an OLD\n    /// generation whose local controller conn is black-holed reads wedged until the W2\n    /// stall-evict releases it, so `brain.ready` inside the 15 s window can no longer\n    /// promote onto a still-frozen control plane (the 22:47 false-promote). A cleanly-\n    /// closed old conn is simply absent → `false` at once (the normal fast promote).\n    /// Follows the established sessions→log lock order (KIND_SESSIONS reap); reads\n    /// only `write_blocked_since` under each log lock, never any I/O.\n    // [impl->REQ-UPDATE-PROMOTE-DRAINED]\n    pub fn any_local_controller_wedged(&self) -> bool {\n        let now = Instant::now();\n        let deadline = brain_write_deadline();\n        let sessions = match self.sessions.lock() {\n            Ok(g) => g,\n            Err(p) => p.into_inner(),\n        };\n        sessions.values().any(|h| {\n            match h.log.lock() {\n                Ok(log) => log.local_controller_wedged(now, deadline),\n                // A poisoned log lock cannot be honestly read — treat as NOT wedged\n                // (fail toward promotion, never a permanent gate that strands apply).\n                Err(_) => false,\n            }\n        })\n    }\n\n    /// The count of live QUIC connections the broker-owned net endpoint holds\n    /// (D4a, ADR-0004 §B), or 0 when net-less. A direct read of the broker's own\n    /// state — the survival-assertion seam for the D7-1 process-level E2E: a QUIC\n    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {","truncated":true,"truncatedBy":"lines","totalLines":3410,"totalBytes":6467,"outputLines":125,"outputBytes":6467,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn test_seed_wedged_local_controller(&self, id: u64, blocked_ms_ago: u64) -> bool {\n…\n        true\n    }\n\n    /// TEST-SUPPORT seam for the round-3 structural resume guard (stale-guard\n    /// swap, doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md`): the\n    /// count of read-only viewers currently attached to hosted session `id`,\n    /// or `None` if no session with that id is hosted. Lets the deterministic\n    /// zero-subscriber resume guard assert — with no timing window — that the\n    /// daemon brain's cursor-only resume attaches NO subscriber to any session,\n    /// while the paired hazard arm (a `resume_sessions` subscribe) is observed\n    /// to raise the same count to >= 1. Follows the exact locking idiom of\n    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n    /// `#[doc(hidden)]` — test support, not a product surface.\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    #[doc(hidden)]\n    pub fn test_session_viewer_count(&self, id: u64) -> Option<usize> {\n        let log = {\n            let sessions = recover(&self.sessions);\n            match sessions.get(&id) {\n                Some(h) => Arc::clone(&h.log),\n                None => return None,\n            }\n        };\n        let count = recover_log(&log).viewers.len();\n        Some(count)\n    }\n\n    /// Live per-connection handler threads (for tests / introspection). The\n    /// UPDATE-WEDGE round-4 gate watches this fall when a poisoned physical conn\n    /// drives its handler to EOF cleanup within the write bound — without the\n    /// black-holed client dropping its end.\n    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n    pub fn conn_handler_count(&self) -> usize {\n        self.conn_handlers.load(Ordering::Acquire)\n    }\n\n    /// The live **resident adapter children** (translation binaries) for\n    /// `endpoint` — the processes a live adapter update (W3d) stops and restarts\n    /// so the install dir's locked binaries free up. The broker `sessions` map IS\n    /// the per-endpoint resident registry (W3a, ADR-0025): each `HostedSession`\n    /// already carries its `endpoint` + lifecycle-managed `translation` child.\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn resident_translations_for_endpoint(&self, endpoint: &str) -> Vec<Arc<Translation>> {\n        let map = recover(&self.sessions);\n        map.values()\n            .filter(|s| s.endpoint == endpoint)\n            .filter_map(|s| s.translation.clone())\n            .collect()\n    }\n\n    /// The live endpoints running `adapter`, each with its install dir — the apply\n    /// targets for a live adapter update (W3d decides daemon-apply vs CLI-direct\n    /// from whether this is empty). Distinct, sorted. (W3a, ADR-0025)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn endpoints_running_adapter(&self, adapter: &str) -> Vec<(String, std::path::PathBuf)> {\n        let rows: Vec<_> = {\n            let map = recover(&self.sessions);\n            map.values()\n                .map(|s| (s.endpoint.clone(), s.adapter.clone(), s.install_dir.clone()))\n                .collect()\n        };\n        select_endpoints_running_adapter(rows, adapter)\n    }\n\n    /// The child pid of a hosted session, if present (tests assert it is stable\n    /// across brain restarts).\n    pub fn session_pid(&self, id: u64) -> Option<u32> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .and_then(|h| h.session.process_id())\n    }\n\n    /// Broker-truth read for the brain promotion DRAINED gate\n    /// (REQ-UPDATE-PROMOTE-DRAINED): is ANY hosted session's LOCAL controller (the\n    /// brain's own `by: None` conn) still WEDGED — blocked in a socket write past the\n    /// brain-write deadline? The brain supervisor (in THIS broker process — no round-\n    /// trip) promotes a ready update candidate only once this reads `false`: an OLD\n    /// generation whose local controller conn is black-holed reads wedged until the W2\n    /// stall-evict releases it, so `brain.ready` inside the 15 s window can no longer\n    /// promote onto a still-frozen control plane (the 22:47 false-promote). A cleanly-\n    /// closed old conn is simply absent → `false` at once (the normal fast promote).\n    /// Follows the established sessions→log lock order (KIND_SESSIONS reap); reads\n    /// only `write_blocked_since` under each log lock, never any I/O.\n    // [impl->REQ-UPDATE-PROMOTE-DRAINED]\n    pub fn any_local_controller_wedged(&self) -> bool {\n        let now = Instant::now();\n        let deadline = brain_write_deadline();\n        let sessions = match self.sessions.lock() {\n            Ok(g) => g,\n            Err(p) => p.into_inner(),\n        };\n        sessions.values().any(|h| {\n            match h.log.lock() {\n                Ok(log) => log.local_controller_wedged(now, deadline),\n                // A poisoned log lock cannot be honestly read — treat as NOT wedged\n                // (fail toward promotion, never a permanent gate that strands apply).\n                Err(_) => false,\n            }\n        })\n    }\n\n    /// The count of live QUIC connections the broker-owned net endpoint holds\n    /// (D4a, ADR-0004 §B), or 0 when net-less. A direct read of the broker's own\n    /// state — the survival-assertion seam for the D7-1 process-level E2E: a QUIC\n    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n…\n    }","startLine":2843,"lineNumbers":[2843,null,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,null,3019]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":6467,"outputLines":125,"outputBytes":6467,"shownRange":{"start":2889,"end":3013},"nextOffset":3014}}},"isError":false,"timestamp":1784271679497}}
{"type":"message","id":"55096f11","parentId":"1e1e7fbd","timestamp":"2026-07-17T07:02:03.947Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing registry feed I/O behavior**\n\n**Investigating Windows IPC cleanup issues**\n\n**Identifying delayed brain read causing poison**"},{"type":"thinking","thinking":"**Analyzing potential lock ordering and pipe behavior**\n\n**Identifying inefficient snapshot writes causing IO issues**\n\n**Clarifying broker thread count discrepancy**"},{"type":"thinking","thinking":"**Planning thread cleanup investigation**\n\n**Identifying connection lifecycle leak**"},{"type":"toolCall","id":"call_1yNrz8Ztx9wko4xzGzydt5WD|fc_0a061eb498f0e908016a59d365818c8196816f3da238faaf84","name":"irc","arguments":{"i":"Reporting registry mechanism","op":"send","to":"Main","message":"Registry-specific chain found: each 30s registry round opens+FINs a fresh stream per peer/subnet (`pump/registry.rs:153-171`, `pump/mod.rs:1118-1122`). Receiver classifies every finished Registry row as pending (`dispatch.rs:347-369` only finished Attach terminal), subscribes from seq 0 (`dispatch.rs:984-1047`). Replay uses a dedicated OS SubscriberSeat writer (`nethost.rs:165-221`). For EACH 64KiB NetStreamData chunk, Registry feed calls apply_node_labels then apply_feed_flips; each independently rewrites every registry snapshot + heard.meta (`dispatch.rs:997-1039`, `registryhost.rs:241-342,734-760`). Thus large replay = repeated full-state disk rewrites while brain stops draining IPC; broker writer can fill pipe and hit exact 15s poison, then dispatcher retries replay. This matches Registry poison + brain I/O. Need live WPR stack/probe to prove. Also retirement only hides row/clears ring, retains entry/subscriber until QUIC conn close (`nethost.rs:1828-1855`; only removal 953-967).","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9968,"output":1525,"cacheRead":204288,"cacheWrite":0,"totalTokens":215781,"reasoningTokens":1226,"cost":{"input":0.04984,"output":0.04575,"cacheRead":0.102144,"cacheWrite":0,"total":0.19773400000000002}},"stopReason":"toolUse","timestamp":1784271679539,"responseId":"resp_0a061eb498f0e908016a59d33fcb8c8196856a625e3c1e696b","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d341e678819682ee51a59f3516b0","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdNS_h7ZXivPQV7joBxxEsbKzfiMrXNL30Hvobx9qR6lZreKj-tABlwikYq_duLFxZgODhESjKevo7XjdQu_tU8XnIop9GQkyXTD5qYGTI-3acL-piSjvfBOO8lvwvSA48zUgyfQLgjpfvBvYFmEE08H6r9vbydORWQitPR_vVwnKmsM32rpV4Ykm75OKCs5STZla4KHuVZUQsTstXkGfNSWCCb3gt_Ai2PzgH-MP1H9dyiPk-LUa0O1Cx_T0iR8nKMWBHSRM5Z2GhXrCow2s5hEl-BS6Rw7QnuiEANhUNoY0S97cWCKtnPigUbgVj_AQFH3pyKkNNrNWo1NQNnoMMhL3jR2__C51Q0E0Z7qXyaWQd2Equ0d10GmYqp9dn9BzGDVxTMxKeiL4fH3pTZq1PpzgJFmzInQpHeoPTbVeTa9TICsOyUz7FKiACaw6CP-A1oKKUNNYLuHdjLHxzzHaXJwkUHeDiL8za5PHK8GXIm422SN_oJUuYWFUFXzqsi6M6pC4nyg5HKoWKcjetnWptEyHcDlyEl9mN5gejil4Kja5RbUwAJLTdA3a7wwowRqjlquXIerDfu_bvY0z0qXkbl_YLIq9MixABMY6Vyt3ufFjYDxVzFSOsLfRhUPx2JgME0hCcqdFOnBLvay2SemBaZ-E6MteEQ-40tUwcUM5VQ0vkzC-bmoBQlQ63sEYq_f8VNBYOaV5stfif-PEiLoQyfYak0UMitkteZ-bIgMKHWfHTpCN3FgvQWUFx48iTq71RZxfIJfWkOFF-0mEGufbaicQWtGq4BOk1seO8rCQ6tAthwLB1vk2_b1Vq1uAH-0bqtG_Y-P5fe6A0BVwd-2hD_OQSRK-YzEMYnrY34aNtqmcv7ZMKwrdiCqFPGtokLyOv0N_15-mhWCY22IzSyD6lKzthq_cc1zq5R2at8LAXhqEUHSK_mPDxqXIbEZP7u02moSewckJQe0VbiL6obiu5ZDIJPUD_zGxN2MQVLI6mF3wF1g7og7zgQUvu1EBGVJE_t6ZR7faLqOA8mzRpFG0wZhcPJr7Kx0OyVLeooyJKBvf-5gqnak7HAmUfB1XYTohArbXwyghiT57MX1lPxoTGRarJDw7LrLodvjKGwp-sT9k3UHOUlI61UAZi9wgRYOoSiXiRmAcoPmvEdNykyxcJhSGebhqcNtmEiT0pPi29w1RrWaa89kC4eNIRoap6WNXgkvRS_5YOVH5b2-yzW7-S3DNWr1xMzk1LZTX8D-775hGloXXmmyHK5h3kgGrW0Xf2uQqMVvFd_A_lI1UVEdJV3Y7--L2bHp6r5XBSY6urpDGek1LSb6kG_eqa0nVKJDh7kfX7tnONbtogIhThE7z-pYb5Z36yQWBOJWJCGfw0NG8n9eCkfOqWCtuLIPwK5ZQtZy6ZwzRbMZfs-eN8GrJJBMvr2pKaAqo2QwCyJwOFLT8Jsg2QHs3puq92Q6bWDc9O8ma2O4e2Yq_M3ymt7caLJlMQf9-s5ZKDJi94k2aKwI0rZTHsBARcWgNuVPihZQ9TMmwCe2cfj9L20hPYF9r_PgXCD8r4KQWYGPNX0UesGw9-YRuMyppPnD0pIE4XRSptpxKv49QsIkQ3tiSUGyOswngyl0dt3S_4vaBgwtb1rI30Wsiy9Q4p_EimRT7a45nU42Jl451L-ww2Ll0HBmq8f9u9BLYCuiQ9mjEHDjmWSQG3twvxYPEMJHI7xFYEXro21waDzAxVHJ3lBOEM67QCSAWoEUGrU-Bbn1hM52tCmINimMqCfed9u98ke3bERB6KkZQtgYpJGDJsKL9nXEgQKDVwjCXO2G4KOwHOvxnyuA5dMRyZZlbphPc8v2aoMMA2dyePz7HDwIG4DabgP-8vqU0u1nWid3Msv8365ttZ5OxJQ_wAUk5lsho_8pGLsVbGKQ_gwsPPsPwhYXcf5dKYncR3bbxPUFbY9elQwKLjaq-z8VOp1ygEPSnBkYG8cxXb9tFug43-fPW_6iRrsED93SHvfx3AWzfL4t8WUGTDXpA2jOs5lLsjf3qPSQetRu8RF5bFDC6F5SNsXgNfrUDSLZ9HOLzNUoG_Vqr3Y51MwS58_bhSB83DSd-t1Hl5K7VOH22FbNHB82nhM9_SzNDfalioZjyeKeZ7V-z8aC-8o4ikyOgqdgSEXIFwoFttSoaISo73MnenpqrGzBV0W-DRL-2Kv9ibmptxhXUraCB3iYTU3yLFKQxooQo-XabTJHcEtj0SRyWdOaZxMkXZlnyfcv07lcH0fccQvd1EP4IoyHQjkyXFb_V5TAQefZZtH33LU4RFQ8ZODMlkLXVqGyqHlY6Y6qO3PviX0J418g3c_I9Ysj8z3Kkpdn2RtQPlB5e-CvLtGvfXDea4kcfgOqdGpJK_7TguETv4QWCrzGXDX99B6G6StvPUiSKMh3WDgiu0p55c3XsT2t9QSCihL76ijPl4lL_oWrBebgi6s7AoMLCs709Q7ZoR7AEfhmqUsIjhnWMF6dtLBC0ocbl6Uzsnsq4e7avaJUPogn_v9B_PaK7NH93cVfhzhEdbmz4KECv8lO2zr1faNQbrbL8nx2spMQXxBqPosc6ysy1S2-DG5NsAvVN48BF5SHFncXYO-d6TQv_ZOuaJFYoI5BqYdxE7Kkc59TZWcw_kxMxaInytQS2027eoJYSx--JUeVPtJiI23C2B95Szrx3bv9FRnHexyVm-kobQMojyAA349oDhVfxydxO14-hqbtpzBlaoFjC8sGwWpSeFaCJgfLZEX9b4x3oDLHl6aGYXDUgy80crjKU3zI9fAeJ8xCH51Q-TAzVW1KZEMajKzvYpYgSEsnx7ah-fra3iD-TEhGTeAVOXi5kqrgHeZFn9sH2ORYtHuJqaDk79og5r7HEdCkpyolwBanR4Yau3O_-l43BhJV38nJ4Sg6Lo63aLRhSganU_r9OK_1Tec2YhwM24COcvwCx6Fmk6kRSpZJ4CGaNDlZuBCyrVvAvdW2yjbDf3MXyzu--nuINQRDD6GMqQCLmAKuDkvkDWzWSa7dLV92BjlpDGizRcRwFTMylffZ7T9dpvRaLTZ8_S9Gop9cTCP27SiDeMLpvojuY_GU84qGSRgF2-Ivl7dxlYGRDeAbgDpHW9Zjz3SgH-ikmTBbZkRt-WSDBt_gqlLtn3X0oJOujMt16y3ZHjp71WjqZcn1ePlx3I9IUtkPXgix_J-Hl1y0YKscUSTHF5P-RpTpsMPwX9b0g5RuMlRGCm-02w-7nM6hJ1V_hcrr7W6ESXPw-9Lp6agfx5Zzfj7MxDlWH59vV0yqe3JUUHL0Ssj3gH00hGlRSeo_IvrY5Jjmc9qdrnylSOhE3ReryxQgISYJSJNNZrivmfHjxLZPcYe0ekvy1gOz5s5o2D0dCo93pOZDYikb2ZanK8I4LoAOXkeWDNzVdV03qp5tXcZK8JxmlkNcUUiyEPkGg6Xv-CtzY98wlixcuhWfeTOBmCn794SDhpxLKv8pqbIGSVWk6DPqE3J4GBkYA-Muwr_fMLx3IOY_ZI7s_EQKAfyObhAmtJaLaZf8YfT-ewnsWRD6xESrXMD8m9Z_PDj9C4JNZK3LBxMeTkjiv19DXVJ6uzMxFn8IccCUjdhviLQYsV8bx-zHpvc_OK0qUGgub9pfLIVonN0Y3OTExMQPVpUzOVQwOA4nROTOE1MXazmvfTFWxarE44aB4qm2qNgKBB-c12vqQ6G9uwCOchM8LTTRVJjPqUUJHHxNgQuz9N3QveZTSIb0ewPhNz0TR_FFenMVKATKG7IQ1tyDBKgljkJ9PeTzuBm3kKElge96wvbxCJ77xqTWfCjsnwMz7xR9qM-4pOywJa6YCRIuOKjoYt36cLs32GYNeNOxsSs4v0tMc18xsonxkQgBUG2RptKFCP2pnOX1gt0JBxEVwwjnKSh997ucNo8_9xdu-A2-SNfhNIjaG4nCgZzMIi_noPOpfpcUH0UivVc92YHMwLejG1bM32fp_cOgNC_lxdX_3hv_JdpUzEm2mXdKoILYkvNdFhdGcsS6vC1Xfzniy7pgAocNF2YtkdiNJZHix_4XcXanPSpSGhzIV1UXJQa0-bYBZsAQ9OPHVhyn5xHxdrz04gJmW-9aVwTmIrNH7NE1HMWuzt0=","summary":[{"type":"summary_text","text":"**Analyzing registry feed I/O behavior**"},{"type":"summary_text","text":"**Investigating Windows IPC cleanup issues**"},{"type":"summary_text","text":"**Identifying delayed brain read causing poison**"}]},{"id":"rs_0a061eb498f0e908016a59d352e3648196aefa01e14d04946e","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdNf7uzQ5V8_A4X2dQrCrGTIoRDyYJ9Wo4nvvvOneBq_YTQ91BeEh0uzgn9Qnhba4iPWfH8EO-tG9Dqt-c4ru_xxBavTAgxQqu-X7pqx2eozPUGYP33TZk_EiO_T6RyYS1Gk1OSnwPuhul70rPsBd5V_6Gf2Yr48__wKqsQ0w8hDa8jEEhQDO4dHAVmqfzD8tr7vRhSSwv68b6bDlLKq41ApZZ_Ax15_v-IOfrVrWIPKztwvKFF5yCBeQZBZxy1SqFvekiOSQkv2xTzqNsoy1nnoPiLoaRWrVjbkiDJyXhQRt5ReJ0bLOQwTCYEJ8JlWThA-OegZySSZX5MHwOitSelToMIR44RgA9t5r7yjVzwYtY2QAXrGYVcVOfLBoxT50mEOut1liPeWuAB0rLZB4xNtj4lQksPkwlvaQiPELX5zoUwDg5DGbbFN_L_kYWjKnw7Wl6DDPi6F7FlK0Odyp62cXqecB1u7z7ZiHh8mL1F1_-UJxqUM9f1XhoT3njNtX03YFPFFIl2YpYAlkpiqYgu_T1p6ogT0-Xjr8V_Nvoncfi_sToaiKtiZ2L1OX81AKJ-Fos9gbzlHJLQQxXlc8u0phYSJLX1S4rdNdPfFr_FdwCNsM8ou5mmTKpufh6JOpMHCc5h-eGdfMTk0wqvWcmKI0dpCxnlDhbPFlGsK5fsn4tFpkL_hSE8GFewati-yzIe4nn8FHpN7DNecrsAasn0Myc5hRA5xbX8MfZcHvdSuFIrCcSgTKtqI1PBQFJcsk3H1Zpcj9dkskE50C3TYUEimkxPX7cgC-rN7xn6oziJdhyYaP2hBp3a5aWRUn9NFVHStIjqeFJy2x2ZCUhCZQDbNNNhYNIazHCwTPb6d1SadVMEX8yjQ9v1hD4PeLlNe1geaqKXO__s_fDq9K_qO3a3yRB-mt-W8LdMV2BIbY3RI4wpXObBkOSggMCccsO0cXwtUyHRsYOFvJkl2Pqqnv6nnhmGwWHPWmujg8uo0FROH_w5X2g56cTDWwdZNvx3uvAPzOrElyVGnmG2brKxWFyi5lmGZtkpvuKtURcp6W45dJTrM_Nv1V9pb4eReo3SN0hx0emFFaqoHuvaWUH1jU3IS_fQv9pORqEuDhGCwNq89pSY15brryxMkR0yrNPotDM69-9QOctnS8tRz9IryKiHZ04YAk-wQADKeKyJR6kvK6d1oMNlaTE6m2h9NaJEaWBWyAJRKDiY0t6vhSpPfhwP1cO8cg1PF1cVQ06M2p3hHxkQx_sHBOigate0ea5OoFbCWnV-ub1edtHCM0_zz9HcUB2CY9MAUqig9DE1CFTalXtM6_jgLr3i0GigxmYb3Bre5DtOFiCT8l1KCZmr6MBqQFaFcz2WOjSZLzz6VNYij6hb7_hGXvJTaTFrXxhoocZiCtOL8HNMrwc38tEsYD4Ji-gTHpqsXPqosh9GNiubP2lG2rKEL5CAaZKajI48hz4eoPi8Ho7aOkFANxsEmM85R3wZX_opajuzMxOv8fyrUtTvej0S1zsKMi8AT_uGSxw8VPY3-n4CJW5wy4yp_S_5iUbCPZsn876qsqpLeT-wDcoKZMqFnnA87LaMj_f0ApRWAUa1BS5QYV_ympLO779GoZ-yUfZT3TDJBDQ3N5soVlnVOYB12tKKiU-ndpBw6qV-fUIpQlO9juiqFKNfykX38dzpgVmIWP0pHL1D3qpgeyVSfjg765vKFt0v2aUOUvA6SUDAwabupeOjXO-eOjDGytTTQdT1Iv9iwA8pQEHEOhXNGpggHJMqgdBUU9S6S0I86KTuaZ_qOg2ghHMUuqUkt7-7UygCTRgPG1p4shkwzB5z9lAsTFkPPusiPqQLW17p1_MmS7NV75VlS65KqWuLm_EnO6hWh3eRykWUh1UIZDZzXIGqr4SRNvg66V2Dpibww30nRfMPNBlpRcvYCgiqKWwdfeqY51NfLb8Dnh4D8iuR7UNmW751OzVCB5WTIXf_69Zvt2_KDbcASn949f4QuqhRwyhw4BomrwXv7MaM-LDMlp7AWVahj67VyYCzgNezNRB6Qzqp27KkmD6lEjWUttEMMLWBJLaYDoJMLO3qbFZWkpo6MXK-rEgelAgEVDURkM1f0E2vxkptojp9qXobOH7aF52Hhnl-8BI8rNVTNqcfXA2jxMEltuz_1FNQOvYlIVpS_ZpQPxS3Um2O19US0YhyLV_Zh2A0QOql7msi2XDbCT00cH1aTCSNkSQY0AfsJOqXu2nO-o21kzZ5lnGRXZa6iEFvgAxPZMAelRi-nDJI8DuEyEJnnJgzJF71E3dHvvWBUwY_y10hialoyyfw7gAMKDzzCDacoYYuLMkOCpTfJwuL2jIlIwASDyq2V_W0KwB1R9MU-QcB6RIy-2_4qmHQ3Z8Sz-iasR0kgij-TyXcaQTaglgqgUM7OjsFyBzIhu_EaxAAqJjQ_ni8yqdVYiL1eL6fyElO63yrxyHXYZJzQ4P-3m6zbFN5XBjtjfAXHhAOxKXidZherjG9L8rmN4LBdD1MOE0lXZTHmhxXmdGjNy05AK8JhsuL2KZc6Mt7erprLmfPj3dc91lx8lPYbd5J46D0MACkLbTyZUGw439FD712c-Q_H08FSpmcKX748k1aPJrH1wKkvelJf4gX8A0EaAq_5irxM2-SC7Lb2oPr14Fwu9t3P1Q_6pLGpKbU8tFwnBiRSRY-ggw2m3qRO3n1OpJUzR67Oe9Nqj0sALEfEPFbVOj3OFnpJ20kT5EpZV6m0JvGtcMtZCMp0WPwuSFS2idUR1HZ-Bbaj178NgEaeczxyKbTn4dVpJ3yb5ITTqc_Z2vyZspNgMByNTzGxqOEXEyEvSHkDN922awyu5SqoYRUD2er5avPGl9kiAGKtHr7YeAmKBrnmxQVspyFaIaRttDAXYcYbbucajVc_r1kbbE2V6IQtt38P5Z34YNZB9tTw5vzJO77E0m4NLA0066R5t5J9jr9zll6aE0am9eYG-4BBJ9gfNk8SuKzfEIshmvB7h5GAryXqXjaIJ5ZNr5hYAV2Kb6XwEoAoAAoyqp7KOfCObdTbOYHLUUIF_MF5cE5YTbyKFfi3ANHHOoZlxFcTdgSbJlFYzTRTs-35n75c4VG9EtOVjvLmRnjox38yV6R6smRvBQjGC1jCyx8J-YgXDRQjKIYmO8KWAYVCXrkInMKBua_WzzGY1x1rngwoDGwNjsawOfESe3RnjMNwvcAzM1u1qbBcHrjwAfj8heV9kLpH9gTWTDpnX3PpxC0jk3lDXwTHN9QhMuPervoYuzEEwih1QNrpv9pwbjLjZNfu4JwgUZ2PwTAWb6p2pbDxdGZpI79MghLWbjBTpDzvysJZTH_JVT3A4NRhGIx9QBfwiGvPm-mWTa4MENzxnXdTNzRUwSfVzyhhQ012pTLtGDBjSpmxIZ58lEw36xAsR8ZyfNgNC8kLef4SIfb45QymKxdidU39Yl3ACW3SyipIhjpsbeu366i5FjUK3qpXLDCm_H0TLqJTU4idlB25eiHS8_aKm4fSHesqK2-jwINxFvyUyR7XQTiGgjNchB89VASJ3y9KrMsPqnJSXbqdxfxsDYJ54rx41DnxhYrFuzGUltIKnmmo07xgHv5iXiJnhznkrofR1gfW89HKzLMNS2E-eZGGgvu9KLJ7Ach4M6WWGx6j3xhfXrNpUsVbI_DBy7iJmVvQAhsiT_wF-E_vGzSMWA2gV7rpJ78yJQR4PLU7O_TMSCTdjbaV6RKzEvTOJrPpEgjPRHfSZn5An-qbvxraCV7r7g6lDqqnbobR4Dyr8I1hcKZKOF8ep9k-lvXXDcsOGofk4EEMwidmaeB9TlQvbYOWmX2VNnAElTODtHDQqqXzk4XaIBJRhQ18ZBnqc3lEcI0HLdPfxlWyIeOzjshQHpPD6zszgfgIPxpXTBzorUvCdC6KxFN0tqVqeMyPy8nBqKuanPIJEHn3h1lVrD6qSQhaVN6QESfh_gKR2HFOqA==","summary":[{"type":"summary_text","text":"**Analyzing potential lock ordering and pipe behavior**"},{"type":"summary_text","text":"**Identifying inefficient snapshot writes causing IO issues**"},{"type":"summary_text","text":"**Clarifying broker thread count discrepancy**"}]},{"id":"rs_0a061eb498f0e908016a59d35f9d608196a83804b15d9db543","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdNlvit8a1HYOu8cS_wrcI2e6492QCH9l2Z2htGc4jXqhCIEKwmQJxTPXPMjAiKEcAMWrXM-oLviFSLE-k7WLEOSaQ3y_2xGUjEb6xaKN6deQP_H8ms_8R7Uy27EEiZEHgfoAKDIkRu5uMAodXwwX0MSrZdzscgOM65APrd73AEIhPVlxCBx3XWLqquHqEyKHL2YVlMCW2pRK4FBPjTTej0NZl7kx2FAfsTdrv30eRD3PS7qRDoItE3TksxiEH2hy63RRSSGsZB12o8iG5phRWa2yaLk6oOj6S0s7CSOT_Zs5OB1xOHJ8lq-UDFlm-QBa-qsb3tfo-22J7abBKcaO_4cs4_UxUu6WEw4LZb2R7MHtlSsiSF3V-LCMLbg6JOh8RTVz1rShyBC2AyJbpnIM4zH_6EcwwGmqY-MPyHW8xM-ebCyA3u31H64zuyPmOBd0KPlpNI-01DmnylQkmE4VtA57M6o7BYMF2quvxJ-PUbkvA6L_Bv2kY9pZTxy5fILhzAxggmkCvNfgyBJV5xgLsuXDSUo_i0BmDYv_C0qS8i0qAocmP-qMXPU4IsrF6K_CfowoJMOTNy-VZAfTJM09Fj_jEI82XuFRmt2nj9-5N4p1vPnAFG1705hto0v82cQfAp_sSixrYN9K9bt9YPoFX7bKHRaS9jpB3THEfxf4vzO7a2NsSf56K60ldyugOitltaoMv5eVFZ1jfX-_K2UQsL_LzTk7PT1nqgJkbq-JT0caQqfkTLybLwHIvkT7swiYhGWcJb3-pXrUeMCXaETpA7c1fSpdpCpCo_eg0XRsC9KXxJcSXTQvr-QqOpUQ2rARQPGMtDsT4hDq7eRsjuLxixnsY7mNBxExzu6YxmHM-CmJ-IK9AwkF9QtlPbt4Pw754Z-YSKgLbNmS_K1Nm9KDsDhdV7FqIAyiEpmKW3XSPIwcyhtpGSXLI6Jq6747QW8r-4lr8nmCb-hQqcMJC2Qt1DRJOzoFtqyqISXMx4AtoUuhNvs02WzNz_ESKKk3HrroxdLTxCYHCAQzMiGYyPDXFUEOvUbTRZNCtRsPvhe9G14W8M3kRMnCbegHKH5pIo3ZwWDGOuAqrufsgXlxCTJVW_aNnVCPBpkJvNd2kT89eJYeQ3hqZEwt4iyW-iKHrVdEQ5gqFrWSRhJPc4Ynm3w3L4OkVVvOWC8hW-O3bb1icsDdSykHALMbAGQ9OwPuIaLvL8j1PfPBKkHH6KPFz2Il-25wrJ3BaFjYxHGwGBFO6fYMcW6btpzfjDA80ahSAFlCMH6ZOxyoAK4XgmscUoun-9n4x456LIA4PdH0wFm5C_bTnnlwMPgpX19SFUG-kRYiMI43Pbg5FL703E7V5QwvvLeTtPuCHx0DzvFmCBz36B-9AFtpwEOnFnAkd1TvHWHYhAGqR7tGj9v1PoZCNF2uWDfxVYrCS6njqJxDDdqris7SRlLBPomEW13_vpYNOofD1kpI_V0IkNmbd9lbJTJNpW4Xdg3gXXugRtCf8FlA66NV4TB3mq9D-YI2P4LZoVqGohq-vOmseHTRQhDow38r4qdtzQJI1qQ7hbALAfJ51pJVKt0YmcmOlViYF_h4lJnez07s_ZgiYhb81iJAIk2oaLMts8riZfhdryEeTKyU34KJPdKod5Jg6n-A5zngUB4MBtNVqipNzwYIj5RQtCsaA9cTY4-EIHMQp3F2Q67ftEP-EDQwZX1XvaZU34bdWsQjc_e7IHTY9K1G2g61GeO4jZzzAmfDgI4DrBxHD3lXTFzDPBc_EDvRCkRWdquIODnhyE8xsHvzbloLGHwqPg1hnwe2tQw5KnOWj5Lw1b9NwHJa3oAHFHf522CJH-ZX2gP2EipLZpzdZt5VtEcn0oYkWsVAHCcecwG_h2Yacb5MSuHNG6GcxOts2TVOTpB5myUadE5bCGi5qT7Rbp73gaRT0WpXybaLzLOX1qIYSNeDFIE2lLhLZA7KmHXgn599mngzcqskSeVdoiG-SyqDt-dj-opWzbtEyplX2z6tRqxHvDmX3zzUMm2iScGhmRnIgNE9utMkROG7p8FeasG1yQZR7g5zPnuMTWqrW1T8vM5MjU0HS0hRbqptmXzIsJvMJVIrM7n","summary":[{"type":"summary_text","text":"**Planning thread cleanup investigation**"},{"type":"summary_text","text":"**Identifying connection lifecycle leak**"}]},{"id":"fc_0a061eb498f0e908016a59d365818c8196816f3da238faaf84","type":"function_call","status":"completed","arguments":"{\"i\":\"Reporting registry mechanism\",\"op\":\"send\",\"to\":\"Main\",\"message\":\"Registry-specific chain found: each 30s registry round opens+FINs a fresh stream per peer/subnet (`pump/registry.rs:153-171`, `pump/mod.rs:1118-1122`). Receiver classifies every finished Registry row as pending (`dispatch.rs:347-369` only finished Attach terminal), subscribes from seq 0 (`dispatch.rs:984-1047`). Replay uses a dedicated OS SubscriberSeat writer (`nethost.rs:165-221`). For EACH 64KiB NetStreamData chunk, Registry feed calls apply_node_labels then apply_feed_flips; each independently rewrites every registry snapshot + heard.meta (`dispatch.rs:997-1039`, `registryhost.rs:241-342,734-760`). Thus large replay = repeated full-state disk rewrites while brain stops draining IPC; broker writer can fill pipe and hit exact 15s poison, then dispatcher retries replay. This matches Registry poison + brain I/O. Need live WPR stack/probe to prove. Also retirement only hides row/clears ring, retains entry/subscriber until QUIC conn close (`nethost.rs:1828-1855`; only removal 953-967).\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_1yNrz8Ztx9wko4xzGzydt5WD","name":"irc"}]},"duration":44407.394099995494,"ttft":2382.345799997449,"contextSnapshot":{"promptTokens":214256,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_1yNrz8Ztx9wko4xzGzydt5WD|fc_0a061eb498f0e908016a59d365818c8196816f3da238faaf84","toolName":"irc","startedAt":"2026-07-17T07:02:03.948Z","intent":"Reporting registry mechanism"},"id":"94955cea","parentId":"55096f11","timestamp":"2026-07-17T07:02:03.948Z"}
{"type":"message","id":"69c4e587","parentId":"94955cea","timestamp":"2026-07-17T07:02:03.948Z","message":{"role":"toolResult","toolCallId":"call_1yNrz8Ztx9wko4xzGzydt5WD|fc_0a061eb498f0e908016a59d365818c8196816f3da238faaf84","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- Main: injected"}],"details":{"op":"send","from":"BrokerCpuRca","to":"Main","receipts":[{"to":"Main","outcome":"injected"}]},"isError":false,"timestamp":1784271723948}}
{"type":"message","id":"41f1a117","parentId":"69c4e587","timestamp":"2026-07-17T07:02:30.935Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Inspecting thread management and stream cleanup**\n\n**Analyzing stream retention and subscriber cleanup issues**\n\n**Verifying BrokerConn drop and Arc cleanup**"},{"type":"thinking","thinking":"**Investigating PTY drain leak and registry poison**"},{"type":"toolCall","id":"call_x94AEN5kZUtiMtxroyZrnkTf|fc_0a061eb498f0e908016a59d386dc6c819686924ed420af08fb","name":"grep","arguments":{"i":"Finding drain leak documentation","pattern":"Drain|PTY reader|reader thread|no-EOF-while-writer-held|request_stop|drain thread","path":"docs; crates/spt-daemon/tests; crates/spt-term","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_GFxdxsDv0rfiWFdY1E5RtJqy|fc_0a061eb498f0e908016a59d386dc7c819693b9566645fdea47","name":"grep","arguments":{"i":"Finding thread count telemetry","pattern":"thread count|threads|conn_handler_count|conn-watchdog|watchdog","path":"docs; .claude/reports","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_GDwseDL2gi8bt0YFWq9bBXAP|fc_0a061eb498f0e908016a59d386dc888196b2eb742ea38931e5","name":"read","arguments":{"i":"Reading stream retirement exact path","path":"crates/spt-daemon/src/nethost.rs","selector":"940-990,1000-1070,1800-1860"}},{"type":"toolCall","id":"call_1wSjlOt8nnXQOtTXG0E8Dm0I|fc_0a061eb498f0e908016a59d386dc9081969ed7193931cae5e5","name":"read","arguments":{"i":"Reading session thread exact path","path":"crates/spt-daemon/src/broker.rs","selector":"1410-1468,1548-1650,1760-1852,3400-3470"}},{"type":"toolCall","id":"call_6JD1Awxe9xbXqeOoCiFkWjMh|fc_0a061eb498f0e908016a59d386dc988196b53aab795910f63a","name":"read","arguments":{"i":"Reading watcher exact lifetime","path":"crates/spt-daemon/src/conn.rs","selector":"414-455,639-665"}},{"type":"toolCall","id":"call_OzGmJWhngAfJ05n4E6Ilw9jb|fc_0a061eb498f0e908016a59d386dca48196bc015301ae694aa3","name":"read","arguments":{"i":"Reading PTY drain exact lifetime","path":"crates/spt-term/src/reader.rs","selector":"65-182"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":2299,"output":947,"cacheRead":213504,"cacheWrite":0,"totalTokens":216750,"reasoningTokens":607,"cost":{"input":0.011495000000000002,"output":0.02841,"cacheRead":0.106752,"cacheWrite":0,"total":0.146657}},"stopReason":"toolUse","timestamp":1784271723961,"responseId":"resp_0a061eb498f0e908016a59d36c2e748196a1c09a253ccb367f","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d36e4a8c81968bebc0ce38bd4ca1","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdN-Abqpj_LLWCeC3EDJaenjqzIVAFS5Me0QQxkCD2iQUlb7bUSdk4gwxxqFEfFpMmnhdu5APz0WakVsQ1g-WT9KmtWmfQd5nA8LMihaFJnnmyevH70jWfyDf87yYsTyqd8GylFwCpc0QfZ0kMQrZMPRMzBxas76Z2jLknFGCzm_hAW4CXz2EMY8giMEaqIKqHm04yD8lrhqUXw4T0nFC47_CMdHhHgR-oticjJVLsaixtZWdyxXJ-o6KHBAqzd_pUduAt6ytNejKs8IlvSPublVu5AptIQ--a2K5y3Lo39vRiWkuXhtd5L982MJFiCGI4TAcjHmosUFaXUlez7f0z3--AvIDMSyWYQh0gyZq_N0ovO2WgBAjycvdx00ZcpsOkM3cpxmcj9BoqYUBIGmtYPF1qxrKbvzJkLy3kRRbQAoTicAVvfhaJJilmi_t_i7pc0bLtzZqCVFg9wvO4_VwsKRCtfND5U9oqibdp2W1YPQCJpl3yYwQECSkWVUqBw7USnCwN4ExyHMRIsOdJrxczxdg-qmMkljTZ8mA1tG8LUVmE20Wi9RyXETOvxE4gNGeBxahEklUJ-9CD-kdb5vps_HygoBxAf4PIyMewo-0Hvzd9g6daxB4X6lNsRe8kYfx1v7gRU1ZvFnbh6ZexZjTnv-GsDiUs8Cj76Dcurr9741YZ1YNDSit6mqctqnPPkSW-qLIWFHS1tPzg2w8Gv56WoHpXLTemALeeeNITL2cnpWbEdDQfW8jtF58PyOsG01N0T9KEuQz-ZJhYM7ILAdmVgdkULFK0PByDed4QPlGRHiA9J2fJOaPk8VNtlbA3giI2J6sj__CShfIEMcrY4Wqu9whm44Yq1NtEBDHm1Sv7ay28vnQaYuPUU5tRwtFpnhfVz_B0EyFNvgWB5XNsOOdaOEM-4ZKSttjChFhHmGkpxpcztgHOCrSll84vU7c45WnW3yX4tLGzKNa9i3iFOrP_aHfaeVoHxPJF2kdjBlM5TUFlTmgfjAVR7Zne0vaM0W5FK8TTgwd-IBfhhrekVEZJ9MvdgDvzpiFEI4-eseH1A_MtwXfd1Cy8hvrKV-JaC00hPTNEazVO3r-eIr07vXzAh9SAdnxKeVsKuXl05RQkiRmW9kyoFkXvboWBEWXZavWobH6JyYb5H22sDAFGQh1LVbZtumSimyCXyENZveOzuqVTOYKnWqCOmP77WYYs1g739_b3GweVCreI2c6Oym-Yd59qB74e_dduwRLmr4TuhI83WIBDnWVx3brujHPss1gwdpR0VdZ5fzAPk5rlqRPLMGkScI7fuS9LVku2BVd4XGs-9CT4A0tNZgqsAjJzhLX58-ozuv71Lqw5-tt-qztvx9gySx3JWO3Ydyp8TJuddLhk4EOI_c3hj3yypD_JCMVesFRwKWIka2sOM9qNYNycHxeRKAT9TqgJkFvMvM33icidkr1tGSeR26fdOtmy-SXW45ocd1crLbJLU9GOiSCN_1mZ6lNSOrcgSe1YsBxbvSQVtYyZ_PUIOhd2d8RY-9_BtP6t92YB_tTcA75nwThvQsSwkemuFNpfezt00kD62C_B3MOXx-pT12q0lJDrnc2UC2N452yMWzZ8osApbtT0ZPXJYU86P__I_DeJylaCymfZOxj4PEF8t1g13ZmvALUuZ8G1wnStC8uUT2y39t_Y1F6BOqajA7izA23lusuJ_b7UxVR3EARH9Vy3YiCW1YYjvDyMfd4nBJSVItQuFzNvmYgIUJeDh8VTkve5MUCohS5H8FBEPZaT-3bnu5Jx8KyqhVfbtAp6QpEN6Vn40UyjYMK7_X-AsUK-382YCgbGNAK3BYx9xLPqA3T2TIPKcK0vUNA5-2cDc521E1m9TqXeQfwkA2_I5npy4VnG5tvmmuY8YTlsXxgDqT6lnGncAZ0iJ7R9698CzB9Th9JcUzG1ifOAxMetjbn8A8ftOElF3oZfMROuK45RXn3Pg7XpmjYFRuB3K9TLTVifMuo1bcFaDiUDk3sMp8HfCQhNK7YztGG_oYmMzhLSjCB0GEF06lhTDmHKffLZnz-qYJrTooe9-chi8Z5syUhIMAaMfi3Sdf-nHituvlrJIF-E28Dua4OaK3n0JyLQjUHIke8k1r3uPRddwVFu45A4CgDm_JwIKWRxmr0qTKmBtwjy0yd4D2be-yhJS56YdOyClA9JGgteMflifGEaqtwaVBhv9RF8tKKaDUqZWfm-YlZyuB_ARDhXjf6HSk6hGJvIehRj_7gsYtRKw1sznrqLfmz3rFPhB4kTcxmPlyPrwHcCr9gTxeKu9JmAje38EbtReIN-SjRzstDxJA8LK0CI5RSOhActe0YKm_F6qFgtTBHpzNCJV2MnQ6WtLFJC-3HRRHkJBGBqtHts258EkTPU0H6Vd9bnDKXSqRjZDnIuDklL0X8zoQCdZx25uTjazRisI6jLnRUJPcEpt2585Zeo7w613h9J7WhStBgUfyAzinB-P2qZIg8hn_XPJqQPWJH7rnyDhFPa1Dfxc4gY0BjGRrg-abAG4Qi8_J3u-FxRzuj8ZcR_5guJNqFMJGhvH-LVgH2cHKkyGJB-JgFe4PnsmwSgo8_OmZTWqrSMzyQMLrpHdGmvH6l-Xfc4GAuxuq9I3Q8sMS77RCwMHJh9eHU4fOc8UG6cnx0D4lppAwrqFuqBolCzTDX-jXmsY5pyEu6mVT5w7XWrajPrgTuzjr-wRDRHTh7H3XLJT4-SgcCOtnGYQiW4yxUMsUWGg7xBZS3GiCRu1cqShEAVGocDwaGJMRzjdWC-_2a1nqJCk3mdH03DoGz8bDUs-ejOjM2x3-JVqoBKrlMkKMwpzonvti7dHNEejdfFhBssAvh1hG1faism_ZQJaiNPVK6rTgV5xP_yAzJSy97h9fcLDgTJgHjdt2Lvb_MXD2GFrHhtNiy_7IdVvzUZXaHUn_QxynD8vqeiWInh16_GMs69taROGu8HMw9IqknnaAVIcLLANytbBqR2ZKQjjWO-TGnBQeqOqyLG0aOpk9plERSSqV-0gsr_6sh77o9gT77amLv2-SahNFkAC3foXvqsUKkcek11t36KC3wqTk6xDjTmU8kKAua4_bwf91FbGBIMK10gHRS6avHS47BFdMXDZJw1KkCEreB2awS0Tt3AL6s23d9FBbkklAIibJUDuNf39Un_H5OQRtBUR7J6VNNCvbQxGJUTIemfWZ4garColxXMPbePQZiPvB3WIi_fItwrWKUAKlK0kwLqhGLFeBj9PvLeZT0CeA-Kz-WYmBSEMFsMu7VSv13fZUmbT8Zp-UjYGgOOYUzmOrFgABgTtVz6jIyDPVmWOsa-vwo6Jan5jYAAx-0Q8wS8Jsz7Xt_I1MnYmVUxov4edmzcIC2kRQCkDWgLav9WMf_W0Mf1yXMh-1H0sYLk6GKOZE-A_PgH_5mmrAZtp92_dcA-czmb9pcG_ANQ8UKxZ545XbhmNzR_5DG-EJvAID0jUYIytpMZrMLoCc3CT7tdGwfthoigH9E9CWxZUytVhrjKTYpzzd0kUfk2LpnkJxQ1i3ldFATS-O5SmE_zRB1MmRxTxgmAKcHBuifaYvTQ_kOVmV-WYmgAB5dRMYA9SNEt1wOvtWoczIhNmRaW9wQrWgvb86Mlm-eeX5z_UAcxoN6jkrSWKEkgi7F3FCRc6TTQZpkIWD864VRd1qQLf0e3u7sj-7PdZw1UoGtlX4MMk55KyFpt4hxhsHIrq_NeHuWt8w5RBDCIxkdwguz57WjTV-ur8Ya0Uuq5d2U3dZDSACuS-hH6faCgxwORxSQGAKpJQHIRNQhPY7i9ak6bmqZ_zbb-Bd5E15RLS382It4ZkGe2F8fLTqcjD0fKiNrx_0yt0AE0qbqo8PXUWxsxSky7JelHLfPHQ4WW8b5C_a24eTODFvahRtmXFI0wPiREVxXWOPUPCiRAx5zV8jK4UvMe5u4qvxQJccRoJH4F_PtE4pIv1-Ns67g89pMy-89SZTAEGY5LCzWnXH164A39SvFYzmjCKNGBtwVCasJ-XBC6Wg-V7UaYWWkZAGHqXyrC_LTJbyTeMu-GcIgZ_xroMFTNFdhAV3c5NJpfoAuffQosi_rY0tsKNqNN9qtP9UPqmR1NbFZN2BmaSGeVz36fco3jR9nazSrni0_hUPtE_mqD84_P2hQum8OTGex9UzCwAcHAS-6S3tWydpWvi-toEL2HuS_jt_JsID9eGWxxD_zWISzf_zENftOW5TDKiwMriHRcNT8J9cMPGQGHtR5YYjt5cLTK107tS7EXiowDpB4i1uRcp344CXC9YJoWbvsUPtyBz1pQLSpWcoNDKQLTNEt_v_ERLF2dOa0DFKW1kwEcHi11M7kMAInzNYiBcq86LtBsgR2XSi_t0ICgbB-hyv1Y5LiQV8uuTEuEJI","summary":[{"type":"summary_text","text":"**Inspecting thread management and stream cleanup**"},{"type":"summary_text","text":"**Analyzing stream retention and subscriber cleanup issues**"},{"type":"summary_text","text":"**Verifying BrokerConn drop and Arc cleanup**"}]},{"id":"rs_0a061eb498f0e908016a59d37e17108196b487d68408badf4d","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdOGNFagt18Z1MIHKPf9QYPtyeVStiluJS3zPzueuIXnbSmaJAUoaliEtSSxa93mn6YYqJ9HuZ0pr0ByvjHBQQ1dgyIO6ALeRbtPc3EkAb9vq6gXS9MQoNS6s7BW8iHspzFVBWJU8Y6ej1jHVrqSy7VrkI-fzKQ1zxmhj79neKuM8TnLt0mfGJ56P7vu93bMoR66_P9ywGd5ENlaXDquZnVZrgG9Qnvq-hmij9jJBLu4yaOpOhNfaSVWDbGWfx1j2nNP6Iq6NqzULZ0ypk9chWJxad7FlZI_DdizJCbyHLqBtO_H4gyUA9__r7wGyU7pREoTGBLN_ms5jtnQvzR9F3pk8l6rQ-kiIyYReUALmhjoWkhHSHFM8hDkwr_o-7GX-5uRGuuXgjXz19Vw1qu1Hshe-k-NfWHGgX0VLS3So3aRKraWMz9mPqjwpqYzBwCYxrRQYzN1Y73WiTqigvR5Rw2Yq3w1t6pjjZ71GFZYEF5bxCCK2AMn2NER-Rxj61EiC8Qu58yjvXEPpyklDXVhup2xLp4ZMLRQcLOmEXLv9czKggRoy9z_vuzfb_0syN_m9yLXu1zPS8RjxG_oAachIRY3iz-Sfu_LUjykc9FWKUdA_IMVulr4HvkdtTWNjbtVF5VPEm8pCe2oBQdoX0HdFrj4v3zO9UHuAJXLnQJot2RsXp9hxTn017QQU-GwE2wXQvxLDowFuKj5vdjKfJXPe8YBW704HI3Ep9T2kmXY3Fi6wRInFgjGqeQvumngGxByJhLD3THxL-Eeh4D6bfb0ZtzJro3NM4lI0Qq7DUZsIYg5AVUOKEllpqf6VBxk216KOU29fNTqgZnaEem3Ppdl0dlmf5HscCrrOt2fyyMt2tJHskR0vOX8N_paGeq_2UHi81kHQcfeN4flYzJv335ImN1Jg51WfsQpyMvSKv8p36fkQn7EijcRRt2Pim5cHS4bTmUDFSGxWktssLvotC9e-8bXg2Ay3xLcFlTc6rw-C0sgPeQM35yoEoMRoPOHIodmbnCk3fAXHrOzyKrL2iv2bHhs4gjyLMUzmZ_gTpRF6E4g8Q2Q_cVbE9M4qhWLT3YExQFQvBXlFvA8zcScX0D-plZ6DcFCQUbuyWCKdEsSJuB1uux_FoFlKxAKi_s_yAw6ay5NTFxvu0XFqjQjIgEqj7oPWQhfkniLI9dcnDlqMQvkDKRuMMZ6BcI-PE6XDv_Nl5neULNsxEUXy2eW2lxv-NowM-CerWxnQLr6jjTfDT9ls2hT66Jc0H6Ugj1_AUgkVBY_2LurL7TDpPbkdAYDdzw_uOvfbq6WZ1lldA_Py_USFTir7bOK2LAz_BroV__2Y1DJ4wu3EAgFN2HC68ZoSOq7h2C3MTfwMQb94-uQrAt3Bq-FmEa9q3xaK2odwlQz4B47Ou38SHtObW81LU9TGopmoggrnEMid3GjyuhtzNrmT_LopQF2Y8xYi3DH-FfBKeOFQqEV6CyODOtYQrXxYsGnDIn84vFeB1X2HGwRiwC4lzU=","summary":[{"type":"summary_text","text":"**Investigating PTY drain leak and registry poison**"}]},{"id":"fc_0a061eb498f0e908016a59d386dc6c819686924ed420af08fb","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding drain leak documentation\",\"pattern\":\"Drain|PTY reader|reader thread|no-EOF-while-writer-held|request_stop|drain thread\",\"path\":\"docs; crates/spt-daemon/tests; crates/spt-term\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_x94AEN5kZUtiMtxroyZrnkTf","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d386dc7c819693b9566645fdea47","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding thread count telemetry\",\"pattern\":\"thread count|threads|conn_handler_count|conn-watchdog|watchdog\",\"path\":\"docs; .claude/reports\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_GFxdxsDv0rfiWFdY1E5RtJqy","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d386dc888196b2eb742ea38931e5","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream retirement exact path\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"940-990,1000-1070,1800-1860\"}","call_id":"call_GDwseDL2gi8bt0YFWq9bBXAP","name":"read"},{"id":"fc_0a061eb498f0e908016a59d386dc9081969ed7193931cae5e5","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading session thread exact path\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1410-1468,1548-1650,1760-1852,3400-3470\"}","call_id":"call_1wSjlOt8nnXQOtTXG0E8Dm0I","name":"read"},{"id":"fc_0a061eb498f0e908016a59d386dc988196b53aab795910f63a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading watcher exact lifetime\",\"path\":\"crates/spt-daemon/src/conn.rs\",\"selector\":\"414-455,639-665\"}","call_id":"call_6JD1Awxe9xbXqeOoCiFkWjMh","name":"read"},{"id":"fc_0a061eb498f0e908016a59d386dca48196bc015301ae694aa3","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading PTY drain exact lifetime\",\"path\":\"crates/spt-term/src/reader.rs\",\"selector\":\"65-182\"}","call_id":"call_OzGmJWhngAfJ05n4E6Ilw9jb","name":"read"}]},"duration":26973.03100000322,"ttft":2344.8146999925375,"contextSnapshot":{"promptTokens":215803,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_x94AEN5kZUtiMtxroyZrnkTf|fc_0a061eb498f0e908016a59d386dc6c819686924ed420af08fb","toolName":"grep","startedAt":"2026-07-17T07:02:30.935Z","args":{"path":"docs; crates/spt-daemon/tests; crates/spt-term"},"intent":"Finding drain leak documentation"},"id":"473156ba","parentId":"41f1a117","timestamp":"2026-07-17T07:02:30.935Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GFxdxsDv0rfiWFdY1E5RtJqy|fc_0a061eb498f0e908016a59d386dc7c819693b9566645fdea47","toolName":"grep","startedAt":"2026-07-17T07:02:30.936Z","args":{"path":"docs; .claude/reports"},"intent":"Finding thread count telemetry"},"id":"95310671","parentId":"473156ba","timestamp":"2026-07-17T07:02:30.936Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GDwseDL2gi8bt0YFWq9bBXAP|fc_0a061eb498f0e908016a59d386dc888196b2eb742ea38931e5","toolName":"read","startedAt":"2026-07-17T07:02:30.936Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream retirement exact path"},"id":"a4026ade","parentId":"95310671","timestamp":"2026-07-17T07:02:30.936Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_1wSjlOt8nnXQOtTXG0E8Dm0I|fc_0a061eb498f0e908016a59d386dc9081969ed7193931cae5e5","toolName":"read","startedAt":"2026-07-17T07:02:30.936Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading session thread exact path"},"id":"a722b222","parentId":"a4026ade","timestamp":"2026-07-17T07:02:30.936Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_6JD1Awxe9xbXqeOoCiFkWjMh|fc_0a061eb498f0e908016a59d386dc988196b53aab795910f63a","toolName":"read","startedAt":"2026-07-17T07:02:30.936Z","args":{"path":"crates/spt-daemon/src/conn.rs"},"intent":"Reading watcher exact lifetime"},"id":"e74da1a8","parentId":"a722b222","timestamp":"2026-07-17T07:02:30.936Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_OzGmJWhngAfJ05n4E6Ilw9jb|fc_0a061eb498f0e908016a59d386dca48196bc015301ae694aa3","toolName":"read","startedAt":"2026-07-17T07:02:30.936Z","args":{"path":"crates/spt-term/src/reader.rs"},"intent":"Reading PTY drain exact lifetime"},"id":"b531c9c4","parentId":"e74da1a8","timestamp":"2026-07-17T07:02:30.936Z"}
{"type":"message","id":"da121a02","parentId":"b531c9c4","timestamp":"2026-07-17T07:02:30.960Z","message":{"role":"toolResult","toolCallId":"call_GDwseDL2gi8bt0YFWq9bBXAP|fc_0a061eb498f0e908016a59d386dc888196b2eb742ea38931e5","toolName":"read","content":[{"type":"text","text":"    shared\n        .presence\n        .lock()\n        .unwrap()\n        .append_connected(id, &remote_id_hex, observed);\n\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\n    // close, conn loss, or our own endpoint close), removes the row — conns\n    // finally LEAVE the table — then appends the `disconnected` event (row\n    // gone before the event is observable).\n    // [impl->REQ-EP-4]\n    let sh_close = Arc::clone(shared);\n    let conn_close = conn.clone();\n    let hex_close = remote_id_hex.clone();\n    tokio::spawn(async move {\n        conn_close.closed().await;\n        sh_close.conns.lock().unwrap().remove(&id);\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n        // — nothing can ever be served on them again, and leaving them makes\n        // every future dispatcher generation replay them (the control-steal\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\n        // else reads a dead conn's stream ring.\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n        sh_close\n            .streams\n            .lock()\n            .unwrap()\n            .retain(|_, e| e.conn_id != id);\n        sh_close\n            .presence\n            .lock()\n            .unwrap()\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\n    });\n\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n    let hex = remote_id_hex.clone();\n    tokio::spawn(async move {\n        while let Ok((send, recv)) = conn.accept_bi().await {\n            register_stream(\n                &sh,\n                id,\n                &hex,\n                SendHalf::Quic(send),\n                RecvHalf::Quic(recv),\n                false,\n            );\n        }\n    });\n…\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n\n/// Backpressure gate for a retentive (tunnel) read pump: park until the undrained\n/// ring has room below `retentive_cap`, woken by a `drain` on `room`. A no-op for\n/// an ordinary stream (`retentive_cap == 0`). Holds no lock across the await.\n// [impl->REQ-SHELL-4]\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`"}],"details":{"displayContent":{"text":"    shared\n        .presence\n        .lock()\n        .unwrap()\n        .append_connected(id, &remote_id_hex, observed);\n\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\n    // close, conn loss, or our own endpoint close), removes the row — conns\n    // finally LEAVE the table — then appends the `disconnected` event (row\n    // gone before the event is observable).\n    // [impl->REQ-EP-4]\n    let sh_close = Arc::clone(shared);\n    let conn_close = conn.clone();\n    let hex_close = remote_id_hex.clone();\n    tokio::spawn(async move {\n        conn_close.closed().await;\n        sh_close.conns.lock().unwrap().remove(&id);\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n        // — nothing can ever be served on them again, and leaving them makes\n        // every future dispatcher generation replay them (the control-steal\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\n        // else reads a dead conn's stream ring.\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n        sh_close\n            .streams\n            .lock()\n            .unwrap()\n            .retain(|_, e| e.conn_id != id);\n        sh_close\n            .presence\n            .lock()\n            .unwrap()\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\n    });\n\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n    let hex = remote_id_hex.clone();\n    tokio::spawn(async move {\n        while let Ok((send, recv)) = conn.accept_bi().await {\n            register_stream(\n                &sh,\n                id,\n                &hex,\n                SendHalf::Quic(send),\n                RecvHalf::Quic(recv),\n                false,\n            );\n        }\n    });\n…\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n\n/// Backpressure gate for a retentive (tunnel) read pump: park until the undrained\n/// ring has room below `retentive_cap`, woken by a `drain` on `room`. A no-op for\n/// an ordinary stream (`retentive_cap == 0`). Holds no lock across the await.\n// [impl->REQ-SHELL-4]\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`","startLine":940,"lineNumbers":[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,null,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,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784271750960}}
{"type":"message","id":"67898e04","parentId":"da121a02","timestamp":"2026-07-17T07:02:30.961Z","message":{"role":"toolResult","toolCallId":"call_6JD1Awxe9xbXqeOoCiFkWjMh|fc_0a061eb498f0e908016a59d386dc988196b53aab795910f63a","toolName":"read","content":[{"type":"text","text":"/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n    inner: Arc<Inner>,\n    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n    /// watchdog aborts through strictly outlives every raw use.\n    dog: Option<JoinHandle<()>>,\n}\n\nimpl BrokerConn {\n    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n    /// deadline (gate-wait + OS write completion) — the broker passes its\n    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n        let raw = raw_of(&half);\n        let inner = Arc::new(Inner {\n            id: CONN_ID_SEQ.fetch_add(1, Ordering::Relaxed) + 1,\n            label: Mutex::new(String::new()),\n            first_write_logged: AtomicBool::new(false),\n            gate: Mutex::new(Gate { half: Some(half) }),\n            gate_cv: Condvar::new(),\n            dog: Mutex::new(Dog {\n                inflight: None,\n                shutdown: false,\n            }),\n            dog_cv: Condvar::new(),\n            poisoned: AtomicBool::new(false),\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n…\n}\n…\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n…\n}"}],"details":{"displayContent":{"text":"/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n    inner: Arc<Inner>,\n    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n    /// watchdog aborts through strictly outlives every raw use.\n    dog: Option<JoinHandle<()>>,\n}\n\nimpl BrokerConn {\n    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n    /// deadline (gate-wait + OS write completion) — the broker passes its\n    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n        let raw = raw_of(&half);\n        let inner = Arc::new(Inner {\n            id: CONN_ID_SEQ.fetch_add(1, Ordering::Relaxed) + 1,\n            label: Mutex::new(String::new()),\n            first_write_logged: AtomicBool::new(false),\n            gate: Mutex::new(Gate { half: Some(half) }),\n            gate_cv: Condvar::new(),\n            dog: Mutex::new(Dog {\n                inflight: None,\n                shutdown: false,\n            }),\n            dog_cv: Condvar::new(),\n            poisoned: AtomicBool::new(false),\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n…\n}\n…\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n…\n}","startLine":414,"lineNumbers":[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,null,602,null,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,null,670]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\conn.rs"}}},"isError":false,"timestamp":1784271750960}}
{"type":"message","id":"05d4c297","parentId":"67898e04","timestamp":"2026-07-17T07:02:30.969Z","message":{"role":"toolResult","toolCallId":"call_GFxdxsDv0rfiWFdY1E5RtJqy|fc_0a061eb498f0e908016a59d386dc7c819693b9566645fdea47","toolName":"grep","content":[{"type":"text","text":"# docs/\n## BROKER-BRAIN-SPLIT-RESTORATION.md\n 65|- `daemon.rs:165-170` — `Broker::bind_in_with_net(...)` returns an `Arc<Broker>`; the daemon `thread::spawn`s `broker.serve()`. `broker.rs:181/196` confirm `bind` returns `Arc<Self>` (an in-process object, not a spawned child).\n*66|- The pump (`daemon.rs:280`), dispatcher, digest hub, net consumers, psyche loops — **all threads in the same process.**\n 67|- A repo-wide search finds **no** `Command`/subcommand that spawns a broker child anywhere.\n 68|\n 69|### 2.3 Why this is a regression, not a deferral\n## CONTEXT-MEMORY.md\n 6|\n*7|- **live context** (per-agent, project-independent — the agent's *mind*): identity/persona, relationship + rapport with the user, the user's cross-project preferences & working style, cross-project life threads, **learnings from work that may apply to other projects**, a thin **project roster** (one line per project the agent works on), the agent's self-model. Synced to **all** instances of the endpoint.\n 8|- **project context** (per-agent-per-project — what the agent is doing *here*): codebase/architecture, decisions made here, **current focus / next steps / todos**, project conventions, build/test commands, blockers. Synced **only** to same-project instances.\n 9|\n 10|(This split independently matches pi-agent-memory's Project Store vs Global Store and its discriminator dialogue — convergent validation.)\n## F-027-ENDPOINT-SPAWN-FAIL-DESIGN.md\n 103|today's behavior — no stamp, no token. Acceptable: strictly better than now; a\n*104|daemon-side watchdog is a possible follow-up, not this wave.\n 105|\n 106|### Half B — pre-spawn manifest seam (spt-core executes; adapter owns the binary)\n 107|\n...\n 116|   env vars the adapter declares `[env.<NAME>] direction=\"read\"` are **captured\n*117|   at endpoint creation and stamped into the perch record**; the broker threads\n 118|   the IDENTICAL stamped values to BOTH the pre-spawn command AND the session\n 119|   spawn. Neither consumer reads its own process env for a stamped var — if the\n 120|   seeder read its own env while the spawn read the stamp (or vice versa),\n## FAULT-MATRIX.md\n 54||---|---|---|---|---|\n*55|| P1 | **Iroh endpoint task hangs** (not crash — a wedged accept loop) | New inbound conns stall; existing conns + PTY hosting unaffected | PTY side fully isolated (separate threads/runtime) | D9 chaos pass |\n 56|| P2 | **mDNS discovery dies** | LAN dial-by-id fails; direct-addr + relay dials unaffected | Endpoint, conns, PTY | D9 (needs real LAN) |\n 57|| P3 | **Relay unreachable** (n0 outage / air-gap) | WAN dials needing relay fail; LAN/direct unaffected | Everything local | D9 two-host |\n 58|| P4 | **PTY broker drain thread dies** | That session's output stalls | Other sessions, net side | with terminal-wrapper hardening |\n## FLAKE-LEDGER.md\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## KNOWN-HAZARDS.md\n 410|- **Failure:** the W2.5 controller/viewer model lets ANY number of read-only `--view` attachers ride one session's broker `OutputLog`. The single drain thread fans each output chunk to every attacher. If a viewer's socket is fanned out with a **blocking** write under the log lock (the controller's authoritative path), one wedged viewer (a slow terminal, a black-holed WAN peer, a hostile non-reader) stalls the drain — freezing the controller's stream and backing up the PTY child. A single watcher must n...\n*411|- **Invariant:** the drain writes the **controller** on the authoritative blocking bounded path (it alone advances `delivered_through`), but each **viewer** gets an **isolated bounded SPSC queue + a dedicated writer thread**; the drain `try_send`s under the log lock and **evicts** any viewer whose queue is `Full` (fell behind the live stream) or `Disconnected` (its writer died on a dead socket) — the drain thread **never touches a viewer socket**, so no viewer write can backpressure it. A **soft cap** ...\n 412|- **spt-core mapping:** `OutputLog::append` (controller blocking + `viewer_send_evicts` `try_send` fan-out), `OutputLog::add_viewer` (bounded `sync_channel(VIEWER_CHANNEL_DEPTH)` + `viewer_writer` thread), `MAX_VIEWERS` soft cap, `ViewerSink`. Unit: `viewer_overflow_or_disconnect_evicts_never_blocks`. Int: `wedged_viewer_does_not_stall_controller` (a non-reading viewer is evicted while the controller keeps receiving past a 200KB burst).\n 413|- **Source:** M12 W2.5 controller/viewer model (doyle ruling 2026-06-14, Q1).\n 414|\n...\n 549|- **Invariant:** N concurrent `open_or_init` on ONE fresh dir ALL return `Ok`. The init is race-tolerant: `git init --bare` retries a transient collision with a growing backoff that desynchronizes racers (a lone re-init on a partially-copied dir completes cleanly — verified), treating a now-present `HEAD` as success (open-after-lose); the required `core.autocrlf=false` pin retries a transient `config.lock` collision (the value is idempotent, so the winner writes the same bytes). Convergence is guarante...\n*550|- **spt-core mapping:** impl `spt-store/src/branchstore.rs` `open_or_init` → `init_bare_tolerant` (bounded init-collision backoff-retry + open-after-lose) + `config_set_locked_retry` (bounded `config.lock`-aware retry). unit `branchstore.rs` `concurrent_open_or_init_on_one_fresh_store_all_ok` (N=8 threads race one fresh dir → every result Ok, HEAD present, `core.autocrlf=false`; RED-FIRST: the pre-fix path failed the `git init` template-copy loser).\n 551|- **Source:** doyle F-025 wave Item 2 (the G3-gate pump.rs:442 flake root-caused as this TOCTOU). The red-first repro surfaced the race is BROADER than the ledgered `config.lock` — concurrent `git init --bare` itself collides on template-hook copy.\n 552|<!-- [doc->REQ-HAZARD-STORE-INIT-RACE] -->\n 553|\n...\n 627|- **Invariant:** no broker client ever observes a wedge because the BRAIN stalled. (1) The controller's writer publishes its IN-FLIGHT-write window (`write_blocked_since`: `Some(Instant)` set immediately before the blocking `write_frame`, `None` after — the mutex never held ACROSS the write); a reader sees a `Some` older than `BRAIN_WRITE_DEADLINE` (15 s = 3× the 7.12 controller bound, measured full-with-**zero writer progress**, so a slow-but-DRAINING brain never trips it) as a WEDGED writer and stal...\n*628|- **spt-core mapping:** `broker.rs` — `ControllerSink::write_blocked_since` + `controller_writer` (marks the in-flight window around both the initial-batch and live-loop writes) + `controller_write_stalled` (pure predicate over injected `now`/`deadline`) + `stall_evict_controller` (Inline stamp at `resolve_subscribe`, Deferred stamp at `reap_dead_controller` so the reap closure does no I/O under the shared sessions lock) + `record_stall_evict`/`stall_evict_stats` (the tally) + `dispatch_stall_evicts` (...\n 629|- **Source:** LIFECYCLE-TRUTH W2 (doyle rig `NtSuspendProcess` root + design ruling `docs/W2-DESIGN-RULING.md` @60ec0ed — minimal-plus scope, `BRAIN_WRITE_DEADLINE` 15 s, passive resubscribe + observability rider; todlando build 2026-07-07). The v0.27→v0.28 update-wedge night's flagship defect.\n 630|\n 631|### 7.37 The Layer-1 settle-gate must RE-ARM per delivery on an observable PTY — a mid-session reader reattach (`/clear`) re-creates the head-swallow race  `[REQ-HAZARD-INJECT-SETTLE-REARM]`\n...\n 640|- **Failure (paid-for, field capture + deterministic Windows repro 2026-07-09 — hertz RCA, UPDATE-WEDGE round-4):** `controller_writer` held the `SharedSend = Arc<Mutex<SendHalf>>` guard ACROSS a blocking `write_frame`. On Windows, `interprocess 2.4.2` routes the send to `WriteFileEx` + `SleepEx(INFINITE, alertable)` — this local-socket send path exposes **no supported write timeout** (`set_timeout` → `Unsupported`). An `rc --take` controller consumer that stopped reading blocked the write **indefi...\n*641|- **Invariant:** every write on a physical broker connection rides ONE broker-owned bounded/cancelable framed-write primitive with an **independent out-of-band aborter**. The `SendHalf` never leaves the conn object (a bypass cannot compile). An ABSOLUTE deadline stamped at write entry covers BOTH the serialized gate-wait AND OS write completion; a per-conn watchdog fires at that deadline and aborts the in-flight op — never relying on the write returning or on opportunistic stall-evict sampling. On dead...\n*642|- **spt-core mapping:** `spt-daemon/src/conn.rs` `BrokerConn` (Condvar-gated serialized write gate + poisoned state + per-in-flight op id + watchdog + `abort_physical()`: cfg(windows) `CancelIoEx` → completion handshake → `DisconnectNamedPipe` raw kernel32 externs; cfg(unix) `UnixStream::shutdown(Both)`); `broker.rs` `SharedSend = Arc<BrokerConn>` + `controller_writer`/`viewer_writer`/`send_frame`/`send_error` routed; `nethost.rs` stream-log/presence sends routed. int = `brain_decouple.rs` `non_drain...\n 643|- **Source:** UPDATE-WEDGE round-4 (hertz root doc `docs/UPDATE-WEDGE-ROOT-CAUSE.md` @f8596ca; doyle gate ruling `docs/UPDATE-WEDGE-RCA-DISPATCH-todlando.md`; todlando build 2026-07-09). The residual 7.36 left open: logical eviction without physical retirement.\n 644|\n 645|---\n...\n 758|<!-- [doc->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION] -->\n*759|| 7.38 | Every physical broker-conn write bounded + cancelable + poison-on-failure (independent watchdog aborter; poisoned conn never reused; SendHalf never leaves the conn object) | broker `conn.rs` `BrokerConn`, all write sites (`controller_writer`/`viewer_writer`/`send_frame`/nethost), int `brain_decouple.rs` |\n 760|| 7.31 | The Psyche failure budget counts REAL per-event attempts — every bounded per-event turn feeds a consecutive-N budget (default 3), so per-event churn a resident rate-guard was blind to now counts by construction. Fixes hall-bf's ~12/min re-host churn that ran invisibly (boot records weren't ledger boundaries to the old guard) | `lifecycle.rs` `note_turn_outcome`/`psyche_turn_strikes_exhausted` (stamps `psyche_host_error` on exhaustion, no `status` de-stamp), unit synthetic failure-loop trips th...\n 761|<!-- [doc->REQ-HAZARD-THRASH-GUARD-BLIND] -->\n 762|<!-- [doc->REQ-HAZARD-STORE-INIT-RACE] -->\n## NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md\n 169|the binary's in-memory armed wake, forcing the wake text into a holdover file\n*170|(the rejected b1 hazard, F-024 env-file-carrier lesson class). The watchdog's\n 171|legitimate job is ANTI-STALL (release the operator-input floor), not\n 172|execution-verification; terminating a healthy binary over one eaten `{commit}`\n 173|is the whole bug.\n## NEXT-MILESTONE-PICKER-TRIAGE.md\n 110|locally-controlled endpoint has `driven_by=None` + `controlled=true`, and `local_rows`\n*111|(data.rs:220) never threads `controlled` into `EndpointRow` — so a locally-RC'd endpoint\n 112|renders plain ONLINE in its own node's picker. Remote rows DON'T have this hole (gossip\n 113|stamps `controller_node=self` for a local controller — REQ-GOSSIP-CONTROLLED-ANY) —\n 114|that asymmetry is the bug.\n## NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md\n 261|are only Online/Suspended, so: remote suspended row offers **`Wake now`** →\n*262|threads `ep.node` into a new `Outcome::Wake` → `wan_rest(id@node,\n 263|REST_EVENT_WAKE)` (plumbing exists, cli.rs:3289); local \"Start now\" semantics\n 264|unchanged; `Instantiate locally` remains the separate documented remote verb.\n 265|With A-2's resume leg, remote Wake now actually revives the session — the\n## PUMP-W2-DISPATCH-RULING.md\n 21|### G4 — concurrency: on the **BROKER**, fan-out-all with a **bounded cap**\n*22|Confirmed: dials run concurrently on the broker's async runtime (natural — iroh already pools), NOT pump-side threads. Fan-out-all is fine for today's rosters, but add a **generous bounded concurrency cap** (a broker-side semaphore, e.g. 16–32 concurrent dials) as a large-subnet guard — cheap insurance against a future big roster spawning unbounded concurrent connects (the \"no silent unbounded\" discipline). Don't over-engineer beyond a simple semaphore.\n 23|\n 24|### G5 — per-peer reschedule: **per-peer doubling backoff (capped), reset on success**\n 25|NOT next-tick-retry — the field mode is a mostly-offline roster (enlyzeam + ~5 dead peers); re-dialing every dead peer each tick wastes dials + churns. Per-peer doubling (scoped to the peer, cap ~300s like `supervise_pump`'s today) backs off a persistently-dead peer while keeping live peers hot. **Reset the peer's backoff on any success** (and it's fine to also reset on a fresh presence/discovery hint if cheap). A returning peer must re-dial promptly on the next reset, never languish in a long backoff.\n## PUMP-W2-GATE-HANDOFF.md\n 8|- `traceable-reqs check --json` — exit 0 (REQ-PUMP-PEER-ISOLATION +impl +unit +int active).\n*9|- **712 tests GREEN** (0 fail, 4 leaky=benign unjoined broker threads): full\n 10|  `tests/pump.rs` (self-drive + W1 black-hole regression + the 3 new W2 int) +\n 11|  `tests/presence.rs` (presence lifecycle — I touched NetPresenceEvent + PresenceLog) +\n 12|  all spt-daemon lib units + spt-store lib units.\n## UPDATE-WEDGE-2-ROUND3-RIG-VERDICT.md\n 10|The ruling's decider (§5): do dead-peer `submit_dial`s HOLD/serialize the broker\n*11|net runtime's 2 worker threads (starving the reactor that services LOCAL loopback\n 12|`rc` I/O), or do the QUIC awaits YIELD? **They yield.**\n 13|\n 14|Rig: dialer with a 3s QUIC-op bound; fire K=12 concurrent `submit_dial`s straight\n...\n 86|\n*87|`cargo nextest run -p spt-daemon --test net_worker_starve` (or `--test-threads=1`).\n 88|Hermetic (relays disabled, no discovery, loopback QUIC); no SPT_HOME/PTY needed.\n## W2-BUILT-REPORT.md\n 57|deadline: viewer keeps ticking, a second operator's `Control` subscribe COMPLETES (stall-\n*58|evicts R), evict is tallied, take resolves well under the watchdog. **RED-first proven:**\n 59|with the resolve_subscribe stall-evict commented out → `BusyControlled{by:operator-one}` +\n 60|`stall_evicts=0` (viewer still ticks — that isolation predates W2). R MUST be remote (a\n 61|local-spawner incumbent is silently taken by the pre-existing undriven path — that's why\n## W4-DISPATCH-RULING.md\n 19|\n*20|## Ruling 2 — listen-orphan watchdog: POLL baseline, OS-native optional\n 21|\n 22|The REQ offers \"job object / PDEATHSIG or poll.\" **Ruling: bounded POLL of `--parent-pid` liveness as the portable baseline** (matches the unit \"parent-death → listener exits within one poll window\"). Reasoning: one code path both platforms, no OS-handle plumbing, and the latency floor (one poll window, seconds) is fine for a headless-gateway orphan — the failure is \"held ONLINE for minutes,\" so seconds-to-exit is a full fix. OS-native tightening (Win job object / Linux PDEATHSIG, immediate exit) is ...\n 23|\n*24|Note: perri's spt-mobile-side job-object guard (SPT-CORE-NEEDS §5) stays regardless — **independent defense-in-depth**, her side; the core watchdog is the authoritative fix. No conflict, both proceed.\n 25|\n 26|## Not in this dispatch (separate tracks)\n*27|- **perri's REQ-SUPERVISOR-RELAY-RESPAWN** (adapter relay-respawn belt, minted inactive awaiting my ruling) — I rule that to perri separately; it composes with, not blocks, the core LISTEN-ORPHAN watchdog.\n 28|- **W1 field-accept swap window** — operator-coordinated, orthogonal to building W4.\n## W4-GATE-VERDICT.md\n 17|- **REQ-SPAWN-COLLISION-GUARD-LIVE-DUP** (`broker.rs`): single-flight wake, **broker-side claim** (ruling 1 — not a perch-record write). `wake_gate_decision` pure truth table (AlreadyLive / Racing / Claim); `dispatch_spawn` reads the live-session check + the `wake_inflight` claim **together under one atomic critical section** (sessions then wake_inflight — wake_inflight is a leaf lock, taken alone only in the RAII drop, no inversion), **no I/O under lock** (cached `process_id`). Serialized so no doub...\n*18|- **REQ-HAZARD-LISTEN-ORPHAN** (`startup.rs`): `--parent-pid` **poll watchdog** (ruling 2 — POLL baseline, OS-native optional). 2s poll of `parent_is_gone`, loud `exit(3)` (`EXIT_PARENT_GONE`) so the perch pid dies → liveness flips OFFLINE → dead-owner rebind unblocks. **Persistent-relay branch ONLY** (spawned after the `--once` early return) — verified against every listen e2e (all `--once`) so no test listener is killed. Win reaped-`Child`-holds-handle test gotcha correctly handled (drop before...\n 19|\n 20|## Verdict\n 21|**W4 GATED PASS.** LIFECYCLE-TRUTH W1–W4 all gated. Remaining milestone content: **W5** (delivery integrity — INJECT-MULTILINE-INTEGRITY + IDLE-PARKED-DELIVERY + SPOOL-TAKE-AUDIT) then **W6** (docs). Release counter 49 + W1 field-accept swap window still operator/deployah-gated.\n## W4-WAVE-GATE-REPORT.md\n 43|\n*44|**Fix (ruling 2 — POLL baseline, OS-native optional):** `spawn_parent_watchdog` (startup.rs)\n 45|polls `parent_is_gone(parent_pid)` every `PARENT_WATCH_POLL` (2 s); on parent death it prints\n 46|the loud `LISTEN_ORPHAN_EXIT` line (names self + the dead parent) and `process::exit(3)` — so\n 47|the perch's recorded pid dies → liveness flips it OFFLINE within one window → rebind unblocks.\n\n## adr/\n### 0004-single-daemon-broker-brain-split-and-self-update.md\n 73|2. ✅ **CLOSED (Spike #4, 2026-06-01).** Linux `forkpty` parity. Spike #1's binary, unchanged, passed all four invariants on `gravity-linux` (Ubuntu 22.04) — `portable-pty` selects `forkpty` on Unix; the ConPTY-DSR branch is inert there. Invariant B passed with the *strict* contiguity check that ConPTY-under-resize fails (Spike #5): `forkpty` is a raw pipe, ConPTY a screen buffer — different stream contracts, promoted into M3a's `SessionSurface` design. (`docs/spikes/SPIKE-04-forkpty-parity.md`.)\n*74|3. ✅ **CLOSED (Spike #5, 2026-06-01).** 100× restart + resize-under-load stress (codex #3). The broker survived 100 rapid brain kill/restart cycles + a resize thread racing the reader with no leak (one child, clean reap), no hang (watchdog deadline), no lost byte (full value-set coverage in the client's observation window). Surfaced two binding ConPTY findings for M3a/REQ-TERM-3: resize triggers a repaint that reorders+dups the stream (terminal-stream contract ≠ exactly-once transfer contract); mid-...\n 75|4. ✅ **CLOSED (Spike #6, 2026-06-01).** Idempotent/exactly-once delivery across brain restart (FATAL-adjacent #14). Durable-ID + WAL + dedup-at-effect proven exactly-once across a crash at any protocol point (before-intent / before-effect / after-effect). Two binding design constraints surfaced for `REQ-HAZARD-RESTART-IDEMPOTENT` / M3b-B5: broker-owned recovery anchor; dedup-at-effect keyed by durable ID. (`docs/spikes/SPIKE-06-idempotent-boundary.md`.)\n 76|\n 77|**Gate status (2026-06-01): ALL FOUR §E GAPS CLOSED PASS** (#3, #4, #5, #6) → the M3-PLAN Phase-0 spike-gate is **complete**. The broker/brain split is validated on both OSes (ConPTY + `forkpty`), across QUIC-stream survival, restart+resize churn, and exactly-once idempotency. M3a and M3b are both unblocked; the QUIC-ownership *implementation* and off-node transport remain explicitly deferred to M4 (only the *shape* was spiked).\n### 0022-spt-hosted-idle-delivery-translation-binary.md\n 163|deterministic at every checkpoint-armed boundary. Terminating a healthy binary over one eaten `{commit}`\n*164|was the whole bug — the watchdog's legitimate job is **anti-stall** (release the operator-input floor),\n 165|**not** execution-verification.\n 166|\n 167|This amendment **supersedes** the original \"no respawn → idle inbound then SPOOLS\" framing (§Consequences,\n### 0023-always-on-endpoints-resident-supervised-binary-sigil-addressing.md\n 27|- New tracked requirements `REQ-EP-8` (the kind + supervision) and `REQ-EP-9` (the `#` sigil), both **inactive** (`required_stages = []`) until the delivering milestone.\n*28|- All Discord-specific design (webhooks, per-agent threads, inbound routing, hybrid delivery, echo-loop prevention, secrets) is recorded in the sister repo **`../spt-discord/`**, deliberately not here.\n### 0034-per-minter-op-id-namespacing.md\n 91|  paths, so an unstamped op is uncompilable — the minter resolves at the\n*92|  genuine minting site and threads by construction, not by discipline. The\n 93|  wire keeps the additive optional field (legacy materialized at broker\n 94|  decode); the newtype is not forced into wire structs.\n 95|- **The journal-line minter token is TEXTUAL** (derived from the canonical\n\nShowing files 1-20 of 21. Use skip=20 for the next page, or narrow paths/pattern.\n\n[Some lines truncated to 512 chars]"}],"details":{"scopePath":"docs, .claude/reports","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":29,"fileCount":20,"files":["docs/BROKER-BRAIN-SPLIT-RESTORATION.md","docs/CONTEXT-MEMORY.md","docs/F-027-ENDPOINT-SPAWN-FAIL-DESIGN.md","docs/FAULT-MATRIX.md","docs/FLAKE-LEDGER.md","docs/KNOWN-HAZARDS.md","docs/NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md","docs/NEXT-MILESTONE-PICKER-TRIAGE.md","docs/NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md","docs/PUMP-W2-DISPATCH-RULING.md","docs/PUMP-W2-GATE-HANDOFF.md","docs/UPDATE-WEDGE-2-ROUND3-RIG-VERDICT.md","docs/W2-BUILT-REPORT.md","docs/W4-DISPATCH-RULING.md","docs/W4-GATE-VERDICT.md","docs/W4-WAVE-GATE-REPORT.md","docs/adr/0004-single-daemon-broker-brain-split-and-self-update.md","docs/adr/0022-spt-hosted-idle-delivery-translation-binary.md","docs/adr/0023-always-on-endpoints-resident-supervised-binary-sigil-addressing.md","docs/adr/0034-per-minter-op-id-namespacing.md"],"fileMatches":[{"path":"docs/BROKER-BRAIN-SPLIT-RESTORATION.md","count":1},{"path":"docs/CONTEXT-MEMORY.md","count":1},{"path":"docs/F-027-ENDPOINT-SPAWN-FAIL-DESIGN.md","count":2},{"path":"docs/FAULT-MATRIX.md","count":1},{"path":"docs/FLAKE-LEDGER.md","count":1},{"path":"docs/KNOWN-HAZARDS.md","count":6},{"path":"docs/NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md","count":1},{"path":"docs/NEXT-MILESTONE-PICKER-TRIAGE.md","count":1},{"path":"docs/NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md","count":1},{"path":"docs/PUMP-W2-DISPATCH-RULING.md","count":1},{"path":"docs/PUMP-W2-GATE-HANDOFF.md","count":1},{"path":"docs/UPDATE-WEDGE-2-ROUND3-RIG-VERDICT.md","count":2},{"path":"docs/W2-BUILT-REPORT.md","count":1},{"path":"docs/W4-DISPATCH-RULING.md","count":3},{"path":"docs/W4-GATE-VERDICT.md","count":1},{"path":"docs/W4-WAVE-GATE-REPORT.md","count":1},{"path":"docs/adr/0004-single-daemon-broker-brain-split-and-self-update.md","count":1},{"path":"docs/adr/0022-spt-hosted-idle-delivery-translation-binary.md","count":1},{"path":"docs/adr/0023-always-on-endpoints-resident-supervised-binary-sigil-addressing.md","count":1},{"path":"docs/adr/0034-per-minter-op-id-namespacing.md","count":1}],"truncated":true,"fileLimitReached":20,"displayContent":"# docs/\n## BROKER-BRAIN-SPLIT-RESTORATION.md\n 65│- `daemon.rs:165-170` — `Broker::bind_in_with_net(...)` returns an `Arc<Broker>`; the daemon `thread::spawn`s `broker.serve()`. `broker.rs:181/196` confirm `bind` returns `Arc<Self>` (an in-process object, not a spawned child).\n*66│- The pump (`daemon.rs:280`), dispatcher, digest hub, net consumers, psyche loops — **all threads in the same process.**\n 67│- A repo-wide search finds **no** `Command`/subcommand that spawns a broker child anywhere.\n 68│\n 69│### 2.3 Why this is a regression, not a deferral\n## CONTEXT-MEMORY.md\n  6│\n *7│- **live context** (per-agent, project-independent — the agent's *mind*): identity/persona, relationship + rapport with the user, the user's cross-project preferences & working style, cross-project life threads, **learnings from work that may apply to other projects**, a thin **project roster** (one line per project the agent works on), the agent's self-model. Synced to **all** instances of the endpoint.\n  8│- **project context** (per-agent-per-project — what the agent is doing *here*): codebase/architecture, decisions made here, **current focus / next steps / todos**, project conventions, build/test commands, blockers. Synced **only** to same-project instances.\n  9│\n 10│(This split independently matches pi-agent-memory's Project Store vs Global Store and its discriminator dialogue — convergent validation.)\n## F-027-ENDPOINT-SPAWN-FAIL-DESIGN.md\n 103│today's behavior — no stamp, no token. Acceptable: strictly better than now; a\n*104│daemon-side watchdog is a possible follow-up, not this wave.\n 105│\n 106│### Half B — pre-spawn manifest seam (spt-core executes; adapter owns the binary)\n 107│\n    │...\n 116│   env vars the adapter declares `[env.<NAME>] direction=\"read\"` are **captured\n*117│   at endpoint creation and stamped into the perch record**; the broker threads\n 118│   the IDENTICAL stamped values to BOTH the pre-spawn command AND the session\n 119│   spawn. Neither consumer reads its own process env for a stamped var — if the\n 120│   seeder read its own env while the spawn read the stamp (or vice versa),\n## FAULT-MATRIX.md\n 54│|---|---|---|---|---|\n*55│| P1 | **Iroh endpoint task hangs** (not crash — a wedged accept loop) | New inbound conns stall; existing conns + PTY hosting unaffected | PTY side fully isolated (separate threads/runtime) | D9 chaos pass |\n 56│| P2 | **mDNS discovery dies** | LAN dial-by-id fails; direct-addr + relay dials unaffected | Endpoint, conns, PTY | D9 (needs real LAN) |\n 57│| P3 | **Relay unreachable** (n0 outage / air-gap) | WAN dials needing relay fail; LAN/direct unaffected | Everything local | D9 two-host |\n 58│| P4 | **PTY broker drain thread dies** | That session's output stalls | Other sessions, net side | with terminal-wrapper hardening |\n## FLAKE-LEDGER.md\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## KNOWN-HAZARDS.md\n 410│- **Failure:** the W2.5 controller/viewer model lets ANY number of read-only `--view` attachers ride one session's broker `OutputLog`. The single drain thread fans each output chunk to every attacher. If a viewer's socket is fanned out with a **blocking** write under the log lock (the controller's authoritative path), one wedged viewer (a slow terminal, a black-holed WAN peer, a hostile non-reader) stalls the drain — freezing the controller's stream and backing up the PTY child. A single watcher must n...\n*411│- **Invariant:** the drain writes the **controller** on the authoritative blocking bounded path (it alone advances `delivered_through`), but each **viewer** gets an **isolated bounded SPSC queue + a dedicated writer thread**; the drain `try_send`s under the log lock and **evicts** any viewer whose queue is `Full` (fell behind the live stream) or `Disconnected` (its writer died on a dead socket) — the drain thread **never touches a viewer socket**, so no viewer write can backpressure it. A **soft cap** ...\n 412│- **spt-core mapping:** `OutputLog::append` (controller blocking + `viewer_send_evicts` `try_send` fan-out), `OutputLog::add_viewer` (bounded `sync_channel(VIEWER_CHANNEL_DEPTH)` + `viewer_writer` thread), `MAX_VIEWERS` soft cap, `ViewerSink`. Unit: `viewer_overflow_or_disconnect_evicts_never_blocks`. Int: `wedged_viewer_does_not_stall_controller` (a non-reading viewer is evicted while the controller keeps receiving past a 200KB burst).\n 413│- **Source:** M12 W2.5 controller/viewer model (doyle ruling 2026-06-14, Q1).\n 414│\n    │...\n 549│- **Invariant:** N concurrent `open_or_init` on ONE fresh dir ALL return `Ok`. The init is race-tolerant: `git init --bare` retries a transient collision with a growing backoff that desynchronizes racers (a lone re-init on a partially-copied dir completes cleanly — verified), treating a now-present `HEAD` as success (open-after-lose); the required `core.autocrlf=false` pin retries a transient `config.lock` collision (the value is idempotent, so the winner writes the same bytes). Convergence is guarante...\n*550│- **spt-core mapping:** impl `spt-store/src/branchstore.rs` `open_or_init` → `init_bare_tolerant` (bounded init-collision backoff-retry + open-after-lose) + `config_set_locked_retry` (bounded `config.lock`-aware retry). unit `branchstore.rs` `concurrent_open_or_init_on_one_fresh_store_all_ok` (N=8 threads race one fresh dir → every result Ok, HEAD present, `core.autocrlf=false`; RED-FIRST: the pre-fix path failed the `git init` template-copy loser).\n 551│- **Source:** doyle F-025 wave Item 2 (the G3-gate pump.rs:442 flake root-caused as this TOCTOU). The red-first repro surfaced the race is BROADER than the ledgered `config.lock` — concurrent `git init --bare` itself collides on template-hook copy.\n 552│<!-- [doc->REQ-HAZARD-STORE-INIT-RACE] -->\n 553│\n    │...\n 627│- **Invariant:** no broker client ever observes a wedge because the BRAIN stalled. (1) The controller's writer publishes its IN-FLIGHT-write window (`write_blocked_since`: `Some(Instant)` set immediately before the blocking `write_frame`, `None` after — the mutex never held ACROSS the write); a reader sees a `Some` older than `BRAIN_WRITE_DEADLINE` (15 s = 3× the 7.12 controller bound, measured full-with-**zero writer progress**, so a slow-but-DRAINING brain never trips it) as a WEDGED writer and stal...\n*628│- **spt-core mapping:** `broker.rs` — `ControllerSink::write_blocked_since` + `controller_writer` (marks the in-flight window around both the initial-batch and live-loop writes) + `controller_write_stalled` (pure predicate over injected `now`/`deadline`) + `stall_evict_controller` (Inline stamp at `resolve_subscribe`, Deferred stamp at `reap_dead_controller` so the reap closure does no I/O under the shared sessions lock) + `record_stall_evict`/`stall_evict_stats` (the tally) + `dispatch_stall_evicts` (...\n 629│- **Source:** LIFECYCLE-TRUTH W2 (doyle rig `NtSuspendProcess` root + design ruling `docs/W2-DESIGN-RULING.md` @60ec0ed — minimal-plus scope, `BRAIN_WRITE_DEADLINE` 15 s, passive resubscribe + observability rider; todlando build 2026-07-07). The v0.27→v0.28 update-wedge night's flagship defect.\n 630│\n 631│### 7.37 The Layer-1 settle-gate must RE-ARM per delivery on an observable PTY — a mid-session reader reattach (`/clear`) re-creates the head-swallow race  `[REQ-HAZARD-INJECT-SETTLE-REARM]`\n    │...\n 640│- **Failure (paid-for, field capture + deterministic Windows repro 2026-07-09 — hertz RCA, UPDATE-WEDGE round-4):** `controller_writer` held the `SharedSend = Arc<Mutex<SendHalf>>` guard ACROSS a blocking `write_frame`. On Windows, `interprocess 2.4.2` routes the send to `WriteFileEx` + `SleepEx(INFINITE, alertable)` — this local-socket send path exposes **no supported write timeout** (`set_timeout` → `Unsupported`). An `rc --take` controller consumer that stopped reading blocked the write **indefi...\n*641│- **Invariant:** every write on a physical broker connection rides ONE broker-owned bounded/cancelable framed-write primitive with an **independent out-of-band aborter**. The `SendHalf` never leaves the conn object (a bypass cannot compile). An ABSOLUTE deadline stamped at write entry covers BOTH the serialized gate-wait AND OS write completion; a per-conn watchdog fires at that deadline and aborts the in-flight op — never relying on the write returning or on opportunistic stall-evict sampling. On dead...\n*642│- **spt-core mapping:** `spt-daemon/src/conn.rs` `BrokerConn` (Condvar-gated serialized write gate + poisoned state + per-in-flight op id + watchdog + `abort_physical()`: cfg(windows) `CancelIoEx` → completion handshake → `DisconnectNamedPipe` raw kernel32 externs; cfg(unix) `UnixStream::shutdown(Both)`); `broker.rs` `SharedSend = Arc<BrokerConn>` + `controller_writer`/`viewer_writer`/`send_frame`/`send_error` routed; `nethost.rs` stream-log/presence sends routed. int = `brain_decouple.rs` `non_drain...\n 643│- **Source:** UPDATE-WEDGE round-4 (hertz root doc `docs/UPDATE-WEDGE-ROOT-CAUSE.md` @f8596ca; doyle gate ruling `docs/UPDATE-WEDGE-RCA-DISPATCH-todlando.md`; todlando build 2026-07-09). The residual 7.36 left open: logical eviction without physical retirement.\n 644│\n 645│---\n    │...\n 758│<!-- [doc->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION] -->\n*759│| 7.38 | Every physical broker-conn write bounded + cancelable + poison-on-failure (independent watchdog aborter; poisoned conn never reused; SendHalf never leaves the conn object) | broker `conn.rs` `BrokerConn`, all write sites (`controller_writer`/`viewer_writer`/`send_frame`/nethost), int `brain_decouple.rs` |\n 760│| 7.31 | The Psyche failure budget counts REAL per-event attempts — every bounded per-event turn feeds a consecutive-N budget (default 3), so per-event churn a resident rate-guard was blind to now counts by construction. Fixes hall-bf's ~12/min re-host churn that ran invisibly (boot records weren't ledger boundaries to the old guard) | `lifecycle.rs` `note_turn_outcome`/`psyche_turn_strikes_exhausted` (stamps `psyche_host_error` on exhaustion, no `status` de-stamp), unit synthetic failure-loop trips th...\n 761│<!-- [doc->REQ-HAZARD-THRASH-GUARD-BLIND] -->\n 762│<!-- [doc->REQ-HAZARD-STORE-INIT-RACE] -->\n## NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md\n 169│the binary's in-memory armed wake, forcing the wake text into a holdover file\n*170│(the rejected b1 hazard, F-024 env-file-carrier lesson class). The watchdog's\n 171│legitimate job is ANTI-STALL (release the operator-input floor), not\n 172│execution-verification; terminating a healthy binary over one eaten `{commit}`\n 173│is the whole bug.\n## NEXT-MILESTONE-PICKER-TRIAGE.md\n 110│locally-controlled endpoint has `driven_by=None` + `controlled=true`, and `local_rows`\n*111│(data.rs:220) never threads `controlled` into `EndpointRow` — so a locally-RC'd endpoint\n 112│renders plain ONLINE in its own node's picker. Remote rows DON'T have this hole (gossip\n 113│stamps `controller_node=self` for a local controller — REQ-GOSSIP-CONTROLLED-ANY) —\n 114│that asymmetry is the bug.\n## NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md\n 261│are only Online/Suspended, so: remote suspended row offers **`Wake now`** →\n*262│threads `ep.node` into a new `Outcome::Wake` → `wan_rest(id@node,\n 263│REST_EVENT_WAKE)` (plumbing exists, cli.rs:3289); local \"Start now\" semantics\n 264│unchanged; `Instantiate locally` remains the separate documented remote verb.\n 265│With A-2's resume leg, remote Wake now actually revives the session — the\n## PUMP-W2-DISPATCH-RULING.md\n 21│### G4 — concurrency: on the **BROKER**, fan-out-all with a **bounded cap**\n*22│Confirmed: dials run concurrently on the broker's async runtime (natural — iroh already pools), NOT pump-side threads. Fan-out-all is fine for today's rosters, but add a **generous bounded concurrency cap** (a broker-side semaphore, e.g. 16–32 concurrent dials) as a large-subnet guard — cheap insurance against a future big roster spawning unbounded concurrent connects (the \"no silent unbounded\" discipline). Don't over-engineer beyond a simple semaphore.\n 23│\n 24│### G5 — per-peer reschedule: **per-peer doubling backoff (capped), reset on success**\n 25│NOT next-tick-retry — the field mode is a mostly-offline roster (enlyzeam + ~5 dead peers); re-dialing every dead peer each tick wastes dials + churns. Per-peer doubling (scoped to the peer, cap ~300s like `supervise_pump`'s today) backs off a persistently-dead peer while keeping live peers hot. **Reset the peer's backoff on any success** (and it's fine to also reset on a fresh presence/discovery hint if cheap). A returning peer must re-dial promptly on the next reset, never languish in a long backoff.\n## PUMP-W2-GATE-HANDOFF.md\n  8│- `traceable-reqs check --json` — exit 0 (REQ-PUMP-PEER-ISOLATION +impl +unit +int active).\n *9│- **712 tests GREEN** (0 fail, 4 leaky=benign unjoined broker threads): full\n 10│  `tests/pump.rs` (self-drive + W1 black-hole regression + the 3 new W2 int) +\n 11│  `tests/presence.rs` (presence lifecycle — I touched NetPresenceEvent + PresenceLog) +\n 12│  all spt-daemon lib units + spt-store lib units.\n## UPDATE-WEDGE-2-ROUND3-RIG-VERDICT.md\n 10│The ruling's decider (§5): do dead-peer `submit_dial`s HOLD/serialize the broker\n*11│net runtime's 2 worker threads (starving the reactor that services LOCAL loopback\n 12│`rc` I/O), or do the QUIC awaits YIELD? **They yield.**\n 13│\n 14│Rig: dialer with a 3s QUIC-op bound; fire K=12 concurrent `submit_dial`s straight\n   │...\n 86│\n*87│`cargo nextest run -p spt-daemon --test net_worker_starve` (or `--test-threads=1`).\n 88│Hermetic (relays disabled, no discovery, loopback QUIC); no SPT_HOME/PTY needed.\n## W2-BUILT-REPORT.md\n 57│deadline: viewer keeps ticking, a second operator's `Control` subscribe COMPLETES (stall-\n*58│evicts R), evict is tallied, take resolves well under the watchdog. **RED-first proven:**\n 59│with the resolve_subscribe stall-evict commented out → `BusyControlled{by:operator-one}` +\n 60│`stall_evicts=0` (viewer still ticks — that isolation predates W2). R MUST be remote (a\n 61│local-spawner incumbent is silently taken by the pre-existing undriven path — that's why\n## W4-DISPATCH-RULING.md\n 19│\n*20│## Ruling 2 — listen-orphan watchdog: POLL baseline, OS-native optional\n 21│\n 22│The REQ offers \"job object / PDEATHSIG or poll.\" **Ruling: bounded POLL of `--parent-pid` liveness as the portable baseline** (matches the unit \"parent-death → listener exits within one poll window\"). Reasoning: one code path both platforms, no OS-handle plumbing, and the latency floor (one poll window, seconds) is fine for a headless-gateway orphan — the failure is \"held ONLINE for minutes,\" so seconds-to-exit is a full fix. OS-native tightening (Win job object / Linux PDEATHSIG, immediate exit) is ...\n 23│\n*24│Note: perri's spt-mobile-side job-object guard (SPT-CORE-NEEDS §5) stays regardless — **independent defense-in-depth**, her side; the core watchdog is the authoritative fix. No conflict, both proceed.\n 25│\n 26│## Not in this dispatch (separate tracks)\n*27│- **perri's REQ-SUPERVISOR-RELAY-RESPAWN** (adapter relay-respawn belt, minted inactive awaiting my ruling) — I rule that to perri separately; it composes with, not blocks, the core LISTEN-ORPHAN watchdog.\n 28│- **W1 field-accept swap window** — operator-coordinated, orthogonal to building W4.\n## W4-GATE-VERDICT.md\n 17│- **REQ-SPAWN-COLLISION-GUARD-LIVE-DUP** (`broker.rs`): single-flight wake, **broker-side claim** (ruling 1 — not a perch-record write). `wake_gate_decision` pure truth table (AlreadyLive / Racing / Claim); `dispatch_spawn` reads the live-session check + the `wake_inflight` claim **together under one atomic critical section** (sessions then wake_inflight — wake_inflight is a leaf lock, taken alone only in the RAII drop, no inversion), **no I/O under lock** (cached `process_id`). Serialized so no doub...\n*18│- **REQ-HAZARD-LISTEN-ORPHAN** (`startup.rs`): `--parent-pid` **poll watchdog** (ruling 2 — POLL baseline, OS-native optional). 2s poll of `parent_is_gone`, loud `exit(3)` (`EXIT_PARENT_GONE`) so the perch pid dies → liveness flips OFFLINE → dead-owner rebind unblocks. **Persistent-relay branch ONLY** (spawned after the `--once` early return) — verified against every listen e2e (all `--once`) so no test listener is killed. Win reaped-`Child`-holds-handle test gotcha correctly handled (drop before...\n 19│\n 20│## Verdict\n 21│**W4 GATED PASS.** LIFECYCLE-TRUTH W1–W4 all gated. Remaining milestone content: **W5** (delivery integrity — INJECT-MULTILINE-INTEGRITY + IDLE-PARKED-DELIVERY + SPOOL-TAKE-AUDIT) then **W6** (docs). Release counter 49 + W1 field-accept swap window still operator/deployah-gated.\n## W4-WAVE-GATE-REPORT.md\n 43│\n*44│**Fix (ruling 2 — POLL baseline, OS-native optional):** `spawn_parent_watchdog` (startup.rs)\n 45│polls `parent_is_gone(parent_pid)` every `PARENT_WATCH_POLL` (2 s); on parent death it prints\n 46│the loud `LISTEN_ORPHAN_EXIT` line (names self + the dead parent) and `process::exit(3)` — so\n 47│the perch's recorded pid dies → liveness flips it OFFLINE within one window → rebind unblocks.\n\n## adr/\n### 0004-single-daemon-broker-brain-split-and-self-update.md\n 73│2. ✅ **CLOSED (Spike #4, 2026-06-01).** Linux `forkpty` parity. Spike #1's binary, unchanged, passed all four invariants on `gravity-linux` (Ubuntu 22.04) — `portable-pty` selects `forkpty` on Unix; the ConPTY-DSR branch is inert there. Invariant B passed with the *strict* contiguity check that ConPTY-under-resize fails (Spike #5): `forkpty` is a raw pipe, ConPTY a screen buffer — different stream contracts, promoted into M3a's `SessionSurface` design. (`docs/spikes/SPIKE-04-forkpty-parity.md`.)\n*74│3. ✅ **CLOSED (Spike #5, 2026-06-01).** 100× restart + resize-under-load stress (codex #3). The broker survived 100 rapid brain kill/restart cycles + a resize thread racing the reader with no leak (one child, clean reap), no hang (watchdog deadline), no lost byte (full value-set coverage in the client's observation window). Surfaced two binding ConPTY findings for M3a/REQ-TERM-3: resize triggers a repaint that reorders+dups the stream (terminal-stream contract ≠ exactly-once transfer contract); mid-...\n 75│4. ✅ **CLOSED (Spike #6, 2026-06-01).** Idempotent/exactly-once delivery across brain restart (FATAL-adjacent #14). Durable-ID + WAL + dedup-at-effect proven exactly-once across a crash at any protocol point (before-intent / before-effect / after-effect). Two binding design constraints surfaced for `REQ-HAZARD-RESTART-IDEMPOTENT` / M3b-B5: broker-owned recovery anchor; dedup-at-effect keyed by durable ID. (`docs/spikes/SPIKE-06-idempotent-boundary.md`.)\n 76│\n 77│**Gate status (2026-06-01): ALL FOUR §E GAPS CLOSED PASS** (#3, #4, #5, #6) → the M3-PLAN Phase-0 spike-gate is **complete**. The broker/brain split is validated on both OSes (ConPTY + `forkpty`), across QUIC-stream survival, restart+resize churn, and exactly-once idempotency. M3a and M3b are both unblocked; the QUIC-ownership *implementation* and off-node transport remain explicitly deferred to M4 (only the *shape* was spiked).\n### 0022-spt-hosted-idle-delivery-translation-binary.md\n 163│deterministic at every checkpoint-armed boundary. Terminating a healthy binary over one eaten `{commit}`\n*164│was the whole bug — the watchdog's legitimate job is **anti-stall** (release the operator-input floor),\n 165│**not** execution-verification.\n 166│\n 167│This amendment **supersedes** the original \"no respawn → idle inbound then SPOOLS\" framing (§Consequences,\n### 0023-always-on-endpoints-resident-supervised-binary-sigil-addressing.md\n 27│- New tracked requirements `REQ-EP-8` (the kind + supervision) and `REQ-EP-9` (the `#` sigil), both **inactive** (`required_stages = []`) until the delivering milestone.\n*28│- All Discord-specific design (webhooks, per-agent threads, inbound routing, hybrid delivery, echo-loop prevention, secrets) is recorded in the sister repo **`../spt-discord/`**, deliberately not here.\n### 0034-per-minter-op-id-namespacing.md\n 91│  paths, so an unstamped op is uncompilable — the minter resolves at the\n*92│  genuine minting site and threads by construction, not by discipline. The\n 93│  wire keeps the additive optional field (legacy materialized at broker\n 94│  decode); the newtype is not forced into wire structs.\n 95│- **The journal-line minter token is TEXTUAL** (derived from the canonical","linesTruncated":true,"meta":{"limits":{"columnTruncated":{"maxColumn":512}}}},"isError":false,"timestamp":1784271750969}}
{"type":"message","id":"bd83d8c4","parentId":"05d4c297","timestamp":"2026-07-17T07:02:31.009Z","message":{"role":"toolResult","toolCallId":"call_1wSjlOt8nnXQOtTXG0E8Dm0I|fc_0a061eb498f0e908016a59d386dc9081969ed7193931cae5e5","toolName":"read","content":[{"type":"text","text":"impl OutputLog {\n…\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n…\n}\n…\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        advance_delivered(&delivered_through, *seq);\n    }\n    while let Ok(msg) = rx.recv() {\n        let (frame, seq) = match &msg {\n            CtrlMsg::Output(seq, frame) => (frame, Some(*seq)),\n            CtrlMsg::Control(frame) => (frame, None),\n        };\n        // NO epoch gate on the live path (P1c): new output only ever flows to the\n        // CURRENT controller's channel (the drain clones `self.controller.tx`), so\n        // a superseded writer's channel holds only its pre-supersede output\n        // backlog (seq the consumer dedups via snap-above) plus its own TERMINAL\n        // control frames — notably the `Displaced` kick the displaced controller\n        // MUST still receive. The loop ends naturally when `tx` drops. Gating\n        // output here would suppress that `Displaced` (the cv-matrix loud-take\n        // hang). The reorder hazard is the INITIAL-BATCH replay, gated above.\n        mark_blocked(true);\n        let res = send.write(frame);\n        mark_blocked(false);\n        match res {\n            Ok(_) => {}\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        if let Some(seq) = seq {\n            // (a) CONTIGUOUS cursor (b4 / B2 gapless-resume — doyle's gate): with the\n            // drop-on-full handoff in `append`, the controller's live channel can SKIP\n            // a seq (dropped while Full). The frame still went to the socket (the live\n            // operator sees it), but the durable resume cursor must NOT jump past the\n…\n        }\n    }\n…\n}\n…\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n                true\n            }\n            Err(TrySendError::Full(_)) => {\n                // DROP + surface, but stamp only on the rising edge.\n                if !self.backpressure.swap(true, Ordering::AcqRel) {\n                    self.stamp_backpressure(true);\n                }\n                false\n            }\n            // The writer thread is gone (session teardown) — nothing to do.\n            Err(TrySendError::Disconnected(_)) => false,\n        }\n    }\n\n    /// Mirror the input-backpressure signal to the perch's `info.json` (the\n    /// broker is the single writer). Best-effort: a session served without a\n    /// perch (raw broker tests) has nowhere to record.\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}\n\n/// A session's input-writer thread (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): drain\n/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n…\n        let log = Arc::new(Mutex::new(OutputLog::new(\n…\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker"}],"details":{"displayContent":{"text":"impl OutputLog {\n…\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n…\n}\n…\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        advance_delivered(&delivered_through, *seq);\n    }\n    while let Ok(msg) = rx.recv() {\n        let (frame, seq) = match &msg {\n            CtrlMsg::Output(seq, frame) => (frame, Some(*seq)),\n            CtrlMsg::Control(frame) => (frame, None),\n        };\n        // NO epoch gate on the live path (P1c): new output only ever flows to the\n        // CURRENT controller's channel (the drain clones `self.controller.tx`), so\n        // a superseded writer's channel holds only its pre-supersede output\n        // backlog (seq the consumer dedups via snap-above) plus its own TERMINAL\n        // control frames — notably the `Displaced` kick the displaced controller\n        // MUST still receive. The loop ends naturally when `tx` drops. Gating\n        // output here would suppress that `Displaced` (the cv-matrix loud-take\n        // hang). The reorder hazard is the INITIAL-BATCH replay, gated above.\n        mark_blocked(true);\n        let res = send.write(frame);\n        mark_blocked(false);\n        match res {\n            Ok(_) => {}\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        if let Some(seq) = seq {\n            // (a) CONTIGUOUS cursor (b4 / B2 gapless-resume — doyle's gate): with the\n            // drop-on-full handoff in `append`, the controller's live channel can SKIP\n            // a seq (dropped while Full). The frame still went to the socket (the live\n            // operator sees it), but the durable resume cursor must NOT jump past the\n…\n        }\n    }\n…\n}\n…\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n                true\n            }\n            Err(TrySendError::Full(_)) => {\n                // DROP + surface, but stamp only on the rising edge.\n                if !self.backpressure.swap(true, Ordering::AcqRel) {\n                    self.stamp_backpressure(true);\n                }\n                false\n            }\n            // The writer thread is gone (session teardown) — nothing to do.\n            Err(TrySendError::Disconnected(_)) => false,\n        }\n    }\n\n    /// Mirror the input-backpressure signal to the perch's `info.json` (the\n    /// broker is the single writer). Best-effort: a session served without a\n    /// perch (raw broker tests) has nowhere to record.\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}\n\n/// A session's input-writer thread (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): drain\n/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n…\n        let log = Arc::new(Mutex::new(OutputLog::new(\n…\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker","startLine":684,"lineNumbers":[684,null,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,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,null,1475,null,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,null,1653,1654,null,1661,null,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,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,null,3398,null,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271751009}}
{"type":"message","id":"c935583d","parentId":"bd83d8c4","timestamp":"2026-07-17T07:02:31.019Z","message":{"role":"toolResult","toolCallId":"call_OzGmJWhngAfJ05n4E6Ilw9jb|fc_0a061eb498f0e908016a59d386dca48196bc015301ae694aa3","toolName":"read","content":[{"type":"text","text":"impl DsrMatcher {\n…\n}\n\n/// A running drain pump over a surface's output. Holds live counters and a\n/// cooperative stop flag; see the module docs for the teardown contract.\npub struct Drain {\n    stop: Arc<AtomicBool>,\n    dsr_answered: Arc<AtomicU64>,\n    bytes: Arc<AtomicU64>,\n    handle: Option<thread::JoinHandle<()>>,\n}\n\nimpl Drain {\n    /// Total DSR queries answered so far (live).\n    pub fn dsr_answered(&self) -> u64 {\n        self.dsr_answered.load(Ordering::Relaxed)\n    }\n\n    /// Total bytes forwarded to the sink so far (live).\n    pub fn bytes_forwarded(&self) -> u64 {\n        self.bytes.load(Ordering::Relaxed)\n    }\n\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\n    /// **not** interrupt a read already blocked (that requires tearing the child\n    /// down — the no-EOF-while-writer-held discipline).\n    pub fn request_stop(&self) {\n        self.stop.store(true, Ordering::Relaxed);\n    }\n\n    /// Join the pump thread. Only returns once the underlying `read()` has\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\n    /// on ConPTY that means the child must be torn down first. Best-effort.\n    pub fn join(mut self) {\n        if let Some(h) = self.handle.take() {\n            let _ = h.join();\n        }\n    }\n}\n\nimpl Drain {\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\n    /// bounded channel applies backpressure).\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\n    where\n        R: Read + Send + 'static,\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let stop = Arc::new(AtomicBool::new(false));\n        let dsr_answered = Arc::new(AtomicU64::new(0));\n        let bytes = Arc::new(AtomicU64::new(0));\n\n        let t_stop = Arc::clone(&stop);\n        let t_dsr = Arc::clone(&dsr_answered);\n        let t_bytes = Arc::clone(&bytes);\n\n        let handle = thread::spawn(move || {\n            let mut reader = reader;\n            let mut matcher = DsrMatcher::default();\n            let mut buf = [0u8; 8192];\n            loop {\n                if t_stop.load(Ordering::Relaxed) {\n                    break;\n                }\n                match reader.read(&mut buf) {\n                    Ok(0) => break, // EOF — child gone and handles released\n                    Ok(n) => {\n                        let chunk = &buf[..n];\n                        let hits = matcher.scan(chunk);\n                        if hits > 0 {\n                            // Answer through the shared, serialized writer so the\n                            // CPR never interleaves with caller-injected input.\n                            if let Ok(mut w) = writer.lock() {\n                                for _ in 0..hits {\n                                    let _ = w.write_all(DSR_REPLY);\n                                }\n                                let _ = w.flush();\n                            }\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\n                        }\n                        sink(chunk);\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\n                    }\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\n                    Err(_) => break,\n                }\n            }\n        });\n\n        Drain {\n            stop,\n            dsr_answered,\n            bytes,\n            handle: Some(handle),\n        }\n    }\n}\n\nimpl PtySession {\n    /// Start draining this surface's output on a background thread, answering\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\n    ///\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\n    //\n    // [impl->REQ-HAZARD-CONPTY-DSR]\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\n    where\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let reader = self.take_reader()?;\n        let writer = self.shared_writer();\n        Ok(Drain::spawn(reader, writer, sink))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::sync::Mutex;\n    use std::time::Duration;\n\n…\n}\n\n[Showing lines 64-185 of 287. Use :186 to continue]"}],"details":{"truncation":{"content":"}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\r\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\r\n    ///\r\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\r\n    //\r\n    // [impl->REQ-HAZARD-CONPTY-DSR]\r\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\r\n    where\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let reader = self.take_reader()?;\r\n        let writer = self.shared_writer();\r\n        Ok(Drain::spawn(reader, writer, sink))\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use std::sync::Mutex;\r\n    use std::time::Duration;\r\n\r","truncated":true,"truncatedBy":"lines","totalLines":224,"totalBytes":4414,"outputLines":122,"outputBytes":4414,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl DsrMatcher {\n…\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\r\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\r\n    ///\r\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\r\n    //\r\n    // [impl->REQ-HAZARD-CONPTY-DSR]\r\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\r\n    where\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let reader = self.take_reader()?;\r\n        let writer = self.shared_writer();\r\n        Ok(Drain::spawn(reader, writer, sink))\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use std::sync::Mutex;\r\n    use std::time::Duration;\r\n\r\n…\n}","startLine":46,"lineNumbers":[46,null,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,null,286]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\reader.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":287,"totalBytes":4414,"outputLines":122,"outputBytes":4414,"shownRange":{"start":64,"end":185},"nextOffset":186}}},"isError":false,"timestamp":1784271751019}}
{"type":"message","id":"d6b79028","parentId":"c935583d","timestamp":"2026-07-17T07:02:31.027Z","message":{"role":"toolResult","toolCallId":"call_x94AEN5kZUtiMtxroyZrnkTf|fc_0a061eb498f0e908016a59d386dc6c819686924ed420af08fb","toolName":"grep","content":[{"type":"text","text":"# docs/\n## BROKER-BRAIN-SPLIT-RESTORATION.md\n 55|- ADR-0004 Consequences: *\"A small internal broker **process** exists beneath the daemon — a deliberate, bounded walk-back of 'literally one process,' … guaranteeing endpoint survival across updates.\"*\n*56|- ADR-0004 rejected alternatives include **\"whole-daemon live FD-passing\"** and **\"drain + restart\"** — i.e. the chosen design is specifically *restart the brain, the broker process survives.*\n 57|- `M3a-PLAN.md`, `M3-PLAN.md`, `M3b-PLAN.md` all name \"the broker **process** + IPC (M3b).\"\n 58|- Spikes 01/03/04/05/06 each **PROVEN** with *two separate binaries* (`spt-spikes/spike-01-broker-handoff`): a PTY child + a live QUIC transfer survive 100× brain restarts, gapless and exactly-once. A spike that proves \"survives a brain restart\" presupposes the broker is a separate process.\n 59|\n## DEFERRED.md\n 41|| **Quarantine operator override (`spt update apply --force` — the note-i escape hatch)**: D6-2's quarantine guard refuses re-applying a version that auto-rolled-back on this node (the `RolledBack` record is the marker; clears naturally when N+1 stages). But a version whose failure was **environmental** (a transient boot condition, not bad bytes) leaves the node **permanently allergic** to a genuinely-good version with no escape but staging a newer one. FIX = an explicit operator override (`spt update ...\n*42|| **✅ RESOLVED — shipped v0.8.3 (REQ-HAZARD-BROKER-QUIC-DEADLINE, KNOWN-HAZARDS 7.8).** ~~Broker-side bound on brain-waiting QUIC ops (the pump-IPC-deadline B-half)~~: the brain-side deadline (REQ-HAZARD-PUMP-IPC-DEADLINE, KNOWN-HAZARDS 7.6) stops the single-threaded pump wedging when a peer black-holes, by bounding the pump's brain-IPC reads and escalating a TimedOut to a supervised restart. But the ROOT cause is broker-side: the broker's `net_open_stream` / `net_stream_send` / `net_dial` handlers m...\n 43|| **Durable in-daemon alarm scheduler (one-shot deadline machinery — the Q4/V3 deferral)**: the broker/brain restoration (ADR-0018 Q4) fixes the *rule* for one-shot scheduled events — persist the absolute `target-time` at creation; every brain start (update *or* crash) reads it and fires-if-due; **never reset on crash** (a user's \"remind me at 3pm\" is a commitment that must outlive any restart). But it deliberately does **not** build the machinery: the spt-core daemon has **no one-shot consumer today...\n 44|| **Autonomous session-digest freshness + Option-C re-home (M9 ADR-0008 amendment deferral)**: M9 re-founded the digest as an ON-DEMAND projection of normalized session logs (`spt-term::projection`; `spt-daemon::digest::project_endpoint_digest`) — snapshot-pull and the structured-delta-stream CONTRACT ship, deltas driven by pulls / `api digest-entry` pushes. Two pieces deferred, both because they have **no consumer yet** (Shell=M10, GUI/frontend pane, Gateway agent-window — none exist): (a) the **aut...\n 45|| **Two-origin `owl_message` context-tap subtype refinement (M10 ADR-0019 deferral)**: the two-origin merge's owl-message producer (`spt::api::startup` `deliver` closure) taps the live-agent **`emit` chokepoint**, so EVERY delivered frame — including resurfaced **notif** frames and shell-context rows — is recorded as a single coarse `owl_message` context-injection entry (`context_kind:\"owl_message\"`). The data is not wrong (a notif IS injected context), only coarsely labeled; the digest is a glanceab...\n## F-035-CONFLICT.md\n 3|**Raised by:** todlando, mid-build, 2026-07-09. **Build HELD** (WIP uncommitted on\n*4|`f-035-window-drain-honor`). doyle's COLLAPSE ruling collides with a **shipped**\n 5|acceptance gate my RCA (docs/F-035-RCA.md) missed. Need an A/B/C ruling before I proceed.\n 6|\n 7|---\n...\n 13|\n*14|**`crates/spt/tests/idle_edge_drain_e2e.rs:89`** — `fn spool_while_active_then_idle_fires_injection`\n*15|`// [int->REQ-MSG-IDLE-EDGE-DRAIN] [int->REQ-HAZARD-DELIVERY-STARVATION]`\n 16|\n 17|- **Setup:** spools `spool_message_deferred_at(perch, \"peer\", …)` — which is\n 18|  `insert_message(…, WINDOW_ACTIVE_ONLY, …)` (spool.rs:363). So the row is\n...\n 26|\n*27|`REQ-MSG-IDLE-EDGE-DRAIN` (F-023 leg 2) and `REQ-SEND-WINDOW-DRAIN-HONOR` (F-035) are\n 28|directly incompatible for the relay-less spt-hosted class. The active/idle asymmetry I\n 29|called a bug in the RCA is **intentional** for that class.\n 30|\n...\n 35|For an **spt-hosted** endpoint (broker owns the PTY, `controllable`, relay-less), the\n*36|idle-edge/parked drain is the **ONLY** carrier for an `active_only` row. Traced every path:\n 37|\n 38|| carrier | `active_only` to spt-hosted? |\n 39||---|---|\n...\n 41|| Send-time idle re-offer (`cli.rs:5734`) | **NO** — gated `&& !active_only`. |\n*42|| Hook poll `drain_active_window` (`api poll`) | **N/A** — that is the HARNESS-hosted hook channel; an spt-hosted endpoint has no `api poll` harness. |\n*43|| **Idle-edge / parked drain `drain_idle_spool`** | **YES** — the F-023 leg-2 behavior (`include_deferred = !resting`). **This is the only carrier.** |\n 44|\n 45|So: `active_only` is designed as *\"the active **hook** window\"* — meant for\n 46|**harness-hosted** endpoints that `api poll`. An **spt-hosted** endpoint has no hook, so\n...\n 59|  `active_only`+spt-hosted is knowingly revoked (that class starves, or gets an\n*60|  evaporate/refuse-at-send policy instead). Requires re-scoping `REQ-MSG-IDLE-EDGE-DRAIN`\n 61|  + rewriting its int.\n 62|- **(B) never-starve wins** — the idle edge *should* carry `active_only` to spt-hosted\n 63|  (F-023 correct). Then **F-035 is mis-scoped**: *\"never wakes\"* is the **harness** hook\n...\n 65|  never a contract for the hook-less spt-hosted class. **RETIRE or NARROW\n*66|  REQ-SEND-WINDOW-DRAIN-HONOR; no code change.**\n 67|- **(C) class split** — spt-hosted delivers `active_only` at idle **without waking**\n 68|  (non-interrupting background inject) vs harness-hosted holds-for-poll. New behavior,\n 69|  larger; needs a \"deliver-but-don't-wake\" inject mode the translation binary honors.\n...\n 75|designed** — it is the only way that class can ever be delivered. If the true concern is\n*76|*\"it interrupts,\"* that is **(C)**, not the drain-exclusion of **(A)**. But this is your call.\n 77|\n 78|My WIP (spool.rs window-axis collapse + inject.rs + 2 units) is staged **uncommitted** — I\n 79|touched neither delivery.rs nor worker.rs. Standing by for A / B / C.\n## F-035-RCA.md\n*1|<!-- [doc->REQ-SEND-WINDOW-DRAIN-HONOR] F-035 RCA — report-before-fix. -->\n*2|# F-035 RCA — idle-edge parked-drain ignores the delivery-window tag\n 3|\n 4|**Status:** RCA-first, **report before fixing** (doyle-dispatched 2026-07-09).\n*5|**REQ:** `REQ-SEND-WINDOW-DRAIN-HONOR` (registered, `required_stages = []` — activate on doyle's fix ruling).\n 6|**Investigator:** todlando. **Off:** `origin/main@2c05dc9` (v0.30.2).\n 7|\n 8|---\n...\n 20|\n*21|For an **spt-hosted, relay-less** endpoint (the class the idle-edge drain targets),\n 22|such a row is delivered through the translation binary at the idle window — the\n 23|exact delivery the tag forbids.\n 24|\n...\n 42|\n*43|### ACTIVE drain — honors the axis (correct)\n 44|\n*45|`spool::drain_active_window_inner`:\n 46|\n 47|```\n 48|include_deferred ? \"WHERE delivered=0 AND \\\"window\\\" != 'idle_only'\"\n...\n 53|\n*54|### IDLE-edge drain — ignores the axis (the bug)\n 55|\n*56|`spool::claim_idle_edge_inner` (reached via `spt_daemon::inject::drain_idle_spool`\n*57|— the **one shared leg** the active→idle edge drain `delivery.rs:drain_idle_window`,\n 58|the send-time already-idle path, and the pulse re-offer belt all call):\n 59|\n 60|```\n...\n 66|\n*67|`drain_idle_spool` passes:\n 68|\n 69|```\n 70|let include_deferred = !crate::resting::deferred_held(&perch_path);\n...\n 78|\n*79|The drain **conflates two orthogonal axes**, using the `deferred` flag for both:\n 80|\n 81|1. **Resting gate** (REQ-INST-6 / KH 1.4): *hold deferred rows while the owner is\n 82|   dormant.*\n...\n 101|  `active_only`→idle direction is wrong.\n*102|- **\"It's `drain_idle_window`'s caller.\"** No — the caller correctly fires on the\n 103|  edge; the defect is the SQL selection in `claim_idle_edge_inner` (the shared spool\n 104|  leg), so every one of the three callers inherits it.\n 105|\n...\n 109|\n*110|Mirror the active drain: make the idle claim honor the **`window` axis**, excluding\n 111|`active_only` unconditionally, and keep the resting hold as an **orthogonal** filter.\n 112|\n 113|```\n*114|-- idle-window eligibility (mirror image of drain_active_window_inner):\n 115|WHERE delivered=0 AND \"window\" != 'active_only'\n 116|```\n 117|\n...\n 119|dormant) rather than *defining* it. Net effect: `default` + `idle_only` ride the\n*120|idle window; `active_only` never does; the two drains become mirror images on the\n 121|`window` axis.\n 122|\n 123|**Open ruling for doyle:** whether the resting `include_deferred` parameter on the\n...\n 139|\n*140|Kin: `REQ-MSG-DELIVERY-AXES`, `REQ-MSG-IDLE-EDGE-DRAIN`, `REQ-IDLE-PARKED-DELIVERY`,\n 141|`REQ-INST-6` (the resting gate it conflates).\n## F-035-RELAY-RCA.md\n 12|I traced every way an `active_only` row could reach lia's relay (its live PollListener\n*13|via `deliver_tcp`, OR its backlog via `drain_backlog`). **All are closed on current main:**\n 14|\n 15|| path | carries active_only to the relay? | why not |\n 16||---|---|---|\n...\n 18|| Cross-node `spt send` (WAN) | **NO** | `cli.rs:5762` — a remote active_only that misses locally returns *\"active-only stays local-only\"* and does NOT `wan_send`. The `WanMessage` wire record has **no window field** (wanmsg.rs:38), and the sender deliberately keeps active_only local-only rather than drop the class over the wire. So active_only never reaches `receive_wan`/`deliver_tcp` (wan.rs:300). |\n*19|| Relay backlog (`relay.rs:63 drain_backlog`) | **NO** | `drain_non_deferred` = `WHERE delivered=0 AND deferred=0`; `deferred=1 IFF active_only` (spool.rs:46). Excluded. (doyle already confirmed.) |\n 20|| Relay live-poll-forward (`relay.rs:77 pump_once`) | **NO** | Its only feed is `deliver_tcp`→the PollListener; no unguarded `deliver_tcp` of an active_only user msg exists (`deliver::deliver` callers = ring/ready ping-pong + tests; `reporting.rs:456` is a notif frame; `reporting.rs:161` shell-context uses `send_deferred`→**spool**, not tcp). |\n*21|| Parked-idle re-offer belt (`livehost.rs:265 drain_idle_spool`) | **NO** | BELT-1 `relay_present → Skip` (livehost.rs:495); and `claim_idle_edge` (post-nothing) is guarded `is_spt_hosted_no_relay`. lia has a relay → never runs. |\n*22|| busy→idle relay start (`relay.rs:90 run`→`drain_backlog`) | **NO** | same `drain_non_deferred` exclusion — on going idle, only `default`+`idle_only` spooled-while-busy rows drain to the relay; active_only stays spooled for the next busy poll. |\n 23|\n 24|The **only** carrier for a spooled active_only row is lia's hook **poll**\n*25|(`api poll`→`poll_drain`→`drain_active_window`, `WHERE \"window\" != 'idle_only'`, which\n 26|includes active_only) → delivered to the **polling session's stdout**, never the relay.\n 27|\n 28|**Conclusion:** on current main, spt-core's send/deliver/relay/spool/poll legs do **not**\n*29|leak active_only to a relay. Corrected-scope `REQ-SEND-WINDOW-DRAIN-HONOR` (poll-only for\n 30|a relay-bearing live agent) appears **already satisfied** by these legs.\n 31|\n 32|---\n...\n 43|   (spt-claude-code) job, not spt-core's `api state idle`. If the adapter does a final\n*44|   `api poll` on going idle (draining active_only) and injects the result into the\n 45|   now-idle session, that's an adapter route — outside these legs. → perri's lane.\n 46|3. **A repro detail I'm missing.** → Need the exact send form (`spt send --active-only`?\n 47|   a shell-context/`send_deferred`? a notify?), the sender's node vs lia's node\n## FAULT-MATRIX.md\n 57|| P3 | **Relay unreachable** (n0 outage / air-gap) | WAN dials needing relay fail; LAN/direct unaffected | Everything local | D9 two-host |\n*58|| P4 | **PTY broker drain thread dies** | That session's output stalls | Other sessions, net side | with terminal-wrapper hardening |\n 59|| P5 | **Manifest invocation hangs** (adapter subprocess) | That endpoint's lifecycle op | Daemon scheduler (KH 5.3 timeouts + 7.4 non-blocking) | when daemon hosts N agent loops |\n 60|| P6 | **Registry feed flood** (malicious/buggy peer spams updates) | Bounded by ring caps + lease; CPU cost unmeasured | — | D9 + REQ-SEC-1 outer gate |\n 61|| P7 | **Closed-watcher starvation** (net runtime saturated) | Presence lags behind reality | Conn table eventually consistent | D9 chaos pass |\n## KNOWN-HAZARDS.md\n 11|### 1.1 Phantom INIT_SIGNOFF after grace period\n*12|- **Failure:** orphan teardown enqueues INIT_SIGNOFF before the grace-period recheck; a transient Self recovery (binary handoff, brief stale poll) makes the recheck pass-as-alive, but the signoff was already spooled and drains on the next iteration → teardown despite a live Self.\n 13|- **Invariant:** grace-period wait MUST complete *before* composing/delivering INIT_SIGNOFF; the recheck must bind `still_gone` before any envelope write.\n 14|- **spt-core mapping:** in-daemon now (no separate wrapper), but the ordering invariant is identical — orphan/teardown logic must re-evaluate liveness after the grace wait, not before enqueue.\n 15|- **Sister cite:** `src/live/wrapper/orphan.rs:201-259` (sleep@209 precedes compose@231-251); tests T-grace-recovery:576, T-still-gone-recheck:618.\n...\n 29|### 1.4 Deferred spool rows must not leak to the event stream\n*30|- **Failure:** a hook spools a deferred (spool-only, no TCP wake) notice; startup `drain_all` flushes ALL rows including deferred → event emitted at wrong time/priority.\n*31|- **Invariant:** startup drain (and idle/timeout TCP-wake sites) use `drain_non_deferred` only; deferred rows are picked up by their intended consumer via `peek`. All drain sites must agree on which rows they flush.\n*32|- **spt-core mapping:** carries directly — the daemon's spool-drain has the same deferred-vs-immediate distinction.\n*33|- **Sister cite:** `src/owl/poll.rs:276-316`; `spool::drain_non_deferred_with_metadata`.\n 34|\n 35|### 1.5 Worker (working-perch) lifecycle path consistency\n 36|- **Failure:** subagent-start creates the perch at one path layout; later hooks read it at another → not found; stop-hook scan misses nested perches.\n...\n 120|\n*121|### 4.4 Deferred rows survive poll drain\n*122|- **Failure:** poll `drain_all` flushes a deferred (spool-only) message meant for a hook consumer → message lost.\n*123|- **Invariant:** deferred rows are never flushed by the event-stream drain; only `drain_non_deferred_*` / `peek_all` touch them.\n 124|- **Sister cite:** CHANGELOG v1.11.20; `src/common/spool.rs`. (See also 1.4.)\n 125|\n 126|### 4.5 Inbox legacy compat must not double-deliver\n...\n 128|- **Invariant:** spool is the sole read path at poll time; inbox is write-for-compat only and never read.\n*129|- **spt-core mapping:** clean-room — likely drop the legacy inbox entirely. If kept for any compat, preserve \"never read at drain time.\"\n 130|- **Sister cite:** `src/common/inbox.rs`.\n 131|\n 132|### 4.6 Addressable-id charset reserves the address delimiters\n...\n 201|- **Failure:** a broker reading a ConPTY master sees only the 4-byte startup query `ESC [ 6 n` and then nothing — the child looks hung/silent but is producing output normally. ConPTY blocks all child stdout until the terminal answers the cursor-position query.\n*202|- **Invariant:** every ConPTY reader auto-answers DSR (`ESC [ 6 n` → write `ESC [ 1;1 R`, or a real cursor position) on the PTY writer. Secondary: a ConPTY master does not EOF while the writer is held, so read loops drain on a thread and never gate exit on a blocking `read()`.\n*203|- **spt-core mapping:** `spt-term` broker PTY reader (ADR-0004). Brand-new to spt-core — not in the sister project (it never hosted ConPTY directly).\n 204|- **Source:** Spike #1 (`docs/spikes/SPIKE-01-broker-handoff.md`); reproduced with both a Rust child and `cmd.exe`.\n 205|\n 206|<!-- [doc->REQ-HAZARD-DETACHED-PIPE-INHERIT] -->\n...\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*410|- **Failure:** the W2.5 controller/viewer model lets ANY number of read-only `--view` attachers ride one session's broker `OutputLog`. The single drain thread fans each output chunk to every attacher. If a viewer's socket is fanned out with a **blocking** write under the log lock (the controller's authoritative path), one wedged viewer (a slow terminal, a black-holed WAN peer, a hostile non-reader) stalls the drain — freezing the controller's stream and backing up the PTY child. A single watcher must n...\n*411|- **Invariant:** the drain writes the **controller** on the authoritative blocking bounded path (it alone advances `delivered_through`), but each **viewer** gets an **isolated bounded SPSC queue + a dedicated writer thread**; the drain `try_send`s under the log lock and **evicts** any viewer whose queue is `Full` (fell behind the live stream) or `Disconnected` (its writer died on a dead socket) — the drain thread **never touches a viewer socket**, so no viewer write can backpressure it. A **soft cap** ...\n 412|- **spt-core mapping:** `OutputLog::append` (controller blocking + `viewer_send_evicts` `try_send` fan-out), `OutputLog::add_viewer` (bounded `sync_channel(VIEWER_CHANNEL_DEPTH)` + `viewer_writer` thread), `MAX_VIEWERS` soft cap, `ViewerSink`. Unit: `viewer_overflow_or_disconnect_evicts_never_blocks`. Int: `wedged_viewer_does_not_stall_controller` (a non-reading viewer is evicted while the controller keeps receiving past a 200KB burst).\n 413|- **Source:** M12 W2.5 controller/viewer model (doyle ruling 2026-06-14, Q1).\n 414|\n...\n 437|- **Failure (hypothesized, v0.12.0):** a legitimately dead PTY child (crash/kill) plus an `rc` pump dropped without a clean detach (closed tab) was thought to make the broker's loopback forward `write_all` block forever on a full 64 KB duplex, park a worker in the 2-worker net runtime, saturate both, and stall every new attach / `endpoint run` (with `daemon stop` unable to join).\n*438|- **Invariant — DISPOSITION = PROVE-DON'T-CHANGE** (doyle GATE-PASS @e883f45, 2026-06-18): the post-L0 code ALREADY prevents the wedge; NO fail-fast / worker-count code was added. (1) `serve_attach` forwards fire-and-forget (`net_stream_send` `op_id=None`) and the broker-side `send_stream` is already deadline-bounded (`bounded_block_on`, `BROKER_QUIC_OP_TIMEOUT_MS` = 10s — hazard 7.8), not forever. (2) the loopback duplex is drained broker-INTERNALLY by the operator row's OWN read pump (`nethost.rs` ...\n 439|- **spt-core mapping:** int `crates/spt/tests/attach_wedge_e2e.rs` (REAL detached daemon + dummy-harness fixture): serve the victim (rc sees its tick), abruptly kill rc (dropped pump) + kill the PTY child → a NEW endpoint still comes online + is served (no wedge), the dead endpoint is offlined within a tick (`LIVENESS_RECONCILE_OFFLINE`), `daemon stop` bounded. Leans on 7.8 (the QUIC-op deadline) + 7.7 (viewer isolation).\n 440|- **Source:** v0.12.0 real-harness finding (operator) → v0.12.1 L2 @e883f45; doyle GATE-PASS 2026-06-18.\n 441|\n*442|### 7.12 Controller output must NOT be written inline on the drain thread — a backed-up controller wedges the session  `[REQ-HAZARD-INJECT-CONTROL-COEXIST]`\n*443|- **Failure (v0.12.x, operator dogfooding + doyle /diagnose 2026-06-19):** `OutputLog::append` fanned each live chunk to the CONTROLLER via a SYNCHRONOUS, blocking `write_frame` held INLINE on the session's single drain thread while `Mutex<OutputLog>` was locked (viewers already had a dedicated writer thread + bounded evicting channel). A backed-up controller socket — a slow operator, or the full 64 KB `rc` loopback duplex under heavy TUI redraw — parked the drain thread WITH THE LOG LOCK HELD: outpu...\n*444|- **Invariant:** controller delivery runs OFF the drain thread — a dedicated controller writer thread + bounded channel (the 7.7 viewer_writer pattern) does the blocking socket write; the drain hands each chunk off with a BOUNDED, OFF-LOCK send (deadline → detach + `clear_controller`, never park forever, never silently evict a LIVE operator's authoritative view). The controller is AUTHORITATIVE (unlike a viewer): its writer advances the `delivered_through` resume cursor (atomic, only-on-success, mono...\n 445|- **spt-core mapping:** impl `broker.rs` `OutputLog::append`/`controller_writer`/`become_controller`/`ControllerJob::deliver`/`clear_controller`; int `crates/spt-daemon/tests/inject_control_wedge.rs` (a fully-backed-up controller keeps `KIND_SESSIONS` answering = no wedge); unit the bounded-deliver + monotonic-cursor kernels. The input-side parks (write_input `write_all` on a full buffer; DSR-answer writer-mutex contention) are BENIGN on Windows ConPTY (absorbs a large inject), real only on Unix forkpty ...\n 446|- **Source:** v0.12.x operator wedge → v0.13.0 W1 (doyle GATE-PASS 2026-06-19).\n 447|\n...\n 455|### 7.14 The effect journal must NOT hold its lock across the PTY write (or fsync every keystroke) — interactive input stutters then wedges  `[REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE]`\n*456|- **Failure (operator dogfooding + doyle /diagnose, MEASURED on the real Windows box, 2026-06-19, post-W1 escape):** `EffectJournal::apply_once` held its global `inner` mutex ACROSS `write_line(PENDING)` → `effect()` → `write_line(DONE)`, and `write_line` does `flush()+sync_all()` (a full fsync). Every operator keystroke is a `PtyWrite` effect (via `send_effect` → `dispatch_input` op_id branch), so each paid TWO fsyncs serialized under a GLOBAL lock with the blocking PTY write INSIDE the lock. Two ...\n 457|- **Invariant:** `apply_once` RELEASES the inner lock across `effect()` — reserve the key (fsync `PENDING` for DURABLE kinds) under the lock, RELEASE, run the effect OFF the lock, then re-acquire to finalize (fsync `DONE` for durable, mark applied). Crash-idempotency comes from the per-key reservation + the applied-set, not from holding the lock across the effect (the brain-crash guarantee is unchanged: the broker survives the brain, so reserve→effect→finalize runs uninterrupted on the broker threa...\n 458|- **spt-core mapping:** impl `effect.rs` `apply_once` (reserve/release/finalize) + `EffectKind::is_durable`; unit (`effect.rs`) a barrier proving the lock is NOT held across `effect()` (a different key's `apply_once` completes while one effect blocks) + `PtyWrite` writes no journal line while a durable kind (`NetSend`) does (the no-fsync proxy); int `crates/spt-daemon/tests/inject_control_wedge.rs` (real broker+PTY, a stalled consumer + sustained blocking input effect: a concurrent `spt rc` attach stays ...\n 459|- **Source:** v0.13.0 W1b (operator dogfooding post-W1 escape; doyle /diagnose + measurement 2026-06-19).\n## MSG-IDENTITY-DISPATCH.md\n 56|  send to BUSY doyle delivered via BOTH poll AND relay (spool row 156 `taken_leg='idle-inject'`).\n*57|  Pin with spool-audit: poll-drain vs relay delivered=1 ordering; busy→idle edge re-offer;\n 58|  take-mark atomicity. Then: one atomic cross-carrier claim per row.\n*59|- `REQ-RELAY-NO-BUSY-DELIVER` [impl,unit] — companion: idle-edge drain re-verifies activity /\n 60|  defers to the claim. May REDUCE to an ordering assertion under the exclusive claim — doyle\n 61|  rules at RCA lock; don't build blind. **Do not break** F-023 anti-starvation +\n 62|  REQ-IDLE-PARKED-DELIVERY (already-idle delivery stays green).\n## NEXT-MILESTONE-BUG-TRIAGE.md\n 188|NEW: hfenduleam→enlyzeam ALSO failed to deliver, BOTH IPs stable. So address-staleness (prior cause (a)) is NOT the whole story, and the no-reply-leg (b) explains silent-LOSS but not WHY nothing delivers AT ALL. Need a DEEPER dive into the actual delivery path on a stable-IP pair: receiver perch-resolution, access gate (Refused?), spool-not-inject, whether the WAN stream even reaches receive_wan, whether the connection/membership-proof actually establishes. The false-SENT(WAN) (b) stands as a separate ...\n*189|- **Root cause (agent F, conf H):** the REAL drop is the DATA-PATH (candidate #4). `spt send` resolves the dial with id-only `addr_for_node_hex` (wansend.rs:79/207/333 → endpoint.rs:538-541 = EndpointAddr::new(id), ZERO direct paths/relay) → EVERY send forces a fresh iroh DISCOVERY round-trip (mDNS/n0-DNS/relay). The gossip PUMP — which makes the nodes \"mutually visible\" — instead uses `dial_seeded` (pump/mod.rs:694-716): tries the durable last-known direct addr from PeerAddrStore FIRST + caches ...\n 190|- **Fix (conf H, effort M):** route WAN dial through the pump's seeded-direct-addr resolution (PeerAddrStore first, id-only fallback — mirror dial_seeded); PAIR with (b) the ack reply-leg (receiver writes WanOutcome back, sender blocks under QUIC deadline → honest CLI + retry next addr). Contributing/lower-now: proactive addr-refresh on local IP change (a). **Confirm field (read-only):** PeerAddrStore peer-addrs.json WILL hold a good direct addr the send never tries; add a WanOutcome eprintln at disp...\n 191|\n 192|### D-#12 — REOPENED: `rc` garbled but `endpoint run --attach` renders FINE (same Win10/pwsh env)\n## NEXT-MILESTONE-LIFECYCLETRUTH-TRIAGE.md\n 52|Root, rig-CONFIRMED (NtSuspendProcess on the brain, no update involved): PTY viewer fan-out\n*53|and control mutations depend synchronously on a live, DRAINING brain — brain-subscriber\n 54|session-output writes ride UNDER the per-session log lock (broker.rs:19-20). Failed writes are\n 55|handled (cursor freeze + detach, :3486); BLOCKED writes are not. Suspended brain ⇒ within\n 56|seconds: attached rc output freezes; detach does NOT release the control stamp (release routes\n...\n 58|healthy. Field: every brain cycle (incl. every `update apply`) has a freeze window; a stalled\n*59|or slow-draining new brain (6 sessions + psyches + WAN on the incident night) = permanent\n*60|wedge until bounce. `brain.ready` ≠ subscribers drained — why the 22:47 apply \"promoted\"\n 61|while frozen.\n 62|Fix shape (todlando proposes, doyle rules before impl): subscriber writes move OFF the log\n 63|lock (bounded/nonblocking, stall ⇒ detach-subscriber like viewer eviction — the broker already\n...\n 75|previously-online spt-hosted endpoints (records exist: info.json status + adapter + cwd);\n*76|alternatively stop performs a drain/handoff. Scope ruling (doyle): re-run-on-start, marked\n 77|`start-reason=daemon-restart`; agents' minds ride psyche re-host as today.\n 78|Int: endpoint online → daemon stop → start → endpoint back ONLINE, same id, harness respawned.\n 79|\n...\n 131|> endpoint PARKS (not lost) and flushes only when inbound activity wakes the target's\n*132|> delivery drain. Confirmed clean wake trigger: todlando's W2-proposal parts (part-1\n 133|> tail + 3/4) sat parked at doyle's perch for HOURS, then flushed the instant perri's\n*134|> idle-inject probe woke doyle's drain — parked, not truncated. **(b) live-SENT\n 135|> truncation/empty-body** = REQ-INJECT-MULTILINE-INTEGRITY (below) — a genuinely\n 136|> mangled payload on the typed leg, unrecoverable (no spool copy). Do NOT conflate:\n 137|> (a) is a scheduling/wake gap (bytes intact, late); (b) is byte corruption in transit.\n...\n 173|Root (live during this very dispatch, 2026-07-07): a message QUEUED to an ALREADY-idle\n*174|endpoint sleeps indefinitely — the idle-edge drain (F-023 leg 2) fires only on the\n 175|ACTIVE→IDLE transition, and no new edge ever comes for a parked session; the send-time inject\n 176|didn't carry it either (both doyle→todlando milestone dispatches sat delivered=0 in the spool\n 177|while the endpoint showed ONLINE). Fix: send-time inject must fire for an already-idle\n...\n 181|Live confirmation (2026-07-07): parked messages flush the moment inbound activity wakes\n*182|the target's delivery drain (doyle's parked W2-proposal parts flushed on perri's\n 183|idle-inject probe) — the wake trigger is real, so the fix is \"make the send-time inject\n 184|fire for an already-idle target\" / \"sweep on the pulse tick\", not a new wake mechanism.\n 185|\n## NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md\n 181|   file. The loop-top stray-command drop (:1337) already neutralizes a LATE\n*182|   `{commit}` from the missed sequence; note the residual mid-drain\n 183|   mis-attribution window (old sequence's dribbling commands during the next\n*184|   event's drain) — todlando picks the drain discipline, the existing\n 185|   stray-drop is likely sufficient (binaries emit fast).\n 186|2. **Strike budget for REAL wedges:** N CONSECUTIVE misses with no intervening\n 187|   successful commit (N=3 proposed) → then fault as today (terminate + latch +\n...\n 237|  3. **NEW — respool-once (dead-letter):** under miss≠fault, a respooled\n*238|     zero-record envelope (the duplicate FIRE) redelivers on a later drain →\n 239|     misses again → respools again = an INFINITE cycle of 5 s floor-holds and\n 240|     strike churn. A missed envelope respools AT MOST ONCE; a second miss\n 241|     dead-letters it LOUDLY (stderr + counts toward the perch fault surface,\n## NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md\n 201|Wire-level severance detection stays with the EXISTING paths (conn EOF,\n*202|unsubscribe, drain deadline-evict) — B-1's poison fix un-wedged exactly the\n 203|cleanup that failed on ball-b, and QUIC keepalive surfaces an idle-severed\n 204|conn as an EOF eventually. Fix shape (recorded-truth, Q5 kin):\n 205|- Broker gains an authoritative **live-controller query** per session id\n## NEXT-MILESTONE-WORKERTRUTH-TRIAGE.md\n 15|*deliberate* soft-cleanup (REQ-HAZARD-SOFT-CLEANUP: preserve info.json + spool\n*16|so in-flight results drain). The bug is not the preservation, it is that a\n 17|soft-stopped worker still renders as a permanent OFFLINE row in the default\n 18|`endpoint list`. Fix = visibility (V-1) + reap (W-3), not hard-delete on stop\n 19|(the cascade-wipe guard rationale stands).\n## PUMP-W2-BUILD-DELTA.md\n 10|\n*11|Your G2: \"one carrier ... split to a dedicated event-drain carrier ONLY if the\n*12|impl shows submit backpressure entangling the drain deadline.\" The trigger is\n 13|**stronger than backpressure — it's exactly-once correctness (gotcha #1):**\n 14|\n 15|- The pump's `peer_step` pull legs (sync `request_sync`, update `request_update`)\n...\n 19|  doesn't want, `read_event_until` has ALREADY advanced `presence_cursor`\n*20|  (`*cursor = ev.seq + 1`) and the caller's `_ => continue` DROPS it. The drain\n 21|  loop then never sees that CONNECTED/DIAL_FAILED → **cursor advanced, outcome\n 22|  lost** → a peer silently never-rescheduled OR a phantom gap. Single carrier\n 23|  breaks the D4c exactly-once property W2 leans on.\n 24|- **Resolution:** a second pump-mode brain `events` OWNS the presence\n*25|  subscription + drain; the primary `brain` OWNS dial-submit acks + `peer_step`\n 26|  IO. Neither swallows the other by construction (separate socket → separate\n*27|  reader thread → separate frame channel). This is your named fallback, adopted.\n 28|\n*29|## Δ2 — drain is NON-BLOCKING (`try_recv`), deadline only bounds the submit-wait\n 30|\n 31|The split carrier is a reader-thread + `Receiver<io::Result<Envelope>>`\n*32|(`BrainConn::Split`). So the drain reads **available** events via `try_recv`\n*33|(new `Brain::drain_presence_now`) — NOT a per-round blocking wait. Round shape:\n 34|\n 35|- submit K non-blocking dials for not-connected / not-backed-off due peers;\n 36|- run `peer_step` NOW for already-connected due peers (on `brain`);\n*37|- drain: pull all available presence events (`try_recv`); if K>0 submits are\n 38|  outstanding, `recv_timeout` up to the **round deadline** = `brain::\n 39|  PEER_REPLY_READ_BUDGET + 2s` (symbolic, Δ Q1) for their outcomes; on CONNECTED\n 40|  run that peer's due legs in the SAME round; on DIAL_FAILED back the peer off;\n...\n 47|- **dead BROKER still restarts:** a dead broker closes the IPC conn → the\n*48|  `events` reader thread hits EOF → `frames` channel `Disconnected` →\n 49|  `read_frame_until` returns an error → `run_peer_pump` returns Err → supervise\n 50|  restarts. (The primary `brain` also still bubbles a genuine carrier-op\n 51|  `TimedOut` → restart — W1's carrier-desync path, KEPT.)\n## PUMP-W2-BUILD-GO.md\n 15|## Build (per the approved design — restated for the gate, not re-opened)\n*16|- **G1** EXTEND `NetPresenceEvent`: new `PRESENCE_DIAL_FAILED` kind + optional `reason`; correlation by existing `remote_id_hex` (conn_id:0 sentinel on fail). One cursor / exactly-once drain.\n*17|- **G2** ONE carrier: `submit_dial` fire-and-forget → drain non-blocking with a broker-LIVENESS deadline only. Re-points `REQ-HAZARD-PUMP-IPC-DEADLINE` to broker-conn health (split only if backpressure entangles).\n*18|- **G3** Round closes on the **derived DEADLINE** (submit-all → drain-until-round-timeout → `mark_ran`), NOT all-resolved. Preserves §V4 stagger + per-leg cadence + per-peer worker ordering. Heartbeat advances regardless.\n 19|- **G4** Concurrency on the BROKER + bounded **NetHost-SHARED** semaphore (Q2 CAVEAT: the existing blocking `dial()` MUST acquire the SAME permit, else the cap is bypassed).\n 20|- **G5** Per-peer doubling backoff, capped, reset on success. **Q3:** a mid-round `peer_step` fail = per-peer drop+backoff same as `DIAL_FAILED`, never round-wide; `DISCONNECTED` stays NO-backoff (redial-eligible immediately) — only `DIAL_FAILED` backs off.\n 21|- New non-blocking broker verb `KIND_NET_DIAL_SUBMIT` (payload `NetDialReq`); `NetHost::submit_dial` spawns under the semaphore, same bounded connect, outcome → `PresenceLog`.\n...\n 24|- **int (load-bearing):** mixed roster 1 LIVE + N OFFLINE peers — the live peer connects AND this node advertises presence in the SAME round the offline peers fail; heartbeat advances every round; **no `PEER_PUMP_RESTART` from a dead peer**; a dead peer never blocks the live one (head-of-line-block gate). PLUS: a dead BROKER conn STILL trips `supervise_pump` (the re-pointed IPC-deadline — verify it survived the decouple; assert BOTH directions).\n*25|- exactly-once / gapless drain preserved (D4c cursor discipline — no dropped/duplicated outcome under a mid-round broker restart).\n 26|- §V4 stagger + per-leg cadence (registry/notif/sync/update) preserved under the event-driven round.\n 27|- `traceable-reqs check --json` exit 0 (REQ-PUMP-PEER-ISOLATION +impl +unit +int); `clippy --workspace --all-targets -D warnings` clean.\n 28|- Regression: the W1 pumpdeadline suite + full-round black-holing-peer + self-drive + two-tier-sync/torn-pull happy paths all still green.\n## PUMP-W2-DESIGN.md\n 31|6. **Per-peer state** — `HashMap<peer_hex, PeerSched { next_due: Instant, backoff: Duration }>` (G5). A peer is dial-eligible this round iff `now >= next_due`. On `DIAL_FAILED` → `backoff = (backoff*2).min(PEER_BACKOFF_CAP≈300s)`, `next_due = now + backoff`. On `CONNECTED` (success) → reset (`backoff = base`, remove/zero). Live peers stay hot; a persistently-dead peer backs off, never re-dialed every tick.\n*32|7. **Round = submit-all → drain-until-deadline → mark_ran** (G3, wedge-proof):\n 33|   - compute `due_flags` (cadence, unchanged) + `pre_rounds` (unchanged).\n 34|   - `fan_targets` → for each peer NOT in backoff and NOT already-connected → **submit** a non-blocking dial (fire-and-forget). Concurrent on the broker.\n*35|   - **drain** the presence stream until a **round deadline** `ROUND_DRAIN_TIMEOUT` = a **derived const** `W1_final_bound + ~2s margin` (doyle Q1: NOT a config knob — reference W1's bound constant directly, **pin the value when W1 lands its final bound**; the margin covers event IPC transit + drain scheduling; concurrent dials all resolve within ~one bound, not N×bound). For each event:\n 36|     - `CONNECTED{remote,conn_id}` → record conn; run that peer's due-worker `peer_step`s (the registry advertise / notif / sync / update legs) on its conn — **the live peer advertises presence the round it connects**, independent of offline peers. **If a `peer_step` errors mid-round** (a CONNECTED peer whose stream write fails — doyle Q3): drop that conn + apply the per-peer backoff, the SAME path as `DIAL_FAILED`, never round-wide (bubbling it round-wide would re-introduce the whole-round poison ...\n 37|     - `DIAL_FAILED{remote,reason}` → per-peer backoff (6); log `PUMP_PEER_FAIL:{remote}:{reason}` (the ordinary per-peer signal, now event-driven).\n 38|     - `DISCONNECTED{conn}` → drop the cached conn (redial-eligible next round).\n...\n 43|\n*44|The pump's brain carrier keeps a **short liveness deadline on the DRAIN read** — but now it means \"is the BROKER answering the event stream AT ALL,\" not \"did peer X reply.\" Concretely:\n 45|- a healthy round always produces stream activity (at minimum the pump's own submit acks + the round's outcome events) within the liveness window;\n*46|- if the drain read deadlines with the broker producing **nothing** (broker wedged / carrier dead) → `run_peer_pump` returns `Err` → `supervise_pump` restarts (the ORIGINAL 2.2h-wedge defense, intact);\n 47|- a dead PEER can no longer trip this — its `DIAL_FAILED` arrives within W1's bound as ordinary stream traffic. **Decouple achieved without losing the dead-broker restart.**\n 48|- The int test asserts BOTH directions: a dead peer never restarts; a dead broker conn STILL does.\n 49|\n...\n 58|## Files\n*59|`msg.rs` (kinds+fields+submit req), `nethost.rs` (`submit_dial`+semaphore+DIAL_FAILED append), `broker.rs` (`dispatch_net_dial_submit`), `brain.rs` (submit helper + the presence-drain already exists), `pump/mod.rs` (round restructure + per-peer sched), tests. Activate `REQ-PUMP-PEER-ISOLATION [impl,unit,int]` at build-start.\n 60|\n 61|## Q1–Q3 — RESOLVED (doyle design-check addendum, PUMP-W2-DISPATCH-RULING.md @ca2038b)\n 62|- **Q1 (round deadline):** RESOLVED — a **derived const** `W1_final_bound + ~2s`, NOT a config knob. Reference W1's bound constant; pin at W1 land (genuine W1-before-W2 dependency — don't hardcode 10s now). Folded into round loop above.\n## PUMP-W2-DISPATCH-RULING.md\n 14|\n*15|### G2 — carrier: **one carrier**, submit fire-and-forget + drain non-blocking with a **broker-liveness deadline only**\n*16|Neither operation blocks on a per-peer reply anymore, so one carrier is fine. The drain is a non-blocking \"read events available up to cursor,\" NOT a per-event deadline. **REQ-HAZARD-PUMP-IPC-DEADLINE's real purpose survives, re-pointed:** the drain keeps a SHORT deadline on *broker-conn liveness* (is the broker draining/answering the stream AT ALL) — a dead broker still trips `supervise_pump`; a dead PEER never does (its failure is an ordinary event within W1's bound). **Fallback trigger:** split to a...\n 17|\n*18|### G3 — round-close: **on a DEADLINE** (submit-all → drain-until-round-timeout → `mark_ran`), NOT all-resolved\n 19|All-peers-resolved is a NEW wedge risk: a lost/delayed outcome (or a slow broker) → the round never closes → the pump stalls again. Deadline-close is bounded and wedge-proof. Because dials are CONCURRENT, all outcomes arrive within ~one W1 bound (not N×bound), so **round-timeout ≈ W1 per-dial bound + a small margin**. Preserves the ADR-0018 §V4 stagger (`mark_ran` = ATTEMPTED, post-round instant) + exactly-once wake semantics. A peer unresolved at round-close = **reschedule that peer** (per-peer,...\n 20|\n 21|### G4 — concurrency: on the **BROKER**, fan-out-all with a **bounded cap**\n...\n 29|- **int (the load-bearing test):** a mixed roster — 1 LIVE + N OFFLINE peers — the live peer connects AND this node advertises presence in the SAME round the offline peers fail; heartbeat advances every round; **no `PEER_PUMP_RESTART` from a dead peer**; a dead peer never blocks the live one (the head-of-line-block gate). Plus: a dead BROKER conn STILL trips `supervise_pump` (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE — verify it didn't get lost in the decouple).\n*30|- exactly-once/gapless drain preserved (the D4c cursor discipline — no dropped/duplicated outcome under a mid-round broker restart).\n 31|- §V4 stagger + per-leg cadence (registry/notif/sync/update) preserved under the event-driven round.\n 32|\n 33|## Sequencing\n...\n 41|\n*42|- **Q1 — round-deadline value:** a **DERIVED CONST** = `W1_final_bound + fixed margin (~2s)`, NOT a config knob (no operator-facing tuning surface for an internal timing detail — a knob is a mis-tune/maintenance liability). Reference W1's bound constant directly; **pin the value when W1 lands its final bound** (genuine W1-before-W2 dependency — don't hardcode 10s now). Margin covers event IPC transit + drain scheduling + slack for the concurrent dials to all resolve (~one bound, not N×bound).\n 43|- **Q2 — semaphore home:** **NetHost-SHARED** (not pump-scoped). It guards the broker's iroh connection resource, which lives at the NetHost, and protects ALL dial callers (pump + shellwake + pairing) from a concurrent-dial storm — a pump-scoped limiter leaves the others unprotected + duplicates the concern. **CAVEAT (load-bearing):** the existing BLOCKING `dial()` MUST acquire the SAME permit too — otherwise the cap only bounds `submit_dial` while `net_dial` piles on unbounded on top, defeating th...\n 44|- **Q3 — `peer_step` failure mid-round (a CONNECTED peer whose worker step errors, e.g. stream write fails):** **per-peer drop + backoff, SAME path as `DIAL_FAILED`, never round-wide** (todlando's proposal — endorsed). A peer whose stream writes fail is effectively unreachable this round; drop its conn + apply the per-peer backoff; the round continues for other peers. Bubbling it round-wide would re-introduce the whole-round poison in a new spot. Don't build a separate transient-vs-dead distinction ...\n 45|\n## PUMP-W2-GATE-HANDOFF.md\n 15|- **Δ1 (approved): TWO carriers.** A 2nd pump brain `events` owns the presence\n*16|  drain; primary `brain` owns dial-submit acks + peer_step IO. Reason is stronger\n 17|  than G2's \"backpressure\" — a shared carrier's peer_step pull-reply read\n 18|  (`read_event_until`) advances `presence_cursor` then drops the presence frame =\n 19|  exactly-once break. PresenceLog is single-subscriber → primary brain\n...\n 24|  dead BROKER → carrier read Err → `run_peer_pump` returns Err = the restart\n*25|  trigger (`pump_w2_dead_broker_bubbles_err_for_restart`). Drain classifies\n 26|  `TimedOut`=quiet(break), any other read err=dead-carrier→Err→restart.\n 27|- **Q1** round deadline = `brain::PEER_REPLY_READ_BUDGET + 2s`, symbolic. **Q2**\n 28|  one shared NetHost semaphore, both `submit_dial` + blocking `dial()` acquire.\n## STORAGE.md\n 91|| endpoint lifecycle / status *audit trail* | **BranchStore** (or a derived view) | the *trajectory* matters, not just current value |\n*92|| spool (queue, drain-by-status, `id→address`) | **SQLite** | indexed queries + hot churn |\n 93|| broker effect journal (per-PTY-effect, B5) | **fsync-append** | hot path, per-keystroke — a commit per write is far too heavy |\n 94|| `info.json` / `status` (current value) | flat + atomic-rename (today) | tiny, read-hot; *may* move under BranchStore later, low priority |\n 95|\n...\n 188|  bind/boundary, context commit, rename, fork, purge) drop one tiny scope\n*189|  file each; the daemon's writer drains, debounces, and coalesces them into\n 190|  one refresh. Fire-and-forget and daemon-offline-safe (events accumulate\n 191|  and are consumed at the next brain start).\n 192|  <!-- [doc->REQ-PROJECT-INDEX-INVALIDATION] -->\n## UPDATE-WEDGE-2-ROUND3-CODEREAD.md\n 11|`brain.net_status()` → spawn-consumers-once → `brain.sessions()` (the counter-54 reap-drive,\n*12|brainproc.rs:276) → `write_ready`. It hosts NO PTY sessions, so it does not itself drain PTY\n 13|output. Neither IPC call blocks on a dead peer:\n 14|\n 15|- **`net_status()` is a cheap field read.** `dispatch_net_status` (broker.rs:3573) returns\n...\n 27|  write** (`controller_writer`, broker.rs:1418; docstring 1409-1411: *\"a backed-up controller\n*28|  blocks ONLY this thread, never the session drain which used to write inline under the log\n 29|  lock\"*). So a WEDGED writer cannot block the reap either.\n 30|- **Viewers drop, never block the producer** (`try_send` + eviction, broker.rs:1086/802).\n 31|\n...\n 49|\n*50|> when the brain conn backs up (the brain isn't draining fast enough — it only reads during\n 51|> the 500ms heartbeat's `net_status`/`sessions` calls), a subscriber writer BLOCKS inside\n 52|> `write_frame` while HOLDING `send.lock()` → the dispatch thread cannot acquire `send.lock()`\n 53|> to send the heartbeat reply → `net_status()`/`sessions()` never return → the heartbeat loop\n*54|> is stuck → the brain never drains its conn → the subscriber writer stays blocked. **A\n 55|> self-reinforcing deadlock on the brain conn's send mutex.**\n 56|\n*57|Once the heartbeat is stuck, the brain drains nothing; every subscriber writer on the brain\n 58|conn wedges; the broker-side controller writers whose sink is the brain conn cross\n 59|`BRAIN_WRITE_DEADLINE` → `BRAIN_SUBSCRIBER_STALL_EVICT`. Matches the field exactly.\n 60|\n...\n 76|The trigger is active-session OUTPUT backing up the brain conn faster than the 500ms\n*77|heartbeat drains it — on respawn (resume subscribes N + replay burst floods the conn before\n*78|the loop drains) and in steady state (an active streamer's output between heartbeats fills the\n 79|socket buffer; on v0.30.3 additionally compounded by the steal). The field always had dead\n 80|peers, but they are coincidental load, not the mechanism.\n 81|\n...\n 87|\n*88|- **(A) resume_sessions does NOT re-subscribe.** Drop the undrained continuity subscription\n 89|  entirely — the daemon brain has no consumer for it today. The brain conn then carries only\n 90|  request/reply → no subscriber backpressure → no deadlock. Smallest, brain-side, seamless.\n 91|  Forward-seam: when genuinely daemon-driven sessions land (the live-agent adapter), THOSE\n*92|  attach on a drained carrier (option B).\n*93|- **(B) Drain the brain conn on a DEDICATED reader thread** (`BrainConn::Split` — the exact\n 94|  carrier the pump already uses, brain.rs:230) so the heartbeat reply is never blocked by\n 95|  subscriber backpressure, and subscriptions can persist. Brain-side, seamless.\n 96|- **(C) [broker-side — deployment risk, FLAG] subscriber writers use a bounded/non-blocking\n\nShowing files 1-20 of 69+. Use skip=20 for the next page, or narrow paths/pattern.\n\n[Some lines truncated to 512 chars]"}],"details":{"scopePath":"docs, crates/spt-daemon/tests, crates/spt-term","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":110,"fileCount":20,"files":["docs/BROKER-BRAIN-SPLIT-RESTORATION.md","docs/DEFERRED.md","docs/F-035-CONFLICT.md","docs/F-035-RCA.md","docs/F-035-RELAY-RCA.md","docs/FAULT-MATRIX.md","docs/KNOWN-HAZARDS.md","docs/MSG-IDENTITY-DISPATCH.md","docs/NEXT-MILESTONE-BUG-TRIAGE.md","docs/NEXT-MILESTONE-LIFECYCLETRUTH-TRIAGE.md","docs/NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md","docs/NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md","docs/NEXT-MILESTONE-WORKERTRUTH-TRIAGE.md","docs/PUMP-W2-BUILD-DELTA.md","docs/PUMP-W2-BUILD-GO.md","docs/PUMP-W2-DESIGN.md","docs/PUMP-W2-DISPATCH-RULING.md","docs/PUMP-W2-GATE-HANDOFF.md","docs/STORAGE.md","docs/UPDATE-WEDGE-2-ROUND3-CODEREAD.md"],"fileMatches":[{"path":"docs/BROKER-BRAIN-SPLIT-RESTORATION.md","count":1},{"path":"docs/DEFERRED.md","count":1},{"path":"docs/F-035-CONFLICT.md","count":10},{"path":"docs/F-035-RCA.md","count":16},{"path":"docs/F-035-RELAY-RCA.md","count":7},{"path":"docs/FAULT-MATRIX.md","count":1},{"path":"docs/KNOWN-HAZARDS.md","count":20},{"path":"docs/MSG-IDENTITY-DISPATCH.md","count":2},{"path":"docs/NEXT-MILESTONE-BUG-TRIAGE.md","count":1},{"path":"docs/NEXT-MILESTONE-LIFECYCLETRUTH-TRIAGE.md","count":8},{"path":"docs/NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md","count":3},{"path":"docs/NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md","count":1},{"path":"docs/NEXT-MILESTONE-WORKERTRUTH-TRIAGE.md","count":1},{"path":"docs/PUMP-W2-BUILD-DELTA.md","count":10},{"path":"docs/PUMP-W2-BUILD-GO.md","count":4},{"path":"docs/PUMP-W2-DESIGN.md","count":5},{"path":"docs/PUMP-W2-DISPATCH-RULING.md","count":5},{"path":"docs/PUMP-W2-GATE-HANDOFF.md","count":2},{"path":"docs/STORAGE.md","count":2},{"path":"docs/UPDATE-WEDGE-2-ROUND3-CODEREAD.md","count":10}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# docs/\n## BROKER-BRAIN-SPLIT-RESTORATION.md\n 55│- ADR-0004 Consequences: *\"A small internal broker **process** exists beneath the daemon — a deliberate, bounded walk-back of 'literally one process,' … guaranteeing endpoint survival across updates.\"*\n*56│- ADR-0004 rejected alternatives include **\"whole-daemon live FD-passing\"** and **\"drain + restart\"** — i.e. the chosen design is specifically *restart the brain, the broker process survives.*\n 57│- `M3a-PLAN.md`, `M3-PLAN.md`, `M3b-PLAN.md` all name \"the broker **process** + IPC (M3b).\"\n 58│- Spikes 01/03/04/05/06 each **PROVEN** with *two separate binaries* (`spt-spikes/spike-01-broker-handoff`): a PTY child + a live QUIC transfer survive 100× brain restarts, gapless and exactly-once. A spike that proves \"survives a brain restart\" presupposes the broker is a separate process.\n 59│\n## DEFERRED.md\n 41│| **Quarantine operator override (`spt update apply --force` — the note-i escape hatch)**: D6-2's quarantine guard refuses re-applying a version that auto-rolled-back on this node (the `RolledBack` record is the marker; clears naturally when N+1 stages). But a version whose failure was **environmental** (a transient boot condition, not bad bytes) leaves the node **permanently allergic** to a genuinely-good version with no escape but staging a newer one. FIX = an explicit operator override (`spt update ...\n*42│| **✅ RESOLVED — shipped v0.8.3 (REQ-HAZARD-BROKER-QUIC-DEADLINE, KNOWN-HAZARDS 7.8).** ~~Broker-side bound on brain-waiting QUIC ops (the pump-IPC-deadline B-half)~~: the brain-side deadline (REQ-HAZARD-PUMP-IPC-DEADLINE, KNOWN-HAZARDS 7.6) stops the single-threaded pump wedging when a peer black-holes, by bounding the pump's brain-IPC reads and escalating a TimedOut to a supervised restart. But the ROOT cause is broker-side: the broker's `net_open_stream` / `net_stream_send` / `net_dial` handlers m...\n 43│| **Durable in-daemon alarm scheduler (one-shot deadline machinery — the Q4/V3 deferral)**: the broker/brain restoration (ADR-0018 Q4) fixes the *rule* for one-shot scheduled events — persist the absolute `target-time` at creation; every brain start (update *or* crash) reads it and fires-if-due; **never reset on crash** (a user's \"remind me at 3pm\" is a commitment that must outlive any restart). But it deliberately does **not** build the machinery: the spt-core daemon has **no one-shot consumer today...\n 44│| **Autonomous session-digest freshness + Option-C re-home (M9 ADR-0008 amendment deferral)**: M9 re-founded the digest as an ON-DEMAND projection of normalized session logs (`spt-term::projection`; `spt-daemon::digest::project_endpoint_digest`) — snapshot-pull and the structured-delta-stream CONTRACT ship, deltas driven by pulls / `api digest-entry` pushes. Two pieces deferred, both because they have **no consumer yet** (Shell=M10, GUI/frontend pane, Gateway agent-window — none exist): (a) the **aut...\n 45│| **Two-origin `owl_message` context-tap subtype refinement (M10 ADR-0019 deferral)**: the two-origin merge's owl-message producer (`spt::api::startup` `deliver` closure) taps the live-agent **`emit` chokepoint**, so EVERY delivered frame — including resurfaced **notif** frames and shell-context rows — is recorded as a single coarse `owl_message` context-injection entry (`context_kind:\"owl_message\"`). The data is not wrong (a notif IS injected context), only coarsely labeled; the digest is a glanceab...\n## F-035-CONFLICT.md\n  3│**Raised by:** todlando, mid-build, 2026-07-09. **Build HELD** (WIP uncommitted on\n *4│`f-035-window-drain-honor`). doyle's COLLAPSE ruling collides with a **shipped**\n  5│acceptance gate my RCA (docs/F-035-RCA.md) missed. Need an A/B/C ruling before I proceed.\n  6│\n  7│---\n   │...\n 13│\n*14│**`crates/spt/tests/idle_edge_drain_e2e.rs:89`** — `fn spool_while_active_then_idle_fires_injection`\n*15│`// [int->REQ-MSG-IDLE-EDGE-DRAIN] [int->REQ-HAZARD-DELIVERY-STARVATION]`\n 16│\n 17│- **Setup:** spools `spool_message_deferred_at(perch, \"peer\", …)` — which is\n 18│  `insert_message(…, WINDOW_ACTIVE_ONLY, …)` (spool.rs:363). So the row is\n   │...\n 26│\n*27│`REQ-MSG-IDLE-EDGE-DRAIN` (F-023 leg 2) and `REQ-SEND-WINDOW-DRAIN-HONOR` (F-035) are\n 28│directly incompatible for the relay-less spt-hosted class. The active/idle asymmetry I\n 29│called a bug in the RCA is **intentional** for that class.\n 30│\n   │...\n 35│For an **spt-hosted** endpoint (broker owns the PTY, `controllable`, relay-less), the\n*36│idle-edge/parked drain is the **ONLY** carrier for an `active_only` row. Traced every path:\n 37│\n 38│| carrier | `active_only` to spt-hosted? |\n 39│|---|---|\n   │...\n 41│| Send-time idle re-offer (`cli.rs:5734`) | **NO** — gated `&& !active_only`. |\n*42│| Hook poll `drain_active_window` (`api poll`) | **N/A** — that is the HARNESS-hosted hook channel; an spt-hosted endpoint has no `api poll` harness. |\n*43│| **Idle-edge / parked drain `drain_idle_spool`** | **YES** — the F-023 leg-2 behavior (`include_deferred = !resting`). **This is the only carrier.** |\n 44│\n 45│So: `active_only` is designed as *\"the active **hook** window\"* — meant for\n 46│**harness-hosted** endpoints that `api poll`. An **spt-hosted** endpoint has no hook, so\n   │...\n 59│  `active_only`+spt-hosted is knowingly revoked (that class starves, or gets an\n*60│  evaporate/refuse-at-send policy instead). Requires re-scoping `REQ-MSG-IDLE-EDGE-DRAIN`\n 61│  + rewriting its int.\n 62│- **(B) never-starve wins** — the idle edge *should* carry `active_only` to spt-hosted\n 63│  (F-023 correct). Then **F-035 is mis-scoped**: *\"never wakes\"* is the **harness** hook\n   │...\n 65│  never a contract for the hook-less spt-hosted class. **RETIRE or NARROW\n*66│  REQ-SEND-WINDOW-DRAIN-HONOR; no code change.**\n 67│- **(C) class split** — spt-hosted delivers `active_only` at idle **without waking**\n 68│  (non-interrupting background inject) vs harness-hosted holds-for-poll. New behavior,\n 69│  larger; needs a \"deliver-but-don't-wake\" inject mode the translation binary honors.\n   │...\n 75│designed** — it is the only way that class can ever be delivered. If the true concern is\n*76│*\"it interrupts,\"* that is **(C)**, not the drain-exclusion of **(A)**. But this is your call.\n 77│\n 78│My WIP (spool.rs window-axis collapse + inject.rs + 2 units) is staged **uncommitted** — I\n 79│touched neither delivery.rs nor worker.rs. Standing by for A / B / C.\n## F-035-RCA.md\n  *1│<!-- [doc->REQ-SEND-WINDOW-DRAIN-HONOR] F-035 RCA — report-before-fix. -->\n  *2│# F-035 RCA — idle-edge parked-drain ignores the delivery-window tag\n   3│\n   4│**Status:** RCA-first, **report before fixing** (doyle-dispatched 2026-07-09).\n  *5│**REQ:** `REQ-SEND-WINDOW-DRAIN-HONOR` (registered, `required_stages = []` — activate on doyle's fix ruling).\n   6│**Investigator:** todlando. **Off:** `origin/main@2c05dc9` (v0.30.2).\n   7│\n   8│---\n    │...\n  20│\n *21│For an **spt-hosted, relay-less** endpoint (the class the idle-edge drain targets),\n  22│such a row is delivered through the translation binary at the idle window — the\n  23│exact delivery the tag forbids.\n  24│\n    │...\n  42│\n *43│### ACTIVE drain — honors the axis (correct)\n  44│\n *45│`spool::drain_active_window_inner`:\n  46│\n  47│```\n  48│include_deferred ? \"WHERE delivered=0 AND \\\"window\\\" != 'idle_only'\"\n    │...\n  53│\n *54│### IDLE-edge drain — ignores the axis (the bug)\n  55│\n *56│`spool::claim_idle_edge_inner` (reached via `spt_daemon::inject::drain_idle_spool`\n *57│— the **one shared leg** the active→idle edge drain `delivery.rs:drain_idle_window`,\n  58│the send-time already-idle path, and the pulse re-offer belt all call):\n  59│\n  60│```\n    │...\n  66│\n *67│`drain_idle_spool` passes:\n  68│\n  69│```\n  70│let include_deferred = !crate::resting::deferred_held(&perch_path);\n    │...\n  78│\n *79│The drain **conflates two orthogonal axes**, using the `deferred` flag for both:\n  80│\n  81│1. **Resting gate** (REQ-INST-6 / KH 1.4): *hold deferred rows while the owner is\n  82│   dormant.*\n    │...\n 101│  `active_only`→idle direction is wrong.\n*102│- **\"It's `drain_idle_window`'s caller.\"** No — the caller correctly fires on the\n 103│  edge; the defect is the SQL selection in `claim_idle_edge_inner` (the shared spool\n 104│  leg), so every one of the three callers inherits it.\n 105│\n    │...\n 109│\n*110│Mirror the active drain: make the idle claim honor the **`window` axis**, excluding\n 111│`active_only` unconditionally, and keep the resting hold as an **orthogonal** filter.\n 112│\n 113│```\n*114│-- idle-window eligibility (mirror image of drain_active_window_inner):\n 115│WHERE delivered=0 AND \"window\" != 'active_only'\n 116│```\n 117│\n    │...\n 119│dormant) rather than *defining* it. Net effect: `default` + `idle_only` ride the\n*120│idle window; `active_only` never does; the two drains become mirror images on the\n 121│`window` axis.\n 122│\n 123│**Open ruling for doyle:** whether the resting `include_deferred` parameter on the\n    │...\n 139│\n*140│Kin: `REQ-MSG-DELIVERY-AXES`, `REQ-MSG-IDLE-EDGE-DRAIN`, `REQ-IDLE-PARKED-DELIVERY`,\n 141│`REQ-INST-6` (the resting gate it conflates).\n## F-035-RELAY-RCA.md\n 12│I traced every way an `active_only` row could reach lia's relay (its live PollListener\n*13│via `deliver_tcp`, OR its backlog via `drain_backlog`). **All are closed on current main:**\n 14│\n 15│| path | carries active_only to the relay? | why not |\n 16│|---|---|---|\n   │...\n 18│| Cross-node `spt send` (WAN) | **NO** | `cli.rs:5762` — a remote active_only that misses locally returns *\"active-only stays local-only\"* and does NOT `wan_send`. The `WanMessage` wire record has **no window field** (wanmsg.rs:38), and the sender deliberately keeps active_only local-only rather than drop the class over the wire. So active_only never reaches `receive_wan`/`deliver_tcp` (wan.rs:300). |\n*19│| Relay backlog (`relay.rs:63 drain_backlog`) | **NO** | `drain_non_deferred` = `WHERE delivered=0 AND deferred=0`; `deferred=1 IFF active_only` (spool.rs:46). Excluded. (doyle already confirmed.) |\n 20│| Relay live-poll-forward (`relay.rs:77 pump_once`) | **NO** | Its only feed is `deliver_tcp`→the PollListener; no unguarded `deliver_tcp` of an active_only user msg exists (`deliver::deliver` callers = ring/ready ping-pong + tests; `reporting.rs:456` is a notif frame; `reporting.rs:161` shell-context uses `send_deferred`→**spool**, not tcp). |\n*21│| Parked-idle re-offer belt (`livehost.rs:265 drain_idle_spool`) | **NO** | BELT-1 `relay_present → Skip` (livehost.rs:495); and `claim_idle_edge` (post-nothing) is guarded `is_spt_hosted_no_relay`. lia has a relay → never runs. |\n*22│| busy→idle relay start (`relay.rs:90 run`→`drain_backlog`) | **NO** | same `drain_non_deferred` exclusion — on going idle, only `default`+`idle_only` spooled-while-busy rows drain to the relay; active_only stays spooled for the next busy poll. |\n 23│\n 24│The **only** carrier for a spooled active_only row is lia's hook **poll**\n*25│(`api poll`→`poll_drain`→`drain_active_window`, `WHERE \"window\" != 'idle_only'`, which\n 26│includes active_only) → delivered to the **polling session's stdout**, never the relay.\n 27│\n 28│**Conclusion:** on current main, spt-core's send/deliver/relay/spool/poll legs do **not**\n*29│leak active_only to a relay. Corrected-scope `REQ-SEND-WINDOW-DRAIN-HONOR` (poll-only for\n 30│a relay-bearing live agent) appears **already satisfied** by these legs.\n 31│\n 32│---\n   │...\n 43│   (spt-claude-code) job, not spt-core's `api state idle`. If the adapter does a final\n*44│   `api poll` on going idle (draining active_only) and injects the result into the\n 45│   now-idle session, that's an adapter route — outside these legs. → perri's lane.\n 46│3. **A repro detail I'm missing.** → Need the exact send form (`spt send --active-only`?\n 47│   a shell-context/`send_deferred`? a notify?), the sender's node vs lia's node\n## FAULT-MATRIX.md\n 57│| P3 | **Relay unreachable** (n0 outage / air-gap) | WAN dials needing relay fail; LAN/direct unaffected | Everything local | D9 two-host |\n*58│| P4 | **PTY broker drain thread dies** | That session's output stalls | Other sessions, net side | with terminal-wrapper hardening |\n 59│| P5 | **Manifest invocation hangs** (adapter subprocess) | That endpoint's lifecycle op | Daemon scheduler (KH 5.3 timeouts + 7.4 non-blocking) | when daemon hosts N agent loops |\n 60│| P6 | **Registry feed flood** (malicious/buggy peer spams updates) | Bounded by ring caps + lease; CPU cost unmeasured | — | D9 + REQ-SEC-1 outer gate |\n 61│| P7 | **Closed-watcher starvation** (net runtime saturated) | Presence lags behind reality | Conn table eventually consistent | D9 chaos pass |\n## KNOWN-HAZARDS.md\n  11│### 1.1 Phantom INIT_SIGNOFF after grace period\n *12│- **Failure:** orphan teardown enqueues INIT_SIGNOFF before the grace-period recheck; a transient Self recovery (binary handoff, brief stale poll) makes the recheck pass-as-alive, but the signoff was already spooled and drains on the next iteration → teardown despite a live Self.\n  13│- **Invariant:** grace-period wait MUST complete *before* composing/delivering INIT_SIGNOFF; the recheck must bind `still_gone` before any envelope write.\n  14│- **spt-core mapping:** in-daemon now (no separate wrapper), but the ordering invariant is identical — orphan/teardown logic must re-evaluate liveness after the grace wait, not before enqueue.\n  15│- **Sister cite:** `src/live/wrapper/orphan.rs:201-259` (sleep@209 precedes compose@231-251); tests T-grace-recovery:576, T-still-gone-recheck:618.\n    │...\n  29│### 1.4 Deferred spool rows must not leak to the event stream\n *30│- **Failure:** a hook spools a deferred (spool-only, no TCP wake) notice; startup `drain_all` flushes ALL rows including deferred → event emitted at wrong time/priority.\n *31│- **Invariant:** startup drain (and idle/timeout TCP-wake sites) use `drain_non_deferred` only; deferred rows are picked up by their intended consumer via `peek`. All drain sites must agree on which rows they flush.\n *32│- **spt-core mapping:** carries directly — the daemon's spool-drain has the same deferred-vs-immediate distinction.\n *33│- **Sister cite:** `src/owl/poll.rs:276-316`; `spool::drain_non_deferred_with_metadata`.\n  34│\n  35│### 1.5 Worker (working-perch) lifecycle path consistency\n  36│- **Failure:** subagent-start creates the perch at one path layout; later hooks read it at another → not found; stop-hook scan misses nested perches.\n    │...\n 120│\n*121│### 4.4 Deferred rows survive poll drain\n*122│- **Failure:** poll `drain_all` flushes a deferred (spool-only) message meant for a hook consumer → message lost.\n*123│- **Invariant:** deferred rows are never flushed by the event-stream drain; only `drain_non_deferred_*` / `peek_all` touch them.\n 124│- **Sister cite:** CHANGELOG v1.11.20; `src/common/spool.rs`. (See also 1.4.)\n 125│\n 126│### 4.5 Inbox legacy compat must not double-deliver\n    │...\n 128│- **Invariant:** spool is the sole read path at poll time; inbox is write-for-compat only and never read.\n*129│- **spt-core mapping:** clean-room — likely drop the legacy inbox entirely. If kept for any compat, preserve \"never read at drain time.\"\n 130│- **Sister cite:** `src/common/inbox.rs`.\n 131│\n 132│### 4.6 Addressable-id charset reserves the address delimiters\n    │...\n 201│- **Failure:** a broker reading a ConPTY master sees only the 4-byte startup query `ESC [ 6 n` and then nothing — the child looks hung/silent but is producing output normally. ConPTY blocks all child stdout until the terminal answers the cursor-position query.\n*202│- **Invariant:** every ConPTY reader auto-answers DSR (`ESC [ 6 n` → write `ESC [ 1;1 R`, or a real cursor position) on the PTY writer. Secondary: a ConPTY master does not EOF while the writer is held, so read loops drain on a thread and never gate exit on a blocking `read()`.\n*203│- **spt-core mapping:** `spt-term` broker PTY reader (ADR-0004). Brand-new to spt-core — not in the sister project (it never hosted ConPTY directly).\n 204│- **Source:** Spike #1 (`docs/spikes/SPIKE-01-broker-handoff.md`); reproduced with both a Rust child and `cmd.exe`.\n 205│\n 206│<!-- [doc->REQ-HAZARD-DETACHED-PIPE-INHERIT] -->\n    │...\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*410│- **Failure:** the W2.5 controller/viewer model lets ANY number of read-only `--view` attachers ride one session's broker `OutputLog`. The single drain thread fans each output chunk to every attacher. If a viewer's socket is fanned out with a **blocking** write under the log lock (the controller's authoritative path), one wedged viewer (a slow terminal, a black-holed WAN peer, a hostile non-reader) stalls the drain — freezing the controller's stream and backing up the PTY child. A single watcher must n...\n*411│- **Invariant:** the drain writes the **controller** on the authoritative blocking bounded path (it alone advances `delivered_through`), but each **viewer** gets an **isolated bounded SPSC queue + a dedicated writer thread**; the drain `try_send`s under the log lock and **evicts** any viewer whose queue is `Full` (fell behind the live stream) or `Disconnected` (its writer died on a dead socket) — the drain thread **never touches a viewer socket**, so no viewer write can backpressure it. A **soft cap** ...\n 412│- **spt-core mapping:** `OutputLog::append` (controller blocking + `viewer_send_evicts` `try_send` fan-out), `OutputLog::add_viewer` (bounded `sync_channel(VIEWER_CHANNEL_DEPTH)` + `viewer_writer` thread), `MAX_VIEWERS` soft cap, `ViewerSink`. Unit: `viewer_overflow_or_disconnect_evicts_never_blocks`. Int: `wedged_viewer_does_not_stall_controller` (a non-reading viewer is evicted while the controller keeps receiving past a 200KB burst).\n 413│- **Source:** M12 W2.5 controller/viewer model (doyle ruling 2026-06-14, Q1).\n 414│\n    │...\n 437│- **Failure (hypothesized, v0.12.0):** a legitimately dead PTY child (crash/kill) plus an `rc` pump dropped without a clean detach (closed tab) was thought to make the broker's loopback forward `write_all` block forever on a full 64 KB duplex, park a worker in the 2-worker net runtime, saturate both, and stall every new attach / `endpoint run` (with `daemon stop` unable to join).\n*438│- **Invariant — DISPOSITION = PROVE-DON'T-CHANGE** (doyle GATE-PASS @e883f45, 2026-06-18): the post-L0 code ALREADY prevents the wedge; NO fail-fast / worker-count code was added. (1) `serve_attach` forwards fire-and-forget (`net_stream_send` `op_id=None`) and the broker-side `send_stream` is already deadline-bounded (`bounded_block_on`, `BROKER_QUIC_OP_TIMEOUT_MS` = 10s — hazard 7.8), not forever. (2) the loopback duplex is drained broker-INTERNALLY by the operator row's OWN read pump (`nethost.rs` ...\n 439│- **spt-core mapping:** int `crates/spt/tests/attach_wedge_e2e.rs` (REAL detached daemon + dummy-harness fixture): serve the victim (rc sees its tick), abruptly kill rc (dropped pump) + kill the PTY child → a NEW endpoint still comes online + is served (no wedge), the dead endpoint is offlined within a tick (`LIVENESS_RECONCILE_OFFLINE`), `daemon stop` bounded. Leans on 7.8 (the QUIC-op deadline) + 7.7 (viewer isolation).\n 440│- **Source:** v0.12.0 real-harness finding (operator) → v0.12.1 L2 @e883f45; doyle GATE-PASS 2026-06-18.\n 441│\n*442│### 7.12 Controller output must NOT be written inline on the drain thread — a backed-up controller wedges the session  `[REQ-HAZARD-INJECT-CONTROL-COEXIST]`\n*443│- **Failure (v0.12.x, operator dogfooding + doyle /diagnose 2026-06-19):** `OutputLog::append` fanned each live chunk to the CONTROLLER via a SYNCHRONOUS, blocking `write_frame` held INLINE on the session's single drain thread while `Mutex<OutputLog>` was locked (viewers already had a dedicated writer thread + bounded evicting channel). A backed-up controller socket — a slow operator, or the full 64 KB `rc` loopback duplex under heavy TUI redraw — parked the drain thread WITH THE LOG LOCK HELD: outpu...\n*444│- **Invariant:** controller delivery runs OFF the drain thread — a dedicated controller writer thread + bounded channel (the 7.7 viewer_writer pattern) does the blocking socket write; the drain hands each chunk off with a BOUNDED, OFF-LOCK send (deadline → detach + `clear_controller`, never park forever, never silently evict a LIVE operator's authoritative view). The controller is AUTHORITATIVE (unlike a viewer): its writer advances the `delivered_through` resume cursor (atomic, only-on-success, mono...\n 445│- **spt-core mapping:** impl `broker.rs` `OutputLog::append`/`controller_writer`/`become_controller`/`ControllerJob::deliver`/`clear_controller`; int `crates/spt-daemon/tests/inject_control_wedge.rs` (a fully-backed-up controller keeps `KIND_SESSIONS` answering = no wedge); unit the bounded-deliver + monotonic-cursor kernels. The input-side parks (write_input `write_all` on a full buffer; DSR-answer writer-mutex contention) are BENIGN on Windows ConPTY (absorbs a large inject), real only on Unix forkpty ...\n 446│- **Source:** v0.12.x operator wedge → v0.13.0 W1 (doyle GATE-PASS 2026-06-19).\n 447│\n    │...\n 455│### 7.14 The effect journal must NOT hold its lock across the PTY write (or fsync every keystroke) — interactive input stutters then wedges  `[REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE]`\n*456│- **Failure (operator dogfooding + doyle /diagnose, MEASURED on the real Windows box, 2026-06-19, post-W1 escape):** `EffectJournal::apply_once` held its global `inner` mutex ACROSS `write_line(PENDING)` → `effect()` → `write_line(DONE)`, and `write_line` does `flush()+sync_all()` (a full fsync). Every operator keystroke is a `PtyWrite` effect (via `send_effect` → `dispatch_input` op_id branch), so each paid TWO fsyncs serialized under a GLOBAL lock with the blocking PTY write INSIDE the lock. Two ...\n 457│- **Invariant:** `apply_once` RELEASES the inner lock across `effect()` — reserve the key (fsync `PENDING` for DURABLE kinds) under the lock, RELEASE, run the effect OFF the lock, then re-acquire to finalize (fsync `DONE` for durable, mark applied). Crash-idempotency comes from the per-key reservation + the applied-set, not from holding the lock across the effect (the brain-crash guarantee is unchanged: the broker survives the brain, so reserve→effect→finalize runs uninterrupted on the broker threa...\n 458│- **spt-core mapping:** impl `effect.rs` `apply_once` (reserve/release/finalize) + `EffectKind::is_durable`; unit (`effect.rs`) a barrier proving the lock is NOT held across `effect()` (a different key's `apply_once` completes while one effect blocks) + `PtyWrite` writes no journal line while a durable kind (`NetSend`) does (the no-fsync proxy); int `crates/spt-daemon/tests/inject_control_wedge.rs` (real broker+PTY, a stalled consumer + sustained blocking input effect: a concurrent `spt rc` attach stays ...\n 459│- **Source:** v0.13.0 W1b (operator dogfooding post-W1 escape; doyle /diagnose + measurement 2026-06-19).\n## MSG-IDENTITY-DISPATCH.md\n 56│  send to BUSY doyle delivered via BOTH poll AND relay (spool row 156 `taken_leg='idle-inject'`).\n*57│  Pin with spool-audit: poll-drain vs relay delivered=1 ordering; busy→idle edge re-offer;\n 58│  take-mark atomicity. Then: one atomic cross-carrier claim per row.\n*59│- `REQ-RELAY-NO-BUSY-DELIVER` [impl,unit] — companion: idle-edge drain re-verifies activity /\n 60│  defers to the claim. May REDUCE to an ordering assertion under the exclusive claim — doyle\n 61│  rules at RCA lock; don't build blind. **Do not break** F-023 anti-starvation +\n 62│  REQ-IDLE-PARKED-DELIVERY (already-idle delivery stays green).\n## NEXT-MILESTONE-BUG-TRIAGE.md\n 188│NEW: hfenduleam→enlyzeam ALSO failed to deliver, BOTH IPs stable. So address-staleness (prior cause (a)) is NOT the whole story, and the no-reply-leg (b) explains silent-LOSS but not WHY nothing delivers AT ALL. Need a DEEPER dive into the actual delivery path on a stable-IP pair: receiver perch-resolution, access gate (Refused?), spool-not-inject, whether the WAN stream even reaches receive_wan, whether the connection/membership-proof actually establishes. The false-SENT(WAN) (b) stands as a separate ...\n*189│- **Root cause (agent F, conf H):** the REAL drop is the DATA-PATH (candidate #4). `spt send` resolves the dial with id-only `addr_for_node_hex` (wansend.rs:79/207/333 → endpoint.rs:538-541 = EndpointAddr::new(id), ZERO direct paths/relay) → EVERY send forces a fresh iroh DISCOVERY round-trip (mDNS/n0-DNS/relay). The gossip PUMP — which makes the nodes \"mutually visible\" — instead uses `dial_seeded` (pump/mod.rs:694-716): tries the durable last-known direct addr from PeerAddrStore FIRST + caches ...\n 190│- **Fix (conf H, effort M):** route WAN dial through the pump's seeded-direct-addr resolution (PeerAddrStore first, id-only fallback — mirror dial_seeded); PAIR with (b) the ack reply-leg (receiver writes WanOutcome back, sender blocks under QUIC deadline → honest CLI + retry next addr). Contributing/lower-now: proactive addr-refresh on local IP change (a). **Confirm field (read-only):** PeerAddrStore peer-addrs.json WILL hold a good direct addr the send never tries; add a WanOutcome eprintln at disp...\n 191│\n 192│### D-#12 — REOPENED: `rc` garbled but `endpoint run --attach` renders FINE (same Win10/pwsh env)\n## NEXT-MILESTONE-LIFECYCLETRUTH-TRIAGE.md\n  52│Root, rig-CONFIRMED (NtSuspendProcess on the brain, no update involved): PTY viewer fan-out\n *53│and control mutations depend synchronously on a live, DRAINING brain — brain-subscriber\n  54│session-output writes ride UNDER the per-session log lock (broker.rs:19-20). Failed writes are\n  55│handled (cursor freeze + detach, :3486); BLOCKED writes are not. Suspended brain ⇒ within\n  56│seconds: attached rc output freezes; detach does NOT release the control stamp (release routes\n    │...\n  58│healthy. Field: every brain cycle (incl. every `update apply`) has a freeze window; a stalled\n *59│or slow-draining new brain (6 sessions + psyches + WAN on the incident night) = permanent\n *60│wedge until bounce. `brain.ready` ≠ subscribers drained — why the 22:47 apply \"promoted\"\n  61│while frozen.\n  62│Fix shape (todlando proposes, doyle rules before impl): subscriber writes move OFF the log\n  63│lock (bounded/nonblocking, stall ⇒ detach-subscriber like viewer eviction — the broker already\n    │...\n  75│previously-online spt-hosted endpoints (records exist: info.json status + adapter + cwd);\n *76│alternatively stop performs a drain/handoff. Scope ruling (doyle): re-run-on-start, marked\n  77│`start-reason=daemon-restart`; agents' minds ride psyche re-host as today.\n  78│Int: endpoint online → daemon stop → start → endpoint back ONLINE, same id, harness respawned.\n  79│\n    │...\n 131│> endpoint PARKS (not lost) and flushes only when inbound activity wakes the target's\n*132│> delivery drain. Confirmed clean wake trigger: todlando's W2-proposal parts (part-1\n 133│> tail + 3/4) sat parked at doyle's perch for HOURS, then flushed the instant perri's\n*134│> idle-inject probe woke doyle's drain — parked, not truncated. **(b) live-SENT\n 135│> truncation/empty-body** = REQ-INJECT-MULTILINE-INTEGRITY (below) — a genuinely\n 136│> mangled payload on the typed leg, unrecoverable (no spool copy). Do NOT conflate:\n 137│> (a) is a scheduling/wake gap (bytes intact, late); (b) is byte corruption in transit.\n    │...\n 173│Root (live during this very dispatch, 2026-07-07): a message QUEUED to an ALREADY-idle\n*174│endpoint sleeps indefinitely — the idle-edge drain (F-023 leg 2) fires only on the\n 175│ACTIVE→IDLE transition, and no new edge ever comes for a parked session; the send-time inject\n 176│didn't carry it either (both doyle→todlando milestone dispatches sat delivered=0 in the spool\n 177│while the endpoint showed ONLINE). Fix: send-time inject must fire for an already-idle\n    │...\n 181│Live confirmation (2026-07-07): parked messages flush the moment inbound activity wakes\n*182│the target's delivery drain (doyle's parked W2-proposal parts flushed on perri's\n 183│idle-inject probe) — the wake trigger is real, so the fix is \"make the send-time inject\n 184│fire for an already-idle target\" / \"sweep on the pulse tick\", not a new wake mechanism.\n 185│\n## NEXT-MILESTONE-PICKER-POLISH-TRIAGE.md\n 181│   file. The loop-top stray-command drop (:1337) already neutralizes a LATE\n*182│   `{commit}` from the missed sequence; note the residual mid-drain\n 183│   mis-attribution window (old sequence's dribbling commands during the next\n*184│   event's drain) — todlando picks the drain discipline, the existing\n 185│   stray-drop is likely sufficient (binaries emit fast).\n 186│2. **Strike budget for REAL wedges:** N CONSECUTIVE misses with no intervening\n 187│   successful commit (N=3 proposed) → then fault as today (terminate + latch +\n    │...\n 237│  3. **NEW — respool-once (dead-letter):** under miss≠fault, a respooled\n*238│     zero-record envelope (the duplicate FIRE) redelivers on a later drain →\n 239│     misses again → respools again = an INFINITE cycle of 5 s floor-holds and\n 240│     strike churn. A missed envelope respools AT MOST ONCE; a second miss\n 241│     dead-letters it LOUDLY (stderr + counts toward the perch fault surface,\n## NEXT-MILESTONE-REMOTETRUTH-TRIAGE.md\n 201│Wire-level severance detection stays with the EXISTING paths (conn EOF,\n*202│unsubscribe, drain deadline-evict) — B-1's poison fix un-wedged exactly the\n 203│cleanup that failed on ball-b, and QUIC keepalive surfaces an idle-severed\n 204│conn as an EOF eventually. Fix shape (recorded-truth, Q5 kin):\n 205│- Broker gains an authoritative **live-controller query** per session id\n## NEXT-MILESTONE-WORKERTRUTH-TRIAGE.md\n 15│*deliberate* soft-cleanup (REQ-HAZARD-SOFT-CLEANUP: preserve info.json + spool\n*16│so in-flight results drain). The bug is not the preservation, it is that a\n 17│soft-stopped worker still renders as a permanent OFFLINE row in the default\n 18│`endpoint list`. Fix = visibility (V-1) + reap (W-3), not hard-delete on stop\n 19│(the cascade-wipe guard rationale stands).\n## PUMP-W2-BUILD-DELTA.md\n 10│\n*11│Your G2: \"one carrier ... split to a dedicated event-drain carrier ONLY if the\n*12│impl shows submit backpressure entangling the drain deadline.\" The trigger is\n 13│**stronger than backpressure — it's exactly-once correctness (gotcha #1):**\n 14│\n 15│- The pump's `peer_step` pull legs (sync `request_sync`, update `request_update`)\n   │...\n 19│  doesn't want, `read_event_until` has ALREADY advanced `presence_cursor`\n*20│  (`*cursor = ev.seq + 1`) and the caller's `_ => continue` DROPS it. The drain\n 21│  loop then never sees that CONNECTED/DIAL_FAILED → **cursor advanced, outcome\n 22│  lost** → a peer silently never-rescheduled OR a phantom gap. Single carrier\n 23│  breaks the D4c exactly-once property W2 leans on.\n 24│- **Resolution:** a second pump-mode brain `events` OWNS the presence\n*25│  subscription + drain; the primary `brain` OWNS dial-submit acks + `peer_step`\n 26│  IO. Neither swallows the other by construction (separate socket → separate\n*27│  reader thread → separate frame channel). This is your named fallback, adopted.\n 28│\n*29│## Δ2 — drain is NON-BLOCKING (`try_recv`), deadline only bounds the submit-wait\n 30│\n 31│The split carrier is a reader-thread + `Receiver<io::Result<Envelope>>`\n*32│(`BrainConn::Split`). So the drain reads **available** events via `try_recv`\n*33│(new `Brain::drain_presence_now`) — NOT a per-round blocking wait. Round shape:\n 34│\n 35│- submit K non-blocking dials for not-connected / not-backed-off due peers;\n 36│- run `peer_step` NOW for already-connected due peers (on `brain`);\n*37│- drain: pull all available presence events (`try_recv`); if K>0 submits are\n 38│  outstanding, `recv_timeout` up to the **round deadline** = `brain::\n 39│  PEER_REPLY_READ_BUDGET + 2s` (symbolic, Δ Q1) for their outcomes; on CONNECTED\n 40│  run that peer's due legs in the SAME round; on DIAL_FAILED back the peer off;\n   │...\n 47│- **dead BROKER still restarts:** a dead broker closes the IPC conn → the\n*48│  `events` reader thread hits EOF → `frames` channel `Disconnected` →\n 49│  `read_frame_until` returns an error → `run_peer_pump` returns Err → supervise\n 50│  restarts. (The primary `brain` also still bubbles a genuine carrier-op\n 51│  `TimedOut` → restart — W1's carrier-desync path, KEPT.)\n## PUMP-W2-BUILD-GO.md\n 15│## Build (per the approved design — restated for the gate, not re-opened)\n*16│- **G1** EXTEND `NetPresenceEvent`: new `PRESENCE_DIAL_FAILED` kind + optional `reason`; correlation by existing `remote_id_hex` (conn_id:0 sentinel on fail). One cursor / exactly-once drain.\n*17│- **G2** ONE carrier: `submit_dial` fire-and-forget → drain non-blocking with a broker-LIVENESS deadline only. Re-points `REQ-HAZARD-PUMP-IPC-DEADLINE` to broker-conn health (split only if backpressure entangles).\n*18│- **G3** Round closes on the **derived DEADLINE** (submit-all → drain-until-round-timeout → `mark_ran`), NOT all-resolved. Preserves §V4 stagger + per-leg cadence + per-peer worker ordering. Heartbeat advances regardless.\n 19│- **G4** Concurrency on the BROKER + bounded **NetHost-SHARED** semaphore (Q2 CAVEAT: the existing blocking `dial()` MUST acquire the SAME permit, else the cap is bypassed).\n 20│- **G5** Per-peer doubling backoff, capped, reset on success. **Q3:** a mid-round `peer_step` fail = per-peer drop+backoff same as `DIAL_FAILED`, never round-wide; `DISCONNECTED` stays NO-backoff (redial-eligible immediately) — only `DIAL_FAILED` backs off.\n 21│- New non-blocking broker verb `KIND_NET_DIAL_SUBMIT` (payload `NetDialReq`); `NetHost::submit_dial` spawns under the semaphore, same bounded connect, outcome → `PresenceLog`.\n   │...\n 24│- **int (load-bearing):** mixed roster 1 LIVE + N OFFLINE peers — the live peer connects AND this node advertises presence in the SAME round the offline peers fail; heartbeat advances every round; **no `PEER_PUMP_RESTART` from a dead peer**; a dead peer never blocks the live one (head-of-line-block gate). PLUS: a dead BROKER conn STILL trips `supervise_pump` (the re-pointed IPC-deadline — verify it survived the decouple; assert BOTH directions).\n*25│- exactly-once / gapless drain preserved (D4c cursor discipline — no dropped/duplicated outcome under a mid-round broker restart).\n 26│- §V4 stagger + per-leg cadence (registry/notif/sync/update) preserved under the event-driven round.\n 27│- `traceable-reqs check --json` exit 0 (REQ-PUMP-PEER-ISOLATION +impl +unit +int); `clippy --workspace --all-targets -D warnings` clean.\n 28│- Regression: the W1 pumpdeadline suite + full-round black-holing-peer + self-drive + two-tier-sync/torn-pull happy paths all still green.\n## PUMP-W2-DESIGN.md\n 31│6. **Per-peer state** — `HashMap<peer_hex, PeerSched { next_due: Instant, backoff: Duration }>` (G5). A peer is dial-eligible this round iff `now >= next_due`. On `DIAL_FAILED` → `backoff = (backoff*2).min(PEER_BACKOFF_CAP≈300s)`, `next_due = now + backoff`. On `CONNECTED` (success) → reset (`backoff = base`, remove/zero). Live peers stay hot; a persistently-dead peer backs off, never re-dialed every tick.\n*32│7. **Round = submit-all → drain-until-deadline → mark_ran** (G3, wedge-proof):\n 33│   - compute `due_flags` (cadence, unchanged) + `pre_rounds` (unchanged).\n 34│   - `fan_targets` → for each peer NOT in backoff and NOT already-connected → **submit** a non-blocking dial (fire-and-forget). Concurrent on the broker.\n*35│   - **drain** the presence stream until a **round deadline** `ROUND_DRAIN_TIMEOUT` = a **derived const** `W1_final_bound + ~2s margin` (doyle Q1: NOT a config knob — reference W1's bound constant directly, **pin the value when W1 lands its final bound**; the margin covers event IPC transit + drain scheduling; concurrent dials all resolve within ~one bound, not N×bound). For each event:\n 36│     - `CONNECTED{remote,conn_id}` → record conn; run that peer's due-worker `peer_step`s (the registry advertise / notif / sync / update legs) on its conn — **the live peer advertises presence the round it connects**, independent of offline peers. **If a `peer_step` errors mid-round** (a CONNECTED peer whose stream write fails — doyle Q3): drop that conn + apply the per-peer backoff, the SAME path as `DIAL_FAILED`, never round-wide (bubbling it round-wide would re-introduce the whole-round poison ...\n 37│     - `DIAL_FAILED{remote,reason}` → per-peer backoff (6); log `PUMP_PEER_FAIL:{remote}:{reason}` (the ordinary per-peer signal, now event-driven).\n 38│     - `DISCONNECTED{conn}` → drop the cached conn (redial-eligible next round).\n   │...\n 43│\n*44│The pump's brain carrier keeps a **short liveness deadline on the DRAIN read** — but now it means \"is the BROKER answering the event stream AT ALL,\" not \"did peer X reply.\" Concretely:\n 45│- a healthy round always produces stream activity (at minimum the pump's own submit acks + the round's outcome events) within the liveness window;\n*46│- if the drain read deadlines with the broker producing **nothing** (broker wedged / carrier dead) → `run_peer_pump` returns `Err` → `supervise_pump` restarts (the ORIGINAL 2.2h-wedge defense, intact);\n 47│- a dead PEER can no longer trip this — its `DIAL_FAILED` arrives within W1's bound as ordinary stream traffic. **Decouple achieved without losing the dead-broker restart.**\n 48│- The int test asserts BOTH directions: a dead peer never restarts; a dead broker conn STILL does.\n 49│\n   │...\n 58│## Files\n*59│`msg.rs` (kinds+fields+submit req), `nethost.rs` (`submit_dial`+semaphore+DIAL_FAILED append), `broker.rs` (`dispatch_net_dial_submit`), `brain.rs` (submit helper + the presence-drain already exists), `pump/mod.rs` (round restructure + per-peer sched), tests. Activate `REQ-PUMP-PEER-ISOLATION [impl,unit,int]` at build-start.\n 60│\n 61│## Q1–Q3 — RESOLVED (doyle design-check addendum, PUMP-W2-DISPATCH-RULING.md @ca2038b)\n 62│- **Q1 (round deadline):** RESOLVED — a **derived const** `W1_final_bound + ~2s`, NOT a config knob. Reference W1's bound constant; pin at W1 land (genuine W1-before-W2 dependency — don't hardcode 10s now). Folded into round loop above.\n## PUMP-W2-DISPATCH-RULING.md\n 14│\n*15│### G2 — carrier: **one carrier**, submit fire-and-forget + drain non-blocking with a **broker-liveness deadline only**\n*16│Neither operation blocks on a per-peer reply anymore, so one carrier is fine. The drain is a non-blocking \"read events available up to cursor,\" NOT a per-event deadline. **REQ-HAZARD-PUMP-IPC-DEADLINE's real purpose survives, re-pointed:** the drain keeps a SHORT deadline on *broker-conn liveness* (is the broker draining/answering the stream AT ALL) — a dead broker still trips `supervise_pump`; a dead PEER never does (its failure is an ordinary event within W1's bound). **Fallback trigger:** split to a...\n 17│\n*18│### G3 — round-close: **on a DEADLINE** (submit-all → drain-until-round-timeout → `mark_ran`), NOT all-resolved\n 19│All-peers-resolved is a NEW wedge risk: a lost/delayed outcome (or a slow broker) → the round never closes → the pump stalls again. Deadline-close is bounded and wedge-proof. Because dials are CONCURRENT, all outcomes arrive within ~one W1 bound (not N×bound), so **round-timeout ≈ W1 per-dial bound + a small margin**. Preserves the ADR-0018 §V4 stagger (`mark_ran` = ATTEMPTED, post-round instant) + exactly-once wake semantics. A peer unresolved at round-close = **reschedule that peer** (per-peer,...\n 20│\n 21│### G4 — concurrency: on the **BROKER**, fan-out-all with a **bounded cap**\n   │...\n 29│- **int (the load-bearing test):** a mixed roster — 1 LIVE + N OFFLINE peers — the live peer connects AND this node advertises presence in the SAME round the offline peers fail; heartbeat advances every round; **no `PEER_PUMP_RESTART` from a dead peer**; a dead peer never blocks the live one (the head-of-line-block gate). Plus: a dead BROKER conn STILL trips `supervise_pump` (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE — verify it didn't get lost in the decouple).\n*30│- exactly-once/gapless drain preserved (the D4c cursor discipline — no dropped/duplicated outcome under a mid-round broker restart).\n 31│- §V4 stagger + per-leg cadence (registry/notif/sync/update) preserved under the event-driven round.\n 32│\n 33│## Sequencing\n   │...\n 41│\n*42│- **Q1 — round-deadline value:** a **DERIVED CONST** = `W1_final_bound + fixed margin (~2s)`, NOT a config knob (no operator-facing tuning surface for an internal timing detail — a knob is a mis-tune/maintenance liability). Reference W1's bound constant directly; **pin the value when W1 lands its final bound** (genuine W1-before-W2 dependency — don't hardcode 10s now). Margin covers event IPC transit + drain scheduling + slack for the concurrent dials to all resolve (~one bound, not N×bound).\n 43│- **Q2 — semaphore home:** **NetHost-SHARED** (not pump-scoped). It guards the broker's iroh connection resource, which lives at the NetHost, and protects ALL dial callers (pump + shellwake + pairing) from a concurrent-dial storm — a pump-scoped limiter leaves the others unprotected + duplicates the concern. **CAVEAT (load-bearing):** the existing BLOCKING `dial()` MUST acquire the SAME permit too — otherwise the cap only bounds `submit_dial` while `net_dial` piles on unbounded on top, defeating th...\n 44│- **Q3 — `peer_step` failure mid-round (a CONNECTED peer whose worker step errors, e.g. stream write fails):** **per-peer drop + backoff, SAME path as `DIAL_FAILED`, never round-wide** (todlando's proposal — endorsed). A peer whose stream writes fail is effectively unreachable this round; drop its conn + apply the per-peer backoff; the round continues for other peers. Bubbling it round-wide would re-introduce the whole-round poison in a new spot. Don't build a separate transient-vs-dead distinction ...\n 45│\n## PUMP-W2-GATE-HANDOFF.md\n 15│- **Δ1 (approved): TWO carriers.** A 2nd pump brain `events` owns the presence\n*16│  drain; primary `brain` owns dial-submit acks + peer_step IO. Reason is stronger\n 17│  than G2's \"backpressure\" — a shared carrier's peer_step pull-reply read\n 18│  (`read_event_until`) advances `presence_cursor` then drops the presence frame =\n 19│  exactly-once break. PresenceLog is single-subscriber → primary brain\n   │...\n 24│  dead BROKER → carrier read Err → `run_peer_pump` returns Err = the restart\n*25│  trigger (`pump_w2_dead_broker_bubbles_err_for_restart`). Drain classifies\n 26│  `TimedOut`=quiet(break), any other read err=dead-carrier→Err→restart.\n 27│- **Q1** round deadline = `brain::PEER_REPLY_READ_BUDGET + 2s`, symbolic. **Q2**\n 28│  one shared NetHost semaphore, both `submit_dial` + blocking `dial()` acquire.\n## STORAGE.md\n  91│| endpoint lifecycle / status *audit trail* | **BranchStore** (or a derived view) | the *trajectory* matters, not just current value |\n *92│| spool (queue, drain-by-status, `id→address`) | **SQLite** | indexed queries + hot churn |\n  93│| broker effect journal (per-PTY-effect, B5) | **fsync-append** | hot path, per-keystroke — a commit per write is far too heavy |\n  94│| `info.json` / `status` (current value) | flat + atomic-rename (today) | tiny, read-hot; *may* move under BranchStore later, low priority |\n  95│\n    │...\n 188│  bind/boundary, context commit, rename, fork, purge) drop one tiny scope\n*189│  file each; the daemon's writer drains, debounces, and coalesces them into\n 190│  one refresh. Fire-and-forget and daemon-offline-safe (events accumulate\n 191│  and are consumed at the next brain start).\n 192│  <!-- [doc->REQ-PROJECT-INDEX-INVALIDATION] -->\n## UPDATE-WEDGE-2-ROUND3-CODEREAD.md\n 11│`brain.net_status()` → spawn-consumers-once → `brain.sessions()` (the counter-54 reap-drive,\n*12│brainproc.rs:276) → `write_ready`. It hosts NO PTY sessions, so it does not itself drain PTY\n 13│output. Neither IPC call blocks on a dead peer:\n 14│\n 15│- **`net_status()` is a cheap field read.** `dispatch_net_status` (broker.rs:3573) returns\n   │...\n 27│  write** (`controller_writer`, broker.rs:1418; docstring 1409-1411: *\"a backed-up controller\n*28│  blocks ONLY this thread, never the session drain which used to write inline under the log\n 29│  lock\"*). So a WEDGED writer cannot block the reap either.\n 30│- **Viewers drop, never block the producer** (`try_send` + eviction, broker.rs:1086/802).\n 31│\n   │...\n 49│\n*50│> when the brain conn backs up (the brain isn't draining fast enough — it only reads during\n 51│> the 500ms heartbeat's `net_status`/`sessions` calls), a subscriber writer BLOCKS inside\n 52│> `write_frame` while HOLDING `send.lock()` → the dispatch thread cannot acquire `send.lock()`\n 53│> to send the heartbeat reply → `net_status()`/`sessions()` never return → the heartbeat loop\n*54│> is stuck → the brain never drains its conn → the subscriber writer stays blocked. **A\n 55│> self-reinforcing deadlock on the brain conn's send mutex.**\n 56│\n*57│Once the heartbeat is stuck, the brain drains nothing; every subscriber writer on the brain\n 58│conn wedges; the broker-side controller writers whose sink is the brain conn cross\n 59│`BRAIN_WRITE_DEADLINE` → `BRAIN_SUBSCRIBER_STALL_EVICT`. Matches the field exactly.\n 60│\n   │...\n 76│The trigger is active-session OUTPUT backing up the brain conn faster than the 500ms\n*77│heartbeat drains it — on respawn (resume subscribes N + replay burst floods the conn before\n*78│the loop drains) and in steady state (an active streamer's output between heartbeats fills the\n 79│socket buffer; on v0.30.3 additionally compounded by the steal). The field always had dead\n 80│peers, but they are coincidental load, not the mechanism.\n 81│\n   │...\n 87│\n*88│- **(A) resume_sessions does NOT re-subscribe.** Drop the undrained continuity subscription\n 89│  entirely — the daemon brain has no consumer for it today. The brain conn then carries only\n 90│  request/reply → no subscriber backpressure → no deadlock. Smallest, brain-side, seamless.\n 91│  Forward-seam: when genuinely daemon-driven sessions land (the live-agent adapter), THOSE\n*92│  attach on a drained carrier (option B).\n*93│- **(B) Drain the brain conn on a DEDICATED reader thread** (`BrainConn::Split` — the exact\n 94│  carrier the pump already uses, brain.rs:230) so the heartbeat reply is never blocked by\n 95│  subscriber backpressure, and subscriptions can persist. Brain-side, seamless.\n 96│- **(C) [broker-side — deployment risk, FLAG] subscriber writers use a bounded/non-blocking","linesTruncated":true,"meta":{"limits":{"columnTruncated":{"maxColumn":512}}}},"isError":false,"timestamp":1784271751027}}
{"type":"message","id":"00ffd5b6","parentId":"d6b79028","timestamp":"2026-07-17T07:02:39.938Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning thread leak diagnostics**"},{"type":"toolCall","id":"call_xVpSq303C1kzqcfCG0semCbQ|fc_0a061eb498f0e908016a59d38fdaa881968d671d20915f0216","name":"grep","arguments":{"i":"Locating daemon log path","pattern":"daemon.log|stderr.*path|stderrlog|DAEMON_LOG|log_path","path":"crates/spt-daemon/src; crates/spt-store/src; crates/spt/src","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_zrcU2P6T60iKIfyVwEGMX8n3|fc_0a061eb498f0e908016a59d38fdabc8196b4f7d46e4e210a0c","name":"grep","arguments":{"i":"Locating status stream listing","pattern":"net-streams|NetStreams|stream_id|finished","path":"crates/spt/src; crates/spt-daemon/src/service.rs; crates/spt-daemon/src/brainproc.rs","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_zr0iTmTOWR7VmXE4Cbsq48OP|fc_0a061eb498f0e908016a59d38fdb3c8196a8ec6e690ce48b7c","name":"read","arguments":{"i":"Reading stderr persistence","path":"crates/spt-daemon/src/stderrlog.rs","selector":null}},{"type":"toolCall","id":"call_bv9HeaKlQZZ6SBtpax73jZ9g|fc_0a061eb498f0e908016a59d38fdb448196a81c4cc6b74597eb","name":"grep","arguments":{"i":"Finding status home output","pattern":"spt_home|SPT_HOME|identity","path":"crates/spt-daemon/src/endpoint.rs; crates/spt-store/src/home.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":28354,"output":389,"cacheRead":215552,"cacheWrite":0,"totalTokens":244295,"reasoningTokens":115,"cost":{"input":0.14177,"output":0.01167,"cacheRead":0.107776,"cacheWrite":0,"total":0.261216}},"stopReason":"toolUse","timestamp":1784271751071,"responseId":"resp_0a061eb498f0e908016a59d38751a48196b841194771cf1457","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a061eb498f0e908016a59d388cf308196a2bc4f7ea15ff26b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdOPJhNy8be8ItfE97HjCHpH9bDFgfke792ZJkHuyP5yx5AmewWPzgyVIL6kScP4YBuC9HwWUWuj8LzKnaegETg2e9vnXAEKekrgmyWagmGUnDldtvDW8lZ-GMu4tFQ6LgWhCbtJEExAVg6KfIbrzN1jgAcu8ASxbeD2C33Tgte--yPRLz2Lo0bZM-qnM--QFmWgtVYwG9OxU0_1GvM7u80Y8znhX2rjz5ceMybOzMqHLe20kV-evDVXKIF0sl-QP2I-TK1lSchsNCEuweK_Hvl5HLNbILY0EtxISdSCkr1vprABN3WU99MSTUPONxYsaO-aPvx8UVlTvn8o2bc9qVWTZjocXyvyE2vM9nPDNPja9XsLnOFIhsRWZTHzc42BPQ6PlsRTnxsK5-iccuNAl50welzU5cmgC1PBz6wOSI7bWUD_rtrB37sSCJtnupXURwSS_xGAIEqWPRBhDLdpyMj3mrANdCIFh8xPcG5sbYg1e1M5Swmgjk2Ao2qITvgEWGqwrOQrVxwdpuAkzxN5ZFXvDJy7ZXzSpM9_AQLIK9PxN9FLyT8RB1QTBDXlzunytb8EQPZPZv9TQsU_rqogYhSS39SRGRxR9ADK8YZJ_zqhXXrMVEhgLnj1YschVaWaubmuzTRI3_u3iTmjFeFmJ18DWc0kKYcSRIY0TWO-YXPTA8ALTj09UoTG1k88pEDMxZuy4AiYNKvvOIx6EUtKLj976Tw2r2K4hl4FOim-YU6xK5NxYDP8mtgewrX_Jdy1AlzjocGadZxBjAmwJffkUsmRjsytYQH2XYA9UkvKk9qcBjdZMOyFcDeYEttni3v_Ekn54pcFVeK-9zPxgCTmKeBOAGhVwm9era7YZdn1GRgMg0l0sF0BRIaOxNhZ6XXsdcd_xVrCARpSHi_AWfeBCiX6tfBpoe0zJ0v768UYPgd2TcPPbI3XaFdTRwQM6evfVO7A1YyJGJ-JjM2c4f8Ti7Q1HVXYLyxDzEgdC0GhaoQobJecP86fwj-AJQwTsCNp-CMpdZYJWAmUlETK9nk_AFYvO8W8oANPIRyo2_CPcL5wSoxst4xjfWG5-d9VcG01kDaHJ4iK_LsmTWQqx__F6gI9qGFgZfJBU07UB8Nx8lLjHe0x0o9Cy3jPvLJllXmGsqbnv5EMxJf3lPEpJFbQUEsFZ4MNkkMNcgFHBvHY8LehScvVTverB5wIONMCG6rJCERD-h1R_yMHDkDwfLCBfqf3rK-aIAty5_LoAtX7VYcdbWBdD51HRl6sCRFPzm__h6ROnAVqZbQREQNzMFOveH6beOOVsX0ah1rvJSuQ_VAquwJIyynIHJRu1-bAlQia5rWssbWeNa5TRc_jkrEhitfnLYNOsbBLq0NLQIurUUIpFTBP_uqumUqLxSEwrKou3hu8K4l0QuwwjL-Jp7CGXoDEFlIRkOuW6vJwyQvrKvH3b_wxQMPQgrgjdM9xhPQBMytoaAs21KmLd4x3426VqHeMp9GYIGKAkXuZaY1XjdmVFQQ-HzYDShK6oj-nCPWbmwl7tIaioYtH1bUa9-txU6yz4QxNFa3QVWgPLZc9AbA1auZMD3pS3tkFp_XqqIUZhqJP","summary":[{"type":"summary_text","text":"**Planning thread leak diagnostics**"}]},{"id":"fc_0a061eb498f0e908016a59d38fdaa881968d671d20915f0216","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating daemon log path\",\"pattern\":\"daemon.log|stderr.*path|stderrlog|DAEMON_LOG|log_path\",\"path\":\"crates/spt-daemon/src; crates/spt-store/src; crates/spt/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_xVpSq303C1kzqcfCG0semCbQ","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d38fdabc8196b4f7d46e4e210a0c","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating status stream listing\",\"pattern\":\"net-streams|NetStreams|stream_id|finished\",\"path\":\"crates/spt/src; crates/spt-daemon/src/service.rs; crates/spt-daemon/src/brainproc.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_zrcU2P6T60iKIfyVwEGMX8n3","name":"grep"},{"id":"fc_0a061eb498f0e908016a59d38fdb3c8196a8ec6e690ce48b7c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stderr persistence\",\"path\":\"crates/spt-daemon/src/stderrlog.rs\",\"selector\":null}","call_id":"call_zr0iTmTOWR7VmXE4Cbsq48OP","name":"read"},{"id":"fc_0a061eb498f0e908016a59d38fdb448196a81c4cc6b74597eb","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding status home output\",\"pattern\":\"spt_home|SPT_HOME|identity\",\"path\":\"crates/spt-daemon/src/endpoint.rs; crates/spt-store/src/home.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_bv9HeaKlQZZ6SBtpax73jZ9g","name":"grep"}]},"duration":8866.035300001502,"ttft":1751.3808999955654,"contextSnapshot":{"promptTokens":243906,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_xVpSq303C1kzqcfCG0semCbQ|fc_0a061eb498f0e908016a59d38fdaa881968d671d20915f0216","toolName":"grep","startedAt":"2026-07-17T07:02:39.938Z","args":{"path":"crates/spt-daemon/src; crates/spt-store/src; crates/spt/src"},"intent":"Locating daemon log path"},"id":"a46cafd8","parentId":"00ffd5b6","timestamp":"2026-07-17T07:02:39.938Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zrcU2P6T60iKIfyVwEGMX8n3|fc_0a061eb498f0e908016a59d38fdabc8196b4f7d46e4e210a0c","toolName":"grep","startedAt":"2026-07-17T07:02:39.938Z","args":{"path":"crates/spt/src; crates/spt-daemon/src/service.rs; crates/spt-daemon/src/brainproc.rs"},"intent":"Locating status stream listing"},"id":"b9f17c15","parentId":"a46cafd8","timestamp":"2026-07-17T07:02:39.938Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zr0iTmTOWR7VmXE4Cbsq48OP|fc_0a061eb498f0e908016a59d38fdb3c8196a8ec6e690ce48b7c","toolName":"read","startedAt":"2026-07-17T07:02:39.938Z","args":{"path":"crates/spt-daemon/src/stderrlog.rs"},"intent":"Reading stderr persistence"},"id":"146ed002","parentId":"b9f17c15","timestamp":"2026-07-17T07:02:39.938Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_bv9HeaKlQZZ6SBtpax73jZ9g|fc_0a061eb498f0e908016a59d38fdb448196a81c4cc6b74597eb","toolName":"grep","startedAt":"2026-07-17T07:02:39.938Z","args":{"path":"crates/spt-daemon/src/endpoint.rs; crates/spt-store/src/home.rs"},"intent":"Finding status home output"},"id":"46e06745","parentId":"146ed002","timestamp":"2026-07-17T07:02:39.938Z"}
{"type":"message","id":"cb4d3a43","parentId":"46e06745","timestamp":"2026-07-17T07:02:39.942Z","message":{"role":"toolResult","toolCallId":"call_bv9HeaKlQZZ6SBtpax73jZ9g|fc_0a061eb498f0e908016a59d38fdb448196a81c4cc6b74597eb","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\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...\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]"}],"details":{"scopePath":"crates/spt-daemon/src/endpoint.rs, crates/spt-store/src/home.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":12,"fileCount":1,"files":["crates/spt-daemon/src/endpoint.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/endpoint.rs","count":12}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\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    │...\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]"},"isError":false,"timestamp":1784271759942}}
{"type":"message","id":"a17908a4","parentId":"cb4d3a43","timestamp":"2026-07-17T07:02:39.943Z","message":{"role":"toolResult","toolCallId":"call_zr0iTmTOWR7VmXE4Cbsq48OP|fc_0a061eb498f0e908016a59d38fdb3c8196a8ec6e690ce48b7c","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        let cur = dir.path().join(STDERR_LOG_BASENAME);\n        let bak = rolled_path(dir.path(), 1);\n        // A pre-existing backup (older) + a current (newer).\n        std::fs::write(&bak, b\"OLD-BACKUP\").unwrap();\n        std::fs::write(&cur, b\"CURRENT-A\").unwrap();\n\n        roll_files(dir.path(), STDERR_LOG_KEEP);\n\n        // The old backup is dropped; the current became the new .1.\n        assert!(!cur.exists(), \"current was rolled away (fresh install reopens it)\");\n        assert_eq!(\n            std::fs::read(&bak).unwrap(),\n            b\"CURRENT-A\",\n            \"the current file's content is preserved as the .1 backup\"\n        );\n        // No .2 accumulates (KEEP=2 keeps only current + .1).\n        assert!(!rolled_path(dir.path(), 2).exists(), \"no unbounded accumulation\");\n    }\n\n    // [unit->REQ-DAEMON-STDERR-PERSIST] KEEP<=1 keeps NO backup — the current file is\n    // cleared, nothing rolled (the opt-out shape for a caller that wants a single\n    // capped file with no history).\n    #[test]\n    fn roll_with_keep_one_clears_without_backup() {\n        let dir = tempfile::tempdir().unwrap();\n        let cur = dir.path().join(STDERR_LOG_BASENAME);\n        std::fs::write(&cur, b\"CURRENT\").unwrap();\n        roll_files(dir.path(), 1);\n        assert!(!cur.exists(), \"keep=1 clears the current file\");\n        assert!(!rolled_path(dir.path(), 1).exists(), \"keep=1 makes no backup\");\n    }\n\n    // [unit->REQ-DAEMON-STDERR-PERSIST] the log path derivation sits under SPT_HOME\n    // (never a stray cwd) and the stamp names the role + generation for operator\n    // legibility (no internal codes).\n    #[test]\n    fn path_under_home_and_stamp_is_legible() {\n        crate::test_home::with_home(|home| {\n            let p = stderr_log_path();\n            assert!(p.starts_with(home), \"log lives under SPT_HOME: {p:?}\");\n            assert!(p.ends_with(STDERR_LOG_BASENAME));\n            assert!(p.parent().unwrap().ends_with(\"logs\"));\n        });\n        let stamp = stamp_line(\"broker\", 7);\n        assert!(stamp.contains(\"broker\") && stamp.contains(\"generation 7\"), \"got {stamp}\");\n        assert!(!stamp.contains(\"REQ-\"), \"no internal tag leaks: {stamp}\");\n    }\n}\n"}],"details":{"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        let cur = dir.path().join(STDERR_LOG_BASENAME);\r\n        let bak = rolled_path(dir.path(), 1);\r\n        // A pre-existing backup (older) + a current (newer).\r\n        std::fs::write(&bak, b\"OLD-BACKUP\").unwrap();\r\n        std::fs::write(&cur, b\"CURRENT-A\").unwrap();\r\n\r\n        roll_files(dir.path(), STDERR_LOG_KEEP);\r\n\r\n        // The old backup is dropped; the current became the new .1.\r\n        assert!(!cur.exists(), \"current was rolled away (fresh install reopens it)\");\r\n        assert_eq!(\r\n            std::fs::read(&bak).unwrap(),\r\n            b\"CURRENT-A\",\r\n            \"the current file's content is preserved as the .1 backup\"\r\n        );\r\n        // No .2 accumulates (KEEP=2 keeps only current + .1).\r\n        assert!(!rolled_path(dir.path(), 2).exists(), \"no unbounded accumulation\");\r\n    }\r\n\r\n    // [unit->REQ-DAEMON-STDERR-PERSIST] KEEP<=1 keeps NO backup — the current file is\r\n    // cleared, nothing rolled (the opt-out shape for a caller that wants a single\r\n    // capped file with no history).\r\n    #[test]\r\n    fn roll_with_keep_one_clears_without_backup() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let cur = dir.path().join(STDERR_LOG_BASENAME);\r\n        std::fs::write(&cur, b\"CURRENT\").unwrap();\r\n        roll_files(dir.path(), 1);\r\n        assert!(!cur.exists(), \"keep=1 clears the current file\");\r\n        assert!(!rolled_path(dir.path(), 1).exists(), \"keep=1 makes no backup\");\r\n    }\r\n\r\n    // [unit->REQ-DAEMON-STDERR-PERSIST] the log path derivation sits under SPT_HOME\r\n    // (never a stray cwd) and the stamp names the role + generation for operator\r\n    // legibility (no internal codes).\r\n    #[test]\r\n    fn path_under_home_and_stamp_is_legible() {\r\n        crate::test_home::with_home(|home| {\r\n            let p = stderr_log_path();\r\n            assert!(p.starts_with(home), \"log lives under SPT_HOME: {p:?}\");\r\n            assert!(p.ends_with(STDERR_LOG_BASENAME));\r\n            assert!(p.parent().unwrap().ends_with(\"logs\"));\r\n        });\r\n        let stamp = stamp_line(\"broker\", 7);\r\n        assert!(stamp.contains(\"broker\") && stamp.contains(\"generation 7\"), \"got {stamp}\");\r\n        assert!(!stamp.contains(\"REQ-\"), \"no internal tag leaks: {stamp}\");\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,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\stderrlog.rs"}}},"isError":false,"timestamp":1784271759943}}
{"type":"message","id":"63c03250","parentId":"a17908a4","timestamp":"2026-07-17T07:02:39.955Z","message":{"role":"toolResult","toolCallId":"call_zrcU2P6T60iKIfyVwEGMX8n3|fc_0a061eb498f0e908016a59d38fdabc8196b4f7d46e4e210a0c","toolName":"grep","content":[{"type":"text","text":"# crates/spt/src/\n## cli.rs\n 11922|            }\n*11923|            let stream_id = match spt_daemon::tunnel_owner_stream(&owlery, &owner, &shell_ref) {\n 11924|                Ok(Some(s)) => s,\n 11925|                Ok(None) => {\n 11926|                    eprintln!(\"NO_TUNNEL:{shell_ref}: no live tunnel for {owner} (offline, or the shell declares no [shell.tunnel])\");\n...\n 11942|                    }\n*11943|                    match spt_daemon::tunnel_send(&sock, stream_id, &buf, false) {\n 11944|                        Ok(()) => {\n 11945|                            eprintln!(\"TUNNEL_SENT:{shell_ref} bytes={}\", buf.len());\n 11946|                            0\n...\n 11953|                }\n*11954|                \"recv\" => match spt_daemon::tunnel_recv(&sock, stream_id) {\n*11955|                    Ok((bytes, finished)) => {\n 11956|                        use std::io::Write;\n 11957|                        let _ = std::io::stdout().write_all(&bytes);\n 11958|                        let _ = std::io::stdout().flush();\n...\n 11961|                            bytes.len(),\n*11962|                            if finished { \" (eof)\" } else { \"\" }\n 11963|                        );\n 11964|                        0\n 11965|                    }\n...\n 17895|    // FULLY live (daemon restarted onto it) and carries NO manual-restart tail —\n*17896|    // the one command finished the cycle. `already` distinguishes a fresh install\n 17897|    // from a finish over an already-installed version (daemon was still on old).\n 17898|    #[test]\n 17899|    fn finish_message_states_fully_live_no_manual_restart() {\n## rc.rs\n 1343|    ops: OpMinter,\n*1344|    stream_id: u64,\n 1345|    /// The owning node's label for a REMOTE attach (the reconnect-banner target\n 1346|    /// + the honest-failure copy); `None` ⇒ local.\n 1347|    remote_node: Option<String>,\n...\n 1460|    let mut established: Option<u64> = Some(conn_id);\n*1461|    let stream_id = spt_daemon::with_tracing_retry(\n 1462|        // Operator attach open — the rc OpMinter is the counter (ADR-0034 `rc` tag).\n 1463|        || Ok(MintedOp::new(Minter::Rc, ops.next())),\n 1464|        |op| {\n...\n 1492|    brain\n*1493|        .net_stream_subscribe(stream_id, 0)\n 1494|        .map_err(|e| EstablishFail::Error(format!(\"stream subscribe: {e}\")))?;\n 1495|    Ok(Established {\n 1496|        brain,\n 1497|        ops,\n*1498|        stream_id,\n 1499|        remote_node,\n 1500|    })\n 1501|}\n...\n 1542|                };\n*1543|                let _ = send_attach_resize(&mut est.brain, est.stream_id, pty_rows, cols);\n 1544|            }\n 1545|        }\n 1546|\n...\n 1549|            &mut est.brain,\n*1550|            est.stream_id,\n 1551|            &est.ops,\n 1552|            rx,\n 1553|            &mut decoder,\n...\n 1729|    BrokerGone,\n*1730|    /// The serve side finished the stream AFTER rendering output — the remote\n 1731|    /// conn dropped (node bounce, network cut), NOT an operator detach (that\n 1732|    /// returns via the stdin `Detach` path directly) and NOT a session end (an\n 1733|    /// `Exit` record precedes a session-death EOF). Pre-B-3 this was mislabeled\n...\n 1752|    Stalled,\n*1753|    /// The serve side finished the stream having produced NO output — i.e. it\n 1754|    /// refused the attach (no live session for the endpoint, or the access gate\n 1755|    /// denied us). On the cross-node leg (#4, REQ-RC-CROSS-NODE-ATTACH) this is\n 1756|    /// the D6 stale-row case: the registry routed us to a node that no longer has\n...\n 1813|    brain: &mut Brain,\n*1814|    stream_id: u64,\n 1815|    ops: &OpMinter,\n 1816|    rx: Option<&mpsc::Receiver<StdinMsg>>,\n 1817|    decoder: &mut AttachDecoder,\n...\n 1841|    // Finish our send side so the target's `serve_attach` sees EOF → Detached\n*1842|    // (the session outlives the viewport). Best-effort: an already-finished or\n 1843|    // exited stream send is harmless to attempt.\n*1844|    fn detach(brain: &mut Brain, stream_id: u64) -> PumpEnd {\n*1845|        let _ = brain.net_stream_send(stream_id, &[], None, true);\n 1846|        PumpEnd::Detached\n 1847|    }\n 1848|    // Dedup cursor: a post-restart re-serve may re-transmit `Output` records;\n...\n 1883|                            let pty_rows = rows.saturating_sub(1).max(1);\n*1884|                            let _ = send_attach_resize(brain, stream_id, pty_rows, cols);\n 1885|                            if stdout.write_all(&status.assert_bytes()).is_ok() {\n 1886|                                let _ = stdout.flush();\n 1887|                            }\n...\n 1889|                        None => {\n*1890|                            let _ = send_attach_resize(brain, stream_id, rows, cols);\n 1891|                        }\n 1892|                    }\n 1893|                }\n...\n 1901|                    Ok(StdinMsg::Bytes(bytes)) => {\n*1902|                        send_attach_input(brain, stream_id, &bytes, ops.next())\n 1903|                            .map_err(|e| format!(\"send input: {e}\"))?;\n 1904|                    }\n*1905|                    Ok(StdinMsg::Detach) => return Ok(detach(brain, stream_id)),\n 1906|                    Err(mpsc::TryRecvError::Empty) => break,\n 1907|                    Err(mpsc::TryRecvError::Disconnected) => {\n*1908|                        return Ok(detach(brain, stream_id))\n 1909|                    }\n 1910|                }\n 1911|            }\n...\n 1934|        match ev {\n*1935|            BrokerEvent::NetStreamData { stream_id: sid, bytes, .. } if sid == stream_id => {\n 1936|                for rec in decoder.push(&bytes) {\n 1937|                    match rec {\n 1938|                        AttachRecord::Output { seq, data_b64 } => {\n...\n 1991|            }\n*1992|            BrokerEvent::NetStreamEof { stream_id: sid, .. } if sid == stream_id => {\n 1993|                return Ok(serve_eof_end(rendered_any));\n 1994|            }\n 1995|            BrokerEvent::Error { message } => return Err(message),\n...\n 2290|                    Instant::now() < end,\n*2291|                    \"never observed: {what} (viewport finished: {}; {} bytes captured: {:?})\",\n## wansend.rs\n 319|    NoEdge { node: String },\n*320|    /// The stream finished with no reply — the target's access gate refused\n 321|    /// this origin (or dropped the request). Existence is not advertised.\n 322|    NoReply { node: String },\n 323|    /// The target's transition host failed; its error text.\n...\n 457|    NoShell { node: String },\n*458|    /// The stream finished with no reply — the target's access gate refused\n 459|    /// this origin. Existence is not advertised.\n 460|    NoReply { node: String },\n 461|    /// The target's action failed; its error text.\n...\n 1061|    // and fires the wake effects; and the access gate refuses an unlisted\n*1062|    // origin when a whitelist exists — stream finished, no reply, no state\n 1063|    // change (REQ-HAZARD-WAN-ORIGIN-AUTH: the subject was the handshake\n 1064|    // origin, not wire bytes).\n 1065|    #[test]\n\n## api/\n### reporting.rs\n 551|    let sock = spt_daemon::tunnel_socket_name();\n*552|    let stream_id = match spt_daemon::tunnel_resolve(\n 553|        &sock,\n 554|        &owner,\n 555|        &shell_id,\n...\n 576|            }\n*577|            match spt_daemon::tunnel_send(&sock, stream_id, &buf, false) {\n 578|                Ok(()) => {\n 579|                    eprintln!(\"TUNNEL_SENT:{shell_id} bytes={}\", buf.len());\n 580|                    0\n...\n 587|        }\n*588|        \"recv\" => match spt_daemon::tunnel_recv(&sock, stream_id) {\n*589|            Ok((bytes, finished)) => {\n 590|                use std::io::Write;\n 591|                let _ = std::io::stdout().write_all(&bytes);\n 592|                let _ = std::io::stdout().flush();\n...\n 595|                    bytes.len(),\n*596|                    if finished { \" (eof)\" } else { \"\" }\n 597|                );\n 598|                0\n 599|            }"}],"details":{"scopePath":"crates/spt/src, crates/spt-daemon/src/service.rs, crates/spt-daemon/src/brainproc.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":34,"fileCount":4,"files":["crates/spt/src/api/reporting.rs","crates/spt/src/cli.rs","crates/spt/src/rc.rs","crates/spt/src/wansend.rs"],"fileMatches":[{"path":"crates/spt/src/api/reporting.rs","count":5},{"path":"crates/spt/src/cli.rs","count":6},{"path":"crates/spt/src/rc.rs","count":20},{"path":"crates/spt/src/wansend.rs","count":3}],"truncated":true,"perFileLimitReached":20,"displayContent":"# crates/spt/src/\n## cli.rs\n 11922│            }\n*11923│            let stream_id = match spt_daemon::tunnel_owner_stream(&owlery, &owner, &shell_ref) {\n 11924│                Ok(Some(s)) => s,\n 11925│                Ok(None) => {\n 11926│                    eprintln!(\"NO_TUNNEL:{shell_ref}: no live tunnel for {owner} (offline, or the shell declares no [shell.tunnel])\");\n      │...\n 11942│                    }\n*11943│                    match spt_daemon::tunnel_send(&sock, stream_id, &buf, false) {\n 11944│                        Ok(()) => {\n 11945│                            eprintln!(\"TUNNEL_SENT:{shell_ref} bytes={}\", buf.len());\n 11946│                            0\n      │...\n 11953│                }\n*11954│                \"recv\" => match spt_daemon::tunnel_recv(&sock, stream_id) {\n*11955│                    Ok((bytes, finished)) => {\n 11956│                        use std::io::Write;\n 11957│                        let _ = std::io::stdout().write_all(&bytes);\n 11958│                        let _ = std::io::stdout().flush();\n      │...\n 11961│                            bytes.len(),\n*11962│                            if finished { \" (eof)\" } else { \"\" }\n 11963│                        );\n 11964│                        0\n 11965│                    }\n      │...\n 17895│    // FULLY live (daemon restarted onto it) and carries NO manual-restart tail —\n*17896│    // the one command finished the cycle. `already` distinguishes a fresh install\n 17897│    // from a finish over an already-installed version (daemon was still on old).\n 17898│    #[test]\n 17899│    fn finish_message_states_fully_live_no_manual_restart() {\n## rc.rs\n 1343│    ops: OpMinter,\n*1344│    stream_id: u64,\n 1345│    /// The owning node's label for a REMOTE attach (the reconnect-banner target\n 1346│    /// + the honest-failure copy); `None` ⇒ local.\n 1347│    remote_node: Option<String>,\n     │...\n 1460│    let mut established: Option<u64> = Some(conn_id);\n*1461│    let stream_id = spt_daemon::with_tracing_retry(\n 1462│        // Operator attach open — the rc OpMinter is the counter (ADR-0034 `rc` tag).\n 1463│        || Ok(MintedOp::new(Minter::Rc, ops.next())),\n 1464│        |op| {\n     │...\n 1492│    brain\n*1493│        .net_stream_subscribe(stream_id, 0)\n 1494│        .map_err(|e| EstablishFail::Error(format!(\"stream subscribe: {e}\")))?;\n 1495│    Ok(Established {\n 1496│        brain,\n 1497│        ops,\n*1498│        stream_id,\n 1499│        remote_node,\n 1500│    })\n 1501│}\n     │...\n 1542│                };\n*1543│                let _ = send_attach_resize(&mut est.brain, est.stream_id, pty_rows, cols);\n 1544│            }\n 1545│        }\n 1546│\n     │...\n 1549│            &mut est.brain,\n*1550│            est.stream_id,\n 1551│            &est.ops,\n 1552│            rx,\n 1553│            &mut decoder,\n     │...\n 1729│    BrokerGone,\n*1730│    /// The serve side finished the stream AFTER rendering output — the remote\n 1731│    /// conn dropped (node bounce, network cut), NOT an operator detach (that\n 1732│    /// returns via the stdin `Detach` path directly) and NOT a session end (an\n 1733│    /// `Exit` record precedes a session-death EOF). Pre-B-3 this was mislabeled\n     │...\n 1752│    Stalled,\n*1753│    /// The serve side finished the stream having produced NO output — i.e. it\n 1754│    /// refused the attach (no live session for the endpoint, or the access gate\n 1755│    /// denied us). On the cross-node leg (#4, REQ-RC-CROSS-NODE-ATTACH) this is\n 1756│    /// the D6 stale-row case: the registry routed us to a node that no longer has\n     │...\n 1813│    brain: &mut Brain,\n*1814│    stream_id: u64,\n 1815│    ops: &OpMinter,\n 1816│    rx: Option<&mpsc::Receiver<StdinMsg>>,\n 1817│    decoder: &mut AttachDecoder,\n     │...\n 1841│    // Finish our send side so the target's `serve_attach` sees EOF → Detached\n*1842│    // (the session outlives the viewport). Best-effort: an already-finished or\n 1843│    // exited stream send is harmless to attempt.\n*1844│    fn detach(brain: &mut Brain, stream_id: u64) -> PumpEnd {\n*1845│        let _ = brain.net_stream_send(stream_id, &[], None, true);\n 1846│        PumpEnd::Detached\n 1847│    }\n 1848│    // Dedup cursor: a post-restart re-serve may re-transmit `Output` records;\n     │...\n 1883│                            let pty_rows = rows.saturating_sub(1).max(1);\n*1884│                            let _ = send_attach_resize(brain, stream_id, pty_rows, cols);\n 1885│                            if stdout.write_all(&status.assert_bytes()).is_ok() {\n 1886│                                let _ = stdout.flush();\n 1887│                            }\n     │...\n 1889│                        None => {\n*1890│                            let _ = send_attach_resize(brain, stream_id, rows, cols);\n 1891│                        }\n 1892│                    }\n 1893│                }\n     │...\n 1901│                    Ok(StdinMsg::Bytes(bytes)) => {\n*1902│                        send_attach_input(brain, stream_id, &bytes, ops.next())\n 1903│                            .map_err(|e| format!(\"send input: {e}\"))?;\n 1904│                    }\n*1905│                    Ok(StdinMsg::Detach) => return Ok(detach(brain, stream_id)),\n 1906│                    Err(mpsc::TryRecvError::Empty) => break,\n 1907│                    Err(mpsc::TryRecvError::Disconnected) => {\n*1908│                        return Ok(detach(brain, stream_id))\n 1909│                    }\n 1910│                }\n 1911│            }\n     │...\n 1934│        match ev {\n*1935│            BrokerEvent::NetStreamData { stream_id: sid, bytes, .. } if sid == stream_id => {\n 1936│                for rec in decoder.push(&bytes) {\n 1937│                    match rec {\n 1938│                        AttachRecord::Output { seq, data_b64 } => {\n     │...\n 1991│            }\n*1992│            BrokerEvent::NetStreamEof { stream_id: sid, .. } if sid == stream_id => {\n 1993│                return Ok(serve_eof_end(rendered_any));\n 1994│            }\n 1995│            BrokerEvent::Error { message } => return Err(message),\n     │...\n 2290│                    Instant::now() < end,\n*2291│                    \"never observed: {what} (viewport finished: {}; {} bytes captured: {:?})\",\n## wansend.rs\n  319│    NoEdge { node: String },\n *320│    /// The stream finished with no reply — the target's access gate refused\n  321│    /// this origin (or dropped the request). Existence is not advertised.\n  322│    NoReply { node: String },\n  323│    /// The target's transition host failed; its error text.\n     │...\n  457│    NoShell { node: String },\n *458│    /// The stream finished with no reply — the target's access gate refused\n  459│    /// this origin. Existence is not advertised.\n  460│    NoReply { node: String },\n  461│    /// The target's action failed; its error text.\n     │...\n 1061│    // and fires the wake effects; and the access gate refuses an unlisted\n*1062│    // origin when a whitelist exists — stream finished, no reply, no state\n 1063│    // change (REQ-HAZARD-WAN-ORIGIN-AUTH: the subject was the handshake\n 1064│    // origin, not wire bytes).\n 1065│    #[test]\n\n## api/\n### reporting.rs\n 551│    let sock = spt_daemon::tunnel_socket_name();\n*552│    let stream_id = match spt_daemon::tunnel_resolve(\n 553│        &sock,\n 554│        &owner,\n 555│        &shell_id,\n    │...\n 576│            }\n*577│            match spt_daemon::tunnel_send(&sock, stream_id, &buf, false) {\n 578│                Ok(()) => {\n 579│                    eprintln!(\"TUNNEL_SENT:{shell_id} bytes={}\", buf.len());\n 580│                    0\n    │...\n 587│        }\n*588│        \"recv\" => match spt_daemon::tunnel_recv(&sock, stream_id) {\n*589│            Ok((bytes, finished)) => {\n 590│                use std::io::Write;\n 591│                let _ = std::io::stdout().write_all(&bytes);\n 592│                let _ = std::io::stdout().flush();\n    │...\n 595│                    bytes.len(),\n*596│                    if finished { \" (eof)\" } else { \"\" }\n 597│                );\n 598│                0\n 599│            }"},"isError":false,"timestamp":1784271759955}}
{"type":"message","id":"4d1a631b","parentId":"63c03250","timestamp":"2026-07-17T07:02:39.971Z","message":{"role":"toolResult","toolCallId":"call_xVpSq303C1kzqcfCG0semCbQ|fc_0a061eb498f0e908016a59d38fdaa881968d671d20915f0216","toolName":"grep","content":[{"type":"text","text":"# crates/\n\n## spt-daemon/src/\n### brainproc.rs\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### 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### stderrlog.rs\n 36|/// The `SPT_HOME/logs` directory holding the daemon stderr log(s).\n*37|pub fn stderr_log_dir() -> PathBuf {\n 38|    spt_store::perch::spt_home().join(\"logs\")\n 39|}\n 40|\n*41|/// The current daemon stderr log path (`SPT_HOME/logs/daemon.stderr.log`).\n*42|pub fn stderr_log_path() -> PathBuf {\n 43|    stderr_log_dir().join(STDERR_LOG_BASENAME)\n 44|}\n 45|\n...\n 141|    }\n*142|    let path = stderr_log_path();\n 143|    // Roll a current file already at the cap (bounds growth across restarts).\n 144|    let size = std::fs::metadata(&path).map(|m| m.len()).unwrap_or(0);\n 145|    if should_roll(size, STDERR_LOG_CAP) {\n...\n 150|        Err(e) => {\n*151|            eprintln!(\"STDERR_PERSIST_SKIP: could not open {}: {e}\", path.display());\n 152|            return None;\n 153|        }\n 154|    };\n...\n 215|\n*216|    // [unit->REQ-DAEMON-STDERR-PERSIST] the log path derivation sits under SPT_HOME\n 217|    // (never a stray cwd) and the stamp names the role + generation for operator\n 218|    // legibility (no internal codes).\n 219|    #[test]\n...\n 221|        crate::test_home::with_home(|home| {\n*222|            let p = stderr_log_path();\n 223|            assert!(p.starts_with(home), \"log lives under SPT_HOME: {p:?}\");\n 224|            assert!(p.ends_with(STDERR_LOG_BASENAME));\n 225|            assert!(p.parent().unwrap().ends_with(\"logs\"));\n\n## spt/src/\n### cli.rs\n 3898|    // [impl->REQ-DAEMON-STDERR-PERSIST]\n*3899|    let _ = spt_daemon::stderrlog::install(\"broker\", 0);\n 3900|    // Defense-in-depth (REQ-HAZARD-DETACHED-DAEMON-STDIO): null the std handles when\n 3901|    // detached-in-fact (no console OR a piped stderr) EVEN IF `--detached` was not\n 3902|    // passed — the stale-bare-at-logon-task / bare-deelevated-respawn / any-unknown\n### helpfmt.rs\n 51|    );\n*52|    resolve_console_color(want, enable_vt_stderr()) // A7: VT-gate the stderr path too\n 53|}\n 54|\n 55|/// The final color decision once VT availability is known (A7,"}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt-store/src, crates/spt/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":11,"fileCount":5,"files":["crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/lib.rs","crates/spt-daemon/src/stderrlog.rs","crates/spt/src/cli.rs","crates/spt/src/helpfmt.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brainproc.rs","count":1},{"path":"crates/spt-daemon/src/lib.rs","count":1},{"path":"crates/spt-daemon/src/stderrlog.rs","count":7},{"path":"crates/spt/src/cli.rs","count":1},{"path":"crates/spt/src/helpfmt.rs","count":1}],"truncated":false,"displayContent":"# crates/\n\n## spt-daemon/src/\n### brainproc.rs\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### 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### stderrlog.rs\n  36│/// The `SPT_HOME/logs` directory holding the daemon stderr log(s).\n *37│pub fn stderr_log_dir() -> PathBuf {\n  38│    spt_store::perch::spt_home().join(\"logs\")\n  39│}\n  40│\n *41│/// The current daemon stderr log path (`SPT_HOME/logs/daemon.stderr.log`).\n *42│pub fn stderr_log_path() -> PathBuf {\n  43│    stderr_log_dir().join(STDERR_LOG_BASENAME)\n  44│}\n  45│\n    │...\n 141│    }\n*142│    let path = stderr_log_path();\n 143│    // Roll a current file already at the cap (bounds growth across restarts).\n 144│    let size = std::fs::metadata(&path).map(|m| m.len()).unwrap_or(0);\n 145│    if should_roll(size, STDERR_LOG_CAP) {\n    │...\n 150│        Err(e) => {\n*151│            eprintln!(\"STDERR_PERSIST_SKIP: could not open {}: {e}\", path.display());\n 152│            return None;\n 153│        }\n 154│    };\n    │...\n 215│\n*216│    // [unit->REQ-DAEMON-STDERR-PERSIST] the log path derivation sits under SPT_HOME\n 217│    // (never a stray cwd) and the stamp names the role + generation for operator\n 218│    // legibility (no internal codes).\n 219│    #[test]\n    │...\n 221│        crate::test_home::with_home(|home| {\n*222│            let p = stderr_log_path();\n 223│            assert!(p.starts_with(home), \"log lives under SPT_HOME: {p:?}\");\n 224│            assert!(p.ends_with(STDERR_LOG_BASENAME));\n 225│            assert!(p.parent().unwrap().ends_with(\"logs\"));\n\n## spt/src/\n### cli.rs\n 3898│    // [impl->REQ-DAEMON-STDERR-PERSIST]\n*3899│    let _ = spt_daemon::stderrlog::install(\"broker\", 0);\n 3900│    // Defense-in-depth (REQ-HAZARD-DETACHED-DAEMON-STDIO): null the std handles when\n 3901│    // detached-in-fact (no console OR a piped stderr) EVEN IF `--detached` was not\n 3902│    // passed — the stale-bare-at-logon-task / bare-deelevated-respawn / any-unknown\n### helpfmt.rs\n 51│    );\n*52│    resolve_console_color(want, enable_vt_stderr()) // A7: VT-gate the stderr path too\n 53│}\n 54│\n 55│/// The final color decision once VT availability is known (A7,"},"isError":false,"timestamp":1784271759971}}
{"type":"compaction","id":"d64bf4a1","parentId":"4d1a631b","timestamp":"2026-07-17T07:02:40.103Z","summary":"[Superseded compaction summary elided after a newer compaction]","shortSummary":"Superseded compaction elided","firstKeptEntryId":"00ffd5b6","tokensBefore":244295,"details":{"readFiles":["crates/spt-daemon/src/attach.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/nethost.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/translation.rs","crates/spt-term/src/pty.rs","crates/spt-term/src/reader.rs","docs/adr/0038-broker-stream-lifecycle-truth.md"],"modifiedFiles":[]},"fromExtension":false}
{"type":"message","id":"1745e435","parentId":"d64bf4a1","timestamp":"2026-07-17T07:02:56.670Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Quantifying thread classes and naming**\n\n**Analyzing connection handler thread lifecycle**"},{"type":"toolCall","id":"call_E642na7qPXx1OZ8R9x6b1VZw|fc_0fcf561150331aac016a59d3a0081081909abe9f1599bb362a","name":"read","arguments":{"i":"Reading broker gauges","path":"crates/spt-daemon/src/broker.rs","selector":"2860-2945"}},{"type":"toolCall","id":"call_PnzkRYGyiXNbavVMG8P7eJIg|fc_0fcf561150331aac016a59d3a008288190997193631d72bcda","name":"grep","arguments":{"i":"Finding gauge protocol kinds","pattern":"CONN_HANDLER|conn_handler|NET_STREAMS|net_streams|session_count\\(|active.*tasks","path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/msg.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/brainproc.rs; crates/spt-daemon/src/daemon.rs","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_ICG6t1dqh4cGBclTiU5NH8yT|fc_0fcf561150331aac016a59d3a008308190ba9a71f5ffa51879","name":"read","arguments":{"i":"Reading broker serve entry","path":"crates/spt-daemon/src/broker.rs","selector":"3000-3095"}},{"type":"toolCall","id":"call_0otyIVE0JifWc3zKA9iMtnzv|fc_0fcf561150331aac016a59d3a008348190a341f81653999ef3","name":"read","arguments":{"i":"Reading network task gauges","path":"crates/spt-daemon/src/nethost.rs","selector":"1150-1215,1980-2045"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":51768,"output":541,"cacheRead":0,"cacheWrite":0,"totalTokens":52309,"reasoningTokens":290,"cost":{"input":0.25884,"output":0.01623,"cacheRead":0,"cacheWrite":0,"total":0.27507000000000004}},"stopReason":"toolUse","timestamp":1784271760156,"responseId":"resp_0fcf561150331aac016a59d391004481908bc61fdbc46cd8f1","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d39388188190891d80f59db32b61","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdOgGwLhfG74D9IFMJE9H_LAldpvVCwqFy4nhXQlLcpoo6ETco_opNY_KFaOthRHTHFYCrYzLxZyE9SQ0i9iKOr0Tz5ZgLbmQGV_TQYG0X22HGOI_sPobA68nYAqOEcLy6Fui1K16NvV4XVIc-23L7sb9ENQYRyHRFzssGTfaC7Pie7o9jdxSDUs5CnUP-6C-7HOX0IDF8bghnigNzZkRt1j2x7tXjKMHGiJW8Hang77C-I9g5EamGTV8lGqGlJlXxy6fN6RqG0-chTMc3HvBPxt8lq88ODSJ6chqmulx_ZKYiHkeOs08Bt9kyu3TPS0QrXMPaxkW8ho95-2FraFGmLSrcTgvYPuBBB4_NDcKyK5pVRC1y4ED8J-0MtDThPObi5W78dkrfqYyvOIGyyyO_H0Q6K3PFMC2Tyf8njHxRBZWa6Z_o0gCpRopx_zfId3zd-s_weY9aiKblaQnNBNDRwR-4wh-hjDWKaDRgDEVrGjNRmFLyonZmjmg8aaVboCMSnBIKJZNXCb_sLFwtZEHTbZUXepJQsJ5qZPS5AIKmR5fWKC217HvgxgDKWlKEP-CG7K7xl5Y9IrAZIA2KkXG11tNg_Ot1MMPApj4D01AKZO7MhEoLJhx1t6FVda0KbbK8cR-ROOanrLHwSHraSDhZMFjLTLP3IpaWf45645Vv0zQHM2TBWWD0T2KNWjH5jS_T3AL322YBNjtRpsMTkchSA-_eY89bgahdDhQ73A5NTh0fM2XcswAjrfLz7JbjddnjZkUMcDL3TnsOXFynRXJxWfM4-J5WpSfclZfi276JMuFKouhefBsOTY0BjVMTutCGlMpXsWGArMZ-4s9J04ptm94zRYs1YDRQxx8IobXQ5wWVcJhbwfC8kU-PFuPO84F0wSQsZoav-8pdDhsbsmEDm9Vr2e_7UxEmUX5eki5atVEZmVQy5G7P0YM-0qjLCDeg4qUw-lfRssJ2galLEtTKC9ZeDn8Oqay4QbS9uS-1XwwKwHvTgRGJzvh91lBXvTI2rutR9yPLRy80zldcYpaTcNW0l0727TSJG9y3hSou6F3pH_B-t-R0MhtRNmz_gbs9-fd0BCzrLDF808k_YP_PJbzlfpkEFENLosmmxRutA87wh6ocQHbAi5ldGN8XdmKrWoa_zLwW1hv9EptcqE7Yi9q478hkSkHbCfpT3uXKZMgb5muhIxdWHO5gfYvZOXcMVvALaLP3P36bFomm8QL4StmeDZMqPehD0rTjxwaHv6jqNrfDBQWAlKEQ9Ns0aq7XkaLGHCm7OhPAfObbsYBOEsxV3VV05N7GtlZjW8XE50DSYPuK3hzwkZxHfXY2EUfzhABTeton2tu1eJtgYUfcwG_5ACBnuOuh3tpAiGfW_zgmtOSEdSHciFrkGtCFiD-ZwPg4ipidcsP-Ypzo7zDk0hFVYR6HcZFURNNLTa55TgadR37W9e471drSIet3xazuSoQFasSq8zGxmgWNMHGJMt_yRdW6iVWsqkEjNjTvLVppoqwiK5tUWw7k8B7kW3BWv475AZchy7aPFzhCyOjf3nuDEvN5YSIpeHS4H7HWbXk0PkIAIQDxXvXTW6kWdJ62-TcrAJ94srgj3Z6bYNzPK_zk7Ev2CZr-RnRxpk4Snnn4bFi7F0RgnuEu_HHJyPWTrOB2TrpNAtipNdjlIV8XIjGOZyFN7vajI-B39ETjRO50fGVaQRtrspxAPMU6yQgKPP9hN9CmMQISPh_nBleyzpVyPQzaVUbDkfRlJGCNH8DQ5iwERVbnjB-TY-HHEtGqxKIJwt7uDDuFN6xHd_8RmKDS4rpTeCm75TNGq9zHVcduaTQrzfhGZhZ6mMuvHlMCSjv15l9TLSSgeSoCzmh5PdM_dI9pJSPeL2PtpgHlUutRWpkeTD6huxxzNE9JvZmtfxE0EBi7FC9Ymb8LdftpewbHdq2j5p4CTKWZCr0oGXfp7famfnf3kGFRpSB6t3EbEtMuUzabYnucIznDMRA8zTfV8Mg_sVYEPPaQ_SQgFheeu2jRNrJqIglqRBp1Npv1lA9wdy2A4eiP6L4mqUYxESlJrNo2viGTrv_X3fW4_9B6EcvgZKh0xo8BQf8ITz1jZu7BM3p93lNpn_duTIXLSqCxsn8Az3x5NVGF5iwlvJojqbRLHr5Bpo22m0nAiVhgbGR2T6CyEgyfBRURFMSJRCTik_0N1H5XDepxGGSbQC2UHeHlT8sCT6X4ZIZCnHYdCyxbY9qupBn0MU-qwHkkw8VF6EVHWyy_dxiCCrfODPUTvqiiyD11DDQj8KUKUOEKtcAP-RurzFVHh2MJjggY0tMor4tBRDpb70HUgL1N78kYcjkUzsTBpbHXNaxor4vS-WlpCK0mndO0RBeLnyHMxuEjOnOqq8BBboGQJiNIrOda8KNxaR0lNgfyJadm_CkrSxFtK0iE7ZBqoeMmRtjbyMWTb6XBf4nOaUmDUxMrTG4LZt53jXisZN_FbhqeDa16SkeYwN3zmMpdbHoPDc741ymIHr8qKQGxsgonrcO9Ur9Lhz-YYLmSa9ofXHWNT_ksjCvwZ25cTqN5IIhRAhuL1vbAuIcbWB1FwFzfSZ5QFZWiFXMq53ani0hcK9G8rOtNVGt3t_BCHLmSMTJ19sW-HE_x9rqXMz7MsHekEzYUvvcU-FKT5o98ke_AWNuZz--4gmQ4UhhPI5yrLLvv0Dlu3NpFPVOBAsMmQ5-MkK4XMPF1cs8U-KtK7Bcr4CxKktimjMIka5WGfcFrhJLDOPAeyGtu-m1dgCsy9RXlo5dhP2B9bTPhz4EUWtHnkRNK8uT9y3r74o5xCLlvwuxCWMcxkxEQ==","summary":[{"type":"summary_text","text":"**Quantifying thread classes and naming**"},{"type":"summary_text","text":"**Analyzing connection handler thread lifecycle**"}]},{"id":"fc_0fcf561150331aac016a59d3a0081081909abe9f1599bb362a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker gauges\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"2860-2945\"}","call_id":"call_E642na7qPXx1OZ8R9x6b1VZw","name":"read"},{"id":"fc_0fcf561150331aac016a59d3a008288190997193631d72bcda","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding gauge protocol kinds\",\"pattern\":\"CONN_HANDLER|conn_handler|NET_STREAMS|net_streams|session_count\\\\(|active.*tasks\",\"path\":\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/msg.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/brainproc.rs; crates/spt-daemon/src/daemon.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_PnzkRYGyiXNbavVMG8P7eJIg","name":"grep"},{"id":"fc_0fcf561150331aac016a59d3a008308190ba9a71f5ffa51879","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker serve entry\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3000-3095\"}","call_id":"call_ICG6t1dqh4cGBclTiU5NH8yT","name":"read"},{"id":"fc_0fcf561150331aac016a59d3a008348190a341f81653999ef3","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading network task gauges\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1150-1215,1980-2045\"}","call_id":"call_0otyIVE0JifWc3zKA9iMtnzv","name":"read"}]},"duration":16511.88790000975,"ttft":3389.9255000054836,"contextSnapshot":{"promptTokens":51768,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_E642na7qPXx1OZ8R9x6b1VZw|fc_0fcf561150331aac016a59d3a0081081909abe9f1599bb362a","toolName":"read","startedAt":"2026-07-17T07:02:56.670Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker gauges"},"id":"32d2902f","parentId":"1745e435","timestamp":"2026-07-17T07:02:56.670Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_PnzkRYGyiXNbavVMG8P7eJIg|fc_0fcf561150331aac016a59d3a008288190997193631d72bcda","toolName":"grep","startedAt":"2026-07-17T07:02:56.670Z","args":{"path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/msg.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/brainproc.rs; crates/spt-daemon/src/daemon.rs"},"intent":"Finding gauge protocol kinds"},"id":"a36e8860","parentId":"32d2902f","timestamp":"2026-07-17T07:02:56.670Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ICG6t1dqh4cGBclTiU5NH8yT|fc_0fcf561150331aac016a59d3a008308190ba9a71f5ffa51879","toolName":"read","startedAt":"2026-07-17T07:02:56.670Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker serve entry"},"id":"ae8ee4ad","parentId":"a36e8860","timestamp":"2026-07-17T07:02:56.670Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_0otyIVE0JifWc3zKA9iMtnzv|fc_0fcf561150331aac016a59d3a008348190a341f81653999ef3","toolName":"read","startedAt":"2026-07-17T07:02:56.670Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading network task gauges"},"id":"3f395d60","parentId":"ae8ee4ad","timestamp":"2026-07-17T07:02:56.670Z"}
{"type":"message","id":"c72c30b4","parentId":"3f395d60","timestamp":"2026-07-17T07:02:56.689Z","message":{"role":"toolResult","toolCallId":"call_0otyIVE0JifWc3zKA9iMtnzv|fc_0fcf561150331aac016a59d3a008348190a341f81653999ef3","toolName":"read","content":[{"type":"text","text":"fn epoch_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/// DIAGNOSTIC (round-3): decrement the in-flight dial gauge on drop, so a dial\n/// task that panics or is cancelled still leaves the count correct.\nstruct DialGauge(Arc<AtomicUsize>);\nimpl Drop for DialGauge {\n    fn drop(&mut self) {\n        self.0.fetch_sub(1, Ordering::Relaxed);\n    }\n}\n\nimpl NetHost {\n    /// Bind the broker's endpoint on a fresh dedicated runtime and start the\n    /// accept loop. The endpoint speaks TWO ALPNs (M7 D3, REQ-SUBNET-2): the\n    /// trusted [`SPT_NET_ALPN`] (connections join the table as before) and\n    /// the pre-trust pairing ALPN — routed to the always-on responder\n    /// ([`crate::pairhost::respond`]), never registered in the stream table.\n    /// One endpoint for both is deliberate: the pairing transcript binds and\n    /// pins the REAL node pubkey, and the relay can only route one endpoint\n    /// per key — the ALPN is the pre-trust/trusted boundary (ADR-0005).\n    /// The meet-rotation listener loop rides the same runtime.\n    // [impl->REQ-DAEMON-2]\n    // [impl->REQ-SUBNET-2]\n    pub fn start(cfg: NetConfig) -> io::Result<NetHost> {\n        // Hermeticity guard (REQ-PAIR-8): a loopback-scoped endpoint is the\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n        let endpoint = runtime\n            .block_on(NetEndpoint::bind_scoped(\n                &cfg.identity,\n                cfg.relay.clone(),\n                cfg.discovery,\n                vec![\n                    SPT_NET_ALPN.to_vec(),\n                    spt_net::net::pairing::wire::SPT_PAIR_ALPN.to_vec(),\n                ],\n                cfg.scope,\n            ))\n            .map_err(|e| io::Error::other(e.to_string()))?;\n        let endpoint = Arc::new(endpoint);\n        let shared = Arc::new(NetShared::new());\n        let local_pub = cfg.identity.public_key();\n        let pair_rate = Arc::new(tokio::sync::Mutex::new(\n            spt_net::net::pairing::ratelimit::PairingRateLimiter::new(),\n        ));\n\n        // Accept loop: lives for the endpoint's lifetime on the host's runtime.\n        // Each handshake completes on its own task so a slow peer can't stall\n        // the loop; a failed handshake is simply not registered. The pairing\n        // ALPN routes to the responder; everything else is the trusted table.\n        let roster = Arc::new(Mutex::new(None::<RosterExchange>));\n        let ep = Arc::clone(&endpoint);\n        let sh = Arc::clone(&shared);\n        let rate = Arc::clone(&pair_rate);\n…\n    }\n…\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    }\n\n    /// Gracefully close the endpoint: every held connection flushes its QUIC\n    /// CLOSE so peers' closed-watchers fire promptly (a bare host drop kills\n    /// the runtime first and leaves peers to an idle timeout).\n    pub fn close(&self) {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            endpoint.close().await;\n        });\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn hermetic(identity: &Identity) -> NetConfig {\n        NetConfig {\n            identity: Identity::from_seed(&identity.seed()),\n            relay: RelayPolicy::Disabled,\n            discovery: LocalDiscovery::Off,\n            scope: BindScope::Loopback,\n            membership: None,\n        }\n    }\n\n    // [unit->REQ-DAEMON-2] the endpoint is constructed broker-side (inside the\n    // host's dedicated runtime) with relays disabled, bound to the node's own\n    // identity, with an empty conn table.\n    #[test]\n    fn host_binds_endpoint_to_node_identity() {\n        let id = Identity::generate();\n…\n    }\n…\n}"}],"details":{"displayContent":{"text":"fn epoch_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/// DIAGNOSTIC (round-3): decrement the in-flight dial gauge on drop, so a dial\n/// task that panics or is cancelled still leaves the count correct.\nstruct DialGauge(Arc<AtomicUsize>);\nimpl Drop for DialGauge {\n    fn drop(&mut self) {\n        self.0.fetch_sub(1, Ordering::Relaxed);\n    }\n}\n\nimpl NetHost {\n    /// Bind the broker's endpoint on a fresh dedicated runtime and start the\n    /// accept loop. The endpoint speaks TWO ALPNs (M7 D3, REQ-SUBNET-2): the\n    /// trusted [`SPT_NET_ALPN`] (connections join the table as before) and\n    /// the pre-trust pairing ALPN — routed to the always-on responder\n    /// ([`crate::pairhost::respond`]), never registered in the stream table.\n    /// One endpoint for both is deliberate: the pairing transcript binds and\n    /// pins the REAL node pubkey, and the relay can only route one endpoint\n    /// per key — the ALPN is the pre-trust/trusted boundary (ADR-0005).\n    /// The meet-rotation listener loop rides the same runtime.\n    // [impl->REQ-DAEMON-2]\n    // [impl->REQ-SUBNET-2]\n    pub fn start(cfg: NetConfig) -> io::Result<NetHost> {\n        // Hermeticity guard (REQ-PAIR-8): a loopback-scoped endpoint is the\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n        let endpoint = runtime\n            .block_on(NetEndpoint::bind_scoped(\n                &cfg.identity,\n                cfg.relay.clone(),\n                cfg.discovery,\n                vec![\n                    SPT_NET_ALPN.to_vec(),\n                    spt_net::net::pairing::wire::SPT_PAIR_ALPN.to_vec(),\n                ],\n                cfg.scope,\n            ))\n            .map_err(|e| io::Error::other(e.to_string()))?;\n        let endpoint = Arc::new(endpoint);\n        let shared = Arc::new(NetShared::new());\n        let local_pub = cfg.identity.public_key();\n        let pair_rate = Arc::new(tokio::sync::Mutex::new(\n            spt_net::net::pairing::ratelimit::PairingRateLimiter::new(),\n        ));\n\n        // Accept loop: lives for the endpoint's lifetime on the host's runtime.\n        // Each handshake completes on its own task so a slow peer can't stall\n        // the loop; a failed handshake is simply not registered. The pairing\n        // ALPN routes to the responder; everything else is the trusted table.\n        let roster = Arc::new(Mutex::new(None::<RosterExchange>));\n        let ep = Arc::clone(&endpoint);\n        let sh = Arc::clone(&shared);\n        let rate = Arc::clone(&pair_rate);\n…\n    }\n…\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    }\n\n    /// Gracefully close the endpoint: every held connection flushes its QUIC\n    /// CLOSE so peers' closed-watchers fire promptly (a bare host drop kills\n    /// the runtime first and leaves peers to an idle timeout).\n    pub fn close(&self) {\n        let endpoint = Arc::clone(&self.endpoint);\n        self.runtime.handle().block_on(async move {\n            endpoint.close().await;\n        });\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn hermetic(identity: &Identity) -> NetConfig {\n        NetConfig {\n            identity: Identity::from_seed(&identity.seed()),\n            relay: RelayPolicy::Disabled,\n            discovery: LocalDiscovery::Off,\n            scope: BindScope::Loopback,\n            membership: None,\n        }\n    }\n\n    // [unit->REQ-DAEMON-2] the endpoint is constructed broker-side (inside the\n    // host's dedicated runtime) with relays disabled, bound to the node's own\n    // identity, with an empty conn table.\n    #[test]\n    fn host_binds_endpoint_to_node_identity() {\n        let id = Identity::generate();\n…\n    }\n…\n}","startLine":1150,"lineNumbers":[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,null,1312,null,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,null,2050,null,2864]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784271776689}}
{"type":"message","id":"f6de701e","parentId":"c72c30b4","timestamp":"2026-07-17T07:02:56.735Z","message":{"role":"toolResult","toolCallId":"call_E642na7qPXx1OZ8R9x6b1VZw|fc_0fcf561150331aac016a59d3a0081081909abe9f1599bb362a","toolName":"read","content":[{"type":"text","text":"    pub fn test_seed_wedged_local_controller(&self, id: u64, blocked_ms_ago: u64) -> bool {\n…\n        static SEED_SEQ: AtomicU32 = AtomicU32::new(0);\n        let name = format!(\n            \"spt-daemon-wedgeseed-{}-{}.sock\",\n            std::process::id(),\n            SEED_SEQ.fetch_add(1, Ordering::Relaxed)\n        );\n        let Ok(listener) = LocalSocketTransport::bind(&name) else {\n            return false;\n        };\n        let Ok(_client) = LocalSocketTransport::connect(&name) else {\n            return false;\n        };\n        let Ok(server) = listener.accept() else {\n            return false;\n        };\n        let (_recv, send_half) = server.split();\n        let send: SharedSend = Arc::new(BrokerConn::new(send_half, brain_write_deadline()));\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        // Drain-forever (never a socket write, never finishes while tx lives):\n        // stays un-reapable as a live-but-wedged writer even under child output.\n        let writer = thread::spawn(move || for _ in rx.iter() {});\n        recover_log(&log).controller = Some(ControllerSink {\n            tx,\n            send,\n            attach_gen: 0,\n            by: None,\n            last_ok: Instant::now(),\n            write_blocked_since: Arc::new(Mutex::new(Some(blocked))),\n            _writer: writer,\n        });\n        true\n    }\n\n    /// TEST-SUPPORT seam for the round-3 structural resume guard (stale-guard\n    /// swap, doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md`): the\n    /// count of read-only viewers currently attached to hosted session `id`,\n    /// or `None` if no session with that id is hosted. Lets the deterministic\n    /// zero-subscriber resume guard assert — with no timing window — that the\n    /// daemon brain's cursor-only resume attaches NO subscriber to any session,\n    /// while the paired hazard arm (a `resume_sessions` subscribe) is observed\n    /// to raise the same count to >= 1. Follows the exact locking idiom of\n    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n    /// `#[doc(hidden)]` — test support, not a product surface.\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    #[doc(hidden)]\n    pub fn test_session_viewer_count(&self, id: u64) -> Option<usize> {\n        let log = {\n            let sessions = recover(&self.sessions);\n            match sessions.get(&id) {\n                Some(h) => Arc::clone(&h.log),\n                None => return None,\n            }\n        };\n        let count = recover_log(&log).viewers.len();\n        Some(count)\n    }\n\n    /// Live per-connection handler threads (for tests / introspection). The\n    /// UPDATE-WEDGE round-4 gate watches this fall when a poisoned physical conn\n    /// drives its handler to EOF cleanup within the write bound — without the\n    /// black-holed client dropping its end.\n    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n    pub fn conn_handler_count(&self) -> usize {\n        self.conn_handlers.load(Ordering::Acquire)\n    }\n\n    /// The live **resident adapter children** (translation binaries) for\n    /// `endpoint` — the processes a live adapter update (W3d) stops and restarts\n    /// so the install dir's locked binaries free up. The broker `sessions` map IS\n    /// the per-endpoint resident registry (W3a, ADR-0025): each `HostedSession`\n    /// already carries its `endpoint` + lifecycle-managed `translation` child.\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn resident_translations_for_endpoint(&self, endpoint: &str) -> Vec<Arc<Translation>> {\n        let map = recover(&self.sessions);\n        map.values()\n            .filter(|s| s.endpoint == endpoint)\n            .filter_map(|s| s.translation.clone())\n            .collect()\n    }\n\n    /// The live endpoints running `adapter`, each with its install dir — the apply\n    /// targets for a live adapter update (W3d decides daemon-apply vs CLI-direct\n    /// from whether this is empty). Distinct, sorted. (W3a, ADR-0025)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn endpoints_running_adapter(&self, adapter: &str) -> Vec<(String, std::path::PathBuf)> {\n        let rows: Vec<_> = {\n            let map = recover(&self.sessions);\n…\n        };\n…\n    }\n\n[Showing lines 2859-2948 of 6298. Use :2949 to continue]"}],"details":{"truncation":{"content":"        static SEED_SEQ: AtomicU32 = AtomicU32::new(0);\n        let name = format!(\n            \"spt-daemon-wedgeseed-{}-{}.sock\",\n            std::process::id(),\n            SEED_SEQ.fetch_add(1, Ordering::Relaxed)\n        );\n        let Ok(listener) = LocalSocketTransport::bind(&name) else {\n            return false;\n        };\n        let Ok(_client) = LocalSocketTransport::connect(&name) else {\n            return false;\n        };\n        let Ok(server) = listener.accept() else {\n            return false;\n        };\n        let (_recv, send_half) = server.split();\n        let send: SharedSend = Arc::new(BrokerConn::new(send_half, brain_write_deadline()));\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        // Drain-forever (never a socket write, never finishes while tx lives):\n        // stays un-reapable as a live-but-wedged writer even under child output.\n        let writer = thread::spawn(move || for _ in rx.iter() {});\n        recover_log(&log).controller = Some(ControllerSink {\n            tx,\n            send,\n            attach_gen: 0,\n            by: None,\n            last_ok: Instant::now(),\n            write_blocked_since: Arc::new(Mutex::new(Some(blocked))),\n            _writer: writer,\n        });\n        true\n    }\n\n    /// TEST-SUPPORT seam for the round-3 structural resume guard (stale-guard\n    /// swap, doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md`): the\n    /// count of read-only viewers currently attached to hosted session `id`,\n    /// or `None` if no session with that id is hosted. Lets the deterministic\n    /// zero-subscriber resume guard assert — with no timing window — that the\n    /// daemon brain's cursor-only resume attaches NO subscriber to any session,\n    /// while the paired hazard arm (a `resume_sessions` subscribe) is observed\n    /// to raise the same count to >= 1. Follows the exact locking idiom of\n    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n    /// `#[doc(hidden)]` — test support, not a product surface.\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    #[doc(hidden)]\n    pub fn test_session_viewer_count(&self, id: u64) -> Option<usize> {\n        let log = {\n            let sessions = recover(&self.sessions);\n            match sessions.get(&id) {\n                Some(h) => Arc::clone(&h.log),\n                None => return None,\n            }\n        };\n        let count = recover_log(&log).viewers.len();\n        Some(count)\n    }\n\n    /// Live per-connection handler threads (for tests / introspection). The\n    /// UPDATE-WEDGE round-4 gate watches this fall when a poisoned physical conn\n    /// drives its handler to EOF cleanup within the write bound — without the\n    /// black-holed client dropping its end.\n    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n    pub fn conn_handler_count(&self) -> usize {\n        self.conn_handlers.load(Ordering::Acquire)\n    }\n\n    /// The live **resident adapter children** (translation binaries) for\n    /// `endpoint` — the processes a live adapter update (W3d) stops and restarts\n    /// so the install dir's locked binaries free up. The broker `sessions` map IS\n    /// the per-endpoint resident registry (W3a, ADR-0025): each `HostedSession`\n    /// already carries its `endpoint` + lifecycle-managed `translation` child.\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn resident_translations_for_endpoint(&self, endpoint: &str) -> Vec<Arc<Translation>> {\n        let map = recover(&self.sessions);\n        map.values()\n            .filter(|s| s.endpoint == endpoint)\n            .filter_map(|s| s.translation.clone())\n            .collect()\n    }\n\n    /// The live endpoints running `adapter`, each with its install dir — the apply\n    /// targets for a live adapter update (W3d decides daemon-apply vs CLI-direct\n    /// from whether this is empty). Distinct, sorted. (W3a, ADR-0025)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn endpoints_running_adapter(&self, adapter: &str) -> Vec<(String, std::path::PathBuf)> {\n        let rows: Vec<_> = {\n            let map = recover(&self.sessions);","truncated":true,"truncatedBy":"lines","totalLines":3440,"totalBytes":4371,"outputLines":90,"outputBytes":4371,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn test_seed_wedged_local_controller(&self, id: u64, blocked_ms_ago: u64) -> bool {\n…\n        static SEED_SEQ: AtomicU32 = AtomicU32::new(0);\n        let name = format!(\n            \"spt-daemon-wedgeseed-{}-{}.sock\",\n            std::process::id(),\n            SEED_SEQ.fetch_add(1, Ordering::Relaxed)\n        );\n        let Ok(listener) = LocalSocketTransport::bind(&name) else {\n            return false;\n        };\n        let Ok(_client) = LocalSocketTransport::connect(&name) else {\n            return false;\n        };\n        let Ok(server) = listener.accept() else {\n            return false;\n        };\n        let (_recv, send_half) = server.split();\n        let send: SharedSend = Arc::new(BrokerConn::new(send_half, brain_write_deadline()));\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        // Drain-forever (never a socket write, never finishes while tx lives):\n        // stays un-reapable as a live-but-wedged writer even under child output.\n        let writer = thread::spawn(move || for _ in rx.iter() {});\n        recover_log(&log).controller = Some(ControllerSink {\n            tx,\n            send,\n            attach_gen: 0,\n            by: None,\n            last_ok: Instant::now(),\n            write_blocked_since: Arc::new(Mutex::new(Some(blocked))),\n            _writer: writer,\n        });\n        true\n    }\n\n    /// TEST-SUPPORT seam for the round-3 structural resume guard (stale-guard\n    /// swap, doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md`): the\n    /// count of read-only viewers currently attached to hosted session `id`,\n    /// or `None` if no session with that id is hosted. Lets the deterministic\n    /// zero-subscriber resume guard assert — with no timing window — that the\n    /// daemon brain's cursor-only resume attaches NO subscriber to any session,\n    /// while the paired hazard arm (a `resume_sessions` subscribe) is observed\n    /// to raise the same count to >= 1. Follows the exact locking idiom of\n    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n    /// `#[doc(hidden)]` — test support, not a product surface.\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    #[doc(hidden)]\n    pub fn test_session_viewer_count(&self, id: u64) -> Option<usize> {\n        let log = {\n            let sessions = recover(&self.sessions);\n            match sessions.get(&id) {\n                Some(h) => Arc::clone(&h.log),\n                None => return None,\n            }\n        };\n        let count = recover_log(&log).viewers.len();\n        Some(count)\n    }\n\n    /// Live per-connection handler threads (for tests / introspection). The\n    /// UPDATE-WEDGE round-4 gate watches this fall when a poisoned physical conn\n    /// drives its handler to EOF cleanup within the write bound — without the\n    /// black-holed client dropping its end.\n    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n    pub fn conn_handler_count(&self) -> usize {\n        self.conn_handlers.load(Ordering::Acquire)\n    }\n\n    /// The live **resident adapter children** (translation binaries) for\n    /// `endpoint` — the processes a live adapter update (W3d) stops and restarts\n    /// so the install dir's locked binaries free up. The broker `sessions` map IS\n    /// the per-endpoint resident registry (W3a, ADR-0025): each `HostedSession`\n    /// already carries its `endpoint` + lifecycle-managed `translation` child.\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn resident_translations_for_endpoint(&self, endpoint: &str) -> Vec<Arc<Translation>> {\n        let map = recover(&self.sessions);\n        map.values()\n            .filter(|s| s.endpoint == endpoint)\n            .filter_map(|s| s.translation.clone())\n            .collect()\n    }\n\n    /// The live endpoints running `adapter`, each with its install dir — the apply\n    /// targets for a live adapter update (W3d decides daemon-apply vs CLI-direct\n    /// from whether this is empty). Distinct, sorted. (W3a, ADR-0025)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    #[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)\n    fn endpoints_running_adapter(&self, adapter: &str) -> Vec<(String, std::path::PathBuf)> {\n        let rows: Vec<_> = {\n            let map = recover(&self.sessions);\n…\n        };\n…\n    }","startLine":2843,"lineNumbers":[2843,null,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,null,2952,null,2954]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":4371,"outputLines":90,"outputBytes":4371,"shownRange":{"start":2859,"end":2948},"nextOffset":2949}}},"isError":false,"timestamp":1784271776735}}
{"type":"message","id":"782d676a","parentId":"f6de701e","timestamp":"2026-07-17T07:02:56.771Z","message":{"role":"toolResult","toolCallId":"call_ICG6t1dqh4cGBclTiU5NH8yT|fc_0fcf561150331aac016a59d3a008308190ba9a71f5ffa51879","toolName":"read","content":[{"type":"text","text":"    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n…\n            }\n        }\n…\n    }\n\n[Showing lines 2999-3098 of 6298. Use :3099 to continue]"}],"details":{"truncation":{"content":"    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),","truncated":true,"truncatedBy":"lines","totalLines":3300,"totalBytes":4717,"outputLines":100,"outputBytes":4717,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n…\n            }\n        }\n…\n    }","startLine":2999,"lineNumbers":[2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,null,3258,3259,null,3289]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":4717,"outputLines":100,"outputBytes":4717,"shownRange":{"start":2999,"end":3098},"nextOffset":3099}}},"isError":false,"timestamp":1784271776771}}
{"type":"message","id":"a0fc648c","parentId":"782d676a","timestamp":"2026-07-17T07:02:56.772Z","message":{"role":"toolResult","toolCallId":"call_PnzkRYGyiXNbavVMG8P7eJIg|fc_0fcf561150331aac016a59d3a008288190997193631d72bcda","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\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_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 69|    KIND_SPAWNED, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,\n...\n 2611|    /// bound WITHOUT the client dropping — the test watches this count fall.\n*2612|    conn_handlers: AtomicUsize,\n 2613|}\n 2614|\n 2615|/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\n...\n 2743|            wake_inflight: Mutex::new(HashSet::new()),\n*2744|            conn_handlers: AtomicUsize::new(0),\n 2745|        }))\n 2746|    }\n 2747|\n...\n 2823|    /// Number of currently hosted sessions (for tests / introspection).\n*2824|    pub fn session_count(&self) -> usize {\n 2825|        recover(&self.sessions).len()\n 2826|    }\n 2827|\n...\n 2921|    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*2922|    pub fn conn_handler_count(&self) -> usize {\n*2923|        self.conn_handlers.load(Ordering::Acquire)\n 2924|    }\n 2925|\n 2926|    /// The live **resident adapter children** (translation binaries) for\n...\n 3026|        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n*3027|        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028|        struct HandlerTally<'a>(&'a AtomicUsize);\n 3029|        impl Drop for HandlerTally<'_> {\n 3030|            fn drop(&mut self) {\n...\n 3033|        }\n*3034|        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n*3035|        let _tally = HandlerTally(&self.conn_handlers);\n 3036|\n 3037|        let (mut recv, send) = conn.split();\n 3038|        // Round-4: the send half is owned by the bounded/cancelable conn\n...\n 3140|                }\n*3141|                KIND_NET_STREAMS => {\n*3142|                    if let Err(msg) = self.dispatch_net_streams(&send) {\n 3143|                        send_error(&send, &msg);\n 3144|                    }\n 3145|                }\n...\n 4365|    /// brain uses to find streams that arrived while it was down.\n*4366|    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\n 4367|        let host = self.net.get().ok_or(\"net disabled\")?;\n 4368|        let frame = Envelope::new(\n*4369|            KIND_NET_STREAMS_REPLY,\n 4370|            serde_json::to_value(NetStreamsReply {\n 4371|                streams: host.stream_infos(),\n 4372|            })\n## msg.rs\n 136|/// down — no announce buffer to miss.\n*137|pub const KIND_NET_STREAMS: &str = \"net-streams\";\n 138|/// Broker→brain: the held-streams reply.\n*139|pub const KIND_NET_STREAMS_REPLY: &str = \"net-streams-reply\";\n 140|/// Brain→broker: (re)subscribe to a stream's buffered reads from a cursor —\n 141|/// the PTY `subscribe` discipline applied to a QUIC stream (gapless resume).\n 142|pub const KIND_NET_STREAM_SUBSCRIBE: &str = \"net-stream-subscribe\";\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_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...\n 787|                }\n*788|                KIND_NET_STREAMS_REPLY => {\n 789|                    let ev: NetStreamsReply = serde_json::from_value(env.payload)\n 790|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 791|                    return Ok(BrokerEvent::NetStreams(ev));\n...\n 1435|    /// finds streams (incl. peer-initiated ones) that arrived while it was down.\n*1436|    pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {\n*1437|        self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;\n 1438|        loop {\n 1439|            match self.read_event()? {\n 1440|                BrokerEvent::NetStreams(ev) => return Ok(ev),"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs, crates/spt-daemon/src/msg.rs, crates/spt-daemon/src/brain.rs, crates/spt-daemon/src/brainproc.rs, crates/spt-daemon/src/daemon.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":19,"fileCount":3,"files":["crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/msg.rs","crates/spt-daemon/src/brain.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":13},{"path":"crates/spt-daemon/src/msg.rs","count":2},{"path":"crates/spt-daemon/src/brain.rs","count":4}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\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_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   69│    KIND_SPAWNED, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,\n     │...\n 2611│    /// bound WITHOUT the client dropping — the test watches this count fall.\n*2612│    conn_handlers: AtomicUsize,\n 2613│}\n 2614│\n 2615│/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\n     │...\n 2743│            wake_inflight: Mutex::new(HashSet::new()),\n*2744│            conn_handlers: AtomicUsize::new(0),\n 2745│        }))\n 2746│    }\n 2747│\n     │...\n 2823│    /// Number of currently hosted sessions (for tests / introspection).\n*2824│    pub fn session_count(&self) -> usize {\n 2825│        recover(&self.sessions).len()\n 2826│    }\n 2827│\n     │...\n 2921│    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*2922│    pub fn conn_handler_count(&self) -> usize {\n*2923│        self.conn_handlers.load(Ordering::Acquire)\n 2924│    }\n 2925│\n 2926│    /// The live **resident adapter children** (translation binaries) for\n     │...\n 3026│        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n*3027│        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028│        struct HandlerTally<'a>(&'a AtomicUsize);\n 3029│        impl Drop for HandlerTally<'_> {\n 3030│            fn drop(&mut self) {\n     │...\n 3033│        }\n*3034│        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n*3035│        let _tally = HandlerTally(&self.conn_handlers);\n 3036│\n 3037│        let (mut recv, send) = conn.split();\n 3038│        // Round-4: the send half is owned by the bounded/cancelable conn\n     │...\n 3140│                }\n*3141│                KIND_NET_STREAMS => {\n*3142│                    if let Err(msg) = self.dispatch_net_streams(&send) {\n 3143│                        send_error(&send, &msg);\n 3144│                    }\n 3145│                }\n     │...\n 4365│    /// brain uses to find streams that arrived while it was down.\n*4366│    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\n 4367│        let host = self.net.get().ok_or(\"net disabled\")?;\n 4368│        let frame = Envelope::new(\n*4369│            KIND_NET_STREAMS_REPLY,\n 4370│            serde_json::to_value(NetStreamsReply {\n 4371│                streams: host.stream_infos(),\n 4372│            })\n## msg.rs\n 136│/// down — no announce buffer to miss.\n*137│pub const KIND_NET_STREAMS: &str = \"net-streams\";\n 138│/// Broker→brain: the held-streams reply.\n*139│pub const KIND_NET_STREAMS_REPLY: &str = \"net-streams-reply\";\n 140│/// Brain→broker: (re)subscribe to a stream's buffered reads from a cursor —\n 141│/// the PTY `subscribe` discipline applied to a QUIC stream (gapless resume).\n 142│pub const KIND_NET_STREAM_SUBSCRIBE: &str = \"net-stream-subscribe\";\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_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     │...\n  787│                }\n *788│                KIND_NET_STREAMS_REPLY => {\n  789│                    let ev: NetStreamsReply = serde_json::from_value(env.payload)\n  790│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n  791│                    return Ok(BrokerEvent::NetStreams(ev));\n     │...\n 1435│    /// finds streams (incl. peer-initiated ones) that arrived while it was down.\n*1436│    pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {\n*1437│        self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;\n 1438│        loop {\n 1439│            match self.read_event()? {\n 1440│                BrokerEvent::NetStreams(ev) => return Ok(ev),"},"isError":false,"timestamp":1784271776772}}
{"type":"message","id":"7d7244f5","parentId":"a0fc648c","timestamp":"2026-07-17T07:03:04.382Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning exact loop cleanup**"},{"type":"toolCall","id":"call_1pu1v76od1KgvoM07j1nVeKR|fc_0fcf561150331aac016a59d3a7b82c819085c8c263c4e1d88d","name":"read","arguments":{"i":"Reading connection cleanup","path":"crates/spt-daemon/src/broker.rs","selector":"3230-3305"}},{"type":"toolCall","id":"call_sLYTu5L24Eg3GGsFMmoYYmo6|fc_0fcf561150331aac016a59d3a7b97c819081de870cd86550dd","name":"read","arguments":{"i":"Reading network subscriptions","path":"crates/spt-daemon/src/nethost.rs","selector":"490-585,1725-1810,1880-1930"}},{"type":"toolCall","id":"call_kRRi7djcQjMDsZ8jTU0RUWGj|fc_0fcf561150331aac016a59d3a7b9848190b5c09397e380ae54","name":"read","arguments":{"i":"Reading subscriber worker","path":"crates/spt-daemon/src/nethost.rs","selector":"165-235"}},{"type":"toolCall","id":"call_om8ffx86H1uVclfDRUOq30tm|fc_0fcf561150331aac016a59d3a7b98c81909494940fc801f047","name":"read","arguments":{"i":"Reading broker writer loops","path":"crates/spt-daemon/src/broker.rs","selector":"1405-1610,1765-1835"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9625,"output":194,"cacheRead":47616,"cacheWrite":0,"totalTokens":57435,"reasoningTokens":11,"cost":{"input":0.048125,"output":0.0058200000000000005,"cacheRead":0.023808,"cacheWrite":0,"total":0.077753}},"stopReason":"toolUse","timestamp":1784271776816,"responseId":"resp_0fcf561150331aac016a59d3a109688190a1e5bc14bc871c83","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3a417f88190bdd0eaa1afbdc9ae","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdOnuBAiOdpoFHm-8MUa-nLe9Ds88SVUWhuH3R5qBtdy0PrQGuyVsl17rzrE-eRUmSZneOOv_r6TvDZggsIcfhxrs7MIstK31IdfL1yvfrvjr4wy_UHuFEF7edPmy68yPvsgGKf5aEMz4jkqhj5oJCtriEfQZqdQ_NvMdvus2JVyRxpZZy81gIGefa3Zr8GcPZh-a4zhRluZr32XBggyrsEBPMeNippyWPUFeDpcT5RGNenAFp2Y44yptDvgUiWJkEqR0e-ya_CA6Z9yIm7LW59hL56GxVCCNG0SzINCv01IqQ4GYH_Db7HDKQMrzqKfiDurfmH5HjO-q60u0t6bvVZuyrXSdSGakAOHt2kqFe9xPFgQGPKth9LVSSNqEJmNrbaCzr2pTv9caGfuo5w77HhZXXdwoTunncmLrIkJSofc3wJDC05M_j8nXL1JyTXZp5mRoByMGjMmYIe0oBlkpXEqeXgBF-VA5PlA3P-PlWTJig0VkPqub1FP4LyZLMUpQRebwfftjlP_S93Y9RHXchkEgfVT8MT20Y_Y4eM7u46MwNkyz-sHO8sFYBigyO5UhOV6zY57PJOSBtqwQZU3Kn_5x0w41wes4VC4bSxOEi9MkV3BQp-Tys2ikfDvzz36nDkOFIQrtm2a0Sktc6qyONfZdeLoGhWEztFmhmgc3u0WIfBLKA9sRrI518zrBV4QfcyeUKYxdlrQbRCTDicy4BSq_f5cj-HPW3C44En6-BNv-TdvqSsyR5o2UrNkWDsxKr8Ice-UEIqwS0HejwT-iPDUms8yGqQI70RrSaFSk-Ak_ec_yGz0ZMFlcSzoB6a0mrN2e_2sBGhYvCX3836p-FzRK37mUSs0JP4Dgj_9u0-QKK4pCcu5SJu2VS0bXE3k3DeROVUEmPlzSo4450SngiXPf4obGR3PpgVWDcIxHUHNH2__WLN93gvshLrz5lloVAT7zibR1bbRKlY6jDqiepF-SQ==","summary":[{"type":"summary_text","text":"**Planning exact loop cleanup**"}]},{"id":"fc_0fcf561150331aac016a59d3a7b82c819085c8c263c4e1d88d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading connection cleanup\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3230-3305\"}","call_id":"call_1pu1v76od1KgvoM07j1nVeKR","name":"read"},{"id":"fc_0fcf561150331aac016a59d3a7b97c819081de870cd86550dd","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading network subscriptions\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"490-585,1725-1810,1880-1930\"}","call_id":"call_sLYTu5L24Eg3GGsFMmoYYmo6","name":"read"},{"id":"fc_0fcf561150331aac016a59d3a7b9848190b5c09397e380ae54","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading subscriber worker\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"165-235\"}","call_id":"call_kRRi7djcQjMDsZ8jTU0RUWGj","name":"read"},{"id":"fc_0fcf561150331aac016a59d3a7b98c81909494940fc801f047","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker writer loops\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1405-1610,1765-1835\"}","call_id":"call_om8ffx86H1uVclfDRUOq30tm","name":"read"}]},"duration":7564.932400003076,"ttft":3292.3837999999523,"contextSnapshot":{"promptTokens":57241,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_1pu1v76od1KgvoM07j1nVeKR|fc_0fcf561150331aac016a59d3a7b82c819085c8c263c4e1d88d","toolName":"read","startedAt":"2026-07-17T07:03:04.383Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading connection cleanup"},"id":"b260996e","parentId":"7d7244f5","timestamp":"2026-07-17T07:03:04.383Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_sLYTu5L24Eg3GGsFMmoYYmo6|fc_0fcf561150331aac016a59d3a7b97c819081de870cd86550dd","toolName":"read","startedAt":"2026-07-17T07:03:04.383Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading network subscriptions"},"id":"c94e07f7","parentId":"b260996e","timestamp":"2026-07-17T07:03:04.383Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_kRRi7djcQjMDsZ8jTU0RUWGj|fc_0fcf561150331aac016a59d3a7b9848190b5c09397e380ae54","toolName":"read","startedAt":"2026-07-17T07:03:04.383Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading subscriber worker"},"id":"110e2ee6","parentId":"c94e07f7","timestamp":"2026-07-17T07:03:04.383Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_om8ffx86H1uVclfDRUOq30tm|fc_0fcf561150331aac016a59d3a7b98c81909494940fc801f047","toolName":"read","startedAt":"2026-07-17T07:03:04.383Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker writer loops"},"id":"9dc719ef","parentId":"110e2ee6","timestamp":"2026-07-17T07:03:04.383Z"}
{"type":"message","id":"cb53ff69","parentId":"9dc719ef","timestamp":"2026-07-17T07:03:04.419Z","message":{"role":"toolResult","toolCallId":"call_om8ffx86H1uVclfDRUOq30tm|fc_0fcf561150331aac016a59d3a7b98c81909494940fc801f047","toolName":"read","content":[{"type":"text","text":"impl OutputLog {\n…\n    fn is_controller(&self, sub: &SharedSend) -> bool {\n…\n    }\n\n    /// The next seq a re-attaching controller still needs (the persisted resume\n    /// cursor surfaced in `KIND_SESSIONS` → `resume_seq`). W1: read from the\n    /// atomic the controller writer thread advances.\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n    // isolation is preserved). REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT.\n    // [impl->REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT]\n    if evicted.load(Ordering::Acquire) {\n        let marker = evicted_envelope(session_id);\n        let _ = send.write(&marker);\n    }\n}\n\n/// Round-4 observability bridge: a controller writer whose bounded conn write\n/// was DEADLINE-retired (`TimedOut` — the conn watchdog aborted a wedged\n/// write, or a gate-wait behind one exhausted the bound) IS the\n/// brain-subscriber stall-evict fact the W2 tally counts. Pre-round-4 that\n/// wedge aged until a logical sampler (`stall_evict_controller`) observed it;\n/// the physical bound now fires FIRST, so the tally is recorded here — same\n/// event class, same `daemon status` surface. An ORGANIC write failure (peer\n/// death, any non-TimedOut error) stays uncounted, exactly as before.\n// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\nfn note_controller_write_retired(sid: u64, conn: u64, e: &io::Error) {\n    if e.kind() != io::ErrorKind::TimedOut {\n        return;\n    }\n    // conn id + stamps (F-039 leg b). [impl->REQ-CONN-POISON-ATTRIBUTION]\n    eprintln!(\n        \"BRAIN_SUBSCRIBER_STALL_EVICT:{sid} conn={conn} {} — controller conn write \\\n         exceeded its bound; physical conn poisoned + retired (writer released, EOF \\\n         cleanup follows) [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n        crate::conn::log_stamp()\n    );\n    record_stall_evict();\n}\n\n/// A message to the CONTROLLER writer thread (W1). `Output` carries a sequenced\n/// chunk and advances the authoritative `delivered_through` on a successful\n/// write; `Control` is an out-of-band notice (Displaced, …) that is written but\n/// does NOT move the resume cursor.\nenum CtrlMsg {\n    Output(u64, Envelope),\n    Control(Envelope),\n}\n\n/// Advance the shared `delivered_through` cursor to `seq + 1`, monotonically\n/// (D4-1, via [`advanced_cursor`]) and CAS-safe against a brief two-writer\n/// overlap during a controller displace.\nfn advance_delivered(dt: &AtomicU64, seq: u64) {\n    let mut cur = dt.load(Ordering::Acquire);\n    loop {\n        let next = advanced_cursor(cur, seq, true);\n        if next == cur {\n            return;\n        }\n        match dt.compare_exchange_weak(cur, next, Ordering::AcqRel, Ordering::Acquire) {\n            Ok(_) => return,\n            Err(actual) => cur = actual,\n        }\n    }\n}\n\n/// Advance the controller resume cursor CONTIGUOUSLY (b4 / the (a) B2-gate): move to\n/// `seq + 1` ONLY when the cursor is EXACTLY `seq` (the next expected seq). A gap\n/// (`seq > cursor` — a frame the drain dropped while the controller channel was Full,\n/// the b4 backpressure) FREEZES the cursor at last-contiguous, so a re-attaching\n/// brain's `resume_seq` never skips a dropped chunk (a high-watermark jump PAST the\n/// gap would be a not-exactly-once / non-gapless resume = a B2 violation). An\n/// already-delivered `seq` (`seq < cursor`, a rewind re-send) is a no-op. A single CAS,\n/// no loop: it advances by exactly one, or not at all. In the NO-DROP path (every\n/// live frame is contiguous) this is identical to [`advance_delivered`].\n// [impl->REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE]\nfn contiguous_advance(dt: &AtomicU64, seq: u64) {\n    let _ = dt.compare_exchange(seq, seq + 1, Ordering::AcqRel, Ordering::Acquire);\n}\n\n/// The interactive CONTROLLER's dedicated writer thread (W1 /\n/// REQ-HAZARD-INJECT-CONTROL-COEXIST) — the authoritative analog of\n/// [`viewer_writer`]. Write the `initial` ring-replay batch (advancing the resume\n/// cursor on each success), then drain live [`CtrlMsg`]s with a BLOCKING socket\n/// write each — so a backed-up controller blocks ONLY this thread, never the\n/// session drain (which used to write the controller inline under the log lock).\n/// A failed write (dead operator) ends the thread; the drain's next bounded\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n…\n            }\n        }\n…\n    }\n…\n}\n…\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n                true\n            }\n            Err(TrySendError::Full(_)) => {\n                // DROP + surface, but stamp only on the rising edge.\n                if !self.backpressure.swap(true, Ordering::AcqRel) {\n                    self.stamp_backpressure(true);\n                }\n                false\n            }\n            // The writer thread is gone (session teardown) — nothing to do.\n            Err(TrySendError::Disconnected(_)) => false,\n        }\n    }\n\n    /// Mirror the input-backpressure signal to the perch's `info.json` (the\n    /// broker is the single writer). Best-effort: a session served without a\n    /// perch (raw broker tests) has nowhere to record.\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}"}],"details":{"displayContent":{"text":"impl OutputLog {\n…\n    fn is_controller(&self, sub: &SharedSend) -> bool {\n…\n    }\n\n    /// The next seq a re-attaching controller still needs (the persisted resume\n    /// cursor surfaced in `KIND_SESSIONS` → `resume_seq`). W1: read from the\n    /// atomic the controller writer thread advances.\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n    // isolation is preserved). REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT.\n    // [impl->REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT]\n    if evicted.load(Ordering::Acquire) {\n        let marker = evicted_envelope(session_id);\n        let _ = send.write(&marker);\n    }\n}\n\n/// Round-4 observability bridge: a controller writer whose bounded conn write\n/// was DEADLINE-retired (`TimedOut` — the conn watchdog aborted a wedged\n/// write, or a gate-wait behind one exhausted the bound) IS the\n/// brain-subscriber stall-evict fact the W2 tally counts. Pre-round-4 that\n/// wedge aged until a logical sampler (`stall_evict_controller`) observed it;\n/// the physical bound now fires FIRST, so the tally is recorded here — same\n/// event class, same `daemon status` surface. An ORGANIC write failure (peer\n/// death, any non-TimedOut error) stays uncounted, exactly as before.\n// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n// [impl->REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\nfn note_controller_write_retired(sid: u64, conn: u64, e: &io::Error) {\n    if e.kind() != io::ErrorKind::TimedOut {\n        return;\n    }\n    // conn id + stamps (F-039 leg b). [impl->REQ-CONN-POISON-ATTRIBUTION]\n    eprintln!(\n        \"BRAIN_SUBSCRIBER_STALL_EVICT:{sid} conn={conn} {} — controller conn write \\\n         exceeded its bound; physical conn poisoned + retired (writer released, EOF \\\n         cleanup follows) [REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE]\",\n        crate::conn::log_stamp()\n    );\n    record_stall_evict();\n}\n\n/// A message to the CONTROLLER writer thread (W1). `Output` carries a sequenced\n/// chunk and advances the authoritative `delivered_through` on a successful\n/// write; `Control` is an out-of-band notice (Displaced, …) that is written but\n/// does NOT move the resume cursor.\nenum CtrlMsg {\n    Output(u64, Envelope),\n    Control(Envelope),\n}\n\n/// Advance the shared `delivered_through` cursor to `seq + 1`, monotonically\n/// (D4-1, via [`advanced_cursor`]) and CAS-safe against a brief two-writer\n/// overlap during a controller displace.\nfn advance_delivered(dt: &AtomicU64, seq: u64) {\n    let mut cur = dt.load(Ordering::Acquire);\n    loop {\n        let next = advanced_cursor(cur, seq, true);\n        if next == cur {\n            return;\n        }\n        match dt.compare_exchange_weak(cur, next, Ordering::AcqRel, Ordering::Acquire) {\n            Ok(_) => return,\n            Err(actual) => cur = actual,\n        }\n    }\n}\n\n/// Advance the controller resume cursor CONTIGUOUSLY (b4 / the (a) B2-gate): move to\n/// `seq + 1` ONLY when the cursor is EXACTLY `seq` (the next expected seq). A gap\n/// (`seq > cursor` — a frame the drain dropped while the controller channel was Full,\n/// the b4 backpressure) FREEZES the cursor at last-contiguous, so a re-attaching\n/// brain's `resume_seq` never skips a dropped chunk (a high-watermark jump PAST the\n/// gap would be a not-exactly-once / non-gapless resume = a B2 violation). An\n/// already-delivered `seq` (`seq < cursor`, a rewind re-send) is a no-op. A single CAS,\n/// no loop: it advances by exactly one, or not at all. In the NO-DROP path (every\n/// live frame is contiguous) this is identical to [`advance_delivered`].\n// [impl->REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE]\nfn contiguous_advance(dt: &AtomicU64, seq: u64) {\n    let _ = dt.compare_exchange(seq, seq + 1, Ordering::AcqRel, Ordering::Acquire);\n}\n\n/// The interactive CONTROLLER's dedicated writer thread (W1 /\n/// REQ-HAZARD-INJECT-CONTROL-COEXIST) — the authoritative analog of\n/// [`viewer_writer`]. Write the `initial` ring-replay batch (advancing the resume\n/// cursor on each success), then drain live [`CtrlMsg`]s with a BLOCKING socket\n/// write each — so a backed-up controller blocks ONLY this thread, never the\n/// session drain (which used to write the controller inline under the log lock).\n/// A failed write (dead operator) ends the thread; the drain's next bounded\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n…\n            }\n        }\n…\n    }\n…\n}\n…\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n                true\n            }\n            Err(TrySendError::Full(_)) => {\n                // DROP + surface, but stamp only on the rising edge.\n                if !self.backpressure.swap(true, Ordering::AcqRel) {\n                    self.stamp_backpressure(true);\n                }\n                false\n            }\n            // The writer thread is gone (session teardown) — nothing to do.\n            Err(TrySendError::Disconnected(_)) => false,\n        }\n    }\n\n    /// Mirror the input-backpressure signal to the perch's `info.json` (the\n    /// broker is the single writer). Best-effort: a session served without a\n    /// perch (raw broker tests) has nowhere to record.\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}","startLine":684,"lineNumbers":[684,null,1401,null,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,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,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,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,null,1613,1614,null,1616,null,1661,null,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271784419}}
{"type":"message","id":"7f9ada2a","parentId":"cb53ff69","timestamp":"2026-07-17T07:03:04.440Z","message":{"role":"toolResult","toolCallId":"call_sLYTu5L24Eg3GGsFMmoYYmo6|fc_0fcf561150331aac016a59d3a7b97c819081de870cd86550dd","toolName":"read","content":[{"type":"text","text":"    /// Mark the read side finished and tell the subscriber (with the final\n    /// cursor, so it can verify completeness).\n    fn finish(&mut self) {\n        self.finished = true;\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);\n            // Enqueue only — same discipline as append (Amendment fix 2:\n            // ALL producer sites halt-and-remove, finish included).\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Install `sub` as the subscriber with the replay snapshot (retained\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\n    /// replay-then-live seq order is structural (see\n    /// [`SubscriberSeat::install`]), while every conn write still happens\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n    /// under the lock with discarded write errors, the exact serial-poison\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\n    ///\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\n    /// a replacement subscriber is never installed until the prior one is\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // No-reinstall-until-gone applies to the POISON class only\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n            // 15s bounded write — installing a replacement now would hand the\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\n            // DISPLACED as before (the newer-brain-takes-over contract).\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    format!(\n                        \"stream {} subscriber busy: prior subscriber still draining\",\n                        self.stream_id\n                    ),\n                ));\n            }\n            // Healthy displacement, prior fully gone, or same sub re-attach.\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\n        // record — this is one of the two RCA-pinned shared-carrier classes.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\n        sub.lifecycle_event(\n            \"stream-sub-attach\",\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\n        );\n        let mut replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|(s, _)| *s >= from_seq)\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\n            .collect();\n        if self.finished {\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\n        }\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\n        // prior writer — poisoned OR healthily displaced — holds only its own\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\n        // brain-swap displacement left the displaced writer and the successor\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\n        // write failure (its conn dying — every daemon refresh) canceled the\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\n        // displaced stream on exactly the post-refresh path this wave calms.\n        // One poison never dead-ends the stream (T5 recovery): the next\n        // generation's mint IS the renewal; `send_stream` reads this current\n        // Arc, old workers' handles stay theirs (C2 consumes via\n        // [`NetHost::stream_lease`]).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        self.lease = Arc::new(StreamLease::default());\n        let replay_len = replay.len();\n        self.subscriber = Some(SubscriberSeat::install(\n            sub,\n            replay,\n            Some(Arc::clone(&self.lease)),\n        ));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n…\n    /// `apply_once` closure — same discipline as [`Self::record_dial_op`]).\n    pub fn record_stream_op(&self, minter: Minter, op_id: u64, stream_id: u64) {\n        self.stream_ops\n            .lock()\n            .unwrap()\n            .insert((minter, op_id), stream_id);\n    }\n\n    /// The stream a journaled open `(minter, op_id)` minted, if still held.\n    pub fn stream_op_id(&self, minter: Minter, op_id: u64) -> Option<u64> {\n        self.stream_ops\n            .lock()\n            .unwrap()\n            .get(&(minter, op_id))\n            .copied()\n    }\n\n    /// A held stream's `(conn_id, remote_id_hex)`.\n    pub fn stream_conn(&self, stream_id: u64) -> Option<(u64, String)> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(|e| (e.conn_id, e.remote_id_hex.clone()))\n    }\n\n    /// Write `bytes` to a held stream's send side; `finish` closes the send\n    /// side after the write (the peer's read pump then sees a clean end).\n    // [impl->REQ-DAEMON-2]\n    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n        let entry = {\n            let streams = self.shared.streams.lock().unwrap();\n            Arc::clone(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        };\n        // Serve-lease gate (ADR-0038 Amendment fix 4): a stream whose\n        // subscriber POISONED has its lease canceled — refusing the send here\n        // is what terminates the paired serve/wire worker at its next\n        // forward instead of leaving an orphan forwarding leg running.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        if entry.log.lock().unwrap().lease.is_canceled() {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n            )));\n        }\n        let bytes = bytes.to_vec();\n        // Bounded (REQ-HAZARD-BROKER-QUIC-DEADLINE): `write_all` / `finish` on a\n        // black-holed QUIC stream blocks on flow-control the dead peer never grants.\n        // Loopback (in-process) never hangs, so the bound is a no-op for it.\n        self.bounded_block_on(async move {\n            let mut send = entry.send.lock().await;\n            if !bytes.is_empty() {\n                send.write_all(&bytes).await?;\n            }\n            if finish {\n                send.finish().await?;\n            }\n            Ok(())\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n            .map(|(id, e)| {\n…\n            })\n            .collect()\n    }\n…\n    pub fn mark_stream_retentive(&self, stream_id: u64, cap: usize) {\n        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n            e.log.lock().unwrap().set_retentive(cap);\n        }\n    }\n\n    /// Drain a retentive stream's undrained bytes (the shell-tunnel recv cursor):\n    /// pops the whole ring in order, concatenated, and wakes the read pump (which\n    /// may have been lagging the sender at the backpressure cap). Returns\n    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n    // [impl->REQ-SHELL-4]\n    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        let drained = entry.log.lock().unwrap().drain();\n        // The drain freed ring room — wake a pump that was backpressure-parked.\n        entry.room.notify_one();\n        Some(drained)\n    }\n\n    /// A held stream's current undrained ring depth in chunks (test introspection\n    /// for the retentive backpressure bound). `None` ⇒ no such stream.\n    #[cfg(test)]\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\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"}],"details":{"displayContent":{"text":"    /// Mark the read side finished and tell the subscriber (with the final\n    /// cursor, so it can verify completeness).\n    fn finish(&mut self) {\n        self.finished = true;\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);\n            // Enqueue only — same discipline as append (Amendment fix 2:\n            // ALL producer sites halt-and-remove, finish included).\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Install `sub` as the subscriber with the replay snapshot (retained\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\n    /// replay-then-live seq order is structural (see\n    /// [`SubscriberSeat::install`]), while every conn write still happens\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n    /// under the lock with discarded write errors, the exact serial-poison\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\n    ///\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\n    /// a replacement subscriber is never installed until the prior one is\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // No-reinstall-until-gone applies to the POISON class only\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n            // 15s bounded write — installing a replacement now would hand the\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\n            // DISPLACED as before (the newer-brain-takes-over contract).\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    format!(\n                        \"stream {} subscriber busy: prior subscriber still draining\",\n                        self.stream_id\n                    ),\n                ));\n            }\n            // Healthy displacement, prior fully gone, or same sub re-attach.\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\n        // record — this is one of the two RCA-pinned shared-carrier classes.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\n        sub.lifecycle_event(\n            \"stream-sub-attach\",\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\n        );\n        let mut replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|(s, _)| *s >= from_seq)\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\n            .collect();\n        if self.finished {\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\n        }\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\n        // prior writer — poisoned OR healthily displaced — holds only its own\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\n        // brain-swap displacement left the displaced writer and the successor\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\n        // write failure (its conn dying — every daemon refresh) canceled the\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\n        // displaced stream on exactly the post-refresh path this wave calms.\n        // One poison never dead-ends the stream (T5 recovery): the next\n        // generation's mint IS the renewal; `send_stream` reads this current\n        // Arc, old workers' handles stay theirs (C2 consumes via\n        // [`NetHost::stream_lease`]).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        self.lease = Arc::new(StreamLease::default());\n        let replay_len = replay.len();\n        self.subscriber = Some(SubscriberSeat::install(\n            sub,\n            replay,\n            Some(Arc::clone(&self.lease)),\n        ));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n…\n    /// `apply_once` closure — same discipline as [`Self::record_dial_op`]).\n    pub fn record_stream_op(&self, minter: Minter, op_id: u64, stream_id: u64) {\n        self.stream_ops\n            .lock()\n            .unwrap()\n            .insert((minter, op_id), stream_id);\n    }\n\n    /// The stream a journaled open `(minter, op_id)` minted, if still held.\n    pub fn stream_op_id(&self, minter: Minter, op_id: u64) -> Option<u64> {\n        self.stream_ops\n            .lock()\n            .unwrap()\n            .get(&(minter, op_id))\n            .copied()\n    }\n\n    /// A held stream's `(conn_id, remote_id_hex)`.\n    pub fn stream_conn(&self, stream_id: u64) -> Option<(u64, String)> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(|e| (e.conn_id, e.remote_id_hex.clone()))\n    }\n\n    /// Write `bytes` to a held stream's send side; `finish` closes the send\n    /// side after the write (the peer's read pump then sees a clean end).\n    // [impl->REQ-DAEMON-2]\n    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n        let entry = {\n            let streams = self.shared.streams.lock().unwrap();\n            Arc::clone(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        };\n        // Serve-lease gate (ADR-0038 Amendment fix 4): a stream whose\n        // subscriber POISONED has its lease canceled — refusing the send here\n        // is what terminates the paired serve/wire worker at its next\n        // forward instead of leaving an orphan forwarding leg running.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        if entry.log.lock().unwrap().lease.is_canceled() {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n            )));\n        }\n        let bytes = bytes.to_vec();\n        // Bounded (REQ-HAZARD-BROKER-QUIC-DEADLINE): `write_all` / `finish` on a\n        // black-holed QUIC stream blocks on flow-control the dead peer never grants.\n        // Loopback (in-process) never hangs, so the bound is a no-op for it.\n        self.bounded_block_on(async move {\n            let mut send = entry.send.lock().await;\n            if !bytes.is_empty() {\n                send.write_all(&bytes).await?;\n            }\n            if finish {\n                send.finish().await?;\n            }\n            Ok(())\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n            .map(|(id, e)| {\n…\n            })\n            .collect()\n    }\n…\n    pub fn mark_stream_retentive(&self, stream_id: u64, cap: usize) {\n        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n            e.log.lock().unwrap().set_retentive(cap);\n        }\n    }\n\n    /// Drain a retentive stream's undrained bytes (the shell-tunnel recv cursor):\n    /// pops the whole ring in order, concatenated, and wakes the read pump (which\n    /// may have been lagging the sender at the backpressure cap). Returns\n    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n    // [impl->REQ-SHELL-4]\n    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        let drained = entry.log.lock().unwrap().drain();\n        // The drain freed ring room — wake a pump that was backpressure-parked.\n        entry.room.notify_one();\n        Some(drained)\n    }\n\n    /// A held stream's current undrained ring depth in chunks (test introspection\n    /// for the retentive backpressure bound). `None` ⇒ no such stream.\n    #[cfg(test)]\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\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","startLine":490,"lineNumbers":[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,null,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,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,null,1821,1822,1823,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784271784440}}
{"type":"message","id":"28c96818","parentId":"7f9ada2a","timestamp":"2026-07-17T07:03:04.461Z","message":{"role":"toolResult","toolCallId":"call_kRRi7djcQjMDsZ8jTU0RUWGj|fc_0fcf561150331aac016a59d3a7b9848190b5c09397e380ae54","toolName":"read","content":[{"type":"text","text":"\nimpl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n                    writer_done.store(true, Ordering::Release);\n                    return;\n                }\n            }\n            // Then live frames, same halt discipline.\n            while let Ok(frame) = rx.recv() {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"live write failed\");\n                    break;\n                }\n            }\n            writer_done.store(true, Ordering::Release);\n        });\n        SubscriberSeat {\n            sub,\n            tx,\n            done,\n            poisoned,\n        }\n    }\n\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\n    /// push). `Err` means the seat must be removed.\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\n        if self.poisoned.load(Ordering::Acquire) {\n            return Err(SeatFail::Poisoned);\n        }\n        match self.tx.try_send(frame) {\n            Ok(()) => Ok(()),\n            Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),\n…\n        }\n    }\n…\n}\n\n[Showing lines 164-238 of 2865. Use :239 to continue]"}],"details":{"truncation":{"content":"\r\nimpl SubscriberSeat {\r\n    /// Install a seat: spawn its writer thread and hand back the handle.\r\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\r\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\r\n    /// touching the live queue, so replay-then-live seq order holds by\r\n    /// construction even while producers enqueue concurrently. (Gate follow-\r\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\r\n    /// the mutex — a concurrent append could slot a live frame into the\r\n    /// middle of the replay and break the brain's strict gap check: the xfer\r\n    /// re-serve \"got seq 134 want 6\" CI red.)\r\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\r\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\r\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\r\n    /// a traffic-quiet stream where no producer enqueue would ever run\r\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\r\n    /// left the lease alive until the next append; the T4 forwarder starved).\r\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\r\n    /// displaced — is harmless by construction: every install mints a fresh\r\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn install(\r\n        sub: SharedSend,\r\n        replay: Vec<Envelope>,\r\n        lease: Option<Arc<StreamLease>>,\r\n    ) -> SubscriberSeat {\r\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\r\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let writer_sub = Arc::clone(&sub);\r\n        let writer_done = Arc::clone(&done);\r\n        let writer_poisoned = Arc::clone(&poisoned);\r\n        std::thread::spawn(move || {\r\n            let poison = |halt_reason: &str| {\r\n                writer_poisoned.store(true, Ordering::Release);\r\n                if let Some(l) = &lease {\r\n                    l.cancel();\r\n                }\r\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\r\n            };\r\n            // Replay first — halt at the first failed write (Amendment\r\n            // fix 2), never iterate past a poisoned conn.\r\n            for frame in replay {\r\n                if writer_sub.write(&frame).is_err() {\r\n                    poison(\"replay write failed\");\r\n                    writer_done.store(true, Ordering::Release);\r\n                    return;\r\n                }\r\n            }\r\n            // Then live frames, same halt discipline.\r\n            while let Ok(frame) = rx.recv() {\r\n                if writer_sub.write(&frame).is_err() {\r\n                    poison(\"live write failed\");\r\n                    break;\r\n                }\r\n            }\r\n            writer_done.store(true, Ordering::Release);\r\n        });\r\n        SubscriberSeat {\r\n            sub,\r\n            tx,\r\n            done,\r\n            poisoned,\r\n        }\r\n    }\r\n\r\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\r\n    /// push). `Err` means the seat must be removed.\r\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\r\n        if self.poisoned.load(Ordering::Acquire) {\r\n            return Err(SeatFail::Poisoned);\r\n        }\r\n        match self.tx.try_send(frame) {\r\n            Ok(()) => Ok(()),\r\n            Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),\r","truncated":true,"truncatedBy":"lines","totalLines":2702,"totalBytes":3643,"outputLines":75,"outputBytes":3643,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"\r\nimpl SubscriberSeat {\r\n    /// Install a seat: spawn its writer thread and hand back the handle.\r\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\r\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\r\n    /// touching the live queue, so replay-then-live seq order holds by\r\n    /// construction even while producers enqueue concurrently. (Gate follow-\r\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\r\n    /// the mutex — a concurrent append could slot a live frame into the\r\n    /// middle of the replay and break the brain's strict gap check: the xfer\r\n    /// re-serve \"got seq 134 want 6\" CI red.)\r\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\r\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\r\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\r\n    /// a traffic-quiet stream where no producer enqueue would ever run\r\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\r\n    /// left the lease alive until the next append; the T4 forwarder starved).\r\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\r\n    /// displaced — is harmless by construction: every install mints a fresh\r\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn install(\r\n        sub: SharedSend,\r\n        replay: Vec<Envelope>,\r\n        lease: Option<Arc<StreamLease>>,\r\n    ) -> SubscriberSeat {\r\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\r\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let writer_sub = Arc::clone(&sub);\r\n        let writer_done = Arc::clone(&done);\r\n        let writer_poisoned = Arc::clone(&poisoned);\r\n        std::thread::spawn(move || {\r\n            let poison = |halt_reason: &str| {\r\n                writer_poisoned.store(true, Ordering::Release);\r\n                if let Some(l) = &lease {\r\n                    l.cancel();\r\n                }\r\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\r\n            };\r\n            // Replay first — halt at the first failed write (Amendment\r\n            // fix 2), never iterate past a poisoned conn.\r\n            for frame in replay {\r\n                if writer_sub.write(&frame).is_err() {\r\n                    poison(\"replay write failed\");\r\n                    writer_done.store(true, Ordering::Release);\r\n                    return;\r\n                }\r\n            }\r\n            // Then live frames, same halt discipline.\r\n            while let Ok(frame) = rx.recv() {\r\n                if writer_sub.write(&frame).is_err() {\r\n                    poison(\"live write failed\");\r\n                    break;\r\n                }\r\n            }\r\n            writer_done.store(true, Ordering::Release);\r\n        });\r\n        SubscriberSeat {\r\n            sub,\r\n            tx,\r\n            done,\r\n            poisoned,\r\n        }\r\n    }\r\n\r\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\r\n    /// push). `Err` means the seat must be removed.\r\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\r\n        if self.poisoned.load(Ordering::Acquire) {\r\n            return Err(SeatFail::Poisoned);\r\n        }\r\n        match self.tx.try_send(frame) {\r\n            Ok(()) => Ok(()),\r\n            Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),\r\n…\n        }\n    }\n…\n}","startLine":164,"lineNumbers":[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,null,240,241,null,252]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":3643,"outputLines":75,"outputBytes":3643,"shownRange":{"start":164,"end":238},"nextOffset":239}}},"isError":false,"timestamp":1784271784461}}
{"type":"message","id":"6e2c59e6","parentId":"28c96818","timestamp":"2026-07-17T07:03:04.497Z","message":{"role":"toolResult","toolCallId":"call_1pu1v76od1KgvoM07j1nVeKR|fc_0fcf561150331aac016a59d3a7b82c819085c8c263c4e1d88d","toolName":"read","content":[{"type":"text","text":"    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n…\n        loop {\n…\n            match env.kind.as_str() {\n…\n                KIND_SESSIONS => {\n…\n                    let reply = SessionsReply {\n                        sessions: snaps\n…\n                            .map(|s| SessionInfo {\n…\n                                resume_seq: s.resume_seq,\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n        // then stomped info.json, routing injects to a contended record). The claim +\n        // the live-session check are read together under one atomic critical section so\n        // a concurrent spawn either sees our claim or its registered session — never a\n…\n    }\n\n[Showing lines 3229-3308 of 6298. Use :3309 to continue]"}],"details":{"truncation":{"content":"                                resume_seq: s.resume_seq,\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n        // then stomped info.json, routing injects to a contended record). The claim +\n        // the live-session check are read together under one atomic critical section so\n        // a concurrent spawn either sees our claim or its registered session — never a","truncated":true,"truncatedBy":"lines","totalLines":3070,"totalBytes":4208,"outputLines":80,"outputBytes":4208,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n…\n        loop {\n…\n            match env.kind.as_str() {\n…\n                KIND_SESSIONS => {\n…\n                    let reply = SessionsReply {\n                        sessions: snaps\n…\n                            .map(|s| SessionInfo {\n…\n                                resume_seq: s.resume_seq,\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n        // then stomped info.json, routing injects to a contended record). The claim +\n        // the live-session check are read together under one atomic critical section so\n        // a concurrent spawn either sees our claim or its registered session — never a\n…\n    }","startLine":3025,"lineNumbers":[3025,null,3055,null,3061,null,3165,null,3223,3224,null,3226,null,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,null,3512]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":4208,"outputLines":80,"outputBytes":4208,"shownRange":{"start":3229,"end":3308},"nextOffset":3309}}},"isError":false,"timestamp":1784271784497}}
{"type":"message","id":"69eb1a20","parentId":"6e2c59e6","timestamp":"2026-07-17T07:03:16.594Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Verifying thread handle cleanup**\n\n**Analyzing session attachment limits**"},{"type":"toolCall","id":"call_y2YGuvyZvU3wcmV9CVigMHd0|fc_0fcf561150331aac016a59d3b3ea408190b69efa822161547e","name":"read","arguments":{"i":"Reading viewer caps","path":"crates/spt-daemon/src/broker.rs","selector":"85-150,890-970,1090-1160"}},{"type":"toolCall","id":"call_vGNi3FJSHoRvfTDjJy36X126|fc_0fcf561150331aac016a59d3b3ea548190a3732706af45061f","name":"read","arguments":{"i":"Reading spawn lifecycle","path":"crates/spt-daemon/src/broker.rs","selector":"3380-3510"}},{"type":"toolCall","id":"call_TPREgcWcQ1jnjcpKIvb6KO86|fc_0fcf561150331aac016a59d3b3ea5c8190b4f6c5d989a5ea95","name":"read","arguments":{"i":"Reading input writer loop","path":"crates/spt-daemon/src/broker.rs","selector":"1840-1890"}},{"type":"toolCall","id":"call_p2zizEF20NicEU2Wbt6FRvR1|fc_0fcf561150331aac016a59d3b3ea64819085e80df0cdde4ab7","name":"read","arguments":{"i":"Reading translation lifecycle","path":"crates/spt-daemon/src/translation.rs","selector":"260-405"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":12600,"output":385,"cacheRead":52736,"cacheWrite":0,"totalTokens":65721,"reasoningTokens":212,"cost":{"input":0.063,"output":0.01155,"cacheRead":0.026368,"cacheWrite":0,"total":0.10091800000000001}},"stopReason":"toolUse","timestamp":1784271784545,"responseId":"resp_0fcf561150331aac016a59d3a8d9e48190a9987f681af63aa6","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3aaefb081908e198597daef070b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdOz8Yr4MpQWpo6qXbzdxKlQMSdZmbwJYXnI0G1nGsvMsd0Qe5S4cQ9cydK2R6iQxc65RmsWPzX2QjXrAO9GKXRZHLuSwCE-u7ysp9ynjq2VCBUXoi7cyWRz2iN0Epbi9DpUbzt92QGGNcYrf1lZJcZoKAiqkGiaya_eBAqizmFp2Qt6RNqPNmzYC8UFg8LvCA1FA0eE4_jAU6Id5MV81yB8xnpQLMSXn7kJ3f-QH-0XbFTVQIRxjV8bRCL8fOpi3AQ1k_MTM1xMYs7MHPiPdoEk8-otEmPhjsTjAmpaV2qZiO_Sl_evbXzw4XzPCrkZrwCEGF4YU-TCq9BBmOIV9FM4y6KncL5PbOITvjsAJ68ALXBDPcO3_yiAijWNcoB3M92v8FpUsBE-Q67R2fLHgI4bPB93R2ty2TsrlWdXA4KPdeb0bdtnSLdRQL9ARCYGCyIZSD0e3m7ECfetyBmfh0d8HRQ5Cxn3CaDf7AdVl0TakPFcKK1EFxB7Cjet2stPs9K1uF-q5ddkNJxwQW-55FzIFRGd0BG9BRv7GIjJgsmv4TdqOIQFNt1L9Y5AJBVQ5PWe7B889Smd0nutytCLOfrW-inbQ3mI0eu7ky3ehGjitGDxngMqsTuDZT5fQfSYg8ce5nfRziTH6j7GavLjUm8ZZSnmTz6CSMLg8wpCciEg5mQn4HYLJXMJiH3q_NutyJ3zn7z16fxxtuBehC77fQuNuSskB_861wVV8JiFzY3ULrdIbuWAsLf_rxDpOQphqV-2kL8u19V5CldGF1Vo1LOjVynQUur3MAGy5DkXI7lLKpbXmBdzqDTFbb0sk7CwAaEfvTWHFQd7GEqOGFxfQ3uJvKtYmrRFK74zSITbdGD58HfTPLIBqb57uoT-j0yYyaZRAroWb-elW2CNjcdMSn89vOBw6TbArtgWtbsimm75QChpt0gR0R9cO0Kg7GKTZDybvjSs1CsW5AVXZ2RiZLe02SUS2FIPYFpPinr6zAh_BBYLNvd6wA64zlqih7eVwS7CVWs8xOHRluGw3ERdq7ZmNO8aXVz5baNopvVMgbA1cOYlX1HBQ3wLmwDGbNsTzk5mhp36NKZJhnRNZvyR3sNxWIHJDEDi1w5Ea0MsoJx_QT47CCfvPzTyHydmjjqao7NamVt4-r1OcgTIz17R2fM7jXQ__LrTVX-TQxF_EHzKRWwJE1rVi3vOIOrIX1fTx015J-GYA0CGQ7_ZzWHO1kYCnjgfMSY2p7w7LWcovZ-W2zb_3xGu5eeWEDd1UZS9FMBWPyZjQ0_PaHc6XB4uEQeJOSRRwjoks4NVqSmJIqpJ1LzNbaDiOeY4HRuHIb8Q_WfycxQNysG1-xaM-o6l7vJwFxVoswC-qeeU2ddLysMqYRhCWapOV1aAGNBXTJvQm1BP7pwXBT8m9c3ODdgXpMTDx2mIAFuuDBzeEoRUCBgffZeUjiBW_EflC4hNSMEHH9bfdFTKB30j7WtFj6YWa6PvRYNrnw3eRgM6ausNOItsvf-tIjbDmjvXfnhE8Zkn9-WaIhuWnQneEssUMjzlE0jQ6oTKnS9oDKXXOtCUJ7qbaHvlNHKmFMn85g5-5K_mNwy_Re7AIhEjmjYIzuPRm1vblo6ojdXhexsonUSmLC7GQLlVEQ_J8NBGcfw6AUe15FFaibsANvQwRf8ituuZSgrg9HyDUZIT_V5uvgk5rUkeMCfzsNZtaoUuGbwVpgguybGWACnTQNt9NQtpQaBYFbiuxBPnfN6BanFHVafLZkwfsbgebGRYPIj3quT6p5CU4I7enDX2efEROJhpsSEy4FgqRtK4-6jaNKtDaJH2ZXTMzNndQSMe2VleWt86yT57uzykBawAzn6c9aQPycV-TarjbsR7FmK7I6piRjJMm4tChipHhU3oRG4oDLCOhhmICDKWIqR3S-_WF7ESXo-mC8l8WicObsDUwSBbj7prkaCmlaQkHNQz_VJcMcEhtu2i0wrU_Z6B-vkUdnVfh3z0W3PexAVBc0cmyuj4n-vQh7U32zb3z6t3r67Cvr5XbPkmntHTBK--Br-F6Q56NVyHo8AkY8JKVKwoOao2iWxfxxlHaWNlm1JfX7iumEtSw8lNW-Pokhef3l5n1mBHUQrTpmOfJRuey8KUHVgFNlof46pYE_JAU2s85VbJczGsgv6NCoReaFxuHSnD75HFrXYJJYBpJAX6-nIYRvOZ7MvDqnwNSsbWdphphDdSXpDRuynGADpJ0V24q4EbemXJm46Uz9x47A8f2qGR88Ug6m6PScsEYIkdHNUN3gJy6oPHstmWjc_cbSyE6A8cCEbONpCW_LWJUti4h0Du-sZS8sBkrThPMhA=","summary":[{"type":"summary_text","text":"**Verifying thread handle cleanup**"},{"type":"summary_text","text":"**Analyzing session attachment limits**"}]},{"id":"fc_0fcf561150331aac016a59d3b3ea408190b69efa822161547e","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading viewer caps\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"85-150,890-970,1090-1160\"}","call_id":"call_y2YGuvyZvU3wcmV9CVigMHd0","name":"read"},{"id":"fc_0fcf561150331aac016a59d3b3ea548190a3732706af45061f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading spawn lifecycle\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3380-3510\"}","call_id":"call_vGNi3FJSHoRvfTDjJy36X126","name":"read"},{"id":"fc_0fcf561150331aac016a59d3b3ea5c8190b4f6c5d989a5ea95","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading input writer loop\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1840-1890\"}","call_id":"call_TPREgcWcQ1jnjcpKIvb6KO86","name":"read"},{"id":"fc_0fcf561150331aac016a59d3b3ea64819085e80df0cdde4ab7","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading translation lifecycle\",\"path\":\"crates/spt-daemon/src/translation.rs\",\"selector\":\"260-405\"}","call_id":"call_p2zizEF20NicEU2Wbt6FRvR1","name":"read"}]},"duration":12048.98900000751,"ttft":2404.9600000083447,"contextSnapshot":{"promptTokens":65336,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_y2YGuvyZvU3wcmV9CVigMHd0|fc_0fcf561150331aac016a59d3b3ea408190b69efa822161547e","toolName":"read","startedAt":"2026-07-17T07:03:16.595Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading viewer caps"},"id":"351454f0","parentId":"69eb1a20","timestamp":"2026-07-17T07:03:16.595Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_vGNi3FJSHoRvfTDjJy36X126|fc_0fcf561150331aac016a59d3b3ea548190a3732706af45061f","toolName":"read","startedAt":"2026-07-17T07:03:16.595Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading spawn lifecycle"},"id":"5fe258b1","parentId":"351454f0","timestamp":"2026-07-17T07:03:16.595Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_TPREgcWcQ1jnjcpKIvb6KO86|fc_0fcf561150331aac016a59d3b3ea5c8190b4f6c5d989a5ea95","toolName":"read","startedAt":"2026-07-17T07:03:16.595Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading input writer loop"},"id":"e18114a3","parentId":"5fe258b1","timestamp":"2026-07-17T07:03:16.595Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_p2zizEF20NicEU2Wbt6FRvR1|fc_0fcf561150331aac016a59d3b3ea64819085e80df0cdde4ab7","toolName":"read","startedAt":"2026-07-17T07:03:16.595Z","args":{"path":"crates/spt-daemon/src/translation.rs"},"intent":"Reading translation lifecycle"},"id":"07617da9","parentId":"e18114a3","timestamp":"2026-07-17T07:03:16.595Z"}
{"type":"message","id":"10281003","parentId":"07617da9","timestamp":"2026-07-17T07:03:16.635Z","message":{"role":"toolResult","toolCallId":"call_y2YGuvyZvU3wcmV9CVigMHd0|fc_0fcf561150331aac016a59d3b3ea408190b69efa822161547e","toolName":"read","content":[{"type":"text","text":"/// Default bounded output-log depth (chunks). Large enough that a brain restart\n/// window never evicts unreplayed output in practice; the bound is what keeps a\n/// disconnected session from buffering without limit.\nconst DEFAULT_LOG_CHUNKS: usize = 4096;\n\n/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it\n/// OVERFLOWS the viewer is evicted — the drain `try_send`s and never blocks\n/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n/// owns the replay batch), so a viewer attaching to a busy session is not\n/// spuriously evicted.\nconst VIEWER_CHANNEL_DEPTH: usize = 256;\n\n/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\nconst MAX_VIEWERS: usize = 32;\n\n/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n/// the live stream) or a `Disconnected` one (its writer thread ended after a\n/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n/// is the pure decision the fan-out applies under the log lock.\n// [impl->REQ-HAZARD-VIEWER-ISOLATION]\nfn viewer_send_evicts<T>(r: &Result<(), TrySendError<T>>) -> bool {\n    r.is_err()\n}\n\n/// One read-only viewer's isolated sink (REQ-HAZARD-VIEWER-ISOLATION). The drain\n/// thread `try_send`s output frames into `tx` (a bounded queue); a dedicated\n/// `writer` thread does the BLOCKING socket write, so a wedged viewer backs up\n/// only its own queue — never the drain. When the queue overflows the sink is\n/// dropped (the `tx` closes → the writer ends) and removed from the map.\nstruct ViewerSink {\n    /// The bounded live-frame queue to this viewer's writer thread.\n    tx: SyncSender<Envelope>,\n    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n    /// (a dropped brain connection removes its viewer rows); never written here.\n    send: SharedSend,\n    /// Set TRUE when this viewer is EVICTED for overflow (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT),\n    /// distinguishing an eviction from a normal teardown (session end / conn drop).\n    /// `append` stores `true` BEFORE dropping the sink (and thus `tx`); the writer,\n    /// on its `rx.recv()` Err, reads this and — when true — emits a\n    /// [`KIND_VIEWER_EVICTED`] marker (in the writer thread, OFF the log lock) so\n    /// the serving brain skips to live instead of tearing the attach down.\n    evicted: Arc<AtomicBool>,\n    /// The writer thread handle (held for ownership; it exits when `tx` drops or\n    /// a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// The controller live-frame channel depth (frames). Deeper than a viewer's\n/// queue because the controller is the AUTHORITATIVE view — unlike a viewer it is\n/// NOT evicted on a SINGLE full `try_send` (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// b4: the drain does ONE non-blocking `try_send` per chunk and NEVER blocks; a\n/// merely-slow controller DROPS chunks + falls behind the ring, and only a channel\n/// that stays full for [`CONTROLLER_WRITE_DEADLINE`] (tracked via\n/// [`ControllerSink::last_ok`]) is detached. Generous so a momentary slow consumer\n/// never trips the deadline.\nconst CONTROLLER_CHANNEL_DEPTH: usize = 4096;\n\n/// How long a CONTROLLER's channel may stay FULL (no successful handoff since\n/// [`ControllerSink::last_ok`]) before the drain declares it stalled and detaches it\n/// (W1, refined by b4 / REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE). This\n/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n…\n    /// ends its writer's LIVE loop when `tx` drops; bumping `controller_epoch`\n    /// additionally makes a stale deadline-evict a no-op AND stops a superseded\n    /// writer mid-INITIAL-BATCH (P1c — a writer still flushing its owned `initial`\n    /// batch ignores the dropped `tx`, so the epoch gate is what guarantees a\n    /// single live writer per connection and a monotonic on-wire seq stream,\n    /// [`REQ-HAZARD-CONTROLLER-WRITER-REORDER`]). Stamps `driven_by` to the new\n    /// controller's identity.\n    fn become_controller(&mut self, sub: SharedSend, by: Option<String>, from_seq: u64, attach_gen: u64) {\n        // Drop the prior controller sink first (its writer's live loop ends when\n        // tx drops), and bump the generation so (a) an in-flight deadline-evict\n        // for the old controller can't unseat this one and (b) a prior writer\n        // still flushing its initial batch returns before its next frame.\n        // Attribution (F-039 legs b+d): the replaced conn's record names its\n        // successor, and the new conn accretes the controller role fact.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        if let Some(old) = self.controller.take() {\n            old.send.lifecycle_event(\n                \"controller-replaced\",\n                &format!(\"session={} new_conn={}\", self.session_id, sub.id()),\n            );\n        }\n        sub.describe(&format!(\n            \"controller session={} endpoint={} by={}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint },\n            by.as_deref().unwrap_or(\"local\")\n        ));\n        sub.lifecycle_event(\n            \"controller-attach\",\n            &format!(\"session={} from_seq={from_seq}\", self.session_id),\n        );\n        self.controller = None;\n        let epoch = self.controller_epoch.fetch_add(1, Ordering::AcqRel) + 1;\n        // #6 (ADR-0031): a COLD attach's initial batch is a single synthesized clean\n        // repaint of the CURRENT SCREEN (at pseudo-seq `next_seq - 1`) instead of the\n        // raw ring — replaying an alt-screen TUI's raw ring into a fresh terminal is\n        // exactly the corruption #6/#7/#8 report. A resume-from-floor (`from_seq > 0`)\n        // keeps the raw-ring exactly-once re-fetch untouched (B2). Either way the\n        // batch is owned by the writer thread (never pushed through the live channel —\n        // it must not block the drain); live frames stream raw + in-order afterwards.\n        let initial: Vec<(u64, Vec<u8>)> = match self.repaint_initial(from_seq) {\n            Some(repaint) => vec![repaint],\n            None => self\n                .ring\n                .iter()\n                .filter(|(s, _)| *s >= from_seq)\n                .cloned()\n                .collect(),\n        };\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let dt = Arc::clone(&self.delivered_through);\n        let epoch_gate = Arc::clone(&self.controller_epoch);\n        let sid = self.session_id;\n        // W2 decouple: the writer publishes its in-flight-write window here so a\n        // stall-evict can distinguish a wedged writer from an idle one.\n        let write_blocked_since = Arc::new(Mutex::new(None));\n        let writer_blocked = Arc::clone(&write_blocked_since);\n        let writer = thread::spawn(move || {\n            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n        });\n        self.controller = Some(ControllerSink {\n            tx,\n            send: sub,\n            by,\n            last_ok: Instant::now(),\n            write_blocked_since,\n            _writer: writer,\n            attach_gen,\n            });\n        self.stamp_driven_by();\n    }\n\n    /// Detach the controller and UNLATCH the perch — the ONE unlatch path shared\n    /// by W1's deadline-evict ([`mark_controller_gone`]), [`detach_if`], and (per\n    /// the W1↔W5 synergy) W5's reconcile self-heal. Dropping the sink ends its\n    /// writer thread; clearing the slot re-stamps `driven_by` to `None` (so an\n    /// `ONLINE+CONTROLLED` latch cannot outlive a gone controller).\n    fn clear_controller(&mut self) {\n        if self.controller.take().is_some() {\n            self.stamp_driven_by();\n        }\n    }\n…\n    fn stall_evict_controller(&mut self, now: Instant, stamp: StampMode) -> bool {\n…\n        match stamp {\n…\n            // sibling — the take/reattach path is already I/O-under-log-lock).\n            StampMode::Inline => self.clear_controller(),\n            // Deferred: in-memory drop ONLY (the reap closure forbids I/O under the\n            // shared sessions lock); converge_perch_stamps writes the release off-lock.\n            StampMode::Deferred => self.controller = None,\n        }\n        true\n    }\n\n    /// Add a read-only viewer: snapshot the ring from `from_seq` into the writer\n    /// thread (NOT through the bounded live queue — replay must not trip the\n    /// overflow eviction), seed it the current size frame first, then run the\n    /// live queue. The drain thread fans live frames in via `try_send`.\n    fn add_viewer(&mut self, sub: SharedSend, from_seq: u64) {\n        let vid = self.next_viewer_id;\n        self.next_viewer_id += 1;\n        // Attribution (F-039 legs b+d): viewer role fact + attach record.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\n            \"viewer session={} endpoint={} vid={vid}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint }\n        ));\n        sub.lifecycle_event(\n            \"viewer-attach\",\n            &format!(\"session={} vid={vid} from_seq={from_seq}\", self.session_id),\n        );\n        // The size frame + the initial batch (owned by the thread, not the bounded\n        // queue). A COLD viewer attach (`from_seq == 0`) gets the #6 clean repaint;\n        // a skip-to-live / snap re-attach (`from_seq > 0`, incl. `u64::MAX`) keeps\n        // the raw-ring slice (`s >= from_seq`) — empty for skip-to-live, as before.\n        let mut initial: Vec<Envelope> =\n            vec![size_envelope(self.session_id, self.size.0, self.size.1)];\n        match self.repaint_initial(from_seq) {\n            Some((seq, bytes)) => initial.push(output_envelope(self.session_id, seq, &bytes)),\n            None => initial.extend(\n                self.ring\n                    .iter()\n                    .filter(|(s, _)| *s >= from_seq)\n                    .map(|(seq, bytes)| output_envelope(self.session_id, *seq, bytes)),\n            ),\n        }\n        let (tx, rx) = sync_channel::<Envelope>(VIEWER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let evicted = Arc::new(AtomicBool::new(false));\n        let writer_evicted = Arc::clone(&evicted);\n        let session_id = self.session_id;\n        let writer =\n            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n        self.viewers.insert(\n            vid,\n            ViewerSink {\n                tx,\n                send: sub,\n                evicted,\n                _writer: writer,\n            },\n        );\n    }\n\n    /// Resolve a controller/viewer subscribe under the W2.5 model\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). Returns the [`SubscribeOutcome`]; performs\n    /// the controller take / viewer add / loud displace as a side effect. See the\n    /// identity matrix in the body — the `by`-keyed logic is what makes a\n    /// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.\n    fn resolve_subscribe(\n        &mut self,\n        sub: SharedSend,\n        from_seq: u64,\n        intent: AttachIntent,\n        by: Option<String>,\n…\n    ) -> SubscribeOutcome {\n…\n    }"}],"details":{"displayContent":{"text":"/// Default bounded output-log depth (chunks). Large enough that a brain restart\n/// window never evicts unreplayed output in practice; the bound is what keeps a\n/// disconnected session from buffering without limit.\nconst DEFAULT_LOG_CHUNKS: usize = 4096;\n\n/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it\n/// OVERFLOWS the viewer is evicted — the drain `try_send`s and never blocks\n/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n/// owns the replay batch), so a viewer attaching to a busy session is not\n/// spuriously evicted.\nconst VIEWER_CHANNEL_DEPTH: usize = 256;\n\n/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\nconst MAX_VIEWERS: usize = 32;\n\n/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n/// the live stream) or a `Disconnected` one (its writer thread ended after a\n/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n/// is the pure decision the fan-out applies under the log lock.\n// [impl->REQ-HAZARD-VIEWER-ISOLATION]\nfn viewer_send_evicts<T>(r: &Result<(), TrySendError<T>>) -> bool {\n    r.is_err()\n}\n\n/// One read-only viewer's isolated sink (REQ-HAZARD-VIEWER-ISOLATION). The drain\n/// thread `try_send`s output frames into `tx` (a bounded queue); a dedicated\n/// `writer` thread does the BLOCKING socket write, so a wedged viewer backs up\n/// only its own queue — never the drain. When the queue overflows the sink is\n/// dropped (the `tx` closes → the writer ends) and removed from the map.\nstruct ViewerSink {\n    /// The bounded live-frame queue to this viewer's writer thread.\n    tx: SyncSender<Envelope>,\n    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n    /// (a dropped brain connection removes its viewer rows); never written here.\n    send: SharedSend,\n    /// Set TRUE when this viewer is EVICTED for overflow (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT),\n    /// distinguishing an eviction from a normal teardown (session end / conn drop).\n    /// `append` stores `true` BEFORE dropping the sink (and thus `tx`); the writer,\n    /// on its `rx.recv()` Err, reads this and — when true — emits a\n    /// [`KIND_VIEWER_EVICTED`] marker (in the writer thread, OFF the log lock) so\n    /// the serving brain skips to live instead of tearing the attach down.\n    evicted: Arc<AtomicBool>,\n    /// The writer thread handle (held for ownership; it exits when `tx` drops or\n    /// a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// The controller live-frame channel depth (frames). Deeper than a viewer's\n/// queue because the controller is the AUTHORITATIVE view — unlike a viewer it is\n/// NOT evicted on a SINGLE full `try_send` (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// b4: the drain does ONE non-blocking `try_send` per chunk and NEVER blocks; a\n/// merely-slow controller DROPS chunks + falls behind the ring, and only a channel\n/// that stays full for [`CONTROLLER_WRITE_DEADLINE`] (tracked via\n/// [`ControllerSink::last_ok`]) is detached. Generous so a momentary slow consumer\n/// never trips the deadline.\nconst CONTROLLER_CHANNEL_DEPTH: usize = 4096;\n\n/// How long a CONTROLLER's channel may stay FULL (no successful handoff since\n/// [`ControllerSink::last_ok`]) before the drain declares it stalled and detaches it\n/// (W1, refined by b4 / REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE). This\n/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n…\n    /// ends its writer's LIVE loop when `tx` drops; bumping `controller_epoch`\n    /// additionally makes a stale deadline-evict a no-op AND stops a superseded\n    /// writer mid-INITIAL-BATCH (P1c — a writer still flushing its owned `initial`\n    /// batch ignores the dropped `tx`, so the epoch gate is what guarantees a\n    /// single live writer per connection and a monotonic on-wire seq stream,\n    /// [`REQ-HAZARD-CONTROLLER-WRITER-REORDER`]). Stamps `driven_by` to the new\n    /// controller's identity.\n    fn become_controller(&mut self, sub: SharedSend, by: Option<String>, from_seq: u64, attach_gen: u64) {\n        // Drop the prior controller sink first (its writer's live loop ends when\n        // tx drops), and bump the generation so (a) an in-flight deadline-evict\n        // for the old controller can't unseat this one and (b) a prior writer\n        // still flushing its initial batch returns before its next frame.\n        // Attribution (F-039 legs b+d): the replaced conn's record names its\n        // successor, and the new conn accretes the controller role fact.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        if let Some(old) = self.controller.take() {\n            old.send.lifecycle_event(\n                \"controller-replaced\",\n                &format!(\"session={} new_conn={}\", self.session_id, sub.id()),\n            );\n        }\n        sub.describe(&format!(\n            \"controller session={} endpoint={} by={}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint },\n            by.as_deref().unwrap_or(\"local\")\n        ));\n        sub.lifecycle_event(\n            \"controller-attach\",\n            &format!(\"session={} from_seq={from_seq}\", self.session_id),\n        );\n        self.controller = None;\n        let epoch = self.controller_epoch.fetch_add(1, Ordering::AcqRel) + 1;\n        // #6 (ADR-0031): a COLD attach's initial batch is a single synthesized clean\n        // repaint of the CURRENT SCREEN (at pseudo-seq `next_seq - 1`) instead of the\n        // raw ring — replaying an alt-screen TUI's raw ring into a fresh terminal is\n        // exactly the corruption #6/#7/#8 report. A resume-from-floor (`from_seq > 0`)\n        // keeps the raw-ring exactly-once re-fetch untouched (B2). Either way the\n        // batch is owned by the writer thread (never pushed through the live channel —\n        // it must not block the drain); live frames stream raw + in-order afterwards.\n        let initial: Vec<(u64, Vec<u8>)> = match self.repaint_initial(from_seq) {\n            Some(repaint) => vec![repaint],\n            None => self\n                .ring\n                .iter()\n                .filter(|(s, _)| *s >= from_seq)\n                .cloned()\n                .collect(),\n        };\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let dt = Arc::clone(&self.delivered_through);\n        let epoch_gate = Arc::clone(&self.controller_epoch);\n        let sid = self.session_id;\n        // W2 decouple: the writer publishes its in-flight-write window here so a\n        // stall-evict can distinguish a wedged writer from an idle one.\n        let write_blocked_since = Arc::new(Mutex::new(None));\n        let writer_blocked = Arc::clone(&write_blocked_since);\n        let writer = thread::spawn(move || {\n            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n        });\n        self.controller = Some(ControllerSink {\n            tx,\n            send: sub,\n            by,\n            last_ok: Instant::now(),\n            write_blocked_since,\n            _writer: writer,\n            attach_gen,\n            });\n        self.stamp_driven_by();\n    }\n\n    /// Detach the controller and UNLATCH the perch — the ONE unlatch path shared\n    /// by W1's deadline-evict ([`mark_controller_gone`]), [`detach_if`], and (per\n    /// the W1↔W5 synergy) W5's reconcile self-heal. Dropping the sink ends its\n    /// writer thread; clearing the slot re-stamps `driven_by` to `None` (so an\n    /// `ONLINE+CONTROLLED` latch cannot outlive a gone controller).\n    fn clear_controller(&mut self) {\n        if self.controller.take().is_some() {\n            self.stamp_driven_by();\n        }\n    }\n…\n    fn stall_evict_controller(&mut self, now: Instant, stamp: StampMode) -> bool {\n…\n        match stamp {\n…\n            // sibling — the take/reattach path is already I/O-under-log-lock).\n            StampMode::Inline => self.clear_controller(),\n            // Deferred: in-memory drop ONLY (the reap closure forbids I/O under the\n            // shared sessions lock); converge_perch_stamps writes the release off-lock.\n            StampMode::Deferred => self.controller = None,\n        }\n        true\n    }\n\n    /// Add a read-only viewer: snapshot the ring from `from_seq` into the writer\n    /// thread (NOT through the bounded live queue — replay must not trip the\n    /// overflow eviction), seed it the current size frame first, then run the\n    /// live queue. The drain thread fans live frames in via `try_send`.\n    fn add_viewer(&mut self, sub: SharedSend, from_seq: u64) {\n        let vid = self.next_viewer_id;\n        self.next_viewer_id += 1;\n        // Attribution (F-039 legs b+d): viewer role fact + attach record.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\n            \"viewer session={} endpoint={} vid={vid}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint }\n        ));\n        sub.lifecycle_event(\n            \"viewer-attach\",\n            &format!(\"session={} vid={vid} from_seq={from_seq}\", self.session_id),\n        );\n        // The size frame + the initial batch (owned by the thread, not the bounded\n        // queue). A COLD viewer attach (`from_seq == 0`) gets the #6 clean repaint;\n        // a skip-to-live / snap re-attach (`from_seq > 0`, incl. `u64::MAX`) keeps\n        // the raw-ring slice (`s >= from_seq`) — empty for skip-to-live, as before.\n        let mut initial: Vec<Envelope> =\n            vec![size_envelope(self.session_id, self.size.0, self.size.1)];\n        match self.repaint_initial(from_seq) {\n            Some((seq, bytes)) => initial.push(output_envelope(self.session_id, seq, &bytes)),\n            None => initial.extend(\n                self.ring\n                    .iter()\n                    .filter(|(s, _)| *s >= from_seq)\n                    .map(|(seq, bytes)| output_envelope(self.session_id, *seq, bytes)),\n            ),\n        }\n        let (tx, rx) = sync_channel::<Envelope>(VIEWER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let evicted = Arc::new(AtomicBool::new(false));\n        let writer_evicted = Arc::clone(&evicted);\n        let session_id = self.session_id;\n        let writer =\n            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n        self.viewers.insert(\n            vid,\n            ViewerSink {\n                tx,\n                send: sub,\n                evicted,\n                _writer: writer,\n            },\n        );\n    }\n\n    /// Resolve a controller/viewer subscribe under the W2.5 model\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). Returns the [`SubscribeOutcome`]; performs\n    /// the controller take / viewer add / loud displace as a side effect. See the\n    /// identity matrix in the body — the `by`-keyed logic is what makes a\n    /// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.\n    fn resolve_subscribe(\n        &mut self,\n        sub: SharedSend,\n        from_seq: u64,\n        intent: AttachIntent,\n        by: Option<String>,\n…\n    ) -> SubscribeOutcome {\n…\n    }","startLine":85,"lineNumbers":[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,null,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,null,1071,null,1088,null,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,null,1162,null,1245]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271796634}}
{"type":"message","id":"8032eaae","parentId":"10281003","timestamp":"2026-07-17T07:03:16.642Z","message":{"role":"toolResult","toolCallId":"call_p2zizEF20NicEU2Wbt6FRvR1|fc_0fcf561150331aac016a59d3b3ea64819085e80df0cdde4ab7","toolName":"read","content":[{"type":"text","text":"impl TranslationChild {\n…\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\n…\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\n        #[cfg(windows)]\n        {\n            use std::os::windows::process::CommandExt;\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\n            command.creation_flags(CREATE_NO_WINDOW);\n        }\n        let mut child = command.spawn()?;\n        let pid = child.id().into();\n        let stdout = child\n            .stdout\n            .take()\n            .expect(\"stdout piped at spawn\");\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\n        let reader = thread::spawn(move || {\n            let buf = BufReader::new(stdout);\n            for line in buf.lines() {\n                let Ok(line) = line else { break }; // child stdout closed\n                let trimmed = line.trim();\n                if trimmed.is_empty() {\n                    continue;\n                }\n                match serde_json::from_str::<KeyCmd>(trimmed) {\n                    Ok(cmd) => {\n                        if cmds.send(cmd).is_err() {\n                            break; // broker dropped the receiver — stop reading\n                        }\n                    }\n                    Err(e) => {\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\n                    }\n                }\n            }\n        });\n        Ok(TranslationChild {\n            child: Mutex::new(Some(child)),\n            stdin: Mutex::new(Some(stdin)),\n            _reader: reader,\n            pid,\n        })\n    }\n\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\n    pub fn pid(&self) -> Option<u32> {\n        self.pid\n    }\n\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\n        let mut guard = self.stdin.lock().unwrap();\n        if let Some(w) = guard.as_mut() {\n            w.write_all(line.as_bytes())?;\n            w.write_all(b\"\\n\")?;\n            w.flush()?;\n        }\n        Ok(())\n    }\n\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\n    /// exits on its own. Idempotent.\n    fn close_stdin(&self) {\n        let _ = self.stdin.lock().unwrap().take();\n    }\n\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\n    /// (`None`) returns immediately, and every step swallows errors (a child that\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\n    /// the binary; Drop reaps on teardown).\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n    pub fn terminate(&self) {\n        self.close_stdin();\n        let mut guard = self.child.lock().unwrap();\n        let Some(child) = guard.as_mut() else {\n            return; // already reaped\n        };\n        let deadline = Instant::now() + REAP_GRACE;\n        loop {\n            match child.try_wait() {\n                Ok(Some(_)) => {\n                    *guard = None;\n                    return; // exited on its own after EOF\n                }\n                Ok(None) => {\n                    if Instant::now() >= deadline {\n                        break;\n                    }\n                    thread::sleep(REAP_POLL);\n                }\n                Err(_) => break,\n            }\n        }\n        let _ = child.kill();\n        let _ = child.wait();\n        *guard = None;\n    }\n}\n\nimpl Drop for TranslationChild {\n    fn drop(&mut self) {\n        self.terminate();\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\n    #[test]\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\n        assert_eq!(\n            serde_json::to_string(&ToBinary::Init {\n                endpoint_id: \"doyle\".into(),\n                node: \"n1\".into(),\n            })\n            .unwrap(),\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\n        );\n        assert_eq!(\n            serde_json::to_string(&ToBinary::Event {\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\n            })\n            .unwrap(),\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\n        );\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\n        // Privacy invariant, structurally: the only field is `type`.\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\n        assert_eq!(\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\n            vec![\"type\"],\n            \"the input ping must carry no field other than `type` — no PTY content\"\n        );\n    }\n\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\n    // verified by the live watcher); this proves the flagged spawn still starts a live\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\n    #[test]\n    fn flagged_spawn_still_starts() {\n…\n    }\n…\n}\n\n[Showing lines 259-408 of 508. Use :409 to continue]"}],"details":{"truncation":{"content":"        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\r\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\r\n    pub fn pid(&self) -> Option<u32> {\r\n        self.pid\r\n    }\r\n\r\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\r\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\r\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\r\n        let mut guard = self.stdin.lock().unwrap();\r\n        if let Some(w) = guard.as_mut() {\r\n            w.write_all(line.as_bytes())?;\r\n            w.write_all(b\"\\n\")?;\r\n            w.flush()?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\r\n    /// exits on its own. Idempotent.\r\n    fn close_stdin(&self) {\r\n        let _ = self.stdin.lock().unwrap().take();\r\n    }\r\n\r\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\r\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\r\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\r\n    /// (`None`) returns immediately, and every step swallows errors (a child that\r\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\r\n    /// the binary; Drop reaps on teardown).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn terminate(&self) {\r\n        self.close_stdin();\r\n        let mut guard = self.child.lock().unwrap();\r\n        let Some(child) = guard.as_mut() else {\r\n            return; // already reaped\r\n        };\r\n        let deadline = Instant::now() + REAP_GRACE;\r\n        loop {\r\n            match child.try_wait() {\r\n                Ok(Some(_)) => {\r\n                    *guard = None;\r\n                    return; // exited on its own after EOF\r\n                }\r\n                Ok(None) => {\r\n                    if Instant::now() >= deadline {\r\n                        break;\r\n                    }\r\n                    thread::sleep(REAP_POLL);\r\n                }\r\n                Err(_) => break,\r\n            }\r\n        }\r\n        let _ = child.kill();\r\n        let _ = child.wait();\r\n        *guard = None;\r\n    }\r\n}\r\n\r\nimpl Drop for TranslationChild {\r\n    fn drop(&mut self) {\r\n        self.terminate();\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\r\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\r\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\r\n    #[test]\r\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Init {\r\n                endpoint_id: \"doyle\".into(),\r\n                node: \"n1\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\r\n        );\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Event {\r\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\r\n        );\r\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\r\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\r\n        // Privacy invariant, structurally: the only field is `type`.\r\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\r\n        assert_eq!(\r\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\r\n            vec![\"type\"],\r\n            \"the input ping must carry no field other than `type` — no PTY content\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\r\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\r\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\r\n    // verified by the live watcher); this proves the flagged spawn still starts a live\r\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\r\n    #[test]\r\n    fn flagged_spawn_still_starts() {\r","truncated":true,"truncatedBy":"lines","totalLines":250,"totalBytes":5755,"outputLines":150,"outputBytes":5755,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl TranslationChild {\n…\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\n…\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\r\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\r\n    pub fn pid(&self) -> Option<u32> {\r\n        self.pid\r\n    }\r\n\r\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\r\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\r\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\r\n        let mut guard = self.stdin.lock().unwrap();\r\n        if let Some(w) = guard.as_mut() {\r\n            w.write_all(line.as_bytes())?;\r\n            w.write_all(b\"\\n\")?;\r\n            w.flush()?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\r\n    /// exits on its own. Idempotent.\r\n    fn close_stdin(&self) {\r\n        let _ = self.stdin.lock().unwrap().take();\r\n    }\r\n\r\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\r\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\r\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\r\n    /// (`None`) returns immediately, and every step swallows errors (a child that\r\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\r\n    /// the binary; Drop reaps on teardown).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn terminate(&self) {\r\n        self.close_stdin();\r\n        let mut guard = self.child.lock().unwrap();\r\n        let Some(child) = guard.as_mut() else {\r\n            return; // already reaped\r\n        };\r\n        let deadline = Instant::now() + REAP_GRACE;\r\n        loop {\r\n            match child.try_wait() {\r\n                Ok(Some(_)) => {\r\n                    *guard = None;\r\n                    return; // exited on its own after EOF\r\n                }\r\n                Ok(None) => {\r\n                    if Instant::now() >= deadline {\r\n                        break;\r\n                    }\r\n                    thread::sleep(REAP_POLL);\r\n                }\r\n                Err(_) => break,\r\n            }\r\n        }\r\n        let _ = child.kill();\r\n        let _ = child.wait();\r\n        *guard = None;\r\n    }\r\n}\r\n\r\nimpl Drop for TranslationChild {\r\n    fn drop(&mut self) {\r\n        self.terminate();\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\r\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\r\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\r\n    #[test]\r\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Init {\r\n                endpoint_id: \"doyle\".into(),\r\n                node: \"n1\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\r\n        );\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Event {\r\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\r\n        );\r\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\r\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\r\n        // Privacy invariant, structurally: the only field is `type`.\r\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\r\n        assert_eq!(\r\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\r\n            vec![\"type\"],\r\n            \"the input ping must carry no field other than `type` — no PTY content\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\r\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\r\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\r\n    // verified by the live watcher); this proves the flagged spawn still starts a live\r\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\r\n    #[test]\r\n    fn flagged_spawn_still_starts() {\r\n…\n    }\n…\n}","startLine":235,"lineNumbers":[235,null,245,null,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,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,null,423,null,507]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\translation.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":508,"totalBytes":5755,"outputLines":150,"outputBytes":5755,"shownRange":{"start":259,"end":408},"nextOffset":409}}},"isError":false,"timestamp":1784271796642}}
{"type":"message","id":"0005ee4e","parentId":"8032eaae","timestamp":"2026-07-17T07:03:16.716Z","message":{"role":"toolResult","toolCallId":"call_vGNi3FJSHoRvfTDjJy36X126|fc_0fcf561150331aac016a59d3b3ea548190a3732706af45061f","toolName":"read","content":[{"type":"text","text":"    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n…\n        let session = PtySession::spawn_program_in_env(\n…\n            req.env.iter().map(|(k, v)| (k.as_str(), v.as_str())),\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(id)\n    }\n\n\n[Showing lines 3379-3513 of 6298. Use :3514 to continue]"}],"details":{"truncation":{"content":"            req.env.iter().map(|(k, v)| (k.as_str(), v.as_str())),\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(id)\n    }\n","truncated":true,"truncatedBy":"lines","totalLines":2920,"totalBytes":6283,"outputLines":135,"outputBytes":6283,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n…\n        let session = PtySession::spawn_program_in_env(\n…\n            req.env.iter().map(|(k, v)| (k.as_str(), v.as_str())),\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(id)\n    }\n","startLine":3298,"lineNumbers":[3298,null,3374,null,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":6283,"outputLines":135,"outputBytes":6283,"shownRange":{"start":3379,"end":3513},"nextOffset":3514}}},"isError":false,"timestamp":1784271796716}}
{"type":"message","id":"22a8506c","parentId":"0005ee4e","timestamp":"2026-07-17T07:03:16.717Z","message":{"role":"toolResult","toolCallId":"call_TPREgcWcQ1jnjcpKIvb6KO86|fc_0fcf561150331aac016a59d3b3ea5c8190b4f6c5d989a5ea95","toolName":"read","content":[{"type":"text","text":"/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can\n\n[Showing lines 1839-1893 of 6298. Use :1894 to continue]"}],"details":{"truncation":{"content":"/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can","truncated":true,"truncatedBy":"lines","totalLines":4460,"totalBytes":3546,"outputLines":55,"outputBytes":3546,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can","startLine":1839,"lineNumbers":[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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":3546,"outputLines":55,"outputBytes":3546,"shownRange":{"start":1839,"end":1893},"nextOffset":1894}}},"isError":false,"timestamp":1784271796716}}
{"type":"message","id":"71752ed2","parentId":"22a8506c","timestamp":"2026-07-17T07:03:30.606Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying race condition in session insertion and cleanup**\n\n**Analyzing session count discrepancy and thread races**"},{"type":"toolCall","id":"call_wLDHYjsFBSv8Aox2IalpcIFG|fc_0fcf561150331aac016a59d3c1f5e481909c023a5674ddf4b9","name":"read","arguments":{"i":"Reading inject supervisor","path":"crates/spt-daemon/src/broker.rs","selector":"1950-2050,2300-2395"}},{"type":"toolCall","id":"call_T5WmEYOjbtVVaeXeWvstKpPT|fc_0fcf561150331aac016a59d3c1f5f88190ac58b3259fd6e8ba","name":"grep","arguments":{"i":"Finding all broker thread spawns","pattern":"thread::spawn|thread::Builder","path":"crates/spt-daemon/src/broker.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_JSh7knds1OqjeifaaYI2LG04|fc_0fcf561150331aac016a59d3c1f60081908e0bf73274df4967","name":"grep","arguments":{"i":"Finding net thread spawns","pattern":"thread::spawn|std::thread::spawn|thread::Builder","path":"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_e08FnlivTWYOeinkOVJyer7j|fc_0fcf561150331aac016a59d3c1f6088190ad15f5779e25c01a","name":"grep","arguments":{"i":"Finding daemon broker spawns","pattern":"thread::spawn|thread::Builder","path":"crates/spt-daemon/src/daemon.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":11410,"output":508,"cacheRead":60928,"cacheWrite":0,"totalTokens":72846,"reasoningTokens":233,"cost":{"input":0.057050000000000003,"output":0.01524,"cacheRead":0.030463999999999998,"cacheWrite":0,"total":0.10275400000000001}},"stopReason":"toolUse","timestamp":1784271796760,"responseId":"resp_0fcf561150331aac016a59d3b51c108190958ce3c9f806e77a","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3b6d2cc8190b2527b212489be04","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdPBXg_bSFBHD0YMEtr75Nu6zA38ntOg-v7lvrVJTTM1_2fdHTpvPlgL2MsBBhQuGFLlKPmDRVY-sYqTRyoPFCU-AHUzuUs_nptQTV4xhwfONepRx6ro86U4KLRU0TSK2CiLGuVqAajc0sq6iEJZsy7weupp1ujOfOk3fTFjI__W8euZNQZRsppEaaSi1XY5lsn7F2eYEWQyey4EEPPjcy89nu5rFTs8DnFjRxDpsqNkNzMBAY58CHOet02XNelP1qqcBtK4Q4TB4Q0HLGpWUNLqdXeWKITxwwnmrov2g1cGQmiC-ob92dO9LywOx2vTPzFBS5CIPxFuvIfDYgQy4WHdJ2v17UmH9j3v6Tt3mR2udXmCp7qHTghGlc5aQbP-DsdAzRPWsWRu3yW-0wn6qHqDJ9c4178WqCH2MEIvAJQA0QeEgeXQjylb-GxWjXOC-szxAJV31egYpZ5JCvLj6T6AD6G42ZE0_6tBfs06gWi3mC_elEfssnQP4vxyGcn-FvzM8wU1M53TdhrR4KsmyBTqIauqjw85jAeMeokRuVVBQOTbp4vCjn7kwoBm9ONMkNJdoy78413-FL5xiFrV6gxQrkOqbVTJDtXjEL4P2WmjDC6-kQmiM93v-Nobhl5zEy_fZ9lqInGpfrVhrKncPxwPD925WsJ78mxgrM1v80XxgEH74kSX02EHa7DusZ1aWbkuJcGYPIO_BBJ1LPNE0C0IMWntu9Gsw0rs9US1tbKpD0svOlrKkKH3mL8LUAqh6iNE3HSymT-mCUoVhDFL-BA8oPRRZrMgOZ6w0wpuQUfmHCw3Y1NON22zs2U--rNKbSoTR5kFI6ptlYB3RZ_UzyDjJk2K2eYBVl553lkNQU5CzanOdYqspC4U418lHfcq8xYCEZBYkqIEtiMpia-vFz5qdtKoBNJuIx6RUpPddpptD-2whgfV54hsyswt6st6jQy_T-T_r3V5fUZ9AQ2EfL-UESMbgVLGJv-x1Ug7h_8z7-dZjQr_oEMYVjS1DDVWp3fy795ygRxLSJ83ZKUB5nyu4zCyyBSqjxYRQYNm178QjouncKb_xFsb7FRKD_WwidzCBo5L3cIRiSm4ArNb553Zg0tl2UlLj3FoHUZlMf77slo_OOrn1PhES6vlFgwqk1JQP9zPp_l0EFhVVwvkI6JYg5r5xpNJUczU6B9WAkcEWrSylLPD2IDpMW19noZQEO_tQUbJWFCPQGHoDF_oAPlxEcbtFMKxxZTfQaXTvaxdT-iCoJZ_SPR2WvHppCM46dKdP7HcHvX8yyx9zXpmPfzH2kaJUdwpjaxEbeJQXo-3IeDp8BJynrCwawCl80I_FWTYqEMJiOY4bMW47NBbgNitdGntuyrDQ6zw1Vmze4rsCcvgRo3GFZq_Mh76NQGbxCXxE-ahav8R4Ui9rg9M3a2OLZQVAdThb94BCbWC4OzC3KDuJ8BwqM1pnVXGtcxJiq4Yo814lLgMUA5-c-b9zwVVJd03APbx7Ci_LqVfNqjYq40-AijtV8v8YcPgxKxKbBq371-hTV_gUib2rB3UojvRklmTxPWZUcKmg54pKanz--Ca0yZ73c3BMbDiJxR6cDlB5ntQDhxuU6u8SG4SyJZdoD0mtEXTV5jt1dxhDxm93nwlknb0oJWxOcwt_bH25QpCZwnQuSkgXryTfk6egQsD6a3Jrl01lM6fa9R2AJBQdLz-aO_5y29UlcHFMRrXqi_kVIr-PO9TW4b7HxF5Je1f1gRNxOaguYCV9dasQLci_QsxB-yn5xP4vwWuHe_Zb4COYBjIyASksYbLBT_E9avgLqH4ThG_R6_LjNyNwdEd8a5y6-O3CpuTbrFKkPGRYfnV1TiKiBry5xq6WbCZd6vzIO3ECEg4hb4m2olY1zS7InE3ezzUgmi59sG2WxKg1OaHOHuSF1688OSOQGXtQIUraZwjDRXETp4cZLM5_uwDXxA6BX64X3G3XTM7RgY6fwSAk-fM19_8b_JBGy0Wlbh92Zk1BWZr1IVSU1qdpifbncQc6ho_W6wLnNBKFQuUOVxwLpCGFH2hFY9vtHoKDki6Sich2vIBVWh0jGpnXS5vEKg3E7dDcFOO-VPPEpfpVo5sHvsKxreHgrvSXw9u_J_JlI06Zl5mAow1B80HK0nVcGT6qS7wAhQUXuN1zxEOOWk134HKjGK26ABXinHl28ATzdwYyDg0LzNDpxzJdVwem8DH8jh-gkFvawsoCAu0Gx7m_Py9iAeYf7Um31VxW9VYENW--uA5e0gmcPVVOkGiA_Pb2K0gY5cZ67sxjY1eLGpteXBmJ9pNsvkRnIpX1RlZZXuOd2WCsq80Dknf3wYLkepGoGNSjLxdsdF_1kcNFNxYUQYCk-CggEgEfQy_tfEjjmfy0sA33BD3h6LzXXWpDxQ0hp54yufMxVrqqRME1ir9rNXzcr0dbuBZlqfpP13IvQ==","summary":[{"type":"summary_text","text":"**Identifying race condition in session insertion and cleanup**"},{"type":"summary_text","text":"**Analyzing session count discrepancy and thread races**"}]},{"id":"fc_0fcf561150331aac016a59d3c1f5e481909c023a5674ddf4b9","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading inject supervisor\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1950-2050,2300-2395\"}","call_id":"call_wLDHYjsFBSv8Aox2IalpcIFG","name":"read"},{"id":"fc_0fcf561150331aac016a59d3c1f5f88190ac58b3259fd6e8ba","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding all broker thread spawns\",\"pattern\":\"thread::spawn|thread::Builder\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_T5WmEYOjbtVVaeXeWvstKpPT","name":"grep"},{"id":"fc_0fcf561150331aac016a59d3c1f60081908e0bf73274df4967","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding net thread spawns\",\"pattern\":\"thread::spawn|std::thread::spawn|thread::Builder\",\"path\":\"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_JSh7knds1OqjeifaaYI2LG04","name":"grep"},{"id":"fc_0fcf561150331aac016a59d3c1f6088190ad15f5779e25c01a","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding daemon broker spawns\",\"pattern\":\"thread::spawn|thread::Builder\",\"path\":\"crates/spt-daemon/src/daemon.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_e08FnlivTWYOeinkOVJyer7j","name":"grep"}]},"duration":13846.05830000341,"ttft":2371.530799999833,"contextSnapshot":{"promptTokens":72338,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_wLDHYjsFBSv8Aox2IalpcIFG|fc_0fcf561150331aac016a59d3c1f5e481909c023a5674ddf4b9","toolName":"read","startedAt":"2026-07-17T07:03:30.607Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading inject supervisor"},"id":"0a91a314","parentId":"71752ed2","timestamp":"2026-07-17T07:03:30.607Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_T5WmEYOjbtVVaeXeWvstKpPT|fc_0fcf561150331aac016a59d3c1f5f88190ac58b3259fd6e8ba","toolName":"grep","startedAt":"2026-07-17T07:03:30.607Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Finding all broker thread spawns"},"id":"49396e6d","parentId":"0a91a314","timestamp":"2026-07-17T07:03:30.607Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_JSh7knds1OqjeifaaYI2LG04|fc_0fcf561150331aac016a59d3c1f60081908e0bf73274df4967","toolName":"grep","startedAt":"2026-07-17T07:03:30.607Z","args":{"path":"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs"},"intent":"Finding net thread spawns"},"id":"d1ce2f0d","parentId":"49396e6d","timestamp":"2026-07-17T07:03:30.607Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_e08FnlivTWYOeinkOVJyer7j|fc_0fcf561150331aac016a59d3c1f6088190ad15f5779e25c01a","toolName":"grep","startedAt":"2026-07-17T07:03:30.607Z","args":{"path":"crates/spt-daemon/src/daemon.rs"},"intent":"Finding daemon broker spawns"},"id":"04ea1a3b","parentId":"d1ce2f0d","timestamp":"2026-07-17T07:03:30.607Z"}
{"type":"message","id":"67e4c373","parentId":"04ea1a3b","timestamp":"2026-07-17T07:03:30.609Z","message":{"role":"toolResult","toolCallId":"call_e08FnlivTWYOeinkOVJyer7j|fc_0fcf561150331aac016a59d3c1f6088190ad15f5779e25c01a","toolName":"grep","content":[{"type":"text","text":" 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 {"}],"details":{"scopePath":"crates/spt-daemon/src/daemon.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\daemon.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":7,"fileCount":1,"files":["crates/spt-daemon/src/daemon.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/daemon.rs","count":7}],"truncated":false,"displayContent":"  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 {"},"isError":false,"timestamp":1784271810609}}
{"type":"message","id":"3ef6ea76","parentId":"67e4c373","timestamp":"2026-07-17T07:03:30.610Z","message":{"role":"toolResult","toolCallId":"call_T5WmEYOjbtVVaeXeWvstKpPT|fc_0fcf561150331aac016a59d3c1f5f88190ac58b3259fd6e8ba","toolName":"grep","content":[{"type":"text","text":" 947|        let writer_blocked = Arc::clone(&write_blocked_since);\n*948|        let writer = thread::spawn(move || {\n 949|            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n 950|        });\n 951|        self.controller = Some(ControllerSink {\n...\n 1137|        let writer =\n*1138|            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139|        self.viewers.insert(\n 1140|            vid,\n 1141|            ViewerSink {\n...\n 1789|        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790|        let writer = thread::spawn(move || input_writer(session, rx));\n 1791|        Arc::new(InputWriter {\n 1792|            tx,\n 1793|            backpressure: AtomicBool::new(false),\n...\n 1991|            let sup_endpoint = endpoint_id.to_string();\n*1992|            thread::spawn(move || {\n 1993|                run_inject_worker_supervised(\n 1994|                    sup_child,\n 1995|                    sup_faulted,\n...\n 2794|            let me = Arc::clone(self);\n*2795|            thread::spawn(move || {\n 2796|                let _ = me.handle_conn(conn);\n 2797|            });\n 2798|        }\n...\n 2817|        let me = Arc::clone(self);\n*2818|        Ok(thread::spawn(move || {\n 2819|            let _ = me.handle_conn(conn);\n 2820|        }))\n 2821|    }\n...\n 2878|        // stays un-reapable as a live-but-wedged writer even under child output.\n*2879|        let writer = thread::spawn(move || for _ in rx.iter() {});\n 2880|        recover_log(&log).controller = Some(ControllerSink {\n 2881|            tx,\n 2882|            send,\n...\n 3434|        let waiter = Arc::clone(&session);\n*3435|        thread::spawn(move || {\n 3436|            if let Ok(status) = waiter.wait() {\n 3437|                let ev = ExitEvent {\n 3438|                    session_id: id,\n...\n 4756|        let mut client = client;\n*4757|        thread::spawn(move || {\n 4758|            let r = read_frame(&mut client).ok();\n 4759|            let _ = tx.send(r);\n 4760|        });\n...\n 4786|            // Empty initial batch (no size/replay needed for this assertion).\n*4787|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4788|\n 4789|            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 4790|            evicted.store(true, Ordering::Release);\n...\n 4812|            let w_send = Arc::clone(&send);\n*4813|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4814|\n 4815|            // A clean teardown: drop tx with the flag still false.\n 4816|            drop(tx);\n...\n 4861|                evicted,\n*4862|                _writer: thread::spawn(|| {}),\n 4863|            },\n 4864|        );\n 4865|\n...\n 4941|            write_blocked_since: Arc::new(Mutex::new(None)),\n*4942|            _writer: thread::spawn(|| {}),\n 4943|        });\n 4944|        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 4945|        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n...\n 4953|                    evicted: Arc::new(AtomicBool::new(false)),\n*4954|                    _writer: thread::spawn(|| {}),\n 4955|                },\n 4956|            );\n 4957|\n...\n 5054|            endpoint: String::new(),\n*5055|            _writer: thread::spawn(|| {}),\n 5056|        };\n 5057|        (w, rx)\n 5058|    }\n...\n 5192|        let f = Arc::clone(&floor);\n*5193|        let _ = thread::spawn(move || {\n 5194|            let _g = f.lock().unwrap();\n 5195|            panic!(\"poison the inject floor\");\n 5196|        })\n...\n 5219|        let s = Arc::clone(&sessions);\n*5220|        let _ = thread::spawn(move || {\n 5221|            let _g = s.lock().unwrap();\n 5222|            panic!(\"poison the sessions map mid-attach\");\n 5223|        })\n...\n 5277|        let l = Arc::clone(&log);\n*5278|        let _ = thread::spawn(move || {\n 5279|            let _g = l.lock().unwrap();\n 5280|            panic!(\"poison the output log mid-append\");\n 5281|        })\n...\n 5950|        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5951|        let writer = thread::spawn(|| {});\n 5952|        for _ in 0..1000 {\n 5953|            if writer.is_finished() {\n 5954|                break;\n...\n 5992|        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5993|        let writer = thread::spawn(move || {\n 5994|            let _ = rx.recv(); // blocks (idle live controller) until tx drops\n 5995|        });\n 5996|        log.controller = Some(ControllerSink {\n...\n 6030|        let write_blocked_since = Arc::new(Mutex::new(blocked));\n*6031|        let writer = thread::spawn(move || {\n 6032|            let _ = rx.recv(); // parked (live, not finished) until tx drops\n 6033|        });\n 6034|        log.controller = Some(ControllerSink {"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":21,"fileCount":1,"files":["crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":21}],"truncated":false,"displayContent":"  947│        let writer_blocked = Arc::clone(&write_blocked_since);\n *948│        let writer = thread::spawn(move || {\n  949│            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n  950│        });\n  951│        self.controller = Some(ControllerSink {\n     │...\n 1137│        let writer =\n*1138│            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1139│        self.viewers.insert(\n 1140│            vid,\n 1141│            ViewerSink {\n     │...\n 1789│        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1790│        let writer = thread::spawn(move || input_writer(session, rx));\n 1791│        Arc::new(InputWriter {\n 1792│            tx,\n 1793│            backpressure: AtomicBool::new(false),\n     │...\n 1991│            let sup_endpoint = endpoint_id.to_string();\n*1992│            thread::spawn(move || {\n 1993│                run_inject_worker_supervised(\n 1994│                    sup_child,\n 1995│                    sup_faulted,\n     │...\n 2794│            let me = Arc::clone(self);\n*2795│            thread::spawn(move || {\n 2796│                let _ = me.handle_conn(conn);\n 2797│            });\n 2798│        }\n     │...\n 2817│        let me = Arc::clone(self);\n*2818│        Ok(thread::spawn(move || {\n 2819│            let _ = me.handle_conn(conn);\n 2820│        }))\n 2821│    }\n     │...\n 2878│        // stays un-reapable as a live-but-wedged writer even under child output.\n*2879│        let writer = thread::spawn(move || for _ in rx.iter() {});\n 2880│        recover_log(&log).controller = Some(ControllerSink {\n 2881│            tx,\n 2882│            send,\n     │...\n 3434│        let waiter = Arc::clone(&session);\n*3435│        thread::spawn(move || {\n 3436│            if let Ok(status) = waiter.wait() {\n 3437│                let ev = ExitEvent {\n 3438│                    session_id: id,\n     │...\n 4756│        let mut client = client;\n*4757│        thread::spawn(move || {\n 4758│            let r = read_frame(&mut client).ok();\n 4759│            let _ = tx.send(r);\n 4760│        });\n     │...\n 4786│            // Empty initial batch (no size/replay needed for this assertion).\n*4787│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4788│\n 4789│            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 4790│            evicted.store(true, Ordering::Release);\n     │...\n 4812│            let w_send = Arc::clone(&send);\n*4813│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 4814│\n 4815│            // A clean teardown: drop tx with the flag still false.\n 4816│            drop(tx);\n     │...\n 4861│                evicted,\n*4862│                _writer: thread::spawn(|| {}),\n 4863│            },\n 4864│        );\n 4865│\n     │...\n 4941│            write_blocked_since: Arc::new(Mutex::new(None)),\n*4942│            _writer: thread::spawn(|| {}),\n 4943│        });\n 4944│        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 4945│        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n     │...\n 4953│                    evicted: Arc::new(AtomicBool::new(false)),\n*4954│                    _writer: thread::spawn(|| {}),\n 4955│                },\n 4956│            );\n 4957│\n     │...\n 5054│            endpoint: String::new(),\n*5055│            _writer: thread::spawn(|| {}),\n 5056│        };\n 5057│        (w, rx)\n 5058│    }\n     │...\n 5192│        let f = Arc::clone(&floor);\n*5193│        let _ = thread::spawn(move || {\n 5194│            let _g = f.lock().unwrap();\n 5195│            panic!(\"poison the inject floor\");\n 5196│        })\n     │...\n 5219│        let s = Arc::clone(&sessions);\n*5220│        let _ = thread::spawn(move || {\n 5221│            let _g = s.lock().unwrap();\n 5222│            panic!(\"poison the sessions map mid-attach\");\n 5223│        })\n     │...\n 5277│        let l = Arc::clone(&log);\n*5278│        let _ = thread::spawn(move || {\n 5279│            let _g = l.lock().unwrap();\n 5280│            panic!(\"poison the output log mid-append\");\n 5281│        })\n     │...\n 5950│        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5951│        let writer = thread::spawn(|| {});\n 5952│        for _ in 0..1000 {\n 5953│            if writer.is_finished() {\n 5954│                break;\n     │...\n 5992│        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*5993│        let writer = thread::spawn(move || {\n 5994│            let _ = rx.recv(); // blocks (idle live controller) until tx drops\n 5995│        });\n 5996│        log.controller = Some(ControllerSink {\n     │...\n 6030│        let write_blocked_since = Arc::new(Mutex::new(blocked));\n*6031│        let writer = thread::spawn(move || {\n 6032│            let _ = rx.recv(); // parked (live, not finished) until tx drops\n 6033│        });\n 6034│        log.controller = Some(ControllerSink {"},"isError":false,"timestamp":1784271810610}}
{"type":"message","id":"50f69973","parentId":"3ef6ea76","timestamp":"2026-07-17T07:03:30.646Z","message":{"role":"toolResult","toolCallId":"call_wLDHYjsFBSv8Aox2IalpcIFG|fc_0fcf561150331aac016a59d3c1f5e481909c023a5674ddf4b9","toolName":"read","content":[{"type":"text","text":"/// (reused; only the translation child is created). Extracted verbatim from\n/// `dispatch_spawn` so a live-update restart (`dispatch_adapter_apply`, W3d) can\n/// rebuild a session's translation child from the NEW binary without disturbing\n/// the PTY / output log / session (brain-parity).\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn build_translation(\n    argv: &[String],\n    endpoint_id: &str,\n    input: &Arc<InputWriter>,\n    respawns: Arc<AtomicU32>,\n    log: &Arc<Mutex<OutputLog>>,\n) -> Option<Arc<Translation>> {\n    let (cmd_tx, cmd_rx) = channel::<KeyCmd>();\n    match TranslationChild::spawn(argv, cmd_tx) {\n        Ok(child) => {\n            let child = Arc::new(child);\n            // First line: identity (content-free of any PTY bytes).\n            let _ = child.send(&ToBinary::Init {\n                endpoint_id: endpoint_id.to_string(),\n                node: spt_store::hostlabel::os_hostname().unwrap_or_default(),\n            });\n            let floor = Arc::new(Mutex::new(InjectFloor::default()));\n            let faulted = Arc::new(AtomicBool::new(false));\n            let (event_tx, event_rx) = channel::<String>();\n            let w_input = Arc::clone(input);\n            let w_child = Arc::clone(&child);\n            let w_floor = Arc::clone(&floor);\n            let w_faulted = Arc::clone(&faulted);\n            let w_respawns = Arc::clone(&respawns);\n            let w_log = Arc::clone(log);\n            let w_endpoint = endpoint_id.to_string();\n            // B6 (REQ-HAZARD-INJECT-WORKER-POISON): run the worker under a panic\n            // guard. A panic inside the worker (a residual unwrap, a poisoned lock the\n            // recovery missed, anything) must NOT silently kill the thread and orphan\n            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n            let sup_child = Arc::clone(&child);\n            let sup_faulted = Arc::clone(&faulted);\n            let sup_endpoint = endpoint_id.to_string();\n            thread::spawn(move || {\n                run_inject_worker_supervised(\n                    sup_child,\n                    sup_faulted,\n                    sup_endpoint,\n                    std::panic::AssertUnwindSafe(move || {\n                        run_inject_worker(\n                            w_input, w_child, w_floor, event_rx, cmd_rx, w_faulted, w_respawns,\n                            w_log, w_endpoint,\n                        );\n                    }),\n                );\n            });\n            Some(Arc::new(Translation {\n                floor,\n                event_tx,\n                child,\n                faulted,\n            }))\n        }\n        Err(e) => {\n            eprintln!(\n                \"TRANSLATION_SPAWN_FAILED:{argv:?}: {e} — no idle PTY delivery; inbound spools (declare/repair the binary)\"\n            );\n            None\n        }\n    }\n}\n\n/// The resident translation binary path declared by the manifest at\n/// `<install_dir>/manifest.toml` (`[message-idle-translation-binary].path`), or\n/// `None` if there is no such manifest / declaration. Read fresh from disk so a\n/// live-update restart picks up a MOVED/renamed binary (verdict flag-5: never\n/// reuse the stale cached `SpawnReq.translation_binary`). (W3d)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\n// [impl->REQ-TRANSLATE-COMMAND]\nfn read_translation_command(install_dir: &std::path::Path) -> Option<Vec<String>> {\n    let s = std::fs::read_to_string(install_dir.join(\"manifest.toml\")).ok()?;\n    let manifest = spt_runtime::Manifest::from_toml_str(&s).ok()?;\n    let decl = manifest.message_idle_translation_binary.as_ref()?;\n    // F-019 / REQ-INSTALL-11 + ADR-0029: resolve `command` (preferred) else the\n    // deprecated `path` to a spawnable argv — adapter-static keys substituted, the\n    // program token resolved against the install dir (same as the initial spawn in\n    // harnesshost) so the W3d live-update RESPAWN runs the real binary, not a\n    // verbatim path Command::new fails to find (which would spool idle inbound).\n    spt_runtime::runtime::resolve_translation_argv(\n        decl,\n        Some(install_dir),\n        Some(manifest.adapter.name.as_str()),\n    )\n}\n\n/// Run the inject worker under a panic guard (B6, REQ-HAZARD-INJECT-WORKER-POISON):\n/// `body` is the [`run_inject_worker`] call. If it PANICS, the guard FAULTs the\n/// translation binary — `fault_translation` terminates the child (no orphaned live\n/// pid) and sets `faulted` (idle inbound then spools, never a silent \"worker-gone\"\n/// force-native refusal against a still-running binary). Without this, a worker\n/// panic drops `event_rx` while the child keeps running: every later inject sees\n/// `event_tx.send` fail and reports delivered=false forever. `child` + `faulted` are\n…\n    // keeps it clear, so the bug-prone class re-settles forever.\n    let mut probe_unobservable = false;\n    // Layer 2 (echo-verify → re-drive → LOUD spool) is a DECLARED CAPABILITY, default\n    // OFF (`SPT_INJECT_VERIFY_ECHO`). It applies ONLY where the harness re-renders typed\n    // input into its observable output (a real TUI's input line does; a bare shell / a\n    // ConPTY programmatic inject / a test echo-child on ConPTY does NOT). Universal\n    // auto-detection is infeasible — a raw-mode TUI does not echo a benign control probe\n    // (so the probe cannot prove text-echo), and incidental output (a prompt, a redraw)\n    // would make a head-prefix check false-read head-loss and spuriously LOUD-spool EVERY\n    // delivery. So an adapter that KNOWS its harness echoes declares the capability\n    // (parallel to the ruling's \"bracketed-paste where the harness declares it\"); Layer 1\n    // (the settle-gate) is the UNCONDITIONAL root fix. The int gate also forces it on\n    // (`SPT_INJECT_FORCE_ECHO_MISS`) to exercise the re-drive/spool wiring on any platform.\n    // AMBIENT env can NOT arm this: both vars are scrubbed at daemon startup\n    // (`spt_runtime::INJECT_ECHO_ENV_VARS`, F-036 env-inheritance class — an inherited\n    // dev-shell export once force-enabled echo-verify host-wide and a false miss RETYPED\n    // sequences into a live session's input). Only an explicit declaration (or an\n    // in-process test broker, which never runs the daemon entrypoints) reaches this read.\n    let echo_capable = std::env::var_os(\"SPT_INJECT_VERIFY_ECHO\").is_some()\n        || std::env::var_os(\"SPT_INJECT_FORCE_ECHO_MISS\").is_some();\n    // `event_rx` blocks here; events queue → one sequence at a time.\n    for envelope in event_rx {\n        // A well-behaved filter only emits in response to an event, but drop any\n        // unsolicited commands left in the channel so they can't be mis-attributed\n        // to this event's sequence.\n        while cmd_rx.try_recv().is_ok() {}\n\n        let envelope_copy = envelope.clone();\n\n        // ── W5-A: run the sequence with a settle-gate (Layer 1) before ANY byte, an\n        // echo-verify (Layer 2) after `{commit}`, and ONE re-drive on a verify miss →\n        // LOUD spool on a second miss (silent+unrecoverable head-loss → recoverable+loud).\n        // The commit-deadline MISS / binary-death / send-fail semantics below are\n        // unchanged (C-1 miss-tolerance).\n        let mut committed = false;\n        let mut disconnected = false;\n        let mut send_failed = false;\n        let mut integrity_lost = false;\n        for attempt in 1..=INJECT_REDRIVE_ATTEMPTS {\n            // Layer 1: settle-gate before the first byte of EVERY delivery on an echoing\n            // PTY (re-arm — a mid-session `/clear` re-creates the reader-reattach race),\n            // and always before a RE-DRIVE (only reached on a swallowed head, so re-confirm\n            // readiness before retyping). Skip only where the probe is known unobservable\n            // (a non-echoing ConPTY — no race to guard, and settling would burn the full\n            // deadline). The latch is driven by the FIRST-ATTEMPT settle's own outcome.\n            if should_settle(attempt, probe_unobservable) {\n                let observed = settle_before_inject(&input, &log, &endpoint);\n                if attempt == 1 {\n                    probe_unobservable = !observed;\n                }\n            }\n            // Snapshot the ring high-water AFTER settling (excludes probe echoes) so\n            // Layer 2 sees only THIS sequence's output.\n            let seq_start = recover_log(&log).high_water();\n            match drive_one_sequence(&input, &floor, &child, &cmd_rx, envelope_copy.clone()) {\n                SeqOutcome::SendFailed => {\n                    send_failed = true;\n                    break;\n                }\n                SeqOutcome::Disconnected => {\n                    disconnected = true;\n                    break;\n                }\n                SeqOutcome::Missed => {\n                    // Commit-deadline miss — leave to the C-1 miss path (not an\n                    // integrity re-drive; the binary never signalled a complete sequence).\n                    break;\n                }\n                SeqOutcome::Committed { sent_text } => {\n                    committed = true;\n                    // Layer 2: verify the typed head echoed back — ONLY where the terminal\n                    // demonstrably echoes (else a non-echoing PTY's incidental output would\n                    // false-read head-loss). Where it does not echo, Layer 1 stands alone.\n                    if !echo_capable || echo_verify_after(&log, seq_start, &sent_text) {\n                        break; // delivered byte-complete (or echo-verify not applicable here)\n                    }\n                    if attempt < INJECT_REDRIVE_ATTEMPTS {\n                        eprintln!(\n                            \"INJECT_ECHO_MISS:{endpoint}: typed head did not echo (attempt {attempt}/{INJECT_REDRIVE_ATTEMPTS}) — re-driving once\"\n                        );\n                        committed = false; // re-drive; only a verified commit counts\n                        continue;\n                    }\n                    // Second miss → the head is swallowed even after a re-drive.\n                    integrity_lost = true;\n                    break;\n                }\n            }\n        }\n\n        if send_failed {\n            // stdin write FAILED → the binary is genuinely GONE (a REAL fault): re-spool\n            // the in-flight envelope, stamp + terminate, exit for a bounded respawn.\n            respool_and_fault(\n                &endpoint,\n                envelope_copy,\n…\n            );\n…\n        }\n…\n    }"}],"details":{"displayContent":{"text":"/// (reused; only the translation child is created). Extracted verbatim from\n/// `dispatch_spawn` so a live-update restart (`dispatch_adapter_apply`, W3d) can\n/// rebuild a session's translation child from the NEW binary without disturbing\n/// the PTY / output log / session (brain-parity).\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn build_translation(\n    argv: &[String],\n    endpoint_id: &str,\n    input: &Arc<InputWriter>,\n    respawns: Arc<AtomicU32>,\n    log: &Arc<Mutex<OutputLog>>,\n) -> Option<Arc<Translation>> {\n    let (cmd_tx, cmd_rx) = channel::<KeyCmd>();\n    match TranslationChild::spawn(argv, cmd_tx) {\n        Ok(child) => {\n            let child = Arc::new(child);\n            // First line: identity (content-free of any PTY bytes).\n            let _ = child.send(&ToBinary::Init {\n                endpoint_id: endpoint_id.to_string(),\n                node: spt_store::hostlabel::os_hostname().unwrap_or_default(),\n            });\n            let floor = Arc::new(Mutex::new(InjectFloor::default()));\n            let faulted = Arc::new(AtomicBool::new(false));\n            let (event_tx, event_rx) = channel::<String>();\n            let w_input = Arc::clone(input);\n            let w_child = Arc::clone(&child);\n            let w_floor = Arc::clone(&floor);\n            let w_faulted = Arc::clone(&faulted);\n            let w_respawns = Arc::clone(&respawns);\n            let w_log = Arc::clone(log);\n            let w_endpoint = endpoint_id.to_string();\n            // B6 (REQ-HAZARD-INJECT-WORKER-POISON): run the worker under a panic\n            // guard. A panic inside the worker (a residual unwrap, a poisoned lock the\n            // recovery missed, anything) must NOT silently kill the thread and orphan\n            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n            let sup_child = Arc::clone(&child);\n            let sup_faulted = Arc::clone(&faulted);\n            let sup_endpoint = endpoint_id.to_string();\n            thread::spawn(move || {\n                run_inject_worker_supervised(\n                    sup_child,\n                    sup_faulted,\n                    sup_endpoint,\n                    std::panic::AssertUnwindSafe(move || {\n                        run_inject_worker(\n                            w_input, w_child, w_floor, event_rx, cmd_rx, w_faulted, w_respawns,\n                            w_log, w_endpoint,\n                        );\n                    }),\n                );\n            });\n            Some(Arc::new(Translation {\n                floor,\n                event_tx,\n                child,\n                faulted,\n            }))\n        }\n        Err(e) => {\n            eprintln!(\n                \"TRANSLATION_SPAWN_FAILED:{argv:?}: {e} — no idle PTY delivery; inbound spools (declare/repair the binary)\"\n            );\n            None\n        }\n    }\n}\n\n/// The resident translation binary path declared by the manifest at\n/// `<install_dir>/manifest.toml` (`[message-idle-translation-binary].path`), or\n/// `None` if there is no such manifest / declaration. Read fresh from disk so a\n/// live-update restart picks up a MOVED/renamed binary (verdict flag-5: never\n/// reuse the stale cached `SpawnReq.translation_binary`). (W3d)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\n// [impl->REQ-TRANSLATE-COMMAND]\nfn read_translation_command(install_dir: &std::path::Path) -> Option<Vec<String>> {\n    let s = std::fs::read_to_string(install_dir.join(\"manifest.toml\")).ok()?;\n    let manifest = spt_runtime::Manifest::from_toml_str(&s).ok()?;\n    let decl = manifest.message_idle_translation_binary.as_ref()?;\n    // F-019 / REQ-INSTALL-11 + ADR-0029: resolve `command` (preferred) else the\n    // deprecated `path` to a spawnable argv — adapter-static keys substituted, the\n    // program token resolved against the install dir (same as the initial spawn in\n    // harnesshost) so the W3d live-update RESPAWN runs the real binary, not a\n    // verbatim path Command::new fails to find (which would spool idle inbound).\n    spt_runtime::runtime::resolve_translation_argv(\n        decl,\n        Some(install_dir),\n        Some(manifest.adapter.name.as_str()),\n    )\n}\n\n/// Run the inject worker under a panic guard (B6, REQ-HAZARD-INJECT-WORKER-POISON):\n/// `body` is the [`run_inject_worker`] call. If it PANICS, the guard FAULTs the\n/// translation binary — `fault_translation` terminates the child (no orphaned live\n/// pid) and sets `faulted` (idle inbound then spools, never a silent \"worker-gone\"\n/// force-native refusal against a still-running binary). Without this, a worker\n/// panic drops `event_rx` while the child keeps running: every later inject sees\n/// `event_tx.send` fail and reports delivered=false forever. `child` + `faulted` are\n…\n    // keeps it clear, so the bug-prone class re-settles forever.\n    let mut probe_unobservable = false;\n    // Layer 2 (echo-verify → re-drive → LOUD spool) is a DECLARED CAPABILITY, default\n    // OFF (`SPT_INJECT_VERIFY_ECHO`). It applies ONLY where the harness re-renders typed\n    // input into its observable output (a real TUI's input line does; a bare shell / a\n    // ConPTY programmatic inject / a test echo-child on ConPTY does NOT). Universal\n    // auto-detection is infeasible — a raw-mode TUI does not echo a benign control probe\n    // (so the probe cannot prove text-echo), and incidental output (a prompt, a redraw)\n    // would make a head-prefix check false-read head-loss and spuriously LOUD-spool EVERY\n    // delivery. So an adapter that KNOWS its harness echoes declares the capability\n    // (parallel to the ruling's \"bracketed-paste where the harness declares it\"); Layer 1\n    // (the settle-gate) is the UNCONDITIONAL root fix. The int gate also forces it on\n    // (`SPT_INJECT_FORCE_ECHO_MISS`) to exercise the re-drive/spool wiring on any platform.\n    // AMBIENT env can NOT arm this: both vars are scrubbed at daemon startup\n    // (`spt_runtime::INJECT_ECHO_ENV_VARS`, F-036 env-inheritance class — an inherited\n    // dev-shell export once force-enabled echo-verify host-wide and a false miss RETYPED\n    // sequences into a live session's input). Only an explicit declaration (or an\n    // in-process test broker, which never runs the daemon entrypoints) reaches this read.\n    let echo_capable = std::env::var_os(\"SPT_INJECT_VERIFY_ECHO\").is_some()\n        || std::env::var_os(\"SPT_INJECT_FORCE_ECHO_MISS\").is_some();\n    // `event_rx` blocks here; events queue → one sequence at a time.\n    for envelope in event_rx {\n        // A well-behaved filter only emits in response to an event, but drop any\n        // unsolicited commands left in the channel so they can't be mis-attributed\n        // to this event's sequence.\n        while cmd_rx.try_recv().is_ok() {}\n\n        let envelope_copy = envelope.clone();\n\n        // ── W5-A: run the sequence with a settle-gate (Layer 1) before ANY byte, an\n        // echo-verify (Layer 2) after `{commit}`, and ONE re-drive on a verify miss →\n        // LOUD spool on a second miss (silent+unrecoverable head-loss → recoverable+loud).\n        // The commit-deadline MISS / binary-death / send-fail semantics below are\n        // unchanged (C-1 miss-tolerance).\n        let mut committed = false;\n        let mut disconnected = false;\n        let mut send_failed = false;\n        let mut integrity_lost = false;\n        for attempt in 1..=INJECT_REDRIVE_ATTEMPTS {\n            // Layer 1: settle-gate before the first byte of EVERY delivery on an echoing\n            // PTY (re-arm — a mid-session `/clear` re-creates the reader-reattach race),\n            // and always before a RE-DRIVE (only reached on a swallowed head, so re-confirm\n            // readiness before retyping). Skip only where the probe is known unobservable\n            // (a non-echoing ConPTY — no race to guard, and settling would burn the full\n            // deadline). The latch is driven by the FIRST-ATTEMPT settle's own outcome.\n            if should_settle(attempt, probe_unobservable) {\n                let observed = settle_before_inject(&input, &log, &endpoint);\n                if attempt == 1 {\n                    probe_unobservable = !observed;\n                }\n            }\n            // Snapshot the ring high-water AFTER settling (excludes probe echoes) so\n            // Layer 2 sees only THIS sequence's output.\n            let seq_start = recover_log(&log).high_water();\n            match drive_one_sequence(&input, &floor, &child, &cmd_rx, envelope_copy.clone()) {\n                SeqOutcome::SendFailed => {\n                    send_failed = true;\n                    break;\n                }\n                SeqOutcome::Disconnected => {\n                    disconnected = true;\n                    break;\n                }\n                SeqOutcome::Missed => {\n                    // Commit-deadline miss — leave to the C-1 miss path (not an\n                    // integrity re-drive; the binary never signalled a complete sequence).\n                    break;\n                }\n                SeqOutcome::Committed { sent_text } => {\n                    committed = true;\n                    // Layer 2: verify the typed head echoed back — ONLY where the terminal\n                    // demonstrably echoes (else a non-echoing PTY's incidental output would\n                    // false-read head-loss). Where it does not echo, Layer 1 stands alone.\n                    if !echo_capable || echo_verify_after(&log, seq_start, &sent_text) {\n                        break; // delivered byte-complete (or echo-verify not applicable here)\n                    }\n                    if attempt < INJECT_REDRIVE_ATTEMPTS {\n                        eprintln!(\n                            \"INJECT_ECHO_MISS:{endpoint}: typed head did not echo (attempt {attempt}/{INJECT_REDRIVE_ATTEMPTS}) — re-driving once\"\n                        );\n                        committed = false; // re-drive; only a verified commit counts\n                        continue;\n                    }\n                    // Second miss → the head is swallowed even after a re-drive.\n                    integrity_lost = true;\n                    break;\n                }\n            }\n        }\n\n        if send_failed {\n            // stdin write FAILED → the binary is genuinely GONE (a REAL fault): re-spool\n            // the in-flight envelope, stamp + terminate, exit for a bounded respawn.\n            respool_and_fault(\n                &endpoint,\n                envelope_copy,\n…\n            );\n…\n        }\n…\n    }","startLine":1950,"lineNumbers":[1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,null,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,null,2399,null,2401,null,2484]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271810646}}
{"type":"message","id":"1dcad961","parentId":"50f69973","timestamp":"2026-07-17T07:03:30.652Z","message":{"role":"toolResult","toolCallId":"call_JSh7knds1OqjeifaaYI2LG04|fc_0fcf561150331aac016a59d3c1f60081908e0bf73274df4967","toolName":"grep","content":[{"type":"text","text":"# crates/\n\n## spt-daemon/src/\n### nethost.rs\n 195|        let writer_poisoned = Arc::clone(&poisoned);\n*196|        std::thread::spawn(move || {\n 197|            let poison = |halt_reason: &str| {\n 198|                writer_poisoned.store(true, Ordering::Release);\n 199|                if let Some(l) = &lease {\n...\n 2258|            let sent = Arc::clone(&sent);\n*2259|            std::thread::spawn(move || {\n 2260|                for f in &frames {\n 2261|                    host.send_stream(owner, f, false).expect(\"send\");\n 2262|                    sent.fetch_add(1, AtOrd::Relaxed);\n### conn.rs\n 447|        let dog_inner = Arc::clone(&inner);\n*448|        let dog = thread::Builder::new()\n 449|            .name(\"conn-watchdog\".into())\n 450|            .spawn(move || dog_inner.watchdog())\n 451|            .ok();\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## spt-term/src/\n### reader.rs\n 119|\n*120|        let handle = thread::spawn(move || {\n 121|            let mut reader = reader;\n 122|            let mut matcher = DsrMatcher::default();\n 123|            let mut buf = [0u8; 8192];"}],"details":{"scopePath":"crates/spt-daemon/src/nethost.rs, crates/spt-daemon/src/conn.rs, crates/spt-term/src/reader.rs, crates/spt-daemon/src/translation.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":4,"files":["crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/conn.rs","crates/spt-term/src/reader.rs","crates/spt-daemon/src/translation.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/nethost.rs","count":2},{"path":"crates/spt-daemon/src/conn.rs","count":1},{"path":"crates/spt-term/src/reader.rs","count":1},{"path":"crates/spt-daemon/src/translation.rs","count":1}],"truncated":false,"displayContent":"# crates/\n\n## spt-daemon/src/\n### nethost.rs\n  195│        let writer_poisoned = Arc::clone(&poisoned);\n *196│        std::thread::spawn(move || {\n  197│            let poison = |halt_reason: &str| {\n  198│                writer_poisoned.store(true, Ordering::Release);\n  199│                if let Some(l) = &lease {\n     │...\n 2258│            let sent = Arc::clone(&sent);\n*2259│            std::thread::spawn(move || {\n 2260│                for f in &frames {\n 2261│                    host.send_stream(owner, f, false).expect(\"send\");\n 2262│                    sent.fetch_add(1, AtOrd::Relaxed);\n### conn.rs\n 447│        let dog_inner = Arc::clone(&inner);\n*448│        let dog = thread::Builder::new()\n 449│            .name(\"conn-watchdog\".into())\n 450│            .spawn(move || dog_inner.watchdog())\n 451│            .ok();\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## spt-term/src/\n### reader.rs\n 119│\n*120│        let handle = thread::spawn(move || {\n 121│            let mut reader = reader;\n 122│            let mut matcher = DsrMatcher::default();\n 123│            let mut buf = [0u8; 8192];"},"isError":false,"timestamp":1784271810652}}
{"type":"message","id":"35300d81","parentId":"1dcad961","timestamp":"2026-07-17T07:03:36.823Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning exact serve loop implementation**"},{"type":"toolCall","id":"call_hR84FdjIJaK0rHJAqrLnoIYm|fc_0fcf561150331aac016a59d3c846388190a3283c741267ea77","name":"read","arguments":{"i":"Reading broker accept loop","path":"crates/spt-daemon/src/broker.rs","selector":"2760-2830"}},{"type":"toolCall","id":"call_Z2v9d97asFJEM5fsuulwQyTS|fc_0fcf561150331aac016a59d3c846488190987068a837aeee04","name":"read","arguments":{"i":"Reading PTY drain loop","path":"crates/spt-term/src/reader.rs","selector":"95-160"}},{"type":"toolCall","id":"call_C1OcvJyc5ZInkD1KhJKaJvFJ|fc_0fcf561150331aac016a59d3c846508190a7cddef7d370cbc5","name":"read","arguments":{"i":"Reading conn watchdog loop","path":"crates/spt-daemon/src/conn.rs","selector":"330-415,440-460,625-665"}},{"type":"toolCall","id":"call_cnwL2U9WFY6QjtyhSO5vQrsE|fc_0fcf561150331aac016a59d3c846548190ac5b10dae71a8b6d","name":"read","arguments":{"i":"Reading hosted session fields","path":"crates/spt-daemon/src/broker.rs","selector":"1660-1770,2585-2630"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9452,"output":189,"cacheRead":68096,"cacheWrite":0,"totalTokens":77737,"reasoningTokens":9,"cost":{"input":0.04726,"output":0.0056700000000000006,"cacheRead":0.034048,"cacheWrite":0,"total":0.086978}},"stopReason":"toolUse","timestamp":1784271810704,"responseId":"resp_0fcf561150331aac016a59d3c306648190989bfdbf59bbdffa","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3c4ab5c8190af7627623f965378","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdPIQL1fDW0xgXIeBK1OMhV4tFfS5t0oT0N-V07UsrnZ9C_7Hl5ldKpw_vBa7rwhWzkcMLevuM18TOemSjARCAsifIqT6Sb98e_k0qxlOft2LXV4FpYa8Hu41YmANZNXVNNam3JRkRdo2jpWSXdWZALB1ztA_gejlDPM_-EXut63JJ70tapJ8A2ZrlTdOWOxuXErjKu0tEpeVG_bm86GTH6op7WfDEUsITUpcjLx_phZ4WSMngcR6roWXKRXywO2Vt-8WvtUM9ODkwOeXtUHwxBLSrC9CLr1GogX-jP75Fm5vltBjrbKfLQGpXAj8s3AyJDdzP25G1zZPGd85HCPzYs8Y6-VSxaFsCNY2IoOrgcDYTIxj4hFt25r_oqB_6yJRxELo86In70sxCfENfQH92dcRLShvDa36nuuGOTJ8wKGQzOhWohLQGfaGORqBrzfhds-waXbBc_HfSiLVY4Gk0P2HFvGMwqqbU1YNmjRY_eGUpDciYgEY9lni4pAkzymtVsSuBBVFEl2QdBBURn1eNzyJgxBminZ8sFXdY3y0a9pCp0W1hQUk95HBewlvSpHTbvGcMRPB81SbGmkm_GsXjxgP_duVxHPnaToUTirx7xZZhYALhnFwl3xyifYFOXln_tfN0WR5QHwhdUdq8SUEI7VrxCh6EWBHZce8SjvQtiJ0L30yMmgF5pMjtcqHmojeWDYibOdHSGgkAfAXmXerEj4qr_jcAwC95_guCh6qEugWdtsaBqs1nY-Dx4rNAJT1gz9bH4q_gIEtvDtHYasXYovegKGBWn5uIlINWh_ohTrvqbOFcckAIeZl-_TIX0FKmz9Zw1CJ3A_dXL67yaUxgxXaLX83PfneMrQ24F7LKW6rZqckSFrp67tOEW3chUMuNt9DyGydUO_ij23ko5OxWhc-nnsZG9liFvs4NDJztUZFPP1jsP1h39AB4iZPHKgtuQv","summary":[{"type":"summary_text","text":"**Planning exact serve loop implementation**"}]},{"id":"fc_0fcf561150331aac016a59d3c846388190a3283c741267ea77","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker accept loop\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"2760-2830\"}","call_id":"call_hR84FdjIJaK0rHJAqrLnoIYm","name":"read"},{"id":"fc_0fcf561150331aac016a59d3c846488190987068a837aeee04","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading PTY drain loop\",\"path\":\"crates/spt-term/src/reader.rs\",\"selector\":\"95-160\"}","call_id":"call_Z2v9d97asFJEM5fsuulwQyTS","name":"read"},{"id":"fc_0fcf561150331aac016a59d3c846508190a7cddef7d370cbc5","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading conn watchdog loop\",\"path\":\"crates/spt-daemon/src/conn.rs\",\"selector\":\"330-415,440-460,625-665\"}","call_id":"call_C1OcvJyc5ZInkD1KhJKaJvFJ","name":"read"},{"id":"fc_0fcf561150331aac016a59d3c846548190ac5b10dae71a8b6d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading hosted session fields\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1660-1770,2585-2630\"}","call_id":"call_cnwL2U9WFY6QjtyhSO5vQrsE","name":"read"}]},"duration":6118.341700002551,"ttft":1985.0093999952078,"contextSnapshot":{"promptTokens":77548,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_hR84FdjIJaK0rHJAqrLnoIYm|fc_0fcf561150331aac016a59d3c846388190a3283c741267ea77","toolName":"read","startedAt":"2026-07-17T07:03:36.824Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker accept loop"},"id":"859f22af","parentId":"35300d81","timestamp":"2026-07-17T07:03:36.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Z2v9d97asFJEM5fsuulwQyTS|fc_0fcf561150331aac016a59d3c846488190987068a837aeee04","toolName":"read","startedAt":"2026-07-17T07:03:36.824Z","args":{"path":"crates/spt-term/src/reader.rs"},"intent":"Reading PTY drain loop"},"id":"93226a57","parentId":"859f22af","timestamp":"2026-07-17T07:03:36.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_C1OcvJyc5ZInkD1KhJKaJvFJ|fc_0fcf561150331aac016a59d3c846508190a7cddef7d370cbc5","toolName":"read","startedAt":"2026-07-17T07:03:36.824Z","args":{"path":"crates/spt-daemon/src/conn.rs"},"intent":"Reading conn watchdog loop"},"id":"e6243917","parentId":"93226a57","timestamp":"2026-07-17T07:03:36.824Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_cnwL2U9WFY6QjtyhSO5vQrsE|fc_0fcf561150331aac016a59d3c846548190ac5b10dae71a8b6d","toolName":"read","startedAt":"2026-07-17T07:03:36.824Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading hosted session fields"},"id":"829516fd","parentId":"e6243917","timestamp":"2026-07-17T07:03:36.824Z"}
{"type":"message","id":"f3419a1f","parentId":"829516fd","timestamp":"2026-07-17T07:03:36.830Z","message":{"role":"toolResult","toolCallId":"call_C1OcvJyc5ZInkD1KhJKaJvFJ|fc_0fcf561150331aac016a59d3c846508190a7cddef7d370cbc5","toolName":"read","content":[{"type":"text","text":"impl Inner {\n…\n    fn sever(&self) {\n…\n        #[cfg(windows)]\n        // SAFETY: as in poison_and_cancel — handle outlives the watchdog.\n        unsafe {\n            let _ = win::DisconnectNamedPipe(self.raw);\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n    }\n\n    /// The watchdog body: park until a write is in flight, then sleep to its\n    /// absolute deadline. If the op is still in flight at the deadline,\n    /// poison + cancel, re-canceling periodically until the op reports\n    /// completion (the writer clears `inflight` the instant `write_frame`\n    /// returns — that return IS the buffer-release handshake), then sever.\n    fn watchdog(&self) {\n        let mut d = recover(&self.dog);\n        loop {\n            // Park until armed (or shutdown).\n            let (op, deadline) = loop {\n                if d.shutdown {\n                    return;\n                }\n                if let Some(armed) = d.inflight {\n                    break armed;\n                }\n                d = self\n                    .dog_cv\n                    .wait(d)\n                    .unwrap_or_else(|p| p.into_inner());\n            };\n            // Sleep toward the deadline while THIS op stays in flight.\n            let fired = loop {\n                if d.shutdown {\n                    return;\n                }\n                match d.inflight {\n                    Some((cur, _)) if cur == op => {}\n                    // Completed (or a newer op armed) before the deadline.\n                    _ => break false,\n                }\n                let now = Instant::now();\n                if now >= deadline {\n                    break true;\n                }\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, deadline - now)\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n            };\n            if !fired {\n                continue;\n            }\n            // Deadline: abort out of band, then wait for the canceled op to\n            // report completion before severing (re-cancel each slice — a\n            // cancel that raced the WriteFileEx issuance reaches nothing, so\n            // one shot is not enough). Latch timed_out FIRST so the aborted\n            // writer observes its failure as a DEADLINE retirement (wedge),\n            // not an organic conn death.\n            drop(d);\n            self.timed_out.store(true, Ordering::Release);\n            self.poison_and_cancel(None);\n            d = recover(&self.dog);\n            while matches!(d.inflight, Some((cur, _)) if cur == op) && !d.shutdown {\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, Duration::from_millis(100))\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n                drop(d);\n                self.poison_and_cancel(None);\n                d = recover(&self.dog);\n            }\n            if d.shutdown {\n                return;\n            }\n            drop(d);\n            self.sever();\n            d = recover(&self.dog);\n        }\n    }\n}\n\n/// The shared, serialized, BOUNDED send side of one physical broker\n/// connection — what [`crate::broker::SharedSend`] now aliases. Owns the\n/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n…\n}\n…\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n…\n        let inner = Arc::new(Inner {\n…\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n    /// (`Arc::ptr_eq` identity does not survive a log line).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn id(&self) -> u64 {\n        self.inner.id\n    }\n…\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n…\n}"}],"details":{"displayContent":{"text":"impl Inner {\n…\n    fn sever(&self) {\n…\n        #[cfg(windows)]\n        // SAFETY: as in poison_and_cancel — handle outlives the watchdog.\n        unsafe {\n            let _ = win::DisconnectNamedPipe(self.raw);\n            let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());\n        }\n    }\n\n    /// The watchdog body: park until a write is in flight, then sleep to its\n    /// absolute deadline. If the op is still in flight at the deadline,\n    /// poison + cancel, re-canceling periodically until the op reports\n    /// completion (the writer clears `inflight` the instant `write_frame`\n    /// returns — that return IS the buffer-release handshake), then sever.\n    fn watchdog(&self) {\n        let mut d = recover(&self.dog);\n        loop {\n            // Park until armed (or shutdown).\n            let (op, deadline) = loop {\n                if d.shutdown {\n                    return;\n                }\n                if let Some(armed) = d.inflight {\n                    break armed;\n                }\n                d = self\n                    .dog_cv\n                    .wait(d)\n                    .unwrap_or_else(|p| p.into_inner());\n            };\n            // Sleep toward the deadline while THIS op stays in flight.\n            let fired = loop {\n                if d.shutdown {\n                    return;\n                }\n                match d.inflight {\n                    Some((cur, _)) if cur == op => {}\n                    // Completed (or a newer op armed) before the deadline.\n                    _ => break false,\n                }\n                let now = Instant::now();\n                if now >= deadline {\n                    break true;\n                }\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, deadline - now)\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n            };\n            if !fired {\n                continue;\n            }\n            // Deadline: abort out of band, then wait for the canceled op to\n            // report completion before severing (re-cancel each slice — a\n            // cancel that raced the WriteFileEx issuance reaches nothing, so\n            // one shot is not enough). Latch timed_out FIRST so the aborted\n            // writer observes its failure as a DEADLINE retirement (wedge),\n            // not an organic conn death.\n            drop(d);\n            self.timed_out.store(true, Ordering::Release);\n            self.poison_and_cancel(None);\n            d = recover(&self.dog);\n            while matches!(d.inflight, Some((cur, _)) if cur == op) && !d.shutdown {\n                let (g, _) = self\n                    .dog_cv\n                    .wait_timeout(d, Duration::from_millis(100))\n                    .unwrap_or_else(|p| p.into_inner());\n                d = g;\n                drop(d);\n                self.poison_and_cancel(None);\n                d = recover(&self.dog);\n            }\n            if d.shutdown {\n                return;\n            }\n            drop(d);\n            self.sever();\n            d = recover(&self.dog);\n        }\n    }\n}\n\n/// The shared, serialized, BOUNDED send side of one physical broker\n/// connection — what [`crate::broker::SharedSend`] now aliases. Owns the\n/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n…\n}\n…\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n…\n        let inner = Arc::new(Inner {\n…\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n    /// (`Arc::ptr_eq` identity does not survive a log line).\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    pub(crate) fn id(&self) -> u64 {\n        self.inner.id\n    }\n…\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n…\n}","startLine":219,"lineNumbers":[219,null,326,null,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,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,null,420,null,426,null,428,null,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,null,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,null,670]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\conn.rs"}}},"isError":false,"timestamp":1784271816830}}
{"type":"message","id":"1131abf2","parentId":"f3419a1f","timestamp":"2026-07-17T07:03:36.870Z","message":{"role":"toolResult","toolCallId":"call_cnwL2U9WFY6QjtyhSO5vQrsE|fc_0fcf561150331aac016a59d3c846548190ac5b10dae71a8b6d","toolName":"read","content":[{"type":"text","text":"fn controller_writer(\n…\n) {\n…\n    send.lifecycle_event(\n…\n    );\n}\n\n/// The per-session translation-binary attachment (W2 Layer C, ADR-0022). Present\n/// ONLY when the spawn carried a `translation_binary` path; absent → the session\n/// has no idle PTY delivery and inbound SPOOLS (ADR-0022 amendment — raw inject\n/// was removed as a delivery path; it did not submit on a modern TUI).\n///\n/// Holds the shared inject floor (the controller-input buffer, also touched by\n/// `dispatch_input`), the queue that feeds inbound `<EVENT>`s to the inject worker\n/// (events serialize — never two uncommitted sequences interleaved), the shared\n/// child handle (so `dispatch_input` can fire content-free `{type:input}` pings\n/// while the worker drives an event), and the FAULT flag the worker raises when a\n/// sequence misses its [`INJECT_COMMIT_DEADLINE`] or the binary dies — after which\n/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.\nstruct Translation {\n    /// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.\n    floor: Arc<Mutex<InjectFloor>>,\n    /// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here\n    /// and are driven one-at-a-time so two sequences never interleave.\n    event_tx: Sender<String>,\n    /// The live child — shared so `dispatch_input` fires content-free pings while\n    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n    child: Arc<TranslationChild>,\n    /// Raised by the worker on FAULT (commit-deadline miss / binary death): the\n    /// session's idle inbound then SPOOLS (never raw-injected) and `dispatch_input`\n    /// stops pinging.\n    faulted: Arc<AtomicBool>,\n}\n\n/// A child the broker hosts under a PTY — the §B-owned resources for one\n/// session, plus its gapless-resume output log.\nstruct HostedSession {\n    /// The PTY + child (PTY master/writer + spawned child process).\n    session: Arc<PtySession>,\n    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n    /// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): the SOLE caller of the blocking\n    /// `write_input`. Every dispatch-side write ENQUEUES here and returns at once,\n    /// so a paste burst that fills the harness's input buffer parks only the\n    /// writer thread, never the broker dispatch thread.\n    input: Arc<InputWriter>,\n    /// The output drain pump (kept so teardown can stop it).\n    #[allow(dead_code)] // held for ownership/teardown; not read directly\n    drain: Drain,\n    /// The sequenced, buffered output + current subscriber.\n    log: Arc<Mutex<OutputLog>>,\n    /// The owning endpoint (the spawn's label; empty = unlabeled). The\n    /// inbound dispatcher's gate subject for remote-drive (D9-1).\n    endpoint: String,\n    /// The translation-binary attachment (Layer C), or `None` for a session with\n    /// no `[message-idle-translation-binary]` — then idle inbound delivery SPOOLS\n    /// (no raw PTY inject; ADR-0022 amendment).\n    translation: Option<Arc<Translation>>,\n    /// The resolved translation argv this session was spawned with (F029 C-1) —\n    /// held so a bounded eager respawn after a REAL fault can rebuild the binary\n    /// from the exact same command (`build_translation`) without re-reading the\n    /// manifest (works for a test session with a direct argv AND a production\n    /// session). `None` for a no-translation session. Updated on an adapter-apply\n    /// restart to the swapped-in argv.\n    translation_argv: Option<Vec<String>>,\n    /// The bounded-respawn give-up counter shared with the inject worker (F029 C-1,\n    /// REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH): the dispatch respawn path\n    /// increments it per rebuild, the worker RESETS it to 0 on a healthy `{commit}`\n    /// (so a recovered binary refreshes the whole budget). At `translate_respawn_\n    /// budget()` the daemon gives up (loud) and leaves the binary dead → spool.\n    translation_respawns: Arc<AtomicU32>,\n    /// The adapter name owning this session (W3a, ADR-0025) — empty for a\n    /// legacy/test/shell spawn. A live adapter update finds every live session\n    /// whose `adapter` matches to cycle its resident children.\n    adapter: String,\n    /// The adapter's install dir for this session (W3a) — `None` if unknown. The\n    /// apply target for a live update's CRC swap.\n    install_dir: Option<std::path::PathBuf>,\n}\n\n/// One record queued to a session's dedicated PTY input-writer thread — the raw\n/// bytes to write (v0.13.0 P0, REQ-HAZARD-PTY-INPUT-WRITER-WEDGE).\ntype InputRecord = Vec<u8>;\n\n/// The per-session PTY input FIFO depth (records). Sized for a generous paste —\n/// a wedged harness fills this and then DROPS, never blocking the dispatch\n/// thread. The int gate shrinks it via `SPT_INPUT_QUEUE_DEPTH` so the\n/// DROP+`INPUT_BACKPRESSURE` leg is forced in a handful of records rather than a\n/// few hundred KB of real paste.\nconst INPUT_QUEUE_DEPTH: usize = 4096;\n\n/// The effective input FIFO depth: production is [`INPUT_QUEUE_DEPTH`]; the int\n/// gate overrides it (`SPT_INPUT_QUEUE_DEPTH`) to a tiny value to force a\n/// deterministic queue saturation — the depth's PRESENCE (bounded, drop-on-full)\n/// is the invariant, not its exact value.\nfn input_queue_depth() -> usize {\n    match std::env::var(\"SPT_INPUT_QUEUE_DEPTH\") {\n        Ok(n) => n\n            .parse::<usize>()\n            .ok()\n            .filter(|d| *d > 0)\n            .unwrap_or(INPUT_QUEUE_DEPTH),\n        Err(_) => INPUT_QUEUE_DEPTH,\n    }\n}\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n…\n}\n…\npub struct Broker {\n…\n    /// The broker→supervisor planned-restart signal (ADR-0018 D3-3): a\n    /// `KIND_BRAIN_RESTART` handler raises it so the brain supervisor cycles the\n    /// child onto a freshly-swapped binary. Empty on a bare broker (a test broker\n    /// with no supervisor) — the verb is then accepted but unhonored. Set once by\n    /// `Daemon::run` after it spawns the supervisor.\n    brain_restart: std::sync::OnceLock<Arc<crate::brainproc::BrainRestart>>,\n    /// Held meet results for the two-phase join (REQ-JOIN-TWO-PHASE): a\n    /// `session_id → (subnet, real address, 5-min deadline)` between\n    /// [`KIND_PAIR_MEET`] and [`KIND_PAIR_CODE_SUBMIT`]. The code phase dials the\n    /// held address (no re-search); a wrong-code retry keeps the entry. Pairing\n    /// is never journaled (the code must not persist) — in-memory only, and a\n    /// daemon restart simply makes the operator re-run the meet.\n    pair_holds: Mutex<HashMap<u64, PairHold>>,\n    /// In-flight single-flight WAKE claims, keyed by endpoint id (W4,\n    /// REQ-SPAWN-COLLISION-GUARD-LIVE-DUP). The broker is the sole spawner post-W3 (the\n    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n    /// perch-record claim (that would add another info.json writer, the exact\n    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n    /// a duplicate wake for a claimed-or-already-live endpoint stands down (no-op ack).\n    wake_inflight: Mutex<HashSet<String>>,\n    /// Live per-connection handler-thread tally: incremented on [`handle_conn`]\n    /// entry, decremented (RAII, panic-safe) when the handler returns. The\n    /// UPDATE-WEDGE round-4 int gate's observability seam\n    /// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): a poisoned/aborted\n    /// physical conn must drive its handler to EOF cleanup within the write\n    /// bound WITHOUT the client dropping — the test watches this count fall.\n    conn_handlers: AtomicUsize,\n}\n\n/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\nstruct PairHold {\n    subnet: String,\n    addr: EndpointAddr,\n    /// When the wait-for-code window expires (meet + 5 minutes).\n    deadline: Instant,\n}\n\n/// The two-phase join's wait-for-code window: the daemon holds the met address\n/// this long before a code must arrive (ADR-0030 / REQ-JOIN-TWO-PHASE).\nconst PAIR_CODE_WAIT: Duration = Duration::from_secs(5 * 60);\n\n/// Whether a held meet is still within its wait-for-code window\n/// (REQ-JOIN-TWO-PHASE). Pure (the testable core of the timeout).\nfn hold_is_live(deadline: Instant, now: Instant) -> bool {\n    deadline > now\n}"}],"details":{"displayContent":{"text":"fn controller_writer(\n…\n) {\n…\n    send.lifecycle_event(\n…\n    );\n}\n\n/// The per-session translation-binary attachment (W2 Layer C, ADR-0022). Present\n/// ONLY when the spawn carried a `translation_binary` path; absent → the session\n/// has no idle PTY delivery and inbound SPOOLS (ADR-0022 amendment — raw inject\n/// was removed as a delivery path; it did not submit on a modern TUI).\n///\n/// Holds the shared inject floor (the controller-input buffer, also touched by\n/// `dispatch_input`), the queue that feeds inbound `<EVENT>`s to the inject worker\n/// (events serialize — never two uncommitted sequences interleaved), the shared\n/// child handle (so `dispatch_input` can fire content-free `{type:input}` pings\n/// while the worker drives an event), and the FAULT flag the worker raises when a\n/// sequence misses its [`INJECT_COMMIT_DEADLINE`] or the binary dies — after which\n/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.\nstruct Translation {\n    /// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.\n    floor: Arc<Mutex<InjectFloor>>,\n    /// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here\n    /// and are driven one-at-a-time so two sequences never interleave.\n    event_tx: Sender<String>,\n    /// The live child — shared so `dispatch_input` fires content-free pings while\n    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n    child: Arc<TranslationChild>,\n    /// Raised by the worker on FAULT (commit-deadline miss / binary death): the\n    /// session's idle inbound then SPOOLS (never raw-injected) and `dispatch_input`\n    /// stops pinging.\n    faulted: Arc<AtomicBool>,\n}\n\n/// A child the broker hosts under a PTY — the §B-owned resources for one\n/// session, plus its gapless-resume output log.\nstruct HostedSession {\n    /// The PTY + child (PTY master/writer + spawned child process).\n    session: Arc<PtySession>,\n    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n    /// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): the SOLE caller of the blocking\n    /// `write_input`. Every dispatch-side write ENQUEUES here and returns at once,\n    /// so a paste burst that fills the harness's input buffer parks only the\n    /// writer thread, never the broker dispatch thread.\n    input: Arc<InputWriter>,\n    /// The output drain pump (kept so teardown can stop it).\n    #[allow(dead_code)] // held for ownership/teardown; not read directly\n    drain: Drain,\n    /// The sequenced, buffered output + current subscriber.\n    log: Arc<Mutex<OutputLog>>,\n    /// The owning endpoint (the spawn's label; empty = unlabeled). The\n    /// inbound dispatcher's gate subject for remote-drive (D9-1).\n    endpoint: String,\n    /// The translation-binary attachment (Layer C), or `None` for a session with\n    /// no `[message-idle-translation-binary]` — then idle inbound delivery SPOOLS\n    /// (no raw PTY inject; ADR-0022 amendment).\n    translation: Option<Arc<Translation>>,\n    /// The resolved translation argv this session was spawned with (F029 C-1) —\n    /// held so a bounded eager respawn after a REAL fault can rebuild the binary\n    /// from the exact same command (`build_translation`) without re-reading the\n    /// manifest (works for a test session with a direct argv AND a production\n    /// session). `None` for a no-translation session. Updated on an adapter-apply\n    /// restart to the swapped-in argv.\n    translation_argv: Option<Vec<String>>,\n    /// The bounded-respawn give-up counter shared with the inject worker (F029 C-1,\n    /// REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH): the dispatch respawn path\n    /// increments it per rebuild, the worker RESETS it to 0 on a healthy `{commit}`\n    /// (so a recovered binary refreshes the whole budget). At `translate_respawn_\n    /// budget()` the daemon gives up (loud) and leaves the binary dead → spool.\n    translation_respawns: Arc<AtomicU32>,\n    /// The adapter name owning this session (W3a, ADR-0025) — empty for a\n    /// legacy/test/shell spawn. A live adapter update finds every live session\n    /// whose `adapter` matches to cycle its resident children.\n    adapter: String,\n    /// The adapter's install dir for this session (W3a) — `None` if unknown. The\n    /// apply target for a live update's CRC swap.\n    install_dir: Option<std::path::PathBuf>,\n}\n\n/// One record queued to a session's dedicated PTY input-writer thread — the raw\n/// bytes to write (v0.13.0 P0, REQ-HAZARD-PTY-INPUT-WRITER-WEDGE).\ntype InputRecord = Vec<u8>;\n\n/// The per-session PTY input FIFO depth (records). Sized for a generous paste —\n/// a wedged harness fills this and then DROPS, never blocking the dispatch\n/// thread. The int gate shrinks it via `SPT_INPUT_QUEUE_DEPTH` so the\n/// DROP+`INPUT_BACKPRESSURE` leg is forced in a handful of records rather than a\n/// few hundred KB of real paste.\nconst INPUT_QUEUE_DEPTH: usize = 4096;\n\n/// The effective input FIFO depth: production is [`INPUT_QUEUE_DEPTH`]; the int\n/// gate overrides it (`SPT_INPUT_QUEUE_DEPTH`) to a tiny value to force a\n/// deterministic queue saturation — the depth's PRESENCE (bounded, drop-on-full)\n/// is the invariant, not its exact value.\nfn input_queue_depth() -> usize {\n    match std::env::var(\"SPT_INPUT_QUEUE_DEPTH\") {\n        Ok(n) => n\n            .parse::<usize>()\n            .ok()\n            .filter(|d| *d > 0)\n            .unwrap_or(INPUT_QUEUE_DEPTH),\n        Err(_) => INPUT_QUEUE_DEPTH,\n    }\n}\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n…\n}\n…\npub struct Broker {\n…\n    /// The broker→supervisor planned-restart signal (ADR-0018 D3-3): a\n    /// `KIND_BRAIN_RESTART` handler raises it so the brain supervisor cycles the\n    /// child onto a freshly-swapped binary. Empty on a bare broker (a test broker\n    /// with no supervisor) — the verb is then accepted but unhonored. Set once by\n    /// `Daemon::run` after it spawns the supervisor.\n    brain_restart: std::sync::OnceLock<Arc<crate::brainproc::BrainRestart>>,\n    /// Held meet results for the two-phase join (REQ-JOIN-TWO-PHASE): a\n    /// `session_id → (subnet, real address, 5-min deadline)` between\n    /// [`KIND_PAIR_MEET`] and [`KIND_PAIR_CODE_SUBMIT`]. The code phase dials the\n    /// held address (no re-search); a wrong-code retry keeps the entry. Pairing\n    /// is never journaled (the code must not persist) — in-memory only, and a\n    /// daemon restart simply makes the operator re-run the meet.\n    pair_holds: Mutex<HashMap<u64, PairHold>>,\n    /// In-flight single-flight WAKE claims, keyed by endpoint id (W4,\n    /// REQ-SPAWN-COLLISION-GUARD-LIVE-DUP). The broker is the sole spawner post-W3 (the\n    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n    /// perch-record claim (that would add another info.json writer, the exact\n    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n    /// a duplicate wake for a claimed-or-already-live endpoint stands down (no-op ack).\n    wake_inflight: Mutex<HashSet<String>>,\n    /// Live per-connection handler-thread tally: incremented on [`handle_conn`]\n    /// entry, decremented (RAII, panic-safe) when the handler returns. The\n    /// UPDATE-WEDGE round-4 int gate's observability seam\n    /// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): a poisoned/aborted\n    /// physical conn must drive its handler to EOF cleanup within the write\n    /// bound WITHOUT the client dropping — the test watches this count fall.\n    conn_handlers: AtomicUsize,\n}\n\n/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\nstruct PairHold {\n    subnet: String,\n    addr: EndpointAddr,\n    /// When the wait-for-code window expires (meet + 5 minutes).\n    deadline: Instant,\n}\n\n/// The two-phase join's wait-for-code window: the daemon holds the met address\n/// this long before a code must arrive (ADR-0030 / REQ-JOIN-TWO-PHASE).\nconst PAIR_CODE_WAIT: Duration = Duration::from_secs(5 * 60);\n\n/// Whether a held meet is still within its wait-for-code window\n/// (REQ-JOIN-TWO-PHASE). Pure (the testable core of the timeout).\nfn hold_is_live(deadline: Instant, now: Instant) -> bool {\n    deadline > now\n}","startLine":1553,"lineNumbers":[1553,null,1562,null,1657,null,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,null,1783,null,2561,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784271816870}}
{"type":"message","id":"67370a5f","parentId":"1131abf2","timestamp":"2026-07-17T07:03:36.877Z","message":{"role":"toolResult","toolCallId":"call_Z2v9d97asFJEM5fsuulwQyTS|fc_0fcf561150331aac016a59d3c846488190987068a837aeee04","toolName":"read","content":[{"type":"text","text":"impl Drain {\n…\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\n    /// on ConPTY that means the child must be torn down first. Best-effort.\n    pub fn join(mut self) {\n        if let Some(h) = self.handle.take() {\n            let _ = h.join();\n        }\n    }\n}\n\nimpl Drain {\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\n    /// bounded channel applies backpressure).\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\n    where\n        R: Read + Send + 'static,\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let stop = Arc::new(AtomicBool::new(false));\n        let dsr_answered = Arc::new(AtomicU64::new(0));\n        let bytes = Arc::new(AtomicU64::new(0));\n\n        let t_stop = Arc::clone(&stop);\n        let t_dsr = Arc::clone(&dsr_answered);\n        let t_bytes = Arc::clone(&bytes);\n\n        let handle = thread::spawn(move || {\n            let mut reader = reader;\n            let mut matcher = DsrMatcher::default();\n            let mut buf = [0u8; 8192];\n            loop {\n                if t_stop.load(Ordering::Relaxed) {\n                    break;\n                }\n                match reader.read(&mut buf) {\n                    Ok(0) => break, // EOF — child gone and handles released\n                    Ok(n) => {\n                        let chunk = &buf[..n];\n                        let hits = matcher.scan(chunk);\n                        if hits > 0 {\n                            // Answer through the shared, serialized writer so the\n                            // CPR never interleaves with caller-injected input.\n                            if let Ok(mut w) = writer.lock() {\n                                for _ in 0..hits {\n                                    let _ = w.write_all(DSR_REPLY);\n                                }\n                                let _ = w.flush();\n                            }\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\n                        }\n                        sink(chunk);\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\n                    }\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\n                    Err(_) => break,\n                }\n            }\n        });\n\n        Drain {\n            stop,\n            dsr_answered,\n            bytes,\n            handle: Some(handle),\n        }\n    }\n}\n\nimpl PtySession {\n    /// Start draining this surface's output on a background thread, answering\n…\n}\n\n[Showing lines 94-163 of 287. Use :164 to continue]"}],"details":{"truncation":{"content":"    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r","truncated":true,"truncatedBy":"lines","totalLines":194,"totalBytes":2699,"outputLines":70,"outputBytes":2699,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl Drain {\n…\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r\n…\n}","startLine":75,"lineNumbers":[75,null,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,null,178]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\reader.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":287,"totalBytes":2699,"outputLines":70,"outputBytes":2699,"shownRange":{"start":94,"end":163},"nextOffset":164}}},"isError":false,"timestamp":1784271816877}}
{"type":"message","id":"9b0c29ea","parentId":"67370a5f","timestamp":"2026-07-17T07:03:36.958Z","message":{"role":"toolResult","toolCallId":"call_hR84FdjIJaK0rHJAqrLnoIYm|fc_0fcf561150331aac016a59d3c846388190a3283c741267ea77","toolName":"read","content":[{"type":"text","text":"    /// the boot-race self-heal path calls this once the background retry brings\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n    /// Idempotent by `OnceLock` — a second attach is a no-op returning `false`\n    /// (the first host wins); the hot read path (`net()`) never blocks on it.\n    // [impl->REQ-DAEMON-9]\n    pub fn attach_net(&self, host: NetHost) -> bool {\n        self.net.set(host).is_ok()\n    }\n\n    /// The broker-owned exactly-once anchor (for introspection / tests).\n    pub fn journal(&self) -> &Arc<EffectJournal> {\n        &self.journal\n    }\n\n    /// The broker-owned network host, if one is attached (at bind or via the\n    /// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.\n    pub fn net(&self) -> Option<&NetHost> {\n        self.net.get()\n    }\n\n    /// Accept connections forever, handling each on its own thread. The broker\n    /// is the long-lived process; this is its main loop. Per-connection\n    /// threading is half the KH 7.4 isolation stance: one brain's blocking\n    /// dispatch can never stall another's (the per-session half is\n    /// [`Broker::dispatch_spawn`]'s drain/waiter threads).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n        loop {\n            let conn = self.listener.accept()?;\n            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n            // throwaway connection that woke this accept — observe it and return so the\n            // serve thread (and, with it, the listener) tears down instead of leaking.\n            if self.stop.load(Ordering::Acquire) {\n                return Ok(());\n            }\n            let me = Arc::clone(self);\n            thread::spawn(move || {\n                let _ = me.handle_conn(conn);\n            });\n        }\n    }\n\n    /// Gracefully stop the [`serve`](Self::serve) accept loop: raise the latch, then\n    /// dial one throwaway connection so the blocked `accept()` wakes, observes the\n    /// latch, and returns (dropping the listener). Best-effort + idempotent — a second\n    /// call, or a call after the loop already exited, just fails the dial harmlessly.\n    /// Fills the honest gap that `serve` is otherwise unstoppable (the leaked-serve\n    /// load that starved the seed stop barrier — REQ-HAZARD-DAEMON-STOP-BARRIER).\n    // [impl->REQ-HAZARD-DAEMON-STOP-BARRIER]\n    pub fn stop(&self) {\n        self.stop.store(true, Ordering::Release);\n        let _ = LocalSocketTransport::connect(&self.name);\n    }\n\n    /// Accept exactly one connection and handle it on a spawned thread, returning\n    /// that thread's handle. The single-brain entry point the tests exercise.\n    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n        let conn = self.listener.accept()?;\n        let me = Arc::clone(self);\n        Ok(thread::spawn(move || {\n            let _ = me.handle_conn(conn);\n        }))\n    }\n\n    /// Number of currently hosted sessions (for tests / introspection).\n    pub fn session_count(&self) -> usize {\n        recover(&self.sessions).len()\n    }\n\n    /// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling\n    /// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-\n    /// wedged LOCAL controller (`by: None`) on hosted session `id` — a sink\n    /// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and\n    /// whose writer thread only drains its channel (it NEVER calls\n    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical\n\n[Showing lines 2759-2833 of 6298. Use :2834 to continue]"}],"details":{"truncation":{"content":"    /// the boot-race self-heal path calls this once the background retry brings\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n    /// Idempotent by `OnceLock` — a second attach is a no-op returning `false`\n    /// (the first host wins); the hot read path (`net()`) never blocks on it.\n    // [impl->REQ-DAEMON-9]\n    pub fn attach_net(&self, host: NetHost) -> bool {\n        self.net.set(host).is_ok()\n    }\n\n    /// The broker-owned exactly-once anchor (for introspection / tests).\n    pub fn journal(&self) -> &Arc<EffectJournal> {\n        &self.journal\n    }\n\n    /// The broker-owned network host, if one is attached (at bind or via the\n    /// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.\n    pub fn net(&self) -> Option<&NetHost> {\n        self.net.get()\n    }\n\n    /// Accept connections forever, handling each on its own thread. The broker\n    /// is the long-lived process; this is its main loop. Per-connection\n    /// threading is half the KH 7.4 isolation stance: one brain's blocking\n    /// dispatch can never stall another's (the per-session half is\n    /// [`Broker::dispatch_spawn`]'s drain/waiter threads).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n        loop {\n            let conn = self.listener.accept()?;\n            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n            // throwaway connection that woke this accept — observe it and return so the\n            // serve thread (and, with it, the listener) tears down instead of leaking.\n            if self.stop.load(Ordering::Acquire) {\n                return Ok(());\n            }\n            let me = Arc::clone(self);\n            thread::spawn(move || {\n                let _ = me.handle_conn(conn);\n            });\n        }\n    }\n\n    /// Gracefully stop the [`serve`](Self::serve) accept loop: raise the latch, then\n    /// dial one throwaway connection so the blocked `accept()` wakes, observes the\n    /// latch, and returns (dropping the listener). Best-effort + idempotent — a second\n    /// call, or a call after the loop already exited, just fails the dial harmlessly.\n    /// Fills the honest gap that `serve` is otherwise unstoppable (the leaked-serve\n    /// load that starved the seed stop barrier — REQ-HAZARD-DAEMON-STOP-BARRIER).\n    // [impl->REQ-HAZARD-DAEMON-STOP-BARRIER]\n    pub fn stop(&self) {\n        self.stop.store(true, Ordering::Release);\n        let _ = LocalSocketTransport::connect(&self.name);\n    }\n\n    /// Accept exactly one connection and handle it on a spawned thread, returning\n    /// that thread's handle. The single-brain entry point the tests exercise.\n    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n        let conn = self.listener.accept()?;\n        let me = Arc::clone(self);\n        Ok(thread::spawn(move || {\n            let _ = me.handle_conn(conn);\n        }))\n    }\n\n    /// Number of currently hosted sessions (for tests / introspection).\n    pub fn session_count(&self) -> usize {\n        recover(&self.sessions).len()\n    }\n\n    /// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling\n    /// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-\n    /// wedged LOCAL controller (`by: None`) on hosted session `id` — a sink\n    /// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and\n    /// whose writer thread only drains its channel (it NEVER calls\n    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical","truncated":true,"truncatedBy":"lines","totalLines":3540,"totalBytes":3581,"outputLines":75,"outputBytes":3581,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    /// the boot-race self-heal path calls this once the background retry brings\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n    /// Idempotent by `OnceLock` — a second attach is a no-op returning `false`\n    /// (the first host wins); the hot read path (`net()`) never blocks on it.\n    // [impl->REQ-DAEMON-9]\n    pub fn attach_net(&self, host: NetHost) -> bool {\n        self.net.set(host).is_ok()\n    }\n\n    /// The broker-owned exactly-once anchor (for introspection / tests).\n    pub fn journal(&self) -> &Arc<EffectJournal> {\n        &self.journal\n    }\n\n    /// The broker-owned network host, if one is attached (at bind or via the\n    /// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.\n    pub fn net(&self) -> Option<&NetHost> {\n        self.net.get()\n    }\n\n    /// Accept connections forever, handling each on its own thread. The broker\n    /// is the long-lived process; this is its main loop. Per-connection\n    /// threading is half the KH 7.4 isolation stance: one brain's blocking\n    /// dispatch can never stall another's (the per-session half is\n    /// [`Broker::dispatch_spawn`]'s drain/waiter threads).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n        loop {\n            let conn = self.listener.accept()?;\n            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n            // throwaway connection that woke this accept — observe it and return so the\n            // serve thread (and, with it, the listener) tears down instead of leaking.\n            if self.stop.load(Ordering::Acquire) {\n                return Ok(());\n            }\n            let me = Arc::clone(self);\n            thread::spawn(move || {\n                let _ = me.handle_conn(conn);\n            });\n        }\n    }\n\n    /// Gracefully stop the [`serve`](Self::serve) accept loop: raise the latch, then\n    /// dial one throwaway connection so the blocked `accept()` wakes, observes the\n    /// latch, and returns (dropping the listener). Best-effort + idempotent — a second\n    /// call, or a call after the loop already exited, just fails the dial harmlessly.\n    /// Fills the honest gap that `serve` is otherwise unstoppable (the leaked-serve\n    /// load that starved the seed stop barrier — REQ-HAZARD-DAEMON-STOP-BARRIER).\n    // [impl->REQ-HAZARD-DAEMON-STOP-BARRIER]\n    pub fn stop(&self) {\n        self.stop.store(true, Ordering::Release);\n        let _ = LocalSocketTransport::connect(&self.name);\n    }\n\n    /// Accept exactly one connection and handle it on a spawned thread, returning\n    /// that thread's handle. The single-brain entry point the tests exercise.\n    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n        let conn = self.listener.accept()?;\n        let me = Arc::clone(self);\n        Ok(thread::spawn(move || {\n            let _ = me.handle_conn(conn);\n        }))\n    }\n\n    /// Number of currently hosted sessions (for tests / introspection).\n    pub fn session_count(&self) -> usize {\n        recover(&self.sessions).len()\n    }\n\n    /// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling\n    /// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-\n    /// wedged LOCAL controller (`by: None`) on hosted session `id` — a sink\n    /// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and\n    /// whose writer thread only drains its channel (it NEVER calls\n    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical","startLine":2759,"lineNumbers":[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,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":3581,"outputLines":75,"outputBytes":3581,"shownRange":{"start":2759,"end":2833},"nextOffset":2834}}},"isError":false,"timestamp":1784271816958}}
{"type":"message","id":"8a9dd905","parentId":"9b0c29ea","timestamp":"2026-07-17T07:03:43.594Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing Rust struct drop order and dependencies**"},{"type":"toolCall","id":"call_SYVSg5LhERV9oeX3quv6M7oa|fc_0fcf561150331aac016a59d3ceeddc8190a60185f6c55f9dea","name":"read","arguments":{"i":"Reading drain drop contract","path":"crates/spt-term/src/reader.rs","selector":"64-110"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9561,"output":139,"cacheRead":73216,"cacheWrite":0,"totalTokens":82916,"reasoningTokens":99,"cost":{"input":0.04780500000000001,"output":0.00417,"cacheRead":0.036608,"cacheWrite":0,"total":0.08858300000000001}},"stopReason":"toolUse","timestamp":1784271816997,"responseId":"resp_0fcf561150331aac016a59d3c9a2288190bd65e2062a520788","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3cb9068819085f039c64ea7499a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdPO4kdrwVe0kjvL1keWrlXkEKZUZ2fVtZl1pteVxvtHbSvxHk3hYx_AvrwFQiru7IfHolBgxHyCkNkfbdtLyiOXAtlwfP4q60WkNL3xHUHAQlZ_r0ZV_pepB23pdTDSBSEER1bLc3-tvZhZjt02u066XQKGI-MY3tIg0NmKCcacAvjNqh-B_NR1RH80NZmSuIlu9jE65hKWEwSRTrjssaH4qq5PzgcF624nlFJyBe91S4Lr1gzGkx4Jew2Rixgfc0ZysDx5urtti-Ytjtt0qyMIHnwTSxaTZ_kW-B0dqVDR9ES8NKw_YK2kQLhN1cwZKKJy6I3PWyaldjFZRgfFJxCHf5opZvR-BjE_9OjI4IIPFlJ5Uy4a-lr9f_J733-RkeTGmO8Nh8X8lRtfHG84COU5B55ZIkyRSmCgAQB_MDJb9AZxlH8nlkTEtu4bWscS9U8yK-rXTcWJiZxEeR7KCxosyeiYNZ_Z2QfCR7PthZtM5el8Kr2kJB0pDPC63w4pDZiMXQF8yVG3k7sjgZ1re_37EQXbzl-9wtsZNHEpteJPVqBEsGSNGJTgApPPaBjirOb0QDvxmDBt8iMizpAZQ6HwxhM4WLMOz1qRKfRTCAxruX7Jdg0UHTZIA9ppXynGu6pSHaUg9Uf_KaUsI0T0M_tam-bNC7Rd3wEdk3xIeOZpxwy6VUa3nzbB3XnzJKDootmTRZQrWsAjnhp7otYHJUVM94vhOjo9yTfA54s47NuJrlF6L-1TbT2bhchiR2fhQD2RndlLnTgBfs1Xu7_dm_-YdM7smxezAfuoI0O7j8_W1fSHBnNIouBN8En15daSRSnF9O2hOTRFlwC9ycJmEcB-Xth9NHZk4xvfFApj04EVhAMaFA0XIVZySuRaHXaDYvYpHdNnc3JpHq2XULNIz44yFQc5dTi5hDYTkSJjOQLaTz_DxUFW9KwC0kmqylhNjfyI1i4w6i0Re4-sfhUWZ3liTaLTkQA1F8DGVbKQ9xg2_udue0xnE74q-rX-waff3eqjocp_f1B1sjXowANeZqzJxNe6tXYx1VIg57xLS86jha2-pTxDuxtYHH2IVozjXl9mu1REn7hF-iuZxGu69Bj6KmpgE3i-BDKHYqy4n1KXmHknr17sI2DI1aKTk3uFvuuPARYsxCUrie1njzcC18RscQMHE4JojiLcAuKe4CZD1_8KibOJ4kcXZHxNTmvouskSWFqdmuZEIR407v-RTxmVM9BzebucdPXDb1PlcKG49fBlB_h-_HuKJBRWlXGyPmjiSaDk0nvbCfos0-p9uenoVATcjD7v80AP0LdHFb-N1KoLt6_vxZargNv6NJ6Gxi3a4Qj4t75NpNjp0Lp4bV0TLZLNJfzxA0MB0Hz69PeA0D6hVk4HSxOoqugI-fiB-NUHwjNFX3HFSEM1u4QtDZ71jhIeJn2mqEwWX91_iTaJIpWsl1z7JcSpRSXIKRJ50_bvvTI9dbewZP0j-A2FpBiqIQ==","summary":[{"type":"summary_text","text":"**Analyzing Rust struct drop order and dependencies**"}]},{"id":"fc_0fcf561150331aac016a59d3ceeddc8190a60185f6c55f9dea","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading drain drop contract\",\"path\":\"crates/spt-term/src/reader.rs\",\"selector\":\"64-110\"}","call_id":"call_SYVSg5LhERV9oeX3quv6M7oa","name":"read"}]},"duration":6597.37199999392,"ttft":2580.935900002718,"contextSnapshot":{"promptTokens":82777,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_SYVSg5LhERV9oeX3quv6M7oa|fc_0fcf561150331aac016a59d3ceeddc8190a60185f6c55f9dea","toolName":"read","startedAt":"2026-07-17T07:03:43.595Z","args":{"path":"crates/spt-term/src/reader.rs"},"intent":"Reading drain drop contract"},"id":"7ccc6422","parentId":"8a9dd905","timestamp":"2026-07-17T07:03:43.595Z"}
{"type":"message","id":"aa1df8d0","parentId":"7ccc6422","timestamp":"2026-07-17T07:03:43.599Z","message":{"role":"toolResult","toolCallId":"call_SYVSg5LhERV9oeX3quv6M7oa|fc_0fcf561150331aac016a59d3ceeddc8190a60185f6c55f9dea","toolName":"read","content":[{"type":"text","text":"impl DsrMatcher {\n…\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\n…\n    }\n}\n\n/// A running drain pump over a surface's output. Holds live counters and a\n/// cooperative stop flag; see the module docs for the teardown contract.\npub struct Drain {\n    stop: Arc<AtomicBool>,\n    dsr_answered: Arc<AtomicU64>,\n    bytes: Arc<AtomicU64>,\n    handle: Option<thread::JoinHandle<()>>,\n}\n\nimpl Drain {\n    /// Total DSR queries answered so far (live).\n    pub fn dsr_answered(&self) -> u64 {\n        self.dsr_answered.load(Ordering::Relaxed)\n    }\n\n    /// Total bytes forwarded to the sink so far (live).\n    pub fn bytes_forwarded(&self) -> u64 {\n        self.bytes.load(Ordering::Relaxed)\n    }\n\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\n    /// **not** interrupt a read already blocked (that requires tearing the child\n    /// down — the no-EOF-while-writer-held discipline).\n    pub fn request_stop(&self) {\n        self.stop.store(true, Ordering::Relaxed);\n    }\n\n    /// Join the pump thread. Only returns once the underlying `read()` has\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\n    /// on ConPTY that means the child must be torn down first. Best-effort.\n    pub fn join(mut self) {\n        if let Some(h) = self.handle.take() {\n            let _ = h.join();\n        }\n    }\n}\n\nimpl Drain {\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\n    /// bounded channel applies backpressure).\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\n    where\n        R: Read + Send + 'static,\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let stop = Arc::new(AtomicBool::new(false));\n        let dsr_answered = Arc::new(AtomicU64::new(0));\n…\n    }\n}\n\n[Showing lines 63-113 of 287. Use :114 to continue]"}],"details":{"truncation":{"content":"    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r","truncated":true,"truncatedBy":"lines","totalLines":225,"totalBytes":1834,"outputLines":51,"outputBytes":1834,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl DsrMatcher {\n…\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\n…\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n…\n    }\n}","startLine":46,"lineNumbers":[46,null,48,null,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,null,159,160]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\reader.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":287,"totalBytes":1834,"outputLines":51,"outputBytes":1834,"shownRange":{"start":63,"end":113},"nextOffset":114}}},"isError":false,"timestamp":1784271823598}}
{"type":"message","id":"cddf15c2","parentId":"aa1df8d0","timestamp":"2026-07-17T07:03:53.599Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Tracing Drain drop and EOF handling**\n\n**Identifying EOF blockage due to writer clone**"},{"type":"toolCall","id":"call_omY2QBqrJvcx6iplN2SjdC7S|fc_0fcf561150331aac016a59d3d8e6148190b1c7cbd1d1a7a18e","name":"read","arguments":{"i":"Reading reader teardown invariant","path":"crates/spt-term/src/reader.rs","selector":"1-65"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":5100,"output":213,"cacheRead":78336,"cacheWrite":0,"totalTokens":83649,"reasoningTokens":173,"cost":{"input":0.025500000000000002,"output":0.00639,"cacheRead":0.039168,"cacheWrite":0,"total":0.07105800000000001}},"stopReason":"toolUse","timestamp":1784271823653,"responseId":"resp_0fcf561150331aac016a59d3cfdddc8190a16dff1c75fb200b","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3d315dc8190b88692133f7b6783","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdPYiA_k3nbznBjKUhKNl8WJPs-C0GsXJN60OEHJG5hVhNcXwfQZaLmGvxArxUe1ZkiQVfQU5Jeoh0ejgWwstHzQwfXXZgTlvakHXW-WG2ozGenh5jP8GBu8bfzKVEoiIki97Ni8Lb7dTZZ-aIPYD77NtJ1zUeSOauMye-oKF7y3iOKxh6kyH3B5xNpkoHTQvH8PqwXiYtCrBV6VTtDRQecofRsEiNOnBE_wuF4luvaKt6_wlKAR0wk9-KK8P7AwOtttTj2ecgdX8tCBhcryZgXhIF2rhpVA9yl_D5lEgqPDH7fOUgbzCwmTkEahuBhCKS41UvOQBS4Kh-4ZAejRl59HRdvBQSMNar-hUiGz2UWUkn0kM5qwSwkkE3adUFWdKVsQvVVr4iaIALLcua3-GadTJ2nJcHatLLdY8cYPsprHWDiIs1uyUTNUy7YxULJcUq2mr3ALjF92SXk17W_2TH6iuy35bD59whmAN7mimOz4caRs1BaxQccAsRCXZgwUdB7mXhd-_PnJsEO_MTaKLTv5IQt5399sLWHpNP-4tWnzOl6yaCWVjDmYmF93IxOIKHqDHvUyWV2dNSdwZljefirXvuouUJ8t_-XjR4Ax9NGM82k_CpL2oXY6c77k-B9nu5DFGdurST7eNY-Fxe4i303MVWbO4yCyVq84lmiunkFhFD873OYue8TASjzTeiYDLZL4fhB5GwuGlIVxcUldlWB4rS3eC0j6RAj3yoUH04lqzIcXhEMYeJqMb4cKPkKH84VC56Tw0KrwabRJw-cZQgFZ_Kd_sKsCRLl2zLL8KdkREtz2ajmfkc0MGHuwICvsEsLWFPYBUQ73EO1LUq23UCCSa9oGI-neON_sMu8zF0b_mVr30beqiEDASqu2PtNSLSfHcm2O91KsGoDasbgWdsWaWaLTxREvmUY53MhhJ5Lmr4IoZFyamICdQidQHNqdTIrjgS0OZIeUT_tgWqjg8EChSHz9JQUxsNFd4Qhyfd-nExCwZHSyfjke8XTBfJsMCteWvmd4KAmgaqjk-0xJWISKbHxbvFUv36mqemJ-8OqxmaTzhgFmh-kM9nrKpnC7zsmi6Cc08nJYOgDCh-byLbnfdA65rVdIZx3RKdMJIi8cniYUiK1CEZ0ChZ39G32dGUsGu0ZA1nEvA35kbhrzqbojfy38lCpfPCoimNS2ELC8KBIBrjogST994xSYMgV2GvL5DtZazrcNqivxG5iNwjaqMfTkfY68DQN2kI7iD24hAr3sDtJoVoGmQKVdsBwIwouOrYQte6S_Inr0WkRI-JhG1hco30ojTnLcgeCDw7OP4hbKUcDcYm8pDsglgTzTj_DYJeTVqtmd1oxKyK_1-ywVLLRau738mvI5Frp1cyRQ_XG62lt2A6YFMFDnYXANIYP769tT56JpZTO_0gRWbHTmiju6wquziP8pVLiAc-18Mw__ZNe7Oic5LRdCrIBJdplPe4k7oE5--3xuDaWQ2MKH46P6WNqHPw0boWwJGwqRZVofmEx44e6U7yBapWjeVaQDE8tSNdDnGY_occlYxQL-NlDA6ayWrPGal2D1Otb-H3336hLHUQl29PBxE7gjM79-1A0PMziftjRxr8aW1rO3Gv084PX174ypywQaUyHvJDgpZDWvAlww8sb4AiCWS3wFX6ZTqVTU--1riaQwVCiuqsdBrOqjC1UFp_JRwmV5eRVYwK0bixjboGFwM8EF-jKzhhvODw_HxPzE9I7TYImReQM29W5YUynNzCEH-8iKsLQrRFKdNb6SdKTZFNcyt732eu4wcNDqcl64TdWAGLP6S50FUKxaK6d8fq3Hs4lL70Ww4rVAdOxEfxIE0ck5oUhHU01ogiYw9ElpS-Tt_h2AF2j1NVU8zwmn0ZG0rLLn6hL2hzVTK8Ls2oV5fUIDfpOYtldxzquhM9xo9CdKuqG74PToGKPXDCs9wCwP-5tYMwFK6-D-CPtV_APRaRXUbFi2EK11yBuP1FHOTr_8z2KgrVtdH18SkOWA4ZbYV-nE10w=","summary":[{"type":"summary_text","text":"**Tracing Drain drop and EOF handling**"},{"type":"summary_text","text":"**Identifying EOF blockage due to writer clone**"}]},{"id":"fc_0fcf561150331aac016a59d3d8e6148190b1c7cbd1d1a7a18e","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading reader teardown invariant\",\"path\":\"crates/spt-term/src/reader.rs\",\"selector\":\"1-65\"}","call_id":"call_omY2QBqrJvcx6iplN2SjdC7S","name":"read"}]},"duration":9945.284299999475,"ttft":3444.4071999937296,"contextSnapshot":{"promptTokens":83436,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_omY2QBqrJvcx6iplN2SjdC7S|fc_0fcf561150331aac016a59d3d8e6148190b1c7cbd1d1a7a18e","toolName":"read","startedAt":"2026-07-17T07:03:53.599Z","args":{"path":"crates/spt-term/src/reader.rs"},"intent":"Reading reader teardown invariant"},"id":"133cc1b2","parentId":"cddf15c2","timestamp":"2026-07-17T07:03:53.599Z"}
{"type":"message","id":"846a8673","parentId":"133cc1b2","timestamp":"2026-07-17T07:03:53.605Z","message":{"role":"toolResult","toolCallId":"call_omY2QBqrJvcx6iplN2SjdC7S|fc_0fcf561150331aac016a59d3d8e6148190b1c7cbd1d1a7a18e","toolName":"read","content":[{"type":"text","text":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\n//!\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\n//! never emit it for short commands; an app that queries DSR itself always\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\n//! that does withhold. The auto-answer is verified deterministically by injecting\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\n//!\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\n//! does *not* EOF while the writer is held, so the read loop runs on its own\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\n//! broker stops a surface by terminating the child (which tears the PTY down and\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\n\nuse std::io::{Read, Write};\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\nuse std::sync::Arc;\nuse std::thread;\n\nuse crate::pty::{PtySession, SharedWriter};\nuse crate::surface::SurfaceError;\n\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\n\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\n#[derive(Default)]\nstruct DsrMatcher {\n    matched: usize,\n}\n\nimpl DsrMatcher {\n    /// Feed a chunk; return how many complete DSR queries it completed.\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\n        let mut hits = 0;\n        for &b in chunk {\n            if b == DSR_QUERY[self.matched] {\n                self.matched += 1;\n                if self.matched == DSR_QUERY.len() {\n                    hits += 1;\n                    self.matched = 0;\n                }\n            } else {\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\n                self.matched = usize::from(b == DSR_QUERY[0]);\n            }\n        }\n        hits\n    }\n}\n\n/// A running drain pump over a surface's output. Holds live counters and a\n/// cooperative stop flag; see the module docs for the teardown contract.\npub struct Drain {\n…\n}\n\n[Showing lines 1-68 of 287. Use :69 to continue]"}],"details":{"truncation":{"content":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\r\n//!\r\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\r\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\r\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\r\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\r\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\r\n//! never emit it for short commands; an app that queries DSR itself always\r\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\r\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\r\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\r\n//! that does withhold. The auto-answer is verified deterministically by injecting\r\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\r\n//!\r\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\r\n//! does *not* EOF while the writer is held, so the read loop runs on its own\r\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\r\n//! broker stops a surface by terminating the child (which tears the PTY down and\r\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\r\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\r\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\r\n\r\nuse std::io::{Read, Write};\r\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\r\nuse std::sync::Arc;\r\nuse std::thread;\r\n\r\nuse crate::pty::{PtySession, SharedWriter};\r\nuse crate::surface::SurfaceError;\r\n\r\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\r\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\r\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\r\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\r\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\r\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\r\n\r\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\r\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\r\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\r\n#[derive(Default)]\r\nstruct DsrMatcher {\r\n    matched: usize,\r\n}\r\n\r\nimpl DsrMatcher {\r\n    /// Feed a chunk; return how many complete DSR queries it completed.\r\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\r\n        let mut hits = 0;\r\n        for &b in chunk {\r\n            if b == DSR_QUERY[self.matched] {\r\n                self.matched += 1;\r\n                if self.matched == DSR_QUERY.len() {\r\n                    hits += 1;\r\n                    self.matched = 0;\r\n                }\r\n            } else {\r\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\r\n                self.matched = usize::from(b == DSR_QUERY[0]);\r\n            }\r\n        }\r\n        hits\r\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r","truncated":true,"truncatedBy":"lines","totalLines":287,"totalBytes":3288,"outputLines":68,"outputBytes":3288,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\r\n//!\r\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\r\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\r\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\r\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\r\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\r\n//! never emit it for short commands; an app that queries DSR itself always\r\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\r\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\r\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\r\n//! that does withhold. The auto-answer is verified deterministically by injecting\r\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\r\n//!\r\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\r\n//! does *not* EOF while the writer is held, so the read loop runs on its own\r\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\r\n//! broker stops a surface by terminating the child (which tears the PTY down and\r\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\r\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\r\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\r\n\r\nuse std::io::{Read, Write};\r\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\r\nuse std::sync::Arc;\r\nuse std::thread;\r\n\r\nuse crate::pty::{PtySession, SharedWriter};\r\nuse crate::surface::SurfaceError;\r\n\r\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\r\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\r\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\r\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\r\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\r\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\r\n\r\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\r\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\r\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\r\n#[derive(Default)]\r\nstruct DsrMatcher {\r\n    matched: usize,\r\n}\r\n\r\nimpl DsrMatcher {\r\n    /// Feed a chunk; return how many complete DSR queries it completed.\r\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\r\n        let mut hits = 0;\r\n        for &b in chunk {\r\n            if b == DSR_QUERY[self.matched] {\r\n                self.matched += 1;\r\n                if self.matched == DSR_QUERY.len() {\r\n                    hits += 1;\r\n                    self.matched = 0;\r\n                }\r\n            } else {\r\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\r\n                self.matched = usize::from(b == DSR_QUERY[0]);\r\n            }\r\n        }\r\n        hits\r\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\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,null,73]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\reader.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":287,"totalBytes":3288,"outputLines":68,"outputBytes":3288,"shownRange":{"start":1,"end":68},"nextOffset":69}}},"isError":false,"timestamp":1784271833605}}
{"type":"message","id":"e0cdcf14","parentId":"846a8673","timestamp":"2026-07-17T07:04:14.504Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing BrokerConn Arc cycle for leak**\n\n**Identifying unbounded connection growth and subscription leaks**\n\n**Tracing dispatcher retention of finished registry rows**"},{"type":"thinking","thinking":"**Tracing registry stream lifecycle**"},{"type":"toolCall","id":"call_7znGaqdfdiAxEJUunbgzUu6M|fc_0fcf561150331aac016a59d3edda10819085145e2b4880acb8","name":"read","arguments":{"i":"Reading dispatch claims loop","path":"crates/spt-daemon/src/dispatch.rs","selector":"470-620"}},{"type":"toolCall","id":"call_1dGwvP4VL6UO6wjL4UHOyt7f|fc_0fcf561150331aac016a59d3edda2481909ca1cb0f73bb22b5","name":"read","arguments":{"i":"Reading dispatch worker end","path":"crates/spt-daemon/src/dispatch.rs","selector":"730-850,960-1055"}},{"type":"toolCall","id":"call_oRIUaqDtxp5NFvrbrgXGkyvl|fc_0fcf561150331aac016a59d3edda2c81909a00219311f44b09","name":"grep","arguments":{"i":"Finding stream retire calls","pattern":"net_stream_retire|retire_stream|KIND_NET_STREAM_RETIRE|retire\\(","path":"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/attach.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_Cg0EQcPX0KNRcPBMi1BzDppj|fc_0fcf561150331aac016a59d3edda348190bbbc29ba355addfa","name":"read","arguments":{"i":"Reading stream terminal classification","path":"crates/spt-daemon/src/dispatch.rs","selector":"330-375"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":5135,"output":791,"cacheRead":79360,"cacheWrite":0,"totalTokens":85286,"reasoningTokens":570,"cost":{"input":0.025675000000000003,"output":0.02373,"cacheRead":0.03968,"cacheWrite":0,"total":0.089085}},"stopReason":"toolUse","timestamp":1784271833646,"responseId":"resp_0fcf561150331aac016a59d3da24848190bba7c0102dedc5c2","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3dbb6108190b6598e4c279e44c0","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdPqKgTyPXnOURy6L3BZT5DT9DNdyRg4bhGIOEEUqeb3kN3vicb5zxCVNaWWbmcQf7zIwZ4nIKGDAiWsvchNiv6dniMFSe4JbhWeMCh5KL7oZSCZWiaxudL4f844Rq2kcLxQwMOHi02ImZyoRjMMg_qRdt0arYlKJwLxHxYw0Fq2Kpw5i1Xf5X0u7p3Evxl_EELfyjUGsJdRfbMRjjODChniOZsq3KHGSZlqMo1F-hSe3BRFyhA42iapQDR-CbHHIGeyCBeWhY9CYsnNjjF0WjhP_5N0Qx9nSCd-7kIV69E3O8v_35GhwqaXoU1Bed8J71601_3zK22uhK6W6wLGmTfdgFhKBTZ3KOmI0t9or5bvzHUsvvupmuizXI1rNW5kJg6gouu8_4siNUm6rh0yZKErLyLjmayyd12HiHaMluhZykF2W59-ww_ycBewFtGuWo95B3xFzormdeXiFfnq00razIInC9sQ0KBJd4QVVzfdW8W1xZiTjnvQgR4prxOYE7W-zvfYLKVrbw3MidFrGmLRz-mGrBR4h1mObS5DCehqKrUj3EJlo1hCft9WtSy8wWyTkUJKTKewhtdAqUrqDsOaJcAt7OE8ftN8UqwJUsK-65seJ4TMq_NGmj8MFOrFyQGK1Z6lm3l8tb0NQX9XBZ1NjLBzIKaXNHe9GNix37wE8OWGYnT7v9GEJfPFuIj08H3cemeF9Z-x6t1V0QNsiiw7q_wM1WYkvIZe5ACckLOTyT7btNq8sxfhuNAKG1rguXvcqINBdDzTqCBtwA08XlGxIvwod1xvjuRkM0F6EQQqr-SmwJz3i-2A14mO8nC7C33mDTxMKTzxKqRSMBSW5Y17F8ODcgC6KGSoLfu8yGfg9dyE5sDRKKjQT8IPWqwNR2w69VVxXsAkZLk2nBGaM4Inb-3kFOSjjc7A2luC0VD8roCBY2HlOVfaqd96wGsYGevJ0X1r-UZxYET77eBOMSXrH6hbE7pOYs-OyOD67oHGrb_8PUa_ITKo2-uoq9PP5NHKNOEFZkiiZy04IIeNDR7eEBPy4GLpuwgFkOluMR342wsXjq_1ty3SST441v_hJf8z3X9qqpYNWSkGQmREeF_dFkx-_WJLVJfDQFKCXYmwiNkd8EJ-r1dtKBDf4VO2Iafm6F_EkxcJhmTIsk3RGYsQgVL5d1CJwUVFph2xcF4uaDvptghgx804q62AFIvQQhmKZ8YmiocbsJGKTjKyGyuBufZcq64udafupwNdHeqQ8bBTVM3CeSEDv5bP856U_JeNJRn7coSyUpJXExJpCWp8Qm-V7gScPZAOdyryazqsxUl5QD8UnuLQRDvEfjMSkZwgThsjgv4ZpNcX5j7KMRYGP80l_Q1OMUuqyzGjR6yyqFqeqeBep-kwL92f4YhvtwVo4uRnpWoQEMOfQGN9liP4Xh_iJn2IOggsKMCMf5awdgsqU6773HOVpCHbXAcx-2RTfkIkEOzguz_Ktuntiu559ZGv33dHYldxyWg0OK_C1HYAtnFk-l-fdaUmZtGedPC0PtpCwMsBp4ZL8aS8nbyvyYVQ1dTIIGUexCPkzJTjmiOxd4iz9uIhAxaXZp54ahAZk1Ga0X6K0g7mIO-bvO2gV7pIpkUGyT6hNpYsRIYy8oiBVO6rLnTvumTejO-xUFKhlheN0sCwf9xSGpIgqvRBmeqT1e5WPPFAl7ou7UDnIEoMsh71qjPbMkIdcIV22RR_HIcRV9drrXRBAblVunQPi4NYiFIohngQI_mn6x0mudsOJH2mTf5PvNFb2a6k8MPaP998Z0r7o2_gDu3GhpswShtII9xw8rnGlh3RTzXvO_JsnXiRcAjQ2-OlYp4ArHEPcTi36oEKUJ4KdIliKee64xX_lxt8AKlSDDe9Dq32g41tMI95-8wmYxetKyRvxM7j5LJHRzHacOmvw8NQZxyAzEijiFHc7RyCOxBgvelcO2iW7CpD8q-yx_xb19ZN3Gb5O1Lvl25UlP0dcagbLw4Pw63EwByOHR-xnDeSpEw5rPflI5H-Sdee-uH1_1Je32s8tgopJkbg1AvUqKtd3J9O9wN0paEeHcqUr-vQaBHqQDPPzDkGgW0Sh62zdWPj7gmu2pXUQv4yKJxY-BiY7-gzYmvPiWPifx0JCKmfHZkkuoDZYF7TompLyvZJOjavqCIHcwo7_mW3R8g1x9pNjkAs21EcN-roYE_59YSf38MWrbpnlonwCxc26W8H-tEWgExU0JyOhJdRgnbq-8vFvnZb4-pCKGNP37-LcSka4n-px4uUk0M7YLN0bcOjxdRpiVslwoWdrJa7nXL3KLPSEd08aKQqUqSKXAbtHxrHxoOJqsAs0y0cs-HzPK9zHwQxmFE5bI-xFsnQz075HDAKUuDwh6lNw1dpOPq5LpelMW-hDPrf5ZkIkNs5XaVM3zWGWwg_ytGYYX0v0tQt75bHScqxajolW2hQH2-3MoUcMKQhovZ6fREDxJEYaW_DX2C00rSbd3QhdXYSw6dbnRd4DBTw0P5dlFZGc3We5tQP5CWkMstOu5oSKspBXG6r2lKZlhqPaN8aO8LlViZz6QDO3Ifyx_ERLM_n4RHSuT-IqQ6g5SW23bY2pu2bV-Ac244rT9YjbvTMNkc3TwaBDN37397NgP_5TznL2Sf8CUlKY_n9v8boYJrt3UBCqKZQxMpBACTOYAlSdoDPeVIh3L0j5xiC8zvXPzyd4qoT3BECMGsbXJGQg3WZzUbUj-Hc8fbXqstQIQ-Pwpxol18u7DRMaH1iUHs9ZozSP-cAnx7r2DdcfejcswofmGSd34ovmyySX_tkU9mgNW-il09Y8mBsIDMCDAFt0fDkc6UAdTHJswFJHOeqxt62X8mL_xQPF5_u7rpLPr48mJ7pIrxfF6Moi5-vtisXNe2Q0_aOol58A_nxrfpUf4zhxAfPiihFQV0QE1rUbugpiYeTzbXPuXM1zMqWxfb42iefQC5XRTvi0IgyI9IBrt7ZYABvxlfRe2-ifc4-VJAb3MyRKZ8hIR5dNiIXaqqp57Q4vCyBd16KyaDFBePWMQfMylvdI189_7rBqk8TAJWWb3UBFKZxaGSXudqkpsnzwDfn-MemqhmA3zZEk16h78YQVU_NEAI2CIWdxWaD3yhH0kzemBlYHgz2S6IOASqW7ImRsmB7vcQQF_J7mqvUhx7Fp2Wlxyq6GwI1HHBn9YB3NlM_625ljCUO3VDqR9ku2y7ncQcuuP16j6H3u1puiHHjxh6kaQhJZlg07NLeL0BrApIjZ4ZnkMW5z0sNTYjhGlaavB2axGDEhH5tvV1iqzlW_2Ho6qJ2LybBqxmarcxR2wHQ_hRB9ZMIEJhF8QiTBGaL2xIupWlWILMXyV9uSPAdWlR3ARQjNWUOpcfb1AdPrD-DnLbS7aIJmSkEZL1nSSTZunL8Fw9kK_iuV55Cnop-cMB41DheejNS0ZzeSM4Pk1dXklfS4FmCBT7AvsTqm0RhcDGwgi1vIhDJKTwWp2LTMkcD9Ic_HBkQ8xAI6W4_kL43FBLrUOZZrcIgTMbrf7IbX0MayYThl0lbdt3baCRUlvcsv9w0pFtQpWxU4Q3egcJhykWffNkF6xQzz7lMhr_0CCKachzuMg4Cc-JwCTIHka8TT_LpgBrs9-GgNrpGXIAno4EOetRX9aWZmwfh6IbjCtdddxNGLTUFXoUMwrPF95At2wBEd-Mzwe7ANNSoQw-8f6jwhJZ-p5k63cD-AxjlcvHBJCFk6FIN9z0YSI0MRtyWtKQmHlJ_7QJC_pVsZvWtFbh2oIYUcijqDYZbouv89Tgbc0XVXc5gMgDtfrh_vax8SyajGWkn2eLovCkH66fm-R7HIRuI_VfUWNBJbKNF9fLqRe1e9_Cfi_FImOFCF01lJzpLJTzHFaKi5xj6qpEiWRtqbl-PkxMjStYX0CyQWFIak3Ofq3JEOTfKLpIiY23jiqxJU7qjqJNVVrhtwN3Tdb61ARDgIh5VBMv5I-w0Qh3OD7PMvmFLfQPxjzaIjxj2xCHwEX7GPrA-XZHts9UDqY3n7qMOWsmIVUptRXz4VMnEMF66GtfuiY-01ucx7-xfYR0N_vANffrr7mn48TSu9UyvUifVVsvXDbZlvWMPkzVDeb7K_l3aOcKmADBpfo0smRcJbc4ImNkbSEsrejVtGGYvT1iRUh8fnWjiIgb3i6VYQDkQGIGw1LEwRoPq6yekWPFWfhi4wP5yfVcGtWkiplj260hxbuuR22LgAamgiNz2XQ_GO1c0zdgttmuGlAsytIiudwy0SuPyYvrMlURB0_JM-iW-L7f0yvxIY1DdrTDS26FKkwH_g8Y7Bghlhe29AiUVujsbekN3Pr_mfjedVZNRykXqjW6WyprO69jZClYfUP3d7LT3C10=","summary":[{"type":"summary_text","text":"**Analyzing BrokerConn Arc cycle for leak**"},{"type":"summary_text","text":"**Identifying unbounded connection growth and subscription leaks**"},{"type":"summary_text","text":"**Tracing dispatcher retention of finished registry rows**"}]},{"id":"rs_0fcf561150331aac016a59d3eaae0081909055a9e208011c7d","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdPt2B6mkzDbPrER4NbTp1AoPwvVXOSUM3c1UGoSZVf7PaHLR6kjS5EdqG1JvRZ6LHiihUrQuXCNBC9WGp77KMf6-Jd814GNasQzuAtTOvqqdIh1ELJ7ijJo2M3BAPLR04-UkHESb5_fu-3bNFkeNHcBAJWFyrK1bDzmE5OLb5IMAG_DjuroaGp198cD-R1Xnf79GxRfwBjJe8ggHXNA3hMdAQpNakcJNcOqg_fQfFDv3tuDUZPhHFTEzI7Oie_ZOnJsBdeUgUR3--DpAKxU921ouhHPKJJjB2t1PCHB0g1LTYwCGwThZ2bBKU__D51aM-vRbKM6LHBLEhi3qcrngIMWNoHg4xtw-eK0pfKkVqw343KREwC_b8r919nPXUTXttT_3z-bj_ZOwQhV1aiXA09tAAHclYEBt6MInblC8zBco_JPn5eNU5GOl4r0XS8pJmN-_quIC-piFlyW4y7xxBREfwuW2MWQkIaPOwY5I88NU6S6K2mv6tJg0sYz5D7yZqFsWrXjMAYih-pqNUNGAtnVzAOEJTKtAp8sxs8BuDOCws9kwWC_37RgfPMFyEVtVe3sqLlCM--XAoUrvVVM2uNFM_URyFnv90QLfqOHnIzdCUl9-NN3WPlnw_wuncikpgYVnANj6YAMW5nRbq3u8Ufs-0XBci-9wjjp6bDukUygfxzbLcHFK0NZL_Lxk_uHB5f1LwpuGcDPDN-Vm8oT-HLFSJRuU3AZwepBcN538Wn6LL60MixddjKaA530270bOClxY37EsByrAvOuOeCfkyMyQFcdgXIkwDRnwYiVWLwqMeBqF7f7YWwsnvg1Ax215p9Qj0crPROZZ2-s7IHfviVA3eeWdfiffkr34IDsTpgEeSm27gUYX9vt7ijxO3pR8a8gtflkyLhVFsVLATtOMYAGUOKJOYb9DrNLatD47FSMJiGlwJ0DDdK4q1LzJ2snHc1cosIyxXZod8gkfNH4T-XJe0iJIrYInTPyB1zeeZl0TcWofAVkkpZFjky5OHECw-rJY3gkY3Ub9zxpKKWVYhO-pZFr8xHH5gzr9QAuVTczfy2hy5gvOIaFo75Aw0iWEcaIqFDSLMEq_57bnCkHBN-0OdpGFLDs3NmcL9qpTyTuX3OVbNmsVEU2PKztMZ5hAoc79D3ByD9vc3g6tbL_6knEpw_ueBtxGQXP404fcQ2dW_YRSRMRtd8-XkKWYU0hdppwsVu1EBsWFEAebB62mHuLfQ==","summary":[{"type":"summary_text","text":"**Tracing registry stream lifecycle**"}]},{"id":"fc_0fcf561150331aac016a59d3edda10819085145e2b4880acb8","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatch claims loop\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"470-620\"}","call_id":"call_7znGaqdfdiAxEJUunbgzUu6M","name":"read"},{"id":"fc_0fcf561150331aac016a59d3edda2481909ca1cb0f73bb22b5","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatch worker end\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"730-850,960-1055\"}","call_id":"call_1dGwvP4VL6UO6wjL4UHOyt7f","name":"read"},{"id":"fc_0fcf561150331aac016a59d3edda2c81909a00219311f44b09","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding stream retire calls\",\"pattern\":\"net_stream_retire|retire_stream|KIND_NET_STREAM_RETIRE|retire\\\\(\",\"path\":\"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/attach.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_oRIUaqDtxp5NFvrbrgXGkyvl","name":"grep"},{"id":"fc_0fcf561150331aac016a59d3edda348190bbbc29ba355addfa","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream terminal classification\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"330-375\"}","call_id":"call_Cg0EQcPX0KNRcPBMi1BzDppj","name":"read"}]},"duration":20855.01139999926,"ttft":2099.282800003886,"contextSnapshot":{"promptTokens":84495,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_7znGaqdfdiAxEJUunbgzUu6M|fc_0fcf561150331aac016a59d3edda10819085145e2b4880acb8","toolName":"read","startedAt":"2026-07-17T07:04:14.504Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatch claims loop"},"id":"1d7fa602","parentId":"e0cdcf14","timestamp":"2026-07-17T07:04:14.504Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_1dGwvP4VL6UO6wjL4UHOyt7f|fc_0fcf561150331aac016a59d3edda2481909ca1cb0f73bb22b5","toolName":"read","startedAt":"2026-07-17T07:04:14.504Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatch worker end"},"id":"0412681f","parentId":"1d7fa602","timestamp":"2026-07-17T07:04:14.504Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_oRIUaqDtxp5NFvrbrgXGkyvl|fc_0fcf561150331aac016a59d3edda2c81909a00219311f44b09","toolName":"grep","startedAt":"2026-07-17T07:04:14.504Z","args":{"path":"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/attach.rs"},"intent":"Finding stream retire calls"},"id":"3691e6a2","parentId":"0412681f","timestamp":"2026-07-17T07:04:14.504Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Cg0EQcPX0KNRcPBMi1BzDppj|fc_0fcf561150331aac016a59d3edda348190bbbc29ba355addfa","toolName":"read","startedAt":"2026-07-17T07:04:14.504Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading stream terminal classification"},"id":"234e313b","parentId":"3691e6a2","timestamp":"2026-07-17T07:04:14.504Z"}
{"type":"message","id":"6b78902d","parentId":"234e313b","timestamp":"2026-07-17T07:04:14.520Z","message":{"role":"toolResult","toolCallId":"call_1dGwvP4VL6UO6wjL4UHOyt7f|fc_0fcf561150331aac016a59d3edda2481909ca1cb0f73bb22b5","toolName":"read","content":[{"type":"text","text":"fn 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    // 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            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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…\n        }\n…\n        StreamFamily::ServeProbe => {\n…\n        }\n        StreamFamily::Unknown => DispatchOutcome::Unknown,\n    };\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 merged = 0usize;\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                let records = decoder.push(&bytes);\n                if records.is_empty() {\n                    continue;\n                }\n                // Split the feed into instance rows and node-level labels\n                // (REQ-SUBNET-3) — each goes through its own gated apply path.\n                let mut updates: Vec<RegistryUpdate> = Vec::new();\n                let mut labels: Vec<NodeLabelUpdate> = Vec::new();\n                for rec in records {\n                    match rec {\n                        RegistryFeedRecord::Instance(u) => updates.push(u),\n                        RegistryFeedRecord::NodeLabel(n) => labels.push(n),\n                    }\n                }\n                if !labels.is_empty() {\n                    merged += registry.apply_node_labels(origin, &labels, &policy).len();\n                }\n                if updates.is_empty() {\n                    continue;\n                }\n                let (verdicts, flips) = registry.apply_feed_flips(origin, &updates, &policy);\n                merged += verdicts.len();\n                // Attention shift (D9-2): only ids this node actually hosts\n                // (a perch with a record); everything else is a no-op here.\n                // [impl->REQ-INST-3]\n                for id in flips {\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                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\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/// 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"}],"details":{"displayContent":{"text":"fn 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    // 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            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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…\n        }\n…\n        StreamFamily::ServeProbe => {\n…\n        }\n        StreamFamily::Unknown => DispatchOutcome::Unknown,\n    };\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 merged = 0usize;\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                let records = decoder.push(&bytes);\n                if records.is_empty() {\n                    continue;\n                }\n                // Split the feed into instance rows and node-level labels\n                // (REQ-SUBNET-3) — each goes through its own gated apply path.\n                let mut updates: Vec<RegistryUpdate> = Vec::new();\n                let mut labels: Vec<NodeLabelUpdate> = Vec::new();\n                for rec in records {\n                    match rec {\n                        RegistryFeedRecord::Instance(u) => updates.push(u),\n                        RegistryFeedRecord::NodeLabel(n) => labels.push(n),\n                    }\n                }\n                if !labels.is_empty() {\n                    merged += registry.apply_node_labels(origin, &labels, &policy).len();\n                }\n                if updates.is_empty() {\n                    continue;\n                }\n                let (verdicts, flips) = registry.apply_feed_flips(origin, &updates, &policy);\n                merged += verdicts.len();\n                // Attention shift (D9-2): only ids this node actually hosts\n                // (a perch with a record); everything else is a no-op here.\n                // [impl->REQ-INST-3]\n                for id in flips {\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                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\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/// 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","startLine":730,"lineNumbers":[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,null,902,null,951,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"}}},"isError":false,"timestamp":1784271854520}}
{"type":"message","id":"93046602","parentId":"6b78902d","timestamp":"2026-07-17T07:04:14.524Z","message":{"role":"toolResult","toolCallId":"call_oRIUaqDtxp5NFvrbrgXGkyvl|fc_0fcf561150331aac016a59d3edda2c81909a00219311f44b09","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## dispatch.rs\n 511|                    if let Ok(mut retire_brain) = connect(&name) {\n*512|                        let _ = retire_brain.net_stream_retire(stream_id);\n 513|                    }\n 514|                    // Breaker reset = REAL progress only (gate round 1): a row\n 515|                    // that vanished before serve proves nothing about the\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_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 55|    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n 56|    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n...\n 1453|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1454|    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n 1455|        self.send(\n*1456|            KIND_NET_STREAM_RETIRE,\n 1457|            serde_json::to_value(NetStreamRetireReq { stream_id })\n 1458|                .expect(\"NetStreamRetireReq serializes\"),\n 1459|        )?;\n...\n 1461|            match self.read_event()? {\n*1462|                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n 1463|                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n 1464|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1465|                    return Ok(reply.removed);"}],"details":{"scopePath":"crates/spt-daemon/src/dispatch.rs, crates/spt-daemon/src/brain.rs, crates/spt-daemon/src/attach.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":2,"files":["crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/brain.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":1},{"path":"crates/spt-daemon/src/brain.rs","count":4}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## dispatch.rs\n 511│                    if let Ok(mut retire_brain) = connect(&name) {\n*512│                        let _ = retire_brain.net_stream_retire(stream_id);\n 513│                    }\n 514│                    // Breaker reset = REAL progress only (gate round 1): a row\n 515│                    // that vanished before serve proves nothing about the\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_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   55│    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n   56│    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n     │...\n 1453│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1454│    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n 1455│        self.send(\n*1456│            KIND_NET_STREAM_RETIRE,\n 1457│            serde_json::to_value(NetStreamRetireReq { stream_id })\n 1458│                .expect(\"NetStreamRetireReq serializes\"),\n 1459│        )?;\n     │...\n 1461│            match self.read_event()? {\n*1462│                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n 1463│                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n 1464│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1465│                    return Ok(reply.removed);"},"isError":false,"timestamp":1784271854524}}
{"type":"message","id":"a1d40663","parentId":"93046602","timestamp":"2026-07-17T07:04:14.533Z","message":{"role":"toolResult","toolCallId":"call_7znGaqdfdiAxEJUunbgzUu6M|fc_0fcf561150331aac016a59d3edda10819085145e2b4880acb8","toolName":"read","content":[{"type":"text","text":"pub fn run_dispatch_loop(\n…\n) -> io::Result<()> {\n…\n    while !stop.load(Ordering::Relaxed) {\n…\n        for s in reply.streams {\n…\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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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\n/// The stream's first NDJSON line, restart-durable (ADR-0038 B,\n/// REQ-STREAM-OPENER-DURABLE): read the broker-pinned opener fact first —\n/// it survives any ring roll — and fall back to the ring peek only when the\n/// broker predates the verb (KH-2.3 N-1 window). `Ok(None)` = unclassifiable\n/// (terminal); `Err` = transient (the claim requeues bounded).\nfn first_line(\n    broker_name: &str,\n    stream_id: u64,\n    floor_seq: u64,\n) -> io::Result<Option<serde_json::Value>> {\n…\n}\n\n[Showing lines 469-623 of 1558. Use :624 to continue]"}],"details":{"truncation":{"content":"            // 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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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\n/// The stream's first NDJSON line, restart-durable (ADR-0038 B,\n/// REQ-STREAM-OPENER-DURABLE): read the broker-pinned opener fact first —\n/// it survives any ring roll — and fall back to the ring peek only when the\n/// broker predates the verb (KH-2.3 N-1 window). `Ok(None)` = unclassifiable\n/// (terminal); `Err` = transient (the claim requeues bounded).\nfn first_line(\n    broker_name: &str,\n    stream_id: u64,\n    floor_seq: u64,","truncated":true,"truncatedBy":"lines","totalLines":1090,"totalBytes":6970,"outputLines":155,"outputBytes":6970,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub fn run_dispatch_loop(\n…\n) -> io::Result<()> {\n…\n    while !stop.load(Ordering::Relaxed) {\n…\n        for s in reply.streams {\n…\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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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\n/// The stream's first NDJSON line, restart-durable (ADR-0038 B,\n/// REQ-STREAM-OPENER-DURABLE): read the broker-pinned opener fact first —\n/// it survives any ring roll — and fall back to the ring peek only when the\n/// broker predates the verb (KH-2.3 N-1 window). `Ok(None)` = unclassifiable\n/// (terminal); `Err` = transient (the claim requeues bounded).\nfn first_line(\n    broker_name: &str,\n    stream_id: u64,\n    floor_seq: u64,\n) -> io::Result<Option<serde_json::Value>> {\n…\n}","startLine":429,"lineNumbers":[429,null,435,null,455,null,464,null,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,null,651]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":6970,"outputLines":155,"outputBytes":6970,"shownRange":{"start":469,"end":623},"nextOffset":624}}},"isError":false,"timestamp":1784271854533}}
{"type":"message","id":"1e32730d","parentId":"a1d40663","timestamp":"2026-07-17T07:04:14.542Z","message":{"role":"toolResult","toolCallId":"call_Cg0EQcPX0KNRcPBMi1BzDppj|fc_0fcf561150331aac016a59d3edda348190bbbc29ba355addfa","toolName":"read","content":[{"type":"text","text":"fn outcome_transition(\n…\n) -> ClaimState {\n    match outcome {\n…\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\n            FailClass::SeatBlocked => ClaimState::Retry {\n…\n                next_at: now + breaker_window,\n            },\n            FailClass::Transient => {\n                let attempts = attempts + 1;\n                if attempts >= MAX_DISPATCH_ATTEMPTS {\n                    ClaimState::Terminal\n                } else {\n                    ClaimState::Retry {\n                        attempts,\n                        next_at: now + retry_backoff(attempts),\n                    }\n                }\n            }\n        },\n    }\n}\n\n/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's\n/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n/// redispatch — retire unserved, never replay?\n///\n/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n/// would be a regression: the request/reply families FIN their send WITH the\n/// request and await the reply on the same stream (sync.rs `request_sync` and\n/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n/// opener), so every pull that arrives while the brain is down reads\n/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n/// across exactly the refresh window this milestone fixes.\n///\n/// The steal class is ATTACH-specific: `finished` on an attach stream is the\n/// operator's clean detach — its exchange is definitionally over, and a\n/// replay takes a live controller (KNOWN-HAZARDS 7.41: the pre-existing\n/// backlog on long-lived conns, and the brain-down-detach window that\n/// Served-report retirement can never see). So: finished + Attach = terminal\n/// (retired unserved via the worker's Served report); finished + anything\n/// else = a pending request — serve it.\n// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\nfn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {\n    finished && family == StreamFamily::Attach\n}\n\n/// TEST-RIG-ONLY (the D3 regression): `SPT_DISPATCH_INJECT_TRANSIENT_ONCE`\n/// set at dispatcher start makes exactly ONE worker fail before setup —\n/// proving a transient worker-start failure requeues and recovers through\n/// the REAL claim path. Never set in production; the latch arms once per\n/// process and disarms on first take.\nfn take_injected_transient() -> bool {\n    static ARMED: OnceLock<AtomicBool> = OnceLock::new();\n    let armed = ARMED.get_or_init(|| {\n…\n    });\n…\n}\n\n[Showing lines 329-378 of 1558. Use :379 to continue]"}],"details":{"truncation":{"content":"                next_at: now + breaker_window,\n            },\n            FailClass::Transient => {\n                let attempts = attempts + 1;\n                if attempts >= MAX_DISPATCH_ATTEMPTS {\n                    ClaimState::Terminal\n                } else {\n                    ClaimState::Retry {\n                        attempts,\n                        next_at: now + retry_backoff(attempts),\n                    }\n                }\n            }\n        },\n    }\n}\n\n/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's\n/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n/// redispatch — retire unserved, never replay?\n///\n/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n/// would be a regression: the request/reply families FIN their send WITH the\n/// request and await the reply on the same stream (sync.rs `request_sync` and\n/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n/// opener), so every pull that arrives while the brain is down reads\n/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n/// across exactly the refresh window this milestone fixes.\n///\n/// The steal class is ATTACH-specific: `finished` on an attach stream is the\n/// operator's clean detach — its exchange is definitionally over, and a\n/// replay takes a live controller (KNOWN-HAZARDS 7.41: the pre-existing\n/// backlog on long-lived conns, and the brain-down-detach window that\n/// Served-report retirement can never see). So: finished + Attach = terminal\n/// (retired unserved via the worker's Served report); finished + anything\n/// else = a pending request — serve it.\n// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\nfn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {\n    finished && family == StreamFamily::Attach\n}\n\n/// TEST-RIG-ONLY (the D3 regression): `SPT_DISPATCH_INJECT_TRANSIENT_ONCE`\n/// set at dispatcher start makes exactly ONE worker fail before setup —\n/// proving a transient worker-start failure requeues and recovers through\n/// the REAL claim path. Never set in production; the latch arms once per\n/// process and disarms on first take.\nfn take_injected_transient() -> bool {\n    static ARMED: OnceLock<AtomicBool> = OnceLock::new();\n    let armed = ARMED.get_or_init(|| {","truncated":true,"truncatedBy":"lines","totalLines":1230,"totalBytes":2393,"outputLines":50,"outputBytes":2393,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn outcome_transition(\n…\n) -> ClaimState {\n    match outcome {\n…\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\n            FailClass::SeatBlocked => ClaimState::Retry {\n…\n                next_at: now + breaker_window,\n            },\n            FailClass::Transient => {\n                let attempts = attempts + 1;\n                if attempts >= MAX_DISPATCH_ATTEMPTS {\n                    ClaimState::Terminal\n                } else {\n                    ClaimState::Retry {\n                        attempts,\n                        next_at: now + retry_backoff(attempts),\n                    }\n                }\n            }\n        },\n    }\n}\n\n/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's\n/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for\n/// redispatch — retire unserved, never replay?\n///\n/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter\n/// would be a regression: the request/reply families FIN their send WITH the\n/// request and await the reply on the same stream (sync.rs `request_sync` and\n/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the\n/// opener), so every pull that arrives while the brain is down reads\n/// `finished=true` while genuinely PENDING — filtering it breaks context sync\n/// across exactly the refresh window this milestone fixes.\n///\n/// The steal class is ATTACH-specific: `finished` on an attach stream is the\n/// operator's clean detach — its exchange is definitionally over, and a\n/// replay takes a live controller (KNOWN-HAZARDS 7.41: the pre-existing\n/// backlog on long-lived conns, and the brain-down-detach window that\n/// Served-report retirement can never see). So: finished + Attach = terminal\n/// (retired unserved via the worker's Served report); finished + anything\n/// else = a pending request — serve it.\n// [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]\nfn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {\n    finished && family == StreamFamily::Attach\n}\n\n/// TEST-RIG-ONLY (the D3 regression): `SPT_DISPATCH_INJECT_TRANSIENT_ONCE`\n/// set at dispatcher start makes exactly ONE worker fail before setup —\n/// proving a transient worker-start failure requeues and recovers through\n/// the REAL claim path. Never set in production; the latch arms once per\n/// process and disarms on first take.\nfn take_injected_transient() -> bool {\n    static ARMED: OnceLock<AtomicBool> = OnceLock::new();\n    let armed = ARMED.get_or_init(|| {\n…\n    });\n…\n}","startLine":318,"lineNumbers":[318,null,323,324,null,326,327,null,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,null,380,null,382]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":2393,"outputLines":50,"outputBytes":2393,"shownRange":{"start":329,"end":378},"nextOffset":379}}},"isError":false,"timestamp":1784271854542}}
{"type":"message","id":"b24aa125","parentId":"1e32730d","timestamp":"2026-07-17T07:04:45.724Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Tracing worker connection cleanup issues**\n\n**Analyzing Brain connection poisoning and blocking**\n\n**Identifying broker version mismatch impact**"},{"type":"thinking","thinking":"**Planning safe live probes with WPR and Process Explorer**\n\n**Using PowerShell for safe thread sampling**"},{"type":"toolCall","id":"call_oHowqxRxufFzO0Pmd1HhsNKp|fc_0fcf561150331aac016a59d40a96c081908cee276c0726c68f","name":"read","arguments":{"i":"Reading connection lifecycle format","path":"crates/spt-daemon/src/conn.rs","selector":"140-225"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9556,"output":860,"cacheRead":80384,"cacheWrite":0,"totalTokens":90800,"reasoningTokens":819,"cost":{"input":0.04778,"output":0.0258,"cacheRead":0.040192,"cacheWrite":0,"total":0.11377200000000001}},"stopReason":"toolUse","timestamp":1784271854599,"responseId":"resp_0fcf561150331aac016a59d3eefca481908685400528e017e1","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d3f07450819080d72f193ad432f9","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdQBH_fVZwBvNhQu-zmDhxGN-gorGuOc7-0uZsTDNRatQfnTEYfHxHlRDkfRvTHcg2L4osSPR6agJXfpvBRjiLt2PjV302x9T7uhcgq4JozUPgZvxcmsL-UFG7Cf61pGq9WJAoU3EkXsoU6L9_sfOU263b2SIiMWebRB7FeJq3fTNr6OeCvqvU7Mzm7PJ4UEd4z-ir9kmTucfiCJrpTzzBDT9RuxvvwU1HodBIZUcEkFHZW5P2t3HX8c2d0P3lvOxB8Tyn3QgENlVmiv1WCgEYDuoBHAFzcN5mafN1i_6HUEEoYhj95oHjp-NMclCu51qIUlPnZU3Mmn4zdD0g012vTYljFBfa8Xe9EAsSNwlaZW3PDXONMLzOanK1HI64e6FBSjo8pWY7pJNltIckLm5iDnCGPqQRBhT4tnyqnkPEda3pukx6vWrLVt2Xrj8E5_LDvbJwrZbFt0KvuQJQNy8WP3CZqmzsLl-mtmT8_Rk77HwodxPSYrNgSZW_lm3ZG9pLAMTp66nrEKM-tH7rkXfGF5h5vZEnlTZ7KfO_v0PMOBHJCu1uzza7RFPpl3NniPREcG24xPqPQfJQBblzfZ1KO3IAQMvsXsEkTcU-ILuhYA088o-UcySr6MbXVBBmJrF5rWIZMx5PCLOCv2ZS3sl0_aQqTEGIBBJdvI4y5jdBJbR33RjWUFL07WTRVtgAQwccfgScgOr9Sq2h4mmbfgr82V9uuSm9oBkW1JFzns5_TM19CfDSj6ixb0QRUJvbTCaYl8CVoHaUDO31NA9pMG_HTc-6UGedf04IkjOZ63NsRrEuw5tumj6B2RHTSmErfuUOANDpa7LEgrPkqg3KA8zq3tzRXtqSrsU2SSFqzP5ytnDrYWK_NzeTLCEKYfHAwACazdvwEs4gGXNTNjPPU9se-ldX40x2CgmdVbK5B5-KdqhgTFYDjBogvQraNKeEwlSGHw-n1Y016ST67E8mMqt8WBCUZtBaeHaEhToumVMd4PNMH-2GJuRs-bbnwJzVZ0iU3b0ACjLC68wb1OxLlLA37xr2zmuokP9q-qioEcKDzkbDeIxXMbP0vjsBWzpatvwBLTKJushcNjB6IeTNFof9vhLzzfORSsO2TuvL6osP0RtByYX0pXy1s0MJ0rvj2L5r9buJ_uzVj3bdGeAhu059cnUI8C5-Ra4LvMzMI5xDggaLZ6TRPafa0yxivcQMyI_m1VRhs2KV7KPED9_qNuApI7I3wXeNZsdSNcfnjn_1yhuGRb50EqPDAi3JhAAcWrt2hNCy5D0kPlU0N_NVuDJZ5-dkywCbMDuQG2MLFc1lLyinWYgaAzMWdk9dQ3LMfg7m26vzlntbcvbIZKdgP_toGAm5AQQj6MbOhP7737wQ3USipDvQyvBVoktBU1X7KneEvLVbI_Ij7PRBZW4zKpxwZarVo2heyibfIsA84OZ9Jt5pD3_CkllLrRpsUuh0L9emikEcf2Cu4M_d78ZQYLjcatyzot08ujTHurD9Vead_dEh7bi2-smU0wnzw52YMFDsaP4tD_3jRZGzSEG_OqFirbCArTZWy5GPHXpoJrEITnhX5zPJpBnBrbQJgkW4YD6xPP3ziANPQV4KifZ0dGsacoCxWF0LaRAqHByIgH11sSHLrHPoEJjjD_6kUNzrQWoDK8cELH41Y5FO8ngIhO3KlhV94XGRc_8qy4vEGGh2JwOErIiDmVn9AkNRzG2H-Z5Pzwju97fe3k59oaCYecwCcZPe_9QXCTVkdUGvUDPhGy7AYGXG3cqAlRcEskLmdUbU3W1320Icu-u2WQa9-T_h7G69dVCWQjdrnpPju_JaGdNC3U2YaRc_K3PFwee8CFeJWi8Ax4i6zMaIXycbC8AEoe_yNFgztnw0Rygf2XBw44Ob2LBm2nrlFaxmJ-tQj7Wr_W2ipZviLAMHcQDAqQTBTYI7pFqzh8tHs4EtoNHiKMmlPQL585O5nYB7rTVj8UZ4RsGlA3tfQKm6aLn-UfbE24PBqEyPoE8dl08JLMofDxVrUF46QQqzVsREfVWJcg9do__tpnNfo74vyxcuIE-6RVfeHSTw6PZfymI-V7EXIOFyK5p4fJfNHwPsn31ehvfcyWLTA024Awn8m59Kc25DC3KHVqi32x5ypLHfXCbJvod49sGuxrxlkeryNrM0_eKHmJrp61ZXYmkI4iaCkAEM4mj0zm4TUh4-QBNo42oE257s1fEpLcpUH-4cc43jyMTMswnklsxgs4KsuqPFmjP96JfFdM92fSl2mUhq9-v26ETIeKSW9mbCfF_oZyc4bshvQeXQFLTUQifxHaIzJj_O2Tw9A93jVaVnswbpxfeiEEZjO_FR0j9SccUkA6VoW13o4dnML4RZ1AID36RagWFdxUJzUH7FqhuzwWrEzTVCREveuCrQPErQvTIMRGxi6tHtEss54dHKM2BykyaathhRGjG-SlmEYUL38B9fU1Zx3UCWjetkoklOPBLpyZ0sLkwpDgLTfyTWr1G5g7A7EciBBiDtPjYHpPJzdS3N_wei0aQp2s8Y9FDhjq7ANIUYynM5ZAGGLjLtQ60ldRPhCsNEZRd0dHGiZU1-2LdioSHkmcV4-L9bhzOFzElIqvlcbdlkCfIE6U0yzRiUPcj8kP5cov_2n_9Fm-LJNVfIJFNiHu6tZO52s4Fd1A7hoe1JjFxtvFFlQfUuevShzy20rlGYowTaTqs0LTueAMBddNMMdLjEe_DocmZH36xo9FUeoZvz-YHTnFGHKWvfbwjP-ASlKtEUFrFV7n_85_aFuWFP5F0jHp1Tg33msFsq_CVN61BFoNRnP6kWCWMJZDUdmtAGyR3zaVWU6ZL9J-ruteVajIGr-C5hMsY8ssBh64Y8sRE7d43BlPyOpAldrOq4zrJL-LZAEBOt6RCqsitFD70pvqJNWnLxr0ABytdHGuwvrXZGQGVLd3qL3molJ6oVi-TJ2ZvgdN15pt7-DqbYVe_FNBhiLEIP6vpfv0le8S0sNEXxi4F2xG_wY4S1BdqyiOJ3BQ1BASpahxZUtIaJFeI98pNvMhUZlN95huQ0n-YrPbHAHxJNAL3ZzxRM_JtQXd4Sn_9O7FvXvr4-qatGxfbfRYK4LhQ0ucsbbhXR6NWRi08FFtkfS6E-ZRzz4O2tHApzdewWAAcjPlw5S1TBSbz5jOdrmiXjKTomOHsLeX0S8zoVZEfoMgBbU2ZwqUfEpTCNHghfo9saGTO_Jxpchctj_wfqG_caHCExlPSRk2RHum5j-lPgcDy2xrcwMnJe6QF_1b1Kv9XC5Fj6-P2eG8ZPdQnPO16JMIU0rNBFn6_Ja6hNQzp7NTwNzG_8tfJMn_E2YW9eqTITLr9rDQmciKge0ZoiL4tdt7ptBOMDkg2E9CFFv94eBI525KaB_dTTENhegyEdVFi9qkBSS9C03_JLRYS9Bj_Ci4SAPHCUHA_Tcy-3nLcpxQG-BnGDB7vxullv0PFZGbQA2jxz83GTO1emGUxTddheVzEa186a5lssGyM6y2NfzV8VY4iew8PT23S2Xbdgr8KJbOFmzbCYLhMJBFlwu1VG7u7_AzIbGbjdAd2q8wX86AbUT1z6IEZj57tsreJpxjNKfW_wUR_4FMUEEiIdUUZInqDEtUG14vVuPaNmIDiwgwK9AzHVE-DHQ6ocSdv06Ta-zMvVSj30YdEzsFHT-l0XJM-botcw5wcjz6Hx3HTUs0WlcK_CsgwRCnet--UXNrjxID6fuob6I9yU97pwQ4IJrbjaXT9tD-j5do5vsIJ63dbUnmTMQzcFZhrgxHdprtnghotKu0GNSUPoHnVEY29D2LQKnF8cQSt0f98wItIMjSa6w0TwKjV8ADZjpluyvltTOrgZZSy9I3NDHBxXDIfBx4Kswaohrma29sLiTRfKCeNLBDEenaDBmN2tVphFvMbtYuX7i1Lo8DkQ7wzoXv1GfVFtIGYI3Iam09PooD1uBOVjNhYy2R07GuwP78kKeY27azEmkGSd-UKSdeRZIw-Zs_Wdk1-gFhrsAqlWY4fvApTsOP-BhTbZSul8AXTlUYqvQEzRLzfZ7x91mK6iCsZOjVMpWhf5_n_mW19syz5K61lrgR-3D_5rByGohrrUrFifwjwhwXlVsA3IQwQOv36RvCV8LPI47XWG6k0kUSePyVTv-xeGA8CbAZoyDDfMPehn8QGfEELfy5J3ty4X0qU_5VZdAMRAozK6s6qaMI_J6uB3PdYuYJW0wko3urxgGErLliT_sMazo-FYgksEutui-pCxh-SANYu9gdzE8tcu1lqEUS7BAgtw0GYwjVQw==","summary":[{"type":"summary_text","text":"**Tracing worker connection cleanup issues**"},{"type":"summary_text","text":"**Analyzing Brain connection poisoning and blocking**"},{"type":"summary_text","text":"**Identifying broker version mismatch impact**"}]},{"id":"rs_0fcf561150331aac016a59d401f8608190805116429816dd03","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdQKbIpkCzK1nCVjFN9ObRsIy_kyMkw7SQ_AwJHY-gX09FUKQo7YEUfDfjTd9tM6qEka7BP-vTOLKtPV8PMjtAnD7BxdtIiPSZU1dM_JezSRMPiNrlT9mxWAp9msKkXxVKXClMDf6c65Sam_Ewftx2nuf3o96InqnzoUql4eSleuhok_u8_VqdkgMoqgB5NjqOn4Fy8Zdur8U8J9AUNi_7stLLTxV-XMkUl7jE3D1GNNJUt3KJl5HNQNOsyBQYE4TAWbRMxX2Xoz_uww7Be-maL4Z6MsvebTZRIiY7R_5AJxp6vu2IruqL3C0raY98BfL7ApkQKzwpHyOVcQCKRHlVDGnWI8WzMnq73b2Hsarn0BhIZ2W6BztByImFb8Q-uxbuBjs0LSpKnFG351tTtnIW8L6-nWKrcW3lVIdGJ-WSOqG1METRX9JArAieKTyZKHuV8fXJUWNoEgD0Hwafy_LRTL8dOP5dHr82biEvH9hqlPYPwl6HaaUaGH1tViDPh1f7QieKAUQg4w8RRenxnBPJePTxX_Nlhb5fCMtlRAxrdsGdDiNHk_2PLC3qv5umuv9h5387Iu2u6nyvcAF-PjkJpkj-vuPF87GQWYf5KQyKWVR7OqITTsxt8EgUhJRA4Nvlyeev0syelYpmMHsWnw3jzaYy8bqh5sZ0WjGArPoPmqRvKodGjhf3f25T71oXOQEbLoBRrORRbWryL0s6ItdJCs6JJtttCVGESnqfEUDo0qlUP7IVw1EWFi4Q65KM9_FQsBcJdv-GmyHog_ZXFcVlKA_BaxKxc3CTWnc4qNCgzw5yvtQey8LtkVazMXAoPvLutS1wQGkgb2L9sh6YRxDHq5ymzxycBbdcLmTPWdsCdJi0CfV39Z12Rda7Q7knppMMCxkOdz5eFCNWj4Fakxd3iOakhgkkLQgh82uXbXVtfwibFYqe2pEn3YlpCcKmg3lTtKJpzE5kr5tjZZhcqn9gVMoBmn0YhViKkBqrtNgyva_HaVu4en_DE499zHc-mU4YMy2VQYo3H42YN6t8V9f8khSNqWjYDAsUUGULY-tW4pdkiUhZhj4VSZyC38Pz4S5UJb34_i2uCpkGo65Oh-llHWISFcoYrB1OQVJj3ztzGxkyKLc4YiaUumSPJFCSh-rRv3Gzug_kYx_o1ag_EOmH1fzP_qOZaDS_kkQWU5L6Qw05g6sRwCiJr5-nluJfjhvkTmay766ggHqx0vz_PHVdmSOhziMPTpAMLYxYh4orfLbKaM2cMngZvexpeY196ZiJ2R0mObU_mhNMdPTEOtihU0FyuApu6vyQoqT6_ot85xLiezt8euerNB-Fb9WYZZ7zUebmykUXu2aDVxgmbX0fBFgU9tXFXldhHJKDltJB4RmZh2GelluASEXyHFyyOpPDQa02Ksow56SEvrC4BpbxPpprzr7duIZo5tKgVwDOJlkgPl_RVFbS4qFRxcKVfJqvxyfx4-dvPZ3genbvYpc5clbSAmjXQPtrwiR3UKClohJf81OteyJRUbpoIlbFUu-67qY44y2258j75QFf8XoHX8hPxOARG5TBXAgt322X1O0fglYal4PlXMHV64N_XP_uLL0cNVjdSd6levTqWCLaIknB_3-TlWMLa0-7j5Y5pJ51YP13367SctM-i1vEdFOdLzdW2uUPdFLzM851LBsKYxZywFE554BbLfr_OeoAOBNYXKusoio8EGC46FAbRyFj5j5ud2y-r9Exv9XnlOPGBkSz224rONJ0kuo1QXnJb9I60WDhGL-qolS8keq4MhjqPmoF4gwjWhS3ijfPJ8ImAY-0GhbbZkDqCzjx9DN355_B_heBH6eYaTZIlWHgq5ywhHkEJzzDxOxWo3ImfqatxjhZrSF6XStOdpPaSDplsUFqr_cXJ6lR_rmedgFdWmk1BBwk8967A2Wx7NWHZhaGHFHV0xO7TevGeciP6jBTsPYVeWKw5ZtSZz_gnyWnLZxn3S4WlxW3DBIU96XngmRxctPD8AeJyA4tX9vQlvLvGb02NpdVLR5UN5u5QT7kSLXHd6bSDSCl9GxKa9z4jptKkYSwxqCbyNJLpIKK3vmETc38l8c1mQBPXJWC3NNkse7hGxb3D0M8No3If9B6LBp5kmxA7N4I0jRJ4L_MIdCY9nBF2vt4cKs_LIwu5GBCPX-KZTd3rlyq1_o_SL-AkiBHItIowHOawYwO2jU-xkz__aSEMQGa5Q9PhyyW8cBq2n9z2xxsq-6ewXzMjHYK8fhPQt7g6IR1GaBjfSXnQj1QBirpln04DHEVSrsZ3b65fuxJDfBWAgkYVWTH_KYF8uZiVGQ0Oiq6J6QTs-J4ewoXZbhDjYfaF_3-FoXTWbAuNJ9Vqo3-89a7NgTii5XKpUBmoNZC0l3sSUhDd5mqBPQphzMRsIXFyv6-gt3TiIYjkKoD1GnPX2ZjZ38BF-po5BOVhki5Q2pnzh1m5c7bv-MJ3Qsns9V88LNrPoku1ilANMWn8eH6VTPDHaq0rUlVAW4-f505TmNWJCJvE_lOogNYG6ldCIohP5W0myxSj9QUA4pJEn","summary":[{"type":"summary_text","text":"**Planning safe live probes with WPR and Process Explorer**"},{"type":"summary_text","text":"**Using PowerShell for safe thread sampling**"}]},{"id":"fc_0fcf561150331aac016a59d40a96c081908cee276c0726c68f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading connection lifecycle format\",\"path\":\"crates/spt-daemon/src/conn.rs\",\"selector\":\"140-225\"}","call_id":"call_oHowqxRxufFzO0Pmd1HhsNKp","name":"read"}]},"duration":31124.369900003076,"ttft":1869.039400011301,"contextSnapshot":{"promptTokens":89940,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_oHowqxRxufFzO0Pmd1HhsNKp|fc_0fcf561150331aac016a59d40a96c081908cee276c0726c68f","toolName":"read","startedAt":"2026-07-17T07:04:45.724Z","args":{"path":"crates/spt-daemon/src/conn.rs"},"intent":"Reading connection lifecycle format"},"id":"b788d721","parentId":"b24aa125","timestamp":"2026-07-17T07:04:45.724Z"}
{"type":"message","id":"9ba36853","parentId":"b788d721","timestamp":"2026-07-17T07:04:45.732Z","message":{"role":"toolResult","toolCallId":"call_oHowqxRxufFzO0Pmd1HhsNKp|fc_0fcf561150331aac016a59d40a96c081908cee276c0726c68f","toolName":"read","content":[{"type":"text","text":"/// The state shared with the watchdog thread (no `Arc<BrokerConn>` cycle —\n/// the watchdog must not keep the conn alive).\nstruct Inner {\n    /// Stable per-physical-conn id ([`CONN_ID_SEQ`]) — on every lifecycle record.\n    id: u64,\n    /// Accreted attribution facts (subscriber role, endpoint/session where\n    /// known — [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].\n    label: Mutex<String>,\n    /// Latch: the once-per-conn `write-start` lifecycle record fired.\n    first_write_logged: AtomicBool,\n    gate: Mutex<Gate>,\n    gate_cv: Condvar,\n    dog: Mutex<Dog>,\n    dog_cv: Condvar,\n    /// Idempotently latched on the first deadline/failure/cancel. A poisoned\n    /// conn refuses every future write and is never re-gated.\n    poisoned: AtomicBool,\n    /// Latched when the retirement was DEADLINE-driven (watchdog fired, or a\n    /// gate-waiter exhausted its bound) — as opposed to an organic I/O error\n    /// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can\n    /// count the wedge (the W2 stall-evict tally) without conflating it with\n    /// an ordinary disconnect.\n    timed_out: AtomicBool,\n    /// The physical sever ran (exactly once; Windows `DisconnectNamedPipe`).\n    severed: AtomicBool,\n    /// A retired (poisoned) half parks here so its OS handle stays alive\n    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\n    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\n    graveyard: Mutex<Option<SendHalf>>,\n    /// Monotonic per-write op identity (the watchdog cancels a SPECIFIC op).\n    op_seq: AtomicU64,\n    /// The absolute per-write bound (gate-wait + OS write completion).\n    bound: Duration,\n    /// The raw OS handle/fd of the underlying stream, captured at\n    /// construction for the out-of-band abort. The recv and send halves share\n    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\n    /// aborting this handle covers a parked read too. Valid for the whole\n    /// conn lifetime: the half lives in `gate`, a writer's stack, or\n    /// `graveyard` until drop.\n    #[cfg(windows)]\n    raw: isize,\n    #[cfg(unix)]\n    raw: i32,\n}\n\n/// Recover a mutex guard even if a holder panicked — the state these guards\n/// protect is a plain slot/flag pair, valid on every panic boundary.\nfn recover<T>(m: &Mutex<T>) -> MutexGuard<'_, T> {\n    match m.lock() {\n        Ok(g) => g,\n        Err(p) => p.into_inner(),\n    }\n}\n\n#[cfg(windows)]\nfn raw_of(half: &SendHalf) -> isize {\n    use std::os::windows::io::{AsHandle, AsRawHandle};\n    match half {\n        SendHalf::NamedPipe(h) => h.as_handle().as_raw_handle() as isize,\n    }\n}\n\n#[cfg(unix)]\nfn raw_of(half: &SendHalf) -> i32 {\n    use std::os::fd::{AsFd, AsRawFd};\n    match half {\n        SendHalf::UdSocket(h) => h.as_fd().as_raw_fd(),\n    }\n}\n\n#[cfg(windows)]\nmod win {\n    // kernel32 is in the MSVC default link set — raw externs, no new dep\n    // (the deelevate.rs / daemon.rs posture).\n    extern \"system\" {\n        pub fn CancelIoEx(handle: isize, overlapped: *mut core::ffi::c_void) -> i32;\n        pub fn DisconnectNamedPipe(handle: isize) -> i32;\n    }\n}\n\nimpl Inner {\n    /// The attribution snapshot every lifecycle record carries: stable conn id,\n    /// accreted role/endpoint/session facts, wall + monotonic stamps.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    fn attribution(&self) -> String {\n        let label = recover(&self.label);\n        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\n        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\n    }\n\n…\n}\n\n[Showing lines 139-228 of 815. Use :229 to continue]"}],"details":{"truncation":{"content":"/// The state shared with the watchdog thread (no `Arc<BrokerConn>` cycle —\r\n/// the watchdog must not keep the conn alive).\r\nstruct Inner {\r\n    /// Stable per-physical-conn id ([`CONN_ID_SEQ`]) — on every lifecycle record.\r\n    id: u64,\r\n    /// Accreted attribution facts (subscriber role, endpoint/session where\r\n    /// known — [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].\r\n    label: Mutex<String>,\r\n    /// Latch: the once-per-conn `write-start` lifecycle record fired.\r\n    first_write_logged: AtomicBool,\r\n    gate: Mutex<Gate>,\r\n    gate_cv: Condvar,\r\n    dog: Mutex<Dog>,\r\n    dog_cv: Condvar,\r\n    /// Idempotently latched on the first deadline/failure/cancel. A poisoned\r\n    /// conn refuses every future write and is never re-gated.\r\n    poisoned: AtomicBool,\r\n    /// Latched when the retirement was DEADLINE-driven (watchdog fired, or a\r\n    /// gate-waiter exhausted its bound) — as opposed to an organic I/O error\r\n    /// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can\r\n    /// count the wedge (the W2 stall-evict tally) without conflating it with\r\n    /// an ordinary disconnect.\r\n    timed_out: AtomicBool,\r\n    /// The physical sever ran (exactly once; Windows `DisconnectNamedPipe`).\r\n    severed: AtomicBool,\r\n    /// A retired (poisoned) half parks here so its OS handle stays alive\r\n    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\r\n    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\r\n    graveyard: Mutex<Option<SendHalf>>,\r\n    /// Monotonic per-write op identity (the watchdog cancels a SPECIFIC op).\r\n    op_seq: AtomicU64,\r\n    /// The absolute per-write bound (gate-wait + OS write completion).\r\n    bound: Duration,\r\n    /// The raw OS handle/fd of the underlying stream, captured at\r\n    /// construction for the out-of-band abort. The recv and send halves share\r\n    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\r\n    /// aborting this handle covers a parked read too. Valid for the whole\r\n    /// conn lifetime: the half lives in `gate`, a writer's stack, or\r\n    /// `graveyard` until drop.\r\n    #[cfg(windows)]\r\n    raw: isize,\r\n    #[cfg(unix)]\r\n    raw: i32,\r\n}\r\n\r\n/// Recover a mutex guard even if a holder panicked — the state these guards\r\n/// protect is a plain slot/flag pair, valid on every panic boundary.\r\nfn recover<T>(m: &Mutex<T>) -> MutexGuard<'_, T> {\r\n    match m.lock() {\r\n        Ok(g) => g,\r\n        Err(p) => p.into_inner(),\r\n    }\r\n}\r\n\r\n#[cfg(windows)]\r\nfn raw_of(half: &SendHalf) -> isize {\r\n    use std::os::windows::io::{AsHandle, AsRawHandle};\r\n    match half {\r\n        SendHalf::NamedPipe(h) => h.as_handle().as_raw_handle() as isize,\r\n    }\r\n}\r\n\r\n#[cfg(unix)]\r\nfn raw_of(half: &SendHalf) -> i32 {\r\n    use std::os::fd::{AsFd, AsRawFd};\r\n    match half {\r\n        SendHalf::UdSocket(h) => h.as_fd().as_raw_fd(),\r\n    }\r\n}\r\n\r\n#[cfg(windows)]\r\nmod win {\r\n    // kernel32 is in the MSVC default link set — raw externs, no new dep\r\n    // (the deelevate.rs / daemon.rs posture).\r\n    extern \"system\" {\r\n        pub fn CancelIoEx(handle: isize, overlapped: *mut core::ffi::c_void) -> i32;\r\n        pub fn DisconnectNamedPipe(handle: isize) -> i32;\r\n    }\r\n}\r\n\r\nimpl Inner {\r\n    /// The attribution snapshot every lifecycle record carries: stable conn id,\r\n    /// accreted role/endpoint/session facts, wall + monotonic stamps.\r\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\r\n    fn attribution(&self) -> String {\r\n        let label = recover(&self.label);\r\n        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\r\n        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\r\n    }\r\n\r","truncated":true,"truncatedBy":"lines","totalLines":677,"totalBytes":3692,"outputLines":90,"outputBytes":3692,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// The state shared with the watchdog thread (no `Arc<BrokerConn>` cycle —\r\n/// the watchdog must not keep the conn alive).\r\nstruct Inner {\r\n    /// Stable per-physical-conn id ([`CONN_ID_SEQ`]) — on every lifecycle record.\r\n    id: u64,\r\n    /// Accreted attribution facts (subscriber role, endpoint/session where\r\n    /// known — [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].\r\n    label: Mutex<String>,\r\n    /// Latch: the once-per-conn `write-start` lifecycle record fired.\r\n    first_write_logged: AtomicBool,\r\n    gate: Mutex<Gate>,\r\n    gate_cv: Condvar,\r\n    dog: Mutex<Dog>,\r\n    dog_cv: Condvar,\r\n    /// Idempotently latched on the first deadline/failure/cancel. A poisoned\r\n    /// conn refuses every future write and is never re-gated.\r\n    poisoned: AtomicBool,\r\n    /// Latched when the retirement was DEADLINE-driven (watchdog fired, or a\r\n    /// gate-waiter exhausted its bound) — as opposed to an organic I/O error\r\n    /// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can\r\n    /// count the wedge (the W2 stall-evict tally) without conflating it with\r\n    /// an ordinary disconnect.\r\n    timed_out: AtomicBool,\r\n    /// The physical sever ran (exactly once; Windows `DisconnectNamedPipe`).\r\n    severed: AtomicBool,\r\n    /// A retired (poisoned) half parks here so its OS handle stays alive\r\n    /// until [`BrokerConn::drop`] — after the watchdog is joined, so no raw\r\n    /// `CancelIoEx`/`DisconnectNamedPipe` can race the `CloseHandle`.\r\n    graveyard: Mutex<Option<SendHalf>>,\r\n    /// Monotonic per-write op identity (the watchdog cancels a SPECIFIC op).\r\n    op_seq: AtomicU64,\r\n    /// The absolute per-write bound (gate-wait + OS write completion).\r\n    bound: Duration,\r\n    /// The raw OS handle/fd of the underlying stream, captured at\r\n    /// construction for the out-of-band abort. The recv and send halves share\r\n    /// ONE underlying stream object (`interprocess` splits by ref-clone), so\r\n    /// aborting this handle covers a parked read too. Valid for the whole\r\n    /// conn lifetime: the half lives in `gate`, a writer's stack, or\r\n    /// `graveyard` until drop.\r\n    #[cfg(windows)]\r\n    raw: isize,\r\n    #[cfg(unix)]\r\n    raw: i32,\r\n}\r\n\r\n/// Recover a mutex guard even if a holder panicked — the state these guards\r\n/// protect is a plain slot/flag pair, valid on every panic boundary.\r\nfn recover<T>(m: &Mutex<T>) -> MutexGuard<'_, T> {\r\n    match m.lock() {\r\n        Ok(g) => g,\r\n        Err(p) => p.into_inner(),\r\n    }\r\n}\r\n\r\n#[cfg(windows)]\r\nfn raw_of(half: &SendHalf) -> isize {\r\n    use std::os::windows::io::{AsHandle, AsRawHandle};\r\n    match half {\r\n        SendHalf::NamedPipe(h) => h.as_handle().as_raw_handle() as isize,\r\n    }\r\n}\r\n\r\n#[cfg(unix)]\r\nfn raw_of(half: &SendHalf) -> i32 {\r\n    use std::os::fd::{AsFd, AsRawFd};\r\n    match half {\r\n        SendHalf::UdSocket(h) => h.as_fd().as_raw_fd(),\r\n    }\r\n}\r\n\r\n#[cfg(windows)]\r\nmod win {\r\n    // kernel32 is in the MSVC default link set — raw externs, no new dep\r\n    // (the deelevate.rs / daemon.rs posture).\r\n    extern \"system\" {\r\n        pub fn CancelIoEx(handle: isize, overlapped: *mut core::ffi::c_void) -> i32;\r\n        pub fn DisconnectNamedPipe(handle: isize) -> i32;\r\n    }\r\n}\r\n\r\nimpl Inner {\r\n    /// The attribution snapshot every lifecycle record carries: stable conn id,\r\n    /// accreted role/endpoint/session facts, wall + monotonic stamps.\r\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\r\n    fn attribution(&self) -> String {\r\n        let label = recover(&self.label);\r\n        let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };\r\n        format!(\"conn={} {} {}\", self.id, facts, log_stamp())\r\n    }\r\n\r\n…\n}","startLine":139,"lineNumbers":[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,null,410]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\conn.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":815,"totalBytes":3692,"outputLines":90,"outputBytes":3692,"shownRange":{"start":139,"end":228},"nextOffset":229}}},"isError":false,"timestamp":1784271885732}}
{"type":"message","id":"a62be0b0","parentId":"9ba36853","timestamp":"2026-07-17T07:04:45.733Z","message":{"role":"user","content":"Your current interruptible wait was interrupted because an IRC message arrived from your parent agent `Main`.\n\nParent IRC message:\n\nDoyle requests broker thread-name census: distinguish conn watchdog, conn handler, SubscriberSeat writer counts for ~550 threads. Please trace named/unnamed spawn sites and derive expected counts from live telemetry/source if direct Windows names unavailable. Also confirm poison conn IDs fresh vs reused.","attribution":"agent","timestamp":1784271862375,"steering":true}}
{"type":"message","id":"9880c8fe","parentId":"a62be0b0","timestamp":"2026-07-17T07:04:55.784Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Locating default SPT_HOME directory**"},{"type":"toolCall","id":"call_aNerdBmwDWp0HxONaUEkPeMw|fc_0fcf561150331aac016a59d4172824819089dc8507ce5d7522","name":"glob","arguments":{"i":"Locating live daemon logs","path":"C:/Users/decid/**/daemon.stderr.log*","hidden":true,"gitignore":false,"limit":50}},{"type":"toolCall","id":"call_zjUQj6Hr0jUigTelXeT64l6m|fc_0fcf561150331aac016a59d41728388190b8ba49c0cec2d65a","name":"grep","arguments":{"i":"Reading lifecycle prefix","pattern":"fn lifecycle|CONN_|write-start|stream-sub-writer-poison","path":"crates/spt-daemon/src/conn.rs","selector":"220-330","case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_pEvc7exvwpxpigiukdvtZpT3|fc_0fcf561150331aac016a59d41728408190b04f5224e1e048c1","name":"grep","arguments":{"i":"Finding broker thread names","pattern":"\\.name\\(|thread_name\\(","path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_B7KNxcuIUbVDMbKl1hXQxnDx|fc_0fcf561150331aac016a59d41728488190b6993bce57297ed1","name":"read","arguments":{"i":"Reading net subscriber structs","path":"crates/spt-daemon/src/nethost.rs","selector":"115-205"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":6417,"output":363,"cacheRead":85504,"cacheWrite":0,"totalTokens":92284,"reasoningTokens":97,"cost":{"input":0.032085,"output":0.01089,"cacheRead":0.042752,"cacheWrite":0,"total":0.085727}},"stopReason":"toolUse","timestamp":1784271885748,"responseId":"resp_0fcf561150331aac016a59d40e479c8190b8229fa6c410b122","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d41083d8819089d3e9671f14f400","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdQXeculCWzsi2jKzLxCUv1mAozUvHRqKL7duugidp4-TnbVALJHuv1fwgerLmb8qhIGxPfwdsOiW8V0W0PY-hOexHQsuUdZBYp5kJLxPUTNurhdZIxMweW5rQ7qrV-m_An7vG-8oG4CJrE51GYbBZONbHZ7o0uLMSgcx15crH3UAPiS1mM2tTVPiK2s70nsVeOiQwL_79Vk74N2qmLrrGTwB5dj4mZcfg0dUy-2jmr8U0EbrbJjMVDDjHNTBQLQGfnjhLUbXnH5Zb28t4Ol5p9AXheSFpgEunyU4VxY7Lfzd5P1_E0bAHZWNYXJz87OTPjrQnykrT1L9rwxxcazh3433nUfs_IfGh-b3aFc2Maw8SwCxAyQy_gXsODfmdRXuIQRhAziVweIMzwha3CRUQfOaoif-8FKZ65ZbW5uXJ4hIMvTZO2eQ9sLi-HLQbFzCfMnSaK2DYWJzzTxMIr_5YGYljbW8omHU_Rmkn-BP-Os1hAZUQ9un7rrkH77HoHFEVQzoyI0LPEVcpMCcwslwCv8mRogCLfqd8EAbP-3SYE65XfBwZTyd6aQNAq-A-p3RAE3kwERa0KRatSSwH4GKhhunFEYUHU3VfxeSBiJFZ-0GKVvAeMXlL4KGvGOdl8mfBs6XasrrvOK9vy7jQ-FGfkW1_ImbWhY0SFn9SiSTTZF9XArfufyP7u4aoUyBvKf8zX8bwQhwj4hKHcfIUG9RpxsZI3HxwB20-taM9rMdbvKMIQQYoL5EcmbyqVzscTetSNXNQuVtAFV_tgHRrL-jD3JTdQHfbsZxmePOJNkokozvJDEhlj82fLQw1c9VSgZARJ7_yqfZH_naiqPhEqXqC8djrpPL6-Ie5VIe7CKmRFB42qRPSjOUWtMePglvTSIYr3uyHL0iopbdezA737nAciTqdnaVQlzt1dVx1hz53SkbtF6MYX4DJ1Xa_ihN3RwZEgjNsXs-w2ODcLfNvC9E-z_iiQLBnOkyCGfPS2-d65tQz52pq9-CgsHoFTxsPq_CPdNCmstQmnGnYdiZV3y4qMCRhezyXIj9ID6b-hv79srul2-0eMD1G273PhDiQHW4gRkgeGS7FacbphCHupE6jzW8mCtvaNRMQLA0C_OBamnlWYj22XEsTdtAiCmAfy8ELSSypYzBRUQ4VeoJ-yJzhhC97qPoVCy2qPKER-0APeNc3ogBs4e4A9h2_Hvmdb4ubHERepjpoC69aiuwcV4352TB7hRwVzBm5lrhnyd9-35mrKaKlgWP-QM0JLezgnraLjLJ0kz3M-AL66sbft2-9mgMjYhRWQcmUG8IRFkToQpYRCSb8uuHr183rMmJPjSTcroOOI-XoadqLmpMG_bIvmngGEHWyvFRDA9FZV0wKohnQ5K4vbhrVEdNmZdaxu-MIYXtDFEYrdnALHVKwhSHMDA40Cie8U2hXzGF-w9Hq3sQtw=","summary":[{"type":"summary_text","text":"**Locating default SPT_HOME directory**"}]},{"id":"fc_0fcf561150331aac016a59d4172824819089dc8507ce5d7522","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating live daemon logs\",\"path\":\"C:/Users/decid/**/daemon.stderr.log*\",\"hidden\":true,\"gitignore\":false,\"limit\":50}","call_id":"call_aNerdBmwDWp0HxONaUEkPeMw","name":"glob"},{"id":"fc_0fcf561150331aac016a59d41728388190b8ba49c0cec2d65a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading lifecycle prefix\",\"pattern\":\"fn lifecycle|CONN_|write-start|stream-sub-writer-poison\",\"path\":\"crates/spt-daemon/src/conn.rs\",\"selector\":\"220-330\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_zjUQj6Hr0jUigTelXeT64l6m","name":"grep"},{"id":"fc_0fcf561150331aac016a59d41728408190b04f5224e1e048c1","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding broker thread names\",\"pattern\":\"\\\\.name\\\\(|thread_name\\\\(\",\"path\":\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_pEvc7exvwpxpigiukdvtZpT3","name":"grep"},{"id":"fc_0fcf561150331aac016a59d41728488190b6993bce57297ed1","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading net subscriber structs\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"115-205\"}","call_id":"call_B7KNxcuIUbVDMbKl1hXQxnDx","name":"read"}]},"duration":10033.886000007391,"ttft":2817.133600011468,"contextSnapshot":{"promptTokens":91921,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_aNerdBmwDWp0HxONaUEkPeMw|fc_0fcf561150331aac016a59d4172824819089dc8507ce5d7522","toolName":"glob","startedAt":"2026-07-17T07:04:55.784Z","args":{"path":"C:/Users/decid/**/daemon.stderr.log*"},"intent":"Locating live daemon logs"},"id":"be0dd7d5","parentId":"9880c8fe","timestamp":"2026-07-17T07:04:55.784Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zjUQj6Hr0jUigTelXeT64l6m|fc_0fcf561150331aac016a59d41728388190b8ba49c0cec2d65a","toolName":"grep","startedAt":"2026-07-17T07:04:55.784Z","args":{"path":"crates/spt-daemon/src/conn.rs"},"intent":"Reading lifecycle prefix"},"id":"c1555825","parentId":"be0dd7d5","timestamp":"2026-07-17T07:04:55.784Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_pEvc7exvwpxpigiukdvtZpT3|fc_0fcf561150331aac016a59d41728408190b04f5224e1e048c1","toolName":"grep","startedAt":"2026-07-17T07:04:55.784Z","args":{"path":"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs"},"intent":"Finding broker thread names"},"id":"34e23860","parentId":"c1555825","timestamp":"2026-07-17T07:04:55.784Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_B7KNxcuIUbVDMbKl1hXQxnDx|fc_0fcf561150331aac016a59d41728488190b6993bce57297ed1","toolName":"read","startedAt":"2026-07-17T07:04:55.784Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading net subscriber structs"},"id":"6a7e0d7c","parentId":"34e23860","timestamp":"2026-07-17T07:04:55.784Z"}
{"type":"message","id":"c9ef02ca","parentId":"6a7e0d7c","timestamp":"2026-07-17T07:04:55.790Z","message":{"role":"toolResult","toolCallId":"call_zjUQj6Hr0jUigTelXeT64l6m|fc_0fcf561150331aac016a59d41728388190b8ba49c0cec2d65a","toolName":"grep","content":[{"type":"text","text":" 229|    /// Render the once-per-conn retirement record — the F-039 token split\n*230|    /// (leg a): `CONN_WRITE_POISONED` is RESERVED for the deadline class\n 231|    /// (`timed_out` latched — the wedge observable blackhole-controller.ps1\n 232|    /// watches); an ORGANIC write failure (peer death / broken pipe on an\n 233|    /// already-dead counterpart, the offline-peer dial churn) emits the\n*234|    /// distinct `CONN_WRITE_RETIRED` token carrying the error kind and the\n 235|    /// SAME attribution fields — quieter class, never thinner (the retired\n 236|    /// class is what discriminates fresh-carrier churn from interleave\n 237|    /// artifact in the field). Behavior is identical either way: poison,\n...\n 242|            format!(\n*243|                \"CONN_WRITE_POISONED: {} — physical broker conn retired: a write \\\n 244|                 exceeded its {}ms bound; in-flight I/O aborted, conn never reused \\\n 245|                 [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\",\n 246|                self.attribution(),\n...\n 254|            format!(\n*255|                \"CONN_WRITE_RETIRED: {} — organic write failure ({cause}); physical \\\n 256|                 broker conn poisoned + retired, never reused (same retire behavior \\\n 257|                 as POISONED — only the failure class differs) \\\n 258|                 [REQ-CONN-POISON-DIAL-SCOPE]\",\n...\n 264|    /// One BOUNDED per-conn lifecycle record (leg d, doyle-confirmed\n*265|    /// UNCONDITIONAL): `write-start` (first write only), `transport-close`\n 266|    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n 267|    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n 268|    /// timeout/cancel leg is the retirement record itself.\n 269|    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n*270|    fn lifecycle(&self, event: &str, extra: &str) {\n 271|        let sep = if extra.is_empty() { \"\" } else { \" \" };\n 272|        eprintln!(\n*273|            \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",\n 274|            self.attribution()\n 275|        );\n 276|    }\n...\n 287|            // First poison of this conn: loud, once. The token is class-split\n*288|            // (F-039 leg a): deadline → CONN_WRITE_POISONED (the wedge\n*289|            // observable), organic fast-fail → CONN_WRITE_RETIRED.\n 290|            eprintln!(\n 291|                \"{}\",\n 292|                self.render_retirement(self.timed_out.load(Ordering::Acquire), cause)"}],"details":{"scopePath":"crates/spt-daemon/src/conn.rs","searchPath":"C:/Users/decid/Documents/projects/spt-core/crates/spt-daemon/src/conn.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":9,"fileCount":1,"files":["crates/spt-daemon/src/conn.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/conn.rs","count":9}],"truncated":false,"displayContent":" 229│    /// Render the once-per-conn retirement record — the F-039 token split\n*230│    /// (leg a): `CONN_WRITE_POISONED` is RESERVED for the deadline class\n 231│    /// (`timed_out` latched — the wedge observable blackhole-controller.ps1\n 232│    /// watches); an ORGANIC write failure (peer death / broken pipe on an\n 233│    /// already-dead counterpart, the offline-peer dial churn) emits the\n*234│    /// distinct `CONN_WRITE_RETIRED` token carrying the error kind and the\n 235│    /// SAME attribution fields — quieter class, never thinner (the retired\n 236│    /// class is what discriminates fresh-carrier churn from interleave\n 237│    /// artifact in the field). Behavior is identical either way: poison,\n    │...\n 242│            format!(\n*243│                \"CONN_WRITE_POISONED: {} — physical broker conn retired: a write \\\n 244│                 exceeded its {}ms bound; in-flight I/O aborted, conn never reused \\\n 245│                 [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\",\n 246│                self.attribution(),\n    │...\n 254│            format!(\n*255│                \"CONN_WRITE_RETIRED: {} — organic write failure ({cause}); physical \\\n 256│                 broker conn poisoned + retired, never reused (same retire behavior \\\n 257│                 as POISONED — only the failure class differs) \\\n 258│                 [REQ-CONN-POISON-DIAL-SCOPE]\",\n    │...\n 264│    /// One BOUNDED per-conn lifecycle record (leg d, doyle-confirmed\n*265│    /// UNCONDITIONAL): `write-start` (first write only), `transport-close`\n 266│    /// (drop), `writer-exit` / `*-attach` / `*-replaced` (emitted by the\n 267│    /// broker's sink machinery through [`BrokerConn::lifecycle_event`]). The\n 268│    /// timeout/cancel leg is the retirement record itself.\n 269│    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n*270│    fn lifecycle(&self, event: &str, extra: &str) {\n 271│        let sep = if extra.is_empty() { \"\" } else { \" \" };\n 272│        eprintln!(\n*273│            \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",\n 274│            self.attribution()\n 275│        );\n 276│    }\n    │...\n 287│            // First poison of this conn: loud, once. The token is class-split\n*288│            // (F-039 leg a): deadline → CONN_WRITE_POISONED (the wedge\n*289│            // observable), organic fast-fail → CONN_WRITE_RETIRED.\n 290│            eprintln!(\n 291│                \"{}\",\n 292│                self.render_retirement(self.timed_out.load(Ordering::Acquire), cause)"},"isError":false,"timestamp":1784271895789}}
{"type":"message","id":"e35e5cbd","parentId":"c9ef02ca","timestamp":"2026-07-17T07:04:55.814Z","message":{"role":"toolResult","toolCallId":"call_B7KNxcuIUbVDMbKl1hXQxnDx|fc_0fcf561150331aac016a59d41728488190b6993bce57297ed1","toolName":"read","content":[{"type":"text","text":"/// Max bytes pulled per stream read (one ring chunk).\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\n\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\n/// no newline is not speaking an NDJSON protocol — capture gives up\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\nconst OPENER_PIN_MAX: usize = 64 * 1024;\n\n/// How many frames a subscriber's writer queue holds before the subscriber is\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\n/// is a subscriber problem, never a producer stall — the detached brain\n/// resumes from its cursor (the existing gapless-resume contract).\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\n\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\n/// either, but only a POISON (real write failure on the conn) cancels the\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum SeatFail {\n    /// The writer thread died on a failed conn write (the 15s bounded-write\n    /// poison class) — halt-at-first-failure already happened writer-side.\n    Poisoned,\n    /// The bounded queue is full — the subscriber cannot keep up.\n    Overflow,\n}\n\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\n///\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\n/// sender — the writer drains what it holds and exits.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\nstruct SubscriberSeat {\n    sub: SharedSend,\n    tx: std::sync::mpsc::SyncSender<Envelope>,\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n    /// and a replacement may install (the no-reinstall-until-gone rule,\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\n    done: Arc<std::sync::atomic::AtomicBool>,\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\n}\n\nimpl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n…\n                }\n            }\n…\n        });\n…\n    }\n…\n}\n\n[Showing lines 114-208 of 2865. Use :209 to continue]"}],"details":{"truncation":{"content":"/// Max bytes pulled per stream read (one ring chunk).\r\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\r\n\r\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\r\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\r\n/// no newline is not speaking an NDJSON protocol — capture gives up\r\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\r\nconst OPENER_PIN_MAX: usize = 64 * 1024;\r\n\r\n/// How many frames a subscriber's writer queue holds before the subscriber is\r\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\r\n/// is a subscriber problem, never a producer stall — the detached brain\r\n/// resumes from its cursor (the existing gapless-resume contract).\r\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\r\n\r\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\r\n/// either, but only a POISON (real write failure on the conn) cancels the\r\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum SeatFail {\r\n    /// The writer thread died on a failed conn write (the 15s bounded-write\r\n    /// poison class) — halt-at-first-failure already happened writer-side.\r\n    Poisoned,\r\n    /// The bounded queue is full — the subscriber cannot keep up.\r\n    Overflow,\r\n}\r\n\r\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\r\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\r\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\r\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\r\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\r\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\r\n///\r\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\r\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\r\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\r\n/// sender — the writer drains what it holds and exits.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\nstruct SubscriberSeat {\r\n    sub: SharedSend,\r\n    tx: std::sync::mpsc::SyncSender<Envelope>,\r\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\r\n    /// and a replacement may install (the no-reinstall-until-gone rule,\r\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\r\n    done: Arc<std::sync::atomic::AtomicBool>,\r\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\r\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\r\n}\r\n\r\nimpl SubscriberSeat {\r\n    /// Install a seat: spawn its writer thread and hand back the handle.\r\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\r\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\r\n    /// touching the live queue, so replay-then-live seq order holds by\r\n    /// construction even while producers enqueue concurrently. (Gate follow-\r\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\r\n    /// the mutex — a concurrent append could slot a live frame into the\r\n    /// middle of the replay and break the brain's strict gap check: the xfer\r\n    /// re-serve \"got seq 134 want 6\" CI red.)\r\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\r\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\r\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\r\n    /// a traffic-quiet stream where no producer enqueue would ever run\r\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\r\n    /// left the lease alive until the next append; the T4 forwarder starved).\r\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\r\n    /// displaced — is harmless by construction: every install mints a fresh\r\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn install(\r\n        sub: SharedSend,\r\n        replay: Vec<Envelope>,\r\n        lease: Option<Arc<StreamLease>>,\r\n    ) -> SubscriberSeat {\r\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\r\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let writer_sub = Arc::clone(&sub);\r\n        let writer_done = Arc::clone(&done);\r\n        let writer_poisoned = Arc::clone(&poisoned);\r\n        std::thread::spawn(move || {\r\n            let poison = |halt_reason: &str| {\r\n                writer_poisoned.store(true, Ordering::Release);\r\n                if let Some(l) = &lease {\r\n                    l.cancel();\r\n                }\r\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\r\n            };\r\n            // Replay first — halt at the first failed write (Amendment\r\n            // fix 2), never iterate past a poisoned conn.\r\n            for frame in replay {\r\n                if writer_sub.write(&frame).is_err() {\r\n                    poison(\"replay write failed\");\r","truncated":true,"truncatedBy":"lines","totalLines":2752,"totalBytes":5275,"outputLines":95,"outputBytes":5275,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// Max bytes pulled per stream read (one ring chunk).\r\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\r\n\r\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\r\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\r\n/// no newline is not speaking an NDJSON protocol — capture gives up\r\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\r\nconst OPENER_PIN_MAX: usize = 64 * 1024;\r\n\r\n/// How many frames a subscriber's writer queue holds before the subscriber is\r\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\r\n/// is a subscriber problem, never a producer stall — the detached brain\r\n/// resumes from its cursor (the existing gapless-resume contract).\r\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\r\n\r\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\r\n/// either, but only a POISON (real write failure on the conn) cancels the\r\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum SeatFail {\r\n    /// The writer thread died on a failed conn write (the 15s bounded-write\r\n    /// poison class) — halt-at-first-failure already happened writer-side.\r\n    Poisoned,\r\n    /// The bounded queue is full — the subscriber cannot keep up.\r\n    Overflow,\r\n}\r\n\r\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\r\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\r\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\r\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\r\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\r\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\r\n///\r\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\r\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\r\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\r\n/// sender — the writer drains what it holds and exits.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\nstruct SubscriberSeat {\r\n    sub: SharedSend,\r\n    tx: std::sync::mpsc::SyncSender<Envelope>,\r\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\r\n    /// and a replacement may install (the no-reinstall-until-gone rule,\r\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\r\n    done: Arc<std::sync::atomic::AtomicBool>,\r\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\r\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\r\n}\r\n\r\nimpl SubscriberSeat {\r\n    /// Install a seat: spawn its writer thread and hand back the handle.\r\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\r\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\r\n    /// touching the live queue, so replay-then-live seq order holds by\r\n    /// construction even while producers enqueue concurrently. (Gate follow-\r\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\r\n    /// the mutex — a concurrent append could slot a live frame into the\r\n    /// middle of the replay and break the brain's strict gap check: the xfer\r\n    /// re-serve \"got seq 134 want 6\" CI red.)\r\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\r\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\r\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\r\n    /// a traffic-quiet stream where no producer enqueue would ever run\r\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\r\n    /// left the lease alive until the next append; the T4 forwarder starved).\r\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\r\n    /// displaced — is harmless by construction: every install mints a fresh\r\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn install(\r\n        sub: SharedSend,\r\n        replay: Vec<Envelope>,\r\n        lease: Option<Arc<StreamLease>>,\r\n    ) -> SubscriberSeat {\r\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\r\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\r\n        let writer_sub = Arc::clone(&sub);\r\n        let writer_done = Arc::clone(&done);\r\n        let writer_poisoned = Arc::clone(&poisoned);\r\n        std::thread::spawn(move || {\r\n            let poison = |halt_reason: &str| {\r\n                writer_poisoned.store(true, Ordering::Release);\r\n                if let Some(l) = &lease {\r\n                    l.cancel();\r\n                }\r\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\r\n            };\r\n            // Replay first — halt at the first failed write (Amendment\r\n            // fix 2), never iterate past a poisoned conn.\r\n            for frame in replay {\r\n                if writer_sub.write(&frame).is_err() {\r\n                    poison(\"replay write failed\");\r\n…\n                }\n            }\n…\n        });\n…\n    }\n…\n}","startLine":114,"lineNumbers":[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,null,211,212,null,221,null,228,null,252]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":5275,"outputLines":95,"outputBytes":5275,"shownRange":{"start":114,"end":208},"nextOffset":209}}},"isError":false,"timestamp":1784271895814}}
{"type":"message","id":"a533fd8d","parentId":"e35e5cbd","timestamp":"2026-07-17T07:04:55.814Z","message":{"role":"toolResult","toolCallId":"call_pEvc7exvwpxpigiukdvtZpT3|fc_0fcf561150331aac016a59d41728408190b04f5224e1e048c1","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## nethost.rs\n 1185|            .worker_threads(2)\n*1186|            .thread_name(\"spt-broker-net\")\n 1187|            .enable_all()\n 1188|            .build()?;\n 1189|        let endpoint = runtime\n## conn.rs\n 448|        let dog = thread::Builder::new()\n*449|            .name(\"conn-watchdog\".into())\n 450|            .spawn(move || dog_inner.watchdog())\n 451|            .ok();\n 452|        BrokerConn { inner, dog }"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs, crates/spt-daemon/src/nethost.rs, crates/spt-daemon/src/conn.rs, crates/spt-term/src/reader.rs, crates/spt-daemon/src/translation.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":2,"fileCount":2,"files":["crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/conn.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/nethost.rs","count":1},{"path":"crates/spt-daemon/src/conn.rs","count":1}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## nethost.rs\n 1185│            .worker_threads(2)\n*1186│            .thread_name(\"spt-broker-net\")\n 1187│            .enable_all()\n 1188│            .build()?;\n 1189│        let endpoint = runtime\n## conn.rs\n 448│        let dog = thread::Builder::new()\n*449│            .name(\"conn-watchdog\".into())\n 450│            .spawn(move || dog_inner.watchdog())\n 451│            .ok();\n 452│        BrokerConn { inner, dog }"},"isError":false,"timestamp":1784271895814}}
{"type":"message","id":"2fb116fc","parentId":"a533fd8d","timestamp":"2026-07-17T07:05:00.800Z","message":{"role":"toolResult","toolCallId":"call_aNerdBmwDWp0HxONaUEkPeMw|fc_0fcf561150331aac016a59d4172824819089dc8507ce5d7522","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","fileCount":0,"files":[],"truncated":true,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"useless":true,"timestamp":1784271900799}}
{"type":"message","id":"f1b4f05b","parentId":"2fb116fc","timestamp":"2026-07-17T07:05:09.519Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Searching alternative log directory**"},{"type":"toolCall","id":"call_L8y4Z5neH1AGpYB0os1jnzYC|fc_0fcf561150331aac016a59d424e85c8190a347242ce965f5b5","name":"glob","arguments":{"i":"Checking default SPT logs","path":"C:/Users/decid/.spt/logs/daemon.stderr.log*","hidden":true,"gitignore":false,"limit":20}},{"type":"toolCall","id":"call_D2AehKH3CpfsLQpH6kfSxyAS|fc_0fcf561150331aac016a59d424e86c8190a456e825dfe3a454","name":"glob","arguments":{"i":"Checking config SPT logs","path":"C:/Users/decid/AppData/**/spt*/logs/daemon.stderr.log*","hidden":true,"gitignore":false,"limit":50}},{"type":"toolCall","id":"call_vsVMa0rYPUY3vDgnPn8Vp533|fc_0fcf561150331aac016a59d424e8748190a5d44e0194368300","name":"grep","arguments":{"i":"Locating default SPT home","pattern":"fn spt_home|SPT_HOME|\\.spt","path":"crates/spt-store/src/perch.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_RtK9YgwKw8Y24NBTaL9lLcP3|fc_0fcf561150331aac016a59d424e87c8190a1170b3ce682c704","name":"irc","arguments":{"i":"Updating parent census","op":"send","to":"Main","message":"Thread census source: only BrokerConn watchdog is explicitly named `conn-watchdog` (conn.rs:447-451). Broker accept handler is unnamed (broker.rs:2777-2797), SubscriberSeat writer unnamed (nethost.rs:189-225), session controller/viewer/input/waiter/drain/translation threads all unnamed. Tokio network contributes exactly 2 named `spt-broker-net` workers (nethost.rs:1183-1188). Investigating live log conn-ID freshness/count now.","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":6884,"output":365,"cacheRead":87552,"cacheWrite":0,"totalTokens":94801,"reasoningTokens":25,"cost":{"input":0.034420000000000006,"output":0.01095,"cacheRead":0.043775999999999995,"cacheWrite":0,"total":0.089146}},"stopReason":"toolUse","timestamp":1784271900813,"responseId":"resp_0fcf561150331aac016a59d41d16bc819085c93ab6a8682635","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d41e2d888190a7502f4f94c57e55","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdQkxwU6Z9QweijBPxEv5BEMUkLvJdgNKLG3g3EuMgtx5JZ_MZFCDkP93S2gAQMl4MOgatE6xUKb9vCfF5IiR6Rz6gDSA3B0omjFWcsMiglahNoq4Zfyj1Wp8Rhs-snlfVh1g7--5WtXDHgw8VA1vB9-Si9985aiF9I7ZF3uttTi8q0MMk8JAgn2OeBqvUnA0OwRmGJsS4nPhxuRITPWObbPDPVyeTRM_ZgxUPnjTEyIFOktuavcnEUwLTRqqGbi8CFKNuZTwYh4lvXHaFHH55MuB4iYW_SNNrrs9FTeo2uCq694i6xPKY9xfIgtZcnAPtFGlRvf_uCiD-aXdM9Rs2FzgMYdxiCzXp1bkkyRlgVbLGGiSaF8XMWbuYhBvXdqo3s1EazPNSrUN6d5XHXyVJVmj5SkTE8RRCwUb4in6Dbl05rgKP17aVwptIvpQ07qN4pyY8JRHjrFwIumo2JfhC1b1yNE2Af0XY9ZzOaLsTpGwpuprE5uNxrdDlTPb1_ltZKey-ol8TuX-RIEPmMMIs41i31Ha98Cfd0uWWTriNzdCSlZsDDVpfc1C-NrmBtl36Wvx66zqg-c6Z-6X8DWMaHxqBB25sL2zhqoPzyMV_DeD3Vt2HGOKxHmkda0p2YC9s4nQE8M74PyjzgAT0ZLaDKVul6_arrQ8YIHeGVWWzlZj6cVCw8QGYbNEXYglDOPCpxH848gcfBqVCv5lm_YvQM1-CZuHlqrjXsK2RvLBD7PyUgZaX0fNdhXC8IyY7lAgG__-TWQqPN9AWF6vpgYeMGCnNmlFamVRD1-rFkSdfhxwRWaygUi5HoPRYozb7wv_ggRjN5OLfUS31jhEfVn-tGxiE0iq33H3-skqhpzPmIZ9LlIsD1H4H1UH-SrcFSaKNXn_GBp0VZwFKknOMRFEN2R3t5dkM0_XsnE2ay5LDZZ29l-3W6caZUQgotXVjurJ9QeMS3ZOFjca06wzE93f4sp400XFH2r9_hYHZmoroUNS9yE20B_KQxXj2hbWEEkE0dCzOEJnQeflLeIIzpvrKHiIQ==","summary":[{"type":"summary_text","text":"**Searching alternative log directory**"}]},{"id":"fc_0fcf561150331aac016a59d424e85c8190a347242ce965f5b5","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking default SPT logs\",\"path\":\"C:/Users/decid/.spt/logs/daemon.stderr.log*\",\"hidden\":true,\"gitignore\":false,\"limit\":20}","call_id":"call_L8y4Z5neH1AGpYB0os1jnzYC","name":"glob"},{"id":"fc_0fcf561150331aac016a59d424e86c8190a456e825dfe3a454","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking config SPT logs\",\"path\":\"C:/Users/decid/AppData/**/spt*/logs/daemon.stderr.log*\",\"hidden\":true,\"gitignore\":false,\"limit\":50}","call_id":"call_D2AehKH3CpfsLQpH6kfSxyAS","name":"glob"},{"id":"fc_0fcf561150331aac016a59d424e8748190a5d44e0194368300","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating default SPT home\",\"pattern\":\"fn spt_home|SPT_HOME|\\\\.spt\",\"path\":\"crates/spt-store/src/perch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_vsVMa0rYPUY3vDgnPn8Vp533","name":"grep"},{"id":"fc_0fcf561150331aac016a59d424e87c8190a1170b3ce682c704","type":"function_call","status":"completed","arguments":"{\"i\":\"Updating parent census\",\"op\":\"send\",\"to\":\"Main\",\"message\":\"Thread census source: only BrokerConn watchdog is explicitly named `conn-watchdog` (conn.rs:447-451). Broker accept handler is unnamed (broker.rs:2777-2797), SubscriberSeat writer unnamed (nethost.rs:189-225), session controller/viewer/input/waiter/drain/translation threads all unnamed. Tokio network contributes exactly 2 named `spt-broker-net` workers (nethost.rs:1183-1188). Investigating live log conn-ID freshness/count now.\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_RtK9YgwKw8Y24NBTaL9lLcP3","name":"irc"}]},"duration":8704.853300005198,"ttft":1378.041400000453,"contextSnapshot":{"promptTokens":94436,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_L8y4Z5neH1AGpYB0os1jnzYC|fc_0fcf561150331aac016a59d424e85c8190a347242ce965f5b5","toolName":"glob","startedAt":"2026-07-17T07:05:09.519Z","args":{"path":"C:/Users/decid/.spt/logs/daemon.stderr.log*"},"intent":"Checking default SPT logs"},"id":"e976b3f5","parentId":"f1b4f05b","timestamp":"2026-07-17T07:05:09.519Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_D2AehKH3CpfsLQpH6kfSxyAS|fc_0fcf561150331aac016a59d424e86c8190a456e825dfe3a454","toolName":"glob","startedAt":"2026-07-17T07:05:09.520Z","args":{"path":"C:/Users/decid/AppData/**/spt*/logs/daemon.stderr.log*"},"intent":"Checking config SPT logs"},"id":"752f76d6","parentId":"e976b3f5","timestamp":"2026-07-17T07:05:09.520Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_vsVMa0rYPUY3vDgnPn8Vp533|fc_0fcf561150331aac016a59d424e8748190a5d44e0194368300","toolName":"grep","startedAt":"2026-07-17T07:05:09.520Z","args":{"path":"crates/spt-store/src/perch.rs"},"intent":"Locating default SPT home"},"id":"98f2e112","parentId":"752f76d6","timestamp":"2026-07-17T07:05:09.520Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_RtK9YgwKw8Y24NBTaL9lLcP3|fc_0fcf561150331aac016a59d424e87c8190a1170b3ce682c704","toolName":"irc","startedAt":"2026-07-17T07:05:09.520Z","intent":"Updating parent census"},"id":"134aae55","parentId":"98f2e112","timestamp":"2026-07-17T07:05:09.520Z"}
{"type":"message","id":"35cc258c","parentId":"134aae55","timestamp":"2026-07-17T07:05:09.520Z","message":{"role":"toolResult","toolCallId":"call_RtK9YgwKw8Y24NBTaL9lLcP3|fc_0fcf561150331aac016a59d424e87c8190a1170b3ce682c704","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- Main: injected"}],"details":{"op":"send","from":"BrokerCpuRca","to":"Main","receipts":[{"to":"Main","outcome":"injected"}]},"isError":false,"timestamp":1784271909520}}
{"type":"message","id":"e79c4ca9","parentId":"35cc258c","timestamp":"2026-07-17T07:05:09.523Z","message":{"role":"toolResult","toolCallId":"call_L8y4Z5neH1AGpYB0os1jnzYC|fc_0fcf561150331aac016a59d424e85c8190a347242ce965f5b5","toolName":"glob","content":[{"type":"text","text":"Path not found: C:/Users/decid/.spt/logs"}],"details":{},"isError":true,"timestamp":1784271909523}}
{"type":"message","id":"ff243e02","parentId":"e79c4ca9","timestamp":"2026-07-17T07:05:09.525Z","message":{"role":"toolResult","toolCallId":"call_vsVMa0rYPUY3vDgnPn8Vp533|fc_0fcf561150331aac016a59d424e8748190a5d44e0194368300","toolName":"grep","content":[{"type":"text","text":" 23|\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 31|/// full parity with modern spt this may simply stay `spt-core/` for good; the\n*32|/// override (`$SPT_HOME`) is the relocation knob either way.\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 38|        }\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 495|            let lock = ENV_LOCK.lock().unwrap_or_else(|e| e.into_inner());\n*496|            let prev = std::env::var(\"SPT_HOME\").ok();\n*497|            std::env::set_var(\"SPT_HOME\", tmp);\n 498|            EnvGuard { _lock: lock, prev }\n 499|        }\n 500|    }\n...\n 503|            match &self.prev {\n*504|                Some(v) => std::env::set_var(\"SPT_HOME\", v),\n*505|                None => std::env::remove_var(\"SPT_HOME\"),\n 506|            }\n 507|        }\n 508|    }\n...\n 683|\n*684|    // [unit->REQ-HAZARD-SINGLE-PATH-SOURCE] spt_home is pure: honors SPT_HOME,\n 685|    // creates nothing.\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/perch.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\perch.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":12,"fileCount":1,"files":["crates/spt-store/src/perch.rs"],"fileMatches":[{"path":"crates/spt-store/src/perch.rs","count":12}],"truncated":false,"displayContent":"  23│\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  31│/// full parity with modern spt this may simply stay `spt-core/` for good; the\n *32│/// override (`$SPT_HOME`) is the relocation knob either way.\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  38│        }\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 495│            let lock = ENV_LOCK.lock().unwrap_or_else(|e| e.into_inner());\n*496│            let prev = std::env::var(\"SPT_HOME\").ok();\n*497│            std::env::set_var(\"SPT_HOME\", tmp);\n 498│            EnvGuard { _lock: lock, prev }\n 499│        }\n 500│    }\n    │...\n 503│            match &self.prev {\n*504│                Some(v) => std::env::set_var(\"SPT_HOME\", v),\n*505│                None => std::env::remove_var(\"SPT_HOME\"),\n 506│            }\n 507│        }\n 508│    }\n    │...\n 683│\n*684│    // [unit->REQ-HAZARD-SINGLE-PATH-SOURCE] spt_home is pure: honors SPT_HOME,\n 685│    // creates nothing.\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":1784271909525}}
{"type":"message","id":"8ebc9c2a","parentId":"ff243e02","timestamp":"2026-07-17T07:05:14.525Z","message":{"role":"toolResult","toolCallId":"call_D2AehKH3CpfsLQpH6kfSxyAS|fc_0fcf561150331aac016a59d424e86c8190a456e825dfe3a454","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/AppData","fileCount":0,"files":[],"truncated":true,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"useless":true,"timestamp":1784271914525}}
{"type":"message","id":"b81d8604","parentId":"8ebc9c2a","timestamp":"2026-07-17T07:05:28.155Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":""},{"type":"toolCall","id":"call_WcpVK8dlLDClxGPHbljRTTu5|fc_0fcf561150331aac016a59d4380f94819097deb97d2a20524b","name":"read","arguments":{"i":"Reading Windows home derivation","path":"crates/spt-store/src/perch.rs","selector":"20-63"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":4823,"output":52,"cacheRead":90624,"cacheWrite":0,"totalTokens":95499,"reasoningTokens":11,"cost":{"input":0.024115,"output":0.00156,"cacheRead":0.045312,"cacheWrite":0,"total":0.070987}},"stopReason":"toolUse","timestamp":1784271914571,"responseId":"resp_0fcf561150331aac016a59d42adc088190ac21d2a3476bb4ad","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d42c69f8819091419c9d19d7976f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdQ4em0r1TdlGWLFnn-5Vtb6JnT2Xi8UskfKCPr5mQ3empMrXy3fD2UzI-FxlN6Pkv0drIXXniFuuZL7C9qmwLqSqHWIIYeB8KTqk5JqrTnvvlflPf-gPBAQynDgRoeqDmSaQV911S5X_6FOstAHuZ5mocFhPX8HCqRo54Z5sxlMRBF6VcM_d9kiEYNEegPWPotYQ98F3MRMr3bH7dfqdTVpb1IPseQVWqpTZb5tSYlrFXAi686iOrNyMrqH5B_Aienmmdw9IwC-VSLi_rTmCcP9OqeTXXev19Ozsmi-_IPYqeRG0wwt452onh7e_8CdoW4ie0Fv9D-v1nfT9qvXcOJZMZhoU5nIOfcdmfgG0ALGnYAUAavSH43EA7h-vvSmBIt2HOCnxF4_uE3bB6xdSxcru1xeSufNpJ72ensjBlLGo8roFyq8GDX9Sul0HBTSoq3YEHGXXEWOfhTlcdqRzxl30iVyafCwsKcvUcT84wCUWmr6-sfTmVdqZG6-AFJjt6lsj8zo34VyO1CKFL0EloXIejrLt-4UNPJ9-ujMlCKExmAJGeH6TEmGJ2qg1w0_q0Nn4wlwBoK2Bpt_gsZMc3KL0lTbcsRC6VLeFgDtfnKbNBBopiut-LD8V7Z61rAJd6CJ99kfgf4ZmtoHRdahQYevOBkJfdW7fB9hTR7iVnldjBN9zf9rl1pOKX8aLZtGVx9mvIG3bFRfWetiFgVU6CmtNeHTQjzKz_4mqrUxgzkCDVZ4Who9OILRp8KZrsjnOCBw4LPp-pfgBHx-ntND36POgEQbtr9CKSwl6L-jLSUBMuPdjOKuEegVYqT0yOE3435Uxfd6b4Fcet2H9rbN48-UoZFAVaarvIry9HLZBg1fnjBlyBsFc49jwHtvUEIgrp9YK77qwUJxXxONCrNojOhpQZDWwV_gxvrgAAk5kk5r0ElsgozMS98-h7dOcCTRFSi_","summary":[]},{"id":"fc_0fcf561150331aac016a59d4380f94819097deb97d2a20524b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading Windows home derivation\",\"path\":\"crates/spt-store/src/perch.rs\",\"selector\":\"20-63\"}","call_id":"call_WcpVK8dlLDClxGPHbljRTTu5","name":"read"}]},"duration":13582.775900006294,"ttft":1862.4483000040054,"contextSnapshot":{"promptTokens":95447,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_WcpVK8dlLDClxGPHbljRTTu5|fc_0fcf561150331aac016a59d4380f94819097deb97d2a20524b","toolName":"read","startedAt":"2026-07-17T07:05:28.155Z","args":{"path":"crates/spt-store/src/perch.rs"},"intent":"Reading Windows home derivation"},"id":"fbef14bc","parentId":"b81d8604","timestamp":"2026-07-17T07:05:28.155Z"}
{"type":"message","id":"e89570d5","parentId":"fbef14bc","timestamp":"2026-07-17T07:05:28.165Z","message":{"role":"toolResult","toolCallId":"call_WcpVK8dlLDClxGPHbljRTTu5|fc_0fcf561150331aac016a59d4380f94819097deb97d2a20524b","toolName":"read","content":[{"type":"text","text":"//! The single `nested/` namespace holds both Psyche and Worker children — no\n//! divergent sibling layouts (the hazard this module exists to prevent).\n\nuse std::path::{Path, PathBuf};\n\n/// Root of all spt-core on-disk state. Honors `$SPT_HOME`, else the platform\n/// default (`%LOCALAPPDATA%\\spt-core` on Windows, `$HOME/.spt-core` on Unix).\n/// **Pure** — reads env, composes a path, creates nothing.\n///\n/// The default lives under `spt-core/`, **deliberately distinct from the modern\n/// spt runtime's `spt/` home**, so a dev build never collides with a running\n/// spt-plugin during the parity build-out. Once spt-core + the spt-plugin reach\n/// full parity with modern spt this may simply stay `spt-core/` for good; the\n/// override (`$SPT_HOME`) is the relocation knob either way.\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\npub fn spt_home() -> PathBuf {\n    if let Ok(over) = std::env::var(\"SPT_HOME\") {\n        if !over.is_empty() {\n            return PathBuf::from(over);\n        }\n    }\n    platform_default_spt_home()\n}\n\n#[cfg(windows)]\nfn platform_default_spt_home() -> PathBuf {\n    if let Ok(local) = std::env::var(\"LOCALAPPDATA\") {\n        if !local.is_empty() {\n            return PathBuf::from(local).join(\"spt-core\");\n        }\n    }\n    let up =\n        std::env::var(\"USERPROFILE\").expect(\"LOCALAPPDATA or USERPROFILE must be set on Windows\");\n    PathBuf::from(up)\n        .join(\"AppData\")\n        .join(\"Local\")\n        .join(\"spt-core\")\n}\n\n#[cfg(unix)]\nfn platform_default_spt_home() -> PathBuf {\n    let home = std::env::var(\"HOME\").expect(\"HOME must be set on Unix\");\n    PathBuf::from(home).join(\".spt-core\")\n}\n\n/// The owlery directory holding all perches: `<spt_home>/owlery/`.\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\npub fn owlery_dir() -> PathBuf {\n…\n}\n\n[Showing lines 19-66 of 695. Use :67 to continue]"}],"details":{"truncation":{"content":"//! The single `nested/` namespace holds both Psyche and Worker children — no\r\n//! divergent sibling layouts (the hazard this module exists to prevent).\r\n\r\nuse std::path::{Path, PathBuf};\r\n\r\n/// Root of all spt-core on-disk state. Honors `$SPT_HOME`, else the platform\r\n/// default (`%LOCALAPPDATA%\\spt-core` on Windows, `$HOME/.spt-core` on Unix).\r\n/// **Pure** — reads env, composes a path, creates nothing.\r\n///\r\n/// The default lives under `spt-core/`, **deliberately distinct from the modern\r\n/// spt runtime's `spt/` home**, so a dev build never collides with a running\r\n/// spt-plugin during the parity build-out. Once spt-core + the spt-plugin reach\r\n/// full parity with modern spt this may simply stay `spt-core/` for good; the\r\n/// override (`$SPT_HOME`) is the relocation knob either way.\r\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\r\npub fn spt_home() -> PathBuf {\r\n    if let Ok(over) = std::env::var(\"SPT_HOME\") {\r\n        if !over.is_empty() {\r\n            return PathBuf::from(over);\r\n        }\r\n    }\r\n    platform_default_spt_home()\r\n}\r\n\r\n#[cfg(windows)]\r\nfn platform_default_spt_home() -> PathBuf {\r\n    if let Ok(local) = std::env::var(\"LOCALAPPDATA\") {\r\n        if !local.is_empty() {\r\n            return PathBuf::from(local).join(\"spt-core\");\r\n        }\r\n    }\r\n    let up =\r\n        std::env::var(\"USERPROFILE\").expect(\"LOCALAPPDATA or USERPROFILE must be set on Windows\");\r\n    PathBuf::from(up)\r\n        .join(\"AppData\")\r\n        .join(\"Local\")\r\n        .join(\"spt-core\")\r\n}\r\n\r\n#[cfg(unix)]\r\nfn platform_default_spt_home() -> PathBuf {\r\n    let home = std::env::var(\"HOME\").expect(\"HOME must be set on Unix\");\r\n    PathBuf::from(home).join(\".spt-core\")\r\n}\r\n\r\n/// The owlery directory holding all perches: `<spt_home>/owlery/`.\r\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\r\npub fn owlery_dir() -> PathBuf {\r","truncated":true,"truncatedBy":"lines","totalLines":677,"totalBytes":1830,"outputLines":48,"outputBytes":1830,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! The single `nested/` namespace holds both Psyche and Worker children — no\r\n//! divergent sibling layouts (the hazard this module exists to prevent).\r\n\r\nuse std::path::{Path, PathBuf};\r\n\r\n/// Root of all spt-core on-disk state. Honors `$SPT_HOME`, else the platform\r\n/// default (`%LOCALAPPDATA%\\spt-core` on Windows, `$HOME/.spt-core` on Unix).\r\n/// **Pure** — reads env, composes a path, creates nothing.\r\n///\r\n/// The default lives under `spt-core/`, **deliberately distinct from the modern\r\n/// spt runtime's `spt/` home**, so a dev build never collides with a running\r\n/// spt-plugin during the parity build-out. Once spt-core + the spt-plugin reach\r\n/// full parity with modern spt this may simply stay `spt-core/` for good; the\r\n/// override (`$SPT_HOME`) is the relocation knob either way.\r\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\r\npub fn spt_home() -> PathBuf {\r\n    if let Ok(over) = std::env::var(\"SPT_HOME\") {\r\n        if !over.is_empty() {\r\n            return PathBuf::from(over);\r\n        }\r\n    }\r\n    platform_default_spt_home()\r\n}\r\n\r\n#[cfg(windows)]\r\nfn platform_default_spt_home() -> PathBuf {\r\n    if let Ok(local) = std::env::var(\"LOCALAPPDATA\") {\r\n        if !local.is_empty() {\r\n            return PathBuf::from(local).join(\"spt-core\");\r\n        }\r\n    }\r\n    let up =\r\n        std::env::var(\"USERPROFILE\").expect(\"LOCALAPPDATA or USERPROFILE must be set on Windows\");\r\n    PathBuf::from(up)\r\n        .join(\"AppData\")\r\n        .join(\"Local\")\r\n        .join(\"spt-core\")\r\n}\r\n\r\n#[cfg(unix)]\r\nfn platform_default_spt_home() -> PathBuf {\r\n    let home = std::env::var(\"HOME\").expect(\"HOME must be set on Unix\");\r\n    PathBuf::from(home).join(\".spt-core\")\r\n}\r\n\r\n/// The owlery directory holding all perches: `<spt_home>/owlery/`.\r\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\r\npub fn owlery_dir() -> PathBuf {\r\n…\n}","startLine":19,"lineNumbers":[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,null,68]},"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":1830,"outputLines":48,"outputBytes":1830,"shownRange":{"start":19,"end":66},"nextOffset":67}}},"isError":false,"timestamp":1784271928164}}
{"type":"message","id":"1db3381a","parentId":"e89570d5","timestamp":"2026-07-17T07:05:33.856Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Deciding to use exact matching**"},{"type":"toolCall","id":"call_MawDxQ0uspROSPxLDzDOhLJP|fc_0fcf561150331aac016a59d43d36fc81908056bfc3db2b9dd0","name":"glob","arguments":{"i":"Checking default live log","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log*","hidden":true,"gitignore":false,"limit":20}},{"type":"toolCall","id":"call_s6TRLEimYY2xIugzPAdCqvqD|fc_0fcf561150331aac016a59d43d3714819099a08e0695f9fb3d","name":"read","arguments":{"i":"Listing SPT state root","path":"C:/Users/decid/AppData/Local/spt-core","selector":null}},{"type":"toolCall","id":"call_6ErebHfruWadnXsES4T8LSju|fc_0fcf561150331aac016a59d43d371c819097658747ab1d9af9","name":"glob","arguments":{"i":"Checking alternate live home","path":"C:/Users/decid/AppData/Local/spt/logs/daemon.stderr.log*","hidden":true,"gitignore":false,"limit":20}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":4367,"output":169,"cacheRead":91648,"cacheWrite":0,"totalTokens":96184,"reasoningTokens":7,"cost":{"input":0.021835,"output":0.00507,"cacheRead":0.045824,"cacheWrite":0,"total":0.07272899999999999}},"stopReason":"toolUse","timestamp":1784271928219,"responseId":"resp_0fcf561150331aac016a59d43887b081909cfe75e940d6a197","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d43a077c8190b787b2e11a84214f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdQ9-Nd_Zh5NDlrW4sQVw0yHr2Azcwf3p8R6dY1AmzIavKoMMFPljB4oFD1IJMvQ8A1CJfrkFmU7nz5HO3QA71sl92lBwdPTxSUpDtpqJ6S8HkA4qUskXeWEpzV_SwJrq5D0S9ZvHaylnPrdf5hdcqWnscotkVHQXU1BJiUfGmtezvPEoGp9u4tmtEhfliENv7rErWc_eRbZsk5qh3Q-qxWF_jy9tj-twtduUyOLI0_DX_C-xP7vJ6qO0y3kXgW0gC4FJUXgwZic0KK4OEWQmyv4876YA2WvXSKYp7OC3gyzDqnRv3PzJ2coCs5lX-zRExTx2bi2NE0OgMpUrqfCBmX2WV0xjstXPJZ9dDxxre_qH3feJIswUKB6KNnKon9SjSMtPl_sjcG8D52lAzCPuKB7b6CaXDZ-BP1X1ENECh42BPSrRKX7TmPHy7DjDnwDD0hLUbkUfk9af07eFgc_CYD3TjvRBfyaZSZ5svZRd5C0rn1sMlo_Ip30nyukv6uPyC7qRnDrVUpjrS_Eq0O2WBejncwbi9yBlWOOWLGtrTglzCfCjK_AwG_9WEO9u3uewaBu8x0d2lqX6MNt9XvK1FHOh59LFf3ilV7glO4MGXWhbLu1d7pqdXlCX0QuH_95Wy8o1tAKqneyaiu8Y2yJJAXZyACmtfB4x2-Lj3ATR1wMTT8D5Mrwu5MnNg-YfVTZ2ai-ZwHVKefLhvfEr8GHeqZDVD363Ja4F24glcQKYu_oMk7_bPAeGoleLILD2k0WFmhowa_b4EsIIosMuVcf4AN5LB7o58yRu5Jf0TuaVK2dwN2YBHqwe-gO6uLHM5b2BmfleiqkTRBi8JLvbhERLoeGJfV1-pEOwJQiNoBp1oMK5ED7REHKP6rDJRHX8KTCWglLA64xFtmsWqsEYC-vuHO3t_RO5GSHeoCex1Ph-ppmiLc=","summary":[{"type":"summary_text","text":"**Deciding to use exact matching**"}]},{"id":"fc_0fcf561150331aac016a59d43d36fc81908056bfc3db2b9dd0","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking default live log\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log*\",\"hidden\":true,\"gitignore\":false,\"limit\":20}","call_id":"call_MawDxQ0uspROSPxLDzDOhLJP","name":"glob"},{"id":"fc_0fcf561150331aac016a59d43d3714819099a08e0695f9fb3d","type":"function_call","status":"completed","arguments":"{\"i\":\"Listing SPT state root\",\"path\":\"C:/Users/decid/AppData/Local/spt-core\",\"selector\":null}","call_id":"call_s6TRLEimYY2xIugzPAdCqvqD","name":"read"},{"id":"fc_0fcf561150331aac016a59d43d371c819097658747ab1d9af9","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking alternate live home\",\"path\":\"C:/Users/decid/AppData/Local/spt/logs/daemon.stderr.log*\",\"hidden\":true,\"gitignore\":false,\"limit\":20}","call_id":"call_6ErebHfruWadnXsES4T8LSju","name":"glob"}]},"duration":5635.402500003576,"ttft":1825.082800000906,"contextSnapshot":{"promptTokens":96015,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_MawDxQ0uspROSPxLDzDOhLJP|fc_0fcf561150331aac016a59d43d36fc81908056bfc3db2b9dd0","toolName":"glob","startedAt":"2026-07-17T07:05:33.856Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log*"},"intent":"Checking default live log"},"id":"cd268c69","parentId":"1db3381a","timestamp":"2026-07-17T07:05:33.856Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_s6TRLEimYY2xIugzPAdCqvqD|fc_0fcf561150331aac016a59d43d3714819099a08e0695f9fb3d","toolName":"read","startedAt":"2026-07-17T07:05:33.856Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core"},"intent":"Listing SPT state root"},"id":"8b3aa758","parentId":"cd268c69","timestamp":"2026-07-17T07:05:33.856Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_6ErebHfruWadnXsES4T8LSju|fc_0fcf561150331aac016a59d43d371c819097658747ab1d9af9","toolName":"glob","startedAt":"2026-07-17T07:05:33.857Z","args":{"path":"C:/Users/decid/AppData/Local/spt/logs/daemon.stderr.log*"},"intent":"Checking alternate live home"},"id":"9a31d3ef","parentId":"8b3aa758","timestamp":"2026-07-17T07:05:33.857Z"}
{"type":"message","id":"a947bc56","parentId":"9a31d3ef","timestamp":"2026-07-17T07:05:33.858Z","message":{"role":"toolResult","toolCallId":"call_6ErebHfruWadnXsES4T8LSju|fc_0fcf561150331aac016a59d43d371c819097658747ab1d9af9","toolName":"glob","content":[{"type":"text","text":"Path not found: C:/Users/decid/AppData/Local/spt/logs"}],"details":{},"isError":true,"timestamp":1784271933857}}
{"type":"message","id":"a585ecdb","parentId":"a947bc56","timestamp":"2026-07-17T07:05:33.858Z","message":{"role":"toolResult","toolCallId":"call_MawDxQ0uspROSPxLDzDOhLJP|fc_0fcf561150331aac016a59d43d36fc81908056bfc3db2b9dd0","toolName":"glob","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/logs/\ndaemon.stderr.log\ndaemon.stderr.log.1"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs","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"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784271933858}}
{"type":"message","id":"5d88f6e2","parentId":"a585ecdb","timestamp":"2026-07-17T07:05:33.862Z","message":{"role":"toolResult","toolCallId":"call_s6TRLEimYY2xIugzPAdCqvqD|fc_0fcf561150331aac016a59d43d3714819099a08e0695f9fb3d","toolName":"read","content":[{"type":"text","text":".\n  - brain.ready\n  - owlery/                                                       just now\n    - hertz/\n    - mobile-gw/\n    - lia/                                                        just now\n    - webbie/                                                     just now\n    - doyle/                                                      just now\n    - deployah/                                                   just now\n    - todlando/                                                   1h ago\n    - chert/                                                      1h ago\n    - perri/                                                      1h ago\n    - .registry                                         12.0KB    1h ago\n    - gaki-normal-probe/                                          16h ago\n    - … 16 more\n    - sptc-diag-2/                                                3w ago\n  - identity/                                                     just now\n    - registry/                                                   just now\n    - pump-health.json                                  766B      just now\n    - pump-heartbeat.json                               13B       just now\n    - epoch                                             6B        just now\n    - roster.json                                       10.0KB    just now\n    - peer-addrs.json                                   4.0KB     just now\n    - pump-ops.json                                     5B        just now\n    - notifs.db                                         52.0KB    1h ago\n    - attachment.json                                   20B       1h ago\n    - cli-ops.json                                      3B        1h ago\n    - visibility.json                                   2.8KB     7h ago\n    - … 8 more\n    - node.key                                          64B       1mo ago\n  - daemon-effects.log                                  1.3MB     just now\n  - index/                                                        4m ago\n    - project-index-stats.json                          396B      4m ago\n    - project-index.json                                5.8KB     4m ago\n    - invalidations/                                              4m ago\n  - deadline-e5b62b57-69a0-452c-9c7e-cd3708186344.json  46B       1h ago\n  - deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json  46B       1h ago\n  - deadline-9183c374-ac41-4e0a-b478-a8b19f32f855.json  46B       1h ago\n  - deadline-89cc9038-e5d9-429e-b4a9-40fba8af71ee.json  46B       1h ago\n  - daemon.pid                                          5B        1h ago\n  - docs/                                                         1h ago\n    - .nojekyll                                         72B       1h ago\n    - 404.html                                          19.2KB    1h ago\n    - ayu-highlight-3fdfc3ac.css                        907B      1h ago\n    - book-c22b7243.js                                  29.8KB    1h ago\n    - cli/                                                        1h ago\n    - clipboard-1626706a.min.js                         10.5KB    1h ago\n    - concepts/                                                   1h ago\n    - css/                                                        1h ago\n    - elasticlunr-ef4e11c1.min.js                       17.6KB    1h ago\n    - favicon-8114d1fc.png                              5.5KB     1h ago\n    - favicon-de23e50b.svg                              1.8KB     1h ago\n    - … 26 more\n    - tomorrow-night-4c0ae647.css                       1.7KB     1h ago\n  - releases/                                                     1h ago\n    - last-outcome.json                                 21B       1h ago\n    - applied.json                                      14B       1h ago\n    - applied-state.json                                32B       1h ago\n    - artifacts/                                                  1h ago\n    - release.json                                      1.1KB     1h ago\n  - logs/                                                         1h ago\n    - daemon.stderr.log                                 5.2MB     just now\n    - daemon.stderr.log.1                               7.4MB     1h ago\n  - bin/                                                          1h ago\n    - spt.exe                                           30.6MB    1h ago\n    - spt.exe.old-63                                    30.6MB    5h ago\n    - spt.exe.old-62                                    30.6MB    16h ago\n    - spt.exe.old-61                                    30.6MB    21h 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    6d 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    - spt.exe.old-54                                    29.8MB    1w ago\n    - … 17 more\n    - spt.exe.old-32                                    28.5MB    3w ago\n  - daemon.json                                         651B      5h ago\n  - deadline-fc582bea-2d15-4077-b21a-086cbcbe3cee.json  46B       5h ago\n  - recent_home                                         14B       7h ago\n  - recent_home_projects/                                         7h ago\n    - github-com-bigscreenvr-website                    6B        7h ago\n    - github-com-bigscreenvr-spt-bs-core                7B        19h ago\n    - github-com-bigscreenvr-omp-spt                    7B        1d ago\n    - github-com-sabermage-claude-spt                   7B        6d ago\n    - github-com-sabermage-spt-core                     7B        6d 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       10h ago\n  - deadline-bf353802-556c-46ce-9865-e74a3092bbe9.json  46B       10h ago\n  - deadline-9e0df17e-f217-4446-97a4-f528a56024ba.json  46B       16h ago\n  - deadline-7818eabc-d26c-4a0b-965c-b600016f1cea.json  46B       16h ago\n  - deadline-e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b.json  46B       16h ago\n  - deadline-c1427211-6e8d-4571-aeb8-30d36fa816a6.json  46B       21h ago\n  - deadline-6389a46d-930f-4662-b560-293532307149.json  46B       21h ago\n  - deadline-cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde.json  46B       21h 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       1d ago\n  - deadline-019f6560-0096-7000-b53f-7ab1ea3d2bcf.json  46B       1d ago\n  - deadline-3d75265c-0071-44a0-98fa-3d748c66b87f.json  46B       1d ago\n  - deadline-1fae2b4c-9daf-44fc-afe5-06c410ac69b8.json  46B       1d 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       6d ago\n  - deadline-0d3ec7f7-e517-4bf7-8016-4f422d4e8d7d.json  46B       6d ago\n  - deadline-26c49822-00bc-4abe-8be2-91f44b9e4fea.json  46B       6d ago\n  - deadline-6cf22920-8f60-4a09-9b8d-7d46280f9a8c.json  46B       6d ago\n  - deadline-6a623999-3605-40e4-8991-c27d0467ffc0.json  46B       6d ago\n  - deadline-feec8b93-34d3-41da-b2cc-6874150e6916.json  46B       6d ago\n  - deadline-0fe6cad5-3efb-4ced-8031-d9a41e22ff81.json  46B       6d ago\n  - deadline-a54257af-8b81-456c-ba38-85739f7f10e9.json  46B       6d ago\n  - deadline-50b0fc81-455e-4b65-8e93-f7400599c6c6.json  46B       6d 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/                                                 19h ago\n    - _github/                                                    19h ago\n    - omp-spt/                                                    1d 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/                                                   6h ago\n    - agents/                                                     7h ago\n    - .seed.git/                                                  21h 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       1w ago\n  - deadline-357331ba-1d9b-4bcb-9a83-1b5e394501a3.json  46B       1w ago\n  - deadline-0893ef24-9c92-4923-86c3-80bef883c917.json  46B       1w ago\n  - deadline-256a16b0-2c32-4f8a-83f7-4b52fc5ade8b.json  46B       1w ago\n  - deadline-bc89bb13-5e82-4ede-8438-7163669fc409.json  46B       1w ago\n  - deadline-830359e9-78c0-4242-b42c-184f73ee4bee.json  46B       1w ago\n  - deadline-46fa9ef6-2a28-4bb1-bf1b-c092a80e9334.json  46B       1w 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       3w ago\n  - deadline-e187968c-fce7-432c-8b57-e74e85e3da0f.json  46B       3w ago\n  - deadline-ad2d8b5c-3705-4228-b6c3-cf3f71c4312e.json  46B       3w ago\n  - deadline-47eca31b-1f52-4bd4-bf2d-c0ab8867aa7d.json  46B       3w ago\n  - deadline-2c091e21-d254-4a19-a1f5-5c08f643ce9a.json  46B       3w ago\n  - deadline-b4692448-61d3-42cd-b32f-e9fd800ba10c.json  46B       3w 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       4w ago\n  - deadline-sptc-v091-live-sess.json                   46B       4w ago\n  - deadline-rt-14188-sess.json                         46B       4w ago\n  - deadline-rt-102212-sess.json                        46B       4w ago\n  - deadline-2799e403-40ce-49e3-be61-e3f1ad0355ac.json  46B       4w 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":1784271933862}}
{"type":"message","id":"96c3c903","parentId":"5d88f6e2","timestamp":"2026-07-17T07:05:42.792Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Grep live logs by PID and lifecycle**"},{"type":"toolCall","id":"call_MUgkCfKr7kxBYeL6jx4ANero|fc_0fcf561150331aac016a59d4461cac8190a2e0930e27347b7b","name":"grep","arguments":{"i":"Finding broker generation stamp","pattern":"pid 72488|=== spt broker stderr","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_2zFJs8kBtdxzhXQI1JVdUf4a|fc_0fcf561150331aac016a59d4461cc481908283e2460dc56d5f","name":"grep","arguments":{"i":"Sampling poisoned connections","pattern":"CONN_WRITE_POISONED:.*stream-subscriber|stream-sub-writer-poison","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_zyq9aPgRCW8BaYQ28zqGSgEs|fc_0fcf561150331aac016a59d4461cd48190bdb723ded63e4e7b","name":"grep","arguments":{"i":"Sampling connection close lifecycle","pattern":"CONN_LIFECYCLE:.*event=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_fYe1KzNviwEraJbYq0kqLcGd|fc_0fcf561150331aac016a59d4461ce0819091ed6cbf631a4f9e","name":"grep","arguments":{"i":"Sampling subscriber attachments","pattern":"CONN_LIFECYCLE:.*event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":14633,"output":349,"cacheRead":91648,"cacheWrite":0,"totalTokens":106630,"reasoningTokens":39,"cost":{"input":0.07316500000000001,"output":0.01047,"cacheRead":0.045824,"cacheWrite":0,"total":0.12945900000000002}},"stopReason":"toolUse","timestamp":1784271933914,"responseId":"resp_0fcf561150331aac016a59d43e2cd08190bb53c7f3b567ff44","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d43fa9f081908ec8677a2e872ab2","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdRGF1J7hlIcjZc4uid4Ryi_AgRYYVjDBU4iCRTvwkrOzZ4Rleq6NA0Ugrus-VJYv4bghPLhBQFLr_3mCFeO62Pn_IH758hY6Y32YPe4FzPstfMfoVBVbCvzXAwjKQXJbGvO3MH-xY_zBj8YZs2Fesf5pq7ZN3wJvmeN2P8Pg9PmfX2i1B2fPyliwmZ2rDcaTrzaVpsjZiFNyGdVADtAUzxpgPZ4X7e_CD_N7GLpsEduCwjY5jz-EBtTg8Rbr70L2smzqvtZs89xcAoHhS74n-qiD25SEXwh_-QStQn8D_BRRlNe708FPlF0vuWXNciwp0IDVGPAFwnzz6QZp4-WbjWyJ5XvMx3_7nHLM6dwZaTgbnhO04ueYO-09_rd3V2YIDem7atlnm0GQG-7aTAzPP2785Q-ObEYDQrEmOWwD7vIbAQtQwu2Ux3_PaoTEO0bMhS9wkM8QG6djpxU5pYK3keNN6ms0WTGuN41GS8BT1AcJnz-FgSc-75SD0KOD7GSrroz5LJ1B45K-r3OXc8nEltyfxTrv5JIMptaSdoevVwyZeqnFTJP147eDVidKLLDJZ_maPK-6W9xhwL1h1ILEoiraWpmfrfW1KzZAWfjftUKvtu2l49M_RjZkkixUtkT0vyE2yrt6lUQy691L0nzNnr5Sg11xUVNE3L6R-ATWN4JL9gyYHoAkWfyXbPvtNTxDYxJLYIm3t3fIjgalOiKAt4Nzxfqx1oHFp_JUZ1D-wtW7HUbA51LdbAfTUkmy8wmCSYFyjAKhub8q-Ayp35IDxcphMl_Fzfhy2Oet0s6y6ws2thw-8ccKpa_I2gg7X1ME_WC5K-8rNPoXqZ7dTNIVmT2xAsyvlDlsCFH-CLth7QgDJqaaQ4JtddGieis9WlHcsJYdc0G9ZuQj8sOSjpjOO44p6SUmiNbWLeIRjk15w7CmiWFuXyiDhJRQevybjGbuw3Pz80Ri9EGvIFgVv_Ym2MyEVaomDuSl-zWkv2vX8Y88BeW-oiBgDEzmcfSsDn8Xy8yfCq_VBL7DGovQTxWaGK7ShovmcBLTegsJJ1FiInz6mVJcd8dFqFHx-e67Rd4VUmuE5DD38j_iEBqXe1BRU_6dAlAyZjpZ7NNbHn_H9Si3I4=","summary":[{"type":"summary_text","text":"**Grep live logs by PID and lifecycle**"}]},{"id":"fc_0fcf561150331aac016a59d4461cac8190a2e0930e27347b7b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding broker generation stamp\",\"pattern\":\"pid 72488|=== spt broker stderr\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_MUgkCfKr7kxBYeL6jx4ANero","name":"grep"},{"id":"fc_0fcf561150331aac016a59d4461cc481908283e2460dc56d5f","type":"function_call","status":"completed","arguments":"{\"i\":\"Sampling poisoned connections\",\"pattern\":\"CONN_WRITE_POISONED:.*stream-subscriber|stream-sub-writer-poison\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_2zFJs8kBtdxzhXQI1JVdUf4a","name":"grep"},{"id":"fc_0fcf561150331aac016a59d4461cd48190bdb723ded63e4e7b","type":"function_call","status":"completed","arguments":"{\"i\":\"Sampling connection close lifecycle\",\"pattern\":\"CONN_LIFECYCLE:.*event=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_zyq9aPgRCW8BaYQ28zqGSgEs","name":"grep"},{"id":"fc_0fcf561150331aac016a59d4461ce0819091ed6cbf631a4f9e","type":"function_call","status":"completed","arguments":"{\"i\":\"Sampling subscriber attachments\",\"pattern\":\"CONN_LIFECYCLE:.*event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_fYe1KzNviwEraJbYq0kqLcGd","name":"grep"}]},"duration":8877.38140000403,"ttft":1772.1300000101328,"contextSnapshot":{"promptTokens":106281,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_MUgkCfKr7kxBYeL6jx4ANero|fc_0fcf561150331aac016a59d4461cac8190a2e0930e27347b7b","toolName":"grep","startedAt":"2026-07-17T07:05:42.792Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding broker generation stamp"},"id":"b0c7ece0","parentId":"96c3c903","timestamp":"2026-07-17T07:05:42.792Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_2zFJs8kBtdxzhXQI1JVdUf4a|fc_0fcf561150331aac016a59d4461cc481908283e2460dc56d5f","toolName":"grep","startedAt":"2026-07-17T07:05:42.792Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Sampling poisoned connections"},"id":"0595f167","parentId":"b0c7ece0","timestamp":"2026-07-17T07:05:42.792Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zyq9aPgRCW8BaYQ28zqGSgEs|fc_0fcf561150331aac016a59d4461cd48190bdb723ded63e4e7b","toolName":"grep","startedAt":"2026-07-17T07:05:42.792Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Sampling connection close lifecycle"},"id":"a7392df1","parentId":"0595f167","timestamp":"2026-07-17T07:05:42.792Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_fYe1KzNviwEraJbYq0kqLcGd|fc_0fcf561150331aac016a59d4461ce0819091ed6cbf631a4f9e","toolName":"grep","startedAt":"2026-07-17T07:05:42.792Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Sampling subscriber attachments"},"id":"b82c7e12","parentId":"a7392df1","timestamp":"2026-07-17T07:05:42.792Z"}
{"type":"message","id":"dd452b7d","parentId":"b82c7e12","timestamp":"2026-07-17T07:05:42.810Z","message":{"role":"toolResult","toolCallId":"call_MUgkCfKr7kxBYeL6jx4ANero|fc_0fcf561150331aac016a59d4461cac8190a2e0930e27347b7b","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...\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\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"}],"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":8,"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":8}],"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   │...\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)"},"isError":false,"timestamp":1784271942810}}
{"type":"message","id":"c702ebaa","parentId":"dd452b7d","timestamp":"2026-07-17T07:05:42.811Z","message":{"role":"toolResult","toolCallId":"call_2zFJs8kBtdxzhXQI1JVdUf4a|fc_0fcf561150331aac016a59d4461cc481908283e2460dc56d5f","toolName":"grep","content":[{"type":"text","text":" 2145|CONN_WRITE_RETIRED: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 — 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*2146|CONN_LIFECYCLE: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 2147|CONN_LIFECYCLE: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 event=transport-close poisoned=true timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2148|CONN_LIFECYCLE: conn=850 role=brain wall_ms=1784265730921 mono_ms=488801 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2149|CONN_LIFECYCLE: conn=850 role=brain wall_ms=1784265730921 mono_ms=488801 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3135|CONN_LIFECYCLE: conn=1257 role=brain stream-subscriber stream=529 wall_ms=1784266006373 mono_ms=764251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*3136|CONN_WRITE_POISONED: conn=1243 role=brain stream-subscriber stream=524 wall_ms=1784266006759 mono_ms=764638 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*3137|CONN_LIFECYCLE: conn=1243 role=brain stream-subscriber stream=524 wall_ms=1784266006760 mono_ms=764638 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 3138|CONN_LIFECYCLE: conn=1243 role=brain stream-subscriber stream=524 wall_ms=1784266006760 mono_ms=764638 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 3139|CONN_LIFECYCLE: conn=1252 role=brain stream-subscriber stream=527 wall_ms=1784266007545 mono_ms=765424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3140|CONN_LIFECYCLE: conn=1258 role=brain wall_ms=1784266007545 mono_ms=765424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6594|CONN_LIFECYCLE: conn=2684 role=brain stream-subscriber stream=1167 wall_ms=1784266940950 mono_ms=1698827 event=stream-sub-attach stream=1167 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*6595|CONN_WRITE_POISONED: conn=2665 role=brain stream-subscriber stream=1161 wall_ms=1784266940958 mono_ms=1698834 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*6596|CONN_LIFECYCLE: conn=2665 role=brain stream-subscriber stream=1161 wall_ms=1784266940958 mono_ms=1698834 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 6597|CONN_LIFECYCLE: conn=2665 role=brain stream-subscriber stream=1161 wall_ms=1784266940958 mono_ms=1698834 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 6598|CONN_LIFECYCLE: conn=2684 role=brain stream-subscriber stream=1167 wall_ms=1784266940959 mono_ms=1698835 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6599|CONN_LIFECYCLE: conn=2685 role=brain wall_ms=1784266940959 mono_ms=1698835 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 7600|CONN_LIFECYCLE: conn=3103 role=brain wall_ms=1784267118331 mono_ms=1876206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*7601|CONN_WRITE_POISONED: conn=3072 role=brain stream-subscriber stream=1347 wall_ms=1784267122902 mono_ms=1880777 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*7602|CONN_LIFECYCLE: conn=3072 role=brain stream-subscriber stream=1347 wall_ms=1784267122902 mono_ms=1880778 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 7603|CONN_LIFECYCLE: conn=3072 role=brain stream-subscriber stream=1347 wall_ms=1784267122902 mono_ms=1880778 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 7604|CONN_LIFECYCLE: conn=3104 role=brain wall_ms=1784267122917 mono_ms=1880793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 7605|CONN_LIFECYCLE: conn=3104 role=brain wall_ms=1784267122917 mono_ms=1880793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 16153|CONN_LIFECYCLE: conn=6673 role=brain stream-subscriber stream=3061 wall_ms=1784268599434 mono_ms=3357305 event=stream-sub-attach stream=3061 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16154|CONN_WRITE_POISONED: conn=6648 role=brain stream-subscriber stream=3053 wall_ms=1784268599441 mono_ms=3357313 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*16155|CONN_LIFECYCLE: conn=6648 role=brain stream-subscriber stream=3053 wall_ms=1784268599441 mono_ms=3357313 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 16156|CONN_LIFECYCLE: conn=6648 role=brain stream-subscriber stream=3053 wall_ms=1784268599441 mono_ms=3357313 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 16157|CONN_LIFECYCLE: conn=6673 role=brain stream-subscriber stream=3061 wall_ms=1784268599442 mono_ms=3357314 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16158|CONN_LIFECYCLE: conn=6674 role=brain wall_ms=1784268599442 mono_ms=3357314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19958|CONN_LIFECYCLE: conn=8257 role=brain wall_ms=1784269248117 mono_ms=4005987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19959|CONN_WRITE_POISONED: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252412 mono_ms=4010282 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*19960|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 19961|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 19962|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19963|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 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"}],"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":11,"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":11}],"truncated":false,"displayContent":"  2145│CONN_WRITE_RETIRED: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 — 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 *2146│CONN_LIFECYCLE: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n  2147│CONN_LIFECYCLE: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 event=transport-close poisoned=true timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  2148│CONN_LIFECYCLE: conn=850 role=brain wall_ms=1784265730921 mono_ms=488801 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  2149│CONN_LIFECYCLE: conn=850 role=brain wall_ms=1784265730921 mono_ms=488801 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  3135│CONN_LIFECYCLE: conn=1257 role=brain stream-subscriber stream=529 wall_ms=1784266006373 mono_ms=764251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *3136│CONN_WRITE_POISONED: conn=1243 role=brain stream-subscriber stream=524 wall_ms=1784266006759 mono_ms=764638 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n *3137│CONN_LIFECYCLE: conn=1243 role=brain stream-subscriber stream=524 wall_ms=1784266006760 mono_ms=764638 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n  3138│CONN_LIFECYCLE: conn=1243 role=brain stream-subscriber stream=524 wall_ms=1784266006760 mono_ms=764638 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n  3139│CONN_LIFECYCLE: conn=1252 role=brain stream-subscriber stream=527 wall_ms=1784266007545 mono_ms=765424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  3140│CONN_LIFECYCLE: conn=1258 role=brain wall_ms=1784266007545 mono_ms=765424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6594│CONN_LIFECYCLE: conn=2684 role=brain stream-subscriber stream=1167 wall_ms=1784266940950 mono_ms=1698827 event=stream-sub-attach stream=1167 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *6595│CONN_WRITE_POISONED: conn=2665 role=brain stream-subscriber stream=1161 wall_ms=1784266940958 mono_ms=1698834 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n *6596│CONN_LIFECYCLE: conn=2665 role=brain stream-subscriber stream=1161 wall_ms=1784266940958 mono_ms=1698834 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n  6597│CONN_LIFECYCLE: conn=2665 role=brain stream-subscriber stream=1161 wall_ms=1784266940958 mono_ms=1698834 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n  6598│CONN_LIFECYCLE: conn=2684 role=brain stream-subscriber stream=1167 wall_ms=1784266940959 mono_ms=1698835 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  6599│CONN_LIFECYCLE: conn=2685 role=brain wall_ms=1784266940959 mono_ms=1698835 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7600│CONN_LIFECYCLE: conn=3103 role=brain wall_ms=1784267118331 mono_ms=1876206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7601│CONN_WRITE_POISONED: conn=3072 role=brain stream-subscriber stream=1347 wall_ms=1784267122902 mono_ms=1880777 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n *7602│CONN_LIFECYCLE: conn=3072 role=brain stream-subscriber stream=1347 wall_ms=1784267122902 mono_ms=1880778 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n  7603│CONN_LIFECYCLE: conn=3072 role=brain stream-subscriber stream=1347 wall_ms=1784267122902 mono_ms=1880778 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n  7604│CONN_LIFECYCLE: conn=3104 role=brain wall_ms=1784267122917 mono_ms=1880793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7605│CONN_LIFECYCLE: conn=3104 role=brain wall_ms=1784267122917 mono_ms=1880793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 16153│CONN_LIFECYCLE: conn=6673 role=brain stream-subscriber stream=3061 wall_ms=1784268599434 mono_ms=3357305 event=stream-sub-attach stream=3061 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16154│CONN_WRITE_POISONED: conn=6648 role=brain stream-subscriber stream=3053 wall_ms=1784268599441 mono_ms=3357313 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*16155│CONN_LIFECYCLE: conn=6648 role=brain stream-subscriber stream=3053 wall_ms=1784268599441 mono_ms=3357313 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 16156│CONN_LIFECYCLE: conn=6648 role=brain stream-subscriber stream=3053 wall_ms=1784268599441 mono_ms=3357313 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 16157│CONN_LIFECYCLE: conn=6673 role=brain stream-subscriber stream=3061 wall_ms=1784268599442 mono_ms=3357314 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16158│CONN_LIFECYCLE: conn=6674 role=brain wall_ms=1784268599442 mono_ms=3357314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19958│CONN_LIFECYCLE: conn=8257 role=brain wall_ms=1784269248117 mono_ms=4005987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19959│CONN_WRITE_POISONED: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252412 mono_ms=4010282 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*19960│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 19961│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 19962│CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19963│CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784271942811}}
{"type":"message","id":"8e7ddde3","parentId":"c702ebaa","timestamp":"2026-07-17T07:05:42.823Z","message":{"role":"toolResult","toolCallId":"call_zyq9aPgRCW8BaYQ28zqGSgEs|fc_0fcf561150331aac016a59d4461cd48190bdb723ded63e4e7b","toolName":"grep","content":[{"type":"text","text":" 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...\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 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 48|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 wall_ms=1784265242749 mono_ms=630 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 49|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242749 mono_ms=630 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 59|ENDPOINT_AUTOSTART:lia adapter=claude-spt session=21df0f4230483015 pid=8928 (startup default)\n*60|CONN_LIFECYCLE: conn=17 role=brain wall_ms=1784265242840 mono_ms=721 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 61|CONN_LIFECYCLE: conn=1 role=brain controller session=2 endpoint=mobile-gw by=local wall_ms=1784265242860 mono_ms=741 event=session-detach session=2 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\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...\n 111|CONN_LIFECYCLE: conn=34 role=brain wall_ms=1784265247943 mono_ms=5823 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*112|CONN_LIFECYCLE: conn=34 role=brain wall_ms=1784265247943 mono_ms=5824 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 113|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248067 mono_ms=5948 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 114|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248085 mono_ms=5966 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 115|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248228 mono_ms=6109 event=writer-exit role=controller session=3 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 117|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248251 mono_ms=6132 event=session-detach session=3 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*118|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248251 mono_ms=6132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 119|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248401 mono_ms=6282 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 120|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248432 mono_ms=6313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 121|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248436 mono_ms=6317 event=writer-exit role=controller session=4 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 123|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248466 mono_ms=6347 event=session-detach session=4 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*124|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248466 mono_ms=6347 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 125|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248472 mono_ms=6353 event=controller-attach session=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 126|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248493 mono_ms=6374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 127|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248496 mono_ms=6377 event=writer-exit role=controller session=5 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 129|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248523 mono_ms=6404 event=session-detach session=5 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*130|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248523 mono_ms=6404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 131|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248531 mono_ms=6411 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 132|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248546 mono_ms=6427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 133|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248550 mono_ms=6431 event=writer-exit role=controller session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 135|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248579 mono_ms=6460 event=session-detach session=6 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*136|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248579 mono_ms=6460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 137|CONN_LIFECYCLE: conn=39 role=brain wall_ms=1784265248695 mono_ms=6576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 138|CONN_LIFECYCLE: conn=39 role=brain stream-subscriber stream=4 wall_ms=1784265248702 mono_ms=6583 event=stream-sub-attach stream=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 139|CONN_LIFECYCLE: conn=40 role=brain wall_ms=1784265248710 mono_ms=6591 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 146|CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*147|CONN_LIFECYCLE: conn=44 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*148|CONN_LIFECYCLE: conn=43 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*149|CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 150|CONN_LIFECYCLE: conn=47 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 151|CONN_LIFECYCLE: conn=48 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 152|CONN_LIFECYCLE: conn=46 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 172|CONN_LIFECYCLE: conn=56 role=brain wall_ms=1784265253610 mono_ms=11491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*173|CONN_LIFECYCLE: conn=56 role=brain wall_ms=1784265253611 mono_ms=11491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 174|CONN_LIFECYCLE: conn=57 role=brain wall_ms=1784265253729 mono_ms=11610 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 175|CONN_LIFECYCLE: conn=58 role=brain wall_ms=1784265254731 mono_ms=12612 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 176|CONN_LIFECYCLE: conn=59 role=brain wall_ms=1784265255067 mono_ms=12948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*177|CONN_LIFECYCLE: conn=59 role=brain wall_ms=1784265255067 mono_ms=12948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 178|CONN_LIFECYCLE: conn=60 role=brain wall_ms=1784265255733 mono_ms=13614 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 179|CONN_LIFECYCLE: conn=61 role=brain wall_ms=1784265256734 mono_ms=14615 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 180|CONN_LIFECYCLE: conn=62 role=brain wall_ms=1784265257736 mono_ms=15617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 181|CONN_LIFECYCLE: conn=63 role=brain wall_ms=1784265258647 mono_ms=16528 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*182|CONN_LIFECYCLE: conn=63 role=brain wall_ms=1784265258648 mono_ms=16528 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 183|CONN_LIFECYCLE: conn=64 role=brain wall_ms=1784265258738 mono_ms=16619 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 184|CONN_LIFECYCLE: conn=65 role=brain wall_ms=1784265259792 mono_ms=17673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 185|CONN_LIFECYCLE: conn=66 role=brain wall_ms=1784265260844 mono_ms=18725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 188|CONN_LIFECYCLE: conn=69 role=brain wall_ms=1784265263687 mono_ms=21567 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*189|CONN_LIFECYCLE: conn=69 role=brain wall_ms=1784265263687 mono_ms=21568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 190|CONN_LIFECYCLE: conn=70 role=brain wall_ms=1784265263864 mono_ms=21745 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 191|CONN_LIFECYCLE: conn=71 role=brain wall_ms=1784265264866 mono_ms=22747 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 192|CONN_LIFECYCLE: conn=72 role=brain wall_ms=1784265265868 mono_ms=23749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 196|CONN_LIFECYCLE: conn=76 role=brain wall_ms=1784265268967 mono_ms=26848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*197|CONN_LIFECYCLE: conn=76 role=brain wall_ms=1784265268967 mono_ms=26848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 198|CONN_LIFECYCLE: conn=77 role=brain wall_ms=1784265269875 mono_ms=27756 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 199|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 200|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n...\n 202|PAIR_MEET_UP:SPT_DEV step=59475509 id=998c9da23046cbc78e4a77ac75ff9a6b2417bdb11ef38449ef2cb45e016b61ba addr=EndpointAddr { id: PublicKey(998c9da23046cbc78e4a77ac75ff9a6b2417bdb11ef38449ef2cb45e016b61ba), addrs: {Ip(100.68.35.65:51028), Ip(192.168.1.81:51028)} }\n*203|CONN_LIFECYCLE: conn=70 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*204|CONN_LIFECYCLE: conn=74 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*205|CONN_LIFECYCLE: conn=65 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*206|CONN_LIFECYCLE: conn=55 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*207|CONN_LIFECYCLE: conn=72 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*208|CONN_LIFECYCLE: conn=58 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*209|CONN_LIFECYCLE: conn=61 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*210|CONN_LIFECYCLE: conn=67 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*211|CONN_LIFECYCLE: conn=41 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*212|CONN_LIFECYCLE: conn=24 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*213|CONN_LIFECYCLE: conn=28 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*214|CONN_LIFECYCLE: conn=52 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*215|CONN_LIFECYCLE: conn=20 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*216|CONN_LIFECYCLE: conn=62 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*217|CONN_LIFECYCLE: conn=32 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*218|CONN_LIFECYCLE: conn=77 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*219|CONN_LIFECYCLE: conn=57 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*220|CONN_LIFECYCLE: conn=73 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*221|CONN_LIFECYCLE: conn=71 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*222|CONN_LIFECYCLE: conn=66 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*223|CONN_LIFECYCLE: conn=64 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*224|CONN_LIFECYCLE: conn=60 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*225|CONN_LIFECYCLE: conn=68 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*226|CONN_LIFECYCLE: conn=54 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*227|CONN_LIFECYCLE: conn=75 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*228|CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*229|CONN_LIFECYCLE: conn=53 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 230|CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784265271531 mono_ms=29411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 231|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265271555 mono_ms=29436 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 232|CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*233|CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 234|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=stream-sub-attach stream=10 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 235|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*236|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271578 mono_ms=29458 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 237|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*238|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29463 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 239|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 wall_ms=1784265271644 mono_ms=29525 event=stream-sub-attach stream=14 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 240|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 241|CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*242|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*243|CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 244|CONN_LIFECYCLE: conn=83 role=brain wall_ms=1784265271671 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 245|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271671 mono_ms=29552 event=stream-sub-attach stream=13 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 246|CONN_LIFECYCLE: conn=84 role=brain wall_ms=1784265271672 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 248|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271675 mono_ms=29555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*249|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*250|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*251|CONN_LIFECYCLE: conn=84 role=brain stream-subscriber stream=12 wall_ms=1784265271679 mono_ms=29560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 252|CONN_LIFECYCLE: conn=86 role=brain wall_ms=1784265271692 mono_ms=29573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*253|CONN_LIFECYCLE: conn=86 role=brain wall_ms=1784265271692 mono_ms=29573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 254|CONN_LIFECYCLE: conn=87 role=brain wall_ms=1784265273073 mono_ms=30954 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*255|CONN_LIFECYCLE: conn=87 role=brain wall_ms=1784265273073 mono_ms=30954 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 256|CONN_LIFECYCLE: conn=88 role=brain wall_ms=1784265273075 mono_ms=30956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 257|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273075 mono_ms=30956 event=stream-sub-attach stream=15 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*258|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273078 mono_ms=30959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 259|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*260|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 261|CONN_LIFECYCLE: conn=90 role=brain wall_ms=1784265274019 mono_ms=31900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*262|CONN_LIFECYCLE: conn=90 role=brain wall_ms=1784265274019 mono_ms=31900 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 263|CONN_LIFECYCLE: conn=91 role=brain wall_ms=1784265274278 mono_ms=32159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 264|CONN_LIFECYCLE: conn=92 role=brain wall_ms=1784265274278 mono_ms=32159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*265|CONN_LIFECYCLE: conn=91 role=brain wall_ms=1784265274278 mono_ms=32159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*266|CONN_LIFECYCLE: conn=92 role=brain wall_ms=1784265274279 mono_ms=32159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 267|CONN_LIFECYCLE: conn=93 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 268|CONN_LIFECYCLE: conn=94 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 269|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=17 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 270|CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=16 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*271|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274282 mono_ms=32162 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 272|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*273|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*274|CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274284 mono_ms=32165 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 275|CONN_LIFECYCLE: conn=96 role=brain wall_ms=1784265274284 mono_ms=32165 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*276|CONN_LIFECYCLE: conn=96 role=brain wall_ms=1784265274285 mono_ms=32165 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 277|CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*278|CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 279|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=stream-sub-attach stream=18 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 280|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*281|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 282|CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*283|CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 284|CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274780 mono_ms=32661 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*285|CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274781 mono_ms=32661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 286|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32661 event=stream-sub-attach stream=19 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 287|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32662 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*288|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 289|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*290|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 291|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 wall_ms=1784265276296 mono_ms=34177 event=stream-sub-attach stream=20 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 292|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 wall_ms=1784265276389 mono_ms=34270 event=stream-sub-attach stream=23 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 293|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 wall_ms=1784265276685 mono_ms=34565 event=stream-sub-attach stream=24 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 299|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*300|CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*301|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 302|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=33 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 303|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=34 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 304|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 305|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*306|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278400 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 307|CONN_LIFECYCLE: conn=107 role=brain wall_ms=1784265278401 mono_ms=36281 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*308|CONN_LIFECYCLE: conn=107 role=brain wall_ms=1784265278401 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*309|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278405 mono_ms=36286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 310|CONN_LIFECYCLE: conn=108 role=brain wall_ms=1784265278405 mono_ms=36286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*311|CONN_LIFECYCLE: conn=108 role=brain wall_ms=1784265278405 mono_ms=36286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 312|CONN_LIFECYCLE: conn=109 role=brain wall_ms=1784265278797 mono_ms=36677 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*313|CONN_LIFECYCLE: conn=109 role=brain wall_ms=1784265278797 mono_ms=36677 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 314|CONN_LIFECYCLE: conn=110 role=brain wall_ms=1784265278797 mono_ms=36678 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 315|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278798 mono_ms=36678 event=stream-sub-attach stream=35 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*316|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278807 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 317|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278807 mono_ms=36688 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*318|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278808 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 319|CONN_LIFECYCLE: conn=112 role=brain wall_ms=1784265279062 mono_ms=36943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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...\n 326|CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*327|CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 328|CONN_LIFECYCLE: conn=115 role=brain wall_ms=1784265283622 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 329|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 wall_ms=1784265283622 mono_ms=41503 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 330|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 wall_ms=1784265283622 mono_ms=41503 event=viewer-attach session=6 vid=0 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 332|CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284118 mono_ms=41999 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*333|CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284119 mono_ms=41999 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 334|CONN_LIFECYCLE: conn=118 role=brain wall_ms=1784265288241 mono_ms=46122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*335|CONN_LIFECYCLE: conn=118 role=brain wall_ms=1784265288241 mono_ms=46122 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 336|CONN_LIFECYCLE: conn=119 role=brain wall_ms=1784265288242 mono_ms=46123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 337|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288243 mono_ms=46123 event=stream-sub-attach stream=38 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*338|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 339|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*340|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 341|CONN_LIFECYCLE: conn=121 role=brain wall_ms=1784265289171 mono_ms=47051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*342|CONN_LIFECYCLE: conn=121 role=brain wall_ms=1784265289171 mono_ms=47051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 343|CONN_LIFECYCLE: conn=122 role=brain wall_ms=1784265293265 mono_ms=51145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 344|CONN_LIFECYCLE: conn=123 role=brain wall_ms=1784265293265 mono_ms=51145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*345|CONN_LIFECYCLE: conn=122 role=brain wall_ms=1784265293265 mono_ms=51145 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*346|CONN_LIFECYCLE: conn=123 role=brain wall_ms=1784265293265 mono_ms=51145 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 347|CONN_LIFECYCLE: conn=124 role=brain wall_ms=1784265293266 mono_ms=51146 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 348|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293266 mono_ms=51147 event=stream-sub-attach stream=39 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*349|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 350|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*351|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 352|CONN_LIFECYCLE: conn=125 role=brain wall_ms=1784265293277 mono_ms=51158 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 353|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293277 mono_ms=51158 event=stream-sub-attach stream=40 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*354|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 355|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*356|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 357|CONN_LIFECYCLE: conn=128 role=brain wall_ms=1784265293867 mono_ms=51748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*358|CONN_LIFECYCLE: conn=128 role=brain wall_ms=1784265293867 mono_ms=51748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 359|CONN_LIFECYCLE: conn=129 role=brain wall_ms=1784265293869 mono_ms=51749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 360|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293869 mono_ms=51749 event=stream-sub-attach stream=41 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*361|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 362|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*363|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 364|CONN_LIFECYCLE: conn=131 role=brain wall_ms=1784265294216 mono_ms=52097 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*365|CONN_LIFECYCLE: conn=131 role=brain wall_ms=1784265294216 mono_ms=52097 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 366|CONN_LIFECYCLE: conn=132 role=brain wall_ms=1784265298173 mono_ms=56053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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*372|CONN_LIFECYCLE: conn=16 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*373|CONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*374|CONN_LIFECYCLE: conn=51 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*375|CONN_LIFECYCLE: conn=49 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*376|CONN_LIFECYCLE: conn=116 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*377|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 378|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*379|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 380|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\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*386|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 387|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=6 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 388|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=3 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*389|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*390|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 391|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=session-detach session=6 was_controller=false viewers_dropped=2 [REQ-CONN-POISON-ATTRIBUTION]\n 392|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 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...\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 399|CONN_LIFECYCLE: conn=134 role=brain wall_ms=1784265298378 mono_ms=56258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*400|CONN_LIFECYCLE: conn=134 role=brain wall_ms=1784265298378 mono_ms=56259 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 401|CONN_LIFECYCLE: conn=135 role=brain wall_ms=1784265298412 mono_ms=56293 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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...\n 409|CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*410|CONN_LIFECYCLE: conn=139 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 411|CONN_LIFECYCLE: conn=141 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*412|CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 413|CONN_LIFECYCLE: conn=142 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*414|CONN_LIFECYCLE: conn=141 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 415|CONN_LIFECYCLE: conn=143 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*416|CONN_LIFECYCLE: conn=142 role=brain wall_ms=1784265298872 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*417|CONN_LIFECYCLE: conn=143 role=brain wall_ms=1784265298872 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 418|CONN_LIFECYCLE: conn=144 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 419|CONN_LIFECYCLE: conn=145 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 420|CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 450|CONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*451|CONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 452|CONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*453|CONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 454|CONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 455|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*456|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 457|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*458|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 459|CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303894 mono_ms=61775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*460|CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 461|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 462|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*463|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 464|CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*465|CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 466|CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*467|CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 468|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 469|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 470|CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 471|CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*472|CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*473|CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 474|CONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 475|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*476|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 477|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*478|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 479|CONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 480|CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 1-338 of 508 (49.8KB limit). Use :339 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":"  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    │...\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  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  48│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 wall_ms=1784265242749 mono_ms=630 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  49│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242749 mono_ms=630 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n  59│ENDPOINT_AUTOSTART:lia adapter=claude-spt session=21df0f4230483015 pid=8928 (startup default)\n *60│CONN_LIFECYCLE: conn=17 role=brain wall_ms=1784265242840 mono_ms=721 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  61│CONN_LIFECYCLE: conn=1 role=brain controller session=2 endpoint=mobile-gw by=local wall_ms=1784265242860 mono_ms=741 event=session-detach session=2 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\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    │...\n 111│CONN_LIFECYCLE: conn=34 role=brain wall_ms=1784265247943 mono_ms=5823 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*112│CONN_LIFECYCLE: conn=34 role=brain wall_ms=1784265247943 mono_ms=5824 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 113│CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248067 mono_ms=5948 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 114│CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248085 mono_ms=5966 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 115│CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248228 mono_ms=6109 event=writer-exit role=controller session=3 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 117│CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248251 mono_ms=6132 event=session-detach session=3 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*118│CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248251 mono_ms=6132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 119│CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248401 mono_ms=6282 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 120│CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248432 mono_ms=6313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 121│CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248436 mono_ms=6317 event=writer-exit role=controller session=4 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 123│CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248466 mono_ms=6347 event=session-detach session=4 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*124│CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248466 mono_ms=6347 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 125│CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248472 mono_ms=6353 event=controller-attach session=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 126│CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248493 mono_ms=6374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 127│CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248496 mono_ms=6377 event=writer-exit role=controller session=5 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 129│CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248523 mono_ms=6404 event=session-detach session=5 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*130│CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248523 mono_ms=6404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 131│CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248531 mono_ms=6411 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 132│CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248546 mono_ms=6427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 133│CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248550 mono_ms=6431 event=writer-exit role=controller session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 135│CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248579 mono_ms=6460 event=session-detach session=6 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*136│CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248579 mono_ms=6460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 137│CONN_LIFECYCLE: conn=39 role=brain wall_ms=1784265248695 mono_ms=6576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 138│CONN_LIFECYCLE: conn=39 role=brain stream-subscriber stream=4 wall_ms=1784265248702 mono_ms=6583 event=stream-sub-attach stream=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 139│CONN_LIFECYCLE: conn=40 role=brain wall_ms=1784265248710 mono_ms=6591 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 146│CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*147│CONN_LIFECYCLE: conn=44 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*148│CONN_LIFECYCLE: conn=43 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*149│CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 150│CONN_LIFECYCLE: conn=47 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 151│CONN_LIFECYCLE: conn=48 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 152│CONN_LIFECYCLE: conn=46 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 172│CONN_LIFECYCLE: conn=56 role=brain wall_ms=1784265253610 mono_ms=11491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*173│CONN_LIFECYCLE: conn=56 role=brain wall_ms=1784265253611 mono_ms=11491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 174│CONN_LIFECYCLE: conn=57 role=brain wall_ms=1784265253729 mono_ms=11610 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 175│CONN_LIFECYCLE: conn=58 role=brain wall_ms=1784265254731 mono_ms=12612 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 176│CONN_LIFECYCLE: conn=59 role=brain wall_ms=1784265255067 mono_ms=12948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*177│CONN_LIFECYCLE: conn=59 role=brain wall_ms=1784265255067 mono_ms=12948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 178│CONN_LIFECYCLE: conn=60 role=brain wall_ms=1784265255733 mono_ms=13614 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 179│CONN_LIFECYCLE: conn=61 role=brain wall_ms=1784265256734 mono_ms=14615 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 180│CONN_LIFECYCLE: conn=62 role=brain wall_ms=1784265257736 mono_ms=15617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 181│CONN_LIFECYCLE: conn=63 role=brain wall_ms=1784265258647 mono_ms=16528 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*182│CONN_LIFECYCLE: conn=63 role=brain wall_ms=1784265258648 mono_ms=16528 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 183│CONN_LIFECYCLE: conn=64 role=brain wall_ms=1784265258738 mono_ms=16619 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 184│CONN_LIFECYCLE: conn=65 role=brain wall_ms=1784265259792 mono_ms=17673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 185│CONN_LIFECYCLE: conn=66 role=brain wall_ms=1784265260844 mono_ms=18725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 188│CONN_LIFECYCLE: conn=69 role=brain wall_ms=1784265263687 mono_ms=21567 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*189│CONN_LIFECYCLE: conn=69 role=brain wall_ms=1784265263687 mono_ms=21568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 190│CONN_LIFECYCLE: conn=70 role=brain wall_ms=1784265263864 mono_ms=21745 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 191│CONN_LIFECYCLE: conn=71 role=brain wall_ms=1784265264866 mono_ms=22747 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 192│CONN_LIFECYCLE: conn=72 role=brain wall_ms=1784265265868 mono_ms=23749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 196│CONN_LIFECYCLE: conn=76 role=brain wall_ms=1784265268967 mono_ms=26848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*197│CONN_LIFECYCLE: conn=76 role=brain wall_ms=1784265268967 mono_ms=26848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 198│CONN_LIFECYCLE: conn=77 role=brain wall_ms=1784265269875 mono_ms=27756 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 199│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 200│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    │...\n 202│PAIR_MEET_UP:SPT_DEV step=59475509 id=998c9da23046cbc78e4a77ac75ff9a6b2417bdb11ef38449ef2cb45e016b61ba addr=EndpointAddr { id: PublicKey(998c9da23046cbc78e4a77ac75ff9a6b2417bdb11ef38449ef2cb45e016b61ba), addrs: {Ip(100.68.35.65:51028), Ip(192.168.1.81:51028)} }\n*203│CONN_LIFECYCLE: conn=70 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*204│CONN_LIFECYCLE: conn=74 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*205│CONN_LIFECYCLE: conn=65 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*206│CONN_LIFECYCLE: conn=55 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*207│CONN_LIFECYCLE: conn=72 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*208│CONN_LIFECYCLE: conn=58 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*209│CONN_LIFECYCLE: conn=61 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*210│CONN_LIFECYCLE: conn=67 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*211│CONN_LIFECYCLE: conn=41 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*212│CONN_LIFECYCLE: conn=24 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*213│CONN_LIFECYCLE: conn=28 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*214│CONN_LIFECYCLE: conn=52 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*215│CONN_LIFECYCLE: conn=20 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*216│CONN_LIFECYCLE: conn=62 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*217│CONN_LIFECYCLE: conn=32 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*218│CONN_LIFECYCLE: conn=77 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*219│CONN_LIFECYCLE: conn=57 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*220│CONN_LIFECYCLE: conn=73 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*221│CONN_LIFECYCLE: conn=71 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*222│CONN_LIFECYCLE: conn=66 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*223│CONN_LIFECYCLE: conn=64 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*224│CONN_LIFECYCLE: conn=60 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*225│CONN_LIFECYCLE: conn=68 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*226│CONN_LIFECYCLE: conn=54 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*227│CONN_LIFECYCLE: conn=75 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*228│CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*229│CONN_LIFECYCLE: conn=53 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 230│CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784265271531 mono_ms=29411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 231│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265271555 mono_ms=29436 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 232│CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*233│CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 234│CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=stream-sub-attach stream=10 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 235│CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*236│CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271578 mono_ms=29458 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 237│CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*238│CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29463 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 239│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 wall_ms=1784265271644 mono_ms=29525 event=stream-sub-attach stream=14 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 240│CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 241│CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*242│CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*243│CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 244│CONN_LIFECYCLE: conn=83 role=brain wall_ms=1784265271671 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 245│CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271671 mono_ms=29552 event=stream-sub-attach stream=13 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 246│CONN_LIFECYCLE: conn=84 role=brain wall_ms=1784265271672 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 248│CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271675 mono_ms=29555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*249│CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*250│CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*251│CONN_LIFECYCLE: conn=84 role=brain stream-subscriber stream=12 wall_ms=1784265271679 mono_ms=29560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 252│CONN_LIFECYCLE: conn=86 role=brain wall_ms=1784265271692 mono_ms=29573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*253│CONN_LIFECYCLE: conn=86 role=brain wall_ms=1784265271692 mono_ms=29573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 254│CONN_LIFECYCLE: conn=87 role=brain wall_ms=1784265273073 mono_ms=30954 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*255│CONN_LIFECYCLE: conn=87 role=brain wall_ms=1784265273073 mono_ms=30954 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 256│CONN_LIFECYCLE: conn=88 role=brain wall_ms=1784265273075 mono_ms=30956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 257│CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273075 mono_ms=30956 event=stream-sub-attach stream=15 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*258│CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273078 mono_ms=30959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 259│CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*260│CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 261│CONN_LIFECYCLE: conn=90 role=brain wall_ms=1784265274019 mono_ms=31900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*262│CONN_LIFECYCLE: conn=90 role=brain wall_ms=1784265274019 mono_ms=31900 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 263│CONN_LIFECYCLE: conn=91 role=brain wall_ms=1784265274278 mono_ms=32159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 264│CONN_LIFECYCLE: conn=92 role=brain wall_ms=1784265274278 mono_ms=32159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*265│CONN_LIFECYCLE: conn=91 role=brain wall_ms=1784265274278 mono_ms=32159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*266│CONN_LIFECYCLE: conn=92 role=brain wall_ms=1784265274279 mono_ms=32159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 267│CONN_LIFECYCLE: conn=93 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 268│CONN_LIFECYCLE: conn=94 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 269│CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=17 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 270│CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=16 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*271│CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274282 mono_ms=32162 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 272│CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*273│CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*274│CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274284 mono_ms=32165 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 275│CONN_LIFECYCLE: conn=96 role=brain wall_ms=1784265274284 mono_ms=32165 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*276│CONN_LIFECYCLE: conn=96 role=brain wall_ms=1784265274285 mono_ms=32165 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 277│CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*278│CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 279│CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=stream-sub-attach stream=18 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 280│CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*281│CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 282│CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*283│CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 284│CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274780 mono_ms=32661 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*285│CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274781 mono_ms=32661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 286│CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32661 event=stream-sub-attach stream=19 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 287│CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32662 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*288│CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 289│CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*290│CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 291│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 wall_ms=1784265276296 mono_ms=34177 event=stream-sub-attach stream=20 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 292│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 wall_ms=1784265276389 mono_ms=34270 event=stream-sub-attach stream=23 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 293│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 wall_ms=1784265276685 mono_ms=34565 event=stream-sub-attach stream=24 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 299│CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*300│CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*301│CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 302│CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=33 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 303│CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=34 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 304│CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 305│CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*306│CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278400 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 307│CONN_LIFECYCLE: conn=107 role=brain wall_ms=1784265278401 mono_ms=36281 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*308│CONN_LIFECYCLE: conn=107 role=brain wall_ms=1784265278401 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*309│CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278405 mono_ms=36286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 310│CONN_LIFECYCLE: conn=108 role=brain wall_ms=1784265278405 mono_ms=36286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*311│CONN_LIFECYCLE: conn=108 role=brain wall_ms=1784265278405 mono_ms=36286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 312│CONN_LIFECYCLE: conn=109 role=brain wall_ms=1784265278797 mono_ms=36677 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*313│CONN_LIFECYCLE: conn=109 role=brain wall_ms=1784265278797 mono_ms=36677 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 314│CONN_LIFECYCLE: conn=110 role=brain wall_ms=1784265278797 mono_ms=36678 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 315│CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278798 mono_ms=36678 event=stream-sub-attach stream=35 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*316│CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278807 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 317│CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278807 mono_ms=36688 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*318│CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278808 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 319│CONN_LIFECYCLE: conn=112 role=brain wall_ms=1784265279062 mono_ms=36943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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    │...\n 326│CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*327│CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 328│CONN_LIFECYCLE: conn=115 role=brain wall_ms=1784265283622 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 329│CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 wall_ms=1784265283622 mono_ms=41503 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 330│CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 wall_ms=1784265283622 mono_ms=41503 event=viewer-attach session=6 vid=0 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 332│CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284118 mono_ms=41999 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*333│CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284119 mono_ms=41999 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 334│CONN_LIFECYCLE: conn=118 role=brain wall_ms=1784265288241 mono_ms=46122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*335│CONN_LIFECYCLE: conn=118 role=brain wall_ms=1784265288241 mono_ms=46122 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 336│CONN_LIFECYCLE: conn=119 role=brain wall_ms=1784265288242 mono_ms=46123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 337│CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288243 mono_ms=46123 event=stream-sub-attach stream=38 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*338│CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 339│CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*340│CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 341│CONN_LIFECYCLE: conn=121 role=brain wall_ms=1784265289171 mono_ms=47051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*342│CONN_LIFECYCLE: conn=121 role=brain wall_ms=1784265289171 mono_ms=47051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 343│CONN_LIFECYCLE: conn=122 role=brain wall_ms=1784265293265 mono_ms=51145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 344│CONN_LIFECYCLE: conn=123 role=brain wall_ms=1784265293265 mono_ms=51145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*345│CONN_LIFECYCLE: conn=122 role=brain wall_ms=1784265293265 mono_ms=51145 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*346│CONN_LIFECYCLE: conn=123 role=brain wall_ms=1784265293265 mono_ms=51145 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 347│CONN_LIFECYCLE: conn=124 role=brain wall_ms=1784265293266 mono_ms=51146 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 348│CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293266 mono_ms=51147 event=stream-sub-attach stream=39 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*349│CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 350│CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*351│CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 352│CONN_LIFECYCLE: conn=125 role=brain wall_ms=1784265293277 mono_ms=51158 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 353│CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293277 mono_ms=51158 event=stream-sub-attach stream=40 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*354│CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 355│CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*356│CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 357│CONN_LIFECYCLE: conn=128 role=brain wall_ms=1784265293867 mono_ms=51748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*358│CONN_LIFECYCLE: conn=128 role=brain wall_ms=1784265293867 mono_ms=51748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 359│CONN_LIFECYCLE: conn=129 role=brain wall_ms=1784265293869 mono_ms=51749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 360│CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293869 mono_ms=51749 event=stream-sub-attach stream=41 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*361│CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 362│CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*363│CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 364│CONN_LIFECYCLE: conn=131 role=brain wall_ms=1784265294216 mono_ms=52097 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*365│CONN_LIFECYCLE: conn=131 role=brain wall_ms=1784265294216 mono_ms=52097 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 366│CONN_LIFECYCLE: conn=132 role=brain wall_ms=1784265298173 mono_ms=56053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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*372│CONN_LIFECYCLE: conn=16 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*373│CONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*374│CONN_LIFECYCLE: conn=51 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*375│CONN_LIFECYCLE: conn=49 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*376│CONN_LIFECYCLE: conn=116 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*377│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 378│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*379│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 380│CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\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*386│CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 387│CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=6 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 388│CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=3 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*389│CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*390│CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 391│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=session-detach session=6 was_controller=false viewers_dropped=2 [REQ-CONN-POISON-ATTRIBUTION]\n 392│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 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    │...\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 399│CONN_LIFECYCLE: conn=134 role=brain wall_ms=1784265298378 mono_ms=56258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*400│CONN_LIFECYCLE: conn=134 role=brain wall_ms=1784265298378 mono_ms=56259 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 401│CONN_LIFECYCLE: conn=135 role=brain wall_ms=1784265298412 mono_ms=56293 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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    │...\n 409│CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*410│CONN_LIFECYCLE: conn=139 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 411│CONN_LIFECYCLE: conn=141 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*412│CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 413│CONN_LIFECYCLE: conn=142 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*414│CONN_LIFECYCLE: conn=141 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 415│CONN_LIFECYCLE: conn=143 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*416│CONN_LIFECYCLE: conn=142 role=brain wall_ms=1784265298872 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*417│CONN_LIFECYCLE: conn=143 role=brain wall_ms=1784265298872 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 418│CONN_LIFECYCLE: conn=144 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 419│CONN_LIFECYCLE: conn=145 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 420│CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 450│CONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*451│CONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 452│CONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*453│CONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 454│CONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 455│CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*456│CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 457│CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*458│CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 459│CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303894 mono_ms=61775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*460│CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 461│CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 462│CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*463│CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 464│CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*465│CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 466│CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*467│CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 468│CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 469│CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 470│CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 471│CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*472│CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*473│CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 474│CONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 475│CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*476│CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 477│CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*478│CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 479│CONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 480│CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*481│CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 482│CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*483│CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 484│CONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*485│CONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 486│CONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*487│CONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 488│CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=stream-sub-attach stream=47 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 489│CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 490│CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*491│CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 492│CONN_LIFECYCLE: conn=137 role=brain wall_ms=1784265314905 mono_ms=72785 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*493│CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265314912 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 494│CONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*495│CONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*496│CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 497│CONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*498│CONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 499│CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 500│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 501│CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 502│CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*503│CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*504│CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 505│CONN_LIFECYCLE: conn=177 role=brain wall_ms=1784265315044 mono_ms=72924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 506│CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315044 mono_ms=72924 event=stream-sub-attach stream=52 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*507│CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 508│CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*509│CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 510│CONN_LIFECYCLE: conn=178 role=brain wall_ms=1784265315054 mono_ms=72934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 511│CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315054 mono_ms=72934 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*512│CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 513│CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*514│CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 515│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 516│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 517│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n    │...\n 521│CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*522│CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*523│CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 524│CONN_LIFECYCLE: conn=184 role=brain wall_ms=1784265318460 mono_ms=76340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 525│CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318460 mono_ms=76341 event=stream-sub-attach stream=63 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*526│CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318462 mono_ms=76342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 527│CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*528│CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 529│CONN_LIFECYCLE: conn=183 role=brain wall_ms=1784265318474 mono_ms=76355 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 530│CONN_LIFECYCLE: conn=183 role=brain stream-subscriber stream=62 wall_ms=1784265318474 mono_ms=76355 event=stream-sub-attach stream=62 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 531│CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 532│CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*533│CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*534│CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 535│CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=64 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 536│CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=65 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 537│CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 538│CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*539│CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318566 mono_ms=76446 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 540│CONN_LIFECYCLE: conn=190 role=brain wall_ms=1784265318566 mono_ms=76446 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*541│CONN_LIFECYCLE: conn=190 role=brain wall_ms=1784265318566 mono_ms=76446 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 542│CONN_LIFECYCLE: conn=191 role=brain wall_ms=1784265318568 mono_ms=76449 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*543│CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318568 mono_ms=76449 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*544│CONN_LIFECYCLE: conn=191 role=brain wall_ms=1784265318568 mono_ms=76449 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 545│CONN_LIFECYCLE: conn=192 role=brain wall_ms=1784265318619 mono_ms=76500 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*546│CONN_LIFECYCLE: conn=192 role=brain wall_ms=1784265318619 mono_ms=76500 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*547│CONN_LIFECYCLE: conn=183 role=brain stream-subscriber stream=62 wall_ms=1784265318774 mono_ms=76654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 548│CONN_LIFECYCLE: conn=193 role=brain wall_ms=1784265318774 mono_ms=76654 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*549│CONN_LIFECYCLE: conn=193 role=brain wall_ms=1784265318774 mono_ms=76654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 550│CONN_LIFECYCLE: conn=194 role=brain wall_ms=1784265319061 mono_ms=76942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 551│CONN_LIFECYCLE: conn=195 role=brain wall_ms=1784265319061 mono_ms=76942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*552│CONN_LIFECYCLE: conn=194 role=brain wall_ms=1784265319061 mono_ms=76942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*553│CONN_LIFECYCLE: conn=195 role=brain wall_ms=1784265319061 mono_ms=76942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 554│CONN_LIFECYCLE: conn=196 role=brain wall_ms=1784265319063 mono_ms=76943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 555│CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319063 mono_ms=76943 event=stream-sub-attach stream=67 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 556│CONN_LIFECYCLE: conn=197 role=brain wall_ms=1784265319067 mono_ms=76947 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 557│CONN_LIFECYCLE: conn=197 role=brain stream-subscriber stream=66 wall_ms=1784265319067 mono_ms=76948 event=stream-sub-attach stream=66 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*558│CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 559│CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*560│CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*561│CONN_LIFECYCLE: conn=197 role=brain stream-subscriber stream=66 wall_ms=1784265319091 mono_ms=76971 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 562│CONN_LIFECYCLE: conn=199 role=brain wall_ms=1784265319091 mono_ms=76972 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*563│CONN_LIFECYCLE: conn=199 role=brain wall_ms=1784265319091 mono_ms=76972 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 564│CONN_LIFECYCLE: conn=200 role=brain wall_ms=1784265320209 mono_ms=78090 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*565│CONN_LIFECYCLE: conn=200 role=brain wall_ms=1784265320210 mono_ms=78090 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 566│CONN_LIFECYCLE: conn=201 role=brain wall_ms=1784265323661 mono_ms=81542 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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 574│CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328205 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*575│CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328206 mono_ms=86086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 576│CONN_LIFECYCLE: conn=204 role=brain wall_ms=1784265328206 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*577│CONN_LIFECYCLE: conn=204 role=brain wall_ms=1784265328206 mono_ms=86086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 578│CONN_LIFECYCLE: conn=205 role=brain wall_ms=1784265328305 mono_ms=86186 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*579│CONN_LIFECYCLE: conn=205 role=brain wall_ms=1784265328306 mono_ms=86186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 580│CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86186 event=stream-sub-attach stream=69 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 581│CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*582│CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 583│CONN_LIFECYCLE: conn=207 role=brain wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*584│CONN_LIFECYCLE: conn=207 role=brain wall_ms=1784265328306 mono_ms=86187 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 585│CONN_LIFECYCLE: conn=208 role=brain wall_ms=1784265328704 mono_ms=86585 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*586│CONN_LIFECYCLE: conn=208 role=brain wall_ms=1784265328704 mono_ms=86585 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 587│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 588│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 589│PAIR_MEET_UP:BIGNET step=59475511 id=3c529f52d17d3c47ae1b6110f125d7361aae3e510f0c5788433d13768c096160 addr=EndpointAddr { id: PublicKey(3c529f52d17d3c47ae1b6110f125d7361aae3e510f0c5788433d13768c096160), addrs: {Ip(100.68.35.65:54064), Ip(192.168.1.81:54064)} }\n    │...\n 593│CONN_LIFECYCLE: conn=211 role=brain wall_ms=1784265333431 mono_ms=91312 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*594│CONN_LIFECYCLE: conn=210 role=brain wall_ms=1784265333431 mono_ms=91312 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*595│CONN_LIFECYCLE: conn=209 role=brain wall_ms=1784265333431 mono_ms=91312 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*596│CONN_LIFECYCLE: conn=211 role=brain wall_ms=1784265333431 mono_ms=91312 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 597│CONN_LIFECYCLE: conn=212 role=brain wall_ms=1784265333433 mono_ms=91313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 598│CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333433 mono_ms=91314 event=stream-sub-attach stream=70 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*599│CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 600│CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*601│CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 602│CONN_LIFECYCLE: conn=214 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 603│CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=71 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 604│CONN_LIFECYCLE: conn=213 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 605│CONN_LIFECYCLE: conn=213 role=brain stream-subscriber stream=72 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=72 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*606│CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333447 mono_ms=91327 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 607│CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*608│CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*609│CONN_LIFECYCLE: conn=213 role=brain stream-subscriber stream=72 wall_ms=1784265333447 mono_ms=91328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 610│CONN_LIFECYCLE: conn=217 role=brain wall_ms=1784265333447 mono_ms=91328 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*611│CONN_LIFECYCLE: conn=217 role=brain wall_ms=1784265333447 mono_ms=91328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 612│CONN_LIFECYCLE: conn=218 role=brain wall_ms=1784265333747 mono_ms=91628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*613│CONN_LIFECYCLE: conn=218 role=brain wall_ms=1784265333747 mono_ms=91628 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 614│CONN_LIFECYCLE: conn=219 role=brain wall_ms=1784265334034 mono_ms=91914 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*615│CONN_LIFECYCLE: conn=219 role=brain wall_ms=1784265334034 mono_ms=91914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 616│CONN_LIFECYCLE: conn=220 role=brain wall_ms=1784265334035 mono_ms=91915 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 617│CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334035 mono_ms=91915 event=stream-sub-attach stream=73 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*618│CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334043 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 619│CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334043 mono_ms=91924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*620│CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334044 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 621│CONN_LIFECYCLE: conn=222 role=brain wall_ms=1784265334737 mono_ms=92617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*622│CONN_LIFECYCLE: conn=222 role=brain wall_ms=1784265334737 mono_ms=92617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 623│CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=stream-sub-attach stream=74 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 624│CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*625│CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 626│CONN_LIFECYCLE: conn=224 role=brain wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*627│CONN_LIFECYCLE: conn=224 role=brain wall_ms=1784265334737 mono_ms=92618 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 628│CONN_LIFECYCLE: conn=225 role=brain wall_ms=1784265335541 mono_ms=93421 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*629│CONN_LIFECYCLE: conn=225 role=brain wall_ms=1784265335541 mono_ms=93421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 630│CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=stream-sub-attach stream=75 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 631│CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*632│CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335545 mono_ms=93426 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 633│CONN_LIFECYCLE: conn=227 role=brain wall_ms=1784265335545 mono_ms=93426 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*634│CONN_LIFECYCLE: conn=227 role=brain wall_ms=1784265335545 mono_ms=93426 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 635│CONN_LIFECYCLE: conn=228 role=brain wall_ms=1784265338788 mono_ms=96669 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*636│CONN_LIFECYCLE: conn=228 role=brain wall_ms=1784265338788 mono_ms=96669 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 637│CONN_LIFECYCLE: conn=229 role=brain wall_ms=1784265343746 mono_ms=101626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 638│CONN_LIFECYCLE: conn=229 role=brain stream-subscriber stream=79 wall_ms=1784265343746 mono_ms=101626 event=stream-sub-attach stream=79 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 639│CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*640│CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 641│CONN_LIFECYCLE: conn=231 role=brain wall_ms=1784265343777 mono_ms=101658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 642│CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343777 mono_ms=101658 event=stream-sub-attach stream=80 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*643│CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343785 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 644│CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*645│CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 646│CONN_LIFECYCLE: conn=233 role=brain wall_ms=1784265343832 mono_ms=101713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*647│CONN_LIFECYCLE: conn=233 role=brain wall_ms=1784265343832 mono_ms=101713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*648│CONN_LIFECYCLE: conn=229 role=brain stream-subscriber stream=79 wall_ms=1784265343862 mono_ms=101742 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 649│CONN_LIFECYCLE: conn=234 role=brain wall_ms=1784265344078 mono_ms=101958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*650│CONN_LIFECYCLE: conn=234 role=brain wall_ms=1784265344078 mono_ms=101959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 651│CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=stream-sub-attach stream=82 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 652│CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=write-start [REQ-CONN-POISON-ATTRIBUTION]","truncation":{"content":" 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...\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 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 48|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 wall_ms=1784265242749 mono_ms=630 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 49|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242749 mono_ms=630 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 59|ENDPOINT_AUTOSTART:lia adapter=claude-spt session=21df0f4230483015 pid=8928 (startup default)\n*60|CONN_LIFECYCLE: conn=17 role=brain wall_ms=1784265242840 mono_ms=721 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 61|CONN_LIFECYCLE: conn=1 role=brain controller session=2 endpoint=mobile-gw by=local wall_ms=1784265242860 mono_ms=741 event=session-detach session=2 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\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...\n 111|CONN_LIFECYCLE: conn=34 role=brain wall_ms=1784265247943 mono_ms=5823 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*112|CONN_LIFECYCLE: conn=34 role=brain wall_ms=1784265247943 mono_ms=5824 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 113|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248067 mono_ms=5948 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 114|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248085 mono_ms=5966 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 115|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248228 mono_ms=6109 event=writer-exit role=controller session=3 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 117|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248251 mono_ms=6132 event=session-detach session=3 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*118|CONN_LIFECYCLE: conn=35 role=brain controller session=3 endpoint=deployah by=local wall_ms=1784265248251 mono_ms=6132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 119|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248401 mono_ms=6282 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 120|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248432 mono_ms=6313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 121|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248436 mono_ms=6317 event=writer-exit role=controller session=4 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 123|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248466 mono_ms=6347 event=session-detach session=4 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*124|CONN_LIFECYCLE: conn=36 role=brain controller session=4 endpoint=doyle by=local wall_ms=1784265248466 mono_ms=6347 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 125|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248472 mono_ms=6353 event=controller-attach session=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 126|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248493 mono_ms=6374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 127|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248496 mono_ms=6377 event=writer-exit role=controller session=5 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 129|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248523 mono_ms=6404 event=session-detach session=5 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*130|CONN_LIFECYCLE: conn=37 role=brain controller session=5 endpoint=perri by=local wall_ms=1784265248523 mono_ms=6404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 131|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248531 mono_ms=6411 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 132|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248546 mono_ms=6427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 133|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248550 mono_ms=6431 event=writer-exit role=controller session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n...\n 135|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248579 mono_ms=6460 event=session-detach session=6 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*136|CONN_LIFECYCLE: conn=38 role=brain controller session=6 endpoint=webbie by=local wall_ms=1784265248579 mono_ms=6460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 137|CONN_LIFECYCLE: conn=39 role=brain wall_ms=1784265248695 mono_ms=6576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 138|CONN_LIFECYCLE: conn=39 role=brain stream-subscriber stream=4 wall_ms=1784265248702 mono_ms=6583 event=stream-sub-attach stream=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 139|CONN_LIFECYCLE: conn=40 role=brain wall_ms=1784265248710 mono_ms=6591 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 146|CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*147|CONN_LIFECYCLE: conn=44 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*148|CONN_LIFECYCLE: conn=43 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*149|CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 150|CONN_LIFECYCLE: conn=47 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 151|CONN_LIFECYCLE: conn=48 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 152|CONN_LIFECYCLE: conn=46 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 172|CONN_LIFECYCLE: conn=56 role=brain wall_ms=1784265253610 mono_ms=11491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*173|CONN_LIFECYCLE: conn=56 role=brain wall_ms=1784265253611 mono_ms=11491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 174|CONN_LIFECYCLE: conn=57 role=brain wall_ms=1784265253729 mono_ms=11610 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 175|CONN_LIFECYCLE: conn=58 role=brain wall_ms=1784265254731 mono_ms=12612 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 176|CONN_LIFECYCLE: conn=59 role=brain wall_ms=1784265255067 mono_ms=12948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*177|CONN_LIFECYCLE: conn=59 role=brain wall_ms=1784265255067 mono_ms=12948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 178|CONN_LIFECYCLE: conn=60 role=brain wall_ms=1784265255733 mono_ms=13614 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 179|CONN_LIFECYCLE: conn=61 role=brain wall_ms=1784265256734 mono_ms=14615 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 180|CONN_LIFECYCLE: conn=62 role=brain wall_ms=1784265257736 mono_ms=15617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 181|CONN_LIFECYCLE: conn=63 role=brain wall_ms=1784265258647 mono_ms=16528 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*182|CONN_LIFECYCLE: conn=63 role=brain wall_ms=1784265258648 mono_ms=16528 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 183|CONN_LIFECYCLE: conn=64 role=brain wall_ms=1784265258738 mono_ms=16619 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 184|CONN_LIFECYCLE: conn=65 role=brain wall_ms=1784265259792 mono_ms=17673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 185|CONN_LIFECYCLE: conn=66 role=brain wall_ms=1784265260844 mono_ms=18725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 188|CONN_LIFECYCLE: conn=69 role=brain wall_ms=1784265263687 mono_ms=21567 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*189|CONN_LIFECYCLE: conn=69 role=brain wall_ms=1784265263687 mono_ms=21568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 190|CONN_LIFECYCLE: conn=70 role=brain wall_ms=1784265263864 mono_ms=21745 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 191|CONN_LIFECYCLE: conn=71 role=brain wall_ms=1784265264866 mono_ms=22747 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 192|CONN_LIFECYCLE: conn=72 role=brain wall_ms=1784265265868 mono_ms=23749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 196|CONN_LIFECYCLE: conn=76 role=brain wall_ms=1784265268967 mono_ms=26848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*197|CONN_LIFECYCLE: conn=76 role=brain wall_ms=1784265268967 mono_ms=26848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 198|CONN_LIFECYCLE: conn=77 role=brain wall_ms=1784265269875 mono_ms=27756 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 199|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 200|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n...\n 202|PAIR_MEET_UP:SPT_DEV step=59475509 id=998c9da23046cbc78e4a77ac75ff9a6b2417bdb11ef38449ef2cb45e016b61ba addr=EndpointAddr { id: PublicKey(998c9da23046cbc78e4a77ac75ff9a6b2417bdb11ef38449ef2cb45e016b61ba), addrs: {Ip(100.68.35.65:51028), Ip(192.168.1.81:51028)} }\n*203|CONN_LIFECYCLE: conn=70 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*204|CONN_LIFECYCLE: conn=74 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*205|CONN_LIFECYCLE: conn=65 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*206|CONN_LIFECYCLE: conn=55 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*207|CONN_LIFECYCLE: conn=72 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*208|CONN_LIFECYCLE: conn=58 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*209|CONN_LIFECYCLE: conn=61 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*210|CONN_LIFECYCLE: conn=67 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*211|CONN_LIFECYCLE: conn=41 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*212|CONN_LIFECYCLE: conn=24 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*213|CONN_LIFECYCLE: conn=28 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*214|CONN_LIFECYCLE: conn=52 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*215|CONN_LIFECYCLE: conn=20 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*216|CONN_LIFECYCLE: conn=62 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*217|CONN_LIFECYCLE: conn=32 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*218|CONN_LIFECYCLE: conn=77 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*219|CONN_LIFECYCLE: conn=57 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*220|CONN_LIFECYCLE: conn=73 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*221|CONN_LIFECYCLE: conn=71 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*222|CONN_LIFECYCLE: conn=66 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*223|CONN_LIFECYCLE: conn=64 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*224|CONN_LIFECYCLE: conn=60 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*225|CONN_LIFECYCLE: conn=68 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*226|CONN_LIFECYCLE: conn=54 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*227|CONN_LIFECYCLE: conn=75 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*228|CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*229|CONN_LIFECYCLE: conn=53 role=brain wall_ms=1784265270877 mono_ms=28758 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 230|CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784265271531 mono_ms=29411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 231|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265271555 mono_ms=29436 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 232|CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*233|CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 234|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=stream-sub-attach stream=10 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 235|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*236|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271578 mono_ms=29458 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 237|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*238|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29463 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 239|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 wall_ms=1784265271644 mono_ms=29525 event=stream-sub-attach stream=14 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 240|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 241|CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*242|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*243|CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 244|CONN_LIFECYCLE: conn=83 role=brain wall_ms=1784265271671 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 245|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271671 mono_ms=29552 event=stream-sub-attach stream=13 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 246|CONN_LIFECYCLE: conn=84 role=brain wall_ms=1784265271672 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 248|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271675 mono_ms=29555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*249|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*250|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*251|CONN_LIFECYCLE: conn=84 role=brain stream-subscriber stream=12 wall_ms=1784265271679 mono_ms=29560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 252|CONN_LIFECYCLE: conn=86 role=brain wall_ms=1784265271692 mono_ms=29573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*253|CONN_LIFECYCLE: conn=86 role=brain wall_ms=1784265271692 mono_ms=29573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 254|CONN_LIFECYCLE: conn=87 role=brain wall_ms=1784265273073 mono_ms=30954 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*255|CONN_LIFECYCLE: conn=87 role=brain wall_ms=1784265273073 mono_ms=30954 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 256|CONN_LIFECYCLE: conn=88 role=brain wall_ms=1784265273075 mono_ms=30956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 257|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273075 mono_ms=30956 event=stream-sub-attach stream=15 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*258|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273078 mono_ms=30959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 259|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*260|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 261|CONN_LIFECYCLE: conn=90 role=brain wall_ms=1784265274019 mono_ms=31900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*262|CONN_LIFECYCLE: conn=90 role=brain wall_ms=1784265274019 mono_ms=31900 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 263|CONN_LIFECYCLE: conn=91 role=brain wall_ms=1784265274278 mono_ms=32159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 264|CONN_LIFECYCLE: conn=92 role=brain wall_ms=1784265274278 mono_ms=32159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*265|CONN_LIFECYCLE: conn=91 role=brain wall_ms=1784265274278 mono_ms=32159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*266|CONN_LIFECYCLE: conn=92 role=brain wall_ms=1784265274279 mono_ms=32159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 267|CONN_LIFECYCLE: conn=93 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 268|CONN_LIFECYCLE: conn=94 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 269|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=17 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 270|CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=16 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*271|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274282 mono_ms=32162 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 272|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*273|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*274|CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274284 mono_ms=32165 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 275|CONN_LIFECYCLE: conn=96 role=brain wall_ms=1784265274284 mono_ms=32165 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*276|CONN_LIFECYCLE: conn=96 role=brain wall_ms=1784265274285 mono_ms=32165 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 277|CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*278|CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 279|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=stream-sub-attach stream=18 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 280|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*281|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 282|CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*283|CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 284|CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274780 mono_ms=32661 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*285|CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274781 mono_ms=32661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 286|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32661 event=stream-sub-attach stream=19 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 287|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32662 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*288|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 289|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*290|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 291|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 wall_ms=1784265276296 mono_ms=34177 event=stream-sub-attach stream=20 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 292|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 wall_ms=1784265276389 mono_ms=34270 event=stream-sub-attach stream=23 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 293|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 wall_ms=1784265276685 mono_ms=34565 event=stream-sub-attach stream=24 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 299|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*300|CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*301|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 302|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=33 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 303|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=34 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 304|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 305|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*306|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278400 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 307|CONN_LIFECYCLE: conn=107 role=brain wall_ms=1784265278401 mono_ms=36281 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*308|CONN_LIFECYCLE: conn=107 role=brain wall_ms=1784265278401 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*309|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278405 mono_ms=36286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 310|CONN_LIFECYCLE: conn=108 role=brain wall_ms=1784265278405 mono_ms=36286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*311|CONN_LIFECYCLE: conn=108 role=brain wall_ms=1784265278405 mono_ms=36286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 312|CONN_LIFECYCLE: conn=109 role=brain wall_ms=1784265278797 mono_ms=36677 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*313|CONN_LIFECYCLE: conn=109 role=brain wall_ms=1784265278797 mono_ms=36677 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 314|CONN_LIFECYCLE: conn=110 role=brain wall_ms=1784265278797 mono_ms=36678 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 315|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278798 mono_ms=36678 event=stream-sub-attach stream=35 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*316|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278807 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 317|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278807 mono_ms=36688 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*318|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278808 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 319|CONN_LIFECYCLE: conn=112 role=brain wall_ms=1784265279062 mono_ms=36943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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...\n 326|CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*327|CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 328|CONN_LIFECYCLE: conn=115 role=brain wall_ms=1784265283622 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 329|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 wall_ms=1784265283622 mono_ms=41503 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 330|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 wall_ms=1784265283622 mono_ms=41503 event=viewer-attach session=6 vid=0 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 332|CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284118 mono_ms=41999 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*333|CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284119 mono_ms=41999 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 334|CONN_LIFECYCLE: conn=118 role=brain wall_ms=1784265288241 mono_ms=46122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*335|CONN_LIFECYCLE: conn=118 role=brain wall_ms=1784265288241 mono_ms=46122 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 336|CONN_LIFECYCLE: conn=119 role=brain wall_ms=1784265288242 mono_ms=46123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 337|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288243 mono_ms=46123 event=stream-sub-attach stream=38 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*338|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 339|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*340|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 341|CONN_LIFECYCLE: conn=121 role=brain wall_ms=1784265289171 mono_ms=47051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*342|CONN_LIFECYCLE: conn=121 role=brain wall_ms=1784265289171 mono_ms=47051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 343|CONN_LIFECYCLE: conn=122 role=brain wall_ms=1784265293265 mono_ms=51145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 344|CONN_LIFECYCLE: conn=123 role=brain wall_ms=1784265293265 mono_ms=51145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*345|CONN_LIFECYCLE: conn=122 role=brain wall_ms=1784265293265 mono_ms=51145 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*346|CONN_LIFECYCLE: conn=123 role=brain wall_ms=1784265293265 mono_ms=51145 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 347|CONN_LIFECYCLE: conn=124 role=brain wall_ms=1784265293266 mono_ms=51146 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 348|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293266 mono_ms=51147 event=stream-sub-attach stream=39 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*349|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 350|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*351|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 352|CONN_LIFECYCLE: conn=125 role=brain wall_ms=1784265293277 mono_ms=51158 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 353|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293277 mono_ms=51158 event=stream-sub-attach stream=40 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*354|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 355|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*356|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 357|CONN_LIFECYCLE: conn=128 role=brain wall_ms=1784265293867 mono_ms=51748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*358|CONN_LIFECYCLE: conn=128 role=brain wall_ms=1784265293867 mono_ms=51748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 359|CONN_LIFECYCLE: conn=129 role=brain wall_ms=1784265293869 mono_ms=51749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 360|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293869 mono_ms=51749 event=stream-sub-attach stream=41 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*361|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 362|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*363|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 364|CONN_LIFECYCLE: conn=131 role=brain wall_ms=1784265294216 mono_ms=52097 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*365|CONN_LIFECYCLE: conn=131 role=brain wall_ms=1784265294216 mono_ms=52097 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 366|CONN_LIFECYCLE: conn=132 role=brain wall_ms=1784265298173 mono_ms=56053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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*372|CONN_LIFECYCLE: conn=16 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*373|CONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*374|CONN_LIFECYCLE: conn=51 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*375|CONN_LIFECYCLE: conn=49 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*376|CONN_LIFECYCLE: conn=116 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*377|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 378|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*379|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 380|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\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*386|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 387|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=6 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 388|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=3 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*389|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*390|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 391|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=session-detach session=6 was_controller=false viewers_dropped=2 [REQ-CONN-POISON-ATTRIBUTION]\n 392|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 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...\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 399|CONN_LIFECYCLE: conn=134 role=brain wall_ms=1784265298378 mono_ms=56258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*400|CONN_LIFECYCLE: conn=134 role=brain wall_ms=1784265298378 mono_ms=56259 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 401|CONN_LIFECYCLE: conn=135 role=brain wall_ms=1784265298412 mono_ms=56293 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\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...\n 409|CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*410|CONN_LIFECYCLE: conn=139 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 411|CONN_LIFECYCLE: conn=141 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*412|CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 413|CONN_LIFECYCLE: conn=142 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*414|CONN_LIFECYCLE: conn=141 role=brain wall_ms=1784265298871 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 415|CONN_LIFECYCLE: conn=143 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*416|CONN_LIFECYCLE: conn=142 role=brain wall_ms=1784265298872 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*417|CONN_LIFECYCLE: conn=143 role=brain wall_ms=1784265298872 mono_ms=56752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 418|CONN_LIFECYCLE: conn=144 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 419|CONN_LIFECYCLE: conn=145 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 420|CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 450|CONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*451|CONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 452|CONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*453|CONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 454|CONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 455|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*456|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 457|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*458|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 459|CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303894 mono_ms=61775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*460|CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 461|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 462|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*463|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 464|CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*465|CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 466|CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*467|CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 468|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 469|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 470|CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 471|CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*472|CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*473|CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 474|CONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 475|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*476|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 477|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*478|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 479|CONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 480|CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"bytes","totalLines":508,"totalBytes":76939,"outputLines":338,"outputBytes":51024,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":508,"totalBytes":76939,"outputLines":338,"outputBytes":51024,"shownRange":{"start":1,"end":338},"nextOffset":339}}},"isError":false,"timestamp":1784271942823}}
{"type":"message","id":"bb331e37","parentId":"8e7ddde3","timestamp":"2026-07-17T07:05:42.830Z","message":{"role":"toolResult","toolCallId":"call_fYe1KzNviwEraJbYq0kqLcGd|fc_0fcf561150331aac016a59d4461ce0819091ed6cbf631a4f9e","toolName":"grep","content":[{"type":"text","text":" 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...\n 47|CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784265242749 mono_ms=630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*48|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 wall_ms=1784265242749 mono_ms=630 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 49|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242749 mono_ms=630 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 50|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242770 mono_ms=651 event=controller-replaced session=1 new_conn=15 [REQ-CONN-POISON-ATTRIBUTION]\n 51|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265242770 mono_ms=651 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 137|CONN_LIFECYCLE: conn=39 role=brain wall_ms=1784265248695 mono_ms=6576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*138|CONN_LIFECYCLE: conn=39 role=brain stream-subscriber stream=4 wall_ms=1784265248702 mono_ms=6583 event=stream-sub-attach stream=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 139|CONN_LIFECYCLE: conn=40 role=brain wall_ms=1784265248710 mono_ms=6591 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*140|CONN_LIFECYCLE: conn=40 role=brain stream-subscriber stream=6 wall_ms=1784265248717 mono_ms=6598 event=stream-sub-attach stream=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 141|CONN_LIFECYCLE: conn=41 role=brain wall_ms=1784265248719 mono_ms=6600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 142|CONN_LIFECYCLE: conn=42 role=brain wall_ms=1784265248736 mono_ms=6617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*143|CONN_LIFECYCLE: conn=42 role=brain stream-subscriber stream=8 wall_ms=1784265248743 mono_ms=6624 event=stream-sub-attach stream=8 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 144|CONN_LIFECYCLE: conn=43 role=brain wall_ms=1784265248772 mono_ms=6652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 145|CONN_LIFECYCLE: conn=44 role=brain wall_ms=1784265248772 mono_ms=6652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 146|CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 152|CONN_LIFECYCLE: conn=46 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*153|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=7 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*154|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*155|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 156|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 157|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 158|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 233|CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*234|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=stream-sub-attach stream=10 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 235|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 236|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271578 mono_ms=29458 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 237|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 238|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29463 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*239|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 wall_ms=1784265271644 mono_ms=29525 event=stream-sub-attach stream=14 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 240|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 241|CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 242|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 244|CONN_LIFECYCLE: conn=83 role=brain wall_ms=1784265271671 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*245|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271671 mono_ms=29552 event=stream-sub-attach stream=13 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 246|CONN_LIFECYCLE: conn=84 role=brain wall_ms=1784265271672 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*247|CONN_LIFECYCLE: conn=84 role=brain stream-subscriber stream=12 wall_ms=1784265271672 mono_ms=29552 event=stream-sub-attach stream=12 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 248|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271675 mono_ms=29555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 249|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 250|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 256|CONN_LIFECYCLE: conn=88 role=brain wall_ms=1784265273075 mono_ms=30956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*257|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273075 mono_ms=30956 event=stream-sub-attach stream=15 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 258|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273078 mono_ms=30959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 259|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 260|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 268|CONN_LIFECYCLE: conn=94 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*269|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=17 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*270|CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=16 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 271|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274282 mono_ms=32162 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 272|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 273|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 278|CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*279|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=stream-sub-attach stream=18 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 280|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 281|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 282|CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 285|CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274781 mono_ms=32661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*286|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32661 event=stream-sub-attach stream=19 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 287|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32662 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 288|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 289|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 290|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*291|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 wall_ms=1784265276296 mono_ms=34177 event=stream-sub-attach stream=20 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*292|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 wall_ms=1784265276389 mono_ms=34270 event=stream-sub-attach stream=23 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*293|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 wall_ms=1784265276685 mono_ms=34565 event=stream-sub-attach stream=24 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*294|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 wall_ms=1784265276909 mono_ms=34790 event=stream-sub-attach stream=27 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*295|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 wall_ms=1784265277094 mono_ms=34974 event=stream-sub-attach stream=28 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*296|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 wall_ms=1784265277291 mono_ms=35171 event=stream-sub-attach stream=31 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*297|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265277496 mono_ms=35377 event=stream-sub-attach stream=32 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 298|CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 299|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 300|CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 301|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*302|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=33 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*303|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=34 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 304|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 305|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 306|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278400 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 314|CONN_LIFECYCLE: conn=110 role=brain wall_ms=1784265278797 mono_ms=36678 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*315|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278798 mono_ms=36678 event=stream-sub-attach stream=35 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 316|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278807 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 317|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278807 mono_ms=36688 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 318|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278808 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\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 327|CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 328|CONN_LIFECYCLE: conn=115 role=brain wall_ms=1784265283622 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*329|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 wall_ms=1784265283622 mono_ms=41503 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 330|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 wall_ms=1784265283622 mono_ms=41503 event=viewer-attach session=6 vid=0 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 331|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=1784265283630 mono_ms=41510 event=viewer-attach session=6 vid=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 332|CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284118 mono_ms=41999 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 336|CONN_LIFECYCLE: conn=119 role=brain wall_ms=1784265288242 mono_ms=46123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*337|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288243 mono_ms=46123 event=stream-sub-attach stream=38 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 338|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 339|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 340|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 347|CONN_LIFECYCLE: conn=124 role=brain wall_ms=1784265293266 mono_ms=51146 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*348|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293266 mono_ms=51147 event=stream-sub-attach stream=39 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 349|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 350|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 351|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 352|CONN_LIFECYCLE: conn=125 role=brain wall_ms=1784265293277 mono_ms=51158 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*353|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293277 mono_ms=51158 event=stream-sub-attach stream=40 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 354|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 355|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 356|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 359|CONN_LIFECYCLE: conn=129 role=brain wall_ms=1784265293869 mono_ms=51749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*360|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293869 mono_ms=51749 event=stream-sub-attach stream=41 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 361|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 362|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 363|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 419|CONN_LIFECYCLE: conn=145 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*420|CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*421|CONN_LIFECYCLE: conn=145 role=brain stream-subscriber stream=3 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 422|CONN_LIFECYCLE: conn=146 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 423|CONN_LIFECYCLE: conn=147 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*424|CONN_LIFECYCLE: conn=146 role=brain stream-subscriber stream=1 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*425|CONN_LIFECYCLE: conn=147 role=brain stream-subscriber stream=7 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=7 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 426|CONN_LIFECYCLE: conn=148 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 427|CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298872 mono_ms=56753 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 428|CONN_LIFECYCLE: conn=145 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298872 mono_ms=56753 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*429|CONN_LIFECYCLE: conn=148 role=brain stream-subscriber stream=36 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 430|CONN_LIFECYCLE: conn=146 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298873 mono_ms=56753 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 431|CONN_LIFECYCLE: conn=147 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298873 mono_ms=56753 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 432|CONN_LIFECYCLE: conn=148 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=2 wall_ms=1784265298908 mono_ms=56788 event=viewer-attach session=6 vid=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 454|CONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*455|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 456|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 457|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 458|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 460|CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*461|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 462|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 463|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 464|CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 467|CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*468|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 469|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 470|CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 471|CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 474|CONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*475|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 476|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 477|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 478|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 479|CONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*480|CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 481|CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 482|CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 483|CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 487|CONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*488|CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=stream-sub-attach stream=47 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 489|CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 490|CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 491|CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 499|CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*500|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 501|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 502|CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 503|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 505|CONN_LIFECYCLE: conn=177 role=brain wall_ms=1784265315044 mono_ms=72924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*506|CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315044 mono_ms=72924 event=stream-sub-attach stream=52 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 507|CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 508|CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 509|CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 510|CONN_LIFECYCLE: conn=178 role=brain wall_ms=1784265315054 mono_ms=72934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*511|CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315054 mono_ms=72934 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 512|CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 513|CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 514|CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*515|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*516|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*517|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*518|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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*519|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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 520|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 521|CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 522|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 524|CONN_LIFECYCLE: conn=184 role=brain wall_ms=1784265318460 mono_ms=76340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*525|CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318460 mono_ms=76341 event=stream-sub-attach stream=63 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 526|CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318462 mono_ms=76342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 527|CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 528|CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 529|CONN_LIFECYCLE: conn=183 role=brain wall_ms=1784265318474 mono_ms=76355 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*530|CONN_LIFECYCLE: conn=183 role=brain stream-subscriber stream=62 wall_ms=1784265318474 mono_ms=76355 event=stream-sub-attach stream=62 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 531|CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 532|CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 533|CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 534|CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*535|CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=64 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*536|CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=65 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 537|CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 538|CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 539|CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318566 mono_ms=76446 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 554|CONN_LIFECYCLE: conn=196 role=brain wall_ms=1784265319063 mono_ms=76943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*555|CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319063 mono_ms=76943 event=stream-sub-attach stream=67 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 556|CONN_LIFECYCLE: conn=197 role=brain wall_ms=1784265319067 mono_ms=76947 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*557|CONN_LIFECYCLE: conn=197 role=brain stream-subscriber stream=66 wall_ms=1784265319067 mono_ms=76948 event=stream-sub-attach stream=66 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 558|CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 559|CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 560|CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\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 574|CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328205 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 575|CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328206 mono_ms=86086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 576|CONN_LIFECYCLE: conn=204 role=brain wall_ms=1784265328206 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 579|CONN_LIFECYCLE: conn=205 role=brain wall_ms=1784265328306 mono_ms=86186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*580|CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86186 event=stream-sub-attach stream=69 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 581|CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 582|CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 583|CONN_LIFECYCLE: conn=207 role=brain wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 597|CONN_LIFECYCLE: conn=212 role=brain wall_ms=1784265333433 mono_ms=91313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*598|CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333433 mono_ms=91314 event=stream-sub-attach stream=70 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 599|CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 600|CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 601|CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 602|CONN_LIFECYCLE: conn=214 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*603|CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=71 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 604|CONN_LIFECYCLE: conn=213 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*605|CONN_LIFECYCLE: conn=213 role=brain stream-subscriber stream=72 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=72 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 606|CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333447 mono_ms=91327 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 607|CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 608|CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 616|CONN_LIFECYCLE: conn=220 role=brain wall_ms=1784265334035 mono_ms=91915 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*617|CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334035 mono_ms=91915 event=stream-sub-attach stream=73 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 618|CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334043 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 619|CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334043 mono_ms=91924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 620|CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334044 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 622|CONN_LIFECYCLE: conn=222 role=brain wall_ms=1784265334737 mono_ms=92617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*623|CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=stream-sub-attach stream=74 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 624|CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 625|CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 626|CONN_LIFECYCLE: conn=224 role=brain wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 629|CONN_LIFECYCLE: conn=225 role=brain wall_ms=1784265335541 mono_ms=93421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*630|CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=stream-sub-attach stream=75 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 631|CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 632|CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335545 mono_ms=93426 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 633|CONN_LIFECYCLE: conn=227 role=brain wall_ms=1784265335545 mono_ms=93426 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 637|CONN_LIFECYCLE: conn=229 role=brain wall_ms=1784265343746 mono_ms=101626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*638|CONN_LIFECYCLE: conn=229 role=brain stream-subscriber stream=79 wall_ms=1784265343746 mono_ms=101626 event=stream-sub-attach stream=79 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 639|CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 640|CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 641|CONN_LIFECYCLE: conn=231 role=brain wall_ms=1784265343777 mono_ms=101658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*642|CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343777 mono_ms=101658 event=stream-sub-attach stream=80 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 643|CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343785 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 644|CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 645|CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 650|CONN_LIFECYCLE: conn=234 role=brain wall_ms=1784265344078 mono_ms=101959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*651|CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=stream-sub-attach stream=82 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 652|CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 653|CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344085 mono_ms=101966 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 654|CONN_LIFECYCLE: conn=236 role=brain wall_ms=1784265344085 mono_ms=101966 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 660|CONN_LIFECYCLE: conn=239 role=brain wall_ms=1784265348500 mono_ms=106381 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*661|CONN_LIFECYCLE: conn=239 role=brain stream-subscriber stream=83 wall_ms=1784265348500 mono_ms=106381 event=stream-sub-attach stream=83 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 662|CONN_LIFECYCLE: conn=240 role=brain wall_ms=1784265348505 mono_ms=106386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 663|CONN_LIFECYCLE: conn=239 role=brain stream-subscriber stream=83 wall_ms=1784265348505 mono_ms=106386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*664|CONN_LIFECYCLE: conn=240 role=brain stream-subscriber stream=84 wall_ms=1784265348505 mono_ms=106386 event=stream-sub-attach stream=84 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 665|CONN_LIFECYCLE: conn=241 role=brain wall_ms=1784265348505 mono_ms=106386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 666|CONN_LIFECYCLE: conn=241 role=brain wall_ms=1784265348505 mono_ms=106386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 667|CONN_LIFECYCLE: conn=240 role=brain stream-subscriber stream=84 wall_ms=1784265348507 mono_ms=106388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 672|CONN_LIFECYCLE: conn=244 role=brain wall_ms=1784265348600 mono_ms=106481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*673|CONN_LIFECYCLE: conn=244 role=brain stream-subscriber stream=85 wall_ms=1784265348600 mono_ms=106481 event=stream-sub-attach stream=85 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 674|CONN_LIFECYCLE: conn=244 role=brain stream-subscriber stream=85 wall_ms=1784265348603 mono_ms=106483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 675|CONN_LIFECYCLE: conn=245 role=brain wall_ms=1784265348603 mono_ms=106483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 676|CONN_LIFECYCLE: conn=245 role=brain wall_ms=1784265348603 mono_ms=106483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 680|CONN_LIFECYCLE: conn=247 role=brain wall_ms=1784265348800 mono_ms=106680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*681|CONN_LIFECYCLE: conn=249 role=brain stream-subscriber stream=87 wall_ms=1784265348800 mono_ms=106681 event=stream-sub-attach stream=87 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*682|CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348800 mono_ms=106681 event=stream-sub-attach stream=86 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 683|CONN_LIFECYCLE: conn=249 role=brain stream-subscriber stream=87 wall_ms=1784265348800 mono_ms=106681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 684|CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348800 mono_ms=106681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 685|CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348808 mono_ms=106688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 702|CONN_LIFECYCLE: conn=256 role=brain wall_ms=1784265359151 mono_ms=117032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*703|CONN_LIFECYCLE: conn=256 role=brain stream-subscriber stream=88 wall_ms=1784265359151 mono_ms=117032 event=stream-sub-attach stream=88 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 704|CONN_LIFECYCLE: conn=256 role=brain stream-subscriber stream=88 wall_ms=1784265359163 mono_ms=117043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 705|CONN_LIFECYCLE: conn=257 role=brain wall_ms=1784265359163 mono_ms=117043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 706|CONN_LIFECYCLE: conn=257 role=brain wall_ms=1784265359163 mono_ms=117044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 718|CONN_LIFECYCLE: conn=262 role=brain wall_ms=1784265363674 mono_ms=121555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*719|CONN_LIFECYCLE: conn=263 role=brain stream-subscriber stream=89 wall_ms=1784265363674 mono_ms=121555 event=stream-sub-attach stream=89 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*720|CONN_LIFECYCLE: conn=262 role=brain stream-subscriber stream=91 wall_ms=1784265363674 mono_ms=121555 event=stream-sub-attach stream=91 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 721|CONN_LIFECYCLE: conn=262 role=brain stream-subscriber stream=91 wall_ms=1784265363676 mono_ms=121556 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 722|CONN_LIFECYCLE: conn=264 role=brain wall_ms=1784265363676 mono_ms=121557 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 723|CONN_LIFECYCLE: conn=264 role=brain wall_ms=1784265363676 mono_ms=121557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 727|CONN_LIFECYCLE: conn=261 role=brain wall_ms=1784265363680 mono_ms=121561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*728|CONN_LIFECYCLE: conn=261 role=brain stream-subscriber stream=90 wall_ms=1784265363680 mono_ms=121561 event=stream-sub-attach stream=90 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 729|CONN_LIFECYCLE: conn=261 role=brain stream-subscriber stream=90 wall_ms=1784265363682 mono_ms=121563 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 730|CONN_LIFECYCLE: conn=266 role=brain wall_ms=1784265363682 mono_ms=121563 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 731|CONN_LIFECYCLE: conn=266 role=brain wall_ms=1784265363683 mono_ms=121563 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 735|CONN_LIFECYCLE: conn=268 role=brain wall_ms=1784265364176 mono_ms=122056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*736|CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=stream-sub-attach stream=92 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 737|CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 738|CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 739|CONN_LIFECYCLE: conn=270 role=brain wall_ms=1784265364177 mono_ms=122057 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 742|CONN_LIFECYCLE: conn=271 role=brain wall_ms=1784265365883 mono_ms=123764 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*743|CONN_LIFECYCLE: conn=272 role=brain stream-subscriber stream=93 wall_ms=1784265365883 mono_ms=123764 event=stream-sub-attach stream=93 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 744|CONN_LIFECYCLE: conn=272 role=brain stream-subscriber stream=93 wall_ms=1784265365883 mono_ms=123764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 745|CONN_LIFECYCLE: conn=273 role=brain wall_ms=1784265369062 mono_ms=126942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 746|CONN_LIFECYCLE: conn=273 role=brain wall_ms=1784265369062 mono_ms=126943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 755|CONN_LIFECYCLE: conn=276 role=brain wall_ms=1784265374325 mono_ms=132205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*756|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374325 mono_ms=132205 event=stream-sub-attach stream=97 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 757|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374325 mono_ms=132205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 758|CONN_LIFECYCLE: conn=278 role=brain wall_ms=1784265374326 mono_ms=132206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*759|CONN_LIFECYCLE: conn=278 role=brain stream-subscriber stream=98 wall_ms=1784265374326 mono_ms=132206 event=stream-sub-attach stream=98 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 760|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374332 mono_ms=132212 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 1-349 of 928 (50.0KB limit). Use :350 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":"   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     │...\n   47│CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784265242749 mono_ms=630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  *48│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 wall_ms=1784265242749 mono_ms=630 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   49│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242749 mono_ms=630 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   50│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242770 mono_ms=651 event=controller-replaced session=1 new_conn=15 [REQ-CONN-POISON-ATTRIBUTION]\n   51│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265242770 mono_ms=651 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  137│CONN_LIFECYCLE: conn=39 role=brain wall_ms=1784265248695 mono_ms=6576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *138│CONN_LIFECYCLE: conn=39 role=brain stream-subscriber stream=4 wall_ms=1784265248702 mono_ms=6583 event=stream-sub-attach stream=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  139│CONN_LIFECYCLE: conn=40 role=brain wall_ms=1784265248710 mono_ms=6591 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *140│CONN_LIFECYCLE: conn=40 role=brain stream-subscriber stream=6 wall_ms=1784265248717 mono_ms=6598 event=stream-sub-attach stream=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  141│CONN_LIFECYCLE: conn=41 role=brain wall_ms=1784265248719 mono_ms=6600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  142│CONN_LIFECYCLE: conn=42 role=brain wall_ms=1784265248736 mono_ms=6617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *143│CONN_LIFECYCLE: conn=42 role=brain stream-subscriber stream=8 wall_ms=1784265248743 mono_ms=6624 event=stream-sub-attach stream=8 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  144│CONN_LIFECYCLE: conn=43 role=brain wall_ms=1784265248772 mono_ms=6652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  145│CONN_LIFECYCLE: conn=44 role=brain wall_ms=1784265248772 mono_ms=6652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  146│CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  152│CONN_LIFECYCLE: conn=46 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *153│CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=7 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *154│CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *155│CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  156│CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  157│CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  158│CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  233│CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *234│CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=stream-sub-attach stream=10 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  235│CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  236│CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271578 mono_ms=29458 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  237│CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  238│CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29463 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *239│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 wall_ms=1784265271644 mono_ms=29525 event=stream-sub-attach stream=14 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  240│CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  241│CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  242│CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  244│CONN_LIFECYCLE: conn=83 role=brain wall_ms=1784265271671 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *245│CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271671 mono_ms=29552 event=stream-sub-attach stream=13 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  246│CONN_LIFECYCLE: conn=84 role=brain wall_ms=1784265271672 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *247│CONN_LIFECYCLE: conn=84 role=brain stream-subscriber stream=12 wall_ms=1784265271672 mono_ms=29552 event=stream-sub-attach stream=12 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  248│CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271675 mono_ms=29555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  249│CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  250│CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  256│CONN_LIFECYCLE: conn=88 role=brain wall_ms=1784265273075 mono_ms=30956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *257│CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273075 mono_ms=30956 event=stream-sub-attach stream=15 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  258│CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273078 mono_ms=30959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  259│CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  260│CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  268│CONN_LIFECYCLE: conn=94 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *269│CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=17 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *270│CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=16 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  271│CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274282 mono_ms=32162 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  272│CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  273│CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  278│CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *279│CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=stream-sub-attach stream=18 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  280│CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  281│CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  282│CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  285│CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274781 mono_ms=32661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *286│CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32661 event=stream-sub-attach stream=19 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  287│CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32662 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  288│CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  289│CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  290│CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *291│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 wall_ms=1784265276296 mono_ms=34177 event=stream-sub-attach stream=20 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *292│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 wall_ms=1784265276389 mono_ms=34270 event=stream-sub-attach stream=23 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *293│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 wall_ms=1784265276685 mono_ms=34565 event=stream-sub-attach stream=24 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *294│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 wall_ms=1784265276909 mono_ms=34790 event=stream-sub-attach stream=27 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *295│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 wall_ms=1784265277094 mono_ms=34974 event=stream-sub-attach stream=28 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *296│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 wall_ms=1784265277291 mono_ms=35171 event=stream-sub-attach stream=31 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *297│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265277496 mono_ms=35377 event=stream-sub-attach stream=32 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  298│CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  299│CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  300│CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  301│CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *302│CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=33 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *303│CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=34 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  304│CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  305│CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  306│CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278400 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  314│CONN_LIFECYCLE: conn=110 role=brain wall_ms=1784265278797 mono_ms=36678 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *315│CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278798 mono_ms=36678 event=stream-sub-attach stream=35 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  316│CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278807 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  317│CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278807 mono_ms=36688 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  318│CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278808 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\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  327│CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  328│CONN_LIFECYCLE: conn=115 role=brain wall_ms=1784265283622 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *329│CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 wall_ms=1784265283622 mono_ms=41503 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  330│CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 wall_ms=1784265283622 mono_ms=41503 event=viewer-attach session=6 vid=0 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  331│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=1784265283630 mono_ms=41510 event=viewer-attach session=6 vid=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  332│CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284118 mono_ms=41999 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  336│CONN_LIFECYCLE: conn=119 role=brain wall_ms=1784265288242 mono_ms=46123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *337│CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288243 mono_ms=46123 event=stream-sub-attach stream=38 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  338│CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  339│CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  340│CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  347│CONN_LIFECYCLE: conn=124 role=brain wall_ms=1784265293266 mono_ms=51146 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *348│CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293266 mono_ms=51147 event=stream-sub-attach stream=39 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  349│CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  350│CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  351│CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  352│CONN_LIFECYCLE: conn=125 role=brain wall_ms=1784265293277 mono_ms=51158 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *353│CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293277 mono_ms=51158 event=stream-sub-attach stream=40 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  354│CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  355│CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  356│CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  359│CONN_LIFECYCLE: conn=129 role=brain wall_ms=1784265293869 mono_ms=51749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *360│CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293869 mono_ms=51749 event=stream-sub-attach stream=41 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  361│CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  362│CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  363│CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  419│CONN_LIFECYCLE: conn=145 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *420│CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *421│CONN_LIFECYCLE: conn=145 role=brain stream-subscriber stream=3 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  422│CONN_LIFECYCLE: conn=146 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  423│CONN_LIFECYCLE: conn=147 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *424│CONN_LIFECYCLE: conn=146 role=brain stream-subscriber stream=1 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *425│CONN_LIFECYCLE: conn=147 role=brain stream-subscriber stream=7 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=7 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  426│CONN_LIFECYCLE: conn=148 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  427│CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298872 mono_ms=56753 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  428│CONN_LIFECYCLE: conn=145 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298872 mono_ms=56753 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *429│CONN_LIFECYCLE: conn=148 role=brain stream-subscriber stream=36 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  430│CONN_LIFECYCLE: conn=146 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298873 mono_ms=56753 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  431│CONN_LIFECYCLE: conn=147 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298873 mono_ms=56753 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  432│CONN_LIFECYCLE: conn=148 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=2 wall_ms=1784265298908 mono_ms=56788 event=viewer-attach session=6 vid=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  454│CONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *455│CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  456│CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  457│CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  458│CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  460│CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *461│CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  462│CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  463│CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  464│CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  467│CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *468│CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  469│CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  470│CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  471│CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  474│CONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *475│CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  476│CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  477│CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  478│CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  479│CONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *480│CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  481│CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  482│CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  483│CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  487│CONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *488│CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=stream-sub-attach stream=47 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  489│CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  490│CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  491│CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  499│CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *500│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  501│CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  502│CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  503│CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  505│CONN_LIFECYCLE: conn=177 role=brain wall_ms=1784265315044 mono_ms=72924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *506│CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315044 mono_ms=72924 event=stream-sub-attach stream=52 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  507│CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  508│CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  509│CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  510│CONN_LIFECYCLE: conn=178 role=brain wall_ms=1784265315054 mono_ms=72934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *511│CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315054 mono_ms=72934 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  512│CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  513│CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  514│CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *515│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *516│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *517│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *518│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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *519│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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  520│CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  521│CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  522│CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  524│CONN_LIFECYCLE: conn=184 role=brain wall_ms=1784265318460 mono_ms=76340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *525│CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318460 mono_ms=76341 event=stream-sub-attach stream=63 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  526│CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318462 mono_ms=76342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  527│CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  528│CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  529│CONN_LIFECYCLE: conn=183 role=brain wall_ms=1784265318474 mono_ms=76355 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *530│CONN_LIFECYCLE: conn=183 role=brain stream-subscriber stream=62 wall_ms=1784265318474 mono_ms=76355 event=stream-sub-attach stream=62 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  531│CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  532│CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  533│CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  534│CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *535│CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=64 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *536│CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=65 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  537│CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  538│CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  539│CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318566 mono_ms=76446 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  554│CONN_LIFECYCLE: conn=196 role=brain wall_ms=1784265319063 mono_ms=76943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *555│CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319063 mono_ms=76943 event=stream-sub-attach stream=67 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  556│CONN_LIFECYCLE: conn=197 role=brain wall_ms=1784265319067 mono_ms=76947 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *557│CONN_LIFECYCLE: conn=197 role=brain stream-subscriber stream=66 wall_ms=1784265319067 mono_ms=76948 event=stream-sub-attach stream=66 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  558│CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  559│CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  560│CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\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  574│CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328205 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  575│CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328206 mono_ms=86086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  576│CONN_LIFECYCLE: conn=204 role=brain wall_ms=1784265328206 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  579│CONN_LIFECYCLE: conn=205 role=brain wall_ms=1784265328306 mono_ms=86186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *580│CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86186 event=stream-sub-attach stream=69 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  581│CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  582│CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  583│CONN_LIFECYCLE: conn=207 role=brain wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  597│CONN_LIFECYCLE: conn=212 role=brain wall_ms=1784265333433 mono_ms=91313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *598│CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333433 mono_ms=91314 event=stream-sub-attach stream=70 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  599│CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  600│CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  601│CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  602│CONN_LIFECYCLE: conn=214 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *603│CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=71 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  604│CONN_LIFECYCLE: conn=213 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *605│CONN_LIFECYCLE: conn=213 role=brain stream-subscriber stream=72 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=72 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  606│CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333447 mono_ms=91327 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  607│CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  608│CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  616│CONN_LIFECYCLE: conn=220 role=brain wall_ms=1784265334035 mono_ms=91915 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *617│CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334035 mono_ms=91915 event=stream-sub-attach stream=73 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  618│CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334043 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  619│CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334043 mono_ms=91924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  620│CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334044 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  622│CONN_LIFECYCLE: conn=222 role=brain wall_ms=1784265334737 mono_ms=92617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *623│CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=stream-sub-attach stream=74 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  624│CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  625│CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  626│CONN_LIFECYCLE: conn=224 role=brain wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  629│CONN_LIFECYCLE: conn=225 role=brain wall_ms=1784265335541 mono_ms=93421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *630│CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=stream-sub-attach stream=75 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  631│CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  632│CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335545 mono_ms=93426 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  633│CONN_LIFECYCLE: conn=227 role=brain wall_ms=1784265335545 mono_ms=93426 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  637│CONN_LIFECYCLE: conn=229 role=brain wall_ms=1784265343746 mono_ms=101626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *638│CONN_LIFECYCLE: conn=229 role=brain stream-subscriber stream=79 wall_ms=1784265343746 mono_ms=101626 event=stream-sub-attach stream=79 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  639│CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  640│CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  641│CONN_LIFECYCLE: conn=231 role=brain wall_ms=1784265343777 mono_ms=101658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *642│CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343777 mono_ms=101658 event=stream-sub-attach stream=80 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  643│CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343785 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  644│CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  645│CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  650│CONN_LIFECYCLE: conn=234 role=brain wall_ms=1784265344078 mono_ms=101959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *651│CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=stream-sub-attach stream=82 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  652│CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  653│CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344085 mono_ms=101966 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  654│CONN_LIFECYCLE: conn=236 role=brain wall_ms=1784265344085 mono_ms=101966 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  660│CONN_LIFECYCLE: conn=239 role=brain wall_ms=1784265348500 mono_ms=106381 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *661│CONN_LIFECYCLE: conn=239 role=brain stream-subscriber stream=83 wall_ms=1784265348500 mono_ms=106381 event=stream-sub-attach stream=83 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  662│CONN_LIFECYCLE: conn=240 role=brain wall_ms=1784265348505 mono_ms=106386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  663│CONN_LIFECYCLE: conn=239 role=brain stream-subscriber stream=83 wall_ms=1784265348505 mono_ms=106386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *664│CONN_LIFECYCLE: conn=240 role=brain stream-subscriber stream=84 wall_ms=1784265348505 mono_ms=106386 event=stream-sub-attach stream=84 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  665│CONN_LIFECYCLE: conn=241 role=brain wall_ms=1784265348505 mono_ms=106386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  666│CONN_LIFECYCLE: conn=241 role=brain wall_ms=1784265348505 mono_ms=106386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  667│CONN_LIFECYCLE: conn=240 role=brain stream-subscriber stream=84 wall_ms=1784265348507 mono_ms=106388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  672│CONN_LIFECYCLE: conn=244 role=brain wall_ms=1784265348600 mono_ms=106481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *673│CONN_LIFECYCLE: conn=244 role=brain stream-subscriber stream=85 wall_ms=1784265348600 mono_ms=106481 event=stream-sub-attach stream=85 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  674│CONN_LIFECYCLE: conn=244 role=brain stream-subscriber stream=85 wall_ms=1784265348603 mono_ms=106483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  675│CONN_LIFECYCLE: conn=245 role=brain wall_ms=1784265348603 mono_ms=106483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  676│CONN_LIFECYCLE: conn=245 role=brain wall_ms=1784265348603 mono_ms=106483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  680│CONN_LIFECYCLE: conn=247 role=brain wall_ms=1784265348800 mono_ms=106680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *681│CONN_LIFECYCLE: conn=249 role=brain stream-subscriber stream=87 wall_ms=1784265348800 mono_ms=106681 event=stream-sub-attach stream=87 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *682│CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348800 mono_ms=106681 event=stream-sub-attach stream=86 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  683│CONN_LIFECYCLE: conn=249 role=brain stream-subscriber stream=87 wall_ms=1784265348800 mono_ms=106681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  684│CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348800 mono_ms=106681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  685│CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348808 mono_ms=106688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  702│CONN_LIFECYCLE: conn=256 role=brain wall_ms=1784265359151 mono_ms=117032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *703│CONN_LIFECYCLE: conn=256 role=brain stream-subscriber stream=88 wall_ms=1784265359151 mono_ms=117032 event=stream-sub-attach stream=88 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  704│CONN_LIFECYCLE: conn=256 role=brain stream-subscriber stream=88 wall_ms=1784265359163 mono_ms=117043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  705│CONN_LIFECYCLE: conn=257 role=brain wall_ms=1784265359163 mono_ms=117043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  706│CONN_LIFECYCLE: conn=257 role=brain wall_ms=1784265359163 mono_ms=117044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  718│CONN_LIFECYCLE: conn=262 role=brain wall_ms=1784265363674 mono_ms=121555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *719│CONN_LIFECYCLE: conn=263 role=brain stream-subscriber stream=89 wall_ms=1784265363674 mono_ms=121555 event=stream-sub-attach stream=89 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *720│CONN_LIFECYCLE: conn=262 role=brain stream-subscriber stream=91 wall_ms=1784265363674 mono_ms=121555 event=stream-sub-attach stream=91 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  721│CONN_LIFECYCLE: conn=262 role=brain stream-subscriber stream=91 wall_ms=1784265363676 mono_ms=121556 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  722│CONN_LIFECYCLE: conn=264 role=brain wall_ms=1784265363676 mono_ms=121557 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  723│CONN_LIFECYCLE: conn=264 role=brain wall_ms=1784265363676 mono_ms=121557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  727│CONN_LIFECYCLE: conn=261 role=brain wall_ms=1784265363680 mono_ms=121561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *728│CONN_LIFECYCLE: conn=261 role=brain stream-subscriber stream=90 wall_ms=1784265363680 mono_ms=121561 event=stream-sub-attach stream=90 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  729│CONN_LIFECYCLE: conn=261 role=brain stream-subscriber stream=90 wall_ms=1784265363682 mono_ms=121563 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  730│CONN_LIFECYCLE: conn=266 role=brain wall_ms=1784265363682 mono_ms=121563 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  731│CONN_LIFECYCLE: conn=266 role=brain wall_ms=1784265363683 mono_ms=121563 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  735│CONN_LIFECYCLE: conn=268 role=brain wall_ms=1784265364176 mono_ms=122056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *736│CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=stream-sub-attach stream=92 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  737│CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  738│CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  739│CONN_LIFECYCLE: conn=270 role=brain wall_ms=1784265364177 mono_ms=122057 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  742│CONN_LIFECYCLE: conn=271 role=brain wall_ms=1784265365883 mono_ms=123764 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *743│CONN_LIFECYCLE: conn=272 role=brain stream-subscriber stream=93 wall_ms=1784265365883 mono_ms=123764 event=stream-sub-attach stream=93 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  744│CONN_LIFECYCLE: conn=272 role=brain stream-subscriber stream=93 wall_ms=1784265365883 mono_ms=123764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  745│CONN_LIFECYCLE: conn=273 role=brain wall_ms=1784265369062 mono_ms=126942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  746│CONN_LIFECYCLE: conn=273 role=brain wall_ms=1784265369062 mono_ms=126943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  755│CONN_LIFECYCLE: conn=276 role=brain wall_ms=1784265374325 mono_ms=132205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *756│CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374325 mono_ms=132205 event=stream-sub-attach stream=97 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  757│CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374325 mono_ms=132205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  758│CONN_LIFECYCLE: conn=278 role=brain wall_ms=1784265374326 mono_ms=132206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *759│CONN_LIFECYCLE: conn=278 role=brain stream-subscriber stream=98 wall_ms=1784265374326 mono_ms=132206 event=stream-sub-attach stream=98 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  760│CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374332 mono_ms=132212 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  761│CONN_LIFECYCLE: conn=280 role=brain wall_ms=1784265374332 mono_ms=132212 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  762│CONN_LIFECYCLE: conn=280 role=brain wall_ms=1784265374332 mono_ms=132213 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  770│CONN_LIFECYCLE: conn=285 role=brain wall_ms=1784265378648 mono_ms=136528 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *771│CONN_LIFECYCLE: conn=285 role=brain stream-subscriber stream=100 wall_ms=1784265378648 mono_ms=136528 event=stream-sub-attach stream=100 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  772│CONN_LIFECYCLE: conn=285 role=brain stream-subscriber stream=100 wall_ms=1784265378650 mono_ms=136530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  773│CONN_LIFECYCLE: conn=286 role=brain wall_ms=1784265378650 mono_ms=136530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  774│CONN_LIFECYCLE: conn=286 role=brain wall_ms=1784265378650 mono_ms=136530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  775│CONN_LIFECYCLE: conn=284 role=brain wall_ms=1784265378654 mono_ms=136535 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *776│CONN_LIFECYCLE: conn=284 role=brain stream-subscriber stream=99 wall_ms=1784265378655 mono_ms=136535 event=stream-sub-attach stream=99 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  777│CONN_LIFECYCLE: conn=284 role=brain stream-subscriber stream=99 wall_ms=1784265378659 mono_ms=136539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  778│CONN_LIFECYCLE: conn=287 role=brain wall_ms=1784265378659 mono_ms=136539 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  779│CONN_LIFECYCLE: conn=287 role=brain wall_ms=1784265378659 mono_ms=136539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  782│CONN_LIFECYCLE: conn=289 role=brain wall_ms=1784265378748 mono_ms=136629 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *783│CONN_LIFECYCLE: conn=289 role=brain stream-subscriber stream=101 wall_ms=1784265378749 mono_ms=136629 event=stream-sub-attach stream=101 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  784│CONN_LIFECYCLE: conn=289 role=brain stream-subscriber stream=101 wall_ms=1784265378751 mono_ms=136631 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  785│CONN_LIFECYCLE: conn=290 role=brain wall_ms=1784265378751 mono_ms=136631 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  786│CONN_LIFECYCLE: conn=290 role=brain wall_ms=1784265378751 mono_ms=136631 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  790│CONN_LIFECYCLE: conn=292 role=brain wall_ms=1784265378948 mono_ms=136828 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *791│CONN_LIFECYCLE: conn=293 role=brain stream-subscriber stream=102 wall_ms=1784265378948 mono_ms=136829 event=stream-sub-attach stream=102 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *792│CONN_LIFECYCLE: conn=294 role=brain stream-subscriber stream=103 wall_ms=1784265378948 mono_ms=136829 event=stream-sub-attach stream=103 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  793│CONN_LIFECYCLE: conn=293 role=brain stream-subscriber stream=102 wall_ms=1784265378948 mono_ms=136829 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  794│CONN_LIFECYCLE: conn=294 role=brain stream-subscriber stream=103 wall_ms=1784265378948 mono_ms=136829 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  795│CONN_LIFECYCLE: conn=293 role=brain stream-subscriber stream=102 wall_ms=1784265378953 mono_ms=136833 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\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 *809│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=1784265385698 mono_ms=143578 event=stream-sub-attach stream=108 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *810│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=1784265385899 mono_ms=143779 event=stream-sub-attach stream=109 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  811│CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  812│CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  813│CONN_LIFECYCLE: conn=300 role=brain wall_ms=1784265389297 mono_ms=147177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  815│CONN_LIFECYCLE: conn=301 role=brain wall_ms=1784265389298 mono_ms=147178 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *816│CONN_LIFECYCLE: conn=301 role=brain stream-subscriber stream=110 wall_ms=1784265389298 mono_ms=147178 event=stream-sub-attach stream=110 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  817│CONN_LIFECYCLE: conn=301 role=brain stream-subscriber stream=110 wall_ms=1784265389307 mono_ms=147187 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  818│CONN_LIFECYCLE: conn=302 role=brain wall_ms=1784265389307 mono_ms=147187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  819│CONN_LIFECYCLE: conn=302 role=brain wall_ms=1784265389307 mono_ms=147187 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  821│CONN_LIFECYCLE: conn=303 role=brain wall_ms=1784265390000 mono_ms=147881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *822│CONN_LIFECYCLE: conn=304 role=brain stream-subscriber stream=111 wall_ms=1784265390000 mono_ms=147881 event=stream-sub-attach stream=111 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  823│CONN_LIFECYCLE: conn=304 role=brain stream-subscriber stream=111 wall_ms=1784265390000 mono_ms=147881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  824│CONN_LIFECYCLE: conn=304 role=brain stream-subscriber stream=111 wall_ms=1784265390001 mono_ms=147881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  825│CONN_LIFECYCLE: conn=305 role=brain wall_ms=1784265390001 mono_ms=147881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  828│CONN_LIFECYCLE: conn=306 role=brain wall_ms=1784265390101 mono_ms=147981 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *829│CONN_LIFECYCLE: conn=307 role=brain stream-subscriber stream=112 wall_ms=1784265390101 mono_ms=147981 event=stream-sub-attach stream=112 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  830│CONN_LIFECYCLE: conn=307 role=brain stream-subscriber stream=112 wall_ms=1784265390101 mono_ms=147981 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  831│CONN_LIFECYCLE: conn=307 role=brain stream-subscriber stream=112 wall_ms=1784265390101 mono_ms=147982 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  832│CONN_LIFECYCLE: conn=308 role=brain wall_ms=1784265390101 mono_ms=147982 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  845│CONN_LIFECYCLE: conn=313 role=brain wall_ms=1784265393721 mono_ms=151602 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *846│CONN_LIFECYCLE: conn=312 role=brain stream-subscriber stream=115 wall_ms=1784265393721 mono_ms=151602 event=stream-sub-attach stream=115 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *847│CONN_LIFECYCLE: conn=313 role=brain stream-subscriber stream=113 wall_ms=1784265393721 mono_ms=151602 event=stream-sub-attach stream=113 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  848│CONN_LIFECYCLE: conn=312 role=brain stream-subscriber stream=115 wall_ms=1784265393723 mono_ms=151603 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  849│CONN_LIFECYCLE: conn=315 role=brain wall_ms=1784265393723 mono_ms=151603 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  850│CONN_LIFECYCLE: conn=315 role=brain wall_ms=1784265393723 mono_ms=151603 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  851│CONN_LIFECYCLE: conn=314 role=brain wall_ms=1784265393724 mono_ms=151604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *852│CONN_LIFECYCLE: conn=314 role=brain stream-subscriber stream=114 wall_ms=1784265393724 mono_ms=151605 event=stream-sub-attach stream=114 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  853│CONN_LIFECYCLE: conn=313 role=brain stream-subscriber stream=113 wall_ms=1784265393725 mono_ms=151606 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  854│CONN_LIFECYCLE: conn=316 role=brain wall_ms=1784265393726 mono_ms=151606 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  855│CONN_LIFECYCLE: conn=316 role=brain wall_ms=1784265393726 mono_ms=151606 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  862│CONN_LIFECYCLE: conn=319 role=brain wall_ms=1784265395228 mono_ms=153109 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *863│CONN_LIFECYCLE: conn=320 role=brain stream-subscriber stream=116 wall_ms=1784265395229 mono_ms=153109 event=stream-sub-attach stream=116 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  864│CONN_LIFECYCLE: conn=320 role=brain stream-subscriber stream=116 wall_ms=1784265395229 mono_ms=153109 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  865│CONN_LIFECYCLE: conn=320 role=brain stream-subscriber stream=116 wall_ms=1784265395229 mono_ms=153109 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  866│CONN_LIFECYCLE: conn=321 role=brain wall_ms=1784265395229 mono_ms=153109 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  869│CONN_LIFECYCLE: conn=322 role=brain wall_ms=1784265396132 mono_ms=154013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *870│CONN_LIFECYCLE: conn=323 role=brain stream-subscriber stream=120 wall_ms=1784265396133 mono_ms=154013 event=stream-sub-attach stream=120 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  871│CONN_LIFECYCLE: conn=323 role=brain stream-subscriber stream=120 wall_ms=1784265396133 mono_ms=154013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  872│CONN_LIFECYCLE: conn=323 role=brain stream-subscriber stream=120 wall_ms=1784265396137 mono_ms=154017 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  873│CONN_LIFECYCLE: conn=324 role=brain wall_ms=1784265396137 mono_ms=154017 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  882│CONN_LIFECYCLE: conn=327 role=brain wall_ms=1784265404375 mono_ms=162256 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *883│CONN_LIFECYCLE: conn=329 role=brain stream-subscriber stream=121 wall_ms=1784265404376 mono_ms=162256 event=stream-sub-attach stream=121 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  884│CONN_LIFECYCLE: conn=329 role=brain stream-subscriber stream=121 wall_ms=1784265404376 mono_ms=162256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  885│CONN_LIFECYCLE: conn=330 role=brain wall_ms=1784265404377 mono_ms=162257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *886│CONN_LIFECYCLE: conn=330 role=brain stream-subscriber stream=122 wall_ms=1784265404377 mono_ms=162257 event=stream-sub-attach stream=122 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  887│CONN_LIFECYCLE: conn=329 role=brain stream-subscriber stream=121 wall_ms=1784265404383 mono_ms=162263 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  888│CONN_LIFECYCLE: conn=331 role=brain wall_ms=1784265404383 mono_ms=162264 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  889│CONN_LIFECYCLE: conn=331 role=brain wall_ms=1784265404383 mono_ms=162264 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  902│CONN_LIFECYCLE: conn=337 role=brain wall_ms=1784265408797 mono_ms=166677 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *903│CONN_LIFECYCLE: conn=337 role=brain stream-subscriber stream=123 wall_ms=1784265408797 mono_ms=166677 event=stream-sub-attach stream=123 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  904│CONN_LIFECYCLE: conn=337 role=brain stream-subscriber stream=123 wall_ms=1784265408801 mono_ms=166681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  905│CONN_LIFECYCLE: conn=339 role=brain wall_ms=1784265408801 mono_ms=166681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  906│CONN_LIFECYCLE: conn=339 role=brain wall_ms=1784265408801 mono_ms=166681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  908│CONN_LIFECYCLE: conn=338 role=brain wall_ms=1784265408810 mono_ms=166690 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *909│CONN_LIFECYCLE: conn=336 role=brain stream-subscriber stream=125 wall_ms=1784265408810 mono_ms=166690 event=stream-sub-attach stream=125 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *910│CONN_LIFECYCLE: conn=338 role=brain stream-subscriber stream=124 wall_ms=1784265408810 mono_ms=166690 event=stream-sub-attach stream=124 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  911│CONN_LIFECYCLE: conn=336 role=brain stream-subscriber stream=125 wall_ms=1784265408811 mono_ms=166692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  912│CONN_LIFECYCLE: conn=340 role=brain wall_ms=1784265408811 mono_ms=166692 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  913│CONN_LIFECYCLE: conn=340 role=brain wall_ms=1784265408811 mono_ms=166692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  920│CONN_LIFECYCLE: conn=343 role=brain wall_ms=1784265408996 mono_ms=166876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *921│CONN_LIFECYCLE: conn=344 role=brain stream-subscriber stream=126 wall_ms=1784265408996 mono_ms=166876 event=stream-sub-attach stream=126 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *922│CONN_LIFECYCLE: conn=345 role=brain stream-subscriber stream=127 wall_ms=1784265408996 mono_ms=166876 event=stream-sub-attach stream=127 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  923│CONN_LIFECYCLE: conn=344 role=brain stream-subscriber stream=126 wall_ms=1784265408996 mono_ms=166876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  924│CONN_LIFECYCLE: conn=345 role=brain stream-subscriber stream=127 wall_ms=1784265408996 mono_ms=166877 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  925│CONN_LIFECYCLE: conn=344 role=brain stream-subscriber stream=126 wall_ms=1784265409002 mono_ms=166882 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  937│CONN_LIFECYCLE: conn=351 role=brain wall_ms=1784265419354 mono_ms=177234 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *938│CONN_LIFECYCLE: conn=351 role=brain stream-subscriber stream=128 wall_ms=1784265419354 mono_ms=177234 event=stream-sub-attach stream=128 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  939│CONN_LIFECYCLE: conn=351 role=brain stream-subscriber stream=128 wall_ms=1784265419362 mono_ms=177242 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  940│CONN_LIFECYCLE: conn=352 role=brain wall_ms=1784265419362 mono_ms=177242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  941│CONN_LIFECYCLE: conn=352 role=brain wall_ms=1784265419362 mono_ms=177243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  954│CONN_LIFECYCLE: conn=358 role=brain wall_ms=1784265423877 mono_ms=181758 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *955│CONN_LIFECYCLE: conn=358 role=brain stream-subscriber stream=131 wall_ms=1784265423877 mono_ms=181758 event=stream-sub-attach stream=131 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  956│CONN_LIFECYCLE: conn=358 role=brain stream-subscriber stream=131 wall_ms=1784265423879 mono_ms=181759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  957│CONN_LIFECYCLE: conn=360 role=brain wall_ms=1784265423879 mono_ms=181760 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  958│CONN_LIFECYCLE: conn=360 role=brain wall_ms=1784265423879 mono_ms=181760 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  959│CONN_LIFECYCLE: conn=357 role=brain wall_ms=1784265423883 mono_ms=181764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *960│CONN_LIFECYCLE: conn=357 role=brain stream-subscriber stream=129 wall_ms=1784265423884 mono_ms=181764 event=stream-sub-attach stream=129 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  961│CONN_LIFECYCLE: conn=359 role=brain wall_ms=1784265423884 mono_ms=181764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *962│CONN_LIFECYCLE: conn=359 role=brain stream-subscriber stream=130 wall_ms=1784265423884 mono_ms=181764 event=stream-sub-attach stream=130 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  963│CONN_LIFECYCLE: conn=357 role=brain stream-subscriber stream=129 wall_ms=1784265423885 mono_ms=181766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  964│CONN_LIFECYCLE: conn=361 role=brain wall_ms=1784265423885 mono_ms=181766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  965│CONN_LIFECYCLE: conn=361 role=brain wall_ms=1784265423885 mono_ms=181766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  972│CONN_LIFECYCLE: conn=364 role=brain wall_ms=1784265426490 mono_ms=184371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *973│CONN_LIFECYCLE: conn=365 role=brain stream-subscriber stream=132 wall_ms=1784265426491 mono_ms=184371 event=stream-sub-attach stream=132 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  974│CONN_LIFECYCLE: conn=365 role=brain stream-subscriber stream=132 wall_ms=1784265426491 mono_ms=184371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  975│CONN_LIFECYCLE: conn=365 role=brain stream-subscriber stream=132 wall_ms=1784265426821 mono_ms=184702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  976│CONN_LIFECYCLE: conn=366 role=brain wall_ms=1784265426822 mono_ms=184702 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  979│CONN_LIFECYCLE: conn=367 role=brain wall_ms=1784265429506 mono_ms=187386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *980│CONN_LIFECYCLE: conn=368 role=brain stream-subscriber stream=139 wall_ms=1784265429506 mono_ms=187386 event=stream-sub-attach stream=139 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  981│CONN_LIFECYCLE: conn=368 role=brain stream-subscriber stream=139 wall_ms=1784265429506 mono_ms=187386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  982│CONN_LIFECYCLE: conn=368 role=brain stream-subscriber stream=139 wall_ms=1784265429506 mono_ms=187387 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  983│CONN_LIFECYCLE: conn=369 role=brain wall_ms=1784265429506 mono_ms=187387 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  990│CONN_LIFECYCLE: conn=372 role=brain wall_ms=1784265434632 mono_ms=192512 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *991│CONN_LIFECYCLE: conn=373 role=brain stream-subscriber stream=140 wall_ms=1784265434632 mono_ms=192512 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  992│CONN_LIFECYCLE: conn=373 role=brain stream-subscriber stream=140 wall_ms=1784265434632 mono_ms=192513 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  993│CONN_LIFECYCLE: conn=373 role=brain stream-subscriber stream=140 wall_ms=1784265434640 mono_ms=192521 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  994│CONN_LIFECYCLE: conn=374 role=brain wall_ms=1784265434640 mono_ms=192521 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1002│CONN_LIFECYCLE: conn=378 role=brain wall_ms=1784265438956 mono_ms=196836 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1003│CONN_LIFECYCLE: conn=378 role=brain stream-subscriber stream=142 wall_ms=1784265438956 mono_ms=196836 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1004│CONN_LIFECYCLE: conn=378 role=brain stream-subscriber stream=142 wall_ms=1784265438958 mono_ms=196838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1005│CONN_LIFECYCLE: conn=381 role=brain wall_ms=1784265438958 mono_ms=196838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1006│CONN_LIFECYCLE: conn=381 role=brain wall_ms=1784265438958 mono_ms=196838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1007│CONN_LIFECYCLE: conn=379 role=brain wall_ms=1784265438963 mono_ms=196843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1008│CONN_LIFECYCLE: conn=379 role=brain stream-subscriber stream=143 wall_ms=1784265438963 mono_ms=196843 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1009│CONN_LIFECYCLE: conn=380 role=brain wall_ms=1784265438963 mono_ms=196843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1010│CONN_LIFECYCLE: conn=380 role=brain stream-subscriber stream=141 wall_ms=1784265438963 mono_ms=196843 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1011│CONN_LIFECYCLE: conn=379 role=brain stream-subscriber stream=143 wall_ms=1784265438964 mono_ms=196845 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1012│CONN_LIFECYCLE: conn=382 role=brain wall_ms=1784265438965 mono_ms=196845 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1013│CONN_LIFECYCLE: conn=382 role=brain wall_ms=1784265438965 mono_ms=196845 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1020│CONN_LIFECYCLE: conn=385 role=brain wall_ms=1784265439156 mono_ms=197036 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1021│CONN_LIFECYCLE: conn=386 role=brain stream-subscriber stream=144 wall_ms=1784265439156 mono_ms=197036 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1022│CONN_LIFECYCLE: conn=387 role=brain stream-subscriber stream=145 wall_ms=1784265439156 mono_ms=197036 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1023│CONN_LIFECYCLE: conn=386 role=brain stream-subscriber stream=144 wall_ms=1784265439156 mono_ms=197036 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1024│CONN_LIFECYCLE: conn=387 role=brain stream-subscriber stream=145 wall_ms=1784265439156 mono_ms=197036 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1025│CONN_LIFECYCLE: conn=386 role=brain stream-subscriber stream=144 wall_ms=1784265439161 mono_ms=197041 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1035│CONN_LIFECYCLE: conn=392 role=brain wall_ms=1784265444385 mono_ms=202265 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1036│CONN_LIFECYCLE: conn=392 role=brain stream-subscriber stream=149 wall_ms=1784265444385 mono_ms=202265 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1037│CONN_LIFECYCLE: conn=392 role=brain stream-subscriber stream=149 wall_ms=1784265444393 mono_ms=202273 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1038│CONN_LIFECYCLE: conn=393 role=brain wall_ms=1784265444393 mono_ms=202273 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1039│CONN_LIFECYCLE: conn=393 role=brain wall_ms=1784265444393 mono_ms=202273 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\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 1054│CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1055│CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1056│CONN_LIFECYCLE: conn=397 role=brain wall_ms=1784265455944 mono_ms=213825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1057│CONN_LIFECYCLE: conn=397 role=brain wall_ms=1784265455945 mono_ms=213825 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1058│CONN_LIFECYCLE: conn=398 role=brain stream-subscriber stream=153 wall_ms=1784265455945 mono_ms=213825 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1059│CONN_LIFECYCLE: conn=398 role=brain stream-subscriber stream=153 wall_ms=1784265455945 mono_ms=213825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1060│CONN_LIFECYCLE: conn=398 role=brain stream-subscriber stream=153 wall_ms=1784265455945 mono_ms=213825 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1061│CONN_LIFECYCLE: conn=399 role=brain wall_ms=1784265455945 mono_ms=213826 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1064│CONN_LIFECYCLE: conn=400 role=brain wall_ms=1784265456849 mono_ms=214729 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1065│CONN_LIFECYCLE: conn=401 role=brain stream-subscriber stream=154 wall_ms=1784265456849 mono_ms=214729 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1066│CONN_LIFECYCLE: conn=401 role=brain stream-subscriber stream=154 wall_ms=1784265456849 mono_ms=214729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1067│CONN_LIFECYCLE: conn=401 role=brain stream-subscriber stream=154 wall_ms=1784265456853 mono_ms=214733 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1068│CONN_LIFECYCLE: conn=402 role=brain wall_ms=1784265456853 mono_ms=214733 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1071│CONN_LIFECYCLE: conn=403 role=brain wall_ms=1784265458559 mono_ms=216439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1072│CONN_LIFECYCLE: conn=404 role=brain stream-subscriber stream=155 wall_ms=1784265458559 mono_ms=216440 event=stream-sub-attach stream=155 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1073│CONN_LIFECYCLE: conn=404 role=brain stream-subscriber stream=155 wall_ms=1784265458560 mono_ms=216440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1074│CONN_LIFECYCLE: conn=404 role=brain stream-subscriber stream=155 wall_ms=1784265458560 mono_ms=216440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1075│CONN_LIFECYCLE: conn=405 role=brain wall_ms=1784265458560 mono_ms=216440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1078│CONN_LIFECYCLE: conn=406 role=brain wall_ms=1784265458660 mono_ms=216540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1079│CONN_LIFECYCLE: conn=407 role=brain stream-subscriber stream=156 wall_ms=1784265458660 mono_ms=216541 event=stream-sub-attach stream=156 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1080│CONN_LIFECYCLE: conn=407 role=brain stream-subscriber stream=156 wall_ms=1784265458660 mono_ms=216541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1081│CONN_LIFECYCLE: conn=407 role=brain stream-subscriber stream=156 wall_ms=1784265458661 mono_ms=216541 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1082│CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784265458661 mono_ms=216541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1089│CONN_LIFECYCLE: conn=412 role=brain wall_ms=1784265458762 mono_ms=216642 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1090│CONN_LIFECYCLE: conn=411 role=brain stream-subscriber stream=158 wall_ms=1784265458762 mono_ms=216642 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1091│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=157 wall_ms=1784265458762 mono_ms=216642 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1092│CONN_LIFECYCLE: conn=411 role=brain stream-subscriber stream=158 wall_ms=1784265458764 mono_ms=216644 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1093│CONN_LIFECYCLE: conn=413 role=brain wall_ms=1784265458764 mono_ms=216644 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1094│CONN_LIFECYCLE: conn=413 role=brain wall_ms=1784265458764 mono_ms=216644 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1100│CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784265459466 mono_ms=217346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1101│CONN_LIFECYCLE: conn=416 role=brain stream-subscriber stream=159 wall_ms=1784265459466 mono_ms=217346 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1102│CONN_LIFECYCLE: conn=416 role=brain stream-subscriber stream=159 wall_ms=1784265459474 mono_ms=217354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1103│CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784265459474 mono_ms=217354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1104│CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784265459474 mono_ms=217354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1109│CONN_LIFECYCLE: conn=420 role=brain wall_ms=1784265464091 mono_ms=221971 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1110│CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=160 wall_ms=1784265464091 mono_ms=221971 event=stream-sub-attach stream=160 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1111│CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=160 wall_ms=1784265464092 mono_ms=221973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1112│CONN_LIFECYCLE: conn=421 role=brain wall_ms=1784265464093 mono_ms=221973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1113│CONN_LIFECYCLE: conn=421 role=brain wall_ms=1784265464093 mono_ms=221973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1115│CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784265464692 mono_ms=222573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1116│CONN_LIFECYCLE: conn=423 role=brain stream-subscriber stream=161 wall_ms=1784265464693 mono_ms=222573 event=stream-sub-attach stream=161 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1117│CONN_LIFECYCLE: conn=423 role=brain stream-subscriber stream=161 wall_ms=1784265464693 mono_ms=222573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1118│CONN_LIFECYCLE: conn=424 role=brain wall_ms=1784265465242 mono_ms=223122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1119│CONN_LIFECYCLE: conn=424 role=brain wall_ms=1784265465242 mono_ms=223122 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1123│CONN_LIFECYCLE: conn=425 role=brain wall_ms=1784265469418 mono_ms=227298 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1124│CONN_LIFECYCLE: conn=427 role=brain stream-subscriber stream=163 wall_ms=1784265469418 mono_ms=227298 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1125│CONN_LIFECYCLE: conn=428 role=brain stream-subscriber stream=162 wall_ms=1784265469418 mono_ms=227298 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1126│CONN_LIFECYCLE: conn=427 role=brain stream-subscriber stream=163 wall_ms=1784265469418 mono_ms=227298 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1127│CONN_LIFECYCLE: conn=428 role=brain stream-subscriber stream=162 wall_ms=1784265469418 mono_ms=227298 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1128│CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784265470283 mono_ms=228164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1143│CONN_LIFECYCLE: conn=435 role=brain wall_ms=1784265473843 mono_ms=231723 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1144│CONN_LIFECYCLE: conn=435 role=brain stream-subscriber stream=170 wall_ms=1784265473843 mono_ms=231723 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1145│CONN_LIFECYCLE: conn=435 role=brain stream-subscriber stream=170 wall_ms=1784265473848 mono_ms=231728 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1146│CONN_LIFECYCLE: conn=437 role=brain wall_ms=1784265473848 mono_ms=231728 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1147│CONN_LIFECYCLE: conn=437 role=brain wall_ms=1784265473848 mono_ms=231728 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1148│CONN_LIFECYCLE: conn=436 role=brain wall_ms=1784265473849 mono_ms=231729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1149│CONN_LIFECYCLE: conn=436 role=brain stream-subscriber stream=171 wall_ms=1784265473849 mono_ms=231729 event=stream-sub-attach stream=171 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1150│CONN_LIFECYCLE: conn=436 role=brain stream-subscriber stream=171 wall_ms=1784265473851 mono_ms=231732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1151│CONN_LIFECYCLE: conn=438 role=brain wall_ms=1784265473852 mono_ms=231732 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1152│CONN_LIFECYCLE: conn=438 role=brain wall_ms=1784265473852 mono_ms=231732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1155│CONN_LIFECYCLE: conn=440 role=brain wall_ms=1784265474547 mono_ms=232427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1156│CONN_LIFECYCLE: conn=440 role=brain stream-subscriber stream=172 wall_ms=1784265474547 mono_ms=232427 event=stream-sub-attach stream=172 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1157│CONN_LIFECYCLE: conn=440 role=brain stream-subscriber stream=172 wall_ms=1784265474555 mono_ms=232435 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1158│CONN_LIFECYCLE: conn=441 role=brain wall_ms=1784265474555 mono_ms=232435 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1159│CONN_LIFECYCLE: conn=441 role=brain wall_ms=1784265474555 mono_ms=232435 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1164│CONN_LIFECYCLE: conn=444 role=brain wall_ms=1784265479172 mono_ms=237052 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1165│CONN_LIFECYCLE: conn=444 role=brain stream-subscriber stream=173 wall_ms=1784265479172 mono_ms=237052 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1166│CONN_LIFECYCLE: conn=444 role=brain stream-subscriber stream=173 wall_ms=1784265479175 mono_ms=237055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1167│CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784265479175 mono_ms=237055 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1168│CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784265479175 mono_ms=237055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1176│CONN_LIFECYCLE: conn=447 role=brain wall_ms=1784265481484 mono_ms=239364 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1177│CONN_LIFECYCLE: conn=448 role=brain stream-subscriber stream=174 wall_ms=1784265481484 mono_ms=239365 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1178│CONN_LIFECYCLE: conn=448 role=brain stream-subscriber stream=174 wall_ms=1784265481484 mono_ms=239365 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1179│CONN_LIFECYCLE: conn=448 role=brain stream-subscriber stream=174 wall_ms=1784265481508 mono_ms=239388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1180│CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784265481508 mono_ms=239388 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1185│CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784265487215 mono_ms=245095 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1186│CONN_LIFECYCLE: conn=452 role=brain stream-subscriber stream=179 wall_ms=1784265487215 mono_ms=245095 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1187│CONN_LIFECYCLE: conn=452 role=brain stream-subscriber stream=179 wall_ms=1784265487215 mono_ms=245095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1188│CONN_LIFECYCLE: conn=452 role=brain stream-subscriber stream=179 wall_ms=1784265487219 mono_ms=245099 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1189│CONN_LIFECYCLE: conn=453 role=brain wall_ms=1784265487219 mono_ms=245099 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1195│CONN_LIFECYCLE: conn=457 role=brain wall_ms=1784265488925 mono_ms=246806 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1196│CONN_LIFECYCLE: conn=457 role=brain stream-subscriber stream=180 wall_ms=1784265488925 mono_ms=246806 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1197│CONN_LIFECYCLE: conn=456 role=brain wall_ms=1784265488928 mono_ms=246808 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1198│CONN_LIFECYCLE: conn=456 role=brain stream-subscriber stream=181 wall_ms=1784265488928 mono_ms=246808 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1199│CONN_LIFECYCLE: conn=456 role=brain stream-subscriber stream=181 wall_ms=1784265488930 mono_ms=246810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1200│CONN_LIFECYCLE: conn=458 role=brain wall_ms=1784265488930 mono_ms=246810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1201│CONN_LIFECYCLE: conn=458 role=brain wall_ms=1784265488930 mono_ms=246810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1209│CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784265489528 mono_ms=247408 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1210│CONN_LIFECYCLE: conn=462 role=brain stream-subscriber stream=183 wall_ms=1784265489528 mono_ms=247408 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1211│CONN_LIFECYCLE: conn=463 role=brain wall_ms=1784265489533 mono_ms=247413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1212│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=182 wall_ms=1784265489533 mono_ms=247413 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1213│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=182 wall_ms=1784265489541 mono_ms=247421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1214│CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784265489541 mono_ms=247421 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1215│CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784265489541 mono_ms=247421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1220│CONN_LIFECYCLE: conn=466 role=brain wall_ms=1784265489829 mono_ms=247709 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1221│CONN_LIFECYCLE: conn=467 role=brain stream-subscriber stream=184 wall_ms=1784265489829 mono_ms=247709 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1222│CONN_LIFECYCLE: conn=467 role=brain stream-subscriber stream=184 wall_ms=1784265489829 mono_ms=247709 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1223│CONN_LIFECYCLE: conn=467 role=brain stream-subscriber stream=184 wall_ms=1784265489829 mono_ms=247710 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1224│CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784265489829 mono_ms=247710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1230│CONN_LIFECYCLE: conn=471 role=brain wall_ms=1784265494256 mono_ms=252136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1231│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=185 wall_ms=1784265494256 mono_ms=252136 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1232│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=185 wall_ms=1784265494258 mono_ms=252138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1233│CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784265494258 mono_ms=252139 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1234│CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784265494258 mono_ms=252139 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1236│CONN_LIFECYCLE: conn=473 role=brain wall_ms=1784265494959 mono_ms=252839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1237│CONN_LIFECYCLE: conn=474 role=brain stream-subscriber stream=186 wall_ms=1784265494960 mono_ms=252840 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1238│CONN_LIFECYCLE: conn=474 role=brain stream-subscriber stream=186 wall_ms=1784265494960 mono_ms=252840 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1239│CONN_LIFECYCLE: conn=474 role=brain stream-subscriber stream=186 wall_ms=1784265494966 mono_ms=252846 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1240│CONN_LIFECYCLE: conn=475 role=brain wall_ms=1784265494966 mono_ms=252846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1247│CONN_LIFECYCLE: conn=478 role=brain wall_ms=1784265499585 mono_ms=257465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1248│CONN_LIFECYCLE: conn=479 role=brain stream-subscriber stream=187 wall_ms=1784265499585 mono_ms=257465 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1249│CONN_LIFECYCLE: conn=480 role=brain stream-subscriber stream=188 wall_ms=1784265499585 mono_ms=257465 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1250│CONN_LIFECYCLE: conn=479 role=brain stream-subscriber stream=187 wall_ms=1784265499585 mono_ms=257465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1251│CONN_LIFECYCLE: conn=480 role=brain stream-subscriber stream=188 wall_ms=1784265499585 mono_ms=257465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1252│CONN_LIFECYCLE: conn=479 role=brain stream-subscriber stream=187 wall_ms=1784265499589 mono_ms=257469 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1264│CONN_LIFECYCLE: conn=486 role=brain wall_ms=1784265504011 mono_ms=261891 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1265│CONN_LIFECYCLE: conn=486 role=brain stream-subscriber stream=189 wall_ms=1784265504011 mono_ms=261891 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1266│CONN_LIFECYCLE: conn=486 role=brain stream-subscriber stream=189 wall_ms=1784265504015 mono_ms=261895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1267│CONN_LIFECYCLE: conn=488 role=brain wall_ms=1784265504015 mono_ms=261895 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1268│CONN_LIFECYCLE: conn=488 role=brain wall_ms=1784265504015 mono_ms=261895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1269│CONN_LIFECYCLE: conn=487 role=brain wall_ms=1784265504019 mono_ms=261899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1270│CONN_LIFECYCLE: conn=487 role=brain stream-subscriber stream=190 wall_ms=1784265504019 mono_ms=261900 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1271│CONN_LIFECYCLE: conn=487 role=brain stream-subscriber stream=190 wall_ms=1784265504021 mono_ms=261901 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1272│CONN_LIFECYCLE: conn=489 role=brain wall_ms=1784265504021 mono_ms=261901 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1273│CONN_LIFECYCLE: conn=489 role=brain wall_ms=1784265504021 mono_ms=261902 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1276│CONN_LIFECYCLE: conn=491 role=brain wall_ms=1784265504514 mono_ms=262394 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1277│CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=191 wall_ms=1784265504514 mono_ms=262394 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1278│CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=191 wall_ms=1784265504522 mono_ms=262402 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1279│CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784265504522 mono_ms=262402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1280│CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784265504522 mono_ms=262402 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1285│CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784265509241 mono_ms=267121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1286│CONN_LIFECYCLE: conn=495 role=brain stream-subscriber stream=192 wall_ms=1784265509241 mono_ms=267122 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1287│CONN_LIFECYCLE: conn=495 role=brain stream-subscriber stream=192 wall_ms=1784265509243 mono_ms=267124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1288│CONN_LIFECYCLE: conn=496 role=brain wall_ms=1784265509244 mono_ms=267124 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1289│CONN_LIFECYCLE: conn=496 role=brain wall_ms=1784265509244 mono_ms=267124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1299│CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784265516179 mono_ms=274059 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1300│CONN_LIFECYCLE: conn=500 role=brain stream-subscriber stream=193 wall_ms=1784265516179 mono_ms=274059 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1301│CONN_LIFECYCLE: conn=500 role=brain stream-subscriber stream=193 wall_ms=1784265516179 mono_ms=274059 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1302│CONN_LIFECYCLE: conn=500 role=brain stream-subscriber stream=193 wall_ms=1784265516180 mono_ms=274060 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1303│CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784265516180 mono_ms=274060 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1304│CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784265516180 mono_ms=274060 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1305│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=1784265517380 mono_ms=275260 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1306│CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1307│CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1308│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=201 wall_ms=1784265517587 mono_ms=275467 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1309│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=201 wall_ms=1784265517587 mono_ms=275467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1310│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=201 wall_ms=1784265517592 mono_ms=275472 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1311│CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784265517592 mono_ms=275472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1312│CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784265517592 mono_ms=275472 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1313│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=1784265517649 mono_ms=275529 event=stream-sub-attach stream=202 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1314│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=1784265518315 mono_ms=276195 event=stream-sub-attach stream=203 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1315│CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1316│CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1317│CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784265519196 mono_ms=277076 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1325│CONN_LIFECYCLE: conn=511 role=brain wall_ms=1784265519598 mono_ms=277478 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1326│CONN_LIFECYCLE: conn=511 role=brain stream-subscriber stream=206 wall_ms=1784265519598 mono_ms=277478 event=stream-sub-attach stream=206 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1327│CONN_LIFECYCLE: conn=511 role=brain stream-subscriber stream=206 wall_ms=1784265519606 mono_ms=277486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1328│CONN_LIFECYCLE: conn=512 role=brain wall_ms=1784265519606 mono_ms=277486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1329│CONN_LIFECYCLE: conn=512 role=brain wall_ms=1784265519606 mono_ms=277486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1330│CONN_LIFECYCLE: conn=510 role=brain wall_ms=1784265519610 mono_ms=277490 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1331│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=205 wall_ms=1784265519610 mono_ms=277490 event=stream-sub-attach stream=205 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1332│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=205 wall_ms=1784265519618 mono_ms=277499 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1333│CONN_LIFECYCLE: conn=513 role=brain wall_ms=1784265519619 mono_ms=277499 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1334│CONN_LIFECYCLE: conn=513 role=brain wall_ms=1784265519619 mono_ms=277499 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1338│CONN_LIFECYCLE: conn=515 role=brain wall_ms=1784265522615 mono_ms=280495 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1339│CONN_LIFECYCLE: conn=516 role=brain stream-subscriber stream=207 wall_ms=1784265522616 mono_ms=280496 event=stream-sub-attach stream=207 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1340│CONN_LIFECYCLE: conn=516 role=brain stream-subscriber stream=207 wall_ms=1784265522616 mono_ms=280496 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1341│CONN_LIFECYCLE: conn=516 role=brain stream-subscriber stream=207 wall_ms=1784265522616 mono_ms=280496 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1342│CONN_LIFECYCLE: conn=517 role=brain wall_ms=1784265522616 mono_ms=280496 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1345│CONN_LIFECYCLE: conn=518 role=brain wall_ms=1784265522716 mono_ms=280596 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1346│CONN_LIFECYCLE: conn=519 role=brain stream-subscriber stream=208 wall_ms=1784265522716 mono_ms=280596 event=stream-sub-attach stream=208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1347│CONN_LIFECYCLE: conn=519 role=brain stream-subscriber stream=208 wall_ms=1784265522716 mono_ms=280596 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1348│CONN_LIFECYCLE: conn=519 role=brain stream-subscriber stream=208 wall_ms=1784265522717 mono_ms=280597 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1349│CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784265522717 mono_ms=280597 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1355│CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784265522818 mono_ms=280698 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1356│CONN_LIFECYCLE: conn=524 role=brain stream-subscriber stream=209 wall_ms=1784265522818 mono_ms=280698 event=stream-sub-attach stream=209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1357│CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784265522822 mono_ms=280702 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1358│CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=210 wall_ms=1784265522822 mono_ms=280702 event=stream-sub-attach stream=210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1359│CONN_LIFECYCLE: conn=524 role=brain stream-subscriber stream=209 wall_ms=1784265522822 mono_ms=280702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1360│CONN_LIFECYCLE: conn=525 role=brain wall_ms=1784265522822 mono_ms=280702 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1361│CONN_LIFECYCLE: conn=525 role=brain wall_ms=1784265522822 mono_ms=280703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1367│CONN_LIFECYCLE: conn=528 role=brain wall_ms=1784265524427 mono_ms=282307 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1368│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=211 wall_ms=1784265524427 mono_ms=282307 event=stream-sub-attach stream=211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1369│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=211 wall_ms=1784265524429 mono_ms=282309 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1370│CONN_LIFECYCLE: conn=529 role=brain wall_ms=1784265524429 mono_ms=282309 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1371│CONN_LIFECYCLE: conn=529 role=brain wall_ms=1784265524429 mono_ms=282309 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1373│CONN_LIFECYCLE: conn=530 role=brain wall_ms=1784265525029 mono_ms=282909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1374│CONN_LIFECYCLE: conn=531 role=brain stream-subscriber stream=212 wall_ms=1784265525029 mono_ms=282909 event=stream-sub-attach stream=212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1375│CONN_LIFECYCLE: conn=531 role=brain stream-subscriber stream=212 wall_ms=1784265525029 mono_ms=282909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1376│CONN_LIFECYCLE: conn=531 role=brain stream-subscriber stream=212 wall_ms=1784265525036 mono_ms=282916 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1377│CONN_LIFECYCLE: conn=532 role=brain wall_ms=1784265525037 mono_ms=282917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1384│CONN_LIFECYCLE: conn=534 role=brain wall_ms=1784265529654 mono_ms=287534 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1385│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=214 wall_ms=1784265529654 mono_ms=287534 event=stream-sub-attach stream=214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1386│CONN_LIFECYCLE: conn=537 role=brain stream-subscriber stream=213 wall_ms=1784265529654 mono_ms=287534 event=stream-sub-attach stream=213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1387│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=214 wall_ms=1784265529654 mono_ms=287534 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1388│CONN_LIFECYCLE: conn=537 role=brain stream-subscriber stream=213 wall_ms=1784265529654 mono_ms=287534 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1389│CONN_LIFECYCLE: conn=537 role=brain stream-subscriber stream=213 wall_ms=1784265529661 mono_ms=287541 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1399│CONN_LIFECYCLE: conn=542 role=brain wall_ms=1784265534683 mono_ms=292563 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1400│CONN_LIFECYCLE: conn=542 role=brain stream-subscriber stream=219 wall_ms=1784265534683 mono_ms=292563 event=stream-sub-attach stream=219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1401│CONN_LIFECYCLE: conn=542 role=brain stream-subscriber stream=219 wall_ms=1784265534691 mono_ms=292571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1402│CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784265534691 mono_ms=292571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1403│CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784265534691 mono_ms=292571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1410│CONN_LIFECYCLE: conn=548 role=brain wall_ms=1784265537901 mono_ms=295781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1411│CONN_LIFECYCLE: conn=548 role=brain stream-subscriber stream=220 wall_ms=1784265537901 mono_ms=295781 event=stream-sub-attach stream=220 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1412│CONN_LIFECYCLE: conn=548 role=brain stream-subscriber stream=220 wall_ms=1784265537905 mono_ms=295785 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1413│CONN_LIFECYCLE: conn=549 role=brain wall_ms=1784265537905 mono_ms=295785 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1414│CONN_LIFECYCLE: conn=549 role=brain wall_ms=1784265537905 mono_ms=295785 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1415│CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784265537913 mono_ms=295793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1416│CONN_LIFECYCLE: conn=547 role=brain stream-subscriber stream=221 wall_ms=1784265537913 mono_ms=295793 event=stream-sub-attach stream=221 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1417│CONN_LIFECYCLE: conn=547 role=brain stream-subscriber stream=221 wall_ms=1784265537915 mono_ms=295796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1418│CONN_LIFECYCLE: conn=550 role=brain wall_ms=1784265537916 mono_ms=295796 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1419│CONN_LIFECYCLE: conn=550 role=brain wall_ms=1784265537916 mono_ms=295796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1422│CONN_LIFECYCLE: conn=552 role=brain wall_ms=1784265538806 mono_ms=296686 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1423│CONN_LIFECYCLE: conn=552 role=brain stream-subscriber stream=223 wall_ms=1784265538806 mono_ms=296686 event=stream-sub-attach stream=223 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1424│CONN_LIFECYCLE: conn=553 role=brain wall_ms=1784265538806 mono_ms=296686 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1425│CONN_LIFECYCLE: conn=552 role=brain stream-subscriber stream=223 wall_ms=1784265538806 mono_ms=296686 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1426│CONN_LIFECYCLE: conn=554 role=brain wall_ms=1784265538806 mono_ms=296686 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1430│CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784265539511 mono_ms=297391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1431│CONN_LIFECYCLE: conn=556 role=brain stream-subscriber stream=224 wall_ms=1784265539511 mono_ms=297391 event=stream-sub-attach stream=224 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1432│CONN_LIFECYCLE: conn=556 role=brain stream-subscriber stream=224 wall_ms=1784265539513 mono_ms=297393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1433│CONN_LIFECYCLE: conn=557 role=brain wall_ms=1784265539513 mono_ms=297393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1434│CONN_LIFECYCLE: conn=557 role=brain wall_ms=1784265539513 mono_ms=297393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1445│CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784265547959 mono_ms=305839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1446│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=225 wall_ms=1784265547959 mono_ms=305839 event=stream-sub-attach stream=225 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1447│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=225 wall_ms=1784265547960 mono_ms=305840 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1448│CONN_LIFECYCLE: conn=562 role=brain wall_ms=1784265549670 mono_ms=307550 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1449│CONN_LIFECYCLE: conn=563 role=brain wall_ms=1784265549670 mono_ms=307550 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1452│CONN_LIFECYCLE: conn=565 role=brain wall_ms=1784265549672 mono_ms=307552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1453│CONN_LIFECYCLE: conn=565 role=brain stream-subscriber stream=226 wall_ms=1784265549672 mono_ms=307552 event=stream-sub-attach stream=226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1454│CONN_LIFECYCLE: conn=564 role=brain wall_ms=1784265549675 mono_ms=307555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1455│CONN_LIFECYCLE: conn=564 role=brain stream-subscriber stream=227 wall_ms=1784265549675 mono_ms=307555 event=stream-sub-attach stream=227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1456│CONN_LIFECYCLE: conn=565 role=brain stream-subscriber stream=226 wall_ms=1784265549681 mono_ms=307561 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1457│CONN_LIFECYCLE: conn=566 role=brain wall_ms=1784265549681 mono_ms=307561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1458│CONN_LIFECYCLE: conn=566 role=brain wall_ms=1784265549681 mono_ms=307561 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1463│CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784265550073 mono_ms=307953 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1464│CONN_LIFECYCLE: conn=569 role=brain stream-subscriber stream=228 wall_ms=1784265550073 mono_ms=307953 event=stream-sub-attach stream=228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1465│CONN_LIFECYCLE: conn=569 role=brain stream-subscriber stream=228 wall_ms=1784265550073 mono_ms=307953 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1466│CONN_LIFECYCLE: conn=569 role=brain stream-subscriber stream=228 wall_ms=1784265550073 mono_ms=307953 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1467│CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784265550073 mono_ms=307953 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1475│CONN_LIFECYCLE: conn=574 role=brain wall_ms=1784265552991 mono_ms=310871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1476│CONN_LIFECYCLE: conn=574 role=brain stream-subscriber stream=229 wall_ms=1784265552991 mono_ms=310871 event=stream-sub-attach stream=229 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1477│CONN_LIFECYCLE: conn=574 role=brain stream-subscriber stream=229 wall_ms=1784265552996 mono_ms=310876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1478│CONN_LIFECYCLE: conn=576 role=brain wall_ms=1784265552996 mono_ms=310876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1479│CONN_LIFECYCLE: conn=576 role=brain wall_ms=1784265552996 mono_ms=310876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1480│CONN_LIFECYCLE: conn=575 role=brain wall_ms=1784265553005 mono_ms=310885 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1481│CONN_LIFECYCLE: conn=575 role=brain stream-subscriber stream=230 wall_ms=1784265553005 mono_ms=310885 event=stream-sub-attach stream=230 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1482│CONN_LIFECYCLE: conn=575 role=brain stream-subscriber stream=230 wall_ms=1784265553007 mono_ms=310887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1483│CONN_LIFECYCLE: conn=577 role=brain wall_ms=1784265553007 mono_ms=310887 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1484│CONN_LIFECYCLE: conn=577 role=brain wall_ms=1784265553007 mono_ms=310887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1487│CONN_LIFECYCLE: conn=579 role=brain wall_ms=1784265554601 mono_ms=312481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1488│CONN_LIFECYCLE: conn=579 role=brain stream-subscriber stream=231 wall_ms=1784265554601 mono_ms=312481 event=stream-sub-attach stream=231 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1489│CONN_LIFECYCLE: conn=579 role=brain stream-subscriber stream=231 wall_ms=1784265554603 mono_ms=312483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1490│CONN_LIFECYCLE: conn=580 role=brain wall_ms=1784265554603 mono_ms=312483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1491│CONN_LIFECYCLE: conn=580 role=brain wall_ms=1784265554603 mono_ms=312483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1493│CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784265555203 mono_ms=313083 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1494│CONN_LIFECYCLE: conn=582 role=brain stream-subscriber stream=232 wall_ms=1784265555203 mono_ms=313083 event=stream-sub-attach stream=232 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1495│CONN_LIFECYCLE: conn=582 role=brain stream-subscriber stream=232 wall_ms=1784265555203 mono_ms=313083 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1496│CONN_LIFECYCLE: conn=583 role=brain wall_ms=1784265557063 mono_ms=314943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1497│CONN_LIFECYCLE: conn=583 role=brain wall_ms=1784265557063 mono_ms=314943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1499│CONN_LIFECYCLE: conn=584 role=brain wall_ms=1784265559830 mono_ms=317710 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1500│CONN_LIFECYCLE: conn=585 role=brain stream-subscriber stream=233 wall_ms=1784265559831 mono_ms=317711 event=stream-sub-attach stream=233 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1501│CONN_LIFECYCLE: conn=585 role=brain stream-subscriber stream=233 wall_ms=1784265559831 mono_ms=317711 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1502│CONN_LIFECYCLE: conn=586 role=brain wall_ms=1784265562109 mono_ms=319989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1503│CONN_LIFECYCLE: conn=586 role=brain wall_ms=1784265562109 mono_ms=319989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1514│CONN_LIFECYCLE: conn=590 role=brain wall_ms=1784265563353 mono_ms=321233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1515│CONN_LIFECYCLE: conn=591 role=brain stream-subscriber stream=234 wall_ms=1784265563353 mono_ms=321233 event=stream-sub-attach stream=234 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1516│CONN_LIFECYCLE: conn=591 role=brain stream-subscriber stream=234 wall_ms=1784265563353 mono_ms=321233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1517│CONN_LIFECYCLE: conn=591 role=brain stream-subscriber stream=234 wall_ms=1784265563357 mono_ms=321237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1518│CONN_LIFECYCLE: conn=592 role=brain wall_ms=1784265563358 mono_ms=321237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1522│CONN_LIFECYCLE: conn=594 role=brain wall_ms=1784265564762 mono_ms=322642 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1523│CONN_LIFECYCLE: conn=594 role=brain stream-subscriber stream=239 wall_ms=1784265564762 mono_ms=322642 event=stream-sub-attach stream=239 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1524│CONN_LIFECYCLE: conn=594 role=brain stream-subscriber stream=239 wall_ms=1784265564771 mono_ms=322650 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1525│CONN_LIFECYCLE: conn=595 role=brain wall_ms=1784265564771 mono_ms=322651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1526│CONN_LIFECYCLE: conn=595 role=brain wall_ms=1784265564771 mono_ms=322651 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1533│CONN_LIFECYCLE: conn=600 role=brain wall_ms=1784265568083 mono_ms=325963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1534│CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=241 wall_ms=1784265568083 mono_ms=325963 event=stream-sub-attach stream=241 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1535│CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=241 wall_ms=1784265568085 mono_ms=325965 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1536│CONN_LIFECYCLE: conn=601 role=brain wall_ms=1784265568086 mono_ms=325965 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1537│CONN_LIFECYCLE: conn=601 role=brain wall_ms=1784265568086 mono_ms=325966 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1538│CONN_LIFECYCLE: conn=599 role=brain wall_ms=1784265568092 mono_ms=325972 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1539│CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=240 wall_ms=1784265568092 mono_ms=325972 event=stream-sub-attach stream=240 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1540│CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=240 wall_ms=1784265568096 mono_ms=325976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1541│CONN_LIFECYCLE: conn=602 role=brain wall_ms=1784265568097 mono_ms=325977 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1542│CONN_LIFECYCLE: conn=602 role=brain wall_ms=1784265568097 mono_ms=325977 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1545│CONN_LIFECYCLE: conn=604 role=brain wall_ms=1784265569693 mono_ms=327573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1546│CONN_LIFECYCLE: conn=604 role=brain stream-subscriber stream=242 wall_ms=1784265569693 mono_ms=327573 event=stream-sub-attach stream=242 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1547│CONN_LIFECYCLE: conn=604 role=brain stream-subscriber stream=242 wall_ms=1784265569695 mono_ms=327575 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1548│CONN_LIFECYCLE: conn=605 role=brain wall_ms=1784265569696 mono_ms=327576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1549│CONN_LIFECYCLE: conn=605 role=brain wall_ms=1784265569696 mono_ms=327576 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1557│CONN_LIFECYCLE: conn=607 role=brain wall_ms=1784265576834 mono_ms=334714 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1558│CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=243 wall_ms=1784265576835 mono_ms=334715 event=stream-sub-attach stream=243 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1559│CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=243 wall_ms=1784265576835 mono_ms=334715 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1560│CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=243 wall_ms=1784265576835 mono_ms=334715 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1561│CONN_LIFECYCLE: conn=609 role=brain wall_ms=1784265576835 mono_ms=334715 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1566│CONN_LIFECYCLE: conn=611 role=brain wall_ms=1784265578243 mono_ms=336123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1567│CONN_LIFECYCLE: conn=612 role=brain stream-subscriber stream=244 wall_ms=1784265578243 mono_ms=336123 event=stream-sub-attach stream=244 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1568│CONN_LIFECYCLE: conn=612 role=brain stream-subscriber stream=244 wall_ms=1784265578243 mono_ms=336123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1569│CONN_LIFECYCLE: conn=612 role=brain stream-subscriber stream=244 wall_ms=1784265578248 mono_ms=336128 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1570│CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784265578248 mono_ms=336128 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1571│CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784265578248 mono_ms=336128 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1572│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=1784265578758 mono_ms=336638 event=stream-sub-attach stream=248 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1573│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=1784265579403 mono_ms=337283 event=stream-sub-attach stream=249 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1574│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=1784265579609 mono_ms=337488 event=stream-sub-attach stream=250 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1575│CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1576│CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1577│CONN_LIFECYCLE: conn=615 role=brain wall_ms=1784265579855 mono_ms=337735 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1578│CONN_LIFECYCLE: conn=615 role=brain stream-subscriber stream=251 wall_ms=1784265579855 mono_ms=337735 event=stream-sub-attach stream=251 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1579│CONN_LIFECYCLE: conn=615 role=brain stream-subscriber stream=251 wall_ms=1784265579864 mono_ms=337744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1580│CONN_LIFECYCLE: conn=616 role=brain wall_ms=1784265579864 mono_ms=337744 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1581│CONN_LIFECYCLE: conn=616 role=brain wall_ms=1784265579864 mono_ms=337744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1585│CONN_LIFECYCLE: conn=618 role=brain wall_ms=1784265582973 mono_ms=340853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1586│CONN_LIFECYCLE: conn=619 role=brain stream-subscriber stream=252 wall_ms=1784265582974 mono_ms=340853 event=stream-sub-attach stream=252 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1587│CONN_LIFECYCLE: conn=619 role=brain stream-subscriber stream=252 wall_ms=1784265582974 mono_ms=340854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1588│CONN_LIFECYCLE: conn=619 role=brain stream-subscriber stream=252 wall_ms=1784265582974 mono_ms=340854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1589│CONN_LIFECYCLE: conn=620 role=brain wall_ms=1784265582974 mono_ms=340854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1592│CONN_LIFECYCLE: conn=621 role=brain wall_ms=1784265583074 mono_ms=340954 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1593│CONN_LIFECYCLE: conn=622 role=brain stream-subscriber stream=253 wall_ms=1784265583074 mono_ms=340954 event=stream-sub-attach stream=253 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1594│CONN_LIFECYCLE: conn=622 role=brain stream-subscriber stream=253 wall_ms=1784265583074 mono_ms=340954 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1595│CONN_LIFECYCLE: conn=622 role=brain stream-subscriber stream=253 wall_ms=1784265583074 mono_ms=340954 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1596│CONN_LIFECYCLE: conn=623 role=brain wall_ms=1784265583074 mono_ms=340954 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1600│CONN_LIFECYCLE: conn=625 role=brain wall_ms=1784265584887 mono_ms=342766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1601│CONN_LIFECYCLE: conn=625 role=brain stream-subscriber stream=254 wall_ms=1784265584887 mono_ms=342767 event=stream-sub-attach stream=254 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1602│CONN_LIFECYCLE: conn=625 role=brain stream-subscriber stream=254 wall_ms=1784265584889 mono_ms=342769 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1603│CONN_LIFECYCLE: conn=626 role=brain wall_ms=1784265584889 mono_ms=342769 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1604│CONN_LIFECYCLE: conn=626 role=brain wall_ms=1784265584889 mono_ms=342769 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1608│CONN_LIFECYCLE: conn=628 role=brain wall_ms=1784265589915 mono_ms=347795 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1609│CONN_LIFECYCLE: conn=629 role=brain stream-subscriber stream=255 wall_ms=1784265589915 mono_ms=347795 event=stream-sub-attach stream=255 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1610│CONN_LIFECYCLE: conn=629 role=brain stream-subscriber stream=255 wall_ms=1784265589915 mono_ms=347795 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1611│CONN_LIFECYCLE: conn=629 role=brain stream-subscriber stream=255 wall_ms=1784265589922 mono_ms=347802 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1612│CONN_LIFECYCLE: conn=630 role=brain wall_ms=1784265589922 mono_ms=347802 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1621│CONN_LIFECYCLE: conn=634 role=brain wall_ms=1784265593940 mono_ms=351820 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1622│CONN_LIFECYCLE: conn=635 role=brain stream-subscriber stream=258 wall_ms=1784265593940 mono_ms=351820 event=stream-sub-attach stream=258 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1623│CONN_LIFECYCLE: conn=636 role=brain stream-subscriber stream=256 wall_ms=1784265593940 mono_ms=351820 event=stream-sub-attach stream=256 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1624│CONN_LIFECYCLE: conn=635 role=brain stream-subscriber stream=258 wall_ms=1784265593940 mono_ms=351820 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1625│CONN_LIFECYCLE: conn=636 role=brain stream-subscriber stream=256 wall_ms=1784265593940 mono_ms=351820 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1626│CONN_LIFECYCLE: conn=637 role=brain wall_ms=1784265593941 mono_ms=351821 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1627│CONN_LIFECYCLE: conn=637 role=brain stream-subscriber stream=259 wall_ms=1784265593941 mono_ms=351821 event=stream-sub-attach stream=259 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1628│CONN_LIFECYCLE: conn=637 role=brain stream-subscriber stream=259 wall_ms=1784265593943 mono_ms=351823 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1629│CONN_LIFECYCLE: conn=638 role=brain wall_ms=1784265593943 mono_ms=351823 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1630│CONN_LIFECYCLE: conn=638 role=brain wall_ms=1784265593943 mono_ms=351823 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1633│CONN_LIFECYCLE: conn=640 role=brain wall_ms=1784265594041 mono_ms=351921 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1634│CONN_LIFECYCLE: conn=640 role=brain stream-subscriber stream=257 wall_ms=1784265594041 mono_ms=351921 event=stream-sub-attach stream=257 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1635│CONN_LIFECYCLE: conn=640 role=brain stream-subscriber stream=257 wall_ms=1784265594045 mono_ms=351925 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1636│CONN_LIFECYCLE: conn=641 role=brain wall_ms=1784265594045 mono_ms=351925 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1637│CONN_LIFECYCLE: conn=641 role=brain wall_ms=1784265594046 mono_ms=351925 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1642│CONN_LIFECYCLE: conn=644 role=brain wall_ms=1784265599877 mono_ms=357757 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1643│CONN_LIFECYCLE: conn=644 role=brain stream-subscriber stream=260 wall_ms=1784265599877 mono_ms=357757 event=stream-sub-attach stream=260 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1644│CONN_LIFECYCLE: conn=644 role=brain stream-subscriber stream=260 wall_ms=1784265599879 mono_ms=357759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1645│CONN_LIFECYCLE: conn=645 role=brain wall_ms=1784265599879 mono_ms=357759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1646│CONN_LIFECYCLE: conn=645 role=brain wall_ms=1784265599879 mono_ms=357759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncation":{"content":" 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...\n 47|CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784265242749 mono_ms=630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*48|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 wall_ms=1784265242749 mono_ms=630 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 49|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242749 mono_ms=630 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 50|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265242770 mono_ms=651 event=controller-replaced session=1 new_conn=15 [REQ-CONN-POISON-ATTRIBUTION]\n 51|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265242770 mono_ms=651 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 137|CONN_LIFECYCLE: conn=39 role=brain wall_ms=1784265248695 mono_ms=6576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*138|CONN_LIFECYCLE: conn=39 role=brain stream-subscriber stream=4 wall_ms=1784265248702 mono_ms=6583 event=stream-sub-attach stream=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 139|CONN_LIFECYCLE: conn=40 role=brain wall_ms=1784265248710 mono_ms=6591 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*140|CONN_LIFECYCLE: conn=40 role=brain stream-subscriber stream=6 wall_ms=1784265248717 mono_ms=6598 event=stream-sub-attach stream=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 141|CONN_LIFECYCLE: conn=41 role=brain wall_ms=1784265248719 mono_ms=6600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 142|CONN_LIFECYCLE: conn=42 role=brain wall_ms=1784265248736 mono_ms=6617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*143|CONN_LIFECYCLE: conn=42 role=brain stream-subscriber stream=8 wall_ms=1784265248743 mono_ms=6624 event=stream-sub-attach stream=8 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 144|CONN_LIFECYCLE: conn=43 role=brain wall_ms=1784265248772 mono_ms=6652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 145|CONN_LIFECYCLE: conn=44 role=brain wall_ms=1784265248772 mono_ms=6652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 146|CONN_LIFECYCLE: conn=45 role=brain wall_ms=1784265248772 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 152|CONN_LIFECYCLE: conn=46 role=brain wall_ms=1784265248773 mono_ms=6653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*153|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=7 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*154|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*155|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 wall_ms=1784265248773 mono_ms=6654 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 156|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 157|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 158|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265248773 mono_ms=6654 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 233|CONN_LIFECYCLE: conn=78 role=brain wall_ms=1784265271567 mono_ms=29447 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*234|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=stream-sub-attach stream=10 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 235|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271567 mono_ms=29448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 236|CONN_LIFECYCLE: conn=79 role=brain stream-subscriber stream=10 wall_ms=1784265271578 mono_ms=29458 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 237|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 238|CONN_LIFECYCLE: conn=80 role=brain wall_ms=1784265271582 mono_ms=29463 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*239|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 wall_ms=1784265271644 mono_ms=29525 event=stream-sub-attach stream=14 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 240|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 241|CONN_LIFECYCLE: conn=82 role=brain wall_ms=1784265271669 mono_ms=29549 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 242|CONN_LIFECYCLE: conn=81 role=brain wall_ms=1784265271669 mono_ms=29550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 244|CONN_LIFECYCLE: conn=83 role=brain wall_ms=1784265271671 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*245|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271671 mono_ms=29552 event=stream-sub-attach stream=13 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 246|CONN_LIFECYCLE: conn=84 role=brain wall_ms=1784265271672 mono_ms=29552 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*247|CONN_LIFECYCLE: conn=84 role=brain stream-subscriber stream=12 wall_ms=1784265271672 mono_ms=29552 event=stream-sub-attach stream=12 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 248|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271675 mono_ms=29555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 249|CONN_LIFECYCLE: conn=85 role=brain wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 250|CONN_LIFECYCLE: conn=83 role=brain stream-subscriber stream=13 wall_ms=1784265271676 mono_ms=29557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 256|CONN_LIFECYCLE: conn=88 role=brain wall_ms=1784265273075 mono_ms=30956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*257|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273075 mono_ms=30956 event=stream-sub-attach stream=15 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 258|CONN_LIFECYCLE: conn=88 role=brain stream-subscriber stream=15 wall_ms=1784265273078 mono_ms=30959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 259|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 260|CONN_LIFECYCLE: conn=89 role=brain wall_ms=1784265273079 mono_ms=30960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 268|CONN_LIFECYCLE: conn=94 role=brain wall_ms=1784265274280 mono_ms=32160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*269|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=17 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*270|CONN_LIFECYCLE: conn=94 role=brain stream-subscriber stream=16 wall_ms=1784265274280 mono_ms=32160 event=stream-sub-attach stream=16 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 271|CONN_LIFECYCLE: conn=93 role=brain stream-subscriber stream=17 wall_ms=1784265274282 mono_ms=32162 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 272|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 273|CONN_LIFECYCLE: conn=95 role=brain wall_ms=1784265274282 mono_ms=32163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 278|CONN_LIFECYCLE: conn=97 role=brain wall_ms=1784265274479 mono_ms=32360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*279|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=stream-sub-attach stream=18 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 280|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 281|CONN_LIFECYCLE: conn=98 role=brain stream-subscriber stream=18 wall_ms=1784265274480 mono_ms=32361 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 282|CONN_LIFECYCLE: conn=99 role=brain wall_ms=1784265274480 mono_ms=32361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 285|CONN_LIFECYCLE: conn=100 role=brain wall_ms=1784265274781 mono_ms=32661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*286|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32661 event=stream-sub-attach stream=19 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 287|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274781 mono_ms=32662 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 288|CONN_LIFECYCLE: conn=101 role=brain stream-subscriber stream=19 wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 289|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 290|CONN_LIFECYCLE: conn=102 role=brain wall_ms=1784265274785 mono_ms=32666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*291|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 wall_ms=1784265276296 mono_ms=34177 event=stream-sub-attach stream=20 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*292|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 wall_ms=1784265276389 mono_ms=34270 event=stream-sub-attach stream=23 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*293|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 wall_ms=1784265276685 mono_ms=34565 event=stream-sub-attach stream=24 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*294|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 wall_ms=1784265276909 mono_ms=34790 event=stream-sub-attach stream=27 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*295|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 wall_ms=1784265277094 mono_ms=34974 event=stream-sub-attach stream=28 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*296|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 wall_ms=1784265277291 mono_ms=35171 event=stream-sub-attach stream=31 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*297|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265277496 mono_ms=35377 event=stream-sub-attach stream=32 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 298|CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 299|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 300|CONN_LIFECYCLE: conn=103 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 301|CONN_LIFECYCLE: conn=104 role=brain wall_ms=1784265278395 mono_ms=36276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*302|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=33 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*303|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=stream-sub-attach stream=34 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 304|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 305|CONN_LIFECYCLE: conn=106 role=brain stream-subscriber stream=34 wall_ms=1784265278395 mono_ms=36276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 306|CONN_LIFECYCLE: conn=105 role=brain stream-subscriber stream=33 wall_ms=1784265278400 mono_ms=36281 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 314|CONN_LIFECYCLE: conn=110 role=brain wall_ms=1784265278797 mono_ms=36678 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*315|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278798 mono_ms=36678 event=stream-sub-attach stream=35 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 316|CONN_LIFECYCLE: conn=110 role=brain stream-subscriber stream=35 wall_ms=1784265278807 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 317|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278807 mono_ms=36688 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 318|CONN_LIFECYCLE: conn=111 role=brain wall_ms=1784265278808 mono_ms=36688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\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 327|CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 328|CONN_LIFECYCLE: conn=115 role=brain wall_ms=1784265283622 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*329|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 wall_ms=1784265283622 mono_ms=41503 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 330|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 wall_ms=1784265283622 mono_ms=41503 event=viewer-attach session=6 vid=0 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 331|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=1784265283630 mono_ms=41510 event=viewer-attach session=6 vid=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 332|CONN_LIFECYCLE: conn=117 role=brain wall_ms=1784265284118 mono_ms=41999 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 336|CONN_LIFECYCLE: conn=119 role=brain wall_ms=1784265288242 mono_ms=46123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*337|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288243 mono_ms=46123 event=stream-sub-attach stream=38 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 338|CONN_LIFECYCLE: conn=119 role=brain stream-subscriber stream=38 wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 339|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 340|CONN_LIFECYCLE: conn=120 role=brain wall_ms=1784265288245 mono_ms=46125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 347|CONN_LIFECYCLE: conn=124 role=brain wall_ms=1784265293266 mono_ms=51146 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*348|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293266 mono_ms=51147 event=stream-sub-attach stream=39 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 349|CONN_LIFECYCLE: conn=124 role=brain stream-subscriber stream=39 wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 350|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 351|CONN_LIFECYCLE: conn=126 role=brain wall_ms=1784265293270 mono_ms=51151 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 352|CONN_LIFECYCLE: conn=125 role=brain wall_ms=1784265293277 mono_ms=51158 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*353|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293277 mono_ms=51158 event=stream-sub-attach stream=40 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 354|CONN_LIFECYCLE: conn=125 role=brain stream-subscriber stream=40 wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 355|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 356|CONN_LIFECYCLE: conn=127 role=brain wall_ms=1784265293279 mono_ms=51160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 359|CONN_LIFECYCLE: conn=129 role=brain wall_ms=1784265293869 mono_ms=51749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*360|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293869 mono_ms=51749 event=stream-sub-attach stream=41 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 361|CONN_LIFECYCLE: conn=129 role=brain stream-subscriber stream=41 wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 362|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 363|CONN_LIFECYCLE: conn=130 role=brain wall_ms=1784265293878 mono_ms=51759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 419|CONN_LIFECYCLE: conn=145 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*420|CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=5 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*421|CONN_LIFECYCLE: conn=145 role=brain stream-subscriber stream=3 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 422|CONN_LIFECYCLE: conn=146 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 423|CONN_LIFECYCLE: conn=147 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*424|CONN_LIFECYCLE: conn=146 role=brain stream-subscriber stream=1 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*425|CONN_LIFECYCLE: conn=147 role=brain stream-subscriber stream=7 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=7 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 426|CONN_LIFECYCLE: conn=148 role=brain wall_ms=1784265298872 mono_ms=56753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 427|CONN_LIFECYCLE: conn=144 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298872 mono_ms=56753 event=controller-attach session=6 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 428|CONN_LIFECYCLE: conn=145 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298872 mono_ms=56753 event=controller-attach session=4 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*429|CONN_LIFECYCLE: conn=148 role=brain stream-subscriber stream=36 wall_ms=1784265298872 mono_ms=56753 event=stream-sub-attach stream=36 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 430|CONN_LIFECYCLE: conn=146 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298873 mono_ms=56753 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 431|CONN_LIFECYCLE: conn=147 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784265298873 mono_ms=56753 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 432|CONN_LIFECYCLE: conn=148 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=2 wall_ms=1784265298908 mono_ms=56788 event=viewer-attach session=6 vid=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 454|CONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*455|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 456|CONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 457|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 458|CONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 460|CONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*461|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 462|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 463|CONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 464|CONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 467|CONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*468|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 469|CONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 470|CONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 471|CONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 474|CONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*475|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 476|CONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 477|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 478|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 479|CONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*480|CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 481|CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 482|CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 483|CONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 487|CONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*488|CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=stream-sub-attach stream=47 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 489|CONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 490|CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 491|CONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 499|CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*500|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 501|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 502|CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 503|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 505|CONN_LIFECYCLE: conn=177 role=brain wall_ms=1784265315044 mono_ms=72924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*506|CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315044 mono_ms=72924 event=stream-sub-attach stream=52 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 507|CONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 508|CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 509|CONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 510|CONN_LIFECYCLE: conn=178 role=brain wall_ms=1784265315054 mono_ms=72934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*511|CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315054 mono_ms=72934 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 512|CONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 513|CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 514|CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*515|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*516|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*517|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*518|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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*519|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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 520|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 521|CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 522|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 524|CONN_LIFECYCLE: conn=184 role=brain wall_ms=1784265318460 mono_ms=76340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*525|CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318460 mono_ms=76341 event=stream-sub-attach stream=63 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 526|CONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318462 mono_ms=76342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 527|CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 528|CONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 529|CONN_LIFECYCLE: conn=183 role=brain wall_ms=1784265318474 mono_ms=76355 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*530|CONN_LIFECYCLE: conn=183 role=brain stream-subscriber stream=62 wall_ms=1784265318474 mono_ms=76355 event=stream-sub-attach stream=62 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 531|CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 532|CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 533|CONN_LIFECYCLE: conn=186 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 534|CONN_LIFECYCLE: conn=187 role=brain wall_ms=1784265318559 mono_ms=76440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*535|CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=64 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*536|CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=stream-sub-attach stream=65 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 537|CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 538|CONN_LIFECYCLE: conn=189 role=brain stream-subscriber stream=65 wall_ms=1784265318560 mono_ms=76440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 539|CONN_LIFECYCLE: conn=188 role=brain stream-subscriber stream=64 wall_ms=1784265318566 mono_ms=76446 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 554|CONN_LIFECYCLE: conn=196 role=brain wall_ms=1784265319063 mono_ms=76943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*555|CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319063 mono_ms=76943 event=stream-sub-attach stream=67 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 556|CONN_LIFECYCLE: conn=197 role=brain wall_ms=1784265319067 mono_ms=76947 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*557|CONN_LIFECYCLE: conn=197 role=brain stream-subscriber stream=66 wall_ms=1784265319067 mono_ms=76948 event=stream-sub-attach stream=66 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 558|CONN_LIFECYCLE: conn=196 role=brain stream-subscriber stream=67 wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 559|CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 560|CONN_LIFECYCLE: conn=198 role=brain wall_ms=1784265319071 mono_ms=76952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\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 574|CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328205 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 575|CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328206 mono_ms=86086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 576|CONN_LIFECYCLE: conn=204 role=brain wall_ms=1784265328206 mono_ms=86086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 579|CONN_LIFECYCLE: conn=205 role=brain wall_ms=1784265328306 mono_ms=86186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*580|CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86186 event=stream-sub-attach stream=69 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 581|CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 582|CONN_LIFECYCLE: conn=206 role=brain stream-subscriber stream=69 wall_ms=1784265328306 mono_ms=86187 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 583|CONN_LIFECYCLE: conn=207 role=brain wall_ms=1784265328306 mono_ms=86187 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 597|CONN_LIFECYCLE: conn=212 role=brain wall_ms=1784265333433 mono_ms=91313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*598|CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333433 mono_ms=91314 event=stream-sub-attach stream=70 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 599|CONN_LIFECYCLE: conn=212 role=brain stream-subscriber stream=70 wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 600|CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 601|CONN_LIFECYCLE: conn=215 role=brain wall_ms=1784265333437 mono_ms=91318 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 602|CONN_LIFECYCLE: conn=214 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*603|CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=71 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 604|CONN_LIFECYCLE: conn=213 role=brain wall_ms=1784265333445 mono_ms=91326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*605|CONN_LIFECYCLE: conn=213 role=brain stream-subscriber stream=72 wall_ms=1784265333445 mono_ms=91326 event=stream-sub-attach stream=72 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 606|CONN_LIFECYCLE: conn=214 role=brain stream-subscriber stream=71 wall_ms=1784265333447 mono_ms=91327 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 607|CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 608|CONN_LIFECYCLE: conn=216 role=brain wall_ms=1784265333447 mono_ms=91328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 616|CONN_LIFECYCLE: conn=220 role=brain wall_ms=1784265334035 mono_ms=91915 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*617|CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334035 mono_ms=91915 event=stream-sub-attach stream=73 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 618|CONN_LIFECYCLE: conn=220 role=brain stream-subscriber stream=73 wall_ms=1784265334043 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 619|CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334043 mono_ms=91924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 620|CONN_LIFECYCLE: conn=221 role=brain wall_ms=1784265334044 mono_ms=91924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 622|CONN_LIFECYCLE: conn=222 role=brain wall_ms=1784265334737 mono_ms=92617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*623|CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=stream-sub-attach stream=74 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 624|CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 625|CONN_LIFECYCLE: conn=223 role=brain stream-subscriber stream=74 wall_ms=1784265334737 mono_ms=92618 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 626|CONN_LIFECYCLE: conn=224 role=brain wall_ms=1784265334737 mono_ms=92618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 629|CONN_LIFECYCLE: conn=225 role=brain wall_ms=1784265335541 mono_ms=93421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*630|CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=stream-sub-attach stream=75 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 631|CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335541 mono_ms=93422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 632|CONN_LIFECYCLE: conn=226 role=brain stream-subscriber stream=75 wall_ms=1784265335545 mono_ms=93426 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 633|CONN_LIFECYCLE: conn=227 role=brain wall_ms=1784265335545 mono_ms=93426 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 637|CONN_LIFECYCLE: conn=229 role=brain wall_ms=1784265343746 mono_ms=101626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*638|CONN_LIFECYCLE: conn=229 role=brain stream-subscriber stream=79 wall_ms=1784265343746 mono_ms=101626 event=stream-sub-attach stream=79 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 639|CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 640|CONN_LIFECYCLE: conn=230 role=brain wall_ms=1784265343776 mono_ms=101657 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 641|CONN_LIFECYCLE: conn=231 role=brain wall_ms=1784265343777 mono_ms=101658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*642|CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343777 mono_ms=101658 event=stream-sub-attach stream=80 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 643|CONN_LIFECYCLE: conn=231 role=brain stream-subscriber stream=80 wall_ms=1784265343785 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 644|CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 645|CONN_LIFECYCLE: conn=232 role=brain wall_ms=1784265343786 mono_ms=101666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 650|CONN_LIFECYCLE: conn=234 role=brain wall_ms=1784265344078 mono_ms=101959 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*651|CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=stream-sub-attach stream=82 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 652|CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344078 mono_ms=101959 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 653|CONN_LIFECYCLE: conn=235 role=brain stream-subscriber stream=82 wall_ms=1784265344085 mono_ms=101966 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 654|CONN_LIFECYCLE: conn=236 role=brain wall_ms=1784265344085 mono_ms=101966 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 660|CONN_LIFECYCLE: conn=239 role=brain wall_ms=1784265348500 mono_ms=106381 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*661|CONN_LIFECYCLE: conn=239 role=brain stream-subscriber stream=83 wall_ms=1784265348500 mono_ms=106381 event=stream-sub-attach stream=83 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 662|CONN_LIFECYCLE: conn=240 role=brain wall_ms=1784265348505 mono_ms=106386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 663|CONN_LIFECYCLE: conn=239 role=brain stream-subscriber stream=83 wall_ms=1784265348505 mono_ms=106386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*664|CONN_LIFECYCLE: conn=240 role=brain stream-subscriber stream=84 wall_ms=1784265348505 mono_ms=106386 event=stream-sub-attach stream=84 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 665|CONN_LIFECYCLE: conn=241 role=brain wall_ms=1784265348505 mono_ms=106386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 666|CONN_LIFECYCLE: conn=241 role=brain wall_ms=1784265348505 mono_ms=106386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 667|CONN_LIFECYCLE: conn=240 role=brain stream-subscriber stream=84 wall_ms=1784265348507 mono_ms=106388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 672|CONN_LIFECYCLE: conn=244 role=brain wall_ms=1784265348600 mono_ms=106481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*673|CONN_LIFECYCLE: conn=244 role=brain stream-subscriber stream=85 wall_ms=1784265348600 mono_ms=106481 event=stream-sub-attach stream=85 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 674|CONN_LIFECYCLE: conn=244 role=brain stream-subscriber stream=85 wall_ms=1784265348603 mono_ms=106483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 675|CONN_LIFECYCLE: conn=245 role=brain wall_ms=1784265348603 mono_ms=106483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 676|CONN_LIFECYCLE: conn=245 role=brain wall_ms=1784265348603 mono_ms=106483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 680|CONN_LIFECYCLE: conn=247 role=brain wall_ms=1784265348800 mono_ms=106680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*681|CONN_LIFECYCLE: conn=249 role=brain stream-subscriber stream=87 wall_ms=1784265348800 mono_ms=106681 event=stream-sub-attach stream=87 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*682|CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348800 mono_ms=106681 event=stream-sub-attach stream=86 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 683|CONN_LIFECYCLE: conn=249 role=brain stream-subscriber stream=87 wall_ms=1784265348800 mono_ms=106681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 684|CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348800 mono_ms=106681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 685|CONN_LIFECYCLE: conn=248 role=brain stream-subscriber stream=86 wall_ms=1784265348808 mono_ms=106688 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 702|CONN_LIFECYCLE: conn=256 role=brain wall_ms=1784265359151 mono_ms=117032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*703|CONN_LIFECYCLE: conn=256 role=brain stream-subscriber stream=88 wall_ms=1784265359151 mono_ms=117032 event=stream-sub-attach stream=88 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 704|CONN_LIFECYCLE: conn=256 role=brain stream-subscriber stream=88 wall_ms=1784265359163 mono_ms=117043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 705|CONN_LIFECYCLE: conn=257 role=brain wall_ms=1784265359163 mono_ms=117043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 706|CONN_LIFECYCLE: conn=257 role=brain wall_ms=1784265359163 mono_ms=117044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 718|CONN_LIFECYCLE: conn=262 role=brain wall_ms=1784265363674 mono_ms=121555 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*719|CONN_LIFECYCLE: conn=263 role=brain stream-subscriber stream=89 wall_ms=1784265363674 mono_ms=121555 event=stream-sub-attach stream=89 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*720|CONN_LIFECYCLE: conn=262 role=brain stream-subscriber stream=91 wall_ms=1784265363674 mono_ms=121555 event=stream-sub-attach stream=91 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 721|CONN_LIFECYCLE: conn=262 role=brain stream-subscriber stream=91 wall_ms=1784265363676 mono_ms=121556 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 722|CONN_LIFECYCLE: conn=264 role=brain wall_ms=1784265363676 mono_ms=121557 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 723|CONN_LIFECYCLE: conn=264 role=brain wall_ms=1784265363676 mono_ms=121557 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 727|CONN_LIFECYCLE: conn=261 role=brain wall_ms=1784265363680 mono_ms=121561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*728|CONN_LIFECYCLE: conn=261 role=brain stream-subscriber stream=90 wall_ms=1784265363680 mono_ms=121561 event=stream-sub-attach stream=90 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 729|CONN_LIFECYCLE: conn=261 role=brain stream-subscriber stream=90 wall_ms=1784265363682 mono_ms=121563 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 730|CONN_LIFECYCLE: conn=266 role=brain wall_ms=1784265363682 mono_ms=121563 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 731|CONN_LIFECYCLE: conn=266 role=brain wall_ms=1784265363683 mono_ms=121563 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 735|CONN_LIFECYCLE: conn=268 role=brain wall_ms=1784265364176 mono_ms=122056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*736|CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=stream-sub-attach stream=92 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 737|CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 738|CONN_LIFECYCLE: conn=269 role=brain stream-subscriber stream=92 wall_ms=1784265364176 mono_ms=122057 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 739|CONN_LIFECYCLE: conn=270 role=brain wall_ms=1784265364177 mono_ms=122057 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 742|CONN_LIFECYCLE: conn=271 role=brain wall_ms=1784265365883 mono_ms=123764 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*743|CONN_LIFECYCLE: conn=272 role=brain stream-subscriber stream=93 wall_ms=1784265365883 mono_ms=123764 event=stream-sub-attach stream=93 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 744|CONN_LIFECYCLE: conn=272 role=brain stream-subscriber stream=93 wall_ms=1784265365883 mono_ms=123764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 745|CONN_LIFECYCLE: conn=273 role=brain wall_ms=1784265369062 mono_ms=126942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 746|CONN_LIFECYCLE: conn=273 role=brain wall_ms=1784265369062 mono_ms=126943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 755|CONN_LIFECYCLE: conn=276 role=brain wall_ms=1784265374325 mono_ms=132205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*756|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374325 mono_ms=132205 event=stream-sub-attach stream=97 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 757|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374325 mono_ms=132205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 758|CONN_LIFECYCLE: conn=278 role=brain wall_ms=1784265374326 mono_ms=132206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*759|CONN_LIFECYCLE: conn=278 role=brain stream-subscriber stream=98 wall_ms=1784265374326 mono_ms=132206 event=stream-sub-attach stream=98 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 760|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374332 mono_ms=132212 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"bytes","totalLines":928,"totalBytes":134387,"outputLines":349,"outputBytes":51158,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":928,"totalBytes":134387,"outputLines":349,"outputBytes":51158,"shownRange":{"start":1,"end":349},"nextOffset":350}}},"isError":false,"timestamp":1784271942830}}
{"type":"message","id":"d05ee7a1","parentId":"bb331e37","timestamp":"2026-07-17T07:05:59.759Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying stream subscriber leak on long-lived connections**\n\n**Analyzing retire_stream function and subscriber retention**\n\n**Planning targeted log grep from line 19000**"},{"type":"toolCall","id":"call_hclLOnZGf6Z2rfPsqfns7VCc|fc_0fcf561150331aac016a59d457150c8190814a47e48b771987","name":"grep","arguments":{"i":"Finding latest stream attachments","pattern":"event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"19000-","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_5uuO5wm2p1ogG7I4Jr6JBFxs|fc_0fcf561150331aac016a59d45715208190846aa453a390c0f0","name":"grep","arguments":{"i":"Finding latest connection closes","pattern":"event=transport-close","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"19000-","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_oI40riCH9CyuZQvmqR3iTZlY|fc_0fcf561150331aac016a59d457152881908fa13e7e515cf5cf","name":"grep","arguments":{"i":"Finding latest poison IDs","pattern":"CONN_WRITE_POISONED","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"19000-","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_z8LdxwcdV8YZdMsyWhD0myyO|fc_0fcf561150331aac016a59d45715a481908c5861a74a85c2dd","name":"read","arguments":{"i":"Reading stream retirement body","path":"crates/spt-daemon/src/nethost.rs","selector":"1810-1860"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":41689,"output":712,"cacheRead":101888,"cacheWrite":0,"totalTokens":144289,"reasoningTokens":453,"cost":{"input":0.20844500000000002,"output":0.02136,"cacheRead":0.050943999999999996,"cacheWrite":0,"total":0.280749}},"stopReason":"toolUse","timestamp":1784271942871,"responseId":"resp_0fcf561150331aac016a59d447307c8190b00cb470e9314818","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d448dfcc8190b6a80ba16b8752e3","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdRXqm3jWXqxjpzkkDk8asSXkZT7HtmHY5YaSXFO_C-xonGcdAy88IBYNTwRmFfoqZxxJHKCb2qWNnsGNvwBwzRlpd8f9DjyOWDu8nnQgrt3rJ8Coe_aDDFVAvujaKXjB1Vjb4wR8oSr2Xn7EZBOHLSBn8XTIs9xKBlyDt45ESuGWnh6r5znRT7u0kpM3U7ePEBzz_QdCRmfkSYXcvZps6jy6dZAOIa9oS8a61zvTJ7sPfnPrJ5QL2Mme91UrbODzX8S4mpAFbYVaIZkXp4Tp413HbrBQf9_xg7dF8lc9EP_dg9HSDem1t5wvSzPfiDu2KeD2O9ZouPL1u9JEjQS03DuGMgbYKt8SDph5o6xx03ZY5ZvArQMai5rCUxsaKgzi2Iu1-kh6lRwnmjsoq8mHUxbUL_xe6JVWq_ls8jJaO5njZ8VNO7cXG6yosfdbTWVqph0tQewuRwuV8lFBfMBsdHsYmuf8EKHFeps5XoXA0urbo35yK5GAIsNpJz8oIUtu1AVVuUSlGKq4C9HSwEhhj_lF68DLu5RfMwVtldkj2Jaya-VtTINR60SQC1y0YaWF0Qi5dYEfn63nVpr9nPEO6VAuuUyh5qBu4K35SBGge6-g4rtwhmEWSDGi7YqxYOh5rJMfkg269ecMoGyXQgRAY6eXCltdtqjQohegiWD055LkclTho_VNWOYoCQ4UjkdbceEtKlebb-iVatDw6Euy2dLhLfMoPTQid7QuHi0c5xVBWJ4kaMxCEkWeaGLEB_2jK7qfGwawGdhAFWof7Gond2xNzrCv7U6RJ-BswI3hkkTxcDeXuJxOGCh05nq5LYXubgWtEeTBXtGV8hHBp1gIahnkS_HkIILFGxK8CvU0RJUrC7kEzzIZP7t1GqhEnTrP_FOaGH-k87JOmi2xVRvxuQSmIzR8aJCdtyZJp3-9Wpb0P1fXzvBjbJWfXT38YUG9iK89r7YjYMcNgUQS42gfvptgLsFf8yGJubpaLpL0577FshGIS9mnXyvBvo46JOJYQWFmXNj_-EQIZWsmhbT_kWEkjNVMknoFXa_6wInk1L-P58JeNdcXh1z3qw7GZma2ywoOI1_68aUMfcO893Wq0dtCWiEp7cuyOuMPcGCi_THiSNk-ou87i4TJX9S0vo-l1UeDy3YuqEwKUuLAGQd1GrEKqQbF1TDaO9JDmZBq8E8WYs_E100Pvo2wNVrhYHwaj3EeehZiwAK0kJOhWwp1Vnu0y5_O4wh-IxT7keWs3hwYWIRXxhuMncuSlZULBNp4Fv0jnxPcF32F8mClLUnvIcKWulzkT_JVn5oejp3T9rV4WDLBTWOhEM8kw5IUSr0AnMXixXKUu_Or1KOhFhmElJ8xKBLkobVr75RBAsDiSQXGwRRAE9TgiQbGpXUPp0nwMRxiyk0pLoXB1xvFpdk2dkm7ztc37JGXk031LE6kbgMVbXB5g6r-VJ1vbU0HUGAGMmjSdiNXI38D1cH50RuG2GmMO0nKNNV4vr9dfyAyK7Y2401ub-30bPbQ0SFeaGo9tOkKIObyoFAl58rUdilbOGc6NOqhnezBk-afZ_1iFcO0rF0iHl3OXaaEpAbYJ7SdlWob1nn0JZFJgoIuXR9l2pols0qZxaV9W2xsMKDqJrrZ4OGXueC6K_Jmqel3iTtd8NzGedHUfX7i1zFqzOT4nGjAZilO0D7zR7R7XkuzmezJnOFZqElA2NAHkTOmIbkThGl1S0UhxD_0CTsZlDtZezi7DzuwbnnsgxBluJq7mcOlLGrpIZnNped0aTfwUvgwbJXS4p5LPUp-TkI6tbBPGlhGgZMEjqsm-32h4CKdKDUUncdbptLkikMo6craysSOsg_PtLxufqItdbU3rZ2ndN2yPTj-cfDcQbOIWLNO825BdLpiGHAyCyE9W0_3ubVCX-dVWr71uAhtdpzZghl7q-6dOGjnB6W6rroO0eeAl2EucL8eQcK9CRsRIve0LSbdEp2S9TNfZ6unQTorgrYLPvGpnIsuUBPeYYs1ba_rhoysr41tz0cWTKr3G1MPYbeOrPor8OMO9T3_dY1mETxpabCK-wBBBI4qeVCga5r427rHPUkWSlnAdLnChRCQztW9xoBNPq8PmvhqPW6617PTPj-d8s1gAjE-mJVOlL0FnNteqFp90iMuqQ3087kWWlp6d3PeWiC-dsYYgByDc8olUkBTWztpnG0ZtYFD7DDISpFRS5Rg_9qnB5elnLNWz_sQI_hwWJha16T6ZORhe4hSUC6Vvs-Wnr7LjDNiq86C9I_yjVo78JRd3TVqmoPduqsEuNLWILkzYngbuiFbYP75tx0YeTSRvE-DMCWYabuuvQ6Ji6-HYfH2j-nzZ98y9bfJue7PWlZCbSOkhlG-lY5lwUD0inE3wgHFV-3eb_2HcMNZRyhHT5JBG-3WZqD0GykmXCKWiJfwBLsqqhyLXKwfxOpUUSecxEGbAoIa7RN4djKW-HMB1rdOdY_yRsoNX_B_brSi_OBfa3Jhw14FYiI3pomhF4J8GiKRqWdTzJKRL_ON17rzH9vJeeKt1WKKNdXdnnQ44BENXwJ-SFW79it_P3qqF1Hw7ytOOYjkdHAYRS2yjDNz05FhP_yPRlluQl96OD58sp7hz_GTqlODAg6kJVbkX5uOeGNMlO-a_Yl1kOtvWLMfOUKT9VIKs0S4KTFuz1iUV1KKmqW9ZzcnFmo1AmfragCTD7zjlLKYcSE2W4hpeKTNY5RaCNzXN1l5rK6WXC70Mb-G32kpZhtCSlh7n6ykfmGNuygQSCuI1oMFteMYanK12IBoPie6EuTPfhcZQ7XFjfBS-udwJRKpY-0hCPtLfY9u5g3RScbt2ck3qUVPVqzMeYxj8SrvHex3gKzZCr5Eiylwvly3aYH10IGAx-tmX4WiLuvLUHbDna8-EM56CdY7QARnOQOPdr-kA1h-iQq7013MFthG0aDJZ6lev3cgNl-FmE67c6ATzEcYtWbaV7Q5qRbHZtcYgTVUnfG38iCRMbdyWPcryhQMEPkW9qQtN1FcguclzyV80M7d7eHyUrBdHaPoSHjoK2Nmq6M1UG5S5gHIEDdiFHES-MhV7-JNCatqijQ7pKGYc6f79t9xJILbLmwWqjlpcBWHGwBhNXHWw4wWP8nCqRopIIfdWZMkysIRiQXhCjHGWtVNkJFzrueIlG3QK6jaDTmHihXgGve9XAAds3_6ttGGl9I-Imgppd56wRUM8y4p5tov7JpXuDh6OFmRKCGH_RG5DdbTXs5E9PUwUpRA2geq_Ej0cQcsbLlWIhILfCKHkpeAJhcsdArYXbJ8hN0ZrTgAqD6fCyDvZ3DoIv-lF9jVnZc9mq-W7sp5-IkCtGhNT7HH3LAqd1ct1QX_VIah8e6OxfXim3JtDEUZctZxyVP48thTyTiusRMolWW719oS5fChOM1bqh58IcFO0yYPcxfn74_-QTNLE_YFsWwl3I2hzpkcbo4z_lsYfd2JMi0xyChfjojNUnSlSksg1g7xZdPsO-IMstPEbUcxcviGSdtvTOgIZXdg-fNTYx0cR8QtKyJH8JYuqp2BxUuNWZCz7HDJyiFVZhRMOHE74gXMt9dp5BeUKwzKzdMruYXzqgVVtEshjrF8zkSqi-miZqqzQP5UPB8kg6e","summary":[{"type":"summary_text","text":"**Identifying stream subscriber leak on long-lived connections**"},{"type":"summary_text","text":"**Analyzing retire_stream function and subscriber retention**"},{"type":"summary_text","text":"**Planning targeted log grep from line 19000**"}]},{"id":"fc_0fcf561150331aac016a59d457150c8190814a47e48b771987","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding latest stream attachments\",\"pattern\":\"event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"19000-\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_hclLOnZGf6Z2rfPsqfns7VCc","name":"grep"},{"id":"fc_0fcf561150331aac016a59d45715208190846aa453a390c0f0","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding latest connection closes\",\"pattern\":\"event=transport-close\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"19000-\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_5uuO5wm2p1ogG7I4Jr6JBFxs","name":"grep"},{"id":"fc_0fcf561150331aac016a59d457152881908fa13e7e515cf5cf","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding latest poison IDs\",\"pattern\":\"CONN_WRITE_POISONED\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"19000-\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_oI40riCH9CyuZQvmqR3iTZlY","name":"grep"},{"id":"fc_0fcf561150331aac016a59d45715a481908c5861a74a85c2dd","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream retirement body\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1810-1860\"}","call_id":"call_z8LdxwcdV8YZdMsyWhD0myyO","name":"read"}]},"duration":16887.12240000069,"ttft":2018.7694000005722,"contextSnapshot":{"promptTokens":143577,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_hclLOnZGf6Z2rfPsqfns7VCc|fc_0fcf561150331aac016a59d457150c8190814a47e48b771987","toolName":"grep","startedAt":"2026-07-17T07:05:59.760Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding latest stream attachments"},"id":"5b8bbfc1","parentId":"d05ee7a1","timestamp":"2026-07-17T07:05:59.760Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_5uuO5wm2p1ogG7I4Jr6JBFxs|fc_0fcf561150331aac016a59d45715208190846aa453a390c0f0","toolName":"grep","startedAt":"2026-07-17T07:05:59.760Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding latest connection closes"},"id":"a6996518","parentId":"5b8bbfc1","timestamp":"2026-07-17T07:05:59.760Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_oI40riCH9CyuZQvmqR3iTZlY|fc_0fcf561150331aac016a59d457152881908fa13e7e515cf5cf","toolName":"grep","startedAt":"2026-07-17T07:05:59.760Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding latest poison IDs"},"id":"0e1017d7","parentId":"a6996518","timestamp":"2026-07-17T07:05:59.760Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_z8LdxwcdV8YZdMsyWhD0myyO|fc_0fcf561150331aac016a59d45715a481908c5861a74a85c2dd","toolName":"read","startedAt":"2026-07-17T07:05:59.760Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream retirement body"},"id":"41e0b2b6","parentId":"0e1017d7","timestamp":"2026-07-17T07:05:59.760Z"}
{"type":"message","id":"20edaa1a","parentId":"41e0b2b6","timestamp":"2026-07-17T07:05:59.785Z","message":{"role":"toolResult","toolCallId":"call_z8LdxwcdV8YZdMsyWhD0myyO|fc_0fcf561150331aac016a59d45715a481908c5861a74a85c2dd","toolName":"read","content":[{"type":"text","text":"    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n…\n        streams\n…\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\n    /// not yet arrived, or capture gave up bounded).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n…\n    }\n\n[Showing lines 1809-1863 of 2865. Use :1864 to continue]"}],"details":{"truncation":{"content":"            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\r\n            .map(|(id, e)| {\r\n                let log = e.log.lock().unwrap();\r\n                NetStreamInfo {\r\n                    stream_id: *id,\r\n                    conn_id: e.conn_id,\r\n                    remote_id_hex: e.remote_id_hex.clone(),\r\n                    next_seq: log.next_seq,\r\n                    finished: log.finished,\r\n                    initiated_locally: e.initiated_locally,\r\n                    floor_seq: log.floor_seq(),\r\n                }\r\n            })\r\n            .collect()\r\n    }\r\n\r\n    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\r\n    /// serve loop ran to completion — its exchange is over, so no future\r\n    /// dispatcher generation may rediscover and replay it (the control-steal\r\n    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\r\n    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\r\n    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\r\n    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\r\n    /// reply sends when it removed the entry (see the `retired` field note).\r\n    /// Physical teardown stays with the conn-close sweep. Returns whether this\r\n    /// call newly retired the row (idempotent; absent row = false).\r\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\r\n        let Some(entry) = self\r\n            .shared\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .get(&stream_id)\r\n            .map(Arc::clone)\r\n        else {\r\n            return false;\r\n        };\r\n        let newly = !entry\r\n            .retired\r\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\r\n        if newly {\r\n            // A retired exchange's request bytes are dead weight — free the\r\n            // ring; the pinned opener and cursors stay (cheap, bounded).\r\n            entry.log.lock().unwrap().ring.clear();\r\n        }\r\n        newly\r\n    }\r\n\r\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\r\n    /// classification fact, independent of the evictable data ring. Outer\r\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\r\n    /// not yet arrived, or capture gave up bounded).\r\n    // [impl->REQ-STREAM-OPENER-DURABLE]\r\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\r","truncated":true,"truncatedBy":"lines","totalLines":1057,"totalBytes":2520,"outputLines":55,"outputBytes":2520,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n…\n        streams\n…\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\r\n            .map(|(id, e)| {\r\n                let log = e.log.lock().unwrap();\r\n                NetStreamInfo {\r\n                    stream_id: *id,\r\n                    conn_id: e.conn_id,\r\n                    remote_id_hex: e.remote_id_hex.clone(),\r\n                    next_seq: log.next_seq,\r\n                    finished: log.finished,\r\n                    initiated_locally: e.initiated_locally,\r\n                    floor_seq: log.floor_seq(),\r\n                }\r\n            })\r\n            .collect()\r\n    }\r\n\r\n    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\r\n    /// serve loop ran to completion — its exchange is over, so no future\r\n    /// dispatcher generation may rediscover and replay it (the control-steal\r\n    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\r\n    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\r\n    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\r\n    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\r\n    /// reply sends when it removed the entry (see the `retired` field note).\r\n    /// Physical teardown stays with the conn-close sweep. Returns whether this\r\n    /// call newly retired the row (idempotent; absent row = false).\r\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\r\n        let Some(entry) = self\r\n            .shared\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .get(&stream_id)\r\n            .map(Arc::clone)\r\n        else {\r\n            return false;\r\n        };\r\n        let newly = !entry\r\n            .retired\r\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\r\n        if newly {\r\n            // A retired exchange's request bytes are dead weight — free the\r\n            // ring; the pinned opener and cursors stay (cheap, bounded).\r\n            entry.log.lock().unwrap().ring.clear();\r\n        }\r\n        newly\r\n    }\r\n\r\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\r\n    /// classification fact, independent of the evictable data ring. Outer\r\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\r\n    /// not yet arrived, or capture gave up bounded).\r\n    // [impl->REQ-STREAM-OPENER-DURABLE]\r\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\r\n…\n    }","startLine":1805,"lineNumbers":[1805,null,1807,null,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,null,1872]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":2520,"outputLines":55,"outputBytes":2520,"shownRange":{"start":1809,"end":1863},"nextOffset":1864}}},"isError":false,"timestamp":1784271959785}}
{"type":"message","id":"26390c3e","parentId":"20edaa1a","timestamp":"2026-07-17T07:05:59.820Z","message":{"role":"toolResult","toolCallId":"call_oI40riCH9CyuZQvmqR3iTZlY|fc_0fcf561150331aac016a59d457152881908fa13e7e515cf5cf","toolName":"grep","content":[{"type":"text","text":" 19958|CONN_LIFECYCLE: conn=8257 role=brain wall_ms=1784269248117 mono_ms=4005987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19959|CONN_WRITE_POISONED: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252412 mono_ms=4010282 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 19960|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 19961|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 19962|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 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"}],"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":1,"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":1}],"truncated":false,"displayContent":" 19958│CONN_LIFECYCLE: conn=8257 role=brain wall_ms=1784269248117 mono_ms=4005987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19959│CONN_WRITE_POISONED: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252412 mono_ms=4010282 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 19960│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 19961│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 19962│CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784271959820}}
{"type":"message","id":"06cc866c","parentId":"26390c3e","timestamp":"2026-07-17T07:05:59.829Z","message":{"role":"toolResult","toolCallId":"call_hclLOnZGf6Z2rfPsqfns7VCc|fc_0fcf561150331aac016a59d457150c8190814a47e48b771987","toolName":"grep","content":[{"type":"text","text":" 19009|CONN_LIFECYCLE: conn=7861 role=brain wall_ms=1784269083882 mono_ms=3841753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19010|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083882 mono_ms=3841753 event=stream-sub-attach stream=3635 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19011|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19012|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19013|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19018|CONN_LIFECYCLE: conn=7866 role=brain wall_ms=1784269084500 mono_ms=3842370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19019|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084500 mono_ms=3842370 event=stream-sub-attach stream=3636 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19020|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084504 mono_ms=3842374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19021|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19022|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19023|CONN_LIFECYCLE: conn=7865 role=brain wall_ms=1784269084515 mono_ms=3842386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19024|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084515 mono_ms=3842386 event=stream-sub-attach stream=3637 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19025|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19026|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19027|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19031|CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19032|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3639 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19033|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3638 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19034|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19035|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19036|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19050|CONN_LIFECYCLE: conn=7880 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19051|CONN_LIFECYCLE: conn=7879 role=brain stream-subscriber stream=3640 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3640 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19052|CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3642 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19053|CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3641 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19054|CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19055|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19056|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19067|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19068|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=stream-sub-attach stream=3644 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19069|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19070|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19071|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19073|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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19074|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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19075|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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19076|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=1784269090252 mono_ms=3848122 event=stream-sub-attach stream=3648 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19077|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19078|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19081|CONN_LIFECYCLE: conn=7890 role=brain wall_ms=1784269091924 mono_ms=3849795 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19082|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269091925 mono_ms=3849795 event=stream-sub-attach stream=3649 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19083|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19084|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19085|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19090|CONN_LIFECYCLE: conn=7894 role=brain wall_ms=1784269098937 mono_ms=3856808 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19091|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098937 mono_ms=3856808 event=stream-sub-attach stream=3650 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19092|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19093|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19094|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19099|CONN_LIFECYCLE: conn=7899 role=brain wall_ms=1784269099660 mono_ms=3857530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19100|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099660 mono_ms=3857530 event=stream-sub-attach stream=3652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19101|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19102|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19103|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19104|CONN_LIFECYCLE: conn=7898 role=brain wall_ms=1784269099671 mono_ms=3857541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19105|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099671 mono_ms=3857541 event=stream-sub-attach stream=3651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19106|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19107|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19108|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19116|CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19117|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19118|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3655 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19119|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3654 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19120|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19121|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19122|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19147|CONN_LIFECYCLE: conn=7917 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19148|CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3660 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19149|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3657 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19150|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19151|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19152|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19153|CONN_LIFECYCLE: conn=7918 role=brain wall_ms=1784269113596 mono_ms=3871466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19154|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113596 mono_ms=3871466 event=stream-sub-attach stream=3658 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19155|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19156|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19157|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19164|CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19165|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=stream-sub-attach stream=3659 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19166|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19167|CONN_LIFECYCLE: conn=7925 role=brain wall_ms=1784269113690 mono_ms=3871561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19168|CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113690 mono_ms=3871561 event=stream-sub-attach stream=3656 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19169|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113694 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19170|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19171|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19176|CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19177|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=stream-sub-attach stream=3671 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19178|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19179|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19180|CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19184|CONN_LIFECYCLE: conn=7933 role=brain wall_ms=1784269114000 mono_ms=3871870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19185|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114000 mono_ms=3871870 event=stream-sub-attach stream=3672 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19186|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19187|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19188|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19194|CONN_LIFECYCLE: conn=7937 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19195|CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3673 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19196|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3674 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19197|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19198|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19199|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19206|CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19207|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3675 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19208|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3676 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19209|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19210|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19211|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19220|CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19221|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=stream-sub-attach stream=3677 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19222|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19223|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19224|CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19232|CONN_LIFECYCLE: conn=7954 role=brain wall_ms=1784269117611 mono_ms=3875481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19233|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117611 mono_ms=3875481 event=stream-sub-attach stream=3680 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19234|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19235|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19236|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19238|CONN_LIFECYCLE: conn=7956 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19239|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3679 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19240|CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3678 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19241|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19242|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19243|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19251|CONN_LIFECYCLE: conn=7962 role=brain wall_ms=1784269122047 mono_ms=3879917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19252|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122047 mono_ms=3879918 event=stream-sub-attach stream=3681 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19253|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122058 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19254|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122058 mono_ms=3879929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19255|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122059 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19259|CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19260|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=stream-sub-attach stream=3682 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19261|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19262|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19263|CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19267|CONN_LIFECYCLE: conn=7969 role=brain wall_ms=1784269129058 mono_ms=3886928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19268|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129058 mono_ms=3886928 event=stream-sub-attach stream=3688 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19269|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19270|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19271|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19276|CONN_LIFECYCLE: conn=7974 role=brain wall_ms=1784269129780 mono_ms=3887650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19277|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129780 mono_ms=3887650 event=stream-sub-attach stream=3690 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19278|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19279|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19280|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19281|CONN_LIFECYCLE: conn=7973 role=brain wall_ms=1784269129783 mono_ms=3887653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19282|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129783 mono_ms=3887653 event=stream-sub-attach stream=3689 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19283|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19284|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19285|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19287|CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19288|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=stream-sub-attach stream=3691 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19289|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19290|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19291|CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130398 mono_ms=3888269 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19294|CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19295|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888474 event=stream-sub-attach stream=3692 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19296|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19297|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19298|CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19301|CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19302|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130810 mono_ms=3888681 event=stream-sub-attach stream=3693 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19303|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19304|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19305|CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19314|CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19315|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3694 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19316|CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3695 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19317|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3696 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19318|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19319|CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19320|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19336|CONN_LIFECYCLE: conn=8001 role=brain wall_ms=1784269133908 mono_ms=3891778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19337|CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133908 mono_ms=3891778 event=stream-sub-attach stream=3698 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19338|CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19339|CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19340|CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19342|CONN_LIFECYCLE: conn=7999 role=brain wall_ms=1784269133920 mono_ms=3891790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19343|CONN_LIFECYCLE: conn=8000 role=brain stream-subscriber stream=3697 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3697 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19344|CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3699 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19345|CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19346|CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19347|CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19352|CONN_LIFECYCLE: conn=8005 role=brain wall_ms=1784269134833 mono_ms=3892704 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19353|CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=stream-sub-attach stream=3700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19354|CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19355|CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134838 mono_ms=3892708 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19356|CONN_LIFECYCLE: conn=8007 role=brain wall_ms=1784269134838 mono_ms=3892708 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19360|CONN_LIFECYCLE: conn=8009 role=brain wall_ms=1784269137001 mono_ms=3894871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19361|CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137001 mono_ms=3894871 event=stream-sub-attach stream=3701 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19362|CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19363|CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19364|CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19375|CONN_LIFECYCLE: conn=8014 role=brain wall_ms=1784269144116 mono_ms=3901986 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19376|CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144116 mono_ms=3901986 event=stream-sub-attach stream=3702 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19377|CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144118 mono_ms=3901988 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19378|CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19379|CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19381|CONN_LIFECYCLE: conn=8016 role=brain wall_ms=1784269146899 mono_ms=3904769 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19382|CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904769 event=stream-sub-attach stream=3703 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19383|CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19384|CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19385|CONN_LIFECYCLE: conn=8018 role=brain wall_ms=1784269146900 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19390|CONN_LIFECYCLE: conn=8020 role=brain wall_ms=1784269147105 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19391|CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3705 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19392|CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19393|CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3704 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19394|CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19395|CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19396|CONN_LIFECYCLE: conn=8023 role=brain wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19402|CONN_LIFECYCLE: conn=8026 role=brain wall_ms=1784269152164 mono_ms=3910034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19403|CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152164 mono_ms=3910034 event=stream-sub-attach stream=3706 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19404|CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19405|CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19406|CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152289 mono_ms=3910159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19415|CONN_LIFECYCLE: conn=8033 role=brain wall_ms=1784269158976 mono_ms=3916846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19416|CONN_LIFECYCLE: conn=8033 role=brain stream-subscriber stream=3707 wall_ms=1784269158976 mono_ms=3916846 event=stream-sub-attach stream=3707 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19417|CONN_LIFECYCLE: conn=8032 role=brain wall_ms=1784269158978 mono_ms=3916848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19418|CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158978 mono_ms=3916848 event=stream-sub-attach stream=3709 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19419|CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19420|CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19421|CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19427|CONN_LIFECYCLE: conn=8037 role=brain wall_ms=1784269159079 mono_ms=3916949 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19428|CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159079 mono_ms=3916949 event=stream-sub-attach stream=3708 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19429|CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19430|CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19431|CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19434|CONN_LIFECYCLE: conn=8040 role=brain wall_ms=1784269159182 mono_ms=3917053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19435|CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159182 mono_ms=3917053 event=stream-sub-attach stream=3710 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19436|CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19437|CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19438|CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19441|CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19442|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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19443|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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19444|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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19445|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=1784269161531 mono_ms=3919401 event=stream-sub-attach stream=3724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19446|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=1784269162196 mono_ms=3920066 event=stream-sub-attach stream=3725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19447|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19448|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449|CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19454|CONN_LIFECYCLE: conn=8046 role=brain wall_ms=1784269165372 mono_ms=3923243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19455|CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3726 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19456|CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3728 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19457|CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19458|CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165373 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19459|CONN_LIFECYCLE: conn=8049 role=brain wall_ms=1784269165374 mono_ms=3923244 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19460|CONN_LIFECYCLE: conn=8049 role=brain stream-subscriber stream=3730 wall_ms=1784269165374 mono_ms=3923244 event=stream-sub-attach stream=3730 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19461|CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19462|CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19463|CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19475|CONN_LIFECYCLE: conn=8055 role=brain wall_ms=1784269165476 mono_ms=3923346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19476|CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3729 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19477|CONN_LIFECYCLE: conn=8058 role=brain stream-subscriber stream=3731 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3731 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19478|CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19479|CONN_LIFECYCLE: conn=8058 role=brain stream-subscriber stream=3731 wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19480|CONN_LIFECYCLE: conn=8057 role=brain wall_ms=1784269165477 mono_ms=3923347 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19481|CONN_LIFECYCLE: conn=8057 role=brain stream-subscriber stream=3732 wall_ms=1784269165477 mono_ms=3923347 event=stream-sub-attach stream=3732 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19482|CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19483|CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19484|CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19492|CONN_LIFECYCLE: conn=8062 role=brain wall_ms=1784269165579 mono_ms=3923449 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19493|CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165579 mono_ms=3923449 event=stream-sub-attach stream=3727 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19494|CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165579 mono_ms=3923449 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19495|CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165583 mono_ms=3923453 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19496|CONN_LIFECYCLE: conn=8064 role=brain wall_ms=1784269165583 mono_ms=3923454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19500|CONN_LIFECYCLE: conn=8066 role=brain wall_ms=1784269167230 mono_ms=3925100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19501|CONN_LIFECYCLE: conn=8066 role=brain stream-subscriber stream=3733 wall_ms=1784269167230 mono_ms=3925100 event=stream-sub-attach stream=3733 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19502|CONN_LIFECYCLE: conn=8067 role=brain wall_ms=1784269167426 mono_ms=3925297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19503|CONN_LIFECYCLE: conn=8067 role=brain wall_ms=1784269167426 mono_ms=3925297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19504|CONN_LIFECYCLE: conn=8066 role=brain stream-subscriber stream=3733 wall_ms=1784269167445 mono_ms=3925316 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19508|CONN_LIFECYCLE: conn=8069 role=brain wall_ms=1784269169396 mono_ms=3927266 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19509|CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169396 mono_ms=3927266 event=stream-sub-attach stream=3734 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19510|CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169396 mono_ms=3927266 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19511|CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169400 mono_ms=3927270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19512|CONN_LIFECYCLE: conn=8071 role=brain wall_ms=1784269169400 mono_ms=3927270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19526|CONN_LIFECYCLE: conn=8076 role=brain wall_ms=1784269174141 mono_ms=3932011 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19527|CONN_LIFECYCLE: conn=8076 role=brain stream-subscriber stream=3737 wall_ms=1784269174141 mono_ms=3932011 event=stream-sub-attach stream=3737 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19528|CONN_LIFECYCLE: conn=8076 role=brain stream-subscriber stream=3737 wall_ms=1784269174146 mono_ms=3932016 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19529|CONN_LIFECYCLE: conn=8079 role=brain wall_ms=1784269174146 mono_ms=3932016 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19530|CONN_LIFECYCLE: conn=8079 role=brain wall_ms=1784269174146 mono_ms=3932016 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19531|CONN_LIFECYCLE: conn=8078 role=brain wall_ms=1784269174157 mono_ms=3932027 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19532|CONN_LIFECYCLE: conn=8078 role=brain stream-subscriber stream=3736 wall_ms=1784269174157 mono_ms=3932027 event=stream-sub-attach stream=3736 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19533|CONN_LIFECYCLE: conn=8078 role=brain stream-subscriber stream=3736 wall_ms=1784269174160 mono_ms=3932030 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19534|CONN_LIFECYCLE: conn=8080 role=brain wall_ms=1784269174160 mono_ms=3932030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19535|CONN_LIFECYCLE: conn=8080 role=brain wall_ms=1784269174160 mono_ms=3932030 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19536|CONN_LIFECYCLE: conn=8077 role=brain wall_ms=1784269174173 mono_ms=3932043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19537|CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174173 mono_ms=3932043 event=stream-sub-attach stream=3735 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19538|CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174182 mono_ms=3932052 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19539|CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19540|CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n\n[Showing lines 1-340 of 926 (50.0KB limit). Use :341 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":" 19009│CONN_LIFECYCLE: conn=7861 role=brain wall_ms=1784269083882 mono_ms=3841753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19010│CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083882 mono_ms=3841753 event=stream-sub-attach stream=3635 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19011│CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19012│CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19013│CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19018│CONN_LIFECYCLE: conn=7866 role=brain wall_ms=1784269084500 mono_ms=3842370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19019│CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084500 mono_ms=3842370 event=stream-sub-attach stream=3636 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19020│CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084504 mono_ms=3842374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19021│CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19022│CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19023│CONN_LIFECYCLE: conn=7865 role=brain wall_ms=1784269084515 mono_ms=3842386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19024│CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084515 mono_ms=3842386 event=stream-sub-attach stream=3637 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19025│CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19026│CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19027│CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19031│CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19032│CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3639 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19033│CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3638 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19034│CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19035│CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19036│CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19050│CONN_LIFECYCLE: conn=7880 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19051│CONN_LIFECYCLE: conn=7879 role=brain stream-subscriber stream=3640 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3640 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19052│CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3642 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19053│CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3641 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19054│CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19055│CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19056│CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19062│CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19063│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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19065│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066│CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19067│CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19068│CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=stream-sub-attach stream=3644 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19069│CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19070│CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19071│CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19072│CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19073│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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19074│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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19075│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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19076│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=1784269090252 mono_ms=3848122 event=stream-sub-attach stream=3648 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19077│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19078│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079│CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19081│CONN_LIFECYCLE: conn=7890 role=brain wall_ms=1784269091924 mono_ms=3849795 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19082│CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269091925 mono_ms=3849795 event=stream-sub-attach stream=3649 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19083│CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19084│CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19085│CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19090│CONN_LIFECYCLE: conn=7894 role=brain wall_ms=1784269098937 mono_ms=3856808 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19091│CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098937 mono_ms=3856808 event=stream-sub-attach stream=3650 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19092│CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19093│CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19094│CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19099│CONN_LIFECYCLE: conn=7899 role=brain wall_ms=1784269099660 mono_ms=3857530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19100│CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099660 mono_ms=3857530 event=stream-sub-attach stream=3652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19101│CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19102│CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19103│CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19104│CONN_LIFECYCLE: conn=7898 role=brain wall_ms=1784269099671 mono_ms=3857541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19105│CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099671 mono_ms=3857541 event=stream-sub-attach stream=3651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19106│CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19107│CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19108│CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19116│CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19117│CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19118│CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3655 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19119│CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3654 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19120│CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19121│CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19122│CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19147│CONN_LIFECYCLE: conn=7917 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19148│CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3660 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19149│CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3657 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19150│CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19151│CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19152│CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19153│CONN_LIFECYCLE: conn=7918 role=brain wall_ms=1784269113596 mono_ms=3871466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19154│CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113596 mono_ms=3871466 event=stream-sub-attach stream=3658 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19155│CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19156│CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19157│CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19164│CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19165│CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=stream-sub-attach stream=3659 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19166│CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19167│CONN_LIFECYCLE: conn=7925 role=brain wall_ms=1784269113690 mono_ms=3871561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19168│CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113690 mono_ms=3871561 event=stream-sub-attach stream=3656 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19169│CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113694 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19170│CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19171│CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19176│CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19177│CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=stream-sub-attach stream=3671 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19178│CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19179│CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19180│CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19184│CONN_LIFECYCLE: conn=7933 role=brain wall_ms=1784269114000 mono_ms=3871870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19185│CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114000 mono_ms=3871870 event=stream-sub-attach stream=3672 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19186│CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19187│CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19188│CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19194│CONN_LIFECYCLE: conn=7937 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19195│CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3673 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19196│CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3674 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19197│CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19198│CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19199│CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19206│CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19207│CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3675 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19208│CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3676 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19209│CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19210│CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19211│CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19220│CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19221│CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=stream-sub-attach stream=3677 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19222│CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19223│CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19224│CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19232│CONN_LIFECYCLE: conn=7954 role=brain wall_ms=1784269117611 mono_ms=3875481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19233│CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117611 mono_ms=3875481 event=stream-sub-attach stream=3680 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19234│CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19235│CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19236│CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19238│CONN_LIFECYCLE: conn=7956 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19239│CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3679 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19240│CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3678 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19241│CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19242│CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19243│CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19251│CONN_LIFECYCLE: conn=7962 role=brain wall_ms=1784269122047 mono_ms=3879917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19252│CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122047 mono_ms=3879918 event=stream-sub-attach stream=3681 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19253│CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122058 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19254│CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122058 mono_ms=3879929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19255│CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122059 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19259│CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19260│CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=stream-sub-attach stream=3682 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19261│CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19262│CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19263│CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19267│CONN_LIFECYCLE: conn=7969 role=brain wall_ms=1784269129058 mono_ms=3886928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19268│CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129058 mono_ms=3886928 event=stream-sub-attach stream=3688 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19269│CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19270│CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19271│CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19276│CONN_LIFECYCLE: conn=7974 role=brain wall_ms=1784269129780 mono_ms=3887650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19277│CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129780 mono_ms=3887650 event=stream-sub-attach stream=3690 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19278│CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19279│CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19280│CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19281│CONN_LIFECYCLE: conn=7973 role=brain wall_ms=1784269129783 mono_ms=3887653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19282│CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129783 mono_ms=3887653 event=stream-sub-attach stream=3689 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19283│CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19284│CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19285│CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19287│CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19288│CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=stream-sub-attach stream=3691 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19289│CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19290│CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19291│CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130398 mono_ms=3888269 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19294│CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19295│CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888474 event=stream-sub-attach stream=3692 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19296│CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19297│CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19298│CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19301│CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19302│CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130810 mono_ms=3888681 event=stream-sub-attach stream=3693 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19303│CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19304│CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19305│CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19314│CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19315│CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3694 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19316│CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3695 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19317│CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3696 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19318│CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19319│CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19320│CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19336│CONN_LIFECYCLE: conn=8001 role=brain wall_ms=1784269133908 mono_ms=3891778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19337│CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133908 mono_ms=3891778 event=stream-sub-attach stream=3698 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19338│CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19339│CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19340│CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19342│CONN_LIFECYCLE: conn=7999 role=brain wall_ms=1784269133920 mono_ms=3891790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19343│CONN_LIFECYCLE: conn=8000 role=brain stream-subscriber stream=3697 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3697 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19344│CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3699 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19345│CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19346│CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19347│CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19352│CONN_LIFECYCLE: conn=8005 role=brain wall_ms=1784269134833 mono_ms=3892704 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19353│CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=stream-sub-attach stream=3700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19354│CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19355│CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134838 mono_ms=3892708 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19356│CONN_LIFECYCLE: conn=8007 role=brain wall_ms=1784269134838 mono_ms=3892708 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19360│CONN_LIFECYCLE: conn=8009 role=brain wall_ms=1784269137001 mono_ms=3894871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19361│CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137001 mono_ms=3894871 event=stream-sub-attach stream=3701 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19362│CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19363│CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19364│CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19375│CONN_LIFECYCLE: conn=8014 role=brain wall_ms=1784269144116 mono_ms=3901986 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19376│CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144116 mono_ms=3901986 event=stream-sub-attach stream=3702 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19377│CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144118 mono_ms=3901988 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19378│CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19379│CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19381│CONN_LIFECYCLE: conn=8016 role=brain wall_ms=1784269146899 mono_ms=3904769 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19382│CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904769 event=stream-sub-attach stream=3703 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19383│CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19384│CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19385│CONN_LIFECYCLE: conn=8018 role=brain wall_ms=1784269146900 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19390│CONN_LIFECYCLE: conn=8020 role=brain wall_ms=1784269147105 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19391│CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3705 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19392│CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19393│CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3704 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19394│CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19395│CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19396│CONN_LIFECYCLE: conn=8023 role=brain wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19402│CONN_LIFECYCLE: conn=8026 role=brain wall_ms=1784269152164 mono_ms=3910034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19403│CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152164 mono_ms=3910034 event=stream-sub-attach stream=3706 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19404│CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19405│CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19406│CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152289 mono_ms=3910159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19415│CONN_LIFECYCLE: conn=8033 role=brain wall_ms=1784269158976 mono_ms=3916846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19416│CONN_LIFECYCLE: conn=8033 role=brain stream-subscriber stream=3707 wall_ms=1784269158976 mono_ms=3916846 event=stream-sub-attach stream=3707 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19417│CONN_LIFECYCLE: conn=8032 role=brain wall_ms=1784269158978 mono_ms=3916848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19418│CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158978 mono_ms=3916848 event=stream-sub-attach stream=3709 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19419│CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19420│CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19421│CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19427│CONN_LIFECYCLE: conn=8037 role=brain wall_ms=1784269159079 mono_ms=3916949 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19428│CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159079 mono_ms=3916949 event=stream-sub-attach stream=3708 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19429│CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19430│CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19431│CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19434│CONN_LIFECYCLE: conn=8040 role=brain wall_ms=1784269159182 mono_ms=3917053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19435│CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159182 mono_ms=3917053 event=stream-sub-attach stream=3710 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19436│CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19437│CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19438│CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19441│CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19442│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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19443│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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19444│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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19445│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=1784269161531 mono_ms=3919401 event=stream-sub-attach stream=3724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19446│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=1784269162196 mono_ms=3920066 event=stream-sub-attach stream=3725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19447│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19448│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449│CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19454│CONN_LIFECYCLE: conn=8046 role=brain wall_ms=1784269165372 mono_ms=3923243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19455│CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3726 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19456│CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3728 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19457│CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19458│CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165373 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19459│CONN_LIFECYCLE: conn=8049 role=brain wall_ms=1784269165374 mono_ms=3923244 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19460│CONN_LIFECYCLE: conn=8049 role=brain stream-subscriber stream=3730 wall_ms=1784269165374 mono_ms=3923244 event=stream-sub-attach stream=3730 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19461│CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19462│CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19463│CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19475│CONN_LIFECYCLE: conn=8055 role=brain wall_ms=1784269165476 mono_ms=3923346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19476│CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3729 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19477│CONN_LIFECYCLE: conn=8058 role=brain stream-subscriber stream=3731 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3731 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19478│CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19479│CONN_LIFECYCLE: conn=8058 role=brain stream-subscriber stream=3731 wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19480│CONN_LIFECYCLE: conn=8057 role=brain wall_ms=1784269165477 mono_ms=3923347 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19481│CONN_LIFECYCLE: conn=8057 role=brain stream-subscriber stream=3732 wall_ms=1784269165477 mono_ms=3923347 event=stream-sub-attach stream=3732 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19482│CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19483│CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19484│CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19492│CONN_LIFECYCLE: conn=8062 role=brain wall_ms=1784269165579 mono_ms=3923449 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19493│CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165579 mono_ms=3923449 event=stream-sub-attach stream=3727 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19494│CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165579 mono_ms=3923449 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19495│CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165583 mono_ms=3923453 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19496│CONN_LIFECYCLE: conn=8064 role=brain wall_ms=1784269165583 mono_ms=3923454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19500│CONN_LIFECYCLE: conn=8066 role=brain wall_ms=1784269167230 mono_ms=3925100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19501│CONN_LIFECYCLE: conn=8066 role=brain stream-subscriber stream=3733 wall_ms=1784269167230 mono_ms=3925100 event=stream-sub-attach stream=3733 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19502│CONN_LIFECYCLE: conn=8067 role=brain wall_ms=1784269167426 mono_ms=3925297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19503│CONN_LIFECYCLE: conn=8067 role=brain wall_ms=1784269167426 mono_ms=3925297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19504│CONN_LIFECYCLE: conn=8066 role=brain stream-subscriber stream=3733 wall_ms=1784269167445 mono_ms=3925316 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19508│CONN_LIFECYCLE: conn=8069 role=brain wall_ms=1784269169396 mono_ms=3927266 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19509│CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169396 mono_ms=3927266 event=stream-sub-attach stream=3734 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19510│CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169396 mono_ms=3927266 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19511│CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169400 mono_ms=3927270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19512│CONN_LIFECYCLE: conn=8071 role=brain wall_ms=1784269169400 mono_ms=3927270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19526│CONN_LIFECYCLE: conn=8076 role=brain wall_ms=1784269174141 mono_ms=3932011 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19527│CONN_LIFECYCLE: conn=8076 role=brain stream-subscriber stream=3737 wall_ms=1784269174141 mono_ms=3932011 event=stream-sub-attach stream=3737 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19528│CONN_LIFECYCLE: conn=8076 role=brain stream-subscriber stream=3737 wall_ms=1784269174146 mono_ms=3932016 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19529│CONN_LIFECYCLE: conn=8079 role=brain wall_ms=1784269174146 mono_ms=3932016 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19530│CONN_LIFECYCLE: conn=8079 role=brain wall_ms=1784269174146 mono_ms=3932016 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19531│CONN_LIFECYCLE: conn=8078 role=brain wall_ms=1784269174157 mono_ms=3932027 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19532│CONN_LIFECYCLE: conn=8078 role=brain stream-subscriber stream=3736 wall_ms=1784269174157 mono_ms=3932027 event=stream-sub-attach stream=3736 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19533│CONN_LIFECYCLE: conn=8078 role=brain stream-subscriber stream=3736 wall_ms=1784269174160 mono_ms=3932030 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19534│CONN_LIFECYCLE: conn=8080 role=brain wall_ms=1784269174160 mono_ms=3932030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19535│CONN_LIFECYCLE: conn=8080 role=brain wall_ms=1784269174160 mono_ms=3932030 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19536│CONN_LIFECYCLE: conn=8077 role=brain wall_ms=1784269174173 mono_ms=3932043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19537│CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174173 mono_ms=3932043 event=stream-sub-attach stream=3735 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19538│CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174182 mono_ms=3932052 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19539│CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19540│CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19542│CONN_LIFECYCLE: conn=8082 role=brain wall_ms=1784269174655 mono_ms=3932526 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19543│CONN_LIFECYCLE: conn=8083 role=brain stream-subscriber stream=3738 wall_ms=1784269174656 mono_ms=3932526 event=stream-sub-attach stream=3738 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19544│CONN_LIFECYCLE: conn=8083 role=brain stream-subscriber stream=3738 wall_ms=1784269174656 mono_ms=3932526 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19545│CONN_LIFECYCLE: conn=8083 role=brain stream-subscriber stream=3738 wall_ms=1784269174656 mono_ms=3932526 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19546│CONN_LIFECYCLE: conn=8084 role=brain wall_ms=1784269174656 mono_ms=3932526 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19549│CONN_LIFECYCLE: conn=8085 role=brain wall_ms=1784269177233 mono_ms=3935103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19550│CONN_LIFECYCLE: conn=8086 role=brain stream-subscriber stream=3744 wall_ms=1784269177233 mono_ms=3935103 event=stream-sub-attach stream=3744 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19551│CONN_LIFECYCLE: conn=8086 role=brain stream-subscriber stream=3744 wall_ms=1784269177233 mono_ms=3935104 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19552│CONN_LIFECYCLE: conn=8086 role=brain stream-subscriber stream=3744 wall_ms=1784269177239 mono_ms=3935109 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19553│CONN_LIFECYCLE: conn=8087 role=brain wall_ms=1784269177239 mono_ms=3935109 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19562│CONN_LIFECYCLE: conn=8092 role=brain wall_ms=1784269180745 mono_ms=3938615 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19563│CONN_LIFECYCLE: conn=8091 role=brain stream-subscriber stream=3746 wall_ms=1784269180745 mono_ms=3938615 event=stream-sub-attach stream=3746 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19564│CONN_LIFECYCLE: conn=8092 role=brain stream-subscriber stream=3745 wall_ms=1784269180745 mono_ms=3938615 event=stream-sub-attach stream=3745 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19565│CONN_LIFECYCLE: conn=8091 role=brain stream-subscriber stream=3746 wall_ms=1784269180747 mono_ms=3938617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19566│CONN_LIFECYCLE: conn=8093 role=brain wall_ms=1784269180747 mono_ms=3938617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19567│CONN_LIFECYCLE: conn=8093 role=brain wall_ms=1784269180747 mono_ms=3938617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19573│CONN_LIFECYCLE: conn=8096 role=brain wall_ms=1784269182292 mono_ms=3940162 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19574│CONN_LIFECYCLE: conn=8096 role=brain stream-subscriber stream=3747 wall_ms=1784269182292 mono_ms=3940162 event=stream-sub-attach stream=3747 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19575│CONN_LIFECYCLE: conn=8096 role=brain stream-subscriber stream=3747 wall_ms=1784269182391 mono_ms=3940261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19576│CONN_LIFECYCLE: conn=8097 role=brain wall_ms=1784269182391 mono_ms=3940261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19577│CONN_LIFECYCLE: conn=8097 role=brain wall_ms=1784269182391 mono_ms=3940261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19582│CONN_LIFECYCLE: conn=8100 role=brain wall_ms=1784269184252 mono_ms=3942122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19583│CONN_LIFECYCLE: conn=8100 role=brain stream-subscriber stream=3748 wall_ms=1784269184252 mono_ms=3942122 event=stream-sub-attach stream=3748 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19584│CONN_LIFECYCLE: conn=8100 role=brain stream-subscriber stream=3748 wall_ms=1784269184254 mono_ms=3942124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19585│CONN_LIFECYCLE: conn=8101 role=brain wall_ms=1784269184254 mono_ms=3942125 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19586│CONN_LIFECYCLE: conn=8101 role=brain wall_ms=1784269184254 mono_ms=3942125 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19590│CONN_LIFECYCLE: conn=8103 role=brain wall_ms=1784269188169 mono_ms=3946039 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19591│CONN_LIFECYCLE: conn=8104 role=brain stream-subscriber stream=3749 wall_ms=1784269188169 mono_ms=3946039 event=stream-sub-attach stream=3749 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19592│CONN_LIFECYCLE: conn=8104 role=brain stream-subscriber stream=3749 wall_ms=1784269188169 mono_ms=3946039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19593│CONN_LIFECYCLE: conn=8104 role=brain stream-subscriber stream=3749 wall_ms=1784269188169 mono_ms=3946040 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19594│CONN_LIFECYCLE: conn=8105 role=brain wall_ms=1784269188169 mono_ms=3946040 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19597│CONN_LIFECYCLE: conn=8106 role=brain wall_ms=1784269191572 mono_ms=3949442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19598│CONN_LIFECYCLE: conn=8107 role=brain stream-subscriber stream=3750 wall_ms=1784269191572 mono_ms=3949443 event=stream-sub-attach stream=3750 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19599│CONN_LIFECYCLE: conn=8107 role=brain stream-subscriber stream=3750 wall_ms=1784269191572 mono_ms=3949443 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19600│CONN_LIFECYCLE: conn=8107 role=brain stream-subscriber stream=3750 wall_ms=1784269191573 mono_ms=3949443 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19601│CONN_LIFECYCLE: conn=8108 role=brain wall_ms=1784269191573 mono_ms=3949443 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19604│CONN_LIFECYCLE: conn=8109 role=brain wall_ms=1784269191778 mono_ms=3949649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19605│CONN_LIFECYCLE: conn=8110 role=brain stream-subscriber stream=3751 wall_ms=1784269191779 mono_ms=3949649 event=stream-sub-attach stream=3751 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19606│CONN_LIFECYCLE: conn=8110 role=brain stream-subscriber stream=3751 wall_ms=1784269191779 mono_ms=3949649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19607│CONN_LIFECYCLE: conn=8110 role=brain stream-subscriber stream=3751 wall_ms=1784269191779 mono_ms=3949649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19608│CONN_LIFECYCLE: conn=8111 role=brain wall_ms=1784269191779 mono_ms=3949649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19611│CONN_LIFECYCLE: conn=8112 role=brain wall_ms=1784269191986 mono_ms=3949856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19612│CONN_LIFECYCLE: conn=8113 role=brain stream-subscriber stream=3752 wall_ms=1784269191986 mono_ms=3949856 event=stream-sub-attach stream=3752 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19613│CONN_LIFECYCLE: conn=8113 role=brain stream-subscriber stream=3752 wall_ms=1784269191986 mono_ms=3949856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19614│CONN_LIFECYCLE: conn=8113 role=brain stream-subscriber stream=3752 wall_ms=1784269191986 mono_ms=3949857 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19615│CONN_LIFECYCLE: conn=8114 role=brain wall_ms=1784269191987 mono_ms=3949857 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19624│CONN_LIFECYCLE: conn=8118 role=brain wall_ms=1784269195912 mono_ms=3953782 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19625│CONN_LIFECYCLE: conn=8120 role=brain stream-subscriber stream=3753 wall_ms=1784269195912 mono_ms=3953782 event=stream-sub-attach stream=3753 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19626│CONN_LIFECYCLE: conn=8120 role=brain stream-subscriber stream=3753 wall_ms=1784269195912 mono_ms=3953782 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19627│CONN_LIFECYCLE: conn=8121 role=brain wall_ms=1784269195913 mono_ms=3953783 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19628│CONN_LIFECYCLE: conn=8121 role=brain stream-subscriber stream=3756 wall_ms=1784269195913 mono_ms=3953783 event=stream-sub-attach stream=3756 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19629│CONN_LIFECYCLE: conn=8121 role=brain stream-subscriber stream=3756 wall_ms=1784269195915 mono_ms=3953785 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19630│CONN_LIFECYCLE: conn=8119 role=brain wall_ms=1784269195915 mono_ms=3953785 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19631│CONN_LIFECYCLE: conn=8119 role=brain stream-subscriber stream=3754 wall_ms=1784269195915 mono_ms=3953785 event=stream-sub-attach stream=3754 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19632│CONN_LIFECYCLE: conn=8122 role=brain wall_ms=1784269195915 mono_ms=3953785 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19633│CONN_LIFECYCLE: conn=8122 role=brain wall_ms=1784269195915 mono_ms=3953786 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19634│CONN_LIFECYCLE: conn=8119 role=brain stream-subscriber stream=3754 wall_ms=1784269195920 mono_ms=3953790 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19638│CONN_LIFECYCLE: conn=8124 role=brain wall_ms=1784269196016 mono_ms=3953886 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19639│CONN_LIFECYCLE: conn=8125 role=brain stream-subscriber stream=3755 wall_ms=1784269196016 mono_ms=3953886 event=stream-sub-attach stream=3755 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19640│CONN_LIFECYCLE: conn=8125 role=brain stream-subscriber stream=3755 wall_ms=1784269196016 mono_ms=3953886 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19641│CONN_LIFECYCLE: conn=8126 role=brain wall_ms=1784269197049 mono_ms=3954919 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19642│CONN_LIFECYCLE: conn=8126 role=brain wall_ms=1784269197049 mono_ms=3954919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19643│CONN_LIFECYCLE: conn=8127 role=brain stream-subscriber stream=3757 wall_ms=1784269197050 mono_ms=3954920 event=stream-sub-attach stream=3757 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19644│CONN_LIFECYCLE: conn=8127 role=brain stream-subscriber stream=3757 wall_ms=1784269197050 mono_ms=3954920 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19645│CONN_LIFECYCLE: conn=8128 role=brain wall_ms=1784269197685 mono_ms=3955556 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19646│CONN_LIFECYCLE: conn=8128 role=brain wall_ms=1784269197686 mono_ms=3955556 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19667│CONN_LIFECYCLE: conn=8134 role=brain wall_ms=1784269206138 mono_ms=3964008 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19668│CONN_LIFECYCLE: conn=8138 role=brain stream-subscriber stream=3758 wall_ms=1784269206138 mono_ms=3964008 event=stream-sub-attach stream=3758 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19669│CONN_LIFECYCLE: conn=8138 role=brain stream-subscriber stream=3758 wall_ms=1784269206138 mono_ms=3964008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19670│CONN_LIFECYCLE: conn=8137 role=brain wall_ms=1784269206139 mono_ms=3964009 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19671│CONN_LIFECYCLE: conn=8137 role=brain stream-subscriber stream=3764 wall_ms=1784269206139 mono_ms=3964009 event=stream-sub-attach stream=3764 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19672│CONN_LIFECYCLE: conn=8138 role=brain stream-subscriber stream=3758 wall_ms=1784269206143 mono_ms=3964013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19673│CONN_LIFECYCLE: conn=8139 role=brain wall_ms=1784269206143 mono_ms=3964013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19674│CONN_LIFECYCLE: conn=8139 role=brain wall_ms=1784269206143 mono_ms=3964013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19678│CONN_LIFECYCLE: conn=8136 role=brain wall_ms=1784269206153 mono_ms=3964023 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19679│CONN_LIFECYCLE: conn=8136 role=brain stream-subscriber stream=3761 wall_ms=1784269206153 mono_ms=3964024 event=stream-sub-attach stream=3761 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19680│CONN_LIFECYCLE: conn=8136 role=brain stream-subscriber stream=3761 wall_ms=1784269206162 mono_ms=3964033 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19681│CONN_LIFECYCLE: conn=8141 role=brain wall_ms=1784269206163 mono_ms=3964033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19682│CONN_LIFECYCLE: conn=8141 role=brain wall_ms=1784269206163 mono_ms=3964033 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19688│CONN_LIFECYCLE: conn=8144 role=brain wall_ms=1784269206241 mono_ms=3964111 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19689│CONN_LIFECYCLE: conn=8145 role=brain stream-subscriber stream=3765 wall_ms=1784269206241 mono_ms=3964111 event=stream-sub-attach stream=3765 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19690│CONN_LIFECYCLE: conn=8146 role=brain stream-subscriber stream=3759 wall_ms=1784269206241 mono_ms=3964111 event=stream-sub-attach stream=3759 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19691│CONN_LIFECYCLE: conn=8145 role=brain stream-subscriber stream=3765 wall_ms=1784269206241 mono_ms=3964111 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19692│CONN_LIFECYCLE: conn=8146 role=brain stream-subscriber stream=3759 wall_ms=1784269206241 mono_ms=3964111 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19693│CONN_LIFECYCLE: conn=8147 role=brain wall_ms=1784269206242 mono_ms=3964112 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19694│CONN_LIFECYCLE: conn=8147 role=brain stream-subscriber stream=3760 wall_ms=1784269206242 mono_ms=3964112 event=stream-sub-attach stream=3760 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19695│CONN_LIFECYCLE: conn=8146 role=brain stream-subscriber stream=3759 wall_ms=1784269206247 mono_ms=3964117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19696│CONN_LIFECYCLE: conn=8148 role=brain wall_ms=1784269206247 mono_ms=3964117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19697│CONN_LIFECYCLE: conn=8148 role=brain wall_ms=1784269206247 mono_ms=3964117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19708│CONN_LIFECYCLE: conn=8153 role=brain wall_ms=1784269206345 mono_ms=3964215 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19709│CONN_LIFECYCLE: conn=8153 role=brain stream-subscriber stream=3763 wall_ms=1784269206345 mono_ms=3964216 event=stream-sub-attach stream=3763 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19710│CONN_LIFECYCLE: conn=8153 role=brain stream-subscriber stream=3763 wall_ms=1784269206350 mono_ms=3964220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19711│CONN_LIFECYCLE: conn=8155 role=brain wall_ms=1784269206350 mono_ms=3964220 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19712│CONN_LIFECYCLE: conn=8155 role=brain wall_ms=1784269206350 mono_ms=3964220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19713│CONN_LIFECYCLE: conn=8154 role=brain wall_ms=1784269206355 mono_ms=3964226 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19714│CONN_LIFECYCLE: conn=8154 role=brain stream-subscriber stream=3762 wall_ms=1784269206355 mono_ms=3964226 event=stream-sub-attach stream=3762 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19715│CONN_LIFECYCLE: conn=8154 role=brain stream-subscriber stream=3762 wall_ms=1784269206358 mono_ms=3964228 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19716│CONN_LIFECYCLE: conn=8156 role=brain wall_ms=1784269206358 mono_ms=3964228 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19717│CONN_LIFECYCLE: conn=8156 role=brain wall_ms=1784269206358 mono_ms=3964228 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19719│CONN_LIFECYCLE: conn=8157 role=brain wall_ms=1784269207375 mono_ms=3965245 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19720│CONN_LIFECYCLE: conn=8158 role=brain stream-subscriber stream=3776 wall_ms=1784269207375 mono_ms=3965245 event=stream-sub-attach stream=3776 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19721│CONN_LIFECYCLE: conn=8158 role=brain stream-subscriber stream=3776 wall_ms=1784269207375 mono_ms=3965245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19722│CONN_LIFECYCLE: conn=8158 role=brain stream-subscriber stream=3776 wall_ms=1784269207381 mono_ms=3965251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19723│CONN_LIFECYCLE: conn=8159 role=brain wall_ms=1784269207381 mono_ms=3965251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19731│CONN_LIFECYCLE: conn=8163 role=brain wall_ms=1784269210985 mono_ms=3968855 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19732│CONN_LIFECYCLE: conn=8163 role=brain stream-subscriber stream=3778 wall_ms=1784269210985 mono_ms=3968855 event=stream-sub-attach stream=3778 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19733│CONN_LIFECYCLE: conn=8163 role=brain stream-subscriber stream=3778 wall_ms=1784269210987 mono_ms=3968857 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19734│CONN_LIFECYCLE: conn=8165 role=brain wall_ms=1784269210987 mono_ms=3968857 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19735│CONN_LIFECYCLE: conn=8165 role=brain wall_ms=1784269210987 mono_ms=3968857 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19736│CONN_LIFECYCLE: conn=8164 role=brain wall_ms=1784269210991 mono_ms=3968861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19737│CONN_LIFECYCLE: conn=8164 role=brain stream-subscriber stream=3777 wall_ms=1784269210991 mono_ms=3968862 event=stream-sub-attach stream=3777 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19738│CONN_LIFECYCLE: conn=8164 role=brain stream-subscriber stream=3777 wall_ms=1784269210996 mono_ms=3968866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19739│CONN_LIFECYCLE: conn=8166 role=brain wall_ms=1784269210996 mono_ms=3968866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19740│CONN_LIFECYCLE: conn=8166 role=brain wall_ms=1784269210996 mono_ms=3968866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19743│CONN_LIFECYCLE: conn=8168 role=brain wall_ms=1784269212327 mono_ms=3970197 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19744│CONN_LIFECYCLE: conn=8168 role=brain stream-subscriber stream=3779 wall_ms=1784269212327 mono_ms=3970197 event=stream-sub-attach stream=3779 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19745│CONN_LIFECYCLE: conn=8168 role=brain stream-subscriber stream=3779 wall_ms=1784269212350 mono_ms=3970220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19746│CONN_LIFECYCLE: conn=8169 role=brain wall_ms=1784269212350 mono_ms=3970220 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19747│CONN_LIFECYCLE: conn=8169 role=brain wall_ms=1784269212350 mono_ms=3970220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19756│CONN_LIFECYCLE: conn=8174 role=brain wall_ms=1784269214391 mono_ms=3972262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19757│CONN_LIFECYCLE: conn=8174 role=brain stream-subscriber stream=3782 wall_ms=1784269214392 mono_ms=3972262 event=stream-sub-attach stream=3782 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19758│CONN_LIFECYCLE: conn=8174 role=brain stream-subscriber stream=3782 wall_ms=1784269214396 mono_ms=3972266 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19759│CONN_LIFECYCLE: conn=8177 role=brain wall_ms=1784269214396 mono_ms=3972266 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19760│CONN_LIFECYCLE: conn=8177 role=brain wall_ms=1784269214396 mono_ms=3972266 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19762│CONN_LIFECYCLE: conn=8176 role=brain wall_ms=1784269214402 mono_ms=3972272 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19763│CONN_LIFECYCLE: conn=8175 role=brain stream-subscriber stream=3781 wall_ms=1784269214402 mono_ms=3972272 event=stream-sub-attach stream=3781 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19764│CONN_LIFECYCLE: conn=8176 role=brain stream-subscriber stream=3780 wall_ms=1784269214402 mono_ms=3972272 event=stream-sub-attach stream=3780 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19765│CONN_LIFECYCLE: conn=8175 role=brain stream-subscriber stream=3781 wall_ms=1784269214404 mono_ms=3972274 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19766│CONN_LIFECYCLE: conn=8178 role=brain wall_ms=1784269214404 mono_ms=3972274 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19767│CONN_LIFECYCLE: conn=8178 role=brain wall_ms=1784269214404 mono_ms=3972274 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19773│CONN_LIFECYCLE: conn=8181 role=brain wall_ms=1784269214495 mono_ms=3972365 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19774│CONN_LIFECYCLE: conn=8181 role=brain stream-subscriber stream=3783 wall_ms=1784269214495 mono_ms=3972365 event=stream-sub-attach stream=3783 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19775│CONN_LIFECYCLE: conn=8181 role=brain stream-subscriber stream=3783 wall_ms=1784269214497 mono_ms=3972367 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19776│CONN_LIFECYCLE: conn=8182 role=brain wall_ms=1784269214497 mono_ms=3972367 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19777│CONN_LIFECYCLE: conn=8182 role=brain wall_ms=1784269214497 mono_ms=3972368 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19781│CONN_LIFECYCLE: conn=8184 role=brain wall_ms=1784269222903 mono_ms=3980773 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19782│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=1784269223236 mono_ms=3981106 event=stream-sub-attach stream=3789 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19783│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=1784269223435 mono_ms=3981305 event=stream-sub-attach stream=3790 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19784│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=1784269224219 mono_ms=3982089 event=stream-sub-attach stream=3791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19785│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=1784269225124 mono_ms=3982994 event=stream-sub-attach stream=3792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19786│CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19787│CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19788│CONN_LIFECYCLE: conn=8186 role=brain stream-subscriber stream=3793 wall_ms=1784269226467 mono_ms=3984337 event=stream-sub-attach stream=3793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19789│CONN_LIFECYCLE: conn=8186 role=brain stream-subscriber stream=3793 wall_ms=1784269226467 mono_ms=3984337 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19790│CONN_LIFECYCLE: conn=8186 role=brain stream-subscriber stream=3793 wall_ms=1784269226468 mono_ms=3984338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19791│CONN_LIFECYCLE: conn=8187 role=brain wall_ms=1784269226468 mono_ms=3984338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19794│CONN_LIFECYCLE: conn=8188 role=brain wall_ms=1784269226570 mono_ms=3984440 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19795│CONN_LIFECYCLE: conn=8189 role=brain stream-subscriber stream=3794 wall_ms=1784269226570 mono_ms=3984440 event=stream-sub-attach stream=3794 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19796│CONN_LIFECYCLE: conn=8189 role=brain stream-subscriber stream=3794 wall_ms=1784269226570 mono_ms=3984440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19797│CONN_LIFECYCLE: conn=8189 role=brain stream-subscriber stream=3794 wall_ms=1784269226571 mono_ms=3984441 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19798│CONN_LIFECYCLE: conn=8190 role=brain wall_ms=1784269226571 mono_ms=3984441 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19799│CONN_LIFECYCLE: conn=8190 role=brain wall_ms=1784269226571 mono_ms=3984441 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19800│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=1784269226702 mono_ms=3984573 event=stream-sub-attach stream=3795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19801│CONN_LIFECYCLE: conn=8191 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19802│CONN_LIFECYCLE: conn=8193 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19803│CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19806│CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19807│CONN_LIFECYCLE: conn=8194 role=brain stream-subscriber stream=3798 wall_ms=1784269227087 mono_ms=3984957 event=stream-sub-attach stream=3798 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19808│CONN_LIFECYCLE: conn=8194 role=brain stream-subscriber stream=3798 wall_ms=1784269227087 mono_ms=3984957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19809│CONN_LIFECYCLE: conn=8196 role=brain wall_ms=1784269227088 mono_ms=3984958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19810│CONN_LIFECYCLE: conn=8196 role=brain stream-subscriber stream=3799 wall_ms=1784269227088 mono_ms=3984958 event=stream-sub-attach stream=3799 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19811│CONN_LIFECYCLE: conn=8194 role=brain stream-subscriber stream=3798 wall_ms=1784269227092 mono_ms=3984962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19812│CONN_LIFECYCLE: conn=8197 role=brain wall_ms=1784269227092 mono_ms=3984962 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19813│CONN_LIFECYCLE: conn=8197 role=brain wall_ms=1784269227092 mono_ms=3984962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19817│CONN_LIFECYCLE: conn=8195 role=brain wall_ms=1784269227102 mono_ms=3984972 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19818│CONN_LIFECYCLE: conn=8195 role=brain stream-subscriber stream=3797 wall_ms=1784269227102 mono_ms=3984972 event=stream-sub-attach stream=3797 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19819│CONN_LIFECYCLE: conn=8195 role=brain stream-subscriber stream=3797 wall_ms=1784269227107 mono_ms=3984977 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19820│CONN_LIFECYCLE: conn=8199 role=brain wall_ms=1784269227107 mono_ms=3984977 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19821│CONN_LIFECYCLE: conn=8199 role=brain wall_ms=1784269227107 mono_ms=3984977 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19823│CONN_LIFECYCLE: conn=8200 role=brain wall_ms=1784269227190 mono_ms=3985060 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19824│CONN_LIFECYCLE: conn=8201 role=brain stream-subscriber stream=3796 wall_ms=1784269227190 mono_ms=3985060 event=stream-sub-attach stream=3796 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19825│CONN_LIFECYCLE: conn=8201 role=brain stream-subscriber stream=3796 wall_ms=1784269227190 mono_ms=3985060 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19826│CONN_LIFECYCLE: conn=8201 role=brain stream-subscriber stream=3796 wall_ms=1784269227194 mono_ms=3985064 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19827│CONN_LIFECYCLE: conn=8202 role=brain wall_ms=1784269227194 mono_ms=3985064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19831│CONN_LIFECYCLE: conn=8204 role=brain wall_ms=1784269227397 mono_ms=3985267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19832│CONN_LIFECYCLE: conn=8204 role=brain stream-subscriber stream=3800 wall_ms=1784269227397 mono_ms=3985267 event=stream-sub-attach stream=3800 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19833│CONN_LIFECYCLE: conn=8204 role=brain stream-subscriber stream=3800 wall_ms=1784269227405 mono_ms=3985276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19834│CONN_LIFECYCLE: conn=8205 role=brain wall_ms=1784269227406 mono_ms=3985276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19835│CONN_LIFECYCLE: conn=8205 role=brain wall_ms=1784269227406 mono_ms=3985276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19843│CONN_LIFECYCLE: conn=8209 role=brain wall_ms=1784269228429 mono_ms=3986299 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19844│CONN_LIFECYCLE: conn=8210 role=brain stream-subscriber stream=3803 wall_ms=1784269228429 mono_ms=3986299 event=stream-sub-attach stream=3803 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19845│CONN_LIFECYCLE: conn=8212 role=brain stream-subscriber stream=3801 wall_ms=1784269228429 mono_ms=3986299 event=stream-sub-attach stream=3801 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19846│CONN_LIFECYCLE: conn=8211 role=brain stream-subscriber stream=3802 wall_ms=1784269228429 mono_ms=3986299 event=stream-sub-attach stream=3802 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19847│CONN_LIFECYCLE: conn=8210 role=brain stream-subscriber stream=3803 wall_ms=1784269228429 mono_ms=3986299 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19848│CONN_LIFECYCLE: conn=8212 role=brain stream-subscriber stream=3801 wall_ms=1784269228429 mono_ms=3986299 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19849│CONN_LIFECYCLE: conn=8211 role=brain stream-subscriber stream=3802 wall_ms=1784269228429 mono_ms=3986299 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19865│CONN_LIFECYCLE: conn=8219 role=brain wall_ms=1784269229567 mono_ms=3987437 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19866│CONN_LIFECYCLE: conn=8219 role=brain stream-subscriber stream=3806 wall_ms=1784269229567 mono_ms=3987437 event=stream-sub-attach stream=3806 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19867│CONN_LIFECYCLE: conn=8219 role=brain stream-subscriber stream=3806 wall_ms=1784269229569 mono_ms=3987439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19868│CONN_LIFECYCLE: conn=8222 role=brain wall_ms=1784269229569 mono_ms=3987439 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19869│CONN_LIFECYCLE: conn=8222 role=brain wall_ms=1784269229569 mono_ms=3987439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19870│CONN_LIFECYCLE: conn=8220 role=brain wall_ms=1784269229575 mono_ms=3987445 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19871│CONN_LIFECYCLE: conn=8220 role=brain stream-subscriber stream=3807 wall_ms=1784269229575 mono_ms=3987445 event=stream-sub-attach stream=3807 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19872│CONN_LIFECYCLE: conn=8221 role=brain wall_ms=1784269229575 mono_ms=3987445 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19873│CONN_LIFECYCLE: conn=8221 role=brain stream-subscriber stream=3805 wall_ms=1784269229575 mono_ms=3987445 event=stream-sub-attach stream=3805 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19874│CONN_LIFECYCLE: conn=8220 role=brain stream-subscriber stream=3807 wall_ms=1784269229580 mono_ms=3987450 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19875│CONN_LIFECYCLE: conn=8223 role=brain wall_ms=1784269229580 mono_ms=3987450 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19876│CONN_LIFECYCLE: conn=8223 role=brain wall_ms=1784269229580 mono_ms=3987450 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19882│CONN_LIFECYCLE: conn=8226 role=brain wall_ms=1784269229669 mono_ms=3987540 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19883│CONN_LIFECYCLE: conn=8226 role=brain stream-subscriber stream=3804 wall_ms=1784269229670 mono_ms=3987540 event=stream-sub-attach stream=3804 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19884│CONN_LIFECYCLE: conn=8226 role=brain stream-subscriber stream=3804 wall_ms=1784269229672 mono_ms=3987542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19885│CONN_LIFECYCLE: conn=8227 role=brain wall_ms=1784269229672 mono_ms=3987542 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19886│CONN_LIFECYCLE: conn=8227 role=brain wall_ms=1784269229672 mono_ms=3987542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19890│CONN_LIFECYCLE: conn=8228 role=brain wall_ms=1784269230184 mono_ms=3988054 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19891│CONN_LIFECYCLE: conn=8229 role=brain stream-subscriber stream=3808 wall_ms=1784269230184 mono_ms=3988054 event=stream-sub-attach stream=3808 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19892│CONN_LIFECYCLE: conn=8229 role=brain stream-subscriber stream=3808 wall_ms=1784269230184 mono_ms=3988054 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19893│CONN_LIFECYCLE: conn=8229 role=brain stream-subscriber stream=3808 wall_ms=1784269230189 mono_ms=3988059 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19894│CONN_LIFECYCLE: conn=8230 role=brain wall_ms=1784269230189 mono_ms=3988059 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19901│CONN_LIFECYCLE: conn=8232 role=brain wall_ms=1784269235240 mono_ms=3993110 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19902│CONN_LIFECYCLE: conn=8233 role=brain stream-subscriber stream=3809 wall_ms=1784269235240 mono_ms=3993110 event=stream-sub-attach stream=3809 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19903│CONN_LIFECYCLE: conn=8233 role=brain stream-subscriber stream=3809 wall_ms=1784269235240 mono_ms=3993110 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19904│CONN_LIFECYCLE: conn=8233 role=brain stream-subscriber stream=3809 wall_ms=1784269235241 mono_ms=3993111 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19905│CONN_LIFECYCLE: conn=8234 role=brain wall_ms=1784269235241 mono_ms=3993111 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19908│CONN_LIFECYCLE: conn=8235 role=brain wall_ms=1784269237409 mono_ms=3995279 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19909│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269237409 mono_ms=3995279 event=stream-sub-attach stream=3810 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19910│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269237409 mono_ms=3995279 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19911│CONN_LIFECYCLE: conn=8237 role=brain wall_ms=1784269238032 mono_ms=3995902 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19912│CONN_LIFECYCLE: conn=8237 role=brain wall_ms=1784269238032 mono_ms=3995902 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19917│CONN_LIFECYCLE: conn=8241 role=brain wall_ms=1784269242158 mono_ms=4000028 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19918│CONN_LIFECYCLE: conn=8241 role=brain stream-subscriber stream=3811 wall_ms=1784269242158 mono_ms=4000028 event=stream-sub-attach stream=3811 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19919│CONN_LIFECYCLE: conn=8240 role=brain wall_ms=1784269242160 mono_ms=4000030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19920│CONN_LIFECYCLE: conn=8240 role=brain stream-subscriber stream=3812 wall_ms=1784269242160 mono_ms=4000030 event=stream-sub-attach stream=3812 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19921│CONN_LIFECYCLE: conn=8240 role=brain stream-subscriber stream=3812 wall_ms=1784269242161 mono_ms=4000031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19922│CONN_LIFECYCLE: conn=8242 role=brain wall_ms=1784269242161 mono_ms=4000032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19923│CONN_LIFECYCLE: conn=8242 role=brain wall_ms=1784269242162 mono_ms=4000032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19929│CONN_LIFECYCLE: conn=8245 role=brain wall_ms=1784269242468 mono_ms=4000338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19930│CONN_LIFECYCLE: conn=8245 role=brain stream-subscriber stream=3813 wall_ms=1784269242468 mono_ms=4000338 event=stream-sub-attach stream=3813 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19931│CONN_LIFECYCLE: conn=8245 role=brain stream-subscriber stream=3813 wall_ms=1784269242477 mono_ms=4000347 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19932│CONN_LIFECYCLE: conn=8246 role=brain wall_ms=1784269242478 mono_ms=4000348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19933│CONN_LIFECYCLE: conn=8246 role=brain wall_ms=1784269242478 mono_ms=4000348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19940│CONN_LIFECYCLE: conn=8251 role=brain wall_ms=1784269244741 mono_ms=4002611 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19941│CONN_LIFECYCLE: conn=8251 role=brain stream-subscriber stream=3814 wall_ms=1784269244741 mono_ms=4002611 event=stream-sub-attach stream=3814 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19942│CONN_LIFECYCLE: conn=8250 role=brain wall_ms=1784269244746 mono_ms=4002616 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19943│CONN_LIFECYCLE: conn=8250 role=brain stream-subscriber stream=3816 wall_ms=1784269244746 mono_ms=4002616 event=stream-sub-attach stream=3816 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19944│CONN_LIFECYCLE: conn=8251 role=brain stream-subscriber stream=3814 wall_ms=1784269244751 mono_ms=4002621 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19945│CONN_LIFECYCLE: conn=8252 role=brain wall_ms=1784269244751 mono_ms=4002621 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19946│CONN_LIFECYCLE: conn=8252 role=brain wall_ms=1784269244751 mono_ms=4002621 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19952│CONN_LIFECYCLE: conn=8255 role=brain wall_ms=1784269244844 mono_ms=4002714 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19953│CONN_LIFECYCLE: conn=8255 role=brain stream-subscriber stream=3815 wall_ms=1784269244844 mono_ms=4002714 event=stream-sub-attach stream=3815 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19954│CONN_LIFECYCLE: conn=8255 role=brain stream-subscriber stream=3815 wall_ms=1784269244847 mono_ms=4002717 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19955│CONN_LIFECYCLE: conn=8256 role=brain wall_ms=1784269244847 mono_ms=4002717 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19956│CONN_LIFECYCLE: conn=8256 role=brain wall_ms=1784269244847 mono_ms=4002717 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\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 19969│CONN_LIFECYCLE: conn=8260 role=brain stream-subscriber stream=3827 wall_ms=1784269253943 mono_ms=4011813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19970│CONN_LIFECYCLE: conn=8260 role=brain stream-subscriber stream=3827 wall_ms=1784269253943 mono_ms=4011813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19971│CONN_LIFECYCLE: conn=8261 role=brain wall_ms=1784269253943 mono_ms=4011813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19974│CONN_LIFECYCLE: conn=8262 role=brain wall_ms=1784269254252 mono_ms=4012122 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19975│CONN_LIFECYCLE: conn=8263 role=brain stream-subscriber stream=3828 wall_ms=1784269254252 mono_ms=4012122 event=stream-sub-attach stream=3828 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19976│CONN_LIFECYCLE: conn=8263 role=brain stream-subscriber stream=3828 wall_ms=1784269254252 mono_ms=4012122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19977│CONN_LIFECYCLE: conn=8263 role=brain stream-subscriber stream=3828 wall_ms=1784269254253 mono_ms=4012123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19978│CONN_LIFECYCLE: conn=8264 role=brain wall_ms=1784269254253 mono_ms=4012123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19981│CONN_LIFECYCLE: conn=8265 role=brain wall_ms=1784269254355 mono_ms=4012225 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19982│CONN_LIFECYCLE: conn=8266 role=brain stream-subscriber stream=3810 wall_ms=1784269254355 mono_ms=4012225 event=stream-sub-attach stream=3810 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19983│CONN_LIFECYCLE: conn=8266 role=brain stream-subscriber stream=3810 wall_ms=1784269254355 mono_ms=4012225 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19984│CONN_LIFECYCLE: conn=8266 role=brain stream-subscriber stream=3810 wall_ms=1784269254361 mono_ms=4012231 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19985│CONN_LIFECYCLE: conn=8267 role=brain wall_ms=1784269254361 mono_ms=4012231 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19988│CONN_LIFECYCLE: conn=8268 role=brain wall_ms=1784269254458 mono_ms=4012328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19989│CONN_LIFECYCLE: conn=8269 role=brain stream-subscriber stream=3829 wall_ms=1784269254458 mono_ms=4012328 event=stream-sub-attach stream=3829 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19990│CONN_LIFECYCLE: conn=8269 role=brain stream-subscriber stream=3829 wall_ms=1784269254458 mono_ms=4012328 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19991│CONN_LIFECYCLE: conn=8269 role=brain stream-subscriber stream=3829 wall_ms=1784269254458 mono_ms=4012328 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19992│CONN_LIFECYCLE: conn=8270 role=brain wall_ms=1784269254458 mono_ms=4012328 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19996│CONN_LIFECYCLE: conn=8272 role=brain wall_ms=1784269254665 mono_ms=4012535 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19997│CONN_LIFECYCLE: conn=8272 role=brain stream-subscriber stream=3830 wall_ms=1784269254665 mono_ms=4012535 event=stream-sub-attach stream=3830 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19998│CONN_LIFECYCLE: conn=8272 role=brain stream-subscriber stream=3830 wall_ms=1784269254667 mono_ms=4012537 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19999│CONN_LIFECYCLE: conn=8273 role=brain wall_ms=1784269254667 mono_ms=4012537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20000│CONN_LIFECYCLE: conn=8273 role=brain wall_ms=1784269254667 mono_ms=4012537 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20002│CONN_LIFECYCLE: conn=8274 role=brain wall_ms=1784269254767 mono_ms=4012637 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20003│CONN_LIFECYCLE: conn=8275 role=brain stream-subscriber stream=3831 wall_ms=1784269254768 mono_ms=4012638 event=stream-sub-attach stream=3831 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20004│CONN_LIFECYCLE: conn=8275 role=brain stream-subscriber stream=3831 wall_ms=1784269254768 mono_ms=4012638 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20005│CONN_LIFECYCLE: conn=8275 role=brain stream-subscriber stream=3831 wall_ms=1784269254768 mono_ms=4012638 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20006│CONN_LIFECYCLE: conn=8276 role=brain wall_ms=1784269254768 mono_ms=4012638 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20013│CONN_LIFECYCLE: conn=8279 role=brain wall_ms=1784269257246 mono_ms=4015116 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20014│CONN_LIFECYCLE: conn=8281 role=brain stream-subscriber stream=3834 wall_ms=1784269257247 mono_ms=4015117 event=stream-sub-attach stream=3834 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20015│CONN_LIFECYCLE: conn=8281 role=brain stream-subscriber stream=3834 wall_ms=1784269257247 mono_ms=4015117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20016│CONN_LIFECYCLE: conn=8280 role=brain wall_ms=1784269257248 mono_ms=4015118 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20017│CONN_LIFECYCLE: conn=8280 role=brain stream-subscriber stream=3835 wall_ms=1784269257248 mono_ms=4015118 event=stream-sub-attach stream=3835 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20018│CONN_LIFECYCLE: conn=8281 role=brain stream-subscriber stream=3834 wall_ms=1784269257252 mono_ms=4015122 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20019│CONN_LIFECYCLE: conn=8283 role=brain wall_ms=1784269257252 mono_ms=4015122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20020│CONN_LIFECYCLE: conn=8283 role=brain wall_ms=1784269257252 mono_ms=4015122 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20024│CONN_LIFECYCLE: conn=8282 role=brain wall_ms=1784269257260 mono_ms=4015130 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20025│CONN_LIFECYCLE: conn=8282 role=brain stream-subscriber stream=3833 wall_ms=1784269257260 mono_ms=4015130 event=stream-sub-attach stream=3833 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20026│CONN_LIFECYCLE: conn=8282 role=brain stream-subscriber stream=3833 wall_ms=1784269257266 mono_ms=4015136 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20027│CONN_LIFECYCLE: conn=8285 role=brain wall_ms=1784269257266 mono_ms=4015136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20028│CONN_LIFECYCLE: conn=8285 role=brain wall_ms=1784269257266 mono_ms=4015136 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20030│CONN_LIFECYCLE: conn=8286 role=brain wall_ms=1784269257350 mono_ms=4015220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20031│CONN_LIFECYCLE: conn=8287 role=brain stream-subscriber stream=3832 wall_ms=1784269257351 mono_ms=4015221 event=stream-sub-attach stream=3832 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20032│CONN_LIFECYCLE: conn=8287 role=brain stream-subscriber stream=3832 wall_ms=1784269257351 mono_ms=4015221 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20033│CONN_LIFECYCLE: conn=8287 role=brain stream-subscriber stream=3832 wall_ms=1784269257355 mono_ms=4015225 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20034│CONN_LIFECYCLE: conn=8288 role=brain wall_ms=1784269257355 mono_ms=4015225 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20038│CONN_LIFECYCLE: conn=8290 role=brain wall_ms=1784269257455 mono_ms=4015325 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20039│CONN_LIFECYCLE: conn=8290 role=brain stream-subscriber stream=3836 wall_ms=1784269257455 mono_ms=4015325 event=stream-sub-attach stream=3836 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20040│CONN_LIFECYCLE: conn=8290 role=brain stream-subscriber stream=3836 wall_ms=1784269257464 mono_ms=4015334 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20041│CONN_LIFECYCLE: conn=8291 role=brain wall_ms=1784269257464 mono_ms=4015334 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20042│CONN_LIFECYCLE: conn=8291 role=brain wall_ms=1784269257464 mono_ms=4015334 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20050│CONN_LIFECYCLE: conn=8295 role=brain wall_ms=1784269259835 mono_ms=4017705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20051│CONN_LIFECYCLE: conn=8296 role=brain stream-subscriber stream=3839 wall_ms=1784269259835 mono_ms=4017705 event=stream-sub-attach stream=3839 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20052│CONN_LIFECYCLE: conn=8298 role=brain stream-subscriber stream=3837 wall_ms=1784269259835 mono_ms=4017705 event=stream-sub-attach stream=3837 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20053│CONN_LIFECYCLE: conn=8296 role=brain stream-subscriber stream=3839 wall_ms=1784269259835 mono_ms=4017705 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20054│CONN_LIFECYCLE: conn=8298 role=brain stream-subscriber stream=3837 wall_ms=1784269259835 mono_ms=4017705 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20055│CONN_LIFECYCLE: conn=8297 role=brain wall_ms=1784269259836 mono_ms=4017706 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20056│CONN_LIFECYCLE: conn=8297 role=brain stream-subscriber stream=3840 wall_ms=1784269259837 mono_ms=4017706 event=stream-sub-attach stream=3840 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20057│CONN_LIFECYCLE: conn=8296 role=brain stream-subscriber stream=3839 wall_ms=1784269259840 mono_ms=4017710 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20058│CONN_LIFECYCLE: conn=8299 role=brain wall_ms=1784269259840 mono_ms=4017710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20059│CONN_LIFECYCLE: conn=8299 role=brain wall_ms=1784269259840 mono_ms=4017710 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20067│CONN_LIFECYCLE: conn=8302 role=brain wall_ms=1784269259939 mono_ms=4017809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20068│CONN_LIFECYCLE: conn=8303 role=brain stream-subscriber stream=3838 wall_ms=1784269259939 mono_ms=4017809 event=stream-sub-attach stream=3838 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20069│CONN_LIFECYCLE: conn=8303 role=brain stream-subscriber stream=3838 wall_ms=1784269259939 mono_ms=4017809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20070│CONN_LIFECYCLE: conn=8303 role=brain stream-subscriber stream=3838 wall_ms=1784269259943 mono_ms=4017813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20071│CONN_LIFECYCLE: conn=8304 role=brain wall_ms=1784269259943 mono_ms=4017813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20078│CONN_LIFECYCLE: conn=8305 role=brain wall_ms=1784269260559 mono_ms=4018429 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20079│CONN_LIFECYCLE: conn=8306 role=brain stream-subscriber stream=3841 wall_ms=1784269260559 mono_ms=4018429 event=stream-sub-attach stream=3841 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20080│CONN_LIFECYCLE: conn=8306 role=brain stream-subscriber stream=3841 wall_ms=1784269260559 mono_ms=4018429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20081│CONN_LIFECYCLE: conn=8306 role=brain stream-subscriber stream=3841 wall_ms=1784269260563 mono_ms=4018433 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20082│CONN_LIFECYCLE: conn=8307 role=brain wall_ms=1784269260563 mono_ms=4018433 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20087│CONN_LIFECYCLE: conn=8309 role=brain wall_ms=1784269267472 mono_ms=4025342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20088│CONN_LIFECYCLE: conn=8310 role=brain stream-subscriber stream=3842 wall_ms=1784269267472 mono_ms=4025342 event=stream-sub-attach stream=3842 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20089│CONN_LIFECYCLE: conn=8310 role=brain stream-subscriber stream=3842 wall_ms=1784269267472 mono_ms=4025342 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20090│CONN_LIFECYCLE: conn=8310 role=brain stream-subscriber stream=3842 wall_ms=1784269267480 mono_ms=4025350 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20091│CONN_LIFECYCLE: conn=8311 role=brain wall_ms=1784269267480 mono_ms=4025350 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20097│CONN_LIFECYCLE: conn=8314 role=brain wall_ms=1784269269846 mono_ms=4027716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20098│CONN_LIFECYCLE: conn=8314 role=brain stream-subscriber stream=3848 wall_ms=1784269269847 mono_ms=4027717 event=stream-sub-attach stream=3848 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20099│CONN_LIFECYCLE: conn=8314 role=brain stream-subscriber stream=3848 wall_ms=1784269269849 mono_ms=4027719 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20100│CONN_LIFECYCLE: conn=8315 role=brain wall_ms=1784269269849 mono_ms=4027719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20101│CONN_LIFECYCLE: conn=8315 role=brain wall_ms=1784269269849 mono_ms=4027719 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20106│CONN_LIFECYCLE: conn=8319 role=brain wall_ms=1784269272326 mono_ms=4030196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20107│CONN_LIFECYCLE: conn=8319 role=brain stream-subscriber stream=3849 wall_ms=1784269272326 mono_ms=4030196 event=stream-sub-attach stream=3849 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20108│CONN_LIFECYCLE: conn=8319 role=brain stream-subscriber stream=3849 wall_ms=1784269272330 mono_ms=4030200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20109│CONN_LIFECYCLE: conn=8320 role=brain wall_ms=1784269272330 mono_ms=4030200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20110│CONN_LIFECYCLE: conn=8320 role=brain wall_ms=1784269272330 mono_ms=4030200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20111│CONN_LIFECYCLE: conn=8318 role=brain wall_ms=1784269272340 mono_ms=4030210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20112│CONN_LIFECYCLE: conn=8318 role=brain stream-subscriber stream=3850 wall_ms=1784269272340 mono_ms=4030210 event=stream-sub-attach stream=3850 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20113│CONN_LIFECYCLE: conn=8318 role=brain stream-subscriber stream=3850 wall_ms=1784269272342 mono_ms=4030212 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20114│CONN_LIFECYCLE: conn=8321 role=brain wall_ms=1784269272342 mono_ms=4030212 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20115│CONN_LIFECYCLE: conn=8321 role=brain wall_ms=1784269272342 mono_ms=4030212 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20118│CONN_LIFECYCLE: conn=8323 role=brain wall_ms=1784269272532 mono_ms=4030402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20119│CONN_LIFECYCLE: conn=8323 role=brain stream-subscriber stream=3851 wall_ms=1784269272532 mono_ms=4030402 event=stream-sub-attach stream=3851 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20120│CONN_LIFECYCLE: conn=8323 role=brain stream-subscriber stream=3851 wall_ms=1784269272544 mono_ms=4030414 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20121│CONN_LIFECYCLE: conn=8324 role=brain wall_ms=1784269272544 mono_ms=4030414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20122│CONN_LIFECYCLE: conn=8324 role=brain wall_ms=1784269272544 mono_ms=4030414 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20131│CONN_LIFECYCLE: conn=8329 role=brain wall_ms=1784269284813 mono_ms=4042683 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20132│CONN_LIFECYCLE: conn=8329 role=brain stream-subscriber stream=3852 wall_ms=1784269284813 mono_ms=4042683 event=stream-sub-attach stream=3852 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20133│CONN_LIFECYCLE: conn=8329 role=brain stream-subscriber stream=3852 wall_ms=1784269284820 mono_ms=4042690 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20134│CONN_LIFECYCLE: conn=8330 role=brain wall_ms=1784269284820 mono_ms=4042690 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20135│CONN_LIFECYCLE: conn=8330 role=brain wall_ms=1784269284820 mono_ms=4042690 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20142│CONN_LIFECYCLE: conn=8336 role=brain wall_ms=1784269285123 mono_ms=4042993 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20143│CONN_LIFECYCLE: conn=8336 role=brain stream-subscriber stream=3854 wall_ms=1784269285123 mono_ms=4042993 event=stream-sub-attach stream=3854 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20144│CONN_LIFECYCLE: conn=8336 role=brain stream-subscriber stream=3854 wall_ms=1784269285125 mono_ms=4042995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20145│CONN_LIFECYCLE: conn=8337 role=brain wall_ms=1784269285125 mono_ms=4042995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20146│CONN_LIFECYCLE: conn=8337 role=brain wall_ms=1784269285126 mono_ms=4042995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20147│CONN_LIFECYCLE: conn=8334 role=brain wall_ms=1784269285128 mono_ms=4042998 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20148│CONN_LIFECYCLE: conn=8334 role=brain stream-subscriber stream=3855 wall_ms=1784269285128 mono_ms=4042998 event=stream-sub-attach stream=3855 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20149│CONN_LIFECYCLE: conn=8334 role=brain stream-subscriber stream=3855 wall_ms=1784269285133 mono_ms=4043003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20150│CONN_LIFECYCLE: conn=8338 role=brain wall_ms=1784269285133 mono_ms=4043003 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20151│CONN_LIFECYCLE: conn=8338 role=brain wall_ms=1784269285133 mono_ms=4043003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20152│CONN_LIFECYCLE: conn=8335 role=brain wall_ms=1784269285143 mono_ms=4043013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20153│CONN_LIFECYCLE: conn=8335 role=brain stream-subscriber stream=3853 wall_ms=1784269285143 mono_ms=4043013 event=stream-sub-attach stream=3853 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20154│CONN_LIFECYCLE: conn=8335 role=brain stream-subscriber stream=3853 wall_ms=1784269285153 mono_ms=4043022 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20155│CONN_LIFECYCLE: conn=8339 role=brain wall_ms=1784269285153 mono_ms=4043023 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20156│CONN_LIFECYCLE: conn=8339 role=brain wall_ms=1784269285153 mono_ms=4043023 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20159│CONN_LIFECYCLE: conn=8341 role=brain wall_ms=1784269287500 mono_ms=4045370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20160│CONN_LIFECYCLE: conn=8341 role=brain stream-subscriber stream=3856 wall_ms=1784269287500 mono_ms=4045370 event=stream-sub-attach stream=3856 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20161│CONN_LIFECYCLE: conn=8341 role=brain stream-subscriber stream=3856 wall_ms=1784269287522 mono_ms=4045392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20162│CONN_LIFECYCLE: conn=8342 role=brain wall_ms=1784269287522 mono_ms=4045392 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20163│CONN_LIFECYCLE: conn=8342 role=brain wall_ms=1784269287522 mono_ms=4045392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20165│CONN_LIFECYCLE: conn=8343 role=brain wall_ms=1784269287911 mono_ms=4045781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20166│CONN_LIFECYCLE: conn=8344 role=brain stream-subscriber stream=3857 wall_ms=1784269287912 mono_ms=4045782 event=stream-sub-attach stream=3857 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20167│CONN_LIFECYCLE: conn=8344 role=brain stream-subscriber stream=3857 wall_ms=1784269287912 mono_ms=4045782 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20168│CONN_LIFECYCLE: conn=8344 role=brain stream-subscriber stream=3857 wall_ms=1784269287912 mono_ms=4045782 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20169│CONN_LIFECYCLE: conn=8345 role=brain wall_ms=1784269287912 mono_ms=4045782 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20172│CONN_LIFECYCLE: conn=8346 role=brain wall_ms=1784269288118 mono_ms=4045988 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20173│CONN_LIFECYCLE: conn=8347 role=brain stream-subscriber stream=3858 wall_ms=1784269288118 mono_ms=4045988 event=stream-sub-attach stream=3858 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20174│CONN_LIFECYCLE: conn=8347 role=brain stream-subscriber stream=3858 wall_ms=1784269288118 mono_ms=4045988 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20175│CONN_LIFECYCLE: conn=8347 role=brain stream-subscriber stream=3858 wall_ms=1784269288119 mono_ms=4045989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20176│CONN_LIFECYCLE: conn=8348 role=brain wall_ms=1784269288119 mono_ms=4045989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20185│CONN_LIFECYCLE: conn=8350 role=brain wall_ms=1784269290911 mono_ms=4048781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20186│CONN_LIFECYCLE: conn=8351 role=brain stream-subscriber stream=3859 wall_ms=1784269290911 mono_ms=4048781 event=stream-sub-attach stream=3859 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20187│CONN_LIFECYCLE: conn=8351 role=brain stream-subscriber stream=3859 wall_ms=1784269290911 mono_ms=4048781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20188│CONN_LIFECYCLE: conn=8352 role=brain wall_ms=1784269291221 mono_ms=4049091 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20189│CONN_LIFECYCLE: conn=8353 role=brain wall_ms=1784269291221 mono_ms=4049091 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20191│CONN_LIFECYCLE: conn=8352 role=brain wall_ms=1784269291221 mono_ms=4049091 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20192│CONN_LIFECYCLE: conn=8354 role=brain stream-subscriber stream=3860 wall_ms=1784269291221 mono_ms=4049091 event=stream-sub-attach stream=3860 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20193│CONN_LIFECYCLE: conn=8355 role=brain stream-subscriber stream=3862 wall_ms=1784269291221 mono_ms=4049091 event=stream-sub-attach stream=3862 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20194│CONN_LIFECYCLE: conn=8354 role=brain stream-subscriber stream=3860 wall_ms=1784269291221 mono_ms=4049091 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20195│CONN_LIFECYCLE: conn=8355 role=brain stream-subscriber stream=3862 wall_ms=1784269291221 mono_ms=4049091 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20196│CONN_LIFECYCLE: conn=8356 role=brain wall_ms=1784269293596 mono_ms=4051466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20214│CONN_LIFECYCLE: conn=8363 role=brain wall_ms=1784269299487 mono_ms=4057357 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20215│CONN_LIFECYCLE: conn=8364 role=brain stream-subscriber stream=3865 wall_ms=1784269299487 mono_ms=4057357 event=stream-sub-attach stream=3865 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20216│CONN_LIFECYCLE: conn=8365 role=brain stream-subscriber stream=3861 wall_ms=1784269299487 mono_ms=4057357 event=stream-sub-attach stream=3861 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20217│CONN_LIFECYCLE: conn=8366 role=brain stream-subscriber stream=3867 wall_ms=1784269299488 mono_ms=4057357 event=stream-sub-attach stream=3867 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20218│CONN_LIFECYCLE: conn=8365 role=brain stream-subscriber stream=3861 wall_ms=1784269299488 mono_ms=4057357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20219│CONN_LIFECYCLE: conn=8364 role=brain stream-subscriber stream=3865 wall_ms=1784269299488 mono_ms=4057357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20220│CONN_LIFECYCLE: conn=8366 role=brain stream-subscriber stream=3867 wall_ms=1784269299488 mono_ms=4057358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20229│CONN_LIFECYCLE: conn=8369 role=brain wall_ms=1784269299500 mono_ms=4057370 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20230│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=1784269299518 mono_ms=4057388 event=stream-sub-attach stream=3883 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20231│CONN_LIFECYCLE: conn=8370 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20232│CONN_LIFECYCLE: conn=8372 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20233│CONN_LIFECYCLE: conn=8371 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20236│CONN_LIFECYCLE: conn=8371 role=brain wall_ms=1784269299591 mono_ms=4057461 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20237│CONN_LIFECYCLE: conn=8373 role=brain stream-subscriber stream=3863 wall_ms=1784269299591 mono_ms=4057461 event=stream-sub-attach stream=3863 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20238│CONN_LIFECYCLE: conn=8373 role=brain stream-subscriber stream=3863 wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20239│CONN_LIFECYCLE: conn=8374 role=brain stream-subscriber stream=3864 wall_ms=1784269299591 mono_ms=4057461 event=stream-sub-attach stream=3864 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20240│CONN_LIFECYCLE: conn=8374 role=brain stream-subscriber stream=3864 wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20241│CONN_LIFECYCLE: conn=8374 role=brain stream-subscriber stream=3864 wall_ms=1784269299592 mono_ms=4057462 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20242│CONN_LIFECYCLE: conn=8376 role=brain wall_ms=1784269299592 mono_ms=4057462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20244│CONN_LIFECYCLE: conn=8375 role=brain wall_ms=1784269299592 mono_ms=4057462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20245│CONN_LIFECYCLE: conn=8375 role=brain stream-subscriber stream=3866 wall_ms=1784269299592 mono_ms=4057462 event=stream-sub-attach stream=3866 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20246│CONN_LIFECYCLE: conn=8373 role=brain stream-subscriber stream=3863 wall_ms=1784269299598 mono_ms=4057468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20247│CONN_LIFECYCLE: conn=8377 role=brain wall_ms=1784269299598 mono_ms=4057468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20248│CONN_LIFECYCLE: conn=8377 role=brain wall_ms=1784269299598 mono_ms=4057468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20254│CONN_LIFECYCLE: conn=8380 role=brain wall_ms=1784269299695 mono_ms=4057565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20255│CONN_LIFECYCLE: conn=8380 role=brain stream-subscriber stream=3868 wall_ms=1784269299695 mono_ms=4057565 event=stream-sub-attach stream=3868 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20256│CONN_LIFECYCLE: conn=8380 role=brain stream-subscriber stream=3868 wall_ms=1784269299697 mono_ms=4057567 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20257│CONN_LIFECYCLE: conn=8381 role=brain wall_ms=1784269299697 mono_ms=4057567 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20258│CONN_LIFECYCLE: conn=8381 role=brain wall_ms=1784269299697 mono_ms=4057567 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20261│CONN_LIFECYCLE: conn=8383 role=brain wall_ms=1784269299902 mono_ms=4057772 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20262│CONN_LIFECYCLE: conn=8383 role=brain stream-subscriber stream=3884 wall_ms=1784269299903 mono_ms=4057772 event=stream-sub-attach stream=3884 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20263│CONN_LIFECYCLE: conn=8383 role=brain stream-subscriber stream=3884 wall_ms=1784269299905 mono_ms=4057775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20264│CONN_LIFECYCLE: conn=8384 role=brain wall_ms=1784269299905 mono_ms=4057775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20265│CONN_LIFECYCLE: conn=8384 role=brain wall_ms=1784269299905 mono_ms=4057775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20272│CONN_LIFECYCLE: conn=8388 role=brain wall_ms=1784269300110 mono_ms=4057979 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20273│CONN_LIFECYCLE: conn=8388 role=brain stream-subscriber stream=3887 wall_ms=1784269300110 mono_ms=4057980 event=stream-sub-attach stream=3887 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20274│CONN_LIFECYCLE: conn=8388 role=brain stream-subscriber stream=3887 wall_ms=1784269300114 mono_ms=4057984 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20275│CONN_LIFECYCLE: conn=8391 role=brain wall_ms=1784269300115 mono_ms=4057984 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20276│CONN_LIFECYCLE: conn=8391 role=brain wall_ms=1784269300115 mono_ms=4057985 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20277│CONN_LIFECYCLE: conn=8389 role=brain wall_ms=1784269300121 mono_ms=4057991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20278│CONN_LIFECYCLE: conn=8389 role=brain stream-subscriber stream=3886 wall_ms=1784269300122 mono_ms=4057991 event=stream-sub-attach stream=3886 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20279│CONN_LIFECYCLE: conn=8390 role=brain wall_ms=1784269300122 mono_ms=4057991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20280│CONN_LIFECYCLE: conn=8390 role=brain stream-subscriber stream=3885 wall_ms=1784269300122 mono_ms=4057992 event=stream-sub-attach stream=3885 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20281│CONN_LIFECYCLE: conn=8389 role=brain stream-subscriber stream=3886 wall_ms=1784269300124 mono_ms=4057994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20282│CONN_LIFECYCLE: conn=8392 role=brain wall_ms=1784269300124 mono_ms=4057994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20283│CONN_LIFECYCLE: conn=8392 role=brain wall_ms=1784269300124 mono_ms=4057994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20286│CONN_LIFECYCLE: conn=8393 role=brain wall_ms=1784269300131 mono_ms=4058001 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20287│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=1784269301060 mono_ms=4058930 event=stream-sub-attach stream=3888 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20288│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=1784269301769 mono_ms=4059639 event=stream-sub-attach stream=3889 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20289│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=1784269302153 mono_ms=4060023 event=stream-sub-attach stream=3890 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20290│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=1784269302456 mono_ms=4060326 event=stream-sub-attach stream=3891 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20291│CONN_LIFECYCLE: conn=8394 role=brain wall_ms=1784269303681 mono_ms=4061551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20292│CONN_LIFECYCLE: conn=8394 role=brain wall_ms=1784269303681 mono_ms=4061551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20293│CONN_LIFECYCLE: conn=8395 role=brain wall_ms=1784269308724 mono_ms=4066594 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20297│CONN_LIFECYCLE: conn=8397 role=brain wall_ms=1784269312617 mono_ms=4070487 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20298│CONN_LIFECYCLE: conn=8397 role=brain stream-subscriber stream=3892 wall_ms=1784269312617 mono_ms=4070487 event=stream-sub-attach stream=3892 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20299│CONN_LIFECYCLE: conn=8397 role=brain stream-subscriber stream=3892 wall_ms=1784269312667 mono_ms=4070537 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20300│CONN_LIFECYCLE: conn=8398 role=brain wall_ms=1784269312667 mono_ms=4070537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20301│CONN_LIFECYCLE: conn=8398 role=brain wall_ms=1784269312667 mono_ms=4070537 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20309│CONN_LIFECYCLE: conn=8402 role=brain wall_ms=1784269313857 mono_ms=4071726 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20310│CONN_LIFECYCLE: conn=8403 role=brain stream-subscriber stream=3894 wall_ms=1784269313857 mono_ms=4071726 event=stream-sub-attach stream=3894 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20311│CONN_LIFECYCLE: conn=8402 role=brain stream-subscriber stream=3893 wall_ms=1784269313857 mono_ms=4071726 event=stream-sub-attach stream=3893 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20312│CONN_LIFECYCLE: conn=8403 role=brain stream-subscriber stream=3894 wall_ms=1784269313858 mono_ms=4071728 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20313│CONN_LIFECYCLE: conn=8404 role=brain wall_ms=1784269313858 mono_ms=4071728 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20314│CONN_LIFECYCLE: conn=8404 role=brain wall_ms=1784269313858 mono_ms=4071728 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20320│CONN_LIFECYCLE: conn=8407 role=brain wall_ms=1784269314992 mono_ms=4072862 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20321│CONN_LIFECYCLE: conn=8407 role=brain stream-subscriber stream=3900 wall_ms=1784269314992 mono_ms=4072862 event=stream-sub-attach stream=3900 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20322│CONN_LIFECYCLE: conn=8407 role=brain stream-subscriber stream=3900 wall_ms=1784269314994 mono_ms=4072864 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20323│CONN_LIFECYCLE: conn=8408 role=brain wall_ms=1784269314995 mono_ms=4072864 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20324│CONN_LIFECYCLE: conn=8408 role=brain wall_ms=1784269314995 mono_ms=4072864 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20326│CONN_LIFECYCLE: conn=8409 role=brain wall_ms=1784269315508 mono_ms=4073378 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20327│CONN_LIFECYCLE: conn=8410 role=brain stream-subscriber stream=3901 wall_ms=1784269315508 mono_ms=4073378 event=stream-sub-attach stream=3901 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20328│CONN_LIFECYCLE: conn=8410 role=brain stream-subscriber stream=3901 wall_ms=1784269315508 mono_ms=4073378 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20329│CONN_LIFECYCLE: conn=8410 role=brain stream-subscriber stream=3901 wall_ms=1784269315509 mono_ms=4073379 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20330│CONN_LIFECYCLE: conn=8411 role=brain wall_ms=1784269315509 mono_ms=4073379 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20333│CONN_LIFECYCLE: conn=8412 role=brain wall_ms=1784269315714 mono_ms=4073584 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20334│CONN_LIFECYCLE: conn=8413 role=brain stream-subscriber stream=3902 wall_ms=1784269315715 mono_ms=4073585 event=stream-sub-attach stream=3902 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20335│CONN_LIFECYCLE: conn=8413 role=brain stream-subscriber stream=3902 wall_ms=1784269315715 mono_ms=4073585 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20336│CONN_LIFECYCLE: conn=8413 role=brain stream-subscriber stream=3902 wall_ms=1784269315715 mono_ms=4073585 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20337│CONN_LIFECYCLE: conn=8414 role=brain wall_ms=1784269315715 mono_ms=4073585 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20340│CONN_LIFECYCLE: conn=8415 role=brain wall_ms=1784269315922 mono_ms=4073791 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20341│CONN_LIFECYCLE: conn=8416 role=brain stream-subscriber stream=3903 wall_ms=1784269315922 mono_ms=4073792 event=stream-sub-attach stream=3903 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20342│CONN_LIFECYCLE: conn=8416 role=brain stream-subscriber stream=3903 wall_ms=1784269315922 mono_ms=4073792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20343│CONN_LIFECYCLE: conn=8416 role=brain stream-subscriber stream=3903 wall_ms=1784269315922 mono_ms=4073792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20344│CONN_LIFECYCLE: conn=8417 role=brain wall_ms=1784269315922 mono_ms=4073792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20347│CONN_LIFECYCLE: conn=8418 role=brain wall_ms=1784269316025 mono_ms=4073895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20348│CONN_LIFECYCLE: conn=8419 role=brain stream-subscriber stream=3904 wall_ms=1784269316025 mono_ms=4073895 event=stream-sub-attach stream=3904 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20349│CONN_LIFECYCLE: conn=8419 role=brain stream-subscriber stream=3904 wall_ms=1784269316025 mono_ms=4073895 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20350│CONN_LIFECYCLE: conn=8419 role=brain stream-subscriber stream=3904 wall_ms=1784269316025 mono_ms=4073895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20351│CONN_LIFECYCLE: conn=8420 role=brain wall_ms=1784269316026 mono_ms=4073895 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20359│CONN_LIFECYCLE: conn=8425 role=brain wall_ms=1784269316130 mono_ms=4074000 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20360│CONN_LIFECYCLE: conn=8425 role=brain stream-subscriber stream=3906 wall_ms=1784269316130 mono_ms=4074000 event=stream-sub-attach stream=3906 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20361│CONN_LIFECYCLE: conn=8425 role=brain stream-subscriber stream=3906 wall_ms=1784269316132 mono_ms=4074002 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20362│CONN_LIFECYCLE: conn=8427 role=brain wall_ms=1784269316132 mono_ms=4074002 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20363│CONN_LIFECYCLE: conn=8427 role=brain wall_ms=1784269316132 mono_ms=4074002 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20365│CONN_LIFECYCLE: conn=8426 role=brain wall_ms=1784269316142 mono_ms=4074012 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20366│CONN_LIFECYCLE: conn=8424 role=brain stream-subscriber stream=3905 wall_ms=1784269316142 mono_ms=4074012 event=stream-sub-attach stream=3905 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20367│CONN_LIFECYCLE: conn=8426 role=brain stream-subscriber stream=3907 wall_ms=1784269316142 mono_ms=4074012 event=stream-sub-attach stream=3907 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20368│CONN_LIFECYCLE: conn=8426 role=brain stream-subscriber stream=3907 wall_ms=1784269316147 mono_ms=4074017 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20369│CONN_LIFECYCLE: conn=8428 role=brain wall_ms=1784269316148 mono_ms=4074017 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20370│CONN_LIFECYCLE: conn=8428 role=brain wall_ms=1784269316148 mono_ms=4074017 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20381│CONN_LIFECYCLE: conn=8431 role=brain wall_ms=1784269321301 mono_ms=4079171 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20382│CONN_LIFECYCLE: conn=8432 role=brain stream-subscriber stream=3908 wall_ms=1784269321302 mono_ms=4079171 event=stream-sub-attach stream=3908 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20383│CONN_LIFECYCLE: conn=8432 role=brain stream-subscriber stream=3908 wall_ms=1784269321302 mono_ms=4079171 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20384│CONN_LIFECYCLE: conn=8432 role=brain stream-subscriber stream=3908 wall_ms=1784269321306 mono_ms=4079176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20385│CONN_LIFECYCLE: conn=8433 role=brain wall_ms=1784269321307 mono_ms=4079176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20392│CONN_LIFECYCLE: conn=8435 role=brain wall_ms=1784269322644 mono_ms=4080514 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20393│CONN_LIFECYCLE: conn=8438 role=brain stream-subscriber stream=3909 wall_ms=1784269322644 mono_ms=4080514 event=stream-sub-attach stream=3909 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20394│CONN_LIFECYCLE: conn=8437 role=brain stream-subscriber stream=3910 wall_ms=1784269322644 mono_ms=4080514 event=stream-sub-attach stream=3910 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20395│CONN_LIFECYCLE: conn=8439 role=brain stream-subscriber stream=3911 wall_ms=1784269322644 mono_ms=4080514 event=stream-sub-attach stream=3911 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20396│CONN_LIFECYCLE: conn=8438 role=brain stream-subscriber stream=3909 wall_ms=1784269322644 mono_ms=4080514 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20397│CONN_LIFECYCLE: conn=8437 role=brain stream-subscriber stream=3910 wall_ms=1784269322644 mono_ms=4080514 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20398│CONN_LIFECYCLE: conn=8439 role=brain stream-subscriber stream=3911 wall_ms=1784269322644 mono_ms=4080514 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20412│CONN_LIFECYCLE: conn=8445 role=brain wall_ms=1784269327704 mono_ms=4085574 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*20413│CONN_LIFECYCLE: conn=8445 role=brain stream-subscriber stream=3912 wall_ms=1784269327704 mono_ms=4085574 event=stream-sub-attach stream=3912 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20414│CONN_LIFECYCLE: conn=8445 role=brain stream-subscriber stream=3912 wall_ms=1784269327713 mono_ms=4085582 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20415│CONN_LIFECYCLE: conn=8446 role=brain wall_ms=1784269327713 mono_ms=4085583 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20416│CONN_LIFECYCLE: conn=8446 role=brain wall_ms=1784269327713 mono_ms=4085583 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncation":{"content":" 19009|CONN_LIFECYCLE: conn=7861 role=brain wall_ms=1784269083882 mono_ms=3841753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19010|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083882 mono_ms=3841753 event=stream-sub-attach stream=3635 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19011|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19012|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19013|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19018|CONN_LIFECYCLE: conn=7866 role=brain wall_ms=1784269084500 mono_ms=3842370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19019|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084500 mono_ms=3842370 event=stream-sub-attach stream=3636 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19020|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084504 mono_ms=3842374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19021|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19022|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19023|CONN_LIFECYCLE: conn=7865 role=brain wall_ms=1784269084515 mono_ms=3842386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19024|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084515 mono_ms=3842386 event=stream-sub-attach stream=3637 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19025|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19026|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19027|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19031|CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19032|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3639 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19033|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3638 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19034|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19035|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19036|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19050|CONN_LIFECYCLE: conn=7880 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19051|CONN_LIFECYCLE: conn=7879 role=brain stream-subscriber stream=3640 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3640 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19052|CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3642 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19053|CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3641 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19054|CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19055|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19056|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19067|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19068|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=stream-sub-attach stream=3644 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19069|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19070|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19071|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19073|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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19074|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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19075|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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19076|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=1784269090252 mono_ms=3848122 event=stream-sub-attach stream=3648 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19077|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19078|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19081|CONN_LIFECYCLE: conn=7890 role=brain wall_ms=1784269091924 mono_ms=3849795 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19082|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269091925 mono_ms=3849795 event=stream-sub-attach stream=3649 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19083|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19084|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19085|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19090|CONN_LIFECYCLE: conn=7894 role=brain wall_ms=1784269098937 mono_ms=3856808 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19091|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098937 mono_ms=3856808 event=stream-sub-attach stream=3650 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19092|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19093|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19094|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19099|CONN_LIFECYCLE: conn=7899 role=brain wall_ms=1784269099660 mono_ms=3857530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19100|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099660 mono_ms=3857530 event=stream-sub-attach stream=3652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19101|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19102|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19103|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19104|CONN_LIFECYCLE: conn=7898 role=brain wall_ms=1784269099671 mono_ms=3857541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19105|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099671 mono_ms=3857541 event=stream-sub-attach stream=3651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19106|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19107|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19108|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19116|CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19117|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19118|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3655 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19119|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3654 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19120|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19121|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19122|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19147|CONN_LIFECYCLE: conn=7917 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19148|CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3660 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19149|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3657 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19150|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19151|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19152|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19153|CONN_LIFECYCLE: conn=7918 role=brain wall_ms=1784269113596 mono_ms=3871466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19154|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113596 mono_ms=3871466 event=stream-sub-attach stream=3658 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19155|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19156|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19157|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19164|CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19165|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=stream-sub-attach stream=3659 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19166|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19167|CONN_LIFECYCLE: conn=7925 role=brain wall_ms=1784269113690 mono_ms=3871561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19168|CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113690 mono_ms=3871561 event=stream-sub-attach stream=3656 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19169|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113694 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19170|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19171|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19176|CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19177|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=stream-sub-attach stream=3671 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19178|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19179|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19180|CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19184|CONN_LIFECYCLE: conn=7933 role=brain wall_ms=1784269114000 mono_ms=3871870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19185|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114000 mono_ms=3871870 event=stream-sub-attach stream=3672 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19186|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19187|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19188|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19194|CONN_LIFECYCLE: conn=7937 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19195|CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3673 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19196|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3674 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19197|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19198|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19199|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19206|CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19207|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3675 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19208|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3676 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19209|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19210|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19211|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19220|CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19221|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=stream-sub-attach stream=3677 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19222|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19223|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19224|CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19232|CONN_LIFECYCLE: conn=7954 role=brain wall_ms=1784269117611 mono_ms=3875481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19233|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117611 mono_ms=3875481 event=stream-sub-attach stream=3680 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19234|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19235|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19236|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19238|CONN_LIFECYCLE: conn=7956 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19239|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3679 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19240|CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3678 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19241|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19242|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19243|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19251|CONN_LIFECYCLE: conn=7962 role=brain wall_ms=1784269122047 mono_ms=3879917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19252|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122047 mono_ms=3879918 event=stream-sub-attach stream=3681 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19253|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122058 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19254|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122058 mono_ms=3879929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19255|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122059 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19259|CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19260|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=stream-sub-attach stream=3682 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19261|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19262|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19263|CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19267|CONN_LIFECYCLE: conn=7969 role=brain wall_ms=1784269129058 mono_ms=3886928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19268|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129058 mono_ms=3886928 event=stream-sub-attach stream=3688 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19269|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19270|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19271|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19276|CONN_LIFECYCLE: conn=7974 role=brain wall_ms=1784269129780 mono_ms=3887650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19277|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129780 mono_ms=3887650 event=stream-sub-attach stream=3690 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19278|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19279|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19280|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19281|CONN_LIFECYCLE: conn=7973 role=brain wall_ms=1784269129783 mono_ms=3887653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19282|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129783 mono_ms=3887653 event=stream-sub-attach stream=3689 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19283|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19284|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19285|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19287|CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19288|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=stream-sub-attach stream=3691 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19289|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19290|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19291|CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130398 mono_ms=3888269 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19294|CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19295|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888474 event=stream-sub-attach stream=3692 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19296|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19297|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19298|CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19301|CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19302|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130810 mono_ms=3888681 event=stream-sub-attach stream=3693 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19303|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19304|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19305|CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19314|CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19315|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3694 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19316|CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3695 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19317|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3696 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19318|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19319|CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19320|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19336|CONN_LIFECYCLE: conn=8001 role=brain wall_ms=1784269133908 mono_ms=3891778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19337|CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133908 mono_ms=3891778 event=stream-sub-attach stream=3698 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19338|CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19339|CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19340|CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19342|CONN_LIFECYCLE: conn=7999 role=brain wall_ms=1784269133920 mono_ms=3891790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19343|CONN_LIFECYCLE: conn=8000 role=brain stream-subscriber stream=3697 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3697 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19344|CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3699 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19345|CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19346|CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19347|CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19352|CONN_LIFECYCLE: conn=8005 role=brain wall_ms=1784269134833 mono_ms=3892704 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19353|CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=stream-sub-attach stream=3700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19354|CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19355|CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134838 mono_ms=3892708 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19356|CONN_LIFECYCLE: conn=8007 role=brain wall_ms=1784269134838 mono_ms=3892708 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19360|CONN_LIFECYCLE: conn=8009 role=brain wall_ms=1784269137001 mono_ms=3894871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19361|CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137001 mono_ms=3894871 event=stream-sub-attach stream=3701 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19362|CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19363|CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19364|CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19375|CONN_LIFECYCLE: conn=8014 role=brain wall_ms=1784269144116 mono_ms=3901986 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19376|CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144116 mono_ms=3901986 event=stream-sub-attach stream=3702 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19377|CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144118 mono_ms=3901988 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19378|CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19379|CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19381|CONN_LIFECYCLE: conn=8016 role=brain wall_ms=1784269146899 mono_ms=3904769 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19382|CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904769 event=stream-sub-attach stream=3703 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19383|CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19384|CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19385|CONN_LIFECYCLE: conn=8018 role=brain wall_ms=1784269146900 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19390|CONN_LIFECYCLE: conn=8020 role=brain wall_ms=1784269147105 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19391|CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3705 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19392|CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19393|CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3704 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19394|CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19395|CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19396|CONN_LIFECYCLE: conn=8023 role=brain wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19402|CONN_LIFECYCLE: conn=8026 role=brain wall_ms=1784269152164 mono_ms=3910034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19403|CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152164 mono_ms=3910034 event=stream-sub-attach stream=3706 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19404|CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19405|CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19406|CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152289 mono_ms=3910159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19415|CONN_LIFECYCLE: conn=8033 role=brain wall_ms=1784269158976 mono_ms=3916846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19416|CONN_LIFECYCLE: conn=8033 role=brain stream-subscriber stream=3707 wall_ms=1784269158976 mono_ms=3916846 event=stream-sub-attach stream=3707 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19417|CONN_LIFECYCLE: conn=8032 role=brain wall_ms=1784269158978 mono_ms=3916848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19418|CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158978 mono_ms=3916848 event=stream-sub-attach stream=3709 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19419|CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19420|CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19421|CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19427|CONN_LIFECYCLE: conn=8037 role=brain wall_ms=1784269159079 mono_ms=3916949 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19428|CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159079 mono_ms=3916949 event=stream-sub-attach stream=3708 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19429|CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19430|CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19431|CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19434|CONN_LIFECYCLE: conn=8040 role=brain wall_ms=1784269159182 mono_ms=3917053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19435|CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159182 mono_ms=3917053 event=stream-sub-attach stream=3710 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19436|CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19437|CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19438|CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19441|CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19442|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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19443|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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19444|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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19445|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=1784269161531 mono_ms=3919401 event=stream-sub-attach stream=3724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19446|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=1784269162196 mono_ms=3920066 event=stream-sub-attach stream=3725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19447|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19448|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449|CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19454|CONN_LIFECYCLE: conn=8046 role=brain wall_ms=1784269165372 mono_ms=3923243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19455|CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3726 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19456|CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3728 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19457|CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19458|CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165373 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19459|CONN_LIFECYCLE: conn=8049 role=brain wall_ms=1784269165374 mono_ms=3923244 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19460|CONN_LIFECYCLE: conn=8049 role=brain stream-subscriber stream=3730 wall_ms=1784269165374 mono_ms=3923244 event=stream-sub-attach stream=3730 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19461|CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19462|CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19463|CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19475|CONN_LIFECYCLE: conn=8055 role=brain wall_ms=1784269165476 mono_ms=3923346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19476|CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3729 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19477|CONN_LIFECYCLE: conn=8058 role=brain stream-subscriber stream=3731 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3731 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19478|CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19479|CONN_LIFECYCLE: conn=8058 role=brain stream-subscriber stream=3731 wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19480|CONN_LIFECYCLE: conn=8057 role=brain wall_ms=1784269165477 mono_ms=3923347 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19481|CONN_LIFECYCLE: conn=8057 role=brain stream-subscriber stream=3732 wall_ms=1784269165477 mono_ms=3923347 event=stream-sub-attach stream=3732 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19482|CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19483|CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19484|CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19492|CONN_LIFECYCLE: conn=8062 role=brain wall_ms=1784269165579 mono_ms=3923449 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19493|CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165579 mono_ms=3923449 event=stream-sub-attach stream=3727 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19494|CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165579 mono_ms=3923449 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19495|CONN_LIFECYCLE: conn=8063 role=brain stream-subscriber stream=3727 wall_ms=1784269165583 mono_ms=3923453 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19496|CONN_LIFECYCLE: conn=8064 role=brain wall_ms=1784269165583 mono_ms=3923454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19500|CONN_LIFECYCLE: conn=8066 role=brain wall_ms=1784269167230 mono_ms=3925100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19501|CONN_LIFECYCLE: conn=8066 role=brain stream-subscriber stream=3733 wall_ms=1784269167230 mono_ms=3925100 event=stream-sub-attach stream=3733 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19502|CONN_LIFECYCLE: conn=8067 role=brain wall_ms=1784269167426 mono_ms=3925297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19503|CONN_LIFECYCLE: conn=8067 role=brain wall_ms=1784269167426 mono_ms=3925297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19504|CONN_LIFECYCLE: conn=8066 role=brain stream-subscriber stream=3733 wall_ms=1784269167445 mono_ms=3925316 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19508|CONN_LIFECYCLE: conn=8069 role=brain wall_ms=1784269169396 mono_ms=3927266 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19509|CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169396 mono_ms=3927266 event=stream-sub-attach stream=3734 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19510|CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169396 mono_ms=3927266 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19511|CONN_LIFECYCLE: conn=8070 role=brain stream-subscriber stream=3734 wall_ms=1784269169400 mono_ms=3927270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19512|CONN_LIFECYCLE: conn=8071 role=brain wall_ms=1784269169400 mono_ms=3927270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19526|CONN_LIFECYCLE: conn=8076 role=brain wall_ms=1784269174141 mono_ms=3932011 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19527|CONN_LIFECYCLE: conn=8076 role=brain stream-subscriber stream=3737 wall_ms=1784269174141 mono_ms=3932011 event=stream-sub-attach stream=3737 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19528|CONN_LIFECYCLE: conn=8076 role=brain stream-subscriber stream=3737 wall_ms=1784269174146 mono_ms=3932016 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19529|CONN_LIFECYCLE: conn=8079 role=brain wall_ms=1784269174146 mono_ms=3932016 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19530|CONN_LIFECYCLE: conn=8079 role=brain wall_ms=1784269174146 mono_ms=3932016 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19531|CONN_LIFECYCLE: conn=8078 role=brain wall_ms=1784269174157 mono_ms=3932027 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19532|CONN_LIFECYCLE: conn=8078 role=brain stream-subscriber stream=3736 wall_ms=1784269174157 mono_ms=3932027 event=stream-sub-attach stream=3736 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19533|CONN_LIFECYCLE: conn=8078 role=brain stream-subscriber stream=3736 wall_ms=1784269174160 mono_ms=3932030 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19534|CONN_LIFECYCLE: conn=8080 role=brain wall_ms=1784269174160 mono_ms=3932030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19535|CONN_LIFECYCLE: conn=8080 role=brain wall_ms=1784269174160 mono_ms=3932030 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19536|CONN_LIFECYCLE: conn=8077 role=brain wall_ms=1784269174173 mono_ms=3932043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19537|CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174173 mono_ms=3932043 event=stream-sub-attach stream=3735 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19538|CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174182 mono_ms=3932052 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19539|CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19540|CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...","truncated":true,"truncatedBy":"bytes","totalLines":926,"totalBytes":136639,"outputLines":340,"outputBytes":51162,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":926,"totalBytes":136639,"outputLines":340,"outputBytes":51162,"shownRange":{"start":1,"end":340},"nextOffset":341}}},"isError":false,"timestamp":1784271959829}}
{"type":"message","id":"49a70f22","parentId":"06cc866c","timestamp":"2026-07-17T07:05:59.837Z","message":{"role":"toolResult","toolCallId":"call_5uuO5wm2p1ogG7I4Jr6JBFxs|fc_0fcf561150331aac016a59d45715208190846aa453a390c0f0","toolName":"grep","content":[{"type":"text","text":"*19000|CONN_LIFECYCLE: conn=7858 role=brain wall_ms=1784269079966 mono_ms=3837836 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19001|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19002|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19003|PAIR_MEET_UP:SPT_DEV step=59475636 id=c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89 addr=EndpointAddr { id: PublicKey(c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89), addrs: {Ip(100.68.35.65:51511), Ip(192.168.1.81:51511)} }\n...\n 19005|CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19006|CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19007|CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841751 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19008|CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19009|CONN_LIFECYCLE: conn=7861 role=brain wall_ms=1784269083882 mono_ms=3841753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19010|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083882 mono_ms=3841753 event=stream-sub-attach stream=3635 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19011|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19012|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19013|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19014|CONN_LIFECYCLE: conn=7863 role=brain wall_ms=1784269084498 mono_ms=3842369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19015|CONN_LIFECYCLE: conn=7864 role=brain wall_ms=1784269084498 mono_ms=3842369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19016|CONN_LIFECYCLE: conn=7863 role=brain wall_ms=1784269084498 mono_ms=3842369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19017|CONN_LIFECYCLE: conn=7864 role=brain wall_ms=1784269084498 mono_ms=3842369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19018|CONN_LIFECYCLE: conn=7866 role=brain wall_ms=1784269084500 mono_ms=3842370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19019|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084500 mono_ms=3842370 event=stream-sub-attach stream=3636 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19020|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084504 mono_ms=3842374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19021|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19022|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19023|CONN_LIFECYCLE: conn=7865 role=brain wall_ms=1784269084515 mono_ms=3842386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19024|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084515 mono_ms=3842386 event=stream-sub-attach stream=3637 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19025|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19026|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19027|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19028|CONN_LIFECYCLE: conn=7869 role=brain wall_ms=1784269084910 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19029|CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19030|CONN_LIFECYCLE: conn=7869 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19031|CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19032|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3639 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19033|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3638 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19034|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19035|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19036|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19037|CONN_LIFECYCLE: conn=7873 role=brain wall_ms=1784269084918 mono_ms=3842788 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19038|CONN_LIFECYCLE: conn=7873 role=brain wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19039|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084920 mono_ms=3842790 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19040|CONN_LIFECYCLE: conn=7874 role=brain wall_ms=1784269084920 mono_ms=3842790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19041|CONN_LIFECYCLE: conn=7874 role=brain wall_ms=1784269084920 mono_ms=3842791 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19042|CONN_LIFECYCLE: conn=7875 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19043|CONN_LIFECYCLE: conn=7876 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19044|CONN_LIFECYCLE: conn=7875 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19045|CONN_LIFECYCLE: conn=7877 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19046|CONN_LIFECYCLE: conn=7876 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19047|CONN_LIFECYCLE: conn=7877 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19048|CONN_LIFECYCLE: conn=7879 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19049|CONN_LIFECYCLE: conn=7878 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19050|CONN_LIFECYCLE: conn=7880 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19053|CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3641 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19054|CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19055|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19056|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19057|CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086259 mono_ms=3844129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19058|CONN_LIFECYCLE: conn=7882 role=brain wall_ms=1784269086259 mono_ms=3844129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19059|CONN_LIFECYCLE: conn=7882 role=brain wall_ms=1784269086259 mono_ms=3844130 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19060|CONN_LIFECYCLE: conn=7879 role=brain stream-subscriber stream=3640 wall_ms=1784269086262 mono_ms=3844132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19061|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19067|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19068|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=stream-sub-attach stream=3644 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19069|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19070|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19071|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19073|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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19074|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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19075|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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19077|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19078|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19080|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19081|CONN_LIFECYCLE: conn=7890 role=brain wall_ms=1784269091924 mono_ms=3849795 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19082|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269091925 mono_ms=3849795 event=stream-sub-attach stream=3649 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19083|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19084|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19085|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19086|CONN_LIFECYCLE: conn=7892 role=brain wall_ms=1784269096804 mono_ms=3854674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19087|CONN_LIFECYCLE: conn=7892 role=brain wall_ms=1784269096804 mono_ms=3854674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19088|CONN_LIFECYCLE: conn=7893 role=brain wall_ms=1784269098936 mono_ms=3856807 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19089|CONN_LIFECYCLE: conn=7893 role=brain wall_ms=1784269098936 mono_ms=3856807 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19090|CONN_LIFECYCLE: conn=7894 role=brain wall_ms=1784269098937 mono_ms=3856808 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19091|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098937 mono_ms=3856808 event=stream-sub-attach stream=3650 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19092|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19093|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19094|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19095|CONN_LIFECYCLE: conn=7896 role=brain wall_ms=1784269099658 mono_ms=3857529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19096|CONN_LIFECYCLE: conn=7897 role=brain wall_ms=1784269099658 mono_ms=3857529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19097|CONN_LIFECYCLE: conn=7897 role=brain wall_ms=1784269099658 mono_ms=3857529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19098|CONN_LIFECYCLE: conn=7896 role=brain wall_ms=1784269099658 mono_ms=3857529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19099|CONN_LIFECYCLE: conn=7899 role=brain wall_ms=1784269099660 mono_ms=3857530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19100|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099660 mono_ms=3857530 event=stream-sub-attach stream=3652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19101|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19102|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19103|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19104|CONN_LIFECYCLE: conn=7898 role=brain wall_ms=1784269099671 mono_ms=3857541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19105|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099671 mono_ms=3857541 event=stream-sub-attach stream=3651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19106|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19107|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19108|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19109|CONN_LIFECYCLE: conn=7902 role=brain wall_ms=1784269101845 mono_ms=3859716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19110|CONN_LIFECYCLE: conn=7902 role=brain wall_ms=1784269101846 mono_ms=3859716 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19111|CONN_LIFECYCLE: conn=7903 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19112|CONN_LIFECYCLE: conn=7905 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19113|CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19114|CONN_LIFECYCLE: conn=7903 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19115|CONN_LIFECYCLE: conn=7905 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19116|CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19117|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19118|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3655 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19119|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3654 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19123|CONN_LIFECYCLE: conn=7909 role=brain wall_ms=1784269106891 mono_ms=3864761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19124|CONN_LIFECYCLE: conn=7909 role=brain wall_ms=1784269106891 mono_ms=3864762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19125|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19126|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19127|PAIR_MEET_UP:SPT_DEV step=59475637 id=f940429251e824c02cbb6c48b44f9ce877b5b251c34f3b4d61fec70efd648a5c addr=EndpointAddr { id: PublicKey(f940429251e824c02cbb6c48b44f9ce877b5b251c34f3b4d61fec70efd648a5c), addrs: {Ip(100.68.35.65:57656), Ip(192.168.1.81:57656)} }\n...\n 19129|CONN_LIFECYCLE: conn=7910 role=brain wall_ms=1784269111933 mono_ms=3869803 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19130|CONN_LIFECYCLE: conn=7910 role=brain wall_ms=1784269111933 mono_ms=3869803 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19131|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269113540 mono_ms=3871410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19132|CONN_LIFECYCLE: conn=7911 role=brain wall_ms=1784269113540 mono_ms=3871411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19133|CONN_LIFECYCLE: conn=7911 role=brain wall_ms=1784269113540 mono_ms=3871411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19134|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269113548 mono_ms=3871418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19135|CONN_LIFECYCLE: conn=7912 role=brain wall_ms=1784269113548 mono_ms=3871418 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19136|CONN_LIFECYCLE: conn=7912 role=brain wall_ms=1784269113548 mono_ms=3871418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19137|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269113549 mono_ms=3871420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19138|CONN_LIFECYCLE: conn=7913 role=brain wall_ms=1784269113549 mono_ms=3871420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19139|CONN_LIFECYCLE: conn=7913 role=brain wall_ms=1784269113550 mono_ms=3871420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19140|CONN_LIFECYCLE: conn=7914 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19141|CONN_LIFECYCLE: conn=7916 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19142|CONN_LIFECYCLE: conn=7915 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19143|CONN_LIFECYCLE: conn=7914 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19144|CONN_LIFECYCLE: conn=7915 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19145|CONN_LIFECYCLE: conn=7916 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19146|CONN_LIFECYCLE: conn=7919 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19147|CONN_LIFECYCLE: conn=7917 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19148|CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3660 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19149|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3657 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19150|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19151|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19152|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19153|CONN_LIFECYCLE: conn=7918 role=brain wall_ms=1784269113596 mono_ms=3871466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19154|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113596 mono_ms=3871466 event=stream-sub-attach stream=3658 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19155|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19156|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19157|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19158|CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113604 mono_ms=3871474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19159|CONN_LIFECYCLE: conn=7922 role=brain wall_ms=1784269113604 mono_ms=3871474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19160|CONN_LIFECYCLE: conn=7922 role=brain wall_ms=1784269113604 mono_ms=3871474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19161|CONN_LIFECYCLE: conn=7923 role=brain wall_ms=1784269113689 mono_ms=3871559 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19162|CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871559 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19163|CONN_LIFECYCLE: conn=7923 role=brain wall_ms=1784269113689 mono_ms=3871559 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19164|CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19165|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=stream-sub-attach stream=3659 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19166|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19167|CONN_LIFECYCLE: conn=7925 role=brain wall_ms=1784269113690 mono_ms=3871561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19168|CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113690 mono_ms=3871561 event=stream-sub-attach stream=3656 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19169|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113694 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19170|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19171|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19172|CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113709 mono_ms=3871579 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19173|CONN_LIFECYCLE: conn=7928 role=brain wall_ms=1784269113709 mono_ms=3871579 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19174|CONN_LIFECYCLE: conn=7928 role=brain wall_ms=1784269113709 mono_ms=3871579 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19175|CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19176|CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19177|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=stream-sub-attach stream=3671 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19178|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19179|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19180|CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19181|CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19182|CONN_LIFECYCLE: conn=7932 role=brain wall_ms=1784269113998 mono_ms=3871869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19183|CONN_LIFECYCLE: conn=7932 role=brain wall_ms=1784269113999 mono_ms=3871869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19184|CONN_LIFECYCLE: conn=7933 role=brain wall_ms=1784269114000 mono_ms=3871870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19185|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114000 mono_ms=3871870 event=stream-sub-attach stream=3672 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19186|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19187|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19188|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19189|CONN_LIFECYCLE: conn=7935 role=brain wall_ms=1784269114618 mono_ms=3872488 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19190|CONN_LIFECYCLE: conn=7936 role=brain wall_ms=1784269114618 mono_ms=3872488 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19191|CONN_LIFECYCLE: conn=7936 role=brain wall_ms=1784269114618 mono_ms=3872488 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19192|CONN_LIFECYCLE: conn=7935 role=brain wall_ms=1784269114618 mono_ms=3872488 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19193|CONN_LIFECYCLE: conn=7938 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19194|CONN_LIFECYCLE: conn=7937 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19195|CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3673 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19196|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3674 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19197|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19198|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19199|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19200|CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114631 mono_ms=3872502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19201|CONN_LIFECYCLE: conn=7940 role=brain wall_ms=1784269114631 mono_ms=3872502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19202|CONN_LIFECYCLE: conn=7940 role=brain wall_ms=1784269114631 mono_ms=3872502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19203|CONN_LIFECYCLE: conn=7941 role=brain wall_ms=1784269115134 mono_ms=3873004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19204|CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19205|CONN_LIFECYCLE: conn=7941 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19206|CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19207|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3675 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19208|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3676 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19209|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19210|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19211|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19212|CONN_LIFECYCLE: conn=7945 role=brain wall_ms=1784269115139 mono_ms=3873009 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19213|CONN_LIFECYCLE: conn=7945 role=brain wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19214|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115143 mono_ms=3873013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19215|CONN_LIFECYCLE: conn=7946 role=brain wall_ms=1784269115143 mono_ms=3873013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19216|CONN_LIFECYCLE: conn=7946 role=brain wall_ms=1784269115143 mono_ms=3873013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19217|CONN_LIFECYCLE: conn=7947 role=brain wall_ms=1784269116976 mono_ms=3874847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19218|CONN_LIFECYCLE: conn=7947 role=brain wall_ms=1784269116976 mono_ms=3874847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19219|CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19220|CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19221|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=stream-sub-attach stream=3677 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19222|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19223|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19224|CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19225|CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19226|CONN_LIFECYCLE: conn=7951 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19227|CONN_LIFECYCLE: conn=7952 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19228|CONN_LIFECYCLE: conn=7953 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19229|CONN_LIFECYCLE: conn=7951 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19230|CONN_LIFECYCLE: conn=7952 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19231|CONN_LIFECYCLE: conn=7953 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19232|CONN_LIFECYCLE: conn=7954 role=brain wall_ms=1784269117611 mono_ms=3875481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19233|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117611 mono_ms=3875481 event=stream-sub-attach stream=3680 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19234|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19235|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19236|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19237|CONN_LIFECYCLE: conn=7955 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19238|CONN_LIFECYCLE: conn=7956 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19239|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3679 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19240|CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3678 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19241|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19242|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19243|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19244|CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117643 mono_ms=3875513 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19245|CONN_LIFECYCLE: conn=7959 role=brain wall_ms=1784269117643 mono_ms=3875513 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19246|CONN_LIFECYCLE: conn=7959 role=brain wall_ms=1784269117643 mono_ms=3875514 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19247|CONN_LIFECYCLE: conn=7960 role=brain wall_ms=1784269122022 mono_ms=3879893 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19248|CONN_LIFECYCLE: conn=7960 role=brain wall_ms=1784269122022 mono_ms=3879893 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19249|CONN_LIFECYCLE: conn=7961 role=brain wall_ms=1784269122046 mono_ms=3879916 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19250|CONN_LIFECYCLE: conn=7961 role=brain wall_ms=1784269122046 mono_ms=3879916 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19251|CONN_LIFECYCLE: conn=7962 role=brain wall_ms=1784269122047 mono_ms=3879917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19252|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122047 mono_ms=3879918 event=stream-sub-attach stream=3681 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19253|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122058 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19254|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122058 mono_ms=3879929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19255|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122059 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19256|CONN_LIFECYCLE: conn=7964 role=brain wall_ms=1784269127064 mono_ms=3884934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19257|CONN_LIFECYCLE: conn=7964 role=brain wall_ms=1784269127064 mono_ms=3884934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19258|CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19259|CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19260|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=stream-sub-attach stream=3682 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19261|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19262|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19263|CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19264|CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19265|CONN_LIFECYCLE: conn=7968 role=brain wall_ms=1784269129057 mono_ms=3886927 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19266|CONN_LIFECYCLE: conn=7968 role=brain wall_ms=1784269129057 mono_ms=3886927 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19267|CONN_LIFECYCLE: conn=7969 role=brain wall_ms=1784269129058 mono_ms=3886928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19268|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129058 mono_ms=3886928 event=stream-sub-attach stream=3688 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19269|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19270|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19271|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19272|CONN_LIFECYCLE: conn=7971 role=brain wall_ms=1784269129779 mono_ms=3887649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19273|CONN_LIFECYCLE: conn=7972 role=brain wall_ms=1784269129779 mono_ms=3887649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19274|CONN_LIFECYCLE: conn=7971 role=brain wall_ms=1784269129779 mono_ms=3887649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19275|CONN_LIFECYCLE: conn=7972 role=brain wall_ms=1784269129779 mono_ms=3887649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19276|CONN_LIFECYCLE: conn=7974 role=brain wall_ms=1784269129780 mono_ms=3887650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19277|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129780 mono_ms=3887650 event=stream-sub-attach stream=3690 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19278|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19279|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19280|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19281|CONN_LIFECYCLE: conn=7973 role=brain wall_ms=1784269129783 mono_ms=3887653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19282|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129783 mono_ms=3887653 event=stream-sub-attach stream=3689 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19283|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19284|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19285|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19286|CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19287|CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19288|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=stream-sub-attach stream=3691 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19289|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19290|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19291|CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130398 mono_ms=3888269 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19292|CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130399 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19293|CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19294|CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19295|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888474 event=stream-sub-attach stream=3692 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19296|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19297|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19298|CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19299|CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19300|CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19301|CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19302|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130810 mono_ms=3888681 event=stream-sub-attach stream=3693 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19303|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19304|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19305|CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19306|CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19307|CONN_LIFECYCLE: conn=7986 role=brain wall_ms=1784269132106 mono_ms=3889977 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19308|CONN_LIFECYCLE: conn=7986 role=brain wall_ms=1784269132106 mono_ms=3889977 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19309|CONN_LIFECYCLE: conn=7987 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19310|CONN_LIFECYCLE: conn=7987 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19311|CONN_LIFECYCLE: conn=7988 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19312|CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19313|CONN_LIFECYCLE: conn=7988 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19314|CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19315|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3694 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19316|CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3695 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19317|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3696 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19320|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19321|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133811 mono_ms=3891682 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19322|CONN_LIFECYCLE: conn=7993 role=brain wall_ms=1784269133811 mono_ms=3891682 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19323|CONN_LIFECYCLE: conn=7993 role=brain wall_ms=1784269133812 mono_ms=3891682 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19324|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133813 mono_ms=3891683 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19325|CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133814 mono_ms=3891685 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19326|CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133815 mono_ms=3891685 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 1-323 of 480 (49.9KB limit). Use :324 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":"*19000│CONN_LIFECYCLE: conn=7858 role=brain wall_ms=1784269079966 mono_ms=3837836 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19001│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19002│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19003│PAIR_MEET_UP:SPT_DEV step=59475636 id=c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89 addr=EndpointAddr { id: PublicKey(c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89), addrs: {Ip(100.68.35.65:51511), Ip(192.168.1.81:51511)} }\n      │...\n 19005│CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19006│CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19007│CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841751 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19008│CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19009│CONN_LIFECYCLE: conn=7861 role=brain wall_ms=1784269083882 mono_ms=3841753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19010│CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083882 mono_ms=3841753 event=stream-sub-attach stream=3635 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19011│CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19012│CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19013│CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19014│CONN_LIFECYCLE: conn=7863 role=brain wall_ms=1784269084498 mono_ms=3842369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19015│CONN_LIFECYCLE: conn=7864 role=brain wall_ms=1784269084498 mono_ms=3842369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19016│CONN_LIFECYCLE: conn=7863 role=brain wall_ms=1784269084498 mono_ms=3842369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19017│CONN_LIFECYCLE: conn=7864 role=brain wall_ms=1784269084498 mono_ms=3842369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19018│CONN_LIFECYCLE: conn=7866 role=brain wall_ms=1784269084500 mono_ms=3842370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19019│CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084500 mono_ms=3842370 event=stream-sub-attach stream=3636 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19020│CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084504 mono_ms=3842374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19021│CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19022│CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19023│CONN_LIFECYCLE: conn=7865 role=brain wall_ms=1784269084515 mono_ms=3842386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19024│CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084515 mono_ms=3842386 event=stream-sub-attach stream=3637 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19025│CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19026│CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19027│CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19028│CONN_LIFECYCLE: conn=7869 role=brain wall_ms=1784269084910 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19029│CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19030│CONN_LIFECYCLE: conn=7869 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19031│CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19032│CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3639 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19033│CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3638 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19034│CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19035│CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19036│CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19037│CONN_LIFECYCLE: conn=7873 role=brain wall_ms=1784269084918 mono_ms=3842788 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19038│CONN_LIFECYCLE: conn=7873 role=brain wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19039│CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084920 mono_ms=3842790 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19040│CONN_LIFECYCLE: conn=7874 role=brain wall_ms=1784269084920 mono_ms=3842790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19041│CONN_LIFECYCLE: conn=7874 role=brain wall_ms=1784269084920 mono_ms=3842791 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19042│CONN_LIFECYCLE: conn=7875 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19043│CONN_LIFECYCLE: conn=7876 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19044│CONN_LIFECYCLE: conn=7875 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19045│CONN_LIFECYCLE: conn=7877 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19046│CONN_LIFECYCLE: conn=7876 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19047│CONN_LIFECYCLE: conn=7877 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19048│CONN_LIFECYCLE: conn=7879 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19049│CONN_LIFECYCLE: conn=7878 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19050│CONN_LIFECYCLE: conn=7880 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19053│CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3641 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19054│CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19055│CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19056│CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19057│CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086259 mono_ms=3844129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19058│CONN_LIFECYCLE: conn=7882 role=brain wall_ms=1784269086259 mono_ms=3844129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19059│CONN_LIFECYCLE: conn=7882 role=brain wall_ms=1784269086259 mono_ms=3844130 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19060│CONN_LIFECYCLE: conn=7879 role=brain stream-subscriber stream=3640 wall_ms=1784269086262 mono_ms=3844132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19061│CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19062│CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19063│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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19065│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066│CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19067│CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19068│CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=stream-sub-attach stream=3644 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19069│CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19070│CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19071│CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19072│CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19073│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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19074│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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19075│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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19077│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19078│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079│CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19080│CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19081│CONN_LIFECYCLE: conn=7890 role=brain wall_ms=1784269091924 mono_ms=3849795 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19082│CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269091925 mono_ms=3849795 event=stream-sub-attach stream=3649 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19083│CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19084│CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19085│CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19086│CONN_LIFECYCLE: conn=7892 role=brain wall_ms=1784269096804 mono_ms=3854674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19087│CONN_LIFECYCLE: conn=7892 role=brain wall_ms=1784269096804 mono_ms=3854674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19088│CONN_LIFECYCLE: conn=7893 role=brain wall_ms=1784269098936 mono_ms=3856807 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19089│CONN_LIFECYCLE: conn=7893 role=brain wall_ms=1784269098936 mono_ms=3856807 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19090│CONN_LIFECYCLE: conn=7894 role=brain wall_ms=1784269098937 mono_ms=3856808 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19091│CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098937 mono_ms=3856808 event=stream-sub-attach stream=3650 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19092│CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19093│CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19094│CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19095│CONN_LIFECYCLE: conn=7896 role=brain wall_ms=1784269099658 mono_ms=3857529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19096│CONN_LIFECYCLE: conn=7897 role=brain wall_ms=1784269099658 mono_ms=3857529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19097│CONN_LIFECYCLE: conn=7897 role=brain wall_ms=1784269099658 mono_ms=3857529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19098│CONN_LIFECYCLE: conn=7896 role=brain wall_ms=1784269099658 mono_ms=3857529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19099│CONN_LIFECYCLE: conn=7899 role=brain wall_ms=1784269099660 mono_ms=3857530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19100│CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099660 mono_ms=3857530 event=stream-sub-attach stream=3652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19101│CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19102│CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19103│CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19104│CONN_LIFECYCLE: conn=7898 role=brain wall_ms=1784269099671 mono_ms=3857541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19105│CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099671 mono_ms=3857541 event=stream-sub-attach stream=3651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19106│CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19107│CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19108│CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19109│CONN_LIFECYCLE: conn=7902 role=brain wall_ms=1784269101845 mono_ms=3859716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19110│CONN_LIFECYCLE: conn=7902 role=brain wall_ms=1784269101846 mono_ms=3859716 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19111│CONN_LIFECYCLE: conn=7903 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19112│CONN_LIFECYCLE: conn=7905 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19113│CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19114│CONN_LIFECYCLE: conn=7903 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19115│CONN_LIFECYCLE: conn=7905 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19116│CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19117│CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19118│CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3655 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19119│CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3654 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19123│CONN_LIFECYCLE: conn=7909 role=brain wall_ms=1784269106891 mono_ms=3864761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19124│CONN_LIFECYCLE: conn=7909 role=brain wall_ms=1784269106891 mono_ms=3864762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19125│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19126│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19127│PAIR_MEET_UP:SPT_DEV step=59475637 id=f940429251e824c02cbb6c48b44f9ce877b5b251c34f3b4d61fec70efd648a5c addr=EndpointAddr { id: PublicKey(f940429251e824c02cbb6c48b44f9ce877b5b251c34f3b4d61fec70efd648a5c), addrs: {Ip(100.68.35.65:57656), Ip(192.168.1.81:57656)} }\n      │...\n 19129│CONN_LIFECYCLE: conn=7910 role=brain wall_ms=1784269111933 mono_ms=3869803 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19130│CONN_LIFECYCLE: conn=7910 role=brain wall_ms=1784269111933 mono_ms=3869803 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19131│CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269113540 mono_ms=3871410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19132│CONN_LIFECYCLE: conn=7911 role=brain wall_ms=1784269113540 mono_ms=3871411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19133│CONN_LIFECYCLE: conn=7911 role=brain wall_ms=1784269113540 mono_ms=3871411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19134│CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269113548 mono_ms=3871418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19135│CONN_LIFECYCLE: conn=7912 role=brain wall_ms=1784269113548 mono_ms=3871418 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19136│CONN_LIFECYCLE: conn=7912 role=brain wall_ms=1784269113548 mono_ms=3871418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19137│CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269113549 mono_ms=3871420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19138│CONN_LIFECYCLE: conn=7913 role=brain wall_ms=1784269113549 mono_ms=3871420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19139│CONN_LIFECYCLE: conn=7913 role=brain wall_ms=1784269113550 mono_ms=3871420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19140│CONN_LIFECYCLE: conn=7914 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19141│CONN_LIFECYCLE: conn=7916 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19142│CONN_LIFECYCLE: conn=7915 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19143│CONN_LIFECYCLE: conn=7914 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19144│CONN_LIFECYCLE: conn=7915 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19145│CONN_LIFECYCLE: conn=7916 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19146│CONN_LIFECYCLE: conn=7919 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19147│CONN_LIFECYCLE: conn=7917 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19148│CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3660 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19149│CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3657 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19150│CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19151│CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19152│CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19153│CONN_LIFECYCLE: conn=7918 role=brain wall_ms=1784269113596 mono_ms=3871466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19154│CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113596 mono_ms=3871466 event=stream-sub-attach stream=3658 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19155│CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19156│CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19157│CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19158│CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113604 mono_ms=3871474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19159│CONN_LIFECYCLE: conn=7922 role=brain wall_ms=1784269113604 mono_ms=3871474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19160│CONN_LIFECYCLE: conn=7922 role=brain wall_ms=1784269113604 mono_ms=3871474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19161│CONN_LIFECYCLE: conn=7923 role=brain wall_ms=1784269113689 mono_ms=3871559 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19162│CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871559 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19163│CONN_LIFECYCLE: conn=7923 role=brain wall_ms=1784269113689 mono_ms=3871559 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19164│CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19165│CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=stream-sub-attach stream=3659 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19166│CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19167│CONN_LIFECYCLE: conn=7925 role=brain wall_ms=1784269113690 mono_ms=3871561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19168│CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113690 mono_ms=3871561 event=stream-sub-attach stream=3656 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19169│CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113694 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19170│CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19171│CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19172│CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113709 mono_ms=3871579 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19173│CONN_LIFECYCLE: conn=7928 role=brain wall_ms=1784269113709 mono_ms=3871579 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19174│CONN_LIFECYCLE: conn=7928 role=brain wall_ms=1784269113709 mono_ms=3871579 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19175│CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19176│CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19177│CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=stream-sub-attach stream=3671 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19178│CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19179│CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19180│CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19181│CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19182│CONN_LIFECYCLE: conn=7932 role=brain wall_ms=1784269113998 mono_ms=3871869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19183│CONN_LIFECYCLE: conn=7932 role=brain wall_ms=1784269113999 mono_ms=3871869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19184│CONN_LIFECYCLE: conn=7933 role=brain wall_ms=1784269114000 mono_ms=3871870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19185│CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114000 mono_ms=3871870 event=stream-sub-attach stream=3672 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19186│CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19187│CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19188│CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19189│CONN_LIFECYCLE: conn=7935 role=brain wall_ms=1784269114618 mono_ms=3872488 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19190│CONN_LIFECYCLE: conn=7936 role=brain wall_ms=1784269114618 mono_ms=3872488 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19191│CONN_LIFECYCLE: conn=7936 role=brain wall_ms=1784269114618 mono_ms=3872488 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19192│CONN_LIFECYCLE: conn=7935 role=brain wall_ms=1784269114618 mono_ms=3872488 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19193│CONN_LIFECYCLE: conn=7938 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19194│CONN_LIFECYCLE: conn=7937 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19195│CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3673 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19196│CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3674 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19197│CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19198│CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19199│CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19200│CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114631 mono_ms=3872502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19201│CONN_LIFECYCLE: conn=7940 role=brain wall_ms=1784269114631 mono_ms=3872502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19202│CONN_LIFECYCLE: conn=7940 role=brain wall_ms=1784269114631 mono_ms=3872502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19203│CONN_LIFECYCLE: conn=7941 role=brain wall_ms=1784269115134 mono_ms=3873004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19204│CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19205│CONN_LIFECYCLE: conn=7941 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19206│CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19207│CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3675 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19208│CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3676 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19209│CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19210│CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19211│CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19212│CONN_LIFECYCLE: conn=7945 role=brain wall_ms=1784269115139 mono_ms=3873009 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19213│CONN_LIFECYCLE: conn=7945 role=brain wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19214│CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115143 mono_ms=3873013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19215│CONN_LIFECYCLE: conn=7946 role=brain wall_ms=1784269115143 mono_ms=3873013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19216│CONN_LIFECYCLE: conn=7946 role=brain wall_ms=1784269115143 mono_ms=3873013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19217│CONN_LIFECYCLE: conn=7947 role=brain wall_ms=1784269116976 mono_ms=3874847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19218│CONN_LIFECYCLE: conn=7947 role=brain wall_ms=1784269116976 mono_ms=3874847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19219│CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19220│CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19221│CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=stream-sub-attach stream=3677 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19222│CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19223│CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19224│CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19225│CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19226│CONN_LIFECYCLE: conn=7951 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19227│CONN_LIFECYCLE: conn=7952 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19228│CONN_LIFECYCLE: conn=7953 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19229│CONN_LIFECYCLE: conn=7951 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19230│CONN_LIFECYCLE: conn=7952 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19231│CONN_LIFECYCLE: conn=7953 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19232│CONN_LIFECYCLE: conn=7954 role=brain wall_ms=1784269117611 mono_ms=3875481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19233│CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117611 mono_ms=3875481 event=stream-sub-attach stream=3680 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19234│CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19235│CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19236│CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19237│CONN_LIFECYCLE: conn=7955 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19238│CONN_LIFECYCLE: conn=7956 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19239│CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3679 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19240│CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3678 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19241│CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19242│CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19243│CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19244│CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117643 mono_ms=3875513 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19245│CONN_LIFECYCLE: conn=7959 role=brain wall_ms=1784269117643 mono_ms=3875513 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19246│CONN_LIFECYCLE: conn=7959 role=brain wall_ms=1784269117643 mono_ms=3875514 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19247│CONN_LIFECYCLE: conn=7960 role=brain wall_ms=1784269122022 mono_ms=3879893 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19248│CONN_LIFECYCLE: conn=7960 role=brain wall_ms=1784269122022 mono_ms=3879893 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19249│CONN_LIFECYCLE: conn=7961 role=brain wall_ms=1784269122046 mono_ms=3879916 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19250│CONN_LIFECYCLE: conn=7961 role=brain wall_ms=1784269122046 mono_ms=3879916 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19251│CONN_LIFECYCLE: conn=7962 role=brain wall_ms=1784269122047 mono_ms=3879917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19252│CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122047 mono_ms=3879918 event=stream-sub-attach stream=3681 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19253│CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122058 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19254│CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122058 mono_ms=3879929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19255│CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122059 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19256│CONN_LIFECYCLE: conn=7964 role=brain wall_ms=1784269127064 mono_ms=3884934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19257│CONN_LIFECYCLE: conn=7964 role=brain wall_ms=1784269127064 mono_ms=3884934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19258│CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19259│CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19260│CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=stream-sub-attach stream=3682 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19261│CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19262│CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19263│CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19264│CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19265│CONN_LIFECYCLE: conn=7968 role=brain wall_ms=1784269129057 mono_ms=3886927 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19266│CONN_LIFECYCLE: conn=7968 role=brain wall_ms=1784269129057 mono_ms=3886927 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19267│CONN_LIFECYCLE: conn=7969 role=brain wall_ms=1784269129058 mono_ms=3886928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19268│CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129058 mono_ms=3886928 event=stream-sub-attach stream=3688 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19269│CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19270│CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19271│CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19272│CONN_LIFECYCLE: conn=7971 role=brain wall_ms=1784269129779 mono_ms=3887649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19273│CONN_LIFECYCLE: conn=7972 role=brain wall_ms=1784269129779 mono_ms=3887649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19274│CONN_LIFECYCLE: conn=7971 role=brain wall_ms=1784269129779 mono_ms=3887649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19275│CONN_LIFECYCLE: conn=7972 role=brain wall_ms=1784269129779 mono_ms=3887649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19276│CONN_LIFECYCLE: conn=7974 role=brain wall_ms=1784269129780 mono_ms=3887650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19277│CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129780 mono_ms=3887650 event=stream-sub-attach stream=3690 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19278│CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19279│CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19280│CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19281│CONN_LIFECYCLE: conn=7973 role=brain wall_ms=1784269129783 mono_ms=3887653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19282│CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129783 mono_ms=3887653 event=stream-sub-attach stream=3689 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19283│CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19284│CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19285│CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19286│CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19287│CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19288│CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=stream-sub-attach stream=3691 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19289│CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19290│CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19291│CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130398 mono_ms=3888269 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19292│CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130399 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19293│CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19294│CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19295│CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888474 event=stream-sub-attach stream=3692 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19296│CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19297│CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19298│CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19299│CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19300│CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19301│CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19302│CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130810 mono_ms=3888681 event=stream-sub-attach stream=3693 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19303│CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19304│CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19305│CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19306│CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19307│CONN_LIFECYCLE: conn=7986 role=brain wall_ms=1784269132106 mono_ms=3889977 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19308│CONN_LIFECYCLE: conn=7986 role=brain wall_ms=1784269132106 mono_ms=3889977 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19309│CONN_LIFECYCLE: conn=7987 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19310│CONN_LIFECYCLE: conn=7987 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19311│CONN_LIFECYCLE: conn=7988 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19312│CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19313│CONN_LIFECYCLE: conn=7988 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19314│CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19315│CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3694 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19316│CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3695 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19317│CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3696 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19320│CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19321│CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133811 mono_ms=3891682 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19322│CONN_LIFECYCLE: conn=7993 role=brain wall_ms=1784269133811 mono_ms=3891682 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19323│CONN_LIFECYCLE: conn=7993 role=brain wall_ms=1784269133812 mono_ms=3891682 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19324│CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133813 mono_ms=3891683 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19325│CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133814 mono_ms=3891685 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19326│CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133815 mono_ms=3891685 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19327│CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133815 mono_ms=3891686 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19328│CONN_LIFECYCLE: conn=7995 role=brain wall_ms=1784269133815 mono_ms=3891686 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19329│CONN_LIFECYCLE: conn=7995 role=brain wall_ms=1784269133815 mono_ms=3891686 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19330│CONN_LIFECYCLE: conn=7996 role=brain wall_ms=1784269133906 mono_ms=3891776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19331│CONN_LIFECYCLE: conn=7998 role=brain wall_ms=1784269133906 mono_ms=3891776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19332│CONN_LIFECYCLE: conn=7997 role=brain wall_ms=1784269133906 mono_ms=3891776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19333│CONN_LIFECYCLE: conn=7996 role=brain wall_ms=1784269133906 mono_ms=3891776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19334│CONN_LIFECYCLE: conn=7998 role=brain wall_ms=1784269133906 mono_ms=3891776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19335│CONN_LIFECYCLE: conn=7997 role=brain wall_ms=1784269133906 mono_ms=3891776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19336│CONN_LIFECYCLE: conn=8001 role=brain wall_ms=1784269133908 mono_ms=3891778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19337│CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133908 mono_ms=3891778 event=stream-sub-attach stream=3698 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19338│CONN_LIFECYCLE: conn=8001 role=brain stream-subscriber stream=3698 wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19339│CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19340│CONN_LIFECYCLE: conn=8002 role=brain wall_ms=1784269133910 mono_ms=3891780 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19341│CONN_LIFECYCLE: conn=8000 role=brain wall_ms=1784269133920 mono_ms=3891790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19342│CONN_LIFECYCLE: conn=7999 role=brain wall_ms=1784269133920 mono_ms=3891790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19343│CONN_LIFECYCLE: conn=8000 role=brain stream-subscriber stream=3697 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3697 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19344│CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133920 mono_ms=3891790 event=stream-sub-attach stream=3699 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19345│CONN_LIFECYCLE: conn=7999 role=brain stream-subscriber stream=3699 wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19346│CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19347│CONN_LIFECYCLE: conn=8003 role=brain wall_ms=1784269133925 mono_ms=3891796 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19348│CONN_LIFECYCLE: conn=8000 role=brain stream-subscriber stream=3697 wall_ms=1784269133930 mono_ms=3891800 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19349│CONN_LIFECYCLE: conn=8004 role=brain wall_ms=1784269133930 mono_ms=3891801 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19350│CONN_LIFECYCLE: conn=8004 role=brain wall_ms=1784269133930 mono_ms=3891801 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19351│CONN_LIFECYCLE: conn=8005 role=brain wall_ms=1784269134833 mono_ms=3892704 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19352│CONN_LIFECYCLE: conn=8005 role=brain wall_ms=1784269134833 mono_ms=3892704 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19353│CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=stream-sub-attach stream=3700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19354│CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134834 mono_ms=3892704 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19355│CONN_LIFECYCLE: conn=8006 role=brain stream-subscriber stream=3700 wall_ms=1784269134838 mono_ms=3892708 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19356│CONN_LIFECYCLE: conn=8007 role=brain wall_ms=1784269134838 mono_ms=3892708 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19357│CONN_LIFECYCLE: conn=8007 role=brain wall_ms=1784269134838 mono_ms=3892708 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19358│CONN_LIFECYCLE: conn=8008 role=brain wall_ms=1784269136999 mono_ms=3894870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19359│CONN_LIFECYCLE: conn=8008 role=brain wall_ms=1784269137000 mono_ms=3894870 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19360│CONN_LIFECYCLE: conn=8009 role=brain wall_ms=1784269137001 mono_ms=3894871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19361│CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137001 mono_ms=3894871 event=stream-sub-attach stream=3701 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19362│CONN_LIFECYCLE: conn=8009 role=brain stream-subscriber stream=3701 wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19363│CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19364│CONN_LIFECYCLE: conn=8010 role=brain wall_ms=1784269137070 mono_ms=3894940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19365│CONN_LIFECYCLE: conn=8011 role=brain wall_ms=1784269137152 mono_ms=3895022 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19366│CONN_LIFECYCLE: conn=8011 role=brain wall_ms=1784269137152 mono_ms=3895022 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19367│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19368│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19369│PAIR_MEET_UP:BIGNET step=59475638 id=c90c48670d8b775ae979da92f86b556fa5af12d7f54a0b24b3fd872660a55a21 addr=EndpointAddr { id: PublicKey(c90c48670d8b775ae979da92f86b556fa5af12d7f54a0b24b3fd872660a55a21), addrs: {Ip(100.68.35.65:57473), Ip(192.168.1.81:57473)} }\n      │...\n 19371│CONN_LIFECYCLE: conn=8012 role=brain wall_ms=1784269142195 mono_ms=3900065 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19372│CONN_LIFECYCLE: conn=8012 role=brain wall_ms=1784269142195 mono_ms=3900065 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19373│CONN_LIFECYCLE: conn=8013 role=brain wall_ms=1784269144114 mono_ms=3901985 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19374│CONN_LIFECYCLE: conn=8013 role=brain wall_ms=1784269144115 mono_ms=3901985 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19375│CONN_LIFECYCLE: conn=8014 role=brain wall_ms=1784269144116 mono_ms=3901986 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19376│CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144116 mono_ms=3901986 event=stream-sub-attach stream=3702 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19377│CONN_LIFECYCLE: conn=8014 role=brain stream-subscriber stream=3702 wall_ms=1784269144118 mono_ms=3901988 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19378│CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19379│CONN_LIFECYCLE: conn=8015 role=brain wall_ms=1784269144118 mono_ms=3901989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19380│CONN_LIFECYCLE: conn=8016 role=brain wall_ms=1784269146899 mono_ms=3904769 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19381│CONN_LIFECYCLE: conn=8016 role=brain wall_ms=1784269146899 mono_ms=3904769 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19382│CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904769 event=stream-sub-attach stream=3703 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19383│CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19384│CONN_LIFECYCLE: conn=8017 role=brain stream-subscriber stream=3703 wall_ms=1784269146899 mono_ms=3904770 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19385│CONN_LIFECYCLE: conn=8018 role=brain wall_ms=1784269146900 mono_ms=3904770 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19386│CONN_LIFECYCLE: conn=8018 role=brain wall_ms=1784269146900 mono_ms=3904770 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19387│CONN_LIFECYCLE: conn=8019 role=brain wall_ms=1784269147105 mono_ms=3904975 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19388│CONN_LIFECYCLE: conn=8020 role=brain wall_ms=1784269147105 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19389│CONN_LIFECYCLE: conn=8019 role=brain wall_ms=1784269147105 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19390│CONN_LIFECYCLE: conn=8020 role=brain wall_ms=1784269147105 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19391│CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3705 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19392│CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19393│CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=stream-sub-attach stream=3704 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19394│CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19395│CONN_LIFECYCLE: conn=8021 role=brain stream-subscriber stream=3704 wall_ms=1784269147106 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19396│CONN_LIFECYCLE: conn=8023 role=brain wall_ms=1784269147106 mono_ms=3904976 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19397│CONN_LIFECYCLE: conn=8023 role=brain wall_ms=1784269147106 mono_ms=3904976 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19398│CONN_LIFECYCLE: conn=8024 role=brain wall_ms=1784269147237 mono_ms=3905107 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19399│CONN_LIFECYCLE: conn=8024 role=brain wall_ms=1784269147237 mono_ms=3905107 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19400│CONN_LIFECYCLE: conn=8025 role=brain wall_ms=1784269152163 mono_ms=3910033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19401│CONN_LIFECYCLE: conn=8025 role=brain wall_ms=1784269152163 mono_ms=3910033 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19402│CONN_LIFECYCLE: conn=8026 role=brain wall_ms=1784269152164 mono_ms=3910034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19403│CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152164 mono_ms=3910034 event=stream-sub-attach stream=3706 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19404│CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19405│CONN_LIFECYCLE: conn=8027 role=brain wall_ms=1784269152279 mono_ms=3910150 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19406│CONN_LIFECYCLE: conn=8026 role=brain stream-subscriber stream=3706 wall_ms=1784269152289 mono_ms=3910159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19407│CONN_LIFECYCLE: conn=8028 role=brain wall_ms=1784269152289 mono_ms=3910159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19408│CONN_LIFECYCLE: conn=8028 role=brain wall_ms=1784269152289 mono_ms=3910159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19409│CONN_LIFECYCLE: conn=8029 role=brain wall_ms=1784269157324 mono_ms=3915194 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19410│CONN_LIFECYCLE: conn=8029 role=brain wall_ms=1784269157324 mono_ms=3915194 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19411│CONN_LIFECYCLE: conn=8030 role=brain wall_ms=1784269158974 mono_ms=3916845 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19412│CONN_LIFECYCLE: conn=8031 role=brain wall_ms=1784269158974 mono_ms=3916845 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19413│CONN_LIFECYCLE: conn=8030 role=brain wall_ms=1784269158974 mono_ms=3916845 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19414│CONN_LIFECYCLE: conn=8031 role=brain wall_ms=1784269158974 mono_ms=3916845 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19415│CONN_LIFECYCLE: conn=8033 role=brain wall_ms=1784269158976 mono_ms=3916846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19416│CONN_LIFECYCLE: conn=8033 role=brain stream-subscriber stream=3707 wall_ms=1784269158976 mono_ms=3916846 event=stream-sub-attach stream=3707 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19417│CONN_LIFECYCLE: conn=8032 role=brain wall_ms=1784269158978 mono_ms=3916848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19418│CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158978 mono_ms=3916848 event=stream-sub-attach stream=3709 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19419│CONN_LIFECYCLE: conn=8032 role=brain stream-subscriber stream=3709 wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19420│CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19421│CONN_LIFECYCLE: conn=8034 role=brain wall_ms=1784269158984 mono_ms=3916854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19422│CONN_LIFECYCLE: conn=8033 role=brain stream-subscriber stream=3707 wall_ms=1784269158986 mono_ms=3916856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19423│CONN_LIFECYCLE: conn=8035 role=brain wall_ms=1784269158986 mono_ms=3916856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19424│CONN_LIFECYCLE: conn=8035 role=brain wall_ms=1784269158986 mono_ms=3916857 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19425│CONN_LIFECYCLE: conn=8036 role=brain wall_ms=1784269159078 mono_ms=3916948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19426│CONN_LIFECYCLE: conn=8036 role=brain wall_ms=1784269159078 mono_ms=3916948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19427│CONN_LIFECYCLE: conn=8037 role=brain wall_ms=1784269159079 mono_ms=3916949 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19428│CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159079 mono_ms=3916949 event=stream-sub-attach stream=3708 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19429│CONN_LIFECYCLE: conn=8037 role=brain stream-subscriber stream=3708 wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19430│CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19431│CONN_LIFECYCLE: conn=8038 role=brain wall_ms=1784269159081 mono_ms=3916952 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19432│CONN_LIFECYCLE: conn=8039 role=brain wall_ms=1784269159181 mono_ms=3917051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19433│CONN_LIFECYCLE: conn=8039 role=brain wall_ms=1784269159181 mono_ms=3917051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19434│CONN_LIFECYCLE: conn=8040 role=brain wall_ms=1784269159182 mono_ms=3917053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19435│CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159182 mono_ms=3917053 event=stream-sub-attach stream=3710 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19436│CONN_LIFECYCLE: conn=8040 role=brain stream-subscriber stream=3710 wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19437│CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19438│CONN_LIFECYCLE: conn=8041 role=brain wall_ms=1784269159185 mono_ms=3917055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19439│CONN_LIFECYCLE: conn=8022 role=brain stream-subscriber stream=3705 wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19440│CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19441│CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19442│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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19443│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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19444│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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19447│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19448│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449│CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19450│CONN_LIFECYCLE: conn=8045 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19451│CONN_LIFECYCLE: conn=8046 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19452│CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19453│CONN_LIFECYCLE: conn=8045 role=brain wall_ms=1784269165372 mono_ms=3923243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19454│CONN_LIFECYCLE: conn=8046 role=brain wall_ms=1784269165372 mono_ms=3923243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19455│CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3726 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19456│CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165373 mono_ms=3923243 event=stream-sub-attach stream=3728 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19457│CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165373 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19460│CONN_LIFECYCLE: conn=8049 role=brain stream-subscriber stream=3730 wall_ms=1784269165374 mono_ms=3923244 event=stream-sub-attach stream=3730 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19461│CONN_LIFECYCLE: conn=8048 role=brain stream-subscriber stream=3728 wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19462│CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19463│CONN_LIFECYCLE: conn=8050 role=brain wall_ms=1784269165380 mono_ms=3923250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19464│CONN_LIFECYCLE: conn=8047 role=brain stream-subscriber stream=3726 wall_ms=1784269165382 mono_ms=3923252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19465│CONN_LIFECYCLE: conn=8051 role=brain wall_ms=1784269165382 mono_ms=3923252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19466│CONN_LIFECYCLE: conn=8051 role=brain wall_ms=1784269165382 mono_ms=3923252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19467│CONN_LIFECYCLE: conn=8049 role=brain stream-subscriber stream=3730 wall_ms=1784269165392 mono_ms=3923262 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19468│CONN_LIFECYCLE: conn=8052 role=brain wall_ms=1784269165392 mono_ms=3923262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19469│CONN_LIFECYCLE: conn=8052 role=brain wall_ms=1784269165392 mono_ms=3923262 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19470│CONN_LIFECYCLE: conn=8053 role=brain wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19471│CONN_LIFECYCLE: conn=8054 role=brain wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19472│CONN_LIFECYCLE: conn=8055 role=brain wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19473│CONN_LIFECYCLE: conn=8053 role=brain wall_ms=1784269165476 mono_ms=3923346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19474│CONN_LIFECYCLE: conn=8054 role=brain wall_ms=1784269165476 mono_ms=3923346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19475│CONN_LIFECYCLE: conn=8055 role=brain wall_ms=1784269165476 mono_ms=3923346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19476│CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3729 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19477│CONN_LIFECYCLE: conn=8058 role=brain stream-subscriber stream=3731 wall_ms=1784269165476 mono_ms=3923346 event=stream-sub-attach stream=3731 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19478│CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165476 mono_ms=3923346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19481│CONN_LIFECYCLE: conn=8057 role=brain stream-subscriber stream=3732 wall_ms=1784269165477 mono_ms=3923347 event=stream-sub-attach stream=3732 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19482│CONN_LIFECYCLE: conn=8056 role=brain stream-subscriber stream=3729 wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19483│CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19484│CONN_LIFECYCLE: conn=8059 role=brain wall_ms=1784269165481 mono_ms=3923351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncation":{"content":"*19000|CONN_LIFECYCLE: conn=7858 role=brain wall_ms=1784269079966 mono_ms=3837836 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19001|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19002|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19003|PAIR_MEET_UP:SPT_DEV step=59475636 id=c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89 addr=EndpointAddr { id: PublicKey(c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89), addrs: {Ip(100.68.35.65:51511), Ip(192.168.1.81:51511)} }\n...\n 19005|CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19006|CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19007|CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841751 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19008|CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19009|CONN_LIFECYCLE: conn=7861 role=brain wall_ms=1784269083882 mono_ms=3841753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19010|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083882 mono_ms=3841753 event=stream-sub-attach stream=3635 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19011|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19012|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19013|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19014|CONN_LIFECYCLE: conn=7863 role=brain wall_ms=1784269084498 mono_ms=3842369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19015|CONN_LIFECYCLE: conn=7864 role=brain wall_ms=1784269084498 mono_ms=3842369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19016|CONN_LIFECYCLE: conn=7863 role=brain wall_ms=1784269084498 mono_ms=3842369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19017|CONN_LIFECYCLE: conn=7864 role=brain wall_ms=1784269084498 mono_ms=3842369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19018|CONN_LIFECYCLE: conn=7866 role=brain wall_ms=1784269084500 mono_ms=3842370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19019|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084500 mono_ms=3842370 event=stream-sub-attach stream=3636 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19020|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084504 mono_ms=3842374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19021|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19022|CONN_LIFECYCLE: conn=7867 role=brain wall_ms=1784269084504 mono_ms=3842375 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19023|CONN_LIFECYCLE: conn=7865 role=brain wall_ms=1784269084515 mono_ms=3842386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19024|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084515 mono_ms=3842386 event=stream-sub-attach stream=3637 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19025|CONN_LIFECYCLE: conn=7865 role=brain stream-subscriber stream=3637 wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19026|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19027|CONN_LIFECYCLE: conn=7868 role=brain wall_ms=1784269084517 mono_ms=3842388 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19028|CONN_LIFECYCLE: conn=7869 role=brain wall_ms=1784269084910 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19029|CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19030|CONN_LIFECYCLE: conn=7869 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19031|CONN_LIFECYCLE: conn=7870 role=brain wall_ms=1784269084910 mono_ms=3842781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19032|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3639 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19033|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=stream-sub-attach stream=3638 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19034|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19035|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084911 mono_ms=3842781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19036|CONN_LIFECYCLE: conn=7872 role=brain stream-subscriber stream=3638 wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19037|CONN_LIFECYCLE: conn=7873 role=brain wall_ms=1784269084918 mono_ms=3842788 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19038|CONN_LIFECYCLE: conn=7873 role=brain wall_ms=1784269084918 mono_ms=3842788 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19039|CONN_LIFECYCLE: conn=7871 role=brain stream-subscriber stream=3639 wall_ms=1784269084920 mono_ms=3842790 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19040|CONN_LIFECYCLE: conn=7874 role=brain wall_ms=1784269084920 mono_ms=3842790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19041|CONN_LIFECYCLE: conn=7874 role=brain wall_ms=1784269084920 mono_ms=3842791 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19042|CONN_LIFECYCLE: conn=7875 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19043|CONN_LIFECYCLE: conn=7876 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19044|CONN_LIFECYCLE: conn=7875 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19045|CONN_LIFECYCLE: conn=7877 role=brain wall_ms=1784269086250 mono_ms=3844121 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19046|CONN_LIFECYCLE: conn=7876 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19047|CONN_LIFECYCLE: conn=7877 role=brain wall_ms=1784269086250 mono_ms=3844121 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19048|CONN_LIFECYCLE: conn=7879 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19049|CONN_LIFECYCLE: conn=7878 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19050|CONN_LIFECYCLE: conn=7880 role=brain wall_ms=1784269086252 mono_ms=3844122 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19053|CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086252 mono_ms=3844122 event=stream-sub-attach stream=3641 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19054|CONN_LIFECYCLE: conn=7880 role=brain stream-subscriber stream=3642 wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19055|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19056|CONN_LIFECYCLE: conn=7881 role=brain wall_ms=1784269086257 mono_ms=3844127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19057|CONN_LIFECYCLE: conn=7878 role=brain stream-subscriber stream=3641 wall_ms=1784269086259 mono_ms=3844129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19058|CONN_LIFECYCLE: conn=7882 role=brain wall_ms=1784269086259 mono_ms=3844129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19059|CONN_LIFECYCLE: conn=7882 role=brain wall_ms=1784269086259 mono_ms=3844130 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19060|CONN_LIFECYCLE: conn=7879 role=brain stream-subscriber stream=3640 wall_ms=1784269086262 mono_ms=3844132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19061|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19067|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19068|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=stream-sub-attach stream=3644 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19069|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086870 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19070|CONN_LIFECYCLE: conn=7886 role=brain stream-subscriber stream=3644 wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19071|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19073|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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19074|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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19075|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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19077|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19078|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19080|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19081|CONN_LIFECYCLE: conn=7890 role=brain wall_ms=1784269091924 mono_ms=3849795 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19082|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269091925 mono_ms=3849795 event=stream-sub-attach stream=3649 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19083|CONN_LIFECYCLE: conn=7890 role=brain stream-subscriber stream=3649 wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19084|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19085|CONN_LIFECYCLE: conn=7891 role=brain wall_ms=1784269092003 mono_ms=3849873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19086|CONN_LIFECYCLE: conn=7892 role=brain wall_ms=1784269096804 mono_ms=3854674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19087|CONN_LIFECYCLE: conn=7892 role=brain wall_ms=1784269096804 mono_ms=3854674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19088|CONN_LIFECYCLE: conn=7893 role=brain wall_ms=1784269098936 mono_ms=3856807 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19089|CONN_LIFECYCLE: conn=7893 role=brain wall_ms=1784269098936 mono_ms=3856807 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19090|CONN_LIFECYCLE: conn=7894 role=brain wall_ms=1784269098937 mono_ms=3856808 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19091|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098937 mono_ms=3856808 event=stream-sub-attach stream=3650 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19092|CONN_LIFECYCLE: conn=7894 role=brain stream-subscriber stream=3650 wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19093|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19094|CONN_LIFECYCLE: conn=7895 role=brain wall_ms=1784269098940 mono_ms=3856810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19095|CONN_LIFECYCLE: conn=7896 role=brain wall_ms=1784269099658 mono_ms=3857529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19096|CONN_LIFECYCLE: conn=7897 role=brain wall_ms=1784269099658 mono_ms=3857529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19097|CONN_LIFECYCLE: conn=7897 role=brain wall_ms=1784269099658 mono_ms=3857529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19098|CONN_LIFECYCLE: conn=7896 role=brain wall_ms=1784269099658 mono_ms=3857529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19099|CONN_LIFECYCLE: conn=7899 role=brain wall_ms=1784269099660 mono_ms=3857530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19100|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099660 mono_ms=3857530 event=stream-sub-attach stream=3652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19101|CONN_LIFECYCLE: conn=7899 role=brain stream-subscriber stream=3652 wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19102|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19103|CONN_LIFECYCLE: conn=7900 role=brain wall_ms=1784269099662 mono_ms=3857532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19104|CONN_LIFECYCLE: conn=7898 role=brain wall_ms=1784269099671 mono_ms=3857541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19105|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099671 mono_ms=3857541 event=stream-sub-attach stream=3651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19106|CONN_LIFECYCLE: conn=7898 role=brain stream-subscriber stream=3651 wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19107|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19108|CONN_LIFECYCLE: conn=7901 role=brain wall_ms=1784269099675 mono_ms=3857546 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19109|CONN_LIFECYCLE: conn=7902 role=brain wall_ms=1784269101845 mono_ms=3859716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19110|CONN_LIFECYCLE: conn=7902 role=brain wall_ms=1784269101846 mono_ms=3859716 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19111|CONN_LIFECYCLE: conn=7903 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19112|CONN_LIFECYCLE: conn=7905 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19113|CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19114|CONN_LIFECYCLE: conn=7903 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19115|CONN_LIFECYCLE: conn=7905 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19116|CONN_LIFECYCLE: conn=7904 role=brain wall_ms=1784269102443 mono_ms=3860313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19117|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19118|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3655 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19119|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269102443 mono_ms=3860314 event=stream-sub-attach stream=3654 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19123|CONN_LIFECYCLE: conn=7909 role=brain wall_ms=1784269106891 mono_ms=3864761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19124|CONN_LIFECYCLE: conn=7909 role=brain wall_ms=1784269106891 mono_ms=3864762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19125|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19126|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 19127|PAIR_MEET_UP:SPT_DEV step=59475637 id=f940429251e824c02cbb6c48b44f9ce877b5b251c34f3b4d61fec70efd648a5c addr=EndpointAddr { id: PublicKey(f940429251e824c02cbb6c48b44f9ce877b5b251c34f3b4d61fec70efd648a5c), addrs: {Ip(100.68.35.65:57656), Ip(192.168.1.81:57656)} }\n...\n 19129|CONN_LIFECYCLE: conn=7910 role=brain wall_ms=1784269111933 mono_ms=3869803 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19130|CONN_LIFECYCLE: conn=7910 role=brain wall_ms=1784269111933 mono_ms=3869803 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19131|CONN_LIFECYCLE: conn=7907 role=brain stream-subscriber stream=3655 wall_ms=1784269113540 mono_ms=3871410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19132|CONN_LIFECYCLE: conn=7911 role=brain wall_ms=1784269113540 mono_ms=3871411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19133|CONN_LIFECYCLE: conn=7911 role=brain wall_ms=1784269113540 mono_ms=3871411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19134|CONN_LIFECYCLE: conn=7908 role=brain stream-subscriber stream=3654 wall_ms=1784269113548 mono_ms=3871418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19135|CONN_LIFECYCLE: conn=7912 role=brain wall_ms=1784269113548 mono_ms=3871418 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19136|CONN_LIFECYCLE: conn=7912 role=brain wall_ms=1784269113548 mono_ms=3871418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19137|CONN_LIFECYCLE: conn=7906 role=brain stream-subscriber stream=3653 wall_ms=1784269113549 mono_ms=3871420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19138|CONN_LIFECYCLE: conn=7913 role=brain wall_ms=1784269113549 mono_ms=3871420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19139|CONN_LIFECYCLE: conn=7913 role=brain wall_ms=1784269113550 mono_ms=3871420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19140|CONN_LIFECYCLE: conn=7914 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19141|CONN_LIFECYCLE: conn=7916 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19142|CONN_LIFECYCLE: conn=7915 role=brain wall_ms=1784269113586 mono_ms=3871456 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19143|CONN_LIFECYCLE: conn=7914 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19144|CONN_LIFECYCLE: conn=7915 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19145|CONN_LIFECYCLE: conn=7916 role=brain wall_ms=1784269113586 mono_ms=3871456 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19146|CONN_LIFECYCLE: conn=7919 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19147|CONN_LIFECYCLE: conn=7917 role=brain wall_ms=1784269113587 mono_ms=3871458 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19148|CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3660 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19149|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113587 mono_ms=3871458 event=stream-sub-attach stream=3657 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19150|CONN_LIFECYCLE: conn=7917 role=brain stream-subscriber stream=3657 wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19151|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19152|CONN_LIFECYCLE: conn=7920 role=brain wall_ms=1784269113590 mono_ms=3871460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19153|CONN_LIFECYCLE: conn=7918 role=brain wall_ms=1784269113596 mono_ms=3871466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19154|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113596 mono_ms=3871466 event=stream-sub-attach stream=3658 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19155|CONN_LIFECYCLE: conn=7918 role=brain stream-subscriber stream=3658 wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19156|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19157|CONN_LIFECYCLE: conn=7921 role=brain wall_ms=1784269113601 mono_ms=3871471 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19158|CONN_LIFECYCLE: conn=7919 role=brain stream-subscriber stream=3660 wall_ms=1784269113604 mono_ms=3871474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19159|CONN_LIFECYCLE: conn=7922 role=brain wall_ms=1784269113604 mono_ms=3871474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19160|CONN_LIFECYCLE: conn=7922 role=brain wall_ms=1784269113604 mono_ms=3871474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19161|CONN_LIFECYCLE: conn=7923 role=brain wall_ms=1784269113689 mono_ms=3871559 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19162|CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871559 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19163|CONN_LIFECYCLE: conn=7923 role=brain wall_ms=1784269113689 mono_ms=3871559 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19164|CONN_LIFECYCLE: conn=7924 role=brain wall_ms=1784269113689 mono_ms=3871560 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19165|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=stream-sub-attach stream=3659 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19166|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113689 mono_ms=3871560 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19167|CONN_LIFECYCLE: conn=7925 role=brain wall_ms=1784269113690 mono_ms=3871561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19168|CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113690 mono_ms=3871561 event=stream-sub-attach stream=3656 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19169|CONN_LIFECYCLE: conn=7926 role=brain stream-subscriber stream=3659 wall_ms=1784269113694 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19170|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19171|CONN_LIFECYCLE: conn=7927 role=brain wall_ms=1784269113695 mono_ms=3871565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19172|CONN_LIFECYCLE: conn=7925 role=brain stream-subscriber stream=3656 wall_ms=1784269113709 mono_ms=3871579 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19173|CONN_LIFECYCLE: conn=7928 role=brain wall_ms=1784269113709 mono_ms=3871579 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19174|CONN_LIFECYCLE: conn=7928 role=brain wall_ms=1784269113709 mono_ms=3871579 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19175|CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19176|CONN_LIFECYCLE: conn=7929 role=brain wall_ms=1784269113895 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19177|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=stream-sub-attach stream=3671 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19178|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19179|CONN_LIFECYCLE: conn=7930 role=brain stream-subscriber stream=3671 wall_ms=1784269113896 mono_ms=3871766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19180|CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19181|CONN_LIFECYCLE: conn=7931 role=brain wall_ms=1784269113896 mono_ms=3871767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19182|CONN_LIFECYCLE: conn=7932 role=brain wall_ms=1784269113998 mono_ms=3871869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19183|CONN_LIFECYCLE: conn=7932 role=brain wall_ms=1784269113999 mono_ms=3871869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19184|CONN_LIFECYCLE: conn=7933 role=brain wall_ms=1784269114000 mono_ms=3871870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19185|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114000 mono_ms=3871870 event=stream-sub-attach stream=3672 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19186|CONN_LIFECYCLE: conn=7933 role=brain stream-subscriber stream=3672 wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19187|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19188|CONN_LIFECYCLE: conn=7934 role=brain wall_ms=1784269114003 mono_ms=3871873 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19189|CONN_LIFECYCLE: conn=7935 role=brain wall_ms=1784269114618 mono_ms=3872488 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19190|CONN_LIFECYCLE: conn=7936 role=brain wall_ms=1784269114618 mono_ms=3872488 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19191|CONN_LIFECYCLE: conn=7936 role=brain wall_ms=1784269114618 mono_ms=3872488 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19192|CONN_LIFECYCLE: conn=7935 role=brain wall_ms=1784269114618 mono_ms=3872488 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19193|CONN_LIFECYCLE: conn=7938 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19194|CONN_LIFECYCLE: conn=7937 role=brain wall_ms=1784269114619 mono_ms=3872489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19195|CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3673 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19196|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114619 mono_ms=3872489 event=stream-sub-attach stream=3674 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19197|CONN_LIFECYCLE: conn=7937 role=brain stream-subscriber stream=3674 wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19198|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19199|CONN_LIFECYCLE: conn=7939 role=brain wall_ms=1784269114621 mono_ms=3872491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19200|CONN_LIFECYCLE: conn=7938 role=brain stream-subscriber stream=3673 wall_ms=1784269114631 mono_ms=3872502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19201|CONN_LIFECYCLE: conn=7940 role=brain wall_ms=1784269114631 mono_ms=3872502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19202|CONN_LIFECYCLE: conn=7940 role=brain wall_ms=1784269114631 mono_ms=3872502 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19203|CONN_LIFECYCLE: conn=7941 role=brain wall_ms=1784269115134 mono_ms=3873004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19204|CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19205|CONN_LIFECYCLE: conn=7941 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19206|CONN_LIFECYCLE: conn=7942 role=brain wall_ms=1784269115134 mono_ms=3873005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19207|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3675 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19208|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115134 mono_ms=3873005 event=stream-sub-attach stream=3676 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19209|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19210|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115135 mono_ms=3873005 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19211|CONN_LIFECYCLE: conn=7944 role=brain stream-subscriber stream=3675 wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19212|CONN_LIFECYCLE: conn=7945 role=brain wall_ms=1784269115139 mono_ms=3873009 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19213|CONN_LIFECYCLE: conn=7945 role=brain wall_ms=1784269115139 mono_ms=3873009 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19214|CONN_LIFECYCLE: conn=7943 role=brain stream-subscriber stream=3676 wall_ms=1784269115143 mono_ms=3873013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19215|CONN_LIFECYCLE: conn=7946 role=brain wall_ms=1784269115143 mono_ms=3873013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19216|CONN_LIFECYCLE: conn=7946 role=brain wall_ms=1784269115143 mono_ms=3873013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19217|CONN_LIFECYCLE: conn=7947 role=brain wall_ms=1784269116976 mono_ms=3874847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19218|CONN_LIFECYCLE: conn=7947 role=brain wall_ms=1784269116976 mono_ms=3874847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19219|CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19220|CONN_LIFECYCLE: conn=7948 role=brain wall_ms=1784269116991 mono_ms=3874861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19221|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=stream-sub-attach stream=3677 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19222|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116991 mono_ms=3874861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19223|CONN_LIFECYCLE: conn=7949 role=brain stream-subscriber stream=3677 wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19224|CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19225|CONN_LIFECYCLE: conn=7950 role=brain wall_ms=1784269116998 mono_ms=3874869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19226|CONN_LIFECYCLE: conn=7951 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19227|CONN_LIFECYCLE: conn=7952 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19228|CONN_LIFECYCLE: conn=7953 role=brain wall_ms=1784269117609 mono_ms=3875479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19229|CONN_LIFECYCLE: conn=7951 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19230|CONN_LIFECYCLE: conn=7952 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19231|CONN_LIFECYCLE: conn=7953 role=brain wall_ms=1784269117609 mono_ms=3875479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19232|CONN_LIFECYCLE: conn=7954 role=brain wall_ms=1784269117611 mono_ms=3875481 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19233|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117611 mono_ms=3875481 event=stream-sub-attach stream=3680 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19234|CONN_LIFECYCLE: conn=7954 role=brain stream-subscriber stream=3680 wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19235|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19236|CONN_LIFECYCLE: conn=7957 role=brain wall_ms=1784269117616 mono_ms=3875486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19237|CONN_LIFECYCLE: conn=7955 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19238|CONN_LIFECYCLE: conn=7956 role=brain wall_ms=1784269117619 mono_ms=3875489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19239|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3679 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19240|CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117619 mono_ms=3875490 event=stream-sub-attach stream=3678 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19241|CONN_LIFECYCLE: conn=7955 role=brain stream-subscriber stream=3679 wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19242|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19243|CONN_LIFECYCLE: conn=7958 role=brain wall_ms=1784269117621 mono_ms=3875492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19244|CONN_LIFECYCLE: conn=7956 role=brain stream-subscriber stream=3678 wall_ms=1784269117643 mono_ms=3875513 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19245|CONN_LIFECYCLE: conn=7959 role=brain wall_ms=1784269117643 mono_ms=3875513 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19246|CONN_LIFECYCLE: conn=7959 role=brain wall_ms=1784269117643 mono_ms=3875514 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19247|CONN_LIFECYCLE: conn=7960 role=brain wall_ms=1784269122022 mono_ms=3879893 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19248|CONN_LIFECYCLE: conn=7960 role=brain wall_ms=1784269122022 mono_ms=3879893 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19249|CONN_LIFECYCLE: conn=7961 role=brain wall_ms=1784269122046 mono_ms=3879916 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19250|CONN_LIFECYCLE: conn=7961 role=brain wall_ms=1784269122046 mono_ms=3879916 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19251|CONN_LIFECYCLE: conn=7962 role=brain wall_ms=1784269122047 mono_ms=3879917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19252|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122047 mono_ms=3879918 event=stream-sub-attach stream=3681 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19253|CONN_LIFECYCLE: conn=7962 role=brain stream-subscriber stream=3681 wall_ms=1784269122058 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19254|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122058 mono_ms=3879929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19255|CONN_LIFECYCLE: conn=7963 role=brain wall_ms=1784269122059 mono_ms=3879929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19256|CONN_LIFECYCLE: conn=7964 role=brain wall_ms=1784269127064 mono_ms=3884934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19257|CONN_LIFECYCLE: conn=7964 role=brain wall_ms=1784269127064 mono_ms=3884934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19258|CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19259|CONN_LIFECYCLE: conn=7965 role=brain wall_ms=1784269127305 mono_ms=3885175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19260|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=stream-sub-attach stream=3682 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19261|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127305 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19262|CONN_LIFECYCLE: conn=7966 role=brain stream-subscriber stream=3682 wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19263|CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19264|CONN_LIFECYCLE: conn=7967 role=brain wall_ms=1784269127306 mono_ms=3885176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19265|CONN_LIFECYCLE: conn=7968 role=brain wall_ms=1784269129057 mono_ms=3886927 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19266|CONN_LIFECYCLE: conn=7968 role=brain wall_ms=1784269129057 mono_ms=3886927 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19267|CONN_LIFECYCLE: conn=7969 role=brain wall_ms=1784269129058 mono_ms=3886928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19268|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129058 mono_ms=3886928 event=stream-sub-attach stream=3688 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19269|CONN_LIFECYCLE: conn=7969 role=brain stream-subscriber stream=3688 wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19270|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19271|CONN_LIFECYCLE: conn=7970 role=brain wall_ms=1784269129060 mono_ms=3886931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19272|CONN_LIFECYCLE: conn=7971 role=brain wall_ms=1784269129779 mono_ms=3887649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19273|CONN_LIFECYCLE: conn=7972 role=brain wall_ms=1784269129779 mono_ms=3887649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19274|CONN_LIFECYCLE: conn=7971 role=brain wall_ms=1784269129779 mono_ms=3887649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19275|CONN_LIFECYCLE: conn=7972 role=brain wall_ms=1784269129779 mono_ms=3887649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19276|CONN_LIFECYCLE: conn=7974 role=brain wall_ms=1784269129780 mono_ms=3887650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19277|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129780 mono_ms=3887650 event=stream-sub-attach stream=3690 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19278|CONN_LIFECYCLE: conn=7974 role=brain stream-subscriber stream=3690 wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19279|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19280|CONN_LIFECYCLE: conn=7975 role=brain wall_ms=1784269129782 mono_ms=3887652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19281|CONN_LIFECYCLE: conn=7973 role=brain wall_ms=1784269129783 mono_ms=3887653 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19282|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129783 mono_ms=3887653 event=stream-sub-attach stream=3689 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19283|CONN_LIFECYCLE: conn=7973 role=brain stream-subscriber stream=3689 wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19284|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19285|CONN_LIFECYCLE: conn=7976 role=brain wall_ms=1784269129788 mono_ms=3887658 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19286|CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19287|CONN_LIFECYCLE: conn=7977 role=brain wall_ms=1784269130398 mono_ms=3888268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19288|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=stream-sub-attach stream=3691 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19289|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19290|CONN_LIFECYCLE: conn=7978 role=brain stream-subscriber stream=3691 wall_ms=1784269130398 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19291|CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130398 mono_ms=3888269 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19292|CONN_LIFECYCLE: conn=7979 role=brain wall_ms=1784269130399 mono_ms=3888269 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19293|CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19294|CONN_LIFECYCLE: conn=7980 role=brain wall_ms=1784269130604 mono_ms=3888474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19295|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888474 event=stream-sub-attach stream=3692 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19296|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19297|CONN_LIFECYCLE: conn=7981 role=brain stream-subscriber stream=3692 wall_ms=1784269130604 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19298|CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19299|CONN_LIFECYCLE: conn=7982 role=brain wall_ms=1784269130605 mono_ms=3888475 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19300|CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19301|CONN_LIFECYCLE: conn=7983 role=brain wall_ms=1784269130810 mono_ms=3888680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19302|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130810 mono_ms=3888681 event=stream-sub-attach stream=3693 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19303|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19304|CONN_LIFECYCLE: conn=7984 role=brain stream-subscriber stream=3693 wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19305|CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19306|CONN_LIFECYCLE: conn=7985 role=brain wall_ms=1784269130811 mono_ms=3888681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19307|CONN_LIFECYCLE: conn=7986 role=brain wall_ms=1784269132106 mono_ms=3889977 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19308|CONN_LIFECYCLE: conn=7986 role=brain wall_ms=1784269132106 mono_ms=3889977 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19309|CONN_LIFECYCLE: conn=7987 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19310|CONN_LIFECYCLE: conn=7987 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19311|CONN_LIFECYCLE: conn=7988 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19312|CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19313|CONN_LIFECYCLE: conn=7988 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19314|CONN_LIFECYCLE: conn=7989 role=brain wall_ms=1784269133802 mono_ms=3891673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19315|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3694 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19316|CONN_LIFECYCLE: conn=7991 role=brain stream-subscriber stream=3695 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3695 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19317|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=stream-sub-attach stream=3696 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19320|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133803 mono_ms=3891673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19321|CONN_LIFECYCLE: conn=7992 role=brain stream-subscriber stream=3696 wall_ms=1784269133811 mono_ms=3891682 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19322|CONN_LIFECYCLE: conn=7993 role=brain wall_ms=1784269133811 mono_ms=3891682 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19323|CONN_LIFECYCLE: conn=7993 role=brain wall_ms=1784269133812 mono_ms=3891682 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19324|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133813 mono_ms=3891683 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19325|CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133814 mono_ms=3891685 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*19326|CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133815 mono_ms=3891685 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"bytes","totalLines":480,"totalBytes":75831,"outputLines":323,"outputBytes":51051,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":480,"totalBytes":75831,"outputLines":323,"outputBytes":51051,"shownRange":{"start":1,"end":323},"nextOffset":324}}},"isError":false,"timestamp":1784271959837}}
{"type":"message","id":"29764202","parentId":"49a70f22","timestamp":"2026-07-17T07:06:10.341Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Deriving thread count from attach events**"},{"type":"toolCall","id":"call_ZqeRgXpyUZWlqqc3k9VEE4gH|fc_0fcf561150331aac016a59d461be388190800e2d067fc8646d","name":"grep","arguments":{"i":"Counting long carrier seats","pattern":"CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_vST2diJAlaXRFKd58RpgNTUs|fc_0fcf561150331aac016a59d461be5881909be73ac44459fcca","name":"grep","arguments":{"i":"Checking long carrier close","pattern":"CONN_LIFECYCLE: conn=137 .*event=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_XStUEcYGICf8YKu0p3YzeJPw|fc_0fcf561150331aac016a59d461be6c8190ab1d4241f78d5bd7","name":"grep","arguments":{"i":"Checking current process thread facts","pattern":"CONN_LIFECYCLE: conn=137 |CONN_WRITE_POISONED: conn=","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"19000-20000","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_7ClnajQeNQLbn6iy7eYhvGbz|fc_0fcf561150331aac016a59d461be78819089092b9403ae4671","name":"read","arguments":{"i":"Reading stream removal sweep","path":"crates/spt-daemon/src/nethost.rs","selector":"940-975"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":39864,"output":369,"cacheRead":139776,"cacheWrite":0,"totalTokens":180009,"reasoningTokens":77,"cost":{"input":0.19932000000000002,"output":0.01107,"cacheRead":0.06988799999999999,"cacheWrite":0,"total":0.280278}},"stopReason":"toolUse","timestamp":1784271959883,"responseId":"resp_0fcf561150331aac016a59d45856248190b58fe36fdfdaf0a5","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d45bb824819092f8e974bc09e373","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdRhUYf_ksTVmQ3CbkNgrhT_ZyJmzh6edeXL7LLvvlia782WF5USh2zzlamw1UeYRj1H1yD3N-plCAqItXSKcZlRdWEoKZdcLGxuYoC0YhU5jU9EeJtw0h2yRDjNJ6-8ReNZUcvQZLhXZSzs5ayS6mZdCz5nOfWzK4QgEAk-mOdllHFvjhMH44msf5AWvERHXh89nEIpACNS3_iI8fuAvOELX-ejmz15A2xpCiFnnW0UtxpaY2QqUIm8FreXW4hh8oYa5SdbvgNKSIBMzh69fTH-lQFSHWV8UVZEZufzolNCi3rLGBjpUlBoeocSmX5rGwbL9cYgGSBP-ACWXOSA_pQZyoLTCfV1QFapqyhmjIlLGP56ObmF4XpLj3aYQ_bnzZRRhIID3ji_Ka0dHy9_5su119YwI177fUE6CDev7W8RmcTy84ugwuxwf-Ep6iP992SLmND1Ekj2AFdJfbWOnSQ9GsKv4cRsQNhcrGd7hs8W5VPRUTdSJ9byPa5GIUA2OfD0ym9YweoXBhNEvRAuYzOWlTpT_SwAnPW2U8ozUisugA7U0z2Q2qNewUnHMimuNGUUfhj3E7e82SHx2aeDw2LTgIhS3mji3lT8lmFGR3H3YWMkz6HODIulGHOJJVk7kD6wXb6Kp_UMv4MfwnN49IxTpwqQW8oo4FtYo1H9X3HSGlkNqIrkqQbHAPIfd4VAECfVq1vW4FaREbyjm6lETrkxWCP5SPb3xVgW5r2UCSOjommtghxUqcuS-nStVLpWS-e9XnOQ-AauUNoPiZQub88AKvoFXj2G6Zt1F9-ushkag8U1km6GNMwOZwAK6qiEiPiIXz-Y40H87YVOvWEiiGbvAWTzcbnEr8LnEZTyWaq40cbA9hiVYUMi46nxdDnY-ZxyK1yafQ-vJptJNtfxBb-6JLC18oFOwa-nTc58V0JNyyK8AoLZZ0V39gn5ILI2StJ9JnqRYbuloFQQA-ahMDtqj2HWDLONluYkyd67H4anNR_ai87syw53fMFLsy9nZZOkWySijbsLvWFh74VARE6yS1gxCHOC-9b0MT1Hqo1jt2NCndBwaOB7L_0Kl4ttPXN19KNVR-xUU4p7i8Te-C3Wd-Oj8Fm81A4TIfVPreX2TtHMTMFbBW15VEyk2KqESAej-ocuRGIHjOp-zMHyUEZOGfdVLJufi6dZmgkDqSp8wTendLc8NjaCbdIpZAAqbt9RPGTvu4-8LPHYcGFNKJw7D0MQ8E86TBvuL5bmpbz9J1oUhgzgUyml5Ft1lrMS_vMTcewLKA0ymRpp60YvrmvAzjfa4MfH03yUOAV_bwH6A8ClzF77ebhCbWm15toVBr6z","summary":[{"type":"summary_text","text":"**Deriving thread count from attach events**"}]},{"id":"fc_0fcf561150331aac016a59d461be388190800e2d067fc8646d","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting long carrier seats\",\"pattern\":\"CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_ZqeRgXpyUZWlqqc3k9VEE4gH","name":"grep"},{"id":"fc_0fcf561150331aac016a59d461be5881909be73ac44459fcca","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking long carrier close\",\"pattern\":\"CONN_LIFECYCLE: conn=137 .*event=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_vST2diJAlaXRFKd58RpgNTUs","name":"grep"},{"id":"fc_0fcf561150331aac016a59d461be6c8190ab1d4241f78d5bd7","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking current process thread facts\",\"pattern\":\"CONN_LIFECYCLE: conn=137 |CONN_WRITE_POISONED: conn=\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"19000-20000\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_XStUEcYGICf8YKu0p3YzeJPw","name":"grep"},{"id":"fc_0fcf561150331aac016a59d461be78819089092b9403ae4671","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream removal sweep\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"940-975\"}","call_id":"call_7ClnajQeNQLbn6iy7eYhvGbz","name":"read"}]},"duration":10456.628100007772,"ttft":3852.0341999977827,"contextSnapshot":{"promptTokens":179640,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ZqeRgXpyUZWlqqc3k9VEE4gH|fc_0fcf561150331aac016a59d461be388190800e2d067fc8646d","toolName":"grep","startedAt":"2026-07-17T07:06:10.341Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Counting long carrier seats"},"id":"b6ddf49d","parentId":"29764202","timestamp":"2026-07-17T07:06:10.341Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_vST2diJAlaXRFKd58RpgNTUs|fc_0fcf561150331aac016a59d461be5881909be73ac44459fcca","toolName":"grep","startedAt":"2026-07-17T07:06:10.342Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking long carrier close"},"id":"1eb72df1","parentId":"b6ddf49d","timestamp":"2026-07-17T07:06:10.342Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_XStUEcYGICf8YKu0p3YzeJPw|fc_0fcf561150331aac016a59d461be6c8190ab1d4241f78d5bd7","toolName":"grep","startedAt":"2026-07-17T07:06:10.342Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking current process thread facts"},"id":"3a4a737d","parentId":"1eb72df1","timestamp":"2026-07-17T07:06:10.342Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_7ClnajQeNQLbn6iy7eYhvGbz|fc_0fcf561150331aac016a59d461be78819089092b9403ae4671","toolName":"read","startedAt":"2026-07-17T07:06:10.342Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream removal sweep"},"id":"36ed4c78","parentId":"3a4a737d","timestamp":"2026-07-17T07:06:10.342Z"}
{"type":"message","id":"36b5b681","parentId":"36ed4c78","timestamp":"2026-07-17T07:06:10.362Z","message":{"role":"toolResult","toolCallId":"call_7ClnajQeNQLbn6iy7eYhvGbz|fc_0fcf561150331aac016a59d461be78819089092b9403ae4671","toolName":"read","content":[{"type":"text","text":"    let observed = observed_addr_json(&conn);\n    shared\n        .presence\n        .lock()\n        .unwrap()\n        .append_connected(id, &remote_id_hex, observed);\n\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\n    // close, conn loss, or our own endpoint close), removes the row — conns\n    // finally LEAVE the table — then appends the `disconnected` event (row\n    // gone before the event is observable).\n    // [impl->REQ-EP-4]\n    let sh_close = Arc::clone(shared);\n    let conn_close = conn.clone();\n    let hex_close = remote_id_hex.clone();\n    tokio::spawn(async move {\n        conn_close.closed().await;\n        sh_close.conns.lock().unwrap().remove(&id);\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n        // — nothing can ever be served on them again, and leaving them makes\n        // every future dispatcher generation replay them (the control-steal\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\n        // else reads a dead conn's stream ring.\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n        sh_close\n            .streams\n            .lock()\n            .unwrap()\n            .retain(|_, e| e.conn_id != id);\n        sh_close\n            .presence\n            .lock()\n            .unwrap()\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\n    });\n\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n\n[Showing lines 939-978 of 2865. Use :979 to continue]"}],"details":{"truncation":{"content":"    let observed = observed_addr_json(&conn);\r\n    shared\r\n        .presence\r\n        .lock()\r\n        .unwrap()\r\n        .append_connected(id, &remote_id_hex, observed);\r\n\r\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\r\n    // close, conn loss, or our own endpoint close), removes the row — conns\r\n    // finally LEAVE the table — then appends the `disconnected` event (row\r\n    // gone before the event is observable).\r\n    // [impl->REQ-EP-4]\r\n    let sh_close = Arc::clone(shared);\r\n    let conn_close = conn.clone();\r\n    let hex_close = remote_id_hex.clone();\r\n    tokio::spawn(async move {\r\n        conn_close.closed().await;\r\n        sh_close.conns.lock().unwrap().remove(&id);\r\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\r\n        // — nothing can ever be served on them again, and leaving them makes\r\n        // every future dispatcher generation replay them (the control-steal\r\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\r\n        // else reads a dead conn's stream ring.\r\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n        sh_close\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .retain(|_, e| e.conn_id != id);\r\n        sh_close\r\n            .presence\r\n            .lock()\r\n            .unwrap()\r\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\r\n    });\r\n\r\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\r\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\r\n    // visible here on its first write.) Ends when the connection does.\r\n    let sh = Arc::clone(shared);\r","truncated":true,"truncatedBy":"lines","totalLines":1927,"totalBytes":1696,"outputLines":40,"outputBytes":1696,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    let observed = observed_addr_json(&conn);\r\n    shared\r\n        .presence\r\n        .lock()\r\n        .unwrap()\r\n        .append_connected(id, &remote_id_hex, observed);\r\n\r\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\r\n    // close, conn loss, or our own endpoint close), removes the row — conns\r\n    // finally LEAVE the table — then appends the `disconnected` event (row\r\n    // gone before the event is observable).\r\n    // [impl->REQ-EP-4]\r\n    let sh_close = Arc::clone(shared);\r\n    let conn_close = conn.clone();\r\n    let hex_close = remote_id_hex.clone();\r\n    tokio::spawn(async move {\r\n        conn_close.closed().await;\r\n        sh_close.conns.lock().unwrap().remove(&id);\r\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\r\n        // — nothing can ever be served on them again, and leaving them makes\r\n        // every future dispatcher generation replay them (the control-steal\r\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\r\n        // else reads a dead conn's stream ring.\r\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n        sh_close\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .retain(|_, e| e.conn_id != id);\r\n        sh_close\r\n            .presence\r\n            .lock()\r\n            .unwrap()\r\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\r\n    });\r\n\r\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\r\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\r\n    // visible here on its first write.) Ends when the connection does.\r\n    let sh = Arc::clone(shared);\r","startLine":939,"lineNumbers":[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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":1696,"outputLines":40,"outputBytes":1696,"shownRange":{"start":939,"end":978},"nextOffset":979}}},"isError":false,"timestamp":1784271970362}}
{"type":"message","id":"f67fbaf3","parentId":"36b5b681","timestamp":"2026-07-17T07:06:10.364Z","message":{"role":"toolResult","toolCallId":"call_vST2diJAlaXRFKd58RpgNTUs|fc_0fcf561150331aac016a59d461be5881909be73ac44459fcca","toolName":"grep","content":[{"type":"text","text":"No matches found\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"}],"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":1784271970364}}
{"type":"message","id":"e1adf254","parentId":"f67fbaf3","timestamp":"2026-07-17T07:06:10.373Z","message":{"role":"toolResult","toolCallId":"call_ZqeRgXpyUZWlqqc3k9VEE4gH|fc_0fcf561150331aac016a59d461be388190800e2d067fc8646d","toolName":"grep","content":[{"type":"text","text":" 499|CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*500|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 501|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 502|CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 503|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 514|CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*515|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*516|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*517|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*518|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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*519|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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 520|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 521|CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 522|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\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*809|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=1784265385698 mono_ms=143578 event=stream-sub-attach stream=108 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*810|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=1784265385899 mono_ms=143779 event=stream-sub-attach stream=109 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 811|CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 812|CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 813|CONN_LIFECYCLE: conn=300 role=brain wall_ms=1784265389297 mono_ms=147177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\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 1054|CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1055|CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1056|CONN_LIFECYCLE: conn=397 role=brain wall_ms=1784265455944 mono_ms=213825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1304|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784265516180 mono_ms=274060 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1305|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=1784265517380 mono_ms=275260 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1306|CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1307|CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1308|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=201 wall_ms=1784265517587 mono_ms=275467 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1312|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784265517592 mono_ms=275472 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1313|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=1784265517649 mono_ms=275529 event=stream-sub-attach stream=202 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1314|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=1784265518315 mono_ms=276195 event=stream-sub-attach stream=203 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1315|CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1316|CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1317|CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784265519196 mono_ms=277076 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1571|CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784265578248 mono_ms=336128 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1572|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=1784265578758 mono_ms=336638 event=stream-sub-attach stream=248 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1573|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=1784265579403 mono_ms=337283 event=stream-sub-attach stream=249 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1574|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=1784265579609 mono_ms=337488 event=stream-sub-attach stream=250 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1575|CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1576|CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1577|CONN_LIFECYCLE: conn=615 role=brain wall_ms=1784265579855 mono_ms=337735 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1857|CONN_LIFECYCLE: conn=733 role=brain wall_ms=1784265656195 mono_ms=414075 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1858|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=1784265656234 mono_ms=414114 event=stream-sub-attach stream=297 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1859|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=1784265656591 mono_ms=414471 event=stream-sub-attach stream=300 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1860|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=1784265656852 mono_ms=414731 event=stream-sub-attach stream=303 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1861|CONN_LIFECYCLE: conn=734 role=brain wall_ms=1784265657934 mono_ms=415814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1862|CONN_LIFECYCLE: conn=734 role=brain wall_ms=1784265657935 mono_ms=415814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1863|CONN_LIFECYCLE: conn=735 role=brain wall_ms=1784265660159 mono_ms=418039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2094|CONN_LIFECYCLE: conn=830 role=brain wall_ms=1784265718447 mono_ms=476326 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2095|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=1784265718486 mono_ms=476366 event=stream-sub-attach stream=341 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2096|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=1784265718859 mono_ms=476738 event=stream-sub-attach stream=342 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2097|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=1784265719377 mono_ms=477257 event=stream-sub-attach stream=343 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2098|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2099|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2100|PAIR_MEET_UP:SPT_DEV step=59475524 id=ce5fe4feece9f355fd2913b3f39e0e6decc6d0fcbcdb154eab756655aa8ac22d addr=EndpointAddr { id: PublicKey(ce5fe4feece9f355fd2913b3f39e0e6decc6d0fcbcdb154eab756655aa8ac22d), addrs: {Ip(100.68.35.65:52246), Ip(192.168.1.81:52246)} }\n...\n 2332|CONN_LIFECYCLE: conn=928 role=brain wall_ms=1784265778813 mono_ms=536692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2333|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=1784265779887 mono_ms=537766 event=stream-sub-attach stream=384 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2334|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2335|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2336|PAIR_MEET_UP:SPT_DEV step=59475526 id=a9b01fa413d261551dd73eab19d0bc46fa9cb3508e23e5855ad80cbebdc2f381 addr=EndpointAddr { id: PublicKey(a9b01fa413d261551dd73eab19d0bc46fa9cb3508e23e5855ad80cbebdc2f381), addrs: {Ip(100.68.35.65:54745), Ip(192.168.1.81:54745)} }\n...\n 2344|INJECT_SETTLE_TIMEOUT:lia: no PTY readiness echo within 400ms — proceeding (echo-verify guards head loss)\n*2345|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=1784265781698 mono_ms=539577 event=stream-sub-attach stream=385 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2346|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=1784265781985 mono_ms=539864 event=stream-sub-attach stream=386 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2347|CONN_LIFECYCLE: conn=931 role=brain wall_ms=1784265785047 mono_ms=542926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2348|CONN_LIFECYCLE: conn=932 role=brain wall_ms=1784265785047 mono_ms=542926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2349|CONN_LIFECYCLE: conn=931 role=brain wall_ms=1784265785047 mono_ms=542926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2567|CONN_LIFECYCLE: conn=1023 role=brain wall_ms=1784265841054 mono_ms=598933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2568|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=1784265842390 mono_ms=600269 event=stream-sub-attach stream=426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2569|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=1784265843727 mono_ms=601606 event=stream-sub-attach stream=427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2570|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=1784265843918 mono_ms=601798 event=stream-sub-attach stream=428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2571|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=1784265844191 mono_ms=602070 event=stream-sub-attach stream=429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2572|CONN_LIFECYCLE: conn=1024 role=brain wall_ms=1784265845996 mono_ms=603876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2573|CONN_LIFECYCLE: conn=1024 role=brain wall_ms=1784265845996 mono_ms=603876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2574|CONN_LIFECYCLE: conn=1025 role=brain wall_ms=1784265845998 mono_ms=603877 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2821|CONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784265915021 mono_ms=672900 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2822|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=1784265915214 mono_ms=673093 event=stream-sub-attach stream=475 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2823|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=1784265915515 mono_ms=673394 event=stream-sub-attach stream=476 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2824|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=1784265915871 mono_ms=673750 event=stream-sub-attach stream=477 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2825|CONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784265916446 mono_ms=674325 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2826|CONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784265916446 mono_ms=674325 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2827|CONN_LIFECYCLE: conn=1130 role=brain wall_ms=1784265916447 mono_ms=674326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3052|CONN_LIFECYCLE: conn=1223 role=brain wall_ms=1784265976631 mono_ms=734510 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3053|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=1784265977336 mono_ms=735215 event=stream-sub-attach stream=517 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3054|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=1784265977620 mono_ms=735499 event=stream-sub-attach stream=518 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3055|CONN_LIFECYCLE: conn=1224 role=brain wall_ms=1784265977710 mono_ms=735589 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3056|CONN_LIFECYCLE: conn=1224 role=brain wall_ms=1784265977710 mono_ms=735589 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3057|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=1784265977942 mono_ms=735821 event=stream-sub-attach stream=519 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3058|CONN_LIFECYCLE: conn=1225 role=brain wall_ms=1784265982752 mono_ms=740630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3059|CONN_LIFECYCLE: conn=1225 role=brain wall_ms=1784265982752 mono_ms=740631 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3060|ENDPOINT_INJECT:doyle: endpoint ACTIVE -> spool (deferred hint), not injected\n...\n 3300|CONN_LIFECYCLE: conn=1323 role=brain wall_ms=1784266038356 mono_ms=796234 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3301|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=1784266039606 mono_ms=797485 event=stream-sub-attach stream=557 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3302|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=1784266039957 mono_ms=797836 event=stream-sub-attach stream=558 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3303|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=1784266040614 mono_ms=798493 event=stream-sub-attach stream=559 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3304|CONN_LIFECYCLE: conn=1324 role=brain wall_ms=1784266043398 mono_ms=801276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3305|CONN_LIFECYCLE: conn=1324 role=brain wall_ms=1784266043398 mono_ms=801276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3306|CONN_LIFECYCLE: conn=1325 role=brain wall_ms=1784266044591 mono_ms=802470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3555|CONN_LIFECYCLE: conn=1427 role=brain wall_ms=1784266110533 mono_ms=868411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3556|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=1784266110723 mono_ms=868601 event=stream-sub-attach stream=604 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3557|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=1784266111644 mono_ms=869522 event=stream-sub-attach stream=605 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3558|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=1784266112083 mono_ms=869962 event=stream-sub-attach stream=606 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3559|CONN_LIFECYCLE: conn=1428 role=brain wall_ms=1784266112296 mono_ms=870174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3560|CONN_LIFECYCLE: conn=1429 role=brain wall_ms=1784266112296 mono_ms=870174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3561|CONN_LIFECYCLE: conn=1428 role=brain wall_ms=1784266112296 mono_ms=870174 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3814|CONN_LIFECYCLE: conn=1535 role=brain wall_ms=1784266172651 mono_ms=930530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3815|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=1784266172656 mono_ms=930535 event=stream-sub-attach stream=651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3816|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=1784266173241 mono_ms=931119 event=stream-sub-attach stream=652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3817|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=1784266173538 mono_ms=931416 event=stream-sub-attach stream=653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3818|CONN_LIFECYCLE: conn=1536 role=brain wall_ms=1784266175329 mono_ms=933207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3819|CONN_LIFECYCLE: conn=1536 role=brain wall_ms=1784266175329 mono_ms=933207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3820|CONN_LIFECYCLE: conn=1537 role=brain wall_ms=1784266176467 mono_ms=934345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4058|CONN_LIFECYCLE: conn=1637 role=brain wall_ms=1784266248694 mono_ms=1006573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4059|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=1784266248743 mono_ms=1006621 event=stream-sub-attach stream=698 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*4060|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=1784266249350 mono_ms=1007228 event=stream-sub-attach stream=699 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*4061|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=1784266249753 mono_ms=1007631 event=stream-sub-attach stream=700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4062|CONN_LIFECYCLE: conn=1638 role=brain wall_ms=1784266250965 mono_ms=1008843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4063|CONN_LIFECYCLE: conn=1638 role=brain wall_ms=1784266250965 mono_ms=1008843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4064|CONN_LIFECYCLE: conn=1639 role=brain wall_ms=1784266255503 mono_ms=1013381 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\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 4328|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 4329|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 4330|PAIR_MEET_UP:SPT_DEV step=59475544 id=e6318f585026d5450504a87dcecb15fe0598f81e384eb376c54066d1017cd5c1 addr=EndpointAddr { id: PublicKey(e6318f585026d5450504a87dcecb15fe0598f81e384eb376c54066d1017cd5c1), addrs: {Ip(100.68.35.65:60891), Ip(192.168.1.81:60891)} }\n...\n 4547|CONN_LIFECYCLE: conn=1838 role=brain wall_ms=1784266382071 mono_ms=1139949 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4548|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=1784266384890 mono_ms=1142767 event=stream-sub-attach stream=791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4549|CONN_LIFECYCLE: conn=1839 role=brain wall_ms=1784266387112 mono_ms=1144989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4550|CONN_LIFECYCLE: conn=1839 role=brain wall_ms=1784266387112 mono_ms=1144989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4551|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=1784266387666 mono_ms=1145544 event=stream-sub-attach stream=792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4552|CONN_LIFECYCLE: conn=1840 role=brain wall_ms=1784266387795 mono_ms=1145673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4553|CONN_LIFECYCLE: conn=1840 role=brain wall_ms=1784266387795 mono_ms=1145673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4554|CONN_LIFECYCLE: conn=1841 role=brain stream-subscriber stream=793 wall_ms=1784266387795 mono_ms=1145673 event=stream-sub-attach stream=793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4558|CONN_LIFECYCLE: conn=1842 role=brain wall_ms=1784266387796 mono_ms=1145674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4559|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=1784266388011 mono_ms=1145889 event=stream-sub-attach stream=794 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4560|CONN_LIFECYCLE: conn=1843 role=brain wall_ms=1784266388905 mono_ms=1146783 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4561|CONN_LIFECYCLE: conn=1843 role=brain wall_ms=1784266388905 mono_ms=1146783 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4562|CONN_LIFECYCLE: conn=1844 role=brain stream-subscriber stream=795 wall_ms=1784266388906 mono_ms=1146783 event=stream-sub-attach stream=795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4780|CONN_LIFECYCLE: conn=1935 role=brain wall_ms=1784266447632 mono_ms=1205510 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4781|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=1784266448442 mono_ms=1206320 event=stream-sub-attach stream=835 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4782|CONN_LIFECYCLE: conn=1936 role=brain wall_ms=1784266448516 mono_ms=1206393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4783|CONN_LIFECYCLE: conn=1936 role=brain wall_ms=1784266448516 mono_ms=1206393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4784|CONN_LIFECYCLE: conn=1937 role=brain stream-subscriber stream=834 wall_ms=1784266448516 mono_ms=1206394 event=stream-sub-attach stream=834 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4795|CONN_LIFECYCLE: conn=1941 role=brain wall_ms=1784266449634 mono_ms=1207512 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4796|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=1784266449848 mono_ms=1207725 event=stream-sub-attach stream=837 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*4797|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=1784266450741 mono_ms=1208618 event=stream-sub-attach stream=838 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4798|CONN_LIFECYCLE: conn=1942 role=brain wall_ms=1784266452675 mono_ms=1210553 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4799|CONN_LIFECYCLE: conn=1942 role=brain wall_ms=1784266452675 mono_ms=1210553 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4800|CONN_LIFECYCLE: conn=1943 role=brain wall_ms=1784266453772 mono_ms=1211650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5043|CONN_LIFECYCLE: conn=2045 role=brain wall_ms=1784266520129 mono_ms=1278006 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5044|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=1784266520177 mono_ms=1278054 event=stream-sub-attach stream=884 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5045|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=1784266520357 mono_ms=1278235 event=stream-sub-attach stream=885 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5046|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=1784266520713 mono_ms=1278591 event=stream-sub-attach stream=886 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5047|CONN_LIFECYCLE: conn=2046 role=brain wall_ms=1784266521492 mono_ms=1279369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5048|CONN_LIFECYCLE: conn=2047 role=brain wall_ms=1784266521492 mono_ms=1279369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5049|CONN_LIFECYCLE: conn=2046 role=brain wall_ms=1784266521492 mono_ms=1279369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5253|CONN_LIFECYCLE: conn=2132 role=brain wall_ms=1784266578748 mono_ms=1336625 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5254|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=1784266581598 mono_ms=1339475 event=stream-sub-attach stream=926 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5255|CONN_LIFECYCLE: conn=2133 role=brain wall_ms=1784266581953 mono_ms=1339831 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5256|CONN_LIFECYCLE: conn=2133 role=brain wall_ms=1784266581953 mono_ms=1339831 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5257|CONN_LIFECYCLE: conn=2134 role=brain wall_ms=1784266581955 mono_ms=1339832 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5261|CONN_LIFECYCLE: conn=2135 role=brain wall_ms=1784266581957 mono_ms=1339834 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5262|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=1784266582107 mono_ms=1339984 event=stream-sub-attach stream=928 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5263|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=1784266582355 mono_ms=1340232 event=stream-sub-attach stream=929 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5264|CONN_LIFECYCLE: conn=2136 role=brain wall_ms=1784266583790 mono_ms=1341668 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5265|CONN_LIFECYCLE: conn=2136 role=brain wall_ms=1784266583790 mono_ms=1341668 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5266|CONN_LIFECYCLE: conn=2137 role=brain wall_ms=1784266584278 mono_ms=1342155 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5494|CONN_LIFECYCLE: conn=2231 role=brain wall_ms=1784266642328 mono_ms=1400205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5495|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=1784266642989 mono_ms=1400866 event=stream-sub-attach stream=967 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5496|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=1784266643315 mono_ms=1401192 event=stream-sub-attach stream=968 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5497|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=1784266643537 mono_ms=1401414 event=stream-sub-attach stream=969 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5498|CONN_LIFECYCLE: conn=2232 role=brain wall_ms=1784266644309 mono_ms=1402186 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5499|CONN_LIFECYCLE: conn=2232 role=brain wall_ms=1784266644309 mono_ms=1402186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5500|CONN_LIFECYCLE: conn=2233 role=brain wall_ms=1784266644651 mono_ms=1402528 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5740|CONN_LIFECYCLE: conn=2332 role=brain wall_ms=1784266711115 mono_ms=1468992 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5741|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=1784266711163 mono_ms=1469040 event=stream-sub-attach stream=1014 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5742|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=1784266711425 mono_ms=1469302 event=stream-sub-attach stream=1015 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5743|CONN_LIFECYCLE: conn=2333 role=brain wall_ms=1784266712547 mono_ms=1470424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5744|CONN_LIFECYCLE: conn=2334 role=brain wall_ms=1784266712547 mono_ms=1470424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5745|CONN_LIFECYCLE: conn=2333 role=brain wall_ms=1784266712547 mono_ms=1470424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5777|CONN_LIFECYCLE: conn=2347 role=brain wall_ms=1784266712963 mono_ms=1470840 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5778|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=1784266713086 mono_ms=1470963 event=stream-sub-attach stream=1021 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5779|CONN_LIFECYCLE: conn=2348 role=brain wall_ms=1784266714913 mono_ms=1472790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5780|CONN_LIFECYCLE: conn=2348 role=brain wall_ms=1784266714913 mono_ms=1472790 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5781|CONN_LIFECYCLE: conn=2349 role=brain wall_ms=1784266714977 mono_ms=1472854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5987|CONN_LIFECYCLE: conn=2435 role=brain wall_ms=1784266773264 mono_ms=1531141 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5988|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=1784266773480 mono_ms=1531357 event=stream-sub-attach stream=1059 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5989|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=1784266773777 mono_ms=1531654 event=stream-sub-attach stream=1060 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5990|CONN_LIFECYCLE: conn=2436 role=brain wall_ms=1784266774474 mono_ms=1532350 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5991|CONN_LIFECYCLE: conn=2437 role=brain wall_ms=1784266774474 mono_ms=1532350 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5992|CONN_LIFECYCLE: conn=2436 role=brain wall_ms=1784266774474 mono_ms=1532350 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6003|CONN_LIFECYCLE: conn=2441 role=brain wall_ms=1784266774498 mono_ms=1532374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6004|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=1784266775001 mono_ms=1532878 event=stream-sub-attach stream=1063 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6005|CONN_LIFECYCLE: conn=2442 role=brain wall_ms=1784266775284 mono_ms=1533160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6006|CONN_LIFECYCLE: conn=2442 role=brain wall_ms=1784266775284 mono_ms=1533160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6007|CONN_LIFECYCLE: conn=2443 role=brain stream-subscriber stream=1064 wall_ms=1784266775284 mono_ms=1533161 event=stream-sub-attach stream=1064 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6013|CONN_LIFECYCLE: conn=2445 role=brain wall_ms=1784266775423 mono_ms=1533300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6014|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=1784266775603 mono_ms=1533479 event=stream-sub-attach stream=1065 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6015|CONN_LIFECYCLE: conn=2446 role=brain wall_ms=1784266780344 mono_ms=1538221 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6016|CONN_LIFECYCLE: conn=2446 role=brain wall_ms=1784266780344 mono_ms=1538221 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6017|CONN_LIFECYCLE: conn=2447 role=brain wall_ms=1784266780345 mono_ms=1538222 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6265|CONN_LIFECYCLE: conn=2554 role=brain wall_ms=1784266849949 mono_ms=1607826 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6266|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=1784266850290 mono_ms=1608166 event=stream-sub-attach stream=1110 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6267|CONN_LIFECYCLE: conn=2555 role=brain wall_ms=1784266850514 mono_ms=1608391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6268|CONN_LIFECYCLE: conn=2555 role=brain wall_ms=1784266850514 mono_ms=1608391 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6269|CONN_LIFECYCLE: conn=2556 role=brain stream-subscriber stream=1111 wall_ms=1784266850515 mono_ms=1608391 event=stream-sub-attach stream=1111 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6287|CONN_LIFECYCLE: conn=2563 role=brain wall_ms=1784266850625 mono_ms=1608501 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6288|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=1784266850833 mono_ms=1608710 event=stream-sub-attach stream=1114 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6289|CONN_LIFECYCLE: conn=2564 role=brain wall_ms=1784266851054 mono_ms=1608930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6290|CONN_LIFECYCLE: conn=2564 role=brain wall_ms=1784266851054 mono_ms=1608930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6291|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=1784266851785 mono_ms=1609662 event=stream-sub-attach stream=1115 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6292|CONN_LIFECYCLE: conn=2539 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6293|CONN_LIFECYCLE: conn=2540 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6294|CONN_LIFECYCLE: conn=2542 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\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 6530|CONN_LIFECYCLE: conn=2657 role=brain stream-subscriber stream=1156 wall_ms=1784266920885 mono_ms=1678762 event=stream-sub-attach stream=1156 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6534|CONN_LIFECYCLE: conn=2658 role=brain wall_ms=1784266920890 mono_ms=1678767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 1-260 of 684 (49.9KB limit). Use :261 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":"   499│CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  *500│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   501│CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   502│CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   503│CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   514│CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *515│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  *516│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  *517│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  *518│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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  *519│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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   520│CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   521│CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   522│CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\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  *809│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=1784265385698 mono_ms=143578 event=stream-sub-attach stream=108 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  *810│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=1784265385899 mono_ms=143779 event=stream-sub-attach stream=109 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   811│CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   812│CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   813│CONN_LIFECYCLE: conn=300 role=brain wall_ms=1784265389297 mono_ms=147177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\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  1054│CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  1055│CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  1056│CONN_LIFECYCLE: conn=397 role=brain wall_ms=1784265455944 mono_ms=213825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  1304│CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784265516180 mono_ms=274060 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *1305│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=1784265517380 mono_ms=275260 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  1306│CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  1307│CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  1308│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=201 wall_ms=1784265517587 mono_ms=275467 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  1312│CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784265517592 mono_ms=275472 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *1313│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=1784265517649 mono_ms=275529 event=stream-sub-attach stream=202 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *1314│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=1784265518315 mono_ms=276195 event=stream-sub-attach stream=203 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  1315│CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  1316│CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  1317│CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784265519196 mono_ms=277076 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  1571│CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784265578248 mono_ms=336128 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *1572│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=1784265578758 mono_ms=336638 event=stream-sub-attach stream=248 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *1573│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=1784265579403 mono_ms=337283 event=stream-sub-attach stream=249 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *1574│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=1784265579609 mono_ms=337488 event=stream-sub-attach stream=250 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  1575│CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  1576│CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  1577│CONN_LIFECYCLE: conn=615 role=brain wall_ms=1784265579855 mono_ms=337735 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  1857│CONN_LIFECYCLE: conn=733 role=brain wall_ms=1784265656195 mono_ms=414075 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *1858│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=1784265656234 mono_ms=414114 event=stream-sub-attach stream=297 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *1859│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=1784265656591 mono_ms=414471 event=stream-sub-attach stream=300 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *1860│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=1784265656852 mono_ms=414731 event=stream-sub-attach stream=303 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  1861│CONN_LIFECYCLE: conn=734 role=brain wall_ms=1784265657934 mono_ms=415814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  1862│CONN_LIFECYCLE: conn=734 role=brain wall_ms=1784265657935 mono_ms=415814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  1863│CONN_LIFECYCLE: conn=735 role=brain wall_ms=1784265660159 mono_ms=418039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  2094│CONN_LIFECYCLE: conn=830 role=brain wall_ms=1784265718447 mono_ms=476326 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *2095│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=1784265718486 mono_ms=476366 event=stream-sub-attach stream=341 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2096│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=1784265718859 mono_ms=476738 event=stream-sub-attach stream=342 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2097│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=1784265719377 mono_ms=477257 event=stream-sub-attach stream=343 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  2098│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  2099│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  2100│PAIR_MEET_UP:SPT_DEV step=59475524 id=ce5fe4feece9f355fd2913b3f39e0e6decc6d0fcbcdb154eab756655aa8ac22d addr=EndpointAddr { id: PublicKey(ce5fe4feece9f355fd2913b3f39e0e6decc6d0fcbcdb154eab756655aa8ac22d), addrs: {Ip(100.68.35.65:52246), Ip(192.168.1.81:52246)} }\n      │...\n  2332│CONN_LIFECYCLE: conn=928 role=brain wall_ms=1784265778813 mono_ms=536692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *2333│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=1784265779887 mono_ms=537766 event=stream-sub-attach stream=384 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  2334│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  2335│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  2336│PAIR_MEET_UP:SPT_DEV step=59475526 id=a9b01fa413d261551dd73eab19d0bc46fa9cb3508e23e5855ad80cbebdc2f381 addr=EndpointAddr { id: PublicKey(a9b01fa413d261551dd73eab19d0bc46fa9cb3508e23e5855ad80cbebdc2f381), addrs: {Ip(100.68.35.65:54745), Ip(192.168.1.81:54745)} }\n      │...\n  2344│INJECT_SETTLE_TIMEOUT:lia: no PTY readiness echo within 400ms — proceeding (echo-verify guards head loss)\n *2345│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=1784265781698 mono_ms=539577 event=stream-sub-attach stream=385 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2346│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=1784265781985 mono_ms=539864 event=stream-sub-attach stream=386 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  2347│CONN_LIFECYCLE: conn=931 role=brain wall_ms=1784265785047 mono_ms=542926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  2348│CONN_LIFECYCLE: conn=932 role=brain wall_ms=1784265785047 mono_ms=542926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  2349│CONN_LIFECYCLE: conn=931 role=brain wall_ms=1784265785047 mono_ms=542926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  2567│CONN_LIFECYCLE: conn=1023 role=brain wall_ms=1784265841054 mono_ms=598933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *2568│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=1784265842390 mono_ms=600269 event=stream-sub-attach stream=426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2569│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=1784265843727 mono_ms=601606 event=stream-sub-attach stream=427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2570│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=1784265843918 mono_ms=601798 event=stream-sub-attach stream=428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2571│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=1784265844191 mono_ms=602070 event=stream-sub-attach stream=429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  2572│CONN_LIFECYCLE: conn=1024 role=brain wall_ms=1784265845996 mono_ms=603876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  2573│CONN_LIFECYCLE: conn=1024 role=brain wall_ms=1784265845996 mono_ms=603876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  2574│CONN_LIFECYCLE: conn=1025 role=brain wall_ms=1784265845998 mono_ms=603877 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  2821│CONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784265915021 mono_ms=672900 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *2822│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=1784265915214 mono_ms=673093 event=stream-sub-attach stream=475 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2823│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=1784265915515 mono_ms=673394 event=stream-sub-attach stream=476 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *2824│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=1784265915871 mono_ms=673750 event=stream-sub-attach stream=477 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  2825│CONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784265916446 mono_ms=674325 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  2826│CONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784265916446 mono_ms=674325 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  2827│CONN_LIFECYCLE: conn=1130 role=brain wall_ms=1784265916447 mono_ms=674326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  3052│CONN_LIFECYCLE: conn=1223 role=brain wall_ms=1784265976631 mono_ms=734510 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *3053│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=1784265977336 mono_ms=735215 event=stream-sub-attach stream=517 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *3054│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=1784265977620 mono_ms=735499 event=stream-sub-attach stream=518 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  3055│CONN_LIFECYCLE: conn=1224 role=brain wall_ms=1784265977710 mono_ms=735589 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3056│CONN_LIFECYCLE: conn=1224 role=brain wall_ms=1784265977710 mono_ms=735589 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *3057│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=1784265977942 mono_ms=735821 event=stream-sub-attach stream=519 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  3058│CONN_LIFECYCLE: conn=1225 role=brain wall_ms=1784265982752 mono_ms=740630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3059│CONN_LIFECYCLE: conn=1225 role=brain wall_ms=1784265982752 mono_ms=740631 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  3060│ENDPOINT_INJECT:doyle: endpoint ACTIVE -> spool (deferred hint), not injected\n      │...\n  3300│CONN_LIFECYCLE: conn=1323 role=brain wall_ms=1784266038356 mono_ms=796234 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *3301│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=1784266039606 mono_ms=797485 event=stream-sub-attach stream=557 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *3302│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=1784266039957 mono_ms=797836 event=stream-sub-attach stream=558 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *3303│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=1784266040614 mono_ms=798493 event=stream-sub-attach stream=559 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  3304│CONN_LIFECYCLE: conn=1324 role=brain wall_ms=1784266043398 mono_ms=801276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3305│CONN_LIFECYCLE: conn=1324 role=brain wall_ms=1784266043398 mono_ms=801276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  3306│CONN_LIFECYCLE: conn=1325 role=brain wall_ms=1784266044591 mono_ms=802470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  3555│CONN_LIFECYCLE: conn=1427 role=brain wall_ms=1784266110533 mono_ms=868411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *3556│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=1784266110723 mono_ms=868601 event=stream-sub-attach stream=604 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *3557│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=1784266111644 mono_ms=869522 event=stream-sub-attach stream=605 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *3558│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=1784266112083 mono_ms=869962 event=stream-sub-attach stream=606 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  3559│CONN_LIFECYCLE: conn=1428 role=brain wall_ms=1784266112296 mono_ms=870174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3560│CONN_LIFECYCLE: conn=1429 role=brain wall_ms=1784266112296 mono_ms=870174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3561│CONN_LIFECYCLE: conn=1428 role=brain wall_ms=1784266112296 mono_ms=870174 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  3814│CONN_LIFECYCLE: conn=1535 role=brain wall_ms=1784266172651 mono_ms=930530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *3815│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=1784266172656 mono_ms=930535 event=stream-sub-attach stream=651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *3816│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=1784266173241 mono_ms=931119 event=stream-sub-attach stream=652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *3817│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=1784266173538 mono_ms=931416 event=stream-sub-attach stream=653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  3818│CONN_LIFECYCLE: conn=1536 role=brain wall_ms=1784266175329 mono_ms=933207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3819│CONN_LIFECYCLE: conn=1536 role=brain wall_ms=1784266175329 mono_ms=933207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  3820│CONN_LIFECYCLE: conn=1537 role=brain wall_ms=1784266176467 mono_ms=934345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  4058│CONN_LIFECYCLE: conn=1637 role=brain wall_ms=1784266248694 mono_ms=1006573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *4059│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=1784266248743 mono_ms=1006621 event=stream-sub-attach stream=698 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *4060│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=1784266249350 mono_ms=1007228 event=stream-sub-attach stream=699 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *4061│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=1784266249753 mono_ms=1007631 event=stream-sub-attach stream=700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4062│CONN_LIFECYCLE: conn=1638 role=brain wall_ms=1784266250965 mono_ms=1008843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  4063│CONN_LIFECYCLE: conn=1638 role=brain wall_ms=1784266250965 mono_ms=1008843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  4064│CONN_LIFECYCLE: conn=1639 role=brain wall_ms=1784266255503 mono_ms=1013381 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\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  4328│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  4329│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  4330│PAIR_MEET_UP:SPT_DEV step=59475544 id=e6318f585026d5450504a87dcecb15fe0598f81e384eb376c54066d1017cd5c1 addr=EndpointAddr { id: PublicKey(e6318f585026d5450504a87dcecb15fe0598f81e384eb376c54066d1017cd5c1), addrs: {Ip(100.68.35.65:60891), Ip(192.168.1.81:60891)} }\n      │...\n  4547│CONN_LIFECYCLE: conn=1838 role=brain wall_ms=1784266382071 mono_ms=1139949 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *4548│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=1784266384890 mono_ms=1142767 event=stream-sub-attach stream=791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4549│CONN_LIFECYCLE: conn=1839 role=brain wall_ms=1784266387112 mono_ms=1144989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  4550│CONN_LIFECYCLE: conn=1839 role=brain wall_ms=1784266387112 mono_ms=1144989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *4551│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=1784266387666 mono_ms=1145544 event=stream-sub-attach stream=792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4552│CONN_LIFECYCLE: conn=1840 role=brain wall_ms=1784266387795 mono_ms=1145673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  4553│CONN_LIFECYCLE: conn=1840 role=brain wall_ms=1784266387795 mono_ms=1145673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  4554│CONN_LIFECYCLE: conn=1841 role=brain stream-subscriber stream=793 wall_ms=1784266387795 mono_ms=1145673 event=stream-sub-attach stream=793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  4558│CONN_LIFECYCLE: conn=1842 role=brain wall_ms=1784266387796 mono_ms=1145674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *4559│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=1784266388011 mono_ms=1145889 event=stream-sub-attach stream=794 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4560│CONN_LIFECYCLE: conn=1843 role=brain wall_ms=1784266388905 mono_ms=1146783 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  4561│CONN_LIFECYCLE: conn=1843 role=brain wall_ms=1784266388905 mono_ms=1146783 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  4562│CONN_LIFECYCLE: conn=1844 role=brain stream-subscriber stream=795 wall_ms=1784266388906 mono_ms=1146783 event=stream-sub-attach stream=795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  4780│CONN_LIFECYCLE: conn=1935 role=brain wall_ms=1784266447632 mono_ms=1205510 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *4781│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=1784266448442 mono_ms=1206320 event=stream-sub-attach stream=835 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4782│CONN_LIFECYCLE: conn=1936 role=brain wall_ms=1784266448516 mono_ms=1206393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  4783│CONN_LIFECYCLE: conn=1936 role=brain wall_ms=1784266448516 mono_ms=1206393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  4784│CONN_LIFECYCLE: conn=1937 role=brain stream-subscriber stream=834 wall_ms=1784266448516 mono_ms=1206394 event=stream-sub-attach stream=834 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  4795│CONN_LIFECYCLE: conn=1941 role=brain wall_ms=1784266449634 mono_ms=1207512 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *4796│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=1784266449848 mono_ms=1207725 event=stream-sub-attach stream=837 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *4797│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=1784266450741 mono_ms=1208618 event=stream-sub-attach stream=838 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4798│CONN_LIFECYCLE: conn=1942 role=brain wall_ms=1784266452675 mono_ms=1210553 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  4799│CONN_LIFECYCLE: conn=1942 role=brain wall_ms=1784266452675 mono_ms=1210553 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  4800│CONN_LIFECYCLE: conn=1943 role=brain wall_ms=1784266453772 mono_ms=1211650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5043│CONN_LIFECYCLE: conn=2045 role=brain wall_ms=1784266520129 mono_ms=1278006 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5044│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=1784266520177 mono_ms=1278054 event=stream-sub-attach stream=884 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *5045│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=1784266520357 mono_ms=1278235 event=stream-sub-attach stream=885 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *5046│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=1784266520713 mono_ms=1278591 event=stream-sub-attach stream=886 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  5047│CONN_LIFECYCLE: conn=2046 role=brain wall_ms=1784266521492 mono_ms=1279369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5048│CONN_LIFECYCLE: conn=2047 role=brain wall_ms=1784266521492 mono_ms=1279369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5049│CONN_LIFECYCLE: conn=2046 role=brain wall_ms=1784266521492 mono_ms=1279369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5253│CONN_LIFECYCLE: conn=2132 role=brain wall_ms=1784266578748 mono_ms=1336625 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5254│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=1784266581598 mono_ms=1339475 event=stream-sub-attach stream=926 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  5255│CONN_LIFECYCLE: conn=2133 role=brain wall_ms=1784266581953 mono_ms=1339831 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5256│CONN_LIFECYCLE: conn=2133 role=brain wall_ms=1784266581953 mono_ms=1339831 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  5257│CONN_LIFECYCLE: conn=2134 role=brain wall_ms=1784266581955 mono_ms=1339832 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5261│CONN_LIFECYCLE: conn=2135 role=brain wall_ms=1784266581957 mono_ms=1339834 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5262│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=1784266582107 mono_ms=1339984 event=stream-sub-attach stream=928 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *5263│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=1784266582355 mono_ms=1340232 event=stream-sub-attach stream=929 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  5264│CONN_LIFECYCLE: conn=2136 role=brain wall_ms=1784266583790 mono_ms=1341668 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5265│CONN_LIFECYCLE: conn=2136 role=brain wall_ms=1784266583790 mono_ms=1341668 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  5266│CONN_LIFECYCLE: conn=2137 role=brain wall_ms=1784266584278 mono_ms=1342155 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5494│CONN_LIFECYCLE: conn=2231 role=brain wall_ms=1784266642328 mono_ms=1400205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5495│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=1784266642989 mono_ms=1400866 event=stream-sub-attach stream=967 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *5496│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=1784266643315 mono_ms=1401192 event=stream-sub-attach stream=968 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *5497│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=1784266643537 mono_ms=1401414 event=stream-sub-attach stream=969 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  5498│CONN_LIFECYCLE: conn=2232 role=brain wall_ms=1784266644309 mono_ms=1402186 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5499│CONN_LIFECYCLE: conn=2232 role=brain wall_ms=1784266644309 mono_ms=1402186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  5500│CONN_LIFECYCLE: conn=2233 role=brain wall_ms=1784266644651 mono_ms=1402528 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5740│CONN_LIFECYCLE: conn=2332 role=brain wall_ms=1784266711115 mono_ms=1468992 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5741│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=1784266711163 mono_ms=1469040 event=stream-sub-attach stream=1014 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *5742│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=1784266711425 mono_ms=1469302 event=stream-sub-attach stream=1015 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  5743│CONN_LIFECYCLE: conn=2333 role=brain wall_ms=1784266712547 mono_ms=1470424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5744│CONN_LIFECYCLE: conn=2334 role=brain wall_ms=1784266712547 mono_ms=1470424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5745│CONN_LIFECYCLE: conn=2333 role=brain wall_ms=1784266712547 mono_ms=1470424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5777│CONN_LIFECYCLE: conn=2347 role=brain wall_ms=1784266712963 mono_ms=1470840 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5778│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=1784266713086 mono_ms=1470963 event=stream-sub-attach stream=1021 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  5779│CONN_LIFECYCLE: conn=2348 role=brain wall_ms=1784266714913 mono_ms=1472790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5780│CONN_LIFECYCLE: conn=2348 role=brain wall_ms=1784266714913 mono_ms=1472790 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  5781│CONN_LIFECYCLE: conn=2349 role=brain wall_ms=1784266714977 mono_ms=1472854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5987│CONN_LIFECYCLE: conn=2435 role=brain wall_ms=1784266773264 mono_ms=1531141 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5988│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=1784266773480 mono_ms=1531357 event=stream-sub-attach stream=1059 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *5989│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=1784266773777 mono_ms=1531654 event=stream-sub-attach stream=1060 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  5990│CONN_LIFECYCLE: conn=2436 role=brain wall_ms=1784266774474 mono_ms=1532350 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5991│CONN_LIFECYCLE: conn=2437 role=brain wall_ms=1784266774474 mono_ms=1532350 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  5992│CONN_LIFECYCLE: conn=2436 role=brain wall_ms=1784266774474 mono_ms=1532350 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6003│CONN_LIFECYCLE: conn=2441 role=brain wall_ms=1784266774498 mono_ms=1532374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6004│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=1784266775001 mono_ms=1532878 event=stream-sub-attach stream=1063 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6005│CONN_LIFECYCLE: conn=2442 role=brain wall_ms=1784266775284 mono_ms=1533160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6006│CONN_LIFECYCLE: conn=2442 role=brain wall_ms=1784266775284 mono_ms=1533160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  6007│CONN_LIFECYCLE: conn=2443 role=brain stream-subscriber stream=1064 wall_ms=1784266775284 mono_ms=1533161 event=stream-sub-attach stream=1064 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6013│CONN_LIFECYCLE: conn=2445 role=brain wall_ms=1784266775423 mono_ms=1533300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6014│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=1784266775603 mono_ms=1533479 event=stream-sub-attach stream=1065 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6015│CONN_LIFECYCLE: conn=2446 role=brain wall_ms=1784266780344 mono_ms=1538221 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6016│CONN_LIFECYCLE: conn=2446 role=brain wall_ms=1784266780344 mono_ms=1538221 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  6017│CONN_LIFECYCLE: conn=2447 role=brain wall_ms=1784266780345 mono_ms=1538222 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6265│CONN_LIFECYCLE: conn=2554 role=brain wall_ms=1784266849949 mono_ms=1607826 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6266│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=1784266850290 mono_ms=1608166 event=stream-sub-attach stream=1110 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6267│CONN_LIFECYCLE: conn=2555 role=brain wall_ms=1784266850514 mono_ms=1608391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6268│CONN_LIFECYCLE: conn=2555 role=brain wall_ms=1784266850514 mono_ms=1608391 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  6269│CONN_LIFECYCLE: conn=2556 role=brain stream-subscriber stream=1111 wall_ms=1784266850515 mono_ms=1608391 event=stream-sub-attach stream=1111 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6287│CONN_LIFECYCLE: conn=2563 role=brain wall_ms=1784266850625 mono_ms=1608501 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6288│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=1784266850833 mono_ms=1608710 event=stream-sub-attach stream=1114 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6289│CONN_LIFECYCLE: conn=2564 role=brain wall_ms=1784266851054 mono_ms=1608930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6290│CONN_LIFECYCLE: conn=2564 role=brain wall_ms=1784266851054 mono_ms=1608930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6291│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=1784266851785 mono_ms=1609662 event=stream-sub-attach stream=1115 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6292│CONN_LIFECYCLE: conn=2539 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6293│CONN_LIFECYCLE: conn=2540 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6294│CONN_LIFECYCLE: conn=2542 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\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  6530│CONN_LIFECYCLE: conn=2657 role=brain stream-subscriber stream=1156 wall_ms=1784266920885 mono_ms=1678762 event=stream-sub-attach stream=1156 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6534│CONN_LIFECYCLE: conn=2658 role=brain wall_ms=1784266920890 mono_ms=1678767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6535│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=1784266921425 mono_ms=1679301 event=stream-sub-attach stream=1158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6536│CONN_LIFECYCLE: conn=2659 role=brain wall_ms=1784266921645 mono_ms=1679521 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6537│CONN_LIFECYCLE: conn=2659 role=brain wall_ms=1784266921645 mono_ms=1679521 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6538│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=1784266921771 mono_ms=1679648 event=stream-sub-attach stream=1159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6539│CONN_LIFECYCLE: conn=2660 role=brain wall_ms=1784266923823 mono_ms=1681699 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6540│CONN_LIFECYCLE: conn=2660 role=brain wall_ms=1784266923823 mono_ms=1681699 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  6541│CONN_LIFECYCLE: conn=2661 role=brain wall_ms=1784266923824 mono_ms=1681700 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6775│CONN_LIFECYCLE: conn=2757 role=brain wall_ms=1784266987094 mono_ms=1744970 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6776│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=1784266987137 mono_ms=1745013 event=stream-sub-attach stream=1213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6777│CONN_LIFECYCLE: conn=2758 role=brain wall_ms=1784266987144 mono_ms=1745020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6778│CONN_LIFECYCLE: conn=2759 role=brain wall_ms=1784266987144 mono_ms=1745020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6779│CONN_LIFECYCLE: conn=2760 role=brain wall_ms=1784266987144 mono_ms=1745020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6883│CONN_LIFECYCLE: conn=2803 role=brain wall_ms=1784266987957 mono_ms=1745833 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6884│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=1784266988270 mono_ms=1746146 event=stream-sub-attach stream=1223 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *6885│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=1784266989853 mono_ms=1747729 event=stream-sub-attach stream=1224 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6886│CONN_LIFECYCLE: conn=2804 role=brain wall_ms=1784266989985 mono_ms=1747861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6887│CONN_LIFECYCLE: conn=2805 role=brain wall_ms=1784266989985 mono_ms=1747861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6888│CONN_LIFECYCLE: conn=2804 role=brain wall_ms=1784266989985 mono_ms=1747861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6899│CONN_LIFECYCLE: conn=2809 role=brain wall_ms=1784266989992 mono_ms=1747868 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *6900│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=1784266990220 mono_ms=1748096 event=stream-sub-attach stream=1227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *6901│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=1784266990833 mono_ms=1748709 event=stream-sub-attach stream=1228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6902│CONN_LIFECYCLE: conn=2810 role=brain wall_ms=1784266992247 mono_ms=1750123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6903│CONN_LIFECYCLE: conn=2810 role=brain wall_ms=1784266992247 mono_ms=1750123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  6904│CONN_LIFECYCLE: conn=2811 role=brain wall_ms=1784266997287 mono_ms=1755163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7192│CONN_LIFECYCLE: conn=2934 role=brain wall_ms=1784267047713 mono_ms=1805589 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7193│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=1784267051230 mono_ms=1809106 event=stream-sub-attach stream=1286 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7194│CONN_LIFECYCLE: conn=2935 role=brain wall_ms=1784267051711 mono_ms=1809587 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7195│CONN_LIFECYCLE: conn=2936 role=brain wall_ms=1784267051711 mono_ms=1809587 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7196│CONN_LIFECYCLE: conn=2935 role=brain wall_ms=1784267051711 mono_ms=1809587 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7207│CONN_LIFECYCLE: conn=2940 role=brain wall_ms=1784267051722 mono_ms=1809598 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7208│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=1784267051910 mono_ms=1809786 event=stream-sub-attach stream=1289 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *7209│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=1784267052616 mono_ms=1810492 event=stream-sub-attach stream=1290 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7210│CONN_LIFECYCLE: conn=2941 role=brain wall_ms=1784267052758 mono_ms=1810634 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7211│CONN_LIFECYCLE: conn=2941 role=brain wall_ms=1784267052758 mono_ms=1810634 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7212│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=1784267053344 mono_ms=1811220 event=stream-sub-attach stream=1291 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *7213│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=1784267053582 mono_ms=1811458 event=stream-sub-attach stream=1292 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7214│CONN_LIFECYCLE: conn=2942 role=brain wall_ms=1784267054449 mono_ms=1812325 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7215│CONN_LIFECYCLE: conn=2942 role=brain wall_ms=1784267054449 mono_ms=1812325 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  7216│CONN_LIFECYCLE: conn=2943 role=brain wall_ms=1784267054450 mono_ms=1812326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\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  7618│CONN_LIFECYCLE: conn=3109 role=brain stream-subscriber stream=1347 wall_ms=1784267124338 mono_ms=1882214 event=stream-sub-attach stream=1347 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7622│CONN_LIFECYCLE: conn=3110 role=brain wall_ms=1784267124344 mono_ms=1882220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7623│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=1784267124525 mono_ms=1882401 event=stream-sub-attach stream=1370 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *7624│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=1784267125333 mono_ms=1883209 event=stream-sub-attach stream=1371 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7625│CONN_LIFECYCLE: conn=3111 role=brain wall_ms=1784267126367 mono_ms=1884243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7626│CONN_LIFECYCLE: conn=3112 role=brain wall_ms=1784267126367 mono_ms=1884243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7627│CONN_LIFECYCLE: conn=3113 role=brain wall_ms=1784267126367 mono_ms=1884243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7645│CONN_LIFECYCLE: conn=3119 role=brain wall_ms=1784267126382 mono_ms=1884258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7646│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=1784267126397 mono_ms=1884272 event=stream-sub-attach stream=1375 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *7647│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=1784267126812 mono_ms=1884688 event=stream-sub-attach stream=1376 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7648│CONN_LIFECYCLE: conn=3120 role=brain wall_ms=1784267128396 mono_ms=1886272 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7649│CONN_LIFECYCLE: conn=3122 role=brain wall_ms=1784267128396 mono_ms=1886272 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7650│CONN_LIFECYCLE: conn=3121 role=brain wall_ms=1784267128396 mono_ms=1886272 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7980│CONN_LIFECYCLE: conn=3260 role=brain wall_ms=1784267183887 mono_ms=1941763 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7981│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=1784267187508 mono_ms=1945384 event=stream-sub-attach stream=1440 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *7982│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=1784267187933 mono_ms=1945808 event=stream-sub-attach stream=1441 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *7983│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=1784267188224 mono_ms=1946100 event=stream-sub-attach stream=1442 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7984│CONN_LIFECYCLE: conn=3261 role=brain wall_ms=1784267188938 mono_ms=1946814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7985│CONN_LIFECYCLE: conn=3261 role=brain wall_ms=1784267188938 mono_ms=1946814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7986│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=1784267189697 mono_ms=1947572 event=stream-sub-attach stream=1443 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7987│CONN_LIFECYCLE: conn=3262 role=brain wall_ms=1784267190202 mono_ms=1948078 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7988│CONN_LIFECYCLE: conn=3262 role=brain wall_ms=1784267190202 mono_ms=1948078 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  7989│CONN_LIFECYCLE: conn=3263 role=brain wall_ms=1784267190203 mono_ms=1948079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7993│CONN_LIFECYCLE: conn=3264 role=brain wall_ms=1784267190205 mono_ms=1948081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *7994│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=1784267190548 mono_ms=1948424 event=stream-sub-attach stream=1445 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7995│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  7996│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  7997│PAIR_MEET_UP:SPT_DEV step=59475573 id=95b8e6e6e2867355d918c23e50a152bc5f8feb74f97d507b4fa4479497651e61 addr=EndpointAddr { id: PublicKey(95b8e6e6e2867355d918c23e50a152bc5f8feb74f97d507b4fa4479497651e61), addrs: {Ip(100.68.35.65:49170), Ip(192.168.1.81:49170)} }\n      │...\n  8375│CONN_LIFECYCLE: conn=3423 role=brain wall_ms=1784267250815 mono_ms=2008690 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *8376│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=1784267251361 mono_ms=2009236 event=stream-sub-attach stream=1510 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *8377│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=1784267252026 mono_ms=2009901 event=stream-sub-attach stream=1511 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *8378│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=1784267252733 mono_ms=2010608 event=stream-sub-attach stream=1512 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  8379│CONN_LIFECYCLE: conn=3424 role=brain wall_ms=1784267252944 mono_ms=2010820 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  8380│CONN_LIFECYCLE: conn=3424 role=brain wall_ms=1784267252944 mono_ms=2010820 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  8381│CONN_LIFECYCLE: conn=3425 role=brain stream-subscriber stream=1513 wall_ms=1784267252945 mono_ms=2010820 event=stream-sub-attach stream=1513 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  8385│CONN_LIFECYCLE: conn=3426 role=brain wall_ms=1784267252945 mono_ms=2010821 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *8386│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=1784267253026 mono_ms=2010902 event=stream-sub-attach stream=1514 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *8387│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=1784267253482 mono_ms=2011357 event=stream-sub-attach stream=1515 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  8388│CONN_LIFECYCLE: conn=3427 role=brain wall_ms=1784267254062 mono_ms=2011938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  8389│CONN_LIFECYCLE: conn=3428 role=brain wall_ms=1784267254062 mono_ms=2011938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  8390│CONN_LIFECYCLE: conn=3428 role=brain wall_ms=1784267254062 mono_ms=2011938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  8778│CONN_LIFECYCLE: conn=3592 role=brain wall_ms=1784267317056 mono_ms=2074932 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *8779│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=1784267317466 mono_ms=2075341 event=stream-sub-attach stream=1592 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *8780│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=1784267317829 mono_ms=2075704 event=stream-sub-attach stream=1593 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  8781│CONN_LIFECYCLE: conn=3593 role=brain wall_ms=1784267318171 mono_ms=2076046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  8782│CONN_LIFECYCLE: conn=3593 role=brain wall_ms=1784267318171 mono_ms=2076046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  8783│CONN_LIFECYCLE: conn=3594 role=brain wall_ms=1784267318172 mono_ms=2076047 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  8787│CONN_LIFECYCLE: conn=3595 role=brain wall_ms=1784267318181 mono_ms=2076057 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *8788│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=1784267318564 mono_ms=2076439 event=stream-sub-attach stream=1595 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *8789│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=1784267319274 mono_ms=2077150 event=stream-sub-attach stream=1596 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *8790│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=1784267320131 mono_ms=2078006 event=stream-sub-attach stream=1597 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  8791│CONN_LIFECYCLE: conn=3596 role=brain wall_ms=1784267321219 mono_ms=2079094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  8792│CONN_LIFECYCLE: conn=3596 role=brain wall_ms=1784267321219 mono_ms=2079094 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  8793│CONN_LIFECYCLE: conn=3597 role=brain stream-subscriber stream=1598 wall_ms=1784267321219 mono_ms=2079094 event=stream-sub-attach stream=1598 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9095│CONN_LIFECYCLE: conn=3724 role=brain wall_ms=1784267376715 mono_ms=2134590 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9096│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=1784267380430 mono_ms=2138305 event=stream-sub-attach stream=1659 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9097│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=1784267381225 mono_ms=2139100 event=stream-sub-attach stream=1660 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  9098│CONN_LIFECYCLE: conn=3725 role=brain wall_ms=1784267381376 mono_ms=2139251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9099│CONN_LIFECYCLE: conn=3725 role=brain wall_ms=1784267381376 mono_ms=2139251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  9100│CONN_LIFECYCLE: conn=3726 role=brain wall_ms=1784267381377 mono_ms=2139252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9120│CONN_LIFECYCLE: conn=3734 role=brain wall_ms=1784267382088 mono_ms=2139963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9121│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=1784267382173 mono_ms=2140048 event=stream-sub-attach stream=1664 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9122│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=1784267382673 mono_ms=2140548 event=stream-sub-attach stream=1665 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  9123│CONN_LIFECYCLE: conn=3735 role=brain wall_ms=1784267383610 mono_ms=2141486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9124│CONN_LIFECYCLE: conn=3737 role=brain wall_ms=1784267383611 mono_ms=2141486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9125│CONN_LIFECYCLE: conn=3735 role=brain wall_ms=1784267383611 mono_ms=2141486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9143│CONN_LIFECYCLE: conn=3743 role=brain wall_ms=1784267383638 mono_ms=2141513 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9144│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=1784267383675 mono_ms=2141550 event=stream-sub-attach stream=1669 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  9145│CONN_LIFECYCLE: conn=3744 role=brain wall_ms=1784267385541 mono_ms=2143416 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9146│CONN_LIFECYCLE: conn=3745 role=brain wall_ms=1784267385541 mono_ms=2143416 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9147│CONN_LIFECYCLE: conn=3744 role=brain wall_ms=1784267385541 mono_ms=2143416 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9537│CONN_LIFECYCLE: conn=3910 role=brain wall_ms=1784267453181 mono_ms=2211056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9538│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=1784267453199 mono_ms=2211074 event=stream-sub-attach stream=1747 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9539│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=1784267453423 mono_ms=2211298 event=stream-sub-attach stream=1748 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9540│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=1784267454869 mono_ms=2212744 event=stream-sub-attach stream=1749 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9541│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=1784267456055 mono_ms=2213930 event=stream-sub-attach stream=1750 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9542│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=1784267456569 mono_ms=2214444 event=stream-sub-attach stream=1751 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  9543│CONN_LIFECYCLE: conn=3911 role=brain wall_ms=1784267456833 mono_ms=2214707 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9544│CONN_LIFECYCLE: conn=3911 role=brain wall_ms=1784267456833 mono_ms=2214707 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  9545│CONN_LIFECYCLE: conn=3912 role=brain wall_ms=1784267456834 mono_ms=2214709 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9896│CONN_LIFECYCLE: conn=4060 role=brain wall_ms=1784267517076 mono_ms=2274950 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9897│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=1784267517356 mono_ms=2275231 event=stream-sub-attach stream=1822 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  9898│CONN_LIFECYCLE: conn=4061 role=brain wall_ms=1784267517378 mono_ms=2275252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9899│CONN_LIFECYCLE: conn=4062 role=brain wall_ms=1784267517378 mono_ms=2275252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9900│CONN_LIFECYCLE: conn=4062 role=brain wall_ms=1784267517378 mono_ms=2275252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9911│CONN_LIFECYCLE: conn=4066 role=brain wall_ms=1784267517386 mono_ms=2275261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9912│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=1784267517628 mono_ms=2275502 event=stream-sub-attach stream=1823 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  9913│CONN_LIFECYCLE: conn=4067 role=brain wall_ms=1784267517945 mono_ms=2275820 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9914│CONN_LIFECYCLE: conn=4067 role=brain wall_ms=1784267517945 mono_ms=2275820 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  9915│CONN_LIFECYCLE: conn=4068 role=brain wall_ms=1784267518192 mono_ms=2276067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9928│CONN_LIFECYCLE: conn=4073 role=brain wall_ms=1784267518199 mono_ms=2276074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9929│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=1784267518263 mono_ms=2276138 event=stream-sub-attach stream=1826 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9930│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=1784267518982 mono_ms=2276857 event=stream-sub-attach stream=1827 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n *9931│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=1784267519806 mono_ms=2277681 event=stream-sub-attach stream=1828 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  9932│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  9933│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  9934│PAIR_MEET_UP:SPT_DEV step=59475584 id=67e098b1e1f56ed8c4cb33234100f5d1f71e7fce0b564ea01d7a1729519ba013 addr=EndpointAddr { id: PublicKey(67e098b1e1f56ed8c4cb33234100f5d1f71e7fce0b564ea01d7a1729519ba013), addrs: {Ip(100.68.35.65:56532), Ip(192.168.1.81:56532)} }\n      │...\n 10309│CONN_LIFECYCLE: conn=4231 role=brain wall_ms=1784267588670 mono_ms=2346545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*10310│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=1784267589202 mono_ms=2347077 event=stream-sub-attach stream=1903 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*10311│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=1784267589768 mono_ms=2347642 event=stream-sub-attach stream=1904 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*10312│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=1784267590120 mono_ms=2347994 event=stream-sub-attach stream=1905 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*10313│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=1784267590828 mono_ms=2348703 event=stream-sub-attach stream=1906 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*10314│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=1784267591654 mono_ms=2349529 event=stream-sub-attach stream=1907 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 10315│CONN_LIFECYCLE: conn=4232 role=brain wall_ms=1784267592416 mono_ms=2350291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 10316│CONN_LIFECYCLE: conn=4232 role=brain wall_ms=1784267592417 mono_ms=2350291 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 10317│CONN_LIFECYCLE: conn=4233 role=brain wall_ms=1784267592418 mono_ms=2350292 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 10689│CONN_LIFECYCLE: conn=4390 role=brain wall_ms=1784267649081 mono_ms=2406955 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*10690│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=1784267652135 mono_ms=2410009 event=stream-sub-attach stream=1977 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*10691│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=1784267652436 mono_ms=2410310 event=stream-sub-attach stream=1978 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*10692│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=1784267652871 mono_ms=2410745 event=stream-sub-attach stream=1979 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*10693│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=1784267653743 mono_ms=2411617 event=stream-sub-attach stream=1980 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 10694│CONN_LIFECYCLE: conn=4391 role=brain wall_ms=1784267654121 mono_ms=2411996 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 10695│CONN_LIFECYCLE: conn=4391 role=brain wall_ms=1784267654121 mono_ms=2411996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*10696│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=1784267655588 mono_ms=2413463 event=stream-sub-attach stream=1981 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 10697│CONN_LIFECYCLE: conn=4392 role=brain wall_ms=1784267658014 mono_ms=2415888 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 10698│CONN_LIFECYCLE: conn=4393 role=brain wall_ms=1784267658014 mono_ms=2415888 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 10699│CONN_LIFECYCLE: conn=4392 role=brain wall_ms=1784267658014 mono_ms=2415888 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11101│CONN_LIFECYCLE: conn=4563 role=brain wall_ms=1784267723147 mono_ms=2481021 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11102│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=1784267724133 mono_ms=2482007 event=stream-sub-attach stream=2060 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11103│CONN_LIFECYCLE: conn=4564 role=brain wall_ms=1784267724470 mono_ms=2482345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11104│CONN_LIFECYCLE: conn=4564 role=brain wall_ms=1784267724470 mono_ms=2482345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11105│CONN_LIFECYCLE: conn=4565 role=brain stream-subscriber stream=2061 wall_ms=1784267724471 mono_ms=2482345 event=stream-sub-attach stream=2061 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11117│CONN_LIFECYCLE: conn=4570 role=brain wall_ms=1784267724725 mono_ms=2482599 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*11118│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=1784267724725 mono_ms=2482599 event=stream-sub-attach stream=2063 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11119│CONN_LIFECYCLE: conn=4570 role=brain wall_ms=1784267724725 mono_ms=2482599 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11120│CONN_LIFECYCLE: conn=4571 role=brain wall_ms=1784267724981 mono_ms=2482855 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11121│CONN_LIFECYCLE: conn=4571 role=brain wall_ms=1784267724981 mono_ms=2482855 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11126│CONN_LIFECYCLE: conn=4573 role=brain wall_ms=1784267724985 mono_ms=2482859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11127│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=1784267725180 mono_ms=2483055 event=stream-sub-attach stream=2065 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*11128│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=1784267726634 mono_ms=2484508 event=stream-sub-attach stream=2066 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*11129│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=1784267727357 mono_ms=2485231 event=stream-sub-attach stream=2067 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11130│CONN_LIFECYCLE: conn=4574 role=brain wall_ms=1784267728347 mono_ms=2486221 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11131│CONN_LIFECYCLE: conn=4575 role=brain wall_ms=1784267728347 mono_ms=2486221 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11132│CONN_LIFECYCLE: conn=4574 role=brain wall_ms=1784267728347 mono_ms=2486221 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11469│CONN_LIFECYCLE: conn=4717 role=brain wall_ms=1784267786061 mono_ms=2543935 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11470│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=1784267788093 mono_ms=2545967 event=stream-sub-attach stream=2132 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11471│CONN_LIFECYCLE: conn=4718 role=brain wall_ms=1784267788609 mono_ms=2546483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11472│CONN_LIFECYCLE: conn=4718 role=brain wall_ms=1784267788609 mono_ms=2546483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11473│CONN_LIFECYCLE: conn=4719 role=brain wall_ms=1784267788610 mono_ms=2546484 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11484│CONN_LIFECYCLE: conn=4723 role=brain wall_ms=1784267788715 mono_ms=2546589 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11485│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=1784267788791 mono_ms=2546664 event=stream-sub-attach stream=2135 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11486│CONN_LIFECYCLE: conn=4724 role=brain wall_ms=1784267788813 mono_ms=2546687 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11487│CONN_LIFECYCLE: conn=4724 role=brain wall_ms=1784267788813 mono_ms=2546687 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11488│CONN_LIFECYCLE: conn=4725 role=brain wall_ms=1784267788814 mono_ms=2546688 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11492│CONN_LIFECYCLE: conn=4726 role=brain wall_ms=1784267788896 mono_ms=2546770 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11493│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=1784267789137 mono_ms=2547011 event=stream-sub-attach stream=2137 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*11494│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=1784267789559 mono_ms=2547433 event=stream-sub-attach stream=2138 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*11495│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=1784267790234 mono_ms=2548108 event=stream-sub-attach stream=2139 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11496│CONN_LIFECYCLE: conn=4727 role=brain wall_ms=1784267790287 mono_ms=2548161 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11497│CONN_LIFECYCLE: conn=4727 role=brain wall_ms=1784267790287 mono_ms=2548161 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11498│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n      │...\n 11501│PAIR_MEET_UP:BIGNET step=59475593 id=b95d98cdac80bca1ac509f18d56e0ae776e8d4b8b857d30ed20cf769f28556f0 addr=EndpointAddr { id: PublicKey(b95d98cdac80bca1ac509f18d56e0ae776e8d4b8b857d30ed20cf769f28556f0), addrs: {Ip(100.68.35.65:50301), Ip(192.168.1.81:50301)} }\n*11502│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=1784267791137 mono_ms=2549011 event=stream-sub-attach stream=2140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11503│CONN_LIFECYCLE: conn=4728 role=brain wall_ms=1784267793302 mono_ms=2551176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11504│CONN_LIFECYCLE: conn=4729 role=brain wall_ms=1784267793302 mono_ms=2551176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11505│CONN_LIFECYCLE: conn=4728 role=brain wall_ms=1784267793302 mono_ms=2551176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11909│CONN_LIFECYCLE: conn=4899 role=brain wall_ms=1784267859030 mono_ms=2616903 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11910│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=1784267859107 mono_ms=2616981 event=stream-sub-attach stream=2217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*11911│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=1784267859313 mono_ms=2617187 event=stream-sub-attach stream=2219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11912│CONN_LIFECYCLE: conn=4900 role=brain wall_ms=1784267860038 mono_ms=2617912 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11913│CONN_LIFECYCLE: conn=4900 role=brain wall_ms=1784267860038 mono_ms=2617912 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11914│CONN_LIFECYCLE: conn=4901 role=brain stream-subscriber stream=2221 wall_ms=1784267860038 mono_ms=2617912 event=stream-sub-attach stream=2221 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11918│CONN_LIFECYCLE: conn=4902 role=brain wall_ms=1784267860045 mono_ms=2617919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11919│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=1784267860052 mono_ms=2617925 event=stream-sub-attach stream=2222 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*11920│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=1784267860848 mono_ms=2618721 event=stream-sub-attach stream=2224 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11921│CONN_LIFECYCLE: conn=4903 role=brain wall_ms=1784267860915 mono_ms=2618789 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11922│CONN_LIFECYCLE: conn=4903 role=brain wall_ms=1784267860915 mono_ms=2618789 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11923│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=1784267862711 mono_ms=2620585 event=stream-sub-attach stream=2226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 11924│CONN_LIFECYCLE: conn=4904 role=brain wall_ms=1784267864122 mono_ms=2621996 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11925│CONN_LIFECYCLE: conn=4904 role=brain wall_ms=1784267864123 mono_ms=2621996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11926│CONN_LIFECYCLE: conn=4905 role=brain wall_ms=1784267864124 mono_ms=2621997 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 12291│CONN_LIFECYCLE: conn=5059 role=brain wall_ms=1784267921434 mono_ms=2679307 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*12292│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=1784267923038 mono_ms=2680912 event=stream-sub-attach stream=2296 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*12293│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=1784267923221 mono_ms=2681095 event=stream-sub-attach stream=2297 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*12294│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=1784267923485 mono_ms=2681359 event=stream-sub-attach stream=2298 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 12295│CONN_LIFECYCLE: conn=5060 role=brain wall_ms=1784267925376 mono_ms=2683250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12296│CONN_LIFECYCLE: conn=5061 role=brain wall_ms=1784267925376 mono_ms=2683250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12297│CONN_LIFECYCLE: conn=5062 role=brain wall_ms=1784267925376 mono_ms=2683250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 12315│CONN_LIFECYCLE: conn=5068 role=brain wall_ms=1784267925399 mono_ms=2683273 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*12316│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=1784267925494 mono_ms=2683368 event=stream-sub-attach stream=2302 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*12317│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=1784267926033 mono_ms=2683906 event=stream-sub-attach stream=2303 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 12318│CONN_LIFECYCLE: conn=5069 role=brain wall_ms=1784267926475 mono_ms=2684348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12319│CONN_LIFECYCLE: conn=5069 role=brain wall_ms=1784267926475 mono_ms=2684349 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 12320│CONN_LIFECYCLE: conn=5070 role=brain wall_ms=1784267929054 mono_ms=2686927 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 12675│CONN_LIFECYCLE: conn=5220 role=brain wall_ms=1784267994846 mono_ms=2752719 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*12676│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=1784267994904 mono_ms=2752777 event=stream-sub-attach stream=2376 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 12677│CONN_LIFECYCLE: conn=5221 role=brain wall_ms=1784267995045 mono_ms=2752919 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12678│CONN_LIFECYCLE: conn=5221 role=brain wall_ms=1784267995045 mono_ms=2752919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 12679│CONN_LIFECYCLE: conn=5222 role=brain stream-subscriber stream=2377 wall_ms=1784267995046 mono_ms=2752919 event=stream-sub-attach stream=2377 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 12718│CONN_LIFECYCLE: conn=5238 role=brain wall_ms=1784267995580 mono_ms=2753454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*12719│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=1784267995984 mono_ms=2753857 event=stream-sub-attach stream=2383 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*12720│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=1784267996653 mono_ms=2754527 event=stream-sub-attach stream=2384 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 12721│CONN_LIFECYCLE: conn=5239 role=brain wall_ms=1784267997074 mono_ms=2754947 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12722│CONN_LIFECYCLE: conn=5239 role=brain wall_ms=1784267997074 mono_ms=2754947 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*12723│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=1784267997263 mono_ms=2755136 event=stream-sub-attach stream=2385 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 12724│CONN_LIFECYCLE: conn=5240 role=brain wall_ms=1784267997704 mono_ms=2755577 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12725│CONN_LIFECYCLE: conn=5241 role=brain wall_ms=1784267997704 mono_ms=2755577 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12726│CONN_LIFECYCLE: conn=5240 role=brain wall_ms=1784267997704 mono_ms=2755577 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 12737│CONN_LIFECYCLE: conn=5245 role=brain wall_ms=1784267997724 mono_ms=2755598 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*12738│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=1784267997768 mono_ms=2755641 event=stream-sub-attach stream=2388 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 12739│CONN_LIFECYCLE: conn=5246 role=brain wall_ms=1784267999339 mono_ms=2757212 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 12740│CONN_LIFECYCLE: conn=5246 role=brain wall_ms=1784267999339 mono_ms=2757212 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 12741│CONN_LIFECYCLE: conn=5247 role=brain wall_ms=1784267999340 mono_ms=2757214 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 13050│CONN_LIFECYCLE: conn=5377 role=brain wall_ms=1784268057588 mono_ms=2815461 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13051│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=1784268058108 mono_ms=2815981 event=stream-sub-attach stream=2449 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13052│CONN_LIFECYCLE: conn=5378 role=brain wall_ms=1784268058318 mono_ms=2816191 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13053│CONN_LIFECYCLE: conn=5379 role=brain wall_ms=1784268058318 mono_ms=2816191 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13054│CONN_LIFECYCLE: conn=5380 role=brain wall_ms=1784268058318 mono_ms=2816191 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 13093│CONN_LIFECYCLE: conn=5395 role=brain wall_ms=1784268058439 mono_ms=2816313 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13094│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=1784268059078 mono_ms=2816951 event=stream-sub-attach stream=2456 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*13095│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=1784268059356 mono_ms=2817229 event=stream-sub-attach stream=2457 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13096│CONN_LIFECYCLE: conn=5396 role=brain wall_ms=1784268059749 mono_ms=2817623 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13097│CONN_LIFECYCLE: conn=5396 role=brain wall_ms=1784268059749 mono_ms=2817623 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 13098│CONN_LIFECYCLE: conn=5397 role=brain wall_ms=1784268059750 mono_ms=2817624 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 13102│CONN_LIFECYCLE: conn=5398 role=brain wall_ms=1784268059753 mono_ms=2817626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13103│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=1784268060189 mono_ms=2818062 event=stream-sub-attach stream=2459 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13104│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 13105│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 13106│PAIR_MEET_UP:SPT_DEV step=59475602 id=d3151da9e38bfb488650f7266977d10944cde07427dc8968b492fecd005d9b1a addr=EndpointAddr { id: PublicKey(d3151da9e38bfb488650f7266977d10944cde07427dc8968b492fecd005d9b1a), addrs: {Ip(100.68.35.65:50068), Ip(192.168.1.81:50068)} }\n 13107│PAIR_MEET_UP:BIGNET step=59475602 id=cff9654abe6e5521f5044a176bda6ee256cd74a9881c96c89316edf0e9cac387 addr=EndpointAddr { id: PublicKey(cff9654abe6e5521f5044a176bda6ee256cd74a9881c96c89316edf0e9cac387), addrs: {Ip(100.68.35.65:50069), Ip(192.168.1.81:50069)} }\n*13108│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=1784268061208 mono_ms=2819082 event=stream-sub-attach stream=2460 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13109│CONN_LIFECYCLE: conn=5399 role=brain wall_ms=1784268061489 mono_ms=2819362 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13110│CONN_LIFECYCLE: conn=5399 role=brain wall_ms=1784268061489 mono_ms=2819362 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 13111│CONN_LIFECYCLE: conn=5400 role=brain stream-subscriber stream=2461 wall_ms=1784268061489 mono_ms=2819363 event=stream-sub-attach stream=2461 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\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 13532│CONN_LIFECYCLE: conn=5577 role=brain wall_ms=1784268142611 mono_ms=2900484 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 13533│CONN_LIFECYCLE: conn=5578 role=brain stream-subscriber stream=2542 wall_ms=1784268142611 mono_ms=2900484 event=stream-sub-attach stream=2542 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 13539│CONN_LIFECYCLE: conn=5580 role=brain wall_ms=1784268143306 mono_ms=2901179 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13540│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=1784268143564 mono_ms=2901437 event=stream-sub-attach stream=2543 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*13541│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=1784268143958 mono_ms=2901831 event=stream-sub-attach stream=2544 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*13542│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=1784268144258 mono_ms=2902131 event=stream-sub-attach stream=2545 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13543│CONN_LIFECYCLE: conn=5581 role=brain wall_ms=1784268146908 mono_ms=2904781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13544│CONN_LIFECYCLE: conn=5582 role=brain wall_ms=1784268146908 mono_ms=2904781 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13545│CONN_LIFECYCLE: conn=5581 role=brain wall_ms=1784268146908 mono_ms=2904781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 13903│CONN_LIFECYCLE: conn=5733 role=brain wall_ms=1784268203813 mono_ms=2961685 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13904│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=1784268204991 mono_ms=2962864 event=stream-sub-attach stream=2613 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*13905│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=1784268205303 mono_ms=2963176 event=stream-sub-attach stream=2614 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*13906│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=1784268205672 mono_ms=2963545 event=stream-sub-attach stream=2615 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13907│CONN_LIFECYCLE: conn=5734 role=brain wall_ms=1784268207188 mono_ms=2965061 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13908│CONN_LIFECYCLE: conn=5735 role=brain wall_ms=1784268207188 mono_ms=2965061 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13909│CONN_LIFECYCLE: conn=5734 role=brain wall_ms=1784268207188 mono_ms=2965061 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 13920│CONN_LIFECYCLE: conn=5739 role=brain wall_ms=1784268207197 mono_ms=2965069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13921│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=1784268207654 mono_ms=2965527 event=stream-sub-attach stream=2618 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13922│CONN_LIFECYCLE: conn=5740 role=brain wall_ms=1784268208851 mono_ms=2966724 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13923│CONN_LIFECYCLE: conn=5740 role=brain wall_ms=1784268208852 mono_ms=2966724 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13924│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=1784268209170 mono_ms=2967043 event=stream-sub-attach stream=2619 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13925│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 13926│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 13927│PAIR_MEET_UP:BIGNET step=59475607 id=f8619a70704874da64fb746ff4baad14fc038977fba73b1931a2a6d9dd908a7b addr=EndpointAddr { id: PublicKey(f8619a70704874da64fb746ff4baad14fc038977fba73b1931a2a6d9dd908a7b), addrs: {Ip(100.68.35.65:62012), Ip(192.168.1.81:62012)} }\n      │...\n 14297│CONN_LIFECYCLE: conn=5899 role=brain wall_ms=1784268281041 mono_ms=3038914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*14298│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=1784268281050 mono_ms=3038922 event=stream-sub-attach stream=2700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 14299│CONN_LIFECYCLE: conn=5897 role=brain wall_ms=1784268281056 mono_ms=3038928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 14300│CONN_LIFECYCLE: conn=5898 role=brain wall_ms=1784268281056 mono_ms=3038928 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 14301│CONN_LIFECYCLE: conn=5898 role=brain stream-subscriber stream=2687 wall_ms=1784268281056 mono_ms=3038928 event=stream-sub-attach stream=2687 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 14322│CONN_LIFECYCLE: conn=5907 role=brain wall_ms=1784268281152 mono_ms=3039025 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*14323│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=1784268281298 mono_ms=3039171 event=stream-sub-attach stream=2701 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 14324│CONN_LIFECYCLE: conn=5908 role=brain wall_ms=1784268281447 mono_ms=3039320 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 14325│CONN_LIFECYCLE: conn=5909 role=brain wall_ms=1784268281447 mono_ms=3039320 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 14326│CONN_LIFECYCLE: conn=5908 role=brain wall_ms=1784268281447 mono_ms=3039320 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 14337│CONN_LIFECYCLE: conn=5913 role=brain wall_ms=1784268281461 mono_ms=3039333 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*14338│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=1784268281692 mono_ms=3039565 event=stream-sub-attach stream=2704 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*14339│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=1784268282922 mono_ms=3040795 event=stream-sub-attach stream=2705 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*14340│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=1784268283851 mono_ms=3041723 event=stream-sub-attach stream=2706 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 14341│CONN_LIFECYCLE: conn=5914 role=brain wall_ms=1784268284507 mono_ms=3042379 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 14342│CONN_LIFECYCLE: conn=5914 role=brain wall_ms=1784268284507 mono_ms=3042380 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 14343│CONN_LIFECYCLE: conn=5915 role=brain wall_ms=1784268284622 mono_ms=3042495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 14724│CONN_LIFECYCLE: conn=6076 role=brain wall_ms=1784268345337 mono_ms=3103210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*14725│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=1784268345808 mono_ms=3103680 event=stream-sub-attach stream=2777 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*14726│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=1784268346791 mono_ms=3104663 event=stream-sub-attach stream=2778 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*14727│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=1784268347879 mono_ms=3105752 event=stream-sub-attach stream=2779 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 14728│CONN_LIFECYCLE: conn=6077 role=brain wall_ms=1784268348429 mono_ms=3106301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 14729│CONN_LIFECYCLE: conn=6077 role=brain wall_ms=1784268348429 mono_ms=3106301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 14730│CONN_LIFECYCLE: conn=6078 role=brain wall_ms=1784268348430 mono_ms=3106302 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 14734│CONN_LIFECYCLE: conn=6079 role=brain wall_ms=1784268348594 mono_ms=3106467 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*14735│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=1784268349815 mono_ms=3107688 event=stream-sub-attach stream=2781 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*14736│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=1784268350271 mono_ms=3108144 event=stream-sub-attach stream=2782 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 14737│CONN_LIFECYCLE: conn=6080 role=brain wall_ms=1784268350381 mono_ms=3108254 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 14738│CONN_LIFECYCLE: conn=6080 role=brain wall_ms=1784268350381 mono_ms=3108254 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 14739│CONN_LIFECYCLE: conn=6081 role=brain wall_ms=1784268350989 mono_ms=3108862 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15101│CONN_LIFECYCLE: conn=6234 role=brain wall_ms=1784268417345 mono_ms=3175218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15102│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=1784268417538 mono_ms=3175411 event=stream-sub-attach stream=2855 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15103│CONN_LIFECYCLE: conn=6235 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15104│CONN_LIFECYCLE: conn=6236 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15105│CONN_LIFECYCLE: conn=6237 role=brain wall_ms=1784268418223 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15151│CONN_LIFECYCLE: conn=6255 role=brain wall_ms=1784268418789 mono_ms=3176662 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15152│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=1784268418969 mono_ms=3176841 event=stream-sub-attach stream=2863 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15153│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=1784268419645 mono_ms=3177517 event=stream-sub-attach stream=2864 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15154│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=1784268420277 mono_ms=3178149 event=stream-sub-attach stream=2865 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15155│CONN_LIFECYCLE: conn=6256 role=brain wall_ms=1784268420982 mono_ms=3178854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15156│CONN_LIFECYCLE: conn=6256 role=brain wall_ms=1784268420982 mono_ms=3178854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15157│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n      │...\n 15160│PAIR_MEET_UP:BIGNET step=59475614 id=ce578be680c77e2feae2022ddb59b35069c19ffcda8dd8b7a6bd0c289759a34d addr=EndpointAddr { id: PublicKey(ce578be680c77e2feae2022ddb59b35069c19ffcda8dd8b7a6bd0c289759a34d), addrs: {Ip(100.68.35.65:52064), Ip(192.168.1.81:52064)} }\n*15161│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=1784268421765 mono_ms=3179638 event=stream-sub-attach stream=2866 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15162│CONN_LIFECYCLE: conn=6257 role=brain wall_ms=1784268423556 mono_ms=3181429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15163│CONN_LIFECYCLE: conn=6258 role=brain wall_ms=1784268423556 mono_ms=3181429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15164│CONN_LIFECYCLE: conn=6257 role=brain wall_ms=1784268423557 mono_ms=3181429 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15538│CONN_LIFECYCLE: conn=6415 role=brain wall_ms=1784268481498 mono_ms=3239370 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15539│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=1784268482143 mono_ms=3240015 event=stream-sub-attach stream=2936 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15540│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=1784268482712 mono_ms=3240584 event=stream-sub-attach stream=2937 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15541│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=1784268483571 mono_ms=3241443 event=stream-sub-attach stream=2938 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15542│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=1784268484564 mono_ms=3242436 event=stream-sub-attach stream=2939 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15543│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=1784268485187 mono_ms=3243059 event=stream-sub-attach stream=2940 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15544│CONN_LIFECYCLE: conn=6416 role=brain wall_ms=1784268485803 mono_ms=3243675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15545│CONN_LIFECYCLE: conn=6416 role=brain wall_ms=1784268485803 mono_ms=3243675 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15546│CONN_LIFECYCLE: conn=6417 role=brain stream-subscriber stream=2941 wall_ms=1784268485804 mono_ms=3243676 event=stream-sub-attach stream=2941 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15866│CONN_LIFECYCLE: conn=6552 role=brain wall_ms=1784268553754 mono_ms=3311626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15867│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=1784268553805 mono_ms=3311676 event=stream-sub-attach stream=3019 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15868│CONN_LIFECYCLE: conn=6554 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15869│CONN_LIFECYCLE: conn=6553 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15870│CONN_LIFECYCLE: conn=6555 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15916│CONN_LIFECYCLE: conn=6573 role=brain wall_ms=1784268554056 mono_ms=3311928 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15917│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=1784268554112 mono_ms=3311984 event=stream-sub-attach stream=3020 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15918│CONN_LIFECYCLE: conn=6574 role=brain wall_ms=1784268554257 mono_ms=3312129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15919│CONN_LIFECYCLE: conn=6575 role=brain wall_ms=1784268554257 mono_ms=3312129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15920│CONN_LIFECYCLE: conn=6574 role=brain wall_ms=1784268554257 mono_ms=3312129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15931│CONN_LIFECYCLE: conn=6579 role=brain wall_ms=1784268554317 mono_ms=3312189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15932│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=1784268555723 mono_ms=3313595 event=stream-sub-attach stream=3023 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15933│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=1784268556880 mono_ms=3314752 event=stream-sub-attach stream=3024 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15934│CONN_LIFECYCLE: conn=6580 role=brain wall_ms=1784268557141 mono_ms=3315013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15935│CONN_LIFECYCLE: conn=6580 role=brain wall_ms=1784268557141 mono_ms=3315013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncation":{"content":" 499|CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*500|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 501|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 502|CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 503|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 514|CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*515|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*516|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*517|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*518|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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*519|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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 520|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 521|CONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 522|CONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\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*809|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=1784265385698 mono_ms=143578 event=stream-sub-attach stream=108 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*810|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=1784265385899 mono_ms=143779 event=stream-sub-attach stream=109 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 811|CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 812|CONN_LIFECYCLE: conn=299 role=brain wall_ms=1784265389232 mono_ms=147112 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 813|CONN_LIFECYCLE: conn=300 role=brain wall_ms=1784265389297 mono_ms=147177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\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 1054|CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1055|CONN_LIFECYCLE: conn=396 role=brain wall_ms=1784265454791 mono_ms=212671 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1056|CONN_LIFECYCLE: conn=397 role=brain wall_ms=1784265455944 mono_ms=213825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1304|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784265516180 mono_ms=274060 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1305|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=1784265517380 mono_ms=275260 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1306|CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1307|CONN_LIFECYCLE: conn=502 role=brain wall_ms=1784265517587 mono_ms=275467 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1308|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=201 wall_ms=1784265517587 mono_ms=275467 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1312|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784265517592 mono_ms=275472 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1313|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=1784265517649 mono_ms=275529 event=stream-sub-attach stream=202 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1314|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=1784265518315 mono_ms=276195 event=stream-sub-attach stream=203 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1315|CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1316|CONN_LIFECYCLE: conn=505 role=brain wall_ms=1784265519195 mono_ms=277075 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1317|CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784265519196 mono_ms=277076 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1571|CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784265578248 mono_ms=336128 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1572|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=1784265578758 mono_ms=336638 event=stream-sub-attach stream=248 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1573|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=1784265579403 mono_ms=337283 event=stream-sub-attach stream=249 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1574|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=1784265579609 mono_ms=337488 event=stream-sub-attach stream=250 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1575|CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1576|CONN_LIFECYCLE: conn=614 role=brain wall_ms=1784265579854 mono_ms=337734 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1577|CONN_LIFECYCLE: conn=615 role=brain wall_ms=1784265579855 mono_ms=337735 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1857|CONN_LIFECYCLE: conn=733 role=brain wall_ms=1784265656195 mono_ms=414075 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1858|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=1784265656234 mono_ms=414114 event=stream-sub-attach stream=297 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1859|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=1784265656591 mono_ms=414471 event=stream-sub-attach stream=300 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1860|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=1784265656852 mono_ms=414731 event=stream-sub-attach stream=303 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1861|CONN_LIFECYCLE: conn=734 role=brain wall_ms=1784265657934 mono_ms=415814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1862|CONN_LIFECYCLE: conn=734 role=brain wall_ms=1784265657935 mono_ms=415814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1863|CONN_LIFECYCLE: conn=735 role=brain wall_ms=1784265660159 mono_ms=418039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2094|CONN_LIFECYCLE: conn=830 role=brain wall_ms=1784265718447 mono_ms=476326 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2095|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=1784265718486 mono_ms=476366 event=stream-sub-attach stream=341 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2096|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=1784265718859 mono_ms=476738 event=stream-sub-attach stream=342 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2097|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=1784265719377 mono_ms=477257 event=stream-sub-attach stream=343 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2098|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2099|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2100|PAIR_MEET_UP:SPT_DEV step=59475524 id=ce5fe4feece9f355fd2913b3f39e0e6decc6d0fcbcdb154eab756655aa8ac22d addr=EndpointAddr { id: PublicKey(ce5fe4feece9f355fd2913b3f39e0e6decc6d0fcbcdb154eab756655aa8ac22d), addrs: {Ip(100.68.35.65:52246), Ip(192.168.1.81:52246)} }\n...\n 2332|CONN_LIFECYCLE: conn=928 role=brain wall_ms=1784265778813 mono_ms=536692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2333|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=1784265779887 mono_ms=537766 event=stream-sub-attach stream=384 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2334|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2335|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 2336|PAIR_MEET_UP:SPT_DEV step=59475526 id=a9b01fa413d261551dd73eab19d0bc46fa9cb3508e23e5855ad80cbebdc2f381 addr=EndpointAddr { id: PublicKey(a9b01fa413d261551dd73eab19d0bc46fa9cb3508e23e5855ad80cbebdc2f381), addrs: {Ip(100.68.35.65:54745), Ip(192.168.1.81:54745)} }\n...\n 2344|INJECT_SETTLE_TIMEOUT:lia: no PTY readiness echo within 400ms — proceeding (echo-verify guards head loss)\n*2345|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=1784265781698 mono_ms=539577 event=stream-sub-attach stream=385 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2346|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=1784265781985 mono_ms=539864 event=stream-sub-attach stream=386 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2347|CONN_LIFECYCLE: conn=931 role=brain wall_ms=1784265785047 mono_ms=542926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2348|CONN_LIFECYCLE: conn=932 role=brain wall_ms=1784265785047 mono_ms=542926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2349|CONN_LIFECYCLE: conn=931 role=brain wall_ms=1784265785047 mono_ms=542926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2567|CONN_LIFECYCLE: conn=1023 role=brain wall_ms=1784265841054 mono_ms=598933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2568|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=1784265842390 mono_ms=600269 event=stream-sub-attach stream=426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2569|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=1784265843727 mono_ms=601606 event=stream-sub-attach stream=427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2570|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=1784265843918 mono_ms=601798 event=stream-sub-attach stream=428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2571|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=1784265844191 mono_ms=602070 event=stream-sub-attach stream=429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2572|CONN_LIFECYCLE: conn=1024 role=brain wall_ms=1784265845996 mono_ms=603876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2573|CONN_LIFECYCLE: conn=1024 role=brain wall_ms=1784265845996 mono_ms=603876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2574|CONN_LIFECYCLE: conn=1025 role=brain wall_ms=1784265845998 mono_ms=603877 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2821|CONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784265915021 mono_ms=672900 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2822|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=1784265915214 mono_ms=673093 event=stream-sub-attach stream=475 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2823|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=1784265915515 mono_ms=673394 event=stream-sub-attach stream=476 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2824|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=1784265915871 mono_ms=673750 event=stream-sub-attach stream=477 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2825|CONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784265916446 mono_ms=674325 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2826|CONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784265916446 mono_ms=674325 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2827|CONN_LIFECYCLE: conn=1130 role=brain wall_ms=1784265916447 mono_ms=674326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3052|CONN_LIFECYCLE: conn=1223 role=brain wall_ms=1784265976631 mono_ms=734510 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3053|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=1784265977336 mono_ms=735215 event=stream-sub-attach stream=517 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3054|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=1784265977620 mono_ms=735499 event=stream-sub-attach stream=518 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3055|CONN_LIFECYCLE: conn=1224 role=brain wall_ms=1784265977710 mono_ms=735589 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3056|CONN_LIFECYCLE: conn=1224 role=brain wall_ms=1784265977710 mono_ms=735589 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3057|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=1784265977942 mono_ms=735821 event=stream-sub-attach stream=519 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3058|CONN_LIFECYCLE: conn=1225 role=brain wall_ms=1784265982752 mono_ms=740630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3059|CONN_LIFECYCLE: conn=1225 role=brain wall_ms=1784265982752 mono_ms=740631 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3060|ENDPOINT_INJECT:doyle: endpoint ACTIVE -> spool (deferred hint), not injected\n...\n 3300|CONN_LIFECYCLE: conn=1323 role=brain wall_ms=1784266038356 mono_ms=796234 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3301|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=1784266039606 mono_ms=797485 event=stream-sub-attach stream=557 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3302|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=1784266039957 mono_ms=797836 event=stream-sub-attach stream=558 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3303|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=1784266040614 mono_ms=798493 event=stream-sub-attach stream=559 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3304|CONN_LIFECYCLE: conn=1324 role=brain wall_ms=1784266043398 mono_ms=801276 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3305|CONN_LIFECYCLE: conn=1324 role=brain wall_ms=1784266043398 mono_ms=801276 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3306|CONN_LIFECYCLE: conn=1325 role=brain wall_ms=1784266044591 mono_ms=802470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3555|CONN_LIFECYCLE: conn=1427 role=brain wall_ms=1784266110533 mono_ms=868411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3556|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=1784266110723 mono_ms=868601 event=stream-sub-attach stream=604 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3557|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=1784266111644 mono_ms=869522 event=stream-sub-attach stream=605 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3558|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=1784266112083 mono_ms=869962 event=stream-sub-attach stream=606 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3559|CONN_LIFECYCLE: conn=1428 role=brain wall_ms=1784266112296 mono_ms=870174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3560|CONN_LIFECYCLE: conn=1429 role=brain wall_ms=1784266112296 mono_ms=870174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3561|CONN_LIFECYCLE: conn=1428 role=brain wall_ms=1784266112296 mono_ms=870174 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3814|CONN_LIFECYCLE: conn=1535 role=brain wall_ms=1784266172651 mono_ms=930530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3815|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=1784266172656 mono_ms=930535 event=stream-sub-attach stream=651 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3816|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=1784266173241 mono_ms=931119 event=stream-sub-attach stream=652 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*3817|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=1784266173538 mono_ms=931416 event=stream-sub-attach stream=653 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 3818|CONN_LIFECYCLE: conn=1536 role=brain wall_ms=1784266175329 mono_ms=933207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3819|CONN_LIFECYCLE: conn=1536 role=brain wall_ms=1784266175329 mono_ms=933207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3820|CONN_LIFECYCLE: conn=1537 role=brain wall_ms=1784266176467 mono_ms=934345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4058|CONN_LIFECYCLE: conn=1637 role=brain wall_ms=1784266248694 mono_ms=1006573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4059|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=1784266248743 mono_ms=1006621 event=stream-sub-attach stream=698 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*4060|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=1784266249350 mono_ms=1007228 event=stream-sub-attach stream=699 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*4061|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=1784266249753 mono_ms=1007631 event=stream-sub-attach stream=700 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4062|CONN_LIFECYCLE: conn=1638 role=brain wall_ms=1784266250965 mono_ms=1008843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4063|CONN_LIFECYCLE: conn=1638 role=brain wall_ms=1784266250965 mono_ms=1008843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4064|CONN_LIFECYCLE: conn=1639 role=brain wall_ms=1784266255503 mono_ms=1013381 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\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 4328|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 4329|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 4330|PAIR_MEET_UP:SPT_DEV step=59475544 id=e6318f585026d5450504a87dcecb15fe0598f81e384eb376c54066d1017cd5c1 addr=EndpointAddr { id: PublicKey(e6318f585026d5450504a87dcecb15fe0598f81e384eb376c54066d1017cd5c1), addrs: {Ip(100.68.35.65:60891), Ip(192.168.1.81:60891)} }\n...\n 4547|CONN_LIFECYCLE: conn=1838 role=brain wall_ms=1784266382071 mono_ms=1139949 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4548|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=1784266384890 mono_ms=1142767 event=stream-sub-attach stream=791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4549|CONN_LIFECYCLE: conn=1839 role=brain wall_ms=1784266387112 mono_ms=1144989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4550|CONN_LIFECYCLE: conn=1839 role=brain wall_ms=1784266387112 mono_ms=1144989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4551|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=1784266387666 mono_ms=1145544 event=stream-sub-attach stream=792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4552|CONN_LIFECYCLE: conn=1840 role=brain wall_ms=1784266387795 mono_ms=1145673 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4553|CONN_LIFECYCLE: conn=1840 role=brain wall_ms=1784266387795 mono_ms=1145673 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4554|CONN_LIFECYCLE: conn=1841 role=brain stream-subscriber stream=793 wall_ms=1784266387795 mono_ms=1145673 event=stream-sub-attach stream=793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4558|CONN_LIFECYCLE: conn=1842 role=brain wall_ms=1784266387796 mono_ms=1145674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4559|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=1784266388011 mono_ms=1145889 event=stream-sub-attach stream=794 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4560|CONN_LIFECYCLE: conn=1843 role=brain wall_ms=1784266388905 mono_ms=1146783 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4561|CONN_LIFECYCLE: conn=1843 role=brain wall_ms=1784266388905 mono_ms=1146783 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4562|CONN_LIFECYCLE: conn=1844 role=brain stream-subscriber stream=795 wall_ms=1784266388906 mono_ms=1146783 event=stream-sub-attach stream=795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4780|CONN_LIFECYCLE: conn=1935 role=brain wall_ms=1784266447632 mono_ms=1205510 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4781|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=1784266448442 mono_ms=1206320 event=stream-sub-attach stream=835 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4782|CONN_LIFECYCLE: conn=1936 role=brain wall_ms=1784266448516 mono_ms=1206393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4783|CONN_LIFECYCLE: conn=1936 role=brain wall_ms=1784266448516 mono_ms=1206393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4784|CONN_LIFECYCLE: conn=1937 role=brain stream-subscriber stream=834 wall_ms=1784266448516 mono_ms=1206394 event=stream-sub-attach stream=834 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4795|CONN_LIFECYCLE: conn=1941 role=brain wall_ms=1784266449634 mono_ms=1207512 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4796|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=1784266449848 mono_ms=1207725 event=stream-sub-attach stream=837 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*4797|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=1784266450741 mono_ms=1208618 event=stream-sub-attach stream=838 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4798|CONN_LIFECYCLE: conn=1942 role=brain wall_ms=1784266452675 mono_ms=1210553 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 4799|CONN_LIFECYCLE: conn=1942 role=brain wall_ms=1784266452675 mono_ms=1210553 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 4800|CONN_LIFECYCLE: conn=1943 role=brain wall_ms=1784266453772 mono_ms=1211650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5043|CONN_LIFECYCLE: conn=2045 role=brain wall_ms=1784266520129 mono_ms=1278006 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5044|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=1784266520177 mono_ms=1278054 event=stream-sub-attach stream=884 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5045|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=1784266520357 mono_ms=1278235 event=stream-sub-attach stream=885 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5046|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=1784266520713 mono_ms=1278591 event=stream-sub-attach stream=886 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5047|CONN_LIFECYCLE: conn=2046 role=brain wall_ms=1784266521492 mono_ms=1279369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5048|CONN_LIFECYCLE: conn=2047 role=brain wall_ms=1784266521492 mono_ms=1279369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5049|CONN_LIFECYCLE: conn=2046 role=brain wall_ms=1784266521492 mono_ms=1279369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5253|CONN_LIFECYCLE: conn=2132 role=brain wall_ms=1784266578748 mono_ms=1336625 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5254|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=1784266581598 mono_ms=1339475 event=stream-sub-attach stream=926 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5255|CONN_LIFECYCLE: conn=2133 role=brain wall_ms=1784266581953 mono_ms=1339831 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5256|CONN_LIFECYCLE: conn=2133 role=brain wall_ms=1784266581953 mono_ms=1339831 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5257|CONN_LIFECYCLE: conn=2134 role=brain wall_ms=1784266581955 mono_ms=1339832 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5261|CONN_LIFECYCLE: conn=2135 role=brain wall_ms=1784266581957 mono_ms=1339834 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5262|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=1784266582107 mono_ms=1339984 event=stream-sub-attach stream=928 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5263|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=1784266582355 mono_ms=1340232 event=stream-sub-attach stream=929 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5264|CONN_LIFECYCLE: conn=2136 role=brain wall_ms=1784266583790 mono_ms=1341668 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5265|CONN_LIFECYCLE: conn=2136 role=brain wall_ms=1784266583790 mono_ms=1341668 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5266|CONN_LIFECYCLE: conn=2137 role=brain wall_ms=1784266584278 mono_ms=1342155 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5494|CONN_LIFECYCLE: conn=2231 role=brain wall_ms=1784266642328 mono_ms=1400205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5495|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=1784266642989 mono_ms=1400866 event=stream-sub-attach stream=967 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5496|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=1784266643315 mono_ms=1401192 event=stream-sub-attach stream=968 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5497|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=1784266643537 mono_ms=1401414 event=stream-sub-attach stream=969 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5498|CONN_LIFECYCLE: conn=2232 role=brain wall_ms=1784266644309 mono_ms=1402186 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5499|CONN_LIFECYCLE: conn=2232 role=brain wall_ms=1784266644309 mono_ms=1402186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5500|CONN_LIFECYCLE: conn=2233 role=brain wall_ms=1784266644651 mono_ms=1402528 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5740|CONN_LIFECYCLE: conn=2332 role=brain wall_ms=1784266711115 mono_ms=1468992 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5741|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=1784266711163 mono_ms=1469040 event=stream-sub-attach stream=1014 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5742|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=1784266711425 mono_ms=1469302 event=stream-sub-attach stream=1015 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5743|CONN_LIFECYCLE: conn=2333 role=brain wall_ms=1784266712547 mono_ms=1470424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5744|CONN_LIFECYCLE: conn=2334 role=brain wall_ms=1784266712547 mono_ms=1470424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5745|CONN_LIFECYCLE: conn=2333 role=brain wall_ms=1784266712547 mono_ms=1470424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5777|CONN_LIFECYCLE: conn=2347 role=brain wall_ms=1784266712963 mono_ms=1470840 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5778|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=1784266713086 mono_ms=1470963 event=stream-sub-attach stream=1021 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5779|CONN_LIFECYCLE: conn=2348 role=brain wall_ms=1784266714913 mono_ms=1472790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5780|CONN_LIFECYCLE: conn=2348 role=brain wall_ms=1784266714913 mono_ms=1472790 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 5781|CONN_LIFECYCLE: conn=2349 role=brain wall_ms=1784266714977 mono_ms=1472854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5987|CONN_LIFECYCLE: conn=2435 role=brain wall_ms=1784266773264 mono_ms=1531141 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5988|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=1784266773480 mono_ms=1531357 event=stream-sub-attach stream=1059 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*5989|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=1784266773777 mono_ms=1531654 event=stream-sub-attach stream=1060 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 5990|CONN_LIFECYCLE: conn=2436 role=brain wall_ms=1784266774474 mono_ms=1532350 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5991|CONN_LIFECYCLE: conn=2437 role=brain wall_ms=1784266774474 mono_ms=1532350 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 5992|CONN_LIFECYCLE: conn=2436 role=brain wall_ms=1784266774474 mono_ms=1532350 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6003|CONN_LIFECYCLE: conn=2441 role=brain wall_ms=1784266774498 mono_ms=1532374 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6004|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=1784266775001 mono_ms=1532878 event=stream-sub-attach stream=1063 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6005|CONN_LIFECYCLE: conn=2442 role=brain wall_ms=1784266775284 mono_ms=1533160 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6006|CONN_LIFECYCLE: conn=2442 role=brain wall_ms=1784266775284 mono_ms=1533160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6007|CONN_LIFECYCLE: conn=2443 role=brain stream-subscriber stream=1064 wall_ms=1784266775284 mono_ms=1533161 event=stream-sub-attach stream=1064 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6013|CONN_LIFECYCLE: conn=2445 role=brain wall_ms=1784266775423 mono_ms=1533300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6014|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=1784266775603 mono_ms=1533479 event=stream-sub-attach stream=1065 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6015|CONN_LIFECYCLE: conn=2446 role=brain wall_ms=1784266780344 mono_ms=1538221 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6016|CONN_LIFECYCLE: conn=2446 role=brain wall_ms=1784266780344 mono_ms=1538221 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6017|CONN_LIFECYCLE: conn=2447 role=brain wall_ms=1784266780345 mono_ms=1538222 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6265|CONN_LIFECYCLE: conn=2554 role=brain wall_ms=1784266849949 mono_ms=1607826 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6266|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=1784266850290 mono_ms=1608166 event=stream-sub-attach stream=1110 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6267|CONN_LIFECYCLE: conn=2555 role=brain wall_ms=1784266850514 mono_ms=1608391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6268|CONN_LIFECYCLE: conn=2555 role=brain wall_ms=1784266850514 mono_ms=1608391 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6269|CONN_LIFECYCLE: conn=2556 role=brain stream-subscriber stream=1111 wall_ms=1784266850515 mono_ms=1608391 event=stream-sub-attach stream=1111 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6287|CONN_LIFECYCLE: conn=2563 role=brain wall_ms=1784266850625 mono_ms=1608501 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6288|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=1784266850833 mono_ms=1608710 event=stream-sub-attach stream=1114 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6289|CONN_LIFECYCLE: conn=2564 role=brain wall_ms=1784266851054 mono_ms=1608930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6290|CONN_LIFECYCLE: conn=2564 role=brain wall_ms=1784266851054 mono_ms=1608930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*6291|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=1784266851785 mono_ms=1609662 event=stream-sub-attach stream=1115 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6292|CONN_LIFECYCLE: conn=2539 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6293|CONN_LIFECYCLE: conn=2540 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6294|CONN_LIFECYCLE: conn=2542 role=brain wall_ms=1784266851799 mono_ms=1609676 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\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 6530|CONN_LIFECYCLE: conn=2657 role=brain stream-subscriber stream=1156 wall_ms=1784266920885 mono_ms=1678762 event=stream-sub-attach stream=1156 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6534|CONN_LIFECYCLE: conn=2658 role=brain wall_ms=1784266920890 mono_ms=1678767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"bytes","totalLines":684,"totalBytes":135030,"outputLines":260,"outputBytes":51061,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":684,"totalBytes":135030,"outputLines":260,"outputBytes":51061,"shownRange":{"start":1,"end":260},"nextOffset":261}}},"isError":false,"timestamp":1784271970372}}
{"type":"message","id":"0c226ace","parentId":"e1adf254","timestamp":"2026-07-17T07:06:10.374Z","message":{"role":"toolResult","toolCallId":"call_XStUEcYGICf8YKu0p3YzeJPw|fc_0fcf561150331aac016a59d461be6c8190ab1d4241f78d5bd7","toolName":"grep","content":[{"type":"text","text":" 19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19073|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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19074|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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19075|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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19076|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=1784269090252 mono_ms=3848122 event=stream-sub-attach stream=3648 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19077|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19078|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19441|CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19442|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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19443|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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19444|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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19445|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=1784269161531 mono_ms=3919401 event=stream-sub-attach stream=3724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19446|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=1784269162196 mono_ms=3920066 event=stream-sub-attach stream=3725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19447|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19448|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449|CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19781|CONN_LIFECYCLE: conn=8184 role=brain wall_ms=1784269222903 mono_ms=3980773 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19782|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=1784269223236 mono_ms=3981106 event=stream-sub-attach stream=3789 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19783|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=1784269223435 mono_ms=3981305 event=stream-sub-attach stream=3790 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19784|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=1784269224219 mono_ms=3982089 event=stream-sub-attach stream=3791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19785|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=1784269225124 mono_ms=3982994 event=stream-sub-attach stream=3792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19786|CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19787|CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19788|CONN_LIFECYCLE: conn=8186 role=brain stream-subscriber stream=3793 wall_ms=1784269226467 mono_ms=3984337 event=stream-sub-attach stream=3793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19799|CONN_LIFECYCLE: conn=8190 role=brain wall_ms=1784269226571 mono_ms=3984441 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19800|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=1784269226702 mono_ms=3984573 event=stream-sub-attach stream=3795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19801|CONN_LIFECYCLE: conn=8191 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19802|CONN_LIFECYCLE: conn=8193 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19803|CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19958|CONN_LIFECYCLE: conn=8257 role=brain wall_ms=1784269248117 mono_ms=4005987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19959|CONN_WRITE_POISONED: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252412 mono_ms=4010282 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 19960|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 19961|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 19962|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 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"}],"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":" 19062│CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19063│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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19065│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066│CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19072│CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19073│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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19074│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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19075│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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19076│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=1784269090252 mono_ms=3848122 event=stream-sub-attach stream=3648 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19077│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19078│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079│CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19441│CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19442│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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19443│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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19444│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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19445│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=1784269161531 mono_ms=3919401 event=stream-sub-attach stream=3724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19446│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=1784269162196 mono_ms=3920066 event=stream-sub-attach stream=3725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19447│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19448│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449│CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19781│CONN_LIFECYCLE: conn=8184 role=brain wall_ms=1784269222903 mono_ms=3980773 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19782│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=1784269223236 mono_ms=3981106 event=stream-sub-attach stream=3789 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19783│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=1784269223435 mono_ms=3981305 event=stream-sub-attach stream=3790 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19784│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=1784269224219 mono_ms=3982089 event=stream-sub-attach stream=3791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19785│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=1784269225124 mono_ms=3982994 event=stream-sub-attach stream=3792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19786│CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19787│CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19788│CONN_LIFECYCLE: conn=8186 role=brain stream-subscriber stream=3793 wall_ms=1784269226467 mono_ms=3984337 event=stream-sub-attach stream=3793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19799│CONN_LIFECYCLE: conn=8190 role=brain wall_ms=1784269226571 mono_ms=3984441 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19800│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=1784269226702 mono_ms=3984573 event=stream-sub-attach stream=3795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19801│CONN_LIFECYCLE: conn=8191 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19802│CONN_LIFECYCLE: conn=8193 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19803│CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19958│CONN_LIFECYCLE: conn=8257 role=brain wall_ms=1784269248117 mono_ms=4005987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19959│CONN_WRITE_POISONED: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252412 mono_ms=4010282 — physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n 19960│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]\n 19961│CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]\n 19962│CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784271970374}}
{"type":"message","id":"c78bddd4","parentId":"0c226ace","timestamp":"2026-07-17T07:06:34.915Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Assessing connection ID persistence**\n\n**Estimating thread and connection distributions**\n\n**Confirming file read limitations**"},{"type":"thinking","thinking":"**Estimating log line ranges**"},{"type":"toolCall","id":"call_seeLwm3oCbGqv6szO8D4qdpe|fc_0fcf561150331aac016a59d47a44ac81909325ef28da596bce","name":"read","arguments":{"i":"Reading current log tail block","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"24500-24850"}},{"type":"toolCall","id":"call_0i7ESj89XoikSkVJ57vS8uSP|fc_0fcf561150331aac016a59d47a44c08190a803360a1e811fef","name":"read","arguments":{"i":"Reading later log block","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"28000-28300"}},{"type":"toolCall","id":"call_ITcAEu248TNZfcQOJmFOJeeD|fc_0fcf561150331aac016a59d47a44cc8190a34c53831d427006","name":"read","arguments":{"i":"Reading end log block","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"32000-32300"}},{"type":"toolCall","id":"call_E8V8j8auzpALtORnvzH7Dlfp|fc_0fcf561150331aac016a59d47a44d881908ddee6dda55f849a","name":"grep","arguments":{"i":"Finding long-lived carrier IDs","pattern":"conn=[0-9]+ role=brain .*stream-subscriber.*stream-subscriber.*event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"15000-20000","case":true,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":23434,"output":786,"cacheRead":175616,"cacheWrite":0,"totalTokens":199836,"reasoningTokens":537,"cost":{"input":0.11717000000000001,"output":0.02358,"cacheRead":0.087808,"cacheWrite":0,"total":0.228558}},"stopReason":"toolUse","timestamp":1784271970428,"responseId":"resp_0fcf561150331aac016a59d462b30c81909975e0fdb8c66dcb","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d466220c8190b9afa99d7fddffe1","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdR17qns7itWKoTg8kfnHZ3M88YvlQITTc83HWUGaeFF3MG2a4BMCmvo8s2NVW_S-PUUClazadyvkpp3xX1uExtOamQucZ28xBve6WVIy5EE_UZbGMEEBz6IjOiHIj9EqfIGC-8MymJmYumlGeIzxKN8Byi2MEGZ_f7JkQ4HdAmzhGVXoTSyQLgDyJGlkI7Um3ce1Iqk1wj7QHDN264UiRDzFCg1O85WsBPgmaHWwNiyylTlkmKOgMmmenLhhs9iscrU-y1AxwLHOgw5dov4qQ3cDjrUskdFI52XpCZG4kK3JhDkVCIh8HBLc7irE7dWy7EsgYPQuhVrBayjjblVrGozJmjTgQF_D9rnSQliXj5-O2KKfeH5Bs_HvDKU7rzawpjC__ZQfVEegfK9JEZ5whW1Sc9LICmamJza1wKPBHrrTq8XuVXJhdBHScKbEaQt371dM6JZT2eBPph3bxsCp1Uig_KFOAPqVUYYjcqxpO-ExNMazfxVMrYVEBB0JyFq0Y7kaQgw88XIXAtmqPYeawW497iOILAq3llPxWjOpeMzb0GvQOkIiAp3jm2wfTBGN0-AuqX4kh1mFhxZwfQn740Q-P2iRrsIoDbNqb-dvmhgFHkwSlGatusv0ee2vVBw4Exq9uEC1V3j0i8rIXaS2Fly_Q2TciemeK29182yaNr93if93lkTkwH_N62DVRAKusEi99m_JRT5pcTurD6KLKNmU_cwqYJZMZMslFXCLkoEI-mSDcgSSCHtY3BtUP50UpPEw1uXR4QxEbBgKoLZxc2wh4DgfL0W7-WmoF3-QJ_5xA_LQp3DlwzN5l9ruuEOwjv1Q84N2JthqSokGc70XVWJAXIMkUnwfrO5KEG04HBg09iZFUqD0GyOt4tdJZvGOzIzBiki4MBqHaMbS0_d_5BN2oLcwoS-cxclo2DiEmw0OEHqbERmMV7k1eCI8PxeKEr4eUJriE2X7AxnCbQ_HckjxuIjy1MbSg-tbEamV1TfY4L4aHHTCecEnNyBPeuPAkvctokSKURxasoIHvW2tlds99XpwBN55mvLbgjTyOQYHShjlfCD9jcMOnrqwRY0ASDGJfy9pT0FxMC08BpGK9pOdg2TLNaPfMuI9W_3iR3uP1o-3dLjYLh1jo1wh1bOyhzAZ2pYPklHXGe4Y49olc_iEC_YZnxC38pohqkNRT_0rZ-EviQAa255_QSqOE0M2bR0hx87fYnG3awH5jvB5xHVjwOjFUbJRZ7z74WCIY9bQgLfEUs3Pbf4MAaIK3TZe3EyMuxXTZyHoIhkre2rV1sMTDK9GySTgpSG7Grurg-KBNm077kwjaV7v_eW5om1T2mIoJijt4xyx1I4UfLuefdvSqTSHtJRukJFnKbr-Rt4LBgUy96ZrlnmMtzM95GTlALoc93Zsrljo6MqbBkvNuqp-3dFmd2Vcc9AKt_xi9fTI4BeVatncimdaVv3VUGdNdsZ3NWXE96svwfu889fTeqiGHZRCFUqdjcVjMex9Tv7sO0qgHi6tL2IZOQ3scrHIkEdvGEqLRmgTH8LTzXcRzbv3yXbWOcbbnZxY292K4lEuq1GA0Xumn47NIiJ2bHaSZkyGlrikjNq3GHz5Z86b8NfkkeUKvYsLR3VRXRL40ZGjvXFcKIEnArbUIsXfkvC1gVmD5sn8CQCsbIC3zunM87vPvwpr8Wc14qzrN2UHNO_hvZJTg0rdXhdVgBxzmsUSr7WGo7ipau8SV28q7WA2n3j7Hk3dE3tNM3LlB8xREyyHFowN5p2P2n6v_2ZBp93G1FsHAsURBDS-yrvlq0QvUmBZbUjffw90nEhNPCPmhBFm0nD7itFhaSsqdHnAGDC4JXI-91hUJ7Yo5w1ykCwImdbIxyYG5yHF5XVhJ9t0ojcoL86LMTXDh8dxKvX_KMaqspaJndcqojHscrCQE_eB1hkLOD8kcKKKu1NnYd2zgTCov6UNhPWMC3cag5Ub1HqDthXVQmXMIJ_BTuRGBCy4JmTj7HJJeeDGdyxiGJGwffvq79FTkeW4NV5ZJOlFneD2AgYqV1nfXE08Sq6-lh1RXbpt_zupZunA8dToed4ztqETajg-KYoFOm0AzfTwuG1Yi-_rQIEBcqiPBYhgODsWxu2LrJ4by9_C6IHlmm2UcQ6IaCPAwzmrG_FsYhFjIhwSudJ9fZVXycJW7LElQ6jdTyBV2LY3fUEv2a63EJguWUXc0WLb90ahCU01I2vgI7OfINymzvaOvwaH7j9fQMle_4pue-pghL_k1LwQAAWwQFaSRXgiZsbCyE2ssMucTmq_MKwRSXmxQTOa83c2GWVdBjFZq9JZuPdoyKFRUbnO66ocBJyIL581LSJSePnvHHgRiW5b52trsyKi2N6epXQnTdfZD9bAaNgRqvpSrKx798MD3lAH9gULaN_R19r8rhUB7qKNxXiz-1v22QAd38J27qfsvLAsfUaMwmp6y7Xiv2EyDMu4Cd8W-yoJMKh3TtvtR3ySPgBTUDXTpgJDVO53v60Ghq3cFJEQNqUXbYLWLi0ePvPSPAvVt6Nz-Ub_nc5voeQ32QftoCmeICh2rxUtUtqMpqqNNTQRbvfnov6EvcLIUjXdZchJRcb57XUyjTiiZowQD5JJfM9r-9fCnkrlp0BKmx85Xqfj14wu6W6yAb2-PkCEsDkEOEWQiofCj9UHvfVCfgfKh7M7WEhS6HBQ3hIuVn_1tFlMzbPKv64OJ9InWzhCci02A8R2ljrDVZUaRva3D-1wIWeeRuPi1xnsJT-8T5q7ToeQPGZF6TrDgZPu301bQd9HJ32ZZnGPExMsvYUbCm4P2cl_9GlkMnhNsJ_p5EU93q2SlMUp4wjg_2nF-TyTpcQM-Rn-S5zU39Pp4oh8LKbm9gBsWwv_L9KKNTioNfNQUBzaY33t83Pg_FVYUxAT92s71RJDQZFOCmzD1Tvw0lmzw8sDpYg11uG0cPJ6uZAzcrQkeylMcxfS9WTjjJFvL_4QKqNrFpt6aec5Ih6nCquNk2yMkzLyQVKLKgOh0e06aXPDZDxf6E7LeHV4Bpjaf0vqxn52aIxPCfT4cZj-sJ4LCASHq8GSvM5Cayx-oe4DIaGKW8dEvK0AGfIRzJvfJqKYqw17Lviq17KeswCCIpAbuXP4vCDvYU3niQl7fU5RzX10vtdZapT9y7qc4tTLXzYVyEI3cgkPcBAVVKcNFsbvTk6316FiSE_fMXd0HtnQkwvaUEGINhuyQKvuNdRQfjr8CFGcn9qLssA2UQKN0sqv6SESremQ3qpDVJqCrtc42MxJ9YPDpu62Ct_xic1HjJLCkx9Pwh7GxftFOLWvTV38Nye6NPrp9CdDwpoH2_YXufhN6P9vFWN4sqpAlLQkI2IKOh-1poC1vq_wteHCojH9XHkxXVWOQDlpV8mu2JhjY9pLF7KpdIbvTkxAJpQcIt1VStrOeccw5EGEvzbxkXeQsIGre5Zt7W36h-K--JOBtjXFiCPpZObXY79b_to7I3jqLpq1GjbY2TIqffepFbSZraairXD0TSL0bxwdT6eRZr7Tff3DuPI_bxNgb03ma9baLyx5hz1j7WhJ5u0HWQt7HbIw1qcVin5jKT880mnkhj3krLMhMkyWLHxi6hLbr70bPQi2EmoAoE5-Y6mSjFsOQRc4NjHLWcF-xXpvaDdpQVHQZiQZVs8cW-tITmDVf0cXWihYOvjn0jKw_JAMZgZWwJJIQwhnDu-5AQBWD1T4YTJfYQgyrcAvgCYnl9Y_MgBst6tpbp5kuQPhsCUji0iPd-ygtjX6PL6fkQxDQFxzhXnf7_6fPwzygb7BhokzybhJB9DuRt3AyyJu8ZT","summary":[{"type":"summary_text","text":"**Assessing connection ID persistence**"},{"type":"summary_text","text":"**Estimating thread and connection distributions**"},{"type":"summary_text","text":"**Confirming file read limitations**"}]},{"id":"rs_0fcf561150331aac016a59d47523f48190bc65d26f9f1b65f5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdR6lXbJqnkXjmLtCD6LSz2YJxtQfp0b-SRiItlbVyeGeoGIcWIQTjTs48cBqL-R7_RNJIMbnmLBCDrTI05nIWUtmy8JFhUOzgfB1OrUwbNmqy3o5NJFSkIs1zhi9wJwr6JkHkS_evtqussezGv9n6cwTpE2mbfuD-6eiviHdhAUv4n4W-0tF6zCNxSjk1G1g-hIr5Ep7LFRnI0Sl0unCnaCBeiOMjI5xvIUYEfl5EWugYr0nx6W5YnDoMlFHmd_3IyIZQ-Ub6I9v-hbfXcWib_TwKdKtoGLWLDnNnsSN8s9CRBnNDe_bOoU3knoQ1OzC0y3HgOzBPTeE8U-N7w8kXGCsCUTtI-L_TIV2rwD4zneAQ94YMEnvR5lPGpcgzhxpCXU--P16k9BVEoDtURJ7-_zKYU6Dse8O3xlzuTW00EiU6XK2GSl6A-tLiq-43GyirmbJphfniIGsmwXn--sEmw9mE4pL8PmU3ik6p9Zozmn3TaGizJkD7UUb8f85kllzpdt5VqtzQXkanJINsWBIEnND5Wf2ztMvFMzU4WotGf0H_415-qfZjReqf6Zg6kOt9ggCUZdsLhf-27kEeGXFnSFelDcDiomSNgYaEVZS4aMghgMbglFFrvbOK6ZqblPsnkS5KnbB72sCdXFMOgFTTNJnJMiYYTCeUtFxJGxl1FbZOWAxDxkuMPo-W_TQJiI4H_-qs5L4dhBuhI3CD8lVPqgRgsiIsfIuM-wSufLGkqybyZtpXv90tUG4lfq3Pe0-7YIvHiCd6z40g6YUIlBX7sJWGvU5QLZkTW_RjaIFRXDQ9yvq_FzybpTw1XDqC5E3jQ33LhUqBmFnn5kmVBG_yEni0b-jp0j9-rws8F-7EHAuA3nGfQxsNWQORJcFTPy_x0JZd2edZwgdkQTtOYBDLA_-pSHYMsgObGbopkxORbbW47PLsYKShc3vHWzg3UVcdeEqP0DvBE46zCWl46nSN7FsBDgEXGF1Cz5seLFBaEHkFG-uCKANeshcFsW0walJJVz","summary":[{"type":"summary_text","text":"**Estimating log line ranges**"}]},{"id":"fc_0fcf561150331aac016a59d47a44ac81909325ef28da596bce","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading current log tail block\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"24500-24850\"}","call_id":"call_seeLwm3oCbGqv6szO8D4qdpe","name":"read"},{"id":"fc_0fcf561150331aac016a59d47a44c08190a803360a1e811fef","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading later log block\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"28000-28300\"}","call_id":"call_0i7ESj89XoikSkVJ57vS8uSP","name":"read"},{"id":"fc_0fcf561150331aac016a59d47a44cc8190a34c53831d427006","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading end log block\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"32000-32300\"}","call_id":"call_ITcAEu248TNZfcQOJmFOJeeD","name":"read"},{"id":"fc_0fcf561150331aac016a59d47a44d881908ddee6dda55f849a","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding long-lived carrier IDs\",\"pattern\":\"conn=[0-9]+ role=brain .*stream-subscriber.*stream-subscriber.*event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"15000-20000\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_E8V8j8auzpALtORnvzH7Dlfp","name":"grep"}]},"duration":24486.132799997926,"ttft":3723.3159999996424,"contextSnapshot":{"promptTokens":199050,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_seeLwm3oCbGqv6szO8D4qdpe|fc_0fcf561150331aac016a59d47a44ac81909325ef28da596bce","toolName":"read","startedAt":"2026-07-17T07:06:34.915Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Reading current log tail block"},"id":"5a8dc756","parentId":"c78bddd4","timestamp":"2026-07-17T07:06:34.915Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_0i7ESj89XoikSkVJ57vS8uSP|fc_0fcf561150331aac016a59d47a44c08190a803360a1e811fef","toolName":"read","startedAt":"2026-07-17T07:06:34.915Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Reading later log block"},"id":"b4f252c4","parentId":"5a8dc756","timestamp":"2026-07-17T07:06:34.915Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ITcAEu248TNZfcQOJmFOJeeD|fc_0fcf561150331aac016a59d47a44cc8190a34c53831d427006","toolName":"read","startedAt":"2026-07-17T07:06:34.915Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Reading end log block"},"id":"6044ecf2","parentId":"b4f252c4","timestamp":"2026-07-17T07:06:34.915Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_E8V8j8auzpALtORnvzH7Dlfp|fc_0fcf561150331aac016a59d47a44d881908ddee6dda55f849a","toolName":"grep","startedAt":"2026-07-17T07:06:34.915Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding long-lived carrier IDs"},"id":"8b603601","parentId":"6044ecf2","timestamp":"2026-07-17T07:06:34.915Z"}
{"type":"message","id":"f968f9d6","parentId":"8b603601","timestamp":"2026-07-17T07:06:34.940Z","message":{"role":"toolResult","toolCallId":"call_E8V8j8auzpALtORnvzH7Dlfp|fc_0fcf561150331aac016a59d47a44d881908ddee6dda55f849a","toolName":"grep","content":[{"type":"text","text":" 15101|CONN_LIFECYCLE: conn=6234 role=brain wall_ms=1784268417345 mono_ms=3175218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15102|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=1784268417538 mono_ms=3175411 event=stream-sub-attach stream=2855 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15103|CONN_LIFECYCLE: conn=6235 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15104|CONN_LIFECYCLE: conn=6236 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15105|CONN_LIFECYCLE: conn=6237 role=brain wall_ms=1784268418223 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 15151|CONN_LIFECYCLE: conn=6255 role=brain wall_ms=1784268418789 mono_ms=3176662 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15152|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=1784268418969 mono_ms=3176841 event=stream-sub-attach stream=2863 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15153|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=1784268419645 mono_ms=3177517 event=stream-sub-attach stream=2864 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15154|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=1784268420277 mono_ms=3178149 event=stream-sub-attach stream=2865 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15155|CONN_LIFECYCLE: conn=6256 role=brain wall_ms=1784268420982 mono_ms=3178854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15156|CONN_LIFECYCLE: conn=6256 role=brain wall_ms=1784268420982 mono_ms=3178854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15157|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n...\n 15160|PAIR_MEET_UP:BIGNET step=59475614 id=ce578be680c77e2feae2022ddb59b35069c19ffcda8dd8b7a6bd0c289759a34d addr=EndpointAddr { id: PublicKey(ce578be680c77e2feae2022ddb59b35069c19ffcda8dd8b7a6bd0c289759a34d), addrs: {Ip(100.68.35.65:52064), Ip(192.168.1.81:52064)} }\n*15161|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=1784268421765 mono_ms=3179638 event=stream-sub-attach stream=2866 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15162|CONN_LIFECYCLE: conn=6257 role=brain wall_ms=1784268423556 mono_ms=3181429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15163|CONN_LIFECYCLE: conn=6258 role=brain wall_ms=1784268423556 mono_ms=3181429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15164|CONN_LIFECYCLE: conn=6257 role=brain wall_ms=1784268423557 mono_ms=3181429 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 15538|CONN_LIFECYCLE: conn=6415 role=brain wall_ms=1784268481498 mono_ms=3239370 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15539|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=1784268482143 mono_ms=3240015 event=stream-sub-attach stream=2936 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15540|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=1784268482712 mono_ms=3240584 event=stream-sub-attach stream=2937 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15541|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=1784268483571 mono_ms=3241443 event=stream-sub-attach stream=2938 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15542|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=1784268484564 mono_ms=3242436 event=stream-sub-attach stream=2939 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15543|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=1784268485187 mono_ms=3243059 event=stream-sub-attach stream=2940 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15544|CONN_LIFECYCLE: conn=6416 role=brain wall_ms=1784268485803 mono_ms=3243675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15545|CONN_LIFECYCLE: conn=6416 role=brain wall_ms=1784268485803 mono_ms=3243675 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15546|CONN_LIFECYCLE: conn=6417 role=brain stream-subscriber stream=2941 wall_ms=1784268485804 mono_ms=3243676 event=stream-sub-attach stream=2941 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 15866|CONN_LIFECYCLE: conn=6552 role=brain wall_ms=1784268553754 mono_ms=3311626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15867|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=1784268553805 mono_ms=3311676 event=stream-sub-attach stream=3019 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15868|CONN_LIFECYCLE: conn=6554 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15869|CONN_LIFECYCLE: conn=6553 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15870|CONN_LIFECYCLE: conn=6555 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 15916|CONN_LIFECYCLE: conn=6573 role=brain wall_ms=1784268554056 mono_ms=3311928 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15917|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=1784268554112 mono_ms=3311984 event=stream-sub-attach stream=3020 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15918|CONN_LIFECYCLE: conn=6574 role=brain wall_ms=1784268554257 mono_ms=3312129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15919|CONN_LIFECYCLE: conn=6575 role=brain wall_ms=1784268554257 mono_ms=3312129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15920|CONN_LIFECYCLE: conn=6574 role=brain wall_ms=1784268554257 mono_ms=3312129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 15931|CONN_LIFECYCLE: conn=6579 role=brain wall_ms=1784268554317 mono_ms=3312189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15932|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=1784268555723 mono_ms=3313595 event=stream-sub-attach stream=3023 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15933|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=1784268556880 mono_ms=3314752 event=stream-sub-attach stream=3024 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15934|CONN_LIFECYCLE: conn=6580 role=brain wall_ms=1784268557141 mono_ms=3315013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15935|CONN_LIFECYCLE: conn=6580 role=brain wall_ms=1784268557141 mono_ms=3315013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15936|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=1784268558012 mono_ms=3315884 event=stream-sub-attach stream=3025 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15937|CONN_LIFECYCLE: conn=6581 role=brain wall_ms=1784268562184 mono_ms=3320056 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15938|CONN_LIFECYCLE: conn=6581 role=brain wall_ms=1784268562184 mono_ms=3320056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15939|CONN_LIFECYCLE: conn=6582 role=brain wall_ms=1784268562774 mono_ms=3320645 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 16278|CONN_LIFECYCLE: conn=6723 role=brain wall_ms=1784268617659 mono_ms=3375531 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16279|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=1784268618502 mono_ms=3376373 event=stream-sub-attach stream=3091 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16280|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=1784268618799 mono_ms=3376670 event=stream-sub-attach stream=3092 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16281|CONN_LIFECYCLE: conn=6724 role=brain wall_ms=1784268619857 mono_ms=3377729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16282|CONN_LIFECYCLE: conn=6725 role=brain wall_ms=1784268619857 mono_ms=3377729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16283|CONN_LIFECYCLE: conn=6726 role=brain wall_ms=1784268619857 mono_ms=3377729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 16301|CONN_LIFECYCLE: conn=6732 role=brain wall_ms=1784268619891 mono_ms=3377762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16302|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=1784268620032 mono_ms=3377903 event=stream-sub-attach stream=3096 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16303|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=1784268620282 mono_ms=3378154 event=stream-sub-attach stream=3097 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16304|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=1784268621050 mono_ms=3378922 event=stream-sub-attach stream=3098 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16305|CONN_LIFECYCLE: conn=6733 role=brain wall_ms=1784268622701 mono_ms=3380573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16306|CONN_LIFECYCLE: conn=6733 role=brain wall_ms=1784268622701 mono_ms=3380573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16307|CONN_LIFECYCLE: conn=6734 role=brain wall_ms=1784268623557 mono_ms=3381428 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 16666|CONN_LIFECYCLE: conn=6884 role=brain wall_ms=1784268690558 mono_ms=3448430 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16667|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=1784268690599 mono_ms=3448471 event=stream-sub-attach stream=3177 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16668|CONN_LIFECYCLE: conn=6885 role=brain wall_ms=1784268690655 mono_ms=3448527 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16669|CONN_LIFECYCLE: conn=6886 role=brain wall_ms=1784268690655 mono_ms=3448527 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16670|CONN_LIFECYCLE: conn=6887 role=brain wall_ms=1784268690655 mono_ms=3448527 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 16730|CONN_LIFECYCLE: conn=6911 role=brain wall_ms=1784268691068 mono_ms=3448940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16731|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=1784268691267 mono_ms=3449138 event=stream-sub-attach stream=3180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16732|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=1784268691797 mono_ms=3449669 event=stream-sub-attach stream=3181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16733|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=1784268692124 mono_ms=3449996 event=stream-sub-attach stream=3182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16734|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=1784268692532 mono_ms=3450404 event=stream-sub-attach stream=3183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16735|CONN_LIFECYCLE: conn=6912 role=brain wall_ms=1784268693312 mono_ms=3451183 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16736|CONN_LIFECYCLE: conn=6912 role=brain wall_ms=1784268693312 mono_ms=3451183 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16737|CONN_LIFECYCLE: conn=6913 role=brain wall_ms=1784268695592 mono_ms=3453464 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 17111|CONN_LIFECYCLE: conn=7070 role=brain wall_ms=1784268752864 mono_ms=3510735 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17112|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=1784268753594 mono_ms=3511466 event=stream-sub-attach stream=3248 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17113|CONN_LIFECYCLE: conn=7071 role=brain wall_ms=1784268753834 mono_ms=3511706 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17114|CONN_LIFECYCLE: conn=7071 role=brain wall_ms=1784268753834 mono_ms=3511706 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17115|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=1784268755404 mono_ms=3513276 event=stream-sub-attach stream=3249 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17116|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=1784268756389 mono_ms=3514260 event=stream-sub-attach stream=3250 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17117|CONN_LIFECYCLE: conn=7072 role=brain wall_ms=1784268757490 mono_ms=3515362 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17118|CONN_LIFECYCLE: conn=7073 role=brain wall_ms=1784268757490 mono_ms=3515362 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17119|CONN_LIFECYCLE: conn=7074 role=brain wall_ms=1784268757490 mono_ms=3515362 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 17137|CONN_LIFECYCLE: conn=7080 role=brain wall_ms=1784268757507 mono_ms=3515379 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17138|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=1784268758090 mono_ms=3515961 event=stream-sub-attach stream=3254 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17139|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=1784268758461 mono_ms=3516333 event=stream-sub-attach stream=3255 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17140|CONN_LIFECYCLE: conn=7081 role=brain wall_ms=1784268758878 mono_ms=3516749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17141|CONN_LIFECYCLE: conn=7081 role=brain wall_ms=1784268758878 mono_ms=3516749 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17142|CONN_LIFECYCLE: conn=7082 role=brain wall_ms=1784268760061 mono_ms=3517932 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 17493|CONN_LIFECYCLE: conn=7230 role=brain wall_ms=1784268814369 mono_ms=3572241 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17494|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=1784268818806 mono_ms=3576677 event=stream-sub-attach stream=3322 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17495|CONN_LIFECYCLE: conn=7231 role=brain wall_ms=1784268819415 mono_ms=3577286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17496|CONN_LIFECYCLE: conn=7231 role=brain wall_ms=1784268819415 mono_ms=3577286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17497|CONN_LIFECYCLE: conn=7232 role=brain wall_ms=1784268820029 mono_ms=3577900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 17538|CONN_LIFECYCLE: conn=7249 role=brain wall_ms=1784268821069 mono_ms=3578941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17539|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=1784268821158 mono_ms=3579029 event=stream-sub-attach stream=3329 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17540|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=1784268821980 mono_ms=3579851 event=stream-sub-attach stream=3330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17541|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=1784268822718 mono_ms=3580589 event=stream-sub-attach stream=3331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17542|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=1784268822909 mono_ms=3580780 event=stream-sub-attach stream=3332 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17543|CONN_LIFECYCLE: conn=7250 role=brain wall_ms=1784268824458 mono_ms=3582329 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17544|CONN_LIFECYCLE: conn=7250 role=brain wall_ms=1784268824458 mono_ms=3582329 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17545|CONN_LIFECYCLE: conn=7251 role=brain wall_ms=1784268828160 mono_ms=3586031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 17891|CONN_LIFECYCLE: conn=7397 role=brain wall_ms=1784268884980 mono_ms=3642851 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17892|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=1784268885790 mono_ms=3643661 event=stream-sub-attach stream=3403 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17893|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=1784268886215 mono_ms=3644086 event=stream-sub-attach stream=3404 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17894|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=1784268887481 mono_ms=3645352 event=stream-sub-attach stream=3405 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17895|CONN_LIFECYCLE: conn=7398 role=brain wall_ms=1784268888467 mono_ms=3646338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17896|CONN_LIFECYCLE: conn=7399 role=brain wall_ms=1784268888467 mono_ms=3646338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17897|CONN_LIFECYCLE: conn=7398 role=brain wall_ms=1784268888467 mono_ms=3646338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 17908|CONN_LIFECYCLE: conn=7403 role=brain wall_ms=1784268888485 mono_ms=3646356 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17909|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=1784268888647 mono_ms=3646518 event=stream-sub-attach stream=3408 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17910|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=1784268888803 mono_ms=3646674 event=stream-sub-attach stream=3409 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17911|CONN_LIFECYCLE: conn=7404 role=brain wall_ms=1784268890023 mono_ms=3647894 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17912|CONN_LIFECYCLE: conn=7404 role=brain wall_ms=1784268890023 mono_ms=3647894 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17913|CONN_LIFECYCLE: conn=7405 role=brain wall_ms=1784268891760 mono_ms=3649630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 18097|CONN_LIFECYCLE: conn=7481 role=brain wall_ms=1784268930911 mono_ms=3688782 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18098|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=1784268930920 mono_ms=3688791 event=stream-sub-attach stream=3450 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18099|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=1784268931087 mono_ms=3688958 event=stream-sub-attach stream=3451 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18100|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=1784268931123 mono_ms=3688994 event=stream-sub-attach stream=3452 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18101|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=1784268931231 mono_ms=3689101 event=stream-sub-attach stream=3453 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18102|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=1784268931549 mono_ms=3689420 event=stream-sub-attach stream=3454 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18103|CONN_LIFECYCLE: conn=7482 role=brain wall_ms=1784268932731 mono_ms=3690602 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18104|CONN_LIFECYCLE: conn=7482 role=brain wall_ms=1784268932731 mono_ms=3690602 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18105|CONN_LIFECYCLE: conn=7483 role=brain stream-subscriber stream=3455 wall_ms=1784268932731 mono_ms=3690602 event=stream-sub-attach stream=3455 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 18255|CONN_LIFECYCLE: conn=7547 role=brain wall_ms=1784268949539 mono_ms=3707409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18256|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=1784268950034 mono_ms=3707905 event=stream-sub-attach stream=3483 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18257|CONN_LIFECYCLE: conn=7548 role=brain wall_ms=1784268950544 mono_ms=3708415 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18258|CONN_LIFECYCLE: conn=7548 role=brain wall_ms=1784268950544 mono_ms=3708415 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18259|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=1784268950777 mono_ms=3708648 event=stream-sub-attach stream=3484 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18260|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=1784268951232 mono_ms=3709102 event=stream-sub-attach stream=3485 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18261|CONN_LIFECYCLE: conn=7549 role=brain wall_ms=1784268951577 mono_ms=3709448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18262|CONN_LIFECYCLE: conn=7549 role=brain wall_ms=1784268951577 mono_ms=3709448 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18263|CONN_LIFECYCLE: conn=7550 role=brain wall_ms=1784268951578 mono_ms=3709449 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18264|CONN_LIFECYCLE: conn=7550 role=brain stream-subscriber stream=3486 wall_ms=1784268951578 mono_ms=3709449 event=stream-sub-attach stream=3486 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18265|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=1784268951971 mono_ms=3709842 event=stream-sub-attach stream=3487 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18266|CONN_LIFECYCLE: conn=7550 role=brain stream-subscriber stream=3486 wall_ms=1784268952013 mono_ms=3709884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18267|CONN_LIFECYCLE: conn=7551 role=brain wall_ms=1784268952013 mono_ms=3709884 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18268|CONN_LIFECYCLE: conn=7551 role=brain wall_ms=1784268952013 mono_ms=3709884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 18282|CONN_LIFECYCLE: conn=7557 role=brain wall_ms=1784268952621 mono_ms=3710492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18283|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=1784268952948 mono_ms=3710818 event=stream-sub-attach stream=3490 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18284|CONN_LIFECYCLE: conn=7558 role=brain wall_ms=1784268954360 mono_ms=3712231 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18285|CONN_LIFECYCLE: conn=7558 role=brain wall_ms=1784268954360 mono_ms=3712231 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18286|CONN_LIFECYCLE: conn=7559 role=brain stream-subscriber stream=3491 wall_ms=1784268954360 mono_ms=3712231 event=stream-sub-attach stream=3491 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 18673|CONN_LIFECYCLE: conn=7721 role=brain wall_ms=1784269022662 mono_ms=3780533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18674|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=1784269022712 mono_ms=3780583 event=stream-sub-attach stream=3566 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18675|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=1784269023550 mono_ms=3781420 event=stream-sub-attach stream=3567 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18676|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=1784269023810 mono_ms=3781680 event=stream-sub-attach stream=3568 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18677|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=1784269024804 mono_ms=3782675 event=stream-sub-attach stream=3569 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18678|CONN_LIFECYCLE: conn=7722 role=brain wall_ms=1784269025033 mono_ms=3782904 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18679|CONN_LIFECYCLE: conn=7722 role=brain wall_ms=1784269025033 mono_ms=3782904 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18680|CONN_LIFECYCLE: conn=7723 role=brain wall_ms=1784269025034 mono_ms=3782905 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 18707|CONN_LIFECYCLE: conn=7734 role=brain wall_ms=1784269026279 mono_ms=3784150 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18708|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=1784269026304 mono_ms=3784175 event=stream-sub-attach stream=3574 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18709|CONN_LIFECYCLE: conn=7735 role=brain wall_ms=1784269028331 mono_ms=3786201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18710|CONN_LIFECYCLE: conn=7735 role=brain wall_ms=1784269028331 mono_ms=3786201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18711|CONN_LIFECYCLE: conn=7736 role=brain wall_ms=1784269028332 mono_ms=3786202 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19073|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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19074|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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19075|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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19076|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=1784269090252 mono_ms=3848122 event=stream-sub-attach stream=3648 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19077|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19078|CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079|CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19441|CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19442|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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19443|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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19444|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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19445|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=1784269161531 mono_ms=3919401 event=stream-sub-attach stream=3724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19446|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=1784269162196 mono_ms=3920066 event=stream-sub-attach stream=3725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19447|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19448|CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449|CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19781|CONN_LIFECYCLE: conn=8184 role=brain wall_ms=1784269222903 mono_ms=3980773 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19782|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=1784269223236 mono_ms=3981106 event=stream-sub-attach stream=3789 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19783|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=1784269223435 mono_ms=3981305 event=stream-sub-attach stream=3790 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19784|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=1784269224219 mono_ms=3982089 event=stream-sub-attach stream=3791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19785|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=1784269225124 mono_ms=3982994 event=stream-sub-attach stream=3792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19786|CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19787|CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19788|CONN_LIFECYCLE: conn=8186 role=brain stream-subscriber stream=3793 wall_ms=1784269226467 mono_ms=3984337 event=stream-sub-attach stream=3793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 19799|CONN_LIFECYCLE: conn=8190 role=brain wall_ms=1784269226571 mono_ms=3984441 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19800|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=1784269226702 mono_ms=3984573 event=stream-sub-attach stream=3795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19801|CONN_LIFECYCLE: conn=8191 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19802|CONN_LIFECYCLE: conn=8193 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19803|CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 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"}],"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":70,"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":70}],"truncated":false,"displayContent":" 15101│CONN_LIFECYCLE: conn=6234 role=brain wall_ms=1784268417345 mono_ms=3175218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15102│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=1784268417538 mono_ms=3175411 event=stream-sub-attach stream=2855 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15103│CONN_LIFECYCLE: conn=6235 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15104│CONN_LIFECYCLE: conn=6236 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15105│CONN_LIFECYCLE: conn=6237 role=brain wall_ms=1784268418223 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15151│CONN_LIFECYCLE: conn=6255 role=brain wall_ms=1784268418789 mono_ms=3176662 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15152│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=1784268418969 mono_ms=3176841 event=stream-sub-attach stream=2863 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15153│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=1784268419645 mono_ms=3177517 event=stream-sub-attach stream=2864 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15154│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=1784268420277 mono_ms=3178149 event=stream-sub-attach stream=2865 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15155│CONN_LIFECYCLE: conn=6256 role=brain wall_ms=1784268420982 mono_ms=3178854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15156│CONN_LIFECYCLE: conn=6256 role=brain wall_ms=1784268420982 mono_ms=3178854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15157│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n      │...\n 15160│PAIR_MEET_UP:BIGNET step=59475614 id=ce578be680c77e2feae2022ddb59b35069c19ffcda8dd8b7a6bd0c289759a34d addr=EndpointAddr { id: PublicKey(ce578be680c77e2feae2022ddb59b35069c19ffcda8dd8b7a6bd0c289759a34d), addrs: {Ip(100.68.35.65:52064), Ip(192.168.1.81:52064)} }\n*15161│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=1784268421765 mono_ms=3179638 event=stream-sub-attach stream=2866 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15162│CONN_LIFECYCLE: conn=6257 role=brain wall_ms=1784268423556 mono_ms=3181429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15163│CONN_LIFECYCLE: conn=6258 role=brain wall_ms=1784268423556 mono_ms=3181429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15164│CONN_LIFECYCLE: conn=6257 role=brain wall_ms=1784268423557 mono_ms=3181429 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15538│CONN_LIFECYCLE: conn=6415 role=brain wall_ms=1784268481498 mono_ms=3239370 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15539│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=1784268482143 mono_ms=3240015 event=stream-sub-attach stream=2936 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15540│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=1784268482712 mono_ms=3240584 event=stream-sub-attach stream=2937 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15541│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=1784268483571 mono_ms=3241443 event=stream-sub-attach stream=2938 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15542│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=1784268484564 mono_ms=3242436 event=stream-sub-attach stream=2939 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15543│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=1784268485187 mono_ms=3243059 event=stream-sub-attach stream=2940 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15544│CONN_LIFECYCLE: conn=6416 role=brain wall_ms=1784268485803 mono_ms=3243675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15545│CONN_LIFECYCLE: conn=6416 role=brain wall_ms=1784268485803 mono_ms=3243675 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15546│CONN_LIFECYCLE: conn=6417 role=brain stream-subscriber stream=2941 wall_ms=1784268485804 mono_ms=3243676 event=stream-sub-attach stream=2941 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15866│CONN_LIFECYCLE: conn=6552 role=brain wall_ms=1784268553754 mono_ms=3311626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15867│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=1784268553805 mono_ms=3311676 event=stream-sub-attach stream=3019 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15868│CONN_LIFECYCLE: conn=6554 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15869│CONN_LIFECYCLE: conn=6553 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15870│CONN_LIFECYCLE: conn=6555 role=brain wall_ms=1784268553847 mono_ms=3311719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15916│CONN_LIFECYCLE: conn=6573 role=brain wall_ms=1784268554056 mono_ms=3311928 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15917│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=1784268554112 mono_ms=3311984 event=stream-sub-attach stream=3020 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15918│CONN_LIFECYCLE: conn=6574 role=brain wall_ms=1784268554257 mono_ms=3312129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15919│CONN_LIFECYCLE: conn=6575 role=brain wall_ms=1784268554257 mono_ms=3312129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15920│CONN_LIFECYCLE: conn=6574 role=brain wall_ms=1784268554257 mono_ms=3312129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15931│CONN_LIFECYCLE: conn=6579 role=brain wall_ms=1784268554317 mono_ms=3312189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15932│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=1784268555723 mono_ms=3313595 event=stream-sub-attach stream=3023 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*15933│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=1784268556880 mono_ms=3314752 event=stream-sub-attach stream=3024 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15934│CONN_LIFECYCLE: conn=6580 role=brain wall_ms=1784268557141 mono_ms=3315013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15935│CONN_LIFECYCLE: conn=6580 role=brain wall_ms=1784268557141 mono_ms=3315013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15936│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=1784268558012 mono_ms=3315884 event=stream-sub-attach stream=3025 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 15937│CONN_LIFECYCLE: conn=6581 role=brain wall_ms=1784268562184 mono_ms=3320056 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15938│CONN_LIFECYCLE: conn=6581 role=brain wall_ms=1784268562184 mono_ms=3320056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15939│CONN_LIFECYCLE: conn=6582 role=brain wall_ms=1784268562774 mono_ms=3320645 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 16278│CONN_LIFECYCLE: conn=6723 role=brain wall_ms=1784268617659 mono_ms=3375531 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16279│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=1784268618502 mono_ms=3376373 event=stream-sub-attach stream=3091 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16280│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=1784268618799 mono_ms=3376670 event=stream-sub-attach stream=3092 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16281│CONN_LIFECYCLE: conn=6724 role=brain wall_ms=1784268619857 mono_ms=3377729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16282│CONN_LIFECYCLE: conn=6725 role=brain wall_ms=1784268619857 mono_ms=3377729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16283│CONN_LIFECYCLE: conn=6726 role=brain wall_ms=1784268619857 mono_ms=3377729 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 16301│CONN_LIFECYCLE: conn=6732 role=brain wall_ms=1784268619891 mono_ms=3377762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16302│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=1784268620032 mono_ms=3377903 event=stream-sub-attach stream=3096 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16303│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=1784268620282 mono_ms=3378154 event=stream-sub-attach stream=3097 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16304│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=1784268621050 mono_ms=3378922 event=stream-sub-attach stream=3098 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16305│CONN_LIFECYCLE: conn=6733 role=brain wall_ms=1784268622701 mono_ms=3380573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16306│CONN_LIFECYCLE: conn=6733 role=brain wall_ms=1784268622701 mono_ms=3380573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16307│CONN_LIFECYCLE: conn=6734 role=brain wall_ms=1784268623557 mono_ms=3381428 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 16666│CONN_LIFECYCLE: conn=6884 role=brain wall_ms=1784268690558 mono_ms=3448430 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16667│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=1784268690599 mono_ms=3448471 event=stream-sub-attach stream=3177 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16668│CONN_LIFECYCLE: conn=6885 role=brain wall_ms=1784268690655 mono_ms=3448527 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16669│CONN_LIFECYCLE: conn=6886 role=brain wall_ms=1784268690655 mono_ms=3448527 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16670│CONN_LIFECYCLE: conn=6887 role=brain wall_ms=1784268690655 mono_ms=3448527 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 16730│CONN_LIFECYCLE: conn=6911 role=brain wall_ms=1784268691068 mono_ms=3448940 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*16731│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=1784268691267 mono_ms=3449138 event=stream-sub-attach stream=3180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16732│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=1784268691797 mono_ms=3449669 event=stream-sub-attach stream=3181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16733│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=1784268692124 mono_ms=3449996 event=stream-sub-attach stream=3182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16734│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=1784268692532 mono_ms=3450404 event=stream-sub-attach stream=3183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16735│CONN_LIFECYCLE: conn=6912 role=brain wall_ms=1784268693312 mono_ms=3451183 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16736│CONN_LIFECYCLE: conn=6912 role=brain wall_ms=1784268693312 mono_ms=3451183 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16737│CONN_LIFECYCLE: conn=6913 role=brain wall_ms=1784268695592 mono_ms=3453464 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 17111│CONN_LIFECYCLE: conn=7070 role=brain wall_ms=1784268752864 mono_ms=3510735 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17112│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=1784268753594 mono_ms=3511466 event=stream-sub-attach stream=3248 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17113│CONN_LIFECYCLE: conn=7071 role=brain wall_ms=1784268753834 mono_ms=3511706 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17114│CONN_LIFECYCLE: conn=7071 role=brain wall_ms=1784268753834 mono_ms=3511706 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17115│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=1784268755404 mono_ms=3513276 event=stream-sub-attach stream=3249 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17116│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=1784268756389 mono_ms=3514260 event=stream-sub-attach stream=3250 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17117│CONN_LIFECYCLE: conn=7072 role=brain wall_ms=1784268757490 mono_ms=3515362 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17118│CONN_LIFECYCLE: conn=7073 role=brain wall_ms=1784268757490 mono_ms=3515362 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17119│CONN_LIFECYCLE: conn=7074 role=brain wall_ms=1784268757490 mono_ms=3515362 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 17137│CONN_LIFECYCLE: conn=7080 role=brain wall_ms=1784268757507 mono_ms=3515379 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17138│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=1784268758090 mono_ms=3515961 event=stream-sub-attach stream=3254 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17139│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=1784268758461 mono_ms=3516333 event=stream-sub-attach stream=3255 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17140│CONN_LIFECYCLE: conn=7081 role=brain wall_ms=1784268758878 mono_ms=3516749 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17141│CONN_LIFECYCLE: conn=7081 role=brain wall_ms=1784268758878 mono_ms=3516749 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17142│CONN_LIFECYCLE: conn=7082 role=brain wall_ms=1784268760061 mono_ms=3517932 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 17493│CONN_LIFECYCLE: conn=7230 role=brain wall_ms=1784268814369 mono_ms=3572241 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17494│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=1784268818806 mono_ms=3576677 event=stream-sub-attach stream=3322 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17495│CONN_LIFECYCLE: conn=7231 role=brain wall_ms=1784268819415 mono_ms=3577286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17496│CONN_LIFECYCLE: conn=7231 role=brain wall_ms=1784268819415 mono_ms=3577286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17497│CONN_LIFECYCLE: conn=7232 role=brain wall_ms=1784268820029 mono_ms=3577900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 17538│CONN_LIFECYCLE: conn=7249 role=brain wall_ms=1784268821069 mono_ms=3578941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17539│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=1784268821158 mono_ms=3579029 event=stream-sub-attach stream=3329 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17540│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=1784268821980 mono_ms=3579851 event=stream-sub-attach stream=3330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17541│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=1784268822718 mono_ms=3580589 event=stream-sub-attach stream=3331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17542│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=1784268822909 mono_ms=3580780 event=stream-sub-attach stream=3332 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17543│CONN_LIFECYCLE: conn=7250 role=brain wall_ms=1784268824458 mono_ms=3582329 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17544│CONN_LIFECYCLE: conn=7250 role=brain wall_ms=1784268824458 mono_ms=3582329 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17545│CONN_LIFECYCLE: conn=7251 role=brain wall_ms=1784268828160 mono_ms=3586031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 17891│CONN_LIFECYCLE: conn=7397 role=brain wall_ms=1784268884980 mono_ms=3642851 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17892│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=1784268885790 mono_ms=3643661 event=stream-sub-attach stream=3403 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17893│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=1784268886215 mono_ms=3644086 event=stream-sub-attach stream=3404 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17894│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=1784268887481 mono_ms=3645352 event=stream-sub-attach stream=3405 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17895│CONN_LIFECYCLE: conn=7398 role=brain wall_ms=1784268888467 mono_ms=3646338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17896│CONN_LIFECYCLE: conn=7399 role=brain wall_ms=1784268888467 mono_ms=3646338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17897│CONN_LIFECYCLE: conn=7398 role=brain wall_ms=1784268888467 mono_ms=3646338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 17908│CONN_LIFECYCLE: conn=7403 role=brain wall_ms=1784268888485 mono_ms=3646356 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17909│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=1784268888647 mono_ms=3646518 event=stream-sub-attach stream=3408 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*17910│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=1784268888803 mono_ms=3646674 event=stream-sub-attach stream=3409 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 17911│CONN_LIFECYCLE: conn=7404 role=brain wall_ms=1784268890023 mono_ms=3647894 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17912│CONN_LIFECYCLE: conn=7404 role=brain wall_ms=1784268890023 mono_ms=3647894 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17913│CONN_LIFECYCLE: conn=7405 role=brain wall_ms=1784268891760 mono_ms=3649630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 18097│CONN_LIFECYCLE: conn=7481 role=brain wall_ms=1784268930911 mono_ms=3688782 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18098│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=1784268930920 mono_ms=3688791 event=stream-sub-attach stream=3450 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18099│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=1784268931087 mono_ms=3688958 event=stream-sub-attach stream=3451 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18100│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=1784268931123 mono_ms=3688994 event=stream-sub-attach stream=3452 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18101│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=1784268931231 mono_ms=3689101 event=stream-sub-attach stream=3453 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18102│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=1784268931549 mono_ms=3689420 event=stream-sub-attach stream=3454 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18103│CONN_LIFECYCLE: conn=7482 role=brain wall_ms=1784268932731 mono_ms=3690602 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18104│CONN_LIFECYCLE: conn=7482 role=brain wall_ms=1784268932731 mono_ms=3690602 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18105│CONN_LIFECYCLE: conn=7483 role=brain stream-subscriber stream=3455 wall_ms=1784268932731 mono_ms=3690602 event=stream-sub-attach stream=3455 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 18255│CONN_LIFECYCLE: conn=7547 role=brain wall_ms=1784268949539 mono_ms=3707409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18256│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=1784268950034 mono_ms=3707905 event=stream-sub-attach stream=3483 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18257│CONN_LIFECYCLE: conn=7548 role=brain wall_ms=1784268950544 mono_ms=3708415 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18258│CONN_LIFECYCLE: conn=7548 role=brain wall_ms=1784268950544 mono_ms=3708415 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18259│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=1784268950777 mono_ms=3708648 event=stream-sub-attach stream=3484 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18260│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=1784268951232 mono_ms=3709102 event=stream-sub-attach stream=3485 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18261│CONN_LIFECYCLE: conn=7549 role=brain wall_ms=1784268951577 mono_ms=3709448 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18262│CONN_LIFECYCLE: conn=7549 role=brain wall_ms=1784268951577 mono_ms=3709448 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18263│CONN_LIFECYCLE: conn=7550 role=brain wall_ms=1784268951578 mono_ms=3709449 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18264│CONN_LIFECYCLE: conn=7550 role=brain stream-subscriber stream=3486 wall_ms=1784268951578 mono_ms=3709449 event=stream-sub-attach stream=3486 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18265│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=1784268951971 mono_ms=3709842 event=stream-sub-attach stream=3487 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18266│CONN_LIFECYCLE: conn=7550 role=brain stream-subscriber stream=3486 wall_ms=1784268952013 mono_ms=3709884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18267│CONN_LIFECYCLE: conn=7551 role=brain wall_ms=1784268952013 mono_ms=3709884 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18268│CONN_LIFECYCLE: conn=7551 role=brain wall_ms=1784268952013 mono_ms=3709884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 18282│CONN_LIFECYCLE: conn=7557 role=brain wall_ms=1784268952621 mono_ms=3710492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18283│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=1784268952948 mono_ms=3710818 event=stream-sub-attach stream=3490 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18284│CONN_LIFECYCLE: conn=7558 role=brain wall_ms=1784268954360 mono_ms=3712231 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18285│CONN_LIFECYCLE: conn=7558 role=brain wall_ms=1784268954360 mono_ms=3712231 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18286│CONN_LIFECYCLE: conn=7559 role=brain stream-subscriber stream=3491 wall_ms=1784268954360 mono_ms=3712231 event=stream-sub-attach stream=3491 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 18673│CONN_LIFECYCLE: conn=7721 role=brain wall_ms=1784269022662 mono_ms=3780533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18674│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=1784269022712 mono_ms=3780583 event=stream-sub-attach stream=3566 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18675│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=1784269023550 mono_ms=3781420 event=stream-sub-attach stream=3567 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18676│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=1784269023810 mono_ms=3781680 event=stream-sub-attach stream=3568 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*18677│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=1784269024804 mono_ms=3782675 event=stream-sub-attach stream=3569 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18678│CONN_LIFECYCLE: conn=7722 role=brain wall_ms=1784269025033 mono_ms=3782904 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18679│CONN_LIFECYCLE: conn=7722 role=brain wall_ms=1784269025033 mono_ms=3782904 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18680│CONN_LIFECYCLE: conn=7723 role=brain wall_ms=1784269025034 mono_ms=3782905 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 18707│CONN_LIFECYCLE: conn=7734 role=brain wall_ms=1784269026279 mono_ms=3784150 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18708│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=1784269026304 mono_ms=3784175 event=stream-sub-attach stream=3574 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 18709│CONN_LIFECYCLE: conn=7735 role=brain wall_ms=1784269028331 mono_ms=3786201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18710│CONN_LIFECYCLE: conn=7735 role=brain wall_ms=1784269028331 mono_ms=3786201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 18711│CONN_LIFECYCLE: conn=7736 role=brain wall_ms=1784269028332 mono_ms=3786202 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19062│CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19063│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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19064│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19065│CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19066│CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19072│CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19073│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=1784269087070 mono_ms=3844941 event=stream-sub-attach stream=3645 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19074│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=1784269088723 mono_ms=3846594 event=stream-sub-attach stream=3646 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19075│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=1784269089593 mono_ms=3847464 event=stream-sub-attach stream=3647 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19076│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=1784269090252 mono_ms=3848122 event=stream-sub-attach stream=3648 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19077│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19078│CONN_LIFECYCLE: conn=7888 role=brain wall_ms=1784269091762 mono_ms=3849633 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19079│CONN_LIFECYCLE: conn=7889 role=brain wall_ms=1784269091923 mono_ms=3849794 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19441│CONN_LIFECYCLE: conn=8042 role=brain wall_ms=1784269159911 mono_ms=3917781 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19442│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=1784269160129 mono_ms=3917999 event=stream-sub-attach stream=3721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19443│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=1784269160428 mono_ms=3918299 event=stream-sub-attach stream=3722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19444│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=1784269161306 mono_ms=3919177 event=stream-sub-attach stream=3723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19445│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=1784269161531 mono_ms=3919401 event=stream-sub-attach stream=3724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19446│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=1784269162196 mono_ms=3920066 event=stream-sub-attach stream=3725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19447│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19448│CONN_LIFECYCLE: conn=8043 role=brain wall_ms=1784269162367 mono_ms=3920237 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19449│CONN_LIFECYCLE: conn=8044 role=brain wall_ms=1784269165372 mono_ms=3923243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19781│CONN_LIFECYCLE: conn=8184 role=brain wall_ms=1784269222903 mono_ms=3980773 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19782│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=1784269223236 mono_ms=3981106 event=stream-sub-attach stream=3789 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19783│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=1784269223435 mono_ms=3981305 event=stream-sub-attach stream=3790 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19784│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=1784269224219 mono_ms=3982089 event=stream-sub-attach stream=3791 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*19785│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=1784269225124 mono_ms=3982994 event=stream-sub-attach stream=3792 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19786│CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19787│CONN_LIFECYCLE: conn=8185 role=brain wall_ms=1784269226467 mono_ms=3984337 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19788│CONN_LIFECYCLE: conn=8186 role=brain stream-subscriber stream=3793 wall_ms=1784269226467 mono_ms=3984337 event=stream-sub-attach stream=3793 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 19799│CONN_LIFECYCLE: conn=8190 role=brain wall_ms=1784269226571 mono_ms=3984441 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*19800│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=1784269226702 mono_ms=3984573 event=stream-sub-attach stream=3795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 19801│CONN_LIFECYCLE: conn=8191 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19802│CONN_LIFECYCLE: conn=8193 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19803│CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784271994940}}
{"type":"message","id":"04fc2f15","parentId":"f968f9d6","timestamp":"2026-07-17T07:06:34.994Z","message":{"role":"toolResult","toolCallId":"call_seeLwm3oCbGqv6szO8D4qdpe|fc_0fcf561150331aac016a59d47a44ac81909325ef28da596bce","toolName":"read","content":[{"type":"text","text":"CONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021377 mono_ms=4779245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270022814 mono_ms=4780682 event=stream-sub-attach stream=4720 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270023636 mono_ms=4781504 event=stream-sub-attach stream=4721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10154 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10155 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10156 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10155 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10154 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10156 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023871 mono_ms=4781739 event=stream-sub-attach stream=4724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023871 mono_ms=4781739 event=stream-sub-attach stream=4723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023872 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023872 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain wall_ms=1784270023872 mono_ms=4781740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain stream-subscriber stream=4725 wall_ms=1784270023873 mono_ms=4781740 event=stream-sub-attach stream=4725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023876 mono_ms=4781744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10160 role=brain wall_ms=1784270023876 mono_ms=4781744 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10160 role=brain wall_ms=1784270023876 mono_ms=4781744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023880 mono_ms=4781748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10161 role=brain wall_ms=1784270023880 mono_ms=4781748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10161 role=brain wall_ms=1784270023881 mono_ms=4781748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain stream-subscriber stream=4725 wall_ms=1784270023894 mono_ms=4781762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10162 role=brain wall_ms=1784270023894 mono_ms=4781762 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10162 role=brain wall_ms=1784270023894 mono_ms=4781762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10163 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10164 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10165 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10163 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10165 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10164 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023975 mono_ms=4781843 event=stream-sub-attach stream=4722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain wall_ms=1784270023977 mono_ms=4781844 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain stream-subscriber stream=4726 wall_ms=1784270023977 mono_ms=4781844 event=stream-sub-attach stream=4726 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023980 mono_ms=4781848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10169 role=brain wall_ms=1784270023980 mono_ms=4781848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10169 role=brain wall_ms=1784270023980 mono_ms=4781848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain stream-subscriber stream=4726 wall_ms=1784270023986 mono_ms=4781853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10170 role=brain wall_ms=1784270023986 mono_ms=4781854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10170 role=brain wall_ms=1784270023986 mono_ms=4781854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain wall_ms=1784270023987 mono_ms=4781855 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain stream-subscriber stream=4727 wall_ms=1784270023987 mono_ms=4781855 event=stream-sub-attach stream=4727 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain stream-subscriber stream=4727 wall_ms=1784270023992 mono_ms=4781860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10171 role=brain wall_ms=1784270023992 mono_ms=4781860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10171 role=brain wall_ms=1784270023992 mono_ms=4781860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270024428 mono_ms=4782296 event=stream-sub-attach stream=4728 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270024787 mono_ms=4782655 event=stream-sub-attach stream=4729 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10172 role=brain wall_ms=1784270025013 mono_ms=4782881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10173 role=brain wall_ms=1784270025013 mono_ms=4782881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10172 role=brain wall_ms=1784270025013 mono_ms=4782881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10173 role=brain wall_ms=1784270025013 mono_ms=4782881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain wall_ms=1784270025015 mono_ms=4782882 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain stream-subscriber stream=4730 wall_ms=1784270025015 mono_ms=4782882 event=stream-sub-attach stream=4730 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain stream-subscriber stream=4730 wall_ms=1784270025019 mono_ms=4782887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10176 role=brain wall_ms=1784270025019 mono_ms=4782887 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10176 role=brain wall_ms=1784270025019 mono_ms=4782887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain wall_ms=1784270025025 mono_ms=4782893 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain stream-subscriber stream=4731 wall_ms=1784270025025 mono_ms=4782893 event=stream-sub-attach stream=4731 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain stream-subscriber stream=4731 wall_ms=1784270025027 mono_ms=4782895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10177 role=brain wall_ms=1784270025027 mono_ms=4782895 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10177 role=brain wall_ms=1784270025027 mono_ms=4782895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10178 role=brain wall_ms=1784270025050 mono_ms=4782917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10178 role=brain wall_ms=1784270025050 mono_ms=4782918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10179 role=brain wall_ms=1784270025847 mono_ms=4783715 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10179 role=brain wall_ms=1784270025847 mono_ms=4783715 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain wall_ms=1784270025849 mono_ms=4783717 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain stream-subscriber stream=4732 wall_ms=1784270025849 mono_ms=4783717 event=stream-sub-attach stream=4732 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain stream-subscriber stream=4732 wall_ms=1784270025857 mono_ms=4783724 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10181 role=brain wall_ms=1784270025857 mono_ms=4783725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10181 role=brain wall_ms=1784270025857 mono_ms=4783725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270026608 mono_ms=4784476 event=stream-sub-attach stream=4733 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10182 role=brain wall_ms=1784270030092 mono_ms=4787960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10182 role=brain wall_ms=1784270030093 mono_ms=4787960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10183 role=brain wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10184 role=brain wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10183 role=brain wall_ms=1784270032700 mono_ms=4790568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10184 role=brain wall_ms=1784270032700 mono_ms=4790568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032700 mono_ms=4790568 event=stream-sub-attach stream=4734 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain wall_ms=1784270032701 mono_ms=4790569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain stream-subscriber stream=4735 wall_ms=1784270032701 mono_ms=4790569 event=stream-sub-attach stream=4735 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032705 mono_ms=4790573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10187 role=brain wall_ms=1784270032705 mono_ms=4790573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10187 role=brain wall_ms=1784270032705 mono_ms=4790573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain stream-subscriber stream=4735 wall_ms=1784270032712 mono_ms=4790580 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10188 role=brain wall_ms=1784270032713 mono_ms=4790580 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10188 role=brain wall_ms=1784270032713 mono_ms=4790581 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10189 role=brain wall_ms=1784270035135 mono_ms=4793003 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10189 role=brain wall_ms=1784270035135 mono_ms=4793003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10190 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10192 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10191 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10190 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10192 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10191 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain wall_ms=1784270039043 mono_ms=4796911 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain stream-subscriber stream=4737 wall_ms=1784270039044 mono_ms=4796911 event=stream-sub-attach stream=4737 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain stream-subscriber stream=4737 wall_ms=1784270039046 mono_ms=4796914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10196 role=brain wall_ms=1784270039046 mono_ms=4796914 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10196 role=brain wall_ms=1784270039046 mono_ms=4796914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain wall_ms=1784270039059 mono_ms=4796926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain wall_ms=1784270039059 mono_ms=4796926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain stream-subscriber stream=4736 wall_ms=1784270039059 mono_ms=4796927 event=stream-sub-attach stream=4736 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain stream-subscriber stream=4738 wall_ms=1784270039059 mono_ms=4796927 event=stream-sub-attach stream=4738 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain stream-subscriber stream=4738 wall_ms=1784270039064 mono_ms=4796932 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10197 role=brain wall_ms=1784270039065 mono_ms=4796932 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10197 role=brain wall_ms=1784270039065 mono_ms=4796932 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain stream-subscriber stream=4736 wall_ms=1784270039069 mono_ms=4796937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10198 role=brain wall_ms=1784270039069 mono_ms=4796937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10198 role=brain wall_ms=1784270039069 mono_ms=4796937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10199 role=brain wall_ms=1784270039978 mono_ms=4797846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10200 role=brain wall_ms=1784270039978 mono_ms=4797846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10199 role=brain wall_ms=1784270039978 mono_ms=4797846 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10200 role=brain wall_ms=1784270039978 mono_ms=4797846 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain wall_ms=1784270039980 mono_ms=4797847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain stream-subscriber stream=4740 wall_ms=1784270039980 mono_ms=4797848 event=stream-sub-attach stream=4740 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain stream-subscriber stream=4740 wall_ms=1784270039981 mono_ms=4797849 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10203 role=brain wall_ms=1784270039981 mono_ms=4797849 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10203 role=brain wall_ms=1784270039981 mono_ms=4797849 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain wall_ms=1784270039993 mono_ms=4797860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain stream-subscriber stream=4739 wall_ms=1784270039993 mono_ms=4797861 event=stream-sub-attach stream=4739 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain stream-subscriber stream=4739 wall_ms=1784270039998 mono_ms=4797866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10204 role=brain wall_ms=1784270039998 mono_ms=4797866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10204 role=brain wall_ms=1784270039998 mono_ms=4797866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10205 role=brain wall_ms=1784270040180 mono_ms=4798048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10205 role=brain wall_ms=1784270040180 mono_ms=4798048 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=59475668 id=eb2beb1ce94ff10eaa96c1a7b09bfdd65fa0e02e1c0117f9239db8d30c6edca7 addr=EndpointAddr { id: PublicKey(eb2beb1ce94ff10eaa96c1a7b09bfdd65fa0e02e1c0117f9239db8d30c6edca7), addrs: {Ip(100.68.35.65:51310), Ip(192.168.1.81:51310)} }\nPAIR_MEET_UP:BIGNET step=59475668 id=31592bdf2e639653335176f92dcb4ae527c981521f1813ac4b2bef0caa2891a2 addr=EndpointAddr { id: PublicKey(31592bdf2e639653335176f92dcb4ae527c981521f1813ac4b2bef0caa2891a2), addrs: {Ip(100.68.35.65:51308), Ip(192.168.1.81:51308)} }\nCONN_LIFECYCLE: conn=10206 role=brain wall_ms=1784270041018 mono_ms=4798886 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10206 role=brain wall_ms=1784270041018 mono_ms=4798886 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain wall_ms=1784270041019 mono_ms=4798887 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain stream-subscriber stream=4741 wall_ms=1784270041019 mono_ms=4798887 event=stream-sub-attach stream=4741 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain stream-subscriber stream=4741 wall_ms=1784270041038 mono_ms=4798906 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10208 role=brain wall_ms=1784270041039 mono_ms=4798906 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10208 role=brain wall_ms=1784270041039 mono_ms=4798906 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10209 role=brain wall_ms=1784270041538 mono_ms=4799406 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10209 role=brain wall_ms=1784270041538 mono_ms=4799406 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=stream-sub-attach stream=4742 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10211 role=brain wall_ms=1784270041539 mono_ms=4799407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10211 role=brain wall_ms=1784270041539 mono_ms=4799407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10212 role=brain wall_ms=1784270045222 mono_ms=4803090 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10212 role=brain wall_ms=1784270045222 mono_ms=4803090 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10213 role=brain wall_ms=1784270046947 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10214 role=brain wall_ms=1784270046947 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10213 role=brain wall_ms=1784270046947 mono_ms=4804815 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10214 role=brain wall_ms=1784270046947 mono_ms=4804815 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270046947 mono_ms=4804815 event=stream-sub-attach stream=4743 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270046947 mono_ms=4804815 event=stream-sub-attach stream=4744 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270046948 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270046948 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270048627 mono_ms=4806495 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10217 role=brain wall_ms=1784270048627 mono_ms=4806495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10217 role=brain wall_ms=1784270048628 mono_ms=4806495 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270048630 mono_ms=4806498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10218 role=brain wall_ms=1784270048630 mono_ms=4806498 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10218 role=brain wall_ms=1784270048630 mono_ms=4806498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10219 role=brain wall_ms=1784270050264 mono_ms=4808132 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10219 role=brain wall_ms=1784270050264 mono_ms=4808132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10220 role=brain wall_ms=1784270051519 mono_ms=4809387 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10220 role=brain wall_ms=1784270051519 mono_ms=4809387 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051519 mono_ms=4809387 event=stream-sub-attach stream=4755 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051520 mono_ms=4809387 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051526 mono_ms=4809393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10222 role=brain wall_ms=1784270051526 mono_ms=4809394 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10222 role=brain wall_ms=1784270051526 mono_ms=4809394 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10223 role=brain wall_ms=1784270053182 mono_ms=4811050 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10223 role=brain wall_ms=1784270053182 mono_ms=4811050 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=stream-sub-attach stream=4756 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10225 role=brain wall_ms=1784270053183 mono_ms=4811051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10225 role=brain wall_ms=1784270053183 mono_ms=4811051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10226 role=brain wall_ms=1784270055157 mono_ms=4813025 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10227 role=brain wall_ms=1784270055157 mono_ms=4813025 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10226 role=brain wall_ms=1784270055157 mono_ms=4813025 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10227 role=brain wall_ms=1784270055157 mono_ms=4813025 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain wall_ms=1784270055158 mono_ms=4813026 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain stream-subscriber stream=4757 wall_ms=1784270055158 mono_ms=4813026 event=stream-sub-attach stream=4757 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain stream-subscriber stream=4757 wall_ms=1784270055163 mono_ms=4813031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10230 role=brain wall_ms=1784270055163 mono_ms=4813031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10230 role=brain wall_ms=1784270055163 mono_ms=4813031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain wall_ms=1784270055174 mono_ms=4813042 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain stream-subscriber stream=4758 wall_ms=1784270055174 mono_ms=4813042 event=stream-sub-attach stream=4758 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain stream-subscriber stream=4758 wall_ms=1784270055176 mono_ms=4813044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10231 role=brain wall_ms=1784270055176 mono_ms=4813044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10231 role=brain wall_ms=1784270055176 mono_ms=4813044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10232 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10233 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10234 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10232 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10233 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10234 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4759 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4760 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4761 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055269 mono_ms=4813137 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10238 role=brain wall_ms=1784270055269 mono_ms=4813137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10238 role=brain wall_ms=1784270055269 mono_ms=4813137 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055271 mono_ms=4813139 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10239 role=brain wall_ms=1784270055271 mono_ms=4813139 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10239 role=brain wall_ms=1784270055271 mono_ms=4813139 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055274 mono_ms=4813142 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10240 role=brain wall_ms=1784270055274 mono_ms=4813142 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10240 role=brain wall_ms=1784270055274 mono_ms=4813142 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10241 role=brain wall_ms=1784270055306 mono_ms=4813174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10241 role=brain wall_ms=1784270055307 mono_ms=4813174 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10242 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10243 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10244 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10242 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10243 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10244 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain wall_ms=1784270055367 mono_ms=4813234 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain stream-subscriber stream=4762 wall_ms=1784270055367 mono_ms=4813234 event=stream-sub-attach stream=4762 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain stream-subscriber stream=4762 wall_ms=1784270055375 mono_ms=4813243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10248 role=brain wall_ms=1784270055376 mono_ms=4813243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10248 role=brain wall_ms=1784270055376 mono_ms=4813243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain wall_ms=1784270055377 mono_ms=4813244 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain stream-subscriber stream=4764 wall_ms=1784270055377 mono_ms=4813245 event=stream-sub-attach stream=4764 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain wall_ms=1784270055377 mono_ms=4813245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain stream-subscriber stream=4763 wall_ms=1784270055377 mono_ms=4813245 event=stream-sub-attach stream=4763 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain stream-subscriber stream=4763 wall_ms=1784270055379 mono_ms=4813247 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10249 role=brain wall_ms=1784270055379 mono_ms=4813247 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10249 role=brain wall_ms=1784270055379 mono_ms=4813247 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain stream-subscriber stream=4764 wall_ms=1784270055382 mono_ms=4813250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10250 role=brain wall_ms=1784270055382 mono_ms=4813250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10250 role=brain wall_ms=1784270055382 mono_ms=4813250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10251 role=brain wall_ms=1784270056092 mono_ms=4813960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10251 role=brain wall_ms=1784270056092 mono_ms=4813960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain wall_ms=1784270056093 mono_ms=4813961 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain stream-subscriber stream=4765 wall_ms=1784270056093 mono_ms=4813961 event=stream-sub-attach stream=4765 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain stream-subscriber stream=4765 wall_ms=1784270056129 mono_ms=4813996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10253 role=brain wall_ms=1784270056129 mono_ms=4813997 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10253 role=brain wall_ms=1784270056129 mono_ms=4813997 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10254 role=brain wall_ms=1784270057859 mono_ms=4815727 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10254 role=brain wall_ms=1784270057859 mono_ms=4815727 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain wall_ms=1784270057861 mono_ms=4815728 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain stream-subscriber stream=4766 wall_ms=1784270057861 mono_ms=4815728 event=stream-sub-attach stream=4766 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain stream-subscriber stream=4766 wall_ms=1784270057864 mono_ms=4815732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10256 role=brain wall_ms=1784270057864 mono_ms=4815732 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10256 role=brain wall_ms=1784270057864 mono_ms=4815732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10257 role=brain wall_ms=1784270060347 mono_ms=4818215 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10257 role=brain wall_ms=1784270060347 mono_ms=4818215 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10258 role=brain wall_ms=1784270065391 mono_ms=4823259 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10258 role=brain wall_ms=1784270065391 mono_ms=4823259 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10259 role=brain wall_ms=1784270065549 mono_ms=4823417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10259 role=brain wall_ms=1784270065549 mono_ms=4823417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065549 mono_ms=4823417 event=stream-sub-attach stream=4772 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065549 mono_ms=4823417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065550 mono_ms=4823417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10261 role=brain wall_ms=1784270065550 mono_ms=4823418 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10261 role=brain wall_ms=1784270065550 mono_ms=4823418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10262 role=brain wall_ms=1784270065757 mono_ms=4823625 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10262 role=brain wall_ms=1784270065757 mono_ms=4823625 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=stream-sub-attach stream=4773 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10264 role=brain wall_ms=1784270065758 mono_ms=4823626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10264 role=brain wall_ms=1784270065758 mono_ms=4823626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10265 role=brain wall_ms=1784270066069 mono_ms=4823937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10265 role=brain wall_ms=1784270066069 mono_ms=4823937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=stream-sub-attach stream=4774 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10267 role=brain wall_ms=1784270066070 mono_ms=4823938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10267 role=brain wall_ms=1784270066070 mono_ms=4823938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10268 role=brain wall_ms=1784270070125 mono_ms=4827993 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10268 role=brain wall_ms=1784270070125 mono_ms=4827993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10269 role=brain wall_ms=1784270070125 mono_ms=4827993 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10269 role=brain wall_ms=1784270070126 mono_ms=4827993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain wall_ms=1784270070127 mono_ms=4827994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain wall_ms=1784270070127 mono_ms=4827995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain stream-subscriber stream=4776 wall_ms=1784270070127 mono_ms=4827995 event=stream-sub-attach stream=4776 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain stream-subscriber stream=4775 wall_ms=1784270070127 mono_ms=4827995 event=stream-sub-attach stream=4775 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain stream-subscriber stream=4776 wall_ms=1784270070128 mono_ms=4827996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10272 role=brain wall_ms=1784270070129 mono_ms=4827996 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10272 role=brain wall_ms=1784270070129 mono_ms=4827996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain stream-subscriber stream=4775 wall_ms=1784270070145 mono_ms=4828013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10273 role=brain wall_ms=1784270070145 mono_ms=4828013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10273 role=brain wall_ms=1784270070145 mono_ms=4828013 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=59475669 id=4197d4ae6d91445f8a941f19112fc6ebfd72abe376e913206062284aa2c2fee4 addr=EndpointAddr { id: PublicKey(4197d4ae6d91445f8a941f19112fc6ebfd72abe376e913206062284aa2c2fee4), addrs: {Ip(100.68.35.65:54351), Ip(192.168.1.81:54351)} }\nPAIR_MEET_UP:SPT_DEV step=59475669 id=87d1ecac0c664eb92694fa1b98f7cf414e13c98ba19ac20c3efea0c906afb25a addr=EndpointAddr { id: PublicKey(87d1ecac0c664eb92694fa1b98f7cf414e13c98ba19ac20c3efea0c906afb25a), addrs: {Ip(100.68.35.65:54352), Ip(192.168.1.81:54352)} }\nCONN_LIFECYCLE: conn=10274 role=brain wall_ms=1784270070435 mono_ms=4828303 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10274 role=brain wall_ms=1784270070435 mono_ms=4828303 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10275 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10276 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10277 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10275 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10276 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10277 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain wall_ms=1784270070543 mono_ms=4828411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain stream-subscriber stream=4779 wall_ms=1784270070543 mono_ms=4828411 event=stream-sub-attach stream=4779 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain wall_ms=1784270070546 mono_ms=4828414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain wall_ms=1784270070546 mono_ms=4828414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain stream-subscriber stream=4777 wall_ms=1784270070546 mono_ms=4828414 event=stream-sub-attach stream=4777 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain stream-subscriber stream=4778 wall_ms=1784270070546 mono_ms=4828414 event=stream-sub-attach stream=4778 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain stream-subscriber stream=4779 wall_ms=1784270070549 mono_ms=4828416 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10281 role=brain wall_ms=1784270070549 mono_ms=4828417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10281 role=brain wall_ms=1784270070549 mono_ms=4828417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain stream-subscriber stream=4777 wall_ms=1784270070555 mono_ms=4828423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10282 role=brain wall_ms=1784270070555 mono_ms=4828423 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10282 role=brain wall_ms=1784270070555 mono_ms=4828423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain stream-subscriber stream=4778 wall_ms=1784270070564 mono_ms=4828432 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10283 role=brain wall_ms=1784270070564 mono_ms=4828432 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10283 role=brain wall_ms=1784270070564 mono_ms=4828432 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10284 role=brain wall_ms=1784270071164 mono_ms=4829032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10284 role=brain wall_ms=1784270071164 mono_ms=4829032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain wall_ms=1784270071166 mono_ms=4829033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain stream-subscriber stream=4780 wall_ms=1784270071166 mono_ms=4829033 event=stream-sub-attach stream=4780 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain stream-subscriber stream=4780 wall_ms=1784270071174 mono_ms=4829042 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10286 role=brain wall_ms=1784270071174 mono_ms=4829042 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10286 role=brain wall_ms=1784270071174 mono_ms=4829042 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10287 role=brain wall_ms=1784270075477 mono_ms=4833345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10287 role=brain wall_ms=1784270075477 mono_ms=4833345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10288 role=brain wall_ms=1784270078022 mono_ms=4835890 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10288 role=brain wall_ms=1784270078022 mono_ms=4835890 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078022 mono_ms=4835890 event=stream-sub-attach stream=4781 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078023 mono_ms=4835890 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078023 mono_ms=4835891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10290 role=brain wall_ms=1784270078023 mono_ms=4835891 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10290 role=brain wall_ms=1784270078023 mono_ms=4835891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10291 role=brain wall_ms=1784270078126 mono_ms=4835994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10291 role=brain wall_ms=1784270078126 mono_ms=4835994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078126 mono_ms=4835994 event=stream-sub-attach stream=4782 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078126 mono_ms=4835994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078127 mono_ms=4835994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10293 role=brain wall_ms=1784270078127 mono_ms=4835995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10293 role=brain wall_ms=1784270078127 mono_ms=4835995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10294 role=brain wall_ms=1784270079062 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10295 role=brain wall_ms=1784270079062 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10294 role=brain wall_ms=1784270079062 mono_ms=4836930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10295 role=brain wall_ms=1784270079062 mono_ms=4836930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10296 role=brain stream-subscriber stream=4784 wall_ms=1784270079062 mono_ms=4836930 event=stream-sub-attach stream=4784 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10297 role=brain stream-subscriber stream=4783 wall_ms=1784270079063 mono_ms=4836930 event=stream-sub-attach stream=4783 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10296 role=brain stream-subscriber stream=4784 wall_ms=1784270079063 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10297 role=brain stream-subscriber stream=4783 wall_ms=1784270079063 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10298 role=brain wall_ms=1784270080518 mono_ms=4838386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10298 role=brain wall_ms=1784270080518 mono_ms=4838386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=stream-sub-attach stream=4785 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10301 role=brain wall_ms=1784270085561 mono_ms=4843429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 24499-24853 of 386. Use :24854 to continue]"}],"details":{"truncation":{"content":"CONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021377 mono_ms=4779245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270022814 mono_ms=4780682 event=stream-sub-attach stream=4720 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270023636 mono_ms=4781504 event=stream-sub-attach stream=4721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10154 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10155 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10156 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10155 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10154 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10156 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023871 mono_ms=4781739 event=stream-sub-attach stream=4724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023871 mono_ms=4781739 event=stream-sub-attach stream=4723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023872 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023872 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain wall_ms=1784270023872 mono_ms=4781740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain stream-subscriber stream=4725 wall_ms=1784270023873 mono_ms=4781740 event=stream-sub-attach stream=4725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023876 mono_ms=4781744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10160 role=brain wall_ms=1784270023876 mono_ms=4781744 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10160 role=brain wall_ms=1784270023876 mono_ms=4781744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023880 mono_ms=4781748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10161 role=brain wall_ms=1784270023880 mono_ms=4781748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10161 role=brain wall_ms=1784270023881 mono_ms=4781748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain stream-subscriber stream=4725 wall_ms=1784270023894 mono_ms=4781762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10162 role=brain wall_ms=1784270023894 mono_ms=4781762 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10162 role=brain wall_ms=1784270023894 mono_ms=4781762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10163 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10164 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10165 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10163 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10165 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10164 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023975 mono_ms=4781843 event=stream-sub-attach stream=4722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain wall_ms=1784270023977 mono_ms=4781844 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain stream-subscriber stream=4726 wall_ms=1784270023977 mono_ms=4781844 event=stream-sub-attach stream=4726 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023980 mono_ms=4781848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10169 role=brain wall_ms=1784270023980 mono_ms=4781848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10169 role=brain wall_ms=1784270023980 mono_ms=4781848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain stream-subscriber stream=4726 wall_ms=1784270023986 mono_ms=4781853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10170 role=brain wall_ms=1784270023986 mono_ms=4781854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10170 role=brain wall_ms=1784270023986 mono_ms=4781854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain wall_ms=1784270023987 mono_ms=4781855 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain stream-subscriber stream=4727 wall_ms=1784270023987 mono_ms=4781855 event=stream-sub-attach stream=4727 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain stream-subscriber stream=4727 wall_ms=1784270023992 mono_ms=4781860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10171 role=brain wall_ms=1784270023992 mono_ms=4781860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10171 role=brain wall_ms=1784270023992 mono_ms=4781860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270024428 mono_ms=4782296 event=stream-sub-attach stream=4728 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270024787 mono_ms=4782655 event=stream-sub-attach stream=4729 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10172 role=brain wall_ms=1784270025013 mono_ms=4782881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10173 role=brain wall_ms=1784270025013 mono_ms=4782881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10172 role=brain wall_ms=1784270025013 mono_ms=4782881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10173 role=brain wall_ms=1784270025013 mono_ms=4782881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain wall_ms=1784270025015 mono_ms=4782882 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain stream-subscriber stream=4730 wall_ms=1784270025015 mono_ms=4782882 event=stream-sub-attach stream=4730 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain stream-subscriber stream=4730 wall_ms=1784270025019 mono_ms=4782887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10176 role=brain wall_ms=1784270025019 mono_ms=4782887 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10176 role=brain wall_ms=1784270025019 mono_ms=4782887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain wall_ms=1784270025025 mono_ms=4782893 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain stream-subscriber stream=4731 wall_ms=1784270025025 mono_ms=4782893 event=stream-sub-attach stream=4731 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain stream-subscriber stream=4731 wall_ms=1784270025027 mono_ms=4782895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10177 role=brain wall_ms=1784270025027 mono_ms=4782895 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10177 role=brain wall_ms=1784270025027 mono_ms=4782895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10178 role=brain wall_ms=1784270025050 mono_ms=4782917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10178 role=brain wall_ms=1784270025050 mono_ms=4782918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10179 role=brain wall_ms=1784270025847 mono_ms=4783715 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10179 role=brain wall_ms=1784270025847 mono_ms=4783715 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain wall_ms=1784270025849 mono_ms=4783717 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain stream-subscriber stream=4732 wall_ms=1784270025849 mono_ms=4783717 event=stream-sub-attach stream=4732 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain stream-subscriber stream=4732 wall_ms=1784270025857 mono_ms=4783724 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10181 role=brain wall_ms=1784270025857 mono_ms=4783725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10181 role=brain wall_ms=1784270025857 mono_ms=4783725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270026608 mono_ms=4784476 event=stream-sub-attach stream=4733 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10182 role=brain wall_ms=1784270030092 mono_ms=4787960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10182 role=brain wall_ms=1784270030093 mono_ms=4787960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10183 role=brain wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10184 role=brain wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10183 role=brain wall_ms=1784270032700 mono_ms=4790568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10184 role=brain wall_ms=1784270032700 mono_ms=4790568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032700 mono_ms=4790568 event=stream-sub-attach stream=4734 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain wall_ms=1784270032701 mono_ms=4790569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain stream-subscriber stream=4735 wall_ms=1784270032701 mono_ms=4790569 event=stream-sub-attach stream=4735 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032705 mono_ms=4790573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10187 role=brain wall_ms=1784270032705 mono_ms=4790573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10187 role=brain wall_ms=1784270032705 mono_ms=4790573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain stream-subscriber stream=4735 wall_ms=1784270032712 mono_ms=4790580 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10188 role=brain wall_ms=1784270032713 mono_ms=4790580 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10188 role=brain wall_ms=1784270032713 mono_ms=4790581 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10189 role=brain wall_ms=1784270035135 mono_ms=4793003 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10189 role=brain wall_ms=1784270035135 mono_ms=4793003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10190 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10192 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10191 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10190 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10192 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10191 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain wall_ms=1784270039043 mono_ms=4796911 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain stream-subscriber stream=4737 wall_ms=1784270039044 mono_ms=4796911 event=stream-sub-attach stream=4737 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain stream-subscriber stream=4737 wall_ms=1784270039046 mono_ms=4796914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10196 role=brain wall_ms=1784270039046 mono_ms=4796914 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10196 role=brain wall_ms=1784270039046 mono_ms=4796914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain wall_ms=1784270039059 mono_ms=4796926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain wall_ms=1784270039059 mono_ms=4796926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain stream-subscriber stream=4736 wall_ms=1784270039059 mono_ms=4796927 event=stream-sub-attach stream=4736 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain stream-subscriber stream=4738 wall_ms=1784270039059 mono_ms=4796927 event=stream-sub-attach stream=4738 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain stream-subscriber stream=4738 wall_ms=1784270039064 mono_ms=4796932 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10197 role=brain wall_ms=1784270039065 mono_ms=4796932 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10197 role=brain wall_ms=1784270039065 mono_ms=4796932 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain stream-subscriber stream=4736 wall_ms=1784270039069 mono_ms=4796937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10198 role=brain wall_ms=1784270039069 mono_ms=4796937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10198 role=brain wall_ms=1784270039069 mono_ms=4796937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10199 role=brain wall_ms=1784270039978 mono_ms=4797846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10200 role=brain wall_ms=1784270039978 mono_ms=4797846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10199 role=brain wall_ms=1784270039978 mono_ms=4797846 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10200 role=brain wall_ms=1784270039978 mono_ms=4797846 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain wall_ms=1784270039980 mono_ms=4797847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain stream-subscriber stream=4740 wall_ms=1784270039980 mono_ms=4797848 event=stream-sub-attach stream=4740 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain stream-subscriber stream=4740 wall_ms=1784270039981 mono_ms=4797849 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10203 role=brain wall_ms=1784270039981 mono_ms=4797849 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10203 role=brain wall_ms=1784270039981 mono_ms=4797849 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain wall_ms=1784270039993 mono_ms=4797860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain stream-subscriber stream=4739 wall_ms=1784270039993 mono_ms=4797861 event=stream-sub-attach stream=4739 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain stream-subscriber stream=4739 wall_ms=1784270039998 mono_ms=4797866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10204 role=brain wall_ms=1784270039998 mono_ms=4797866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10204 role=brain wall_ms=1784270039998 mono_ms=4797866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10205 role=brain wall_ms=1784270040180 mono_ms=4798048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10205 role=brain wall_ms=1784270040180 mono_ms=4798048 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=59475668 id=eb2beb1ce94ff10eaa96c1a7b09bfdd65fa0e02e1c0117f9239db8d30c6edca7 addr=EndpointAddr { id: PublicKey(eb2beb1ce94ff10eaa96c1a7b09bfdd65fa0e02e1c0117f9239db8d30c6edca7), addrs: {Ip(100.68.35.65:51310), Ip(192.168.1.81:51310)} }\nPAIR_MEET_UP:BIGNET step=59475668 id=31592bdf2e639653335176f92dcb4ae527c981521f1813ac4b2bef0caa2891a2 addr=EndpointAddr { id: PublicKey(31592bdf2e639653335176f92dcb4ae527c981521f1813ac4b2bef0caa2891a2), addrs: {Ip(100.68.35.65:51308), Ip(192.168.1.81:51308)} }\nCONN_LIFECYCLE: conn=10206 role=brain wall_ms=1784270041018 mono_ms=4798886 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10206 role=brain wall_ms=1784270041018 mono_ms=4798886 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain wall_ms=1784270041019 mono_ms=4798887 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain stream-subscriber stream=4741 wall_ms=1784270041019 mono_ms=4798887 event=stream-sub-attach stream=4741 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain stream-subscriber stream=4741 wall_ms=1784270041038 mono_ms=4798906 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10208 role=brain wall_ms=1784270041039 mono_ms=4798906 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10208 role=brain wall_ms=1784270041039 mono_ms=4798906 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10209 role=brain wall_ms=1784270041538 mono_ms=4799406 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10209 role=brain wall_ms=1784270041538 mono_ms=4799406 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=stream-sub-attach stream=4742 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10211 role=brain wall_ms=1784270041539 mono_ms=4799407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10211 role=brain wall_ms=1784270041539 mono_ms=4799407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10212 role=brain wall_ms=1784270045222 mono_ms=4803090 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10212 role=brain wall_ms=1784270045222 mono_ms=4803090 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10213 role=brain wall_ms=1784270046947 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10214 role=brain wall_ms=1784270046947 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10213 role=brain wall_ms=1784270046947 mono_ms=4804815 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10214 role=brain wall_ms=1784270046947 mono_ms=4804815 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270046947 mono_ms=4804815 event=stream-sub-attach stream=4743 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270046947 mono_ms=4804815 event=stream-sub-attach stream=4744 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270046948 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270046948 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270048627 mono_ms=4806495 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10217 role=brain wall_ms=1784270048627 mono_ms=4806495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10217 role=brain wall_ms=1784270048628 mono_ms=4806495 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270048630 mono_ms=4806498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10218 role=brain wall_ms=1784270048630 mono_ms=4806498 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10218 role=brain wall_ms=1784270048630 mono_ms=4806498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10219 role=brain wall_ms=1784270050264 mono_ms=4808132 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10219 role=brain wall_ms=1784270050264 mono_ms=4808132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10220 role=brain wall_ms=1784270051519 mono_ms=4809387 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10220 role=brain wall_ms=1784270051519 mono_ms=4809387 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051519 mono_ms=4809387 event=stream-sub-attach stream=4755 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051520 mono_ms=4809387 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051526 mono_ms=4809393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10222 role=brain wall_ms=1784270051526 mono_ms=4809394 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10222 role=brain wall_ms=1784270051526 mono_ms=4809394 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10223 role=brain wall_ms=1784270053182 mono_ms=4811050 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10223 role=brain wall_ms=1784270053182 mono_ms=4811050 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=stream-sub-attach stream=4756 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10225 role=brain wall_ms=1784270053183 mono_ms=4811051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10225 role=brain wall_ms=1784270053183 mono_ms=4811051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10226 role=brain wall_ms=1784270055157 mono_ms=4813025 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10227 role=brain wall_ms=1784270055157 mono_ms=4813025 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10226 role=brain wall_ms=1784270055157 mono_ms=4813025 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10227 role=brain wall_ms=1784270055157 mono_ms=4813025 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain wall_ms=1784270055158 mono_ms=4813026 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain stream-subscriber stream=4757 wall_ms=1784270055158 mono_ms=4813026 event=stream-sub-attach stream=4757 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain stream-subscriber stream=4757 wall_ms=1784270055163 mono_ms=4813031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10230 role=brain wall_ms=1784270055163 mono_ms=4813031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10230 role=brain wall_ms=1784270055163 mono_ms=4813031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain wall_ms=1784270055174 mono_ms=4813042 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain stream-subscriber stream=4758 wall_ms=1784270055174 mono_ms=4813042 event=stream-sub-attach stream=4758 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain stream-subscriber stream=4758 wall_ms=1784270055176 mono_ms=4813044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10231 role=brain wall_ms=1784270055176 mono_ms=4813044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10231 role=brain wall_ms=1784270055176 mono_ms=4813044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10232 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10233 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10234 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10232 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10233 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10234 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4759 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4760 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4761 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055269 mono_ms=4813137 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10238 role=brain wall_ms=1784270055269 mono_ms=4813137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10238 role=brain wall_ms=1784270055269 mono_ms=4813137 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055271 mono_ms=4813139 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10239 role=brain wall_ms=1784270055271 mono_ms=4813139 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10239 role=brain wall_ms=1784270055271 mono_ms=4813139 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055274 mono_ms=4813142 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10240 role=brain wall_ms=1784270055274 mono_ms=4813142 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10240 role=brain wall_ms=1784270055274 mono_ms=4813142 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10241 role=brain wall_ms=1784270055306 mono_ms=4813174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10241 role=brain wall_ms=1784270055307 mono_ms=4813174 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10242 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10243 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10244 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10242 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10243 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10244 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain wall_ms=1784270055367 mono_ms=4813234 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain stream-subscriber stream=4762 wall_ms=1784270055367 mono_ms=4813234 event=stream-sub-attach stream=4762 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain stream-subscriber stream=4762 wall_ms=1784270055375 mono_ms=4813243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10248 role=brain wall_ms=1784270055376 mono_ms=4813243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10248 role=brain wall_ms=1784270055376 mono_ms=4813243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain wall_ms=1784270055377 mono_ms=4813244 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain stream-subscriber stream=4764 wall_ms=1784270055377 mono_ms=4813245 event=stream-sub-attach stream=4764 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain wall_ms=1784270055377 mono_ms=4813245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain stream-subscriber stream=4763 wall_ms=1784270055377 mono_ms=4813245 event=stream-sub-attach stream=4763 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain stream-subscriber stream=4763 wall_ms=1784270055379 mono_ms=4813247 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10249 role=brain wall_ms=1784270055379 mono_ms=4813247 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10249 role=brain wall_ms=1784270055379 mono_ms=4813247 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain stream-subscriber stream=4764 wall_ms=1784270055382 mono_ms=4813250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10250 role=brain wall_ms=1784270055382 mono_ms=4813250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10250 role=brain wall_ms=1784270055382 mono_ms=4813250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10251 role=brain wall_ms=1784270056092 mono_ms=4813960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10251 role=brain wall_ms=1784270056092 mono_ms=4813960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain wall_ms=1784270056093 mono_ms=4813961 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain stream-subscriber stream=4765 wall_ms=1784270056093 mono_ms=4813961 event=stream-sub-attach stream=4765 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain stream-subscriber stream=4765 wall_ms=1784270056129 mono_ms=4813996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10253 role=brain wall_ms=1784270056129 mono_ms=4813997 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10253 role=brain wall_ms=1784270056129 mono_ms=4813997 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10254 role=brain wall_ms=1784270057859 mono_ms=4815727 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10254 role=brain wall_ms=1784270057859 mono_ms=4815727 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain wall_ms=1784270057861 mono_ms=4815728 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain stream-subscriber stream=4766 wall_ms=1784270057861 mono_ms=4815728 event=stream-sub-attach stream=4766 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain stream-subscriber stream=4766 wall_ms=1784270057864 mono_ms=4815732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10256 role=brain wall_ms=1784270057864 mono_ms=4815732 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10256 role=brain wall_ms=1784270057864 mono_ms=4815732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10257 role=brain wall_ms=1784270060347 mono_ms=4818215 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10257 role=brain wall_ms=1784270060347 mono_ms=4818215 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10258 role=brain wall_ms=1784270065391 mono_ms=4823259 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10258 role=brain wall_ms=1784270065391 mono_ms=4823259 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10259 role=brain wall_ms=1784270065549 mono_ms=4823417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10259 role=brain wall_ms=1784270065549 mono_ms=4823417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065549 mono_ms=4823417 event=stream-sub-attach stream=4772 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065549 mono_ms=4823417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065550 mono_ms=4823417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10261 role=brain wall_ms=1784270065550 mono_ms=4823418 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10261 role=brain wall_ms=1784270065550 mono_ms=4823418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10262 role=brain wall_ms=1784270065757 mono_ms=4823625 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10262 role=brain wall_ms=1784270065757 mono_ms=4823625 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=stream-sub-attach stream=4773 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10264 role=brain wall_ms=1784270065758 mono_ms=4823626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10264 role=brain wall_ms=1784270065758 mono_ms=4823626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10265 role=brain wall_ms=1784270066069 mono_ms=4823937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10265 role=brain wall_ms=1784270066069 mono_ms=4823937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=stream-sub-attach stream=4774 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10267 role=brain wall_ms=1784270066070 mono_ms=4823938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10267 role=brain wall_ms=1784270066070 mono_ms=4823938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10268 role=brain wall_ms=1784270070125 mono_ms=4827993 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10268 role=brain wall_ms=1784270070125 mono_ms=4827993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10269 role=brain wall_ms=1784270070125 mono_ms=4827993 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10269 role=brain wall_ms=1784270070126 mono_ms=4827993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain wall_ms=1784270070127 mono_ms=4827994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain wall_ms=1784270070127 mono_ms=4827995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain stream-subscriber stream=4776 wall_ms=1784270070127 mono_ms=4827995 event=stream-sub-attach stream=4776 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain stream-subscriber stream=4775 wall_ms=1784270070127 mono_ms=4827995 event=stream-sub-attach stream=4775 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain stream-subscriber stream=4776 wall_ms=1784270070128 mono_ms=4827996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10272 role=brain wall_ms=1784270070129 mono_ms=4827996 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10272 role=brain wall_ms=1784270070129 mono_ms=4827996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain stream-subscriber stream=4775 wall_ms=1784270070145 mono_ms=4828013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10273 role=brain wall_ms=1784270070145 mono_ms=4828013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10273 role=brain wall_ms=1784270070145 mono_ms=4828013 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=59475669 id=4197d4ae6d91445f8a941f19112fc6ebfd72abe376e913206062284aa2c2fee4 addr=EndpointAddr { id: PublicKey(4197d4ae6d91445f8a941f19112fc6ebfd72abe376e913206062284aa2c2fee4), addrs: {Ip(100.68.35.65:54351), Ip(192.168.1.81:54351)} }\nPAIR_MEET_UP:SPT_DEV step=59475669 id=87d1ecac0c664eb92694fa1b98f7cf414e13c98ba19ac20c3efea0c906afb25a addr=EndpointAddr { id: PublicKey(87d1ecac0c664eb92694fa1b98f7cf414e13c98ba19ac20c3efea0c906afb25a), addrs: {Ip(100.68.35.65:54352), Ip(192.168.1.81:54352)} }\nCONN_LIFECYCLE: conn=10274 role=brain wall_ms=1784270070435 mono_ms=4828303 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10274 role=brain wall_ms=1784270070435 mono_ms=4828303 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10275 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10276 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10277 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10275 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10276 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10277 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain wall_ms=1784270070543 mono_ms=4828411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain stream-subscriber stream=4779 wall_ms=1784270070543 mono_ms=4828411 event=stream-sub-attach stream=4779 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain wall_ms=1784270070546 mono_ms=4828414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain wall_ms=1784270070546 mono_ms=4828414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain stream-subscriber stream=4777 wall_ms=1784270070546 mono_ms=4828414 event=stream-sub-attach stream=4777 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain stream-subscriber stream=4778 wall_ms=1784270070546 mono_ms=4828414 event=stream-sub-attach stream=4778 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain stream-subscriber stream=4779 wall_ms=1784270070549 mono_ms=4828416 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10281 role=brain wall_ms=1784270070549 mono_ms=4828417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10281 role=brain wall_ms=1784270070549 mono_ms=4828417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain stream-subscriber stream=4777 wall_ms=1784270070555 mono_ms=4828423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10282 role=brain wall_ms=1784270070555 mono_ms=4828423 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10282 role=brain wall_ms=1784270070555 mono_ms=4828423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain stream-subscriber stream=4778 wall_ms=1784270070564 mono_ms=4828432 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10283 role=brain wall_ms=1784270070564 mono_ms=4828432 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10283 role=brain wall_ms=1784270070564 mono_ms=4828432 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10284 role=brain wall_ms=1784270071164 mono_ms=4829032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10284 role=brain wall_ms=1784270071164 mono_ms=4829032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain wall_ms=1784270071166 mono_ms=4829033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain stream-subscriber stream=4780 wall_ms=1784270071166 mono_ms=4829033 event=stream-sub-attach stream=4780 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain stream-subscriber stream=4780 wall_ms=1784270071174 mono_ms=4829042 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10286 role=brain wall_ms=1784270071174 mono_ms=4829042 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10286 role=brain wall_ms=1784270071174 mono_ms=4829042 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10287 role=brain wall_ms=1784270075477 mono_ms=4833345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10287 role=brain wall_ms=1784270075477 mono_ms=4833345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10288 role=brain wall_ms=1784270078022 mono_ms=4835890 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10288 role=brain wall_ms=1784270078022 mono_ms=4835890 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078022 mono_ms=4835890 event=stream-sub-attach stream=4781 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078023 mono_ms=4835890 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078023 mono_ms=4835891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10290 role=brain wall_ms=1784270078023 mono_ms=4835891 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10290 role=brain wall_ms=1784270078023 mono_ms=4835891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10291 role=brain wall_ms=1784270078126 mono_ms=4835994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10291 role=brain wall_ms=1784270078126 mono_ms=4835994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078126 mono_ms=4835994 event=stream-sub-attach stream=4782 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078126 mono_ms=4835994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078127 mono_ms=4835994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10293 role=brain wall_ms=1784270078127 mono_ms=4835995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10293 role=brain wall_ms=1784270078127 mono_ms=4835995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10294 role=brain wall_ms=1784270079062 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10295 role=brain wall_ms=1784270079062 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10294 role=brain wall_ms=1784270079062 mono_ms=4836930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10295 role=brain wall_ms=1784270079062 mono_ms=4836930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10296 role=brain stream-subscriber stream=4784 wall_ms=1784270079062 mono_ms=4836930 event=stream-sub-attach stream=4784 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10297 role=brain stream-subscriber stream=4783 wall_ms=1784270079063 mono_ms=4836930 event=stream-sub-attach stream=4783 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10296 role=brain stream-subscriber stream=4784 wall_ms=1784270079063 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10297 role=brain stream-subscriber stream=4783 wall_ms=1784270079063 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10298 role=brain wall_ms=1784270080518 mono_ms=4838386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10298 role=brain wall_ms=1784270080518 mono_ms=4838386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=stream-sub-attach stream=4785 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10301 role=brain wall_ms=1784270085561 mono_ms=4843429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"lines","totalLines":386,"totalBytes":55391,"outputLines":355,"outputBytes":55391,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"CONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021377 mono_ms=4779245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270022814 mono_ms=4780682 event=stream-sub-attach stream=4720 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270023636 mono_ms=4781504 event=stream-sub-attach stream=4721 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10154 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10155 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10156 role=brain wall_ms=1784270023871 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10155 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10154 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10156 role=brain wall_ms=1784270023871 mono_ms=4781739 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023871 mono_ms=4781739 event=stream-sub-attach stream=4724 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023871 mono_ms=4781739 event=stream-sub-attach stream=4723 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023872 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023872 mono_ms=4781739 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain wall_ms=1784270023872 mono_ms=4781740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain stream-subscriber stream=4725 wall_ms=1784270023873 mono_ms=4781740 event=stream-sub-attach stream=4725 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10159 role=brain stream-subscriber stream=4724 wall_ms=1784270023876 mono_ms=4781744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10160 role=brain wall_ms=1784270023876 mono_ms=4781744 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10160 role=brain wall_ms=1784270023876 mono_ms=4781744 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10157 role=brain stream-subscriber stream=4723 wall_ms=1784270023880 mono_ms=4781748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10161 role=brain wall_ms=1784270023880 mono_ms=4781748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10161 role=brain wall_ms=1784270023881 mono_ms=4781748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10158 role=brain stream-subscriber stream=4725 wall_ms=1784270023894 mono_ms=4781762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10162 role=brain wall_ms=1784270023894 mono_ms=4781762 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10162 role=brain wall_ms=1784270023894 mono_ms=4781762 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10163 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10164 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10165 role=brain wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10163 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10165 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10164 role=brain wall_ms=1784270023975 mono_ms=4781843 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023975 mono_ms=4781843 event=stream-sub-attach stream=4722 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023975 mono_ms=4781843 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain wall_ms=1784270023977 mono_ms=4781844 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain stream-subscriber stream=4726 wall_ms=1784270023977 mono_ms=4781844 event=stream-sub-attach stream=4726 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10167 role=brain stream-subscriber stream=4722 wall_ms=1784270023980 mono_ms=4781848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10169 role=brain wall_ms=1784270023980 mono_ms=4781848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10169 role=brain wall_ms=1784270023980 mono_ms=4781848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10166 role=brain stream-subscriber stream=4726 wall_ms=1784270023986 mono_ms=4781853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10170 role=brain wall_ms=1784270023986 mono_ms=4781854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10170 role=brain wall_ms=1784270023986 mono_ms=4781854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain wall_ms=1784270023987 mono_ms=4781855 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain stream-subscriber stream=4727 wall_ms=1784270023987 mono_ms=4781855 event=stream-sub-attach stream=4727 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10168 role=brain stream-subscriber stream=4727 wall_ms=1784270023992 mono_ms=4781860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10171 role=brain wall_ms=1784270023992 mono_ms=4781860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10171 role=brain wall_ms=1784270023992 mono_ms=4781860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270024428 mono_ms=4782296 event=stream-sub-attach stream=4728 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270024787 mono_ms=4782655 event=stream-sub-attach stream=4729 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10172 role=brain wall_ms=1784270025013 mono_ms=4782881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10173 role=brain wall_ms=1784270025013 mono_ms=4782881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10172 role=brain wall_ms=1784270025013 mono_ms=4782881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10173 role=brain wall_ms=1784270025013 mono_ms=4782881 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain wall_ms=1784270025015 mono_ms=4782882 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain stream-subscriber stream=4730 wall_ms=1784270025015 mono_ms=4782882 event=stream-sub-attach stream=4730 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10174 role=brain stream-subscriber stream=4730 wall_ms=1784270025019 mono_ms=4782887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10176 role=brain wall_ms=1784270025019 mono_ms=4782887 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10176 role=brain wall_ms=1784270025019 mono_ms=4782887 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain wall_ms=1784270025025 mono_ms=4782893 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain stream-subscriber stream=4731 wall_ms=1784270025025 mono_ms=4782893 event=stream-sub-attach stream=4731 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10175 role=brain stream-subscriber stream=4731 wall_ms=1784270025027 mono_ms=4782895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10177 role=brain wall_ms=1784270025027 mono_ms=4782895 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10177 role=brain wall_ms=1784270025027 mono_ms=4782895 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10178 role=brain wall_ms=1784270025050 mono_ms=4782917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10178 role=brain wall_ms=1784270025050 mono_ms=4782918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10179 role=brain wall_ms=1784270025847 mono_ms=4783715 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10179 role=brain wall_ms=1784270025847 mono_ms=4783715 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain wall_ms=1784270025849 mono_ms=4783717 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain stream-subscriber stream=4732 wall_ms=1784270025849 mono_ms=4783717 event=stream-sub-attach stream=4732 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10180 role=brain stream-subscriber stream=4732 wall_ms=1784270025857 mono_ms=4783724 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10181 role=brain wall_ms=1784270025857 mono_ms=4783725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10181 role=brain wall_ms=1784270025857 mono_ms=4783725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270026608 mono_ms=4784476 event=stream-sub-attach stream=4733 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10182 role=brain wall_ms=1784270030092 mono_ms=4787960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10182 role=brain wall_ms=1784270030093 mono_ms=4787960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10183 role=brain wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10184 role=brain wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10183 role=brain wall_ms=1784270032700 mono_ms=4790568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10184 role=brain wall_ms=1784270032700 mono_ms=4790568 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032700 mono_ms=4790568 event=stream-sub-attach stream=4734 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032700 mono_ms=4790568 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain wall_ms=1784270032701 mono_ms=4790569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain stream-subscriber stream=4735 wall_ms=1784270032701 mono_ms=4790569 event=stream-sub-attach stream=4735 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10186 role=brain stream-subscriber stream=4734 wall_ms=1784270032705 mono_ms=4790573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10187 role=brain wall_ms=1784270032705 mono_ms=4790573 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10187 role=brain wall_ms=1784270032705 mono_ms=4790573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10185 role=brain stream-subscriber stream=4735 wall_ms=1784270032712 mono_ms=4790580 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10188 role=brain wall_ms=1784270032713 mono_ms=4790580 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10188 role=brain wall_ms=1784270032713 mono_ms=4790581 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10189 role=brain wall_ms=1784270035135 mono_ms=4793003 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10189 role=brain wall_ms=1784270035135 mono_ms=4793003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10190 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10192 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10191 role=brain wall_ms=1784270039041 mono_ms=4796909 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10190 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10192 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10191 role=brain wall_ms=1784270039042 mono_ms=4796909 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain wall_ms=1784270039043 mono_ms=4796911 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain stream-subscriber stream=4737 wall_ms=1784270039044 mono_ms=4796911 event=stream-sub-attach stream=4737 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10193 role=brain stream-subscriber stream=4737 wall_ms=1784270039046 mono_ms=4796914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10196 role=brain wall_ms=1784270039046 mono_ms=4796914 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10196 role=brain wall_ms=1784270039046 mono_ms=4796914 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain wall_ms=1784270039059 mono_ms=4796926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain wall_ms=1784270039059 mono_ms=4796926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain stream-subscriber stream=4736 wall_ms=1784270039059 mono_ms=4796927 event=stream-sub-attach stream=4736 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain stream-subscriber stream=4738 wall_ms=1784270039059 mono_ms=4796927 event=stream-sub-attach stream=4738 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10194 role=brain stream-subscriber stream=4738 wall_ms=1784270039064 mono_ms=4796932 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10197 role=brain wall_ms=1784270039065 mono_ms=4796932 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10197 role=brain wall_ms=1784270039065 mono_ms=4796932 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10195 role=brain stream-subscriber stream=4736 wall_ms=1784270039069 mono_ms=4796937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10198 role=brain wall_ms=1784270039069 mono_ms=4796937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10198 role=brain wall_ms=1784270039069 mono_ms=4796937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10199 role=brain wall_ms=1784270039978 mono_ms=4797846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10200 role=brain wall_ms=1784270039978 mono_ms=4797846 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10199 role=brain wall_ms=1784270039978 mono_ms=4797846 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10200 role=brain wall_ms=1784270039978 mono_ms=4797846 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain wall_ms=1784270039980 mono_ms=4797847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain stream-subscriber stream=4740 wall_ms=1784270039980 mono_ms=4797848 event=stream-sub-attach stream=4740 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10202 role=brain stream-subscriber stream=4740 wall_ms=1784270039981 mono_ms=4797849 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10203 role=brain wall_ms=1784270039981 mono_ms=4797849 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10203 role=brain wall_ms=1784270039981 mono_ms=4797849 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain wall_ms=1784270039993 mono_ms=4797860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain stream-subscriber stream=4739 wall_ms=1784270039993 mono_ms=4797861 event=stream-sub-attach stream=4739 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10201 role=brain stream-subscriber stream=4739 wall_ms=1784270039998 mono_ms=4797866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10204 role=brain wall_ms=1784270039998 mono_ms=4797866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10204 role=brain wall_ms=1784270039998 mono_ms=4797866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10205 role=brain wall_ms=1784270040180 mono_ms=4798048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10205 role=brain wall_ms=1784270040180 mono_ms=4798048 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=59475668 id=eb2beb1ce94ff10eaa96c1a7b09bfdd65fa0e02e1c0117f9239db8d30c6edca7 addr=EndpointAddr { id: PublicKey(eb2beb1ce94ff10eaa96c1a7b09bfdd65fa0e02e1c0117f9239db8d30c6edca7), addrs: {Ip(100.68.35.65:51310), Ip(192.168.1.81:51310)} }\nPAIR_MEET_UP:BIGNET step=59475668 id=31592bdf2e639653335176f92dcb4ae527c981521f1813ac4b2bef0caa2891a2 addr=EndpointAddr { id: PublicKey(31592bdf2e639653335176f92dcb4ae527c981521f1813ac4b2bef0caa2891a2), addrs: {Ip(100.68.35.65:51308), Ip(192.168.1.81:51308)} }\nCONN_LIFECYCLE: conn=10206 role=brain wall_ms=1784270041018 mono_ms=4798886 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10206 role=brain wall_ms=1784270041018 mono_ms=4798886 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain wall_ms=1784270041019 mono_ms=4798887 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain stream-subscriber stream=4741 wall_ms=1784270041019 mono_ms=4798887 event=stream-sub-attach stream=4741 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10207 role=brain stream-subscriber stream=4741 wall_ms=1784270041038 mono_ms=4798906 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10208 role=brain wall_ms=1784270041039 mono_ms=4798906 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10208 role=brain wall_ms=1784270041039 mono_ms=4798906 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10209 role=brain wall_ms=1784270041538 mono_ms=4799406 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10209 role=brain wall_ms=1784270041538 mono_ms=4799406 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=stream-sub-attach stream=4742 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10210 role=brain stream-subscriber stream=4742 wall_ms=1784270041539 mono_ms=4799407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10211 role=brain wall_ms=1784270041539 mono_ms=4799407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10211 role=brain wall_ms=1784270041539 mono_ms=4799407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10212 role=brain wall_ms=1784270045222 mono_ms=4803090 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10212 role=brain wall_ms=1784270045222 mono_ms=4803090 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10213 role=brain wall_ms=1784270046947 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10214 role=brain wall_ms=1784270046947 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10213 role=brain wall_ms=1784270046947 mono_ms=4804815 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10214 role=brain wall_ms=1784270046947 mono_ms=4804815 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270046947 mono_ms=4804815 event=stream-sub-attach stream=4743 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270046947 mono_ms=4804815 event=stream-sub-attach stream=4744 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270046948 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270046948 mono_ms=4804815 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10215 role=brain stream-subscriber stream=4743 wall_ms=1784270048627 mono_ms=4806495 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10217 role=brain wall_ms=1784270048627 mono_ms=4806495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10217 role=brain wall_ms=1784270048628 mono_ms=4806495 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10216 role=brain stream-subscriber stream=4744 wall_ms=1784270048630 mono_ms=4806498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10218 role=brain wall_ms=1784270048630 mono_ms=4806498 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10218 role=brain wall_ms=1784270048630 mono_ms=4806498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10219 role=brain wall_ms=1784270050264 mono_ms=4808132 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10219 role=brain wall_ms=1784270050264 mono_ms=4808132 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10220 role=brain wall_ms=1784270051519 mono_ms=4809387 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10220 role=brain wall_ms=1784270051519 mono_ms=4809387 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051519 mono_ms=4809387 event=stream-sub-attach stream=4755 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051520 mono_ms=4809387 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10221 role=brain stream-subscriber stream=4755 wall_ms=1784270051526 mono_ms=4809393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10222 role=brain wall_ms=1784270051526 mono_ms=4809394 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10222 role=brain wall_ms=1784270051526 mono_ms=4809394 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10223 role=brain wall_ms=1784270053182 mono_ms=4811050 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10223 role=brain wall_ms=1784270053182 mono_ms=4811050 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=stream-sub-attach stream=4756 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10224 role=brain stream-subscriber stream=4756 wall_ms=1784270053183 mono_ms=4811051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10225 role=brain wall_ms=1784270053183 mono_ms=4811051 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10225 role=brain wall_ms=1784270053183 mono_ms=4811051 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10226 role=brain wall_ms=1784270055157 mono_ms=4813025 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10227 role=brain wall_ms=1784270055157 mono_ms=4813025 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10226 role=brain wall_ms=1784270055157 mono_ms=4813025 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10227 role=brain wall_ms=1784270055157 mono_ms=4813025 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain wall_ms=1784270055158 mono_ms=4813026 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain stream-subscriber stream=4757 wall_ms=1784270055158 mono_ms=4813026 event=stream-sub-attach stream=4757 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10229 role=brain stream-subscriber stream=4757 wall_ms=1784270055163 mono_ms=4813031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10230 role=brain wall_ms=1784270055163 mono_ms=4813031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10230 role=brain wall_ms=1784270055163 mono_ms=4813031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain wall_ms=1784270055174 mono_ms=4813042 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain stream-subscriber stream=4758 wall_ms=1784270055174 mono_ms=4813042 event=stream-sub-attach stream=4758 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10228 role=brain stream-subscriber stream=4758 wall_ms=1784270055176 mono_ms=4813044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10231 role=brain wall_ms=1784270055176 mono_ms=4813044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10231 role=brain wall_ms=1784270055176 mono_ms=4813044 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10232 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10233 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10234 role=brain wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10232 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10233 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10234 role=brain wall_ms=1784270055261 mono_ms=4813129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4759 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4760 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055261 mono_ms=4813129 event=stream-sub-attach stream=4761 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055261 mono_ms=4813129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10237 role=brain stream-subscriber stream=4761 wall_ms=1784270055269 mono_ms=4813137 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10238 role=brain wall_ms=1784270055269 mono_ms=4813137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10238 role=brain wall_ms=1784270055269 mono_ms=4813137 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10235 role=brain stream-subscriber stream=4759 wall_ms=1784270055271 mono_ms=4813139 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10239 role=brain wall_ms=1784270055271 mono_ms=4813139 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10239 role=brain wall_ms=1784270055271 mono_ms=4813139 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10236 role=brain stream-subscriber stream=4760 wall_ms=1784270055274 mono_ms=4813142 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10240 role=brain wall_ms=1784270055274 mono_ms=4813142 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10240 role=brain wall_ms=1784270055274 mono_ms=4813142 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10241 role=brain wall_ms=1784270055306 mono_ms=4813174 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10241 role=brain wall_ms=1784270055307 mono_ms=4813174 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10242 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10243 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10244 role=brain wall_ms=1784270055365 mono_ms=4813233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10242 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10243 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10244 role=brain wall_ms=1784270055365 mono_ms=4813233 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain wall_ms=1784270055367 mono_ms=4813234 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain stream-subscriber stream=4762 wall_ms=1784270055367 mono_ms=4813234 event=stream-sub-attach stream=4762 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10245 role=brain stream-subscriber stream=4762 wall_ms=1784270055375 mono_ms=4813243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10248 role=brain wall_ms=1784270055376 mono_ms=4813243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10248 role=brain wall_ms=1784270055376 mono_ms=4813243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain wall_ms=1784270055377 mono_ms=4813244 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain stream-subscriber stream=4764 wall_ms=1784270055377 mono_ms=4813245 event=stream-sub-attach stream=4764 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain wall_ms=1784270055377 mono_ms=4813245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain stream-subscriber stream=4763 wall_ms=1784270055377 mono_ms=4813245 event=stream-sub-attach stream=4763 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10247 role=brain stream-subscriber stream=4763 wall_ms=1784270055379 mono_ms=4813247 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10249 role=brain wall_ms=1784270055379 mono_ms=4813247 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10249 role=brain wall_ms=1784270055379 mono_ms=4813247 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10246 role=brain stream-subscriber stream=4764 wall_ms=1784270055382 mono_ms=4813250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10250 role=brain wall_ms=1784270055382 mono_ms=4813250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10250 role=brain wall_ms=1784270055382 mono_ms=4813250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10251 role=brain wall_ms=1784270056092 mono_ms=4813960 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10251 role=brain wall_ms=1784270056092 mono_ms=4813960 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain wall_ms=1784270056093 mono_ms=4813961 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain stream-subscriber stream=4765 wall_ms=1784270056093 mono_ms=4813961 event=stream-sub-attach stream=4765 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10252 role=brain stream-subscriber stream=4765 wall_ms=1784270056129 mono_ms=4813996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10253 role=brain wall_ms=1784270056129 mono_ms=4813997 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10253 role=brain wall_ms=1784270056129 mono_ms=4813997 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10254 role=brain wall_ms=1784270057859 mono_ms=4815727 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10254 role=brain wall_ms=1784270057859 mono_ms=4815727 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain wall_ms=1784270057861 mono_ms=4815728 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain stream-subscriber stream=4766 wall_ms=1784270057861 mono_ms=4815728 event=stream-sub-attach stream=4766 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10255 role=brain stream-subscriber stream=4766 wall_ms=1784270057864 mono_ms=4815732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10256 role=brain wall_ms=1784270057864 mono_ms=4815732 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10256 role=brain wall_ms=1784270057864 mono_ms=4815732 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10257 role=brain wall_ms=1784270060347 mono_ms=4818215 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10257 role=brain wall_ms=1784270060347 mono_ms=4818215 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10258 role=brain wall_ms=1784270065391 mono_ms=4823259 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10258 role=brain wall_ms=1784270065391 mono_ms=4823259 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10259 role=brain wall_ms=1784270065549 mono_ms=4823417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10259 role=brain wall_ms=1784270065549 mono_ms=4823417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065549 mono_ms=4823417 event=stream-sub-attach stream=4772 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065549 mono_ms=4823417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10260 role=brain stream-subscriber stream=4772 wall_ms=1784270065550 mono_ms=4823417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10261 role=brain wall_ms=1784270065550 mono_ms=4823418 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10261 role=brain wall_ms=1784270065550 mono_ms=4823418 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10262 role=brain wall_ms=1784270065757 mono_ms=4823625 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10262 role=brain wall_ms=1784270065757 mono_ms=4823625 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=stream-sub-attach stream=4773 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10263 role=brain stream-subscriber stream=4773 wall_ms=1784270065758 mono_ms=4823626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10264 role=brain wall_ms=1784270065758 mono_ms=4823626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10264 role=brain wall_ms=1784270065758 mono_ms=4823626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10265 role=brain wall_ms=1784270066069 mono_ms=4823937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10265 role=brain wall_ms=1784270066069 mono_ms=4823937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=stream-sub-attach stream=4774 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10266 role=brain stream-subscriber stream=4774 wall_ms=1784270066070 mono_ms=4823938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10267 role=brain wall_ms=1784270066070 mono_ms=4823938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10267 role=brain wall_ms=1784270066070 mono_ms=4823938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10268 role=brain wall_ms=1784270070125 mono_ms=4827993 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10268 role=brain wall_ms=1784270070125 mono_ms=4827993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10269 role=brain wall_ms=1784270070125 mono_ms=4827993 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10269 role=brain wall_ms=1784270070126 mono_ms=4827993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain wall_ms=1784270070127 mono_ms=4827994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain wall_ms=1784270070127 mono_ms=4827995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain stream-subscriber stream=4776 wall_ms=1784270070127 mono_ms=4827995 event=stream-sub-attach stream=4776 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain stream-subscriber stream=4775 wall_ms=1784270070127 mono_ms=4827995 event=stream-sub-attach stream=4775 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10270 role=brain stream-subscriber stream=4776 wall_ms=1784270070128 mono_ms=4827996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10272 role=brain wall_ms=1784270070129 mono_ms=4827996 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10272 role=brain wall_ms=1784270070129 mono_ms=4827996 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10271 role=brain stream-subscriber stream=4775 wall_ms=1784270070145 mono_ms=4828013 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10273 role=brain wall_ms=1784270070145 mono_ms=4828013 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10273 role=brain wall_ms=1784270070145 mono_ms=4828013 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=59475669 id=4197d4ae6d91445f8a941f19112fc6ebfd72abe376e913206062284aa2c2fee4 addr=EndpointAddr { id: PublicKey(4197d4ae6d91445f8a941f19112fc6ebfd72abe376e913206062284aa2c2fee4), addrs: {Ip(100.68.35.65:54351), Ip(192.168.1.81:54351)} }\nPAIR_MEET_UP:SPT_DEV step=59475669 id=87d1ecac0c664eb92694fa1b98f7cf414e13c98ba19ac20c3efea0c906afb25a addr=EndpointAddr { id: PublicKey(87d1ecac0c664eb92694fa1b98f7cf414e13c98ba19ac20c3efea0c906afb25a), addrs: {Ip(100.68.35.65:54352), Ip(192.168.1.81:54352)} }\nCONN_LIFECYCLE: conn=10274 role=brain wall_ms=1784270070435 mono_ms=4828303 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10274 role=brain wall_ms=1784270070435 mono_ms=4828303 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10275 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10276 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10277 role=brain wall_ms=1784270070541 mono_ms=4828409 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10275 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10276 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10277 role=brain wall_ms=1784270070541 mono_ms=4828409 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain wall_ms=1784270070543 mono_ms=4828411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain stream-subscriber stream=4779 wall_ms=1784270070543 mono_ms=4828411 event=stream-sub-attach stream=4779 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain wall_ms=1784270070546 mono_ms=4828414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain wall_ms=1784270070546 mono_ms=4828414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain stream-subscriber stream=4777 wall_ms=1784270070546 mono_ms=4828414 event=stream-sub-attach stream=4777 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain stream-subscriber stream=4778 wall_ms=1784270070546 mono_ms=4828414 event=stream-sub-attach stream=4778 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10278 role=brain stream-subscriber stream=4779 wall_ms=1784270070549 mono_ms=4828416 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10281 role=brain wall_ms=1784270070549 mono_ms=4828417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10281 role=brain wall_ms=1784270070549 mono_ms=4828417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10279 role=brain stream-subscriber stream=4777 wall_ms=1784270070555 mono_ms=4828423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10282 role=brain wall_ms=1784270070555 mono_ms=4828423 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10282 role=brain wall_ms=1784270070555 mono_ms=4828423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10280 role=brain stream-subscriber stream=4778 wall_ms=1784270070564 mono_ms=4828432 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10283 role=brain wall_ms=1784270070564 mono_ms=4828432 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10283 role=brain wall_ms=1784270070564 mono_ms=4828432 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10284 role=brain wall_ms=1784270071164 mono_ms=4829032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10284 role=brain wall_ms=1784270071164 mono_ms=4829032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain wall_ms=1784270071166 mono_ms=4829033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain stream-subscriber stream=4780 wall_ms=1784270071166 mono_ms=4829033 event=stream-sub-attach stream=4780 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10285 role=brain stream-subscriber stream=4780 wall_ms=1784270071174 mono_ms=4829042 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10286 role=brain wall_ms=1784270071174 mono_ms=4829042 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10286 role=brain wall_ms=1784270071174 mono_ms=4829042 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10287 role=brain wall_ms=1784270075477 mono_ms=4833345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10287 role=brain wall_ms=1784270075477 mono_ms=4833345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10288 role=brain wall_ms=1784270078022 mono_ms=4835890 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10288 role=brain wall_ms=1784270078022 mono_ms=4835890 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078022 mono_ms=4835890 event=stream-sub-attach stream=4781 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078023 mono_ms=4835890 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10289 role=brain stream-subscriber stream=4781 wall_ms=1784270078023 mono_ms=4835891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10290 role=brain wall_ms=1784270078023 mono_ms=4835891 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10290 role=brain wall_ms=1784270078023 mono_ms=4835891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10291 role=brain wall_ms=1784270078126 mono_ms=4835994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10291 role=brain wall_ms=1784270078126 mono_ms=4835994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078126 mono_ms=4835994 event=stream-sub-attach stream=4782 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078126 mono_ms=4835994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10292 role=brain stream-subscriber stream=4782 wall_ms=1784270078127 mono_ms=4835994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10293 role=brain wall_ms=1784270078127 mono_ms=4835995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10293 role=brain wall_ms=1784270078127 mono_ms=4835995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10294 role=brain wall_ms=1784270079062 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10295 role=brain wall_ms=1784270079062 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10294 role=brain wall_ms=1784270079062 mono_ms=4836930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10295 role=brain wall_ms=1784270079062 mono_ms=4836930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10296 role=brain stream-subscriber stream=4784 wall_ms=1784270079062 mono_ms=4836930 event=stream-sub-attach stream=4784 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10297 role=brain stream-subscriber stream=4783 wall_ms=1784270079063 mono_ms=4836930 event=stream-sub-attach stream=4783 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10296 role=brain stream-subscriber stream=4784 wall_ms=1784270079063 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10297 role=brain stream-subscriber stream=4783 wall_ms=1784270079063 mono_ms=4836930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10298 role=brain wall_ms=1784270080518 mono_ms=4838386 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10298 role=brain wall_ms=1784270080518 mono_ms=4838386 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=stream-sub-attach stream=4785 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=10301 role=brain wall_ms=1784270085561 mono_ms=4843429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]","startLine":24499,"lineNumbers":[24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":386,"totalBytes":55391,"outputLines":355,"outputBytes":55391,"shownRange":{"start":24499,"end":24853},"nextOffset":24854}}},"isError":false,"timestamp":1784271994993}}
{"type":"message","id":"de0875ae","parentId":"04fc2f15","timestamp":"2026-07-17T07:06:34.998Z","message":{"role":"toolResult","toolCallId":"call_0i7ESj89XoikSkVJ57vS8uSP|fc_0fcf561150331aac016a59d47a44c08190a803360a1e811fef","toolName":"read","content":[{"type":"text","text":"CONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612493 mono_ms=5370360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612494 mono_ms=5370360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain wall_ms=1784270612495 mono_ms=5370361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612495 mono_ms=5370361 event=stream-sub-attach stream=5409 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612497 mono_ms=5370363 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11617 role=brain wall_ms=1784270612912 mono_ms=5370778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11617 role=brain wall_ms=1784270612912 mono_ms=5370779 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain wall_ms=1784270612914 mono_ms=5370780 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain stream-subscriber stream=5410 wall_ms=1784270612914 mono_ms=5370780 event=stream-sub-attach stream=5410 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain stream-subscriber stream=5410 wall_ms=1784270613014 mono_ms=5370880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11619 role=brain wall_ms=1784270613014 mono_ms=5370880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11619 role=brain wall_ms=1784270613014 mono_ms=5370880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11620 role=brain wall_ms=1784270615058 mono_ms=5372924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11620 role=brain wall_ms=1784270615058 mono_ms=5372924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11621 role=brain wall_ms=1784270620103 mono_ms=5377969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11621 role=brain wall_ms=1784270620103 mono_ms=5377969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11622 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11623 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11624 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11622 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11624 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11623 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620546 mono_ms=5378413 event=stream-sub-attach stream=5413 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620546 mono_ms=5378413 event=stream-sub-attach stream=5411 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620547 mono_ms=5378413 event=stream-sub-attach stream=5412 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620550 mono_ms=5378417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11628 role=brain wall_ms=1784270620551 mono_ms=5378417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11628 role=brain wall_ms=1784270620551 mono_ms=5378417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620557 mono_ms=5378423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11629 role=brain wall_ms=1784270620557 mono_ms=5378423 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11629 role=brain wall_ms=1784270620557 mono_ms=5378424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620559 mono_ms=5378425 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11630 role=brain wall_ms=1784270620559 mono_ms=5378425 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11630 role=brain wall_ms=1784270620559 mono_ms=5378425 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11631 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11632 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11633 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11631 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11632 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11633 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622123 mono_ms=5379989 event=stream-sub-attach stream=5416 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain wall_ms=1784270622124 mono_ms=5379991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain stream-subscriber stream=5417 wall_ms=1784270622124 mono_ms=5379991 event=stream-sub-attach stream=5417 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622129 mono_ms=5379995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11637 role=brain wall_ms=1784270622129 mono_ms=5379995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11637 role=brain wall_ms=1784270622129 mono_ms=5379995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain stream-subscriber stream=5417 wall_ms=1784270622137 mono_ms=5380003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11638 role=brain wall_ms=1784270622137 mono_ms=5380003 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11638 role=brain wall_ms=1784270622137 mono_ms=5380003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain wall_ms=1784270622139 mono_ms=5380006 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain stream-subscriber stream=5415 wall_ms=1784270622139 mono_ms=5380006 event=stream-sub-attach stream=5415 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain stream-subscriber stream=5415 wall_ms=1784270622146 mono_ms=5380012 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11639 role=brain wall_ms=1784270622146 mono_ms=5380012 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11639 role=brain wall_ms=1784270622146 mono_ms=5380012 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11640 role=brain wall_ms=1784270622227 mono_ms=5380094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11640 role=brain wall_ms=1784270622228 mono_ms=5380094 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622228 mono_ms=5380094 event=stream-sub-attach stream=5414 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622228 mono_ms=5380094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622232 mono_ms=5380098 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11642 role=brain wall_ms=1784270622232 mono_ms=5380098 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11642 role=brain wall_ms=1784270622232 mono_ms=5380098 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11643 role=brain wall_ms=1784270622958 mono_ms=5380825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11643 role=brain wall_ms=1784270622958 mono_ms=5380825 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain wall_ms=1784270622960 mono_ms=5380826 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain stream-subscriber stream=5418 wall_ms=1784270622960 mono_ms=5380826 event=stream-sub-attach stream=5418 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain stream-subscriber stream=5418 wall_ms=1784270622972 mono_ms=5380838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11645 role=brain wall_ms=1784270622972 mono_ms=5380838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11645 role=brain wall_ms=1784270622972 mono_ms=5380838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11646 role=brain wall_ms=1784270623063 mono_ms=5380930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11647 role=brain wall_ms=1784270623063 mono_ms=5380930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11646 role=brain wall_ms=1784270623063 mono_ms=5380930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11647 role=brain wall_ms=1784270623063 mono_ms=5380930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain wall_ms=1784270623065 mono_ms=5380931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain stream-subscriber stream=5419 wall_ms=1784270623065 mono_ms=5380931 event=stream-sub-attach stream=5419 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain stream-subscriber stream=5419 wall_ms=1784270623067 mono_ms=5380933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11650 role=brain wall_ms=1784270623067 mono_ms=5380933 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11650 role=brain wall_ms=1784270623067 mono_ms=5380933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain wall_ms=1784270623069 mono_ms=5380935 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain stream-subscriber stream=5420 wall_ms=1784270623069 mono_ms=5380935 event=stream-sub-attach stream=5420 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain stream-subscriber stream=5420 wall_ms=1784270623075 mono_ms=5380941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11651 role=brain wall_ms=1784270623075 mono_ms=5380941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11651 role=brain wall_ms=1784270623075 mono_ms=5380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11652 role=brain wall_ms=1784270625145 mono_ms=5383011 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11652 role=brain wall_ms=1784270625145 mono_ms=5383011 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11653 role=brain wall_ms=1784270627554 mono_ms=5385420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11653 role=brain wall_ms=1784270627554 mono_ms=5385421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain wall_ms=1784270627555 mono_ms=5385422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain stream-subscriber stream=5426 wall_ms=1784270627556 mono_ms=5385422 event=stream-sub-attach stream=5426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain stream-subscriber stream=5426 wall_ms=1784270627558 mono_ms=5385424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11655 role=brain wall_ms=1784270627558 mono_ms=5385424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11655 role=brain wall_ms=1784270627558 mono_ms=5385424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11656 role=brain wall_ms=1784270627972 mono_ms=5385838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11657 role=brain wall_ms=1784270627972 mono_ms=5385838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11656 role=brain wall_ms=1784270627972 mono_ms=5385838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11657 role=brain wall_ms=1784270627972 mono_ms=5385838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627972 mono_ms=5385839 event=stream-sub-attach stream=5428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627972 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627973 mono_ms=5385839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11660 role=brain wall_ms=1784270627973 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11660 role=brain wall_ms=1784270627973 mono_ms=5385839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain wall_ms=1784270627973 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain stream-subscriber stream=5427 wall_ms=1784270627973 mono_ms=5385839 event=stream-sub-attach stream=5427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain stream-subscriber stream=5427 wall_ms=1784270628031 mono_ms=5385897 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11661 role=brain wall_ms=1784270628031 mono_ms=5385898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11661 role=brain wall_ms=1784270628031 mono_ms=5385898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11662 role=brain wall_ms=1784270628181 mono_ms=5386047 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11662 role=brain wall_ms=1784270628181 mono_ms=5386047 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628181 mono_ms=5386048 event=stream-sub-attach stream=5429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628181 mono_ms=5386048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628182 mono_ms=5386048 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11664 role=brain wall_ms=1784270628182 mono_ms=5386048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11664 role=brain wall_ms=1784270628182 mono_ms=5386048 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11665 role=brain wall_ms=1784270628390 mono_ms=5386256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11665 role=brain wall_ms=1784270628390 mono_ms=5386256 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386256 event=stream-sub-attach stream=5430 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11667 role=brain wall_ms=1784270628390 mono_ms=5386257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11667 role=brain wall_ms=1784270628391 mono_ms=5386257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11668 role=brain wall_ms=1784270628808 mono_ms=5386674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11668 role=brain wall_ms=1784270628808 mono_ms=5386674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628808 mono_ms=5386674 event=stream-sub-attach stream=5431 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628808 mono_ms=5386674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628814 mono_ms=5386680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11670 role=brain wall_ms=1784270628814 mono_ms=5386680 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11670 role=brain wall_ms=1784270628814 mono_ms=5386680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11671 role=brain wall_ms=1784270630186 mono_ms=5388052 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11671 role=brain wall_ms=1784270630186 mono_ms=5388052 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270630842 mono_ms=5388708 event=stream-sub-attach stream=5432 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270631871 mono_ms=5389737 event=stream-sub-attach stream=5433 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270633639 mono_ms=5391506 event=stream-sub-attach stream=5434 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270633894 mono_ms=5391760 event=stream-sub-attach stream=5435 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11672 role=brain wall_ms=1784270635228 mono_ms=5393094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11672 role=brain wall_ms=1784270635228 mono_ms=5393094 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270635290 mono_ms=5393156 event=stream-sub-attach stream=5436 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11673 role=brain wall_ms=1784270635705 mono_ms=5393571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11673 role=brain wall_ms=1784270635705 mono_ms=5393571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635705 mono_ms=5393571 event=stream-sub-attach stream=5437 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635705 mono_ms=5393571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635709 mono_ms=5393575 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11675 role=brain wall_ms=1784270635709 mono_ms=5393576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11675 role=brain wall_ms=1784270635709 mono_ms=5393576 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11676 role=brain wall_ms=1784270637165 mono_ms=5395031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11677 role=brain wall_ms=1784270637165 mono_ms=5395031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11676 role=brain wall_ms=1784270637165 mono_ms=5395032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11677 role=brain wall_ms=1784270637165 mono_ms=5395032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain wall_ms=1784270637167 mono_ms=5395033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain stream-subscriber stream=5438 wall_ms=1784270637167 mono_ms=5395033 event=stream-sub-attach stream=5438 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain stream-subscriber stream=5438 wall_ms=1784270637171 mono_ms=5395037 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11680 role=brain wall_ms=1784270637171 mono_ms=5395038 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11680 role=brain wall_ms=1784270637171 mono_ms=5395038 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain wall_ms=1784270637178 mono_ms=5395044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain stream-subscriber stream=5439 wall_ms=1784270637178 mono_ms=5395044 event=stream-sub-attach stream=5439 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain stream-subscriber stream=5439 wall_ms=1784270637180 mono_ms=5395046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11681 role=brain wall_ms=1784270637180 mono_ms=5395046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11681 role=brain wall_ms=1784270637180 mono_ms=5395046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11683 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11682 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11684 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11682 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11683 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11684 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain wall_ms=1784270638210 mono_ms=5396076 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain stream-subscriber stream=5440 wall_ms=1784270638210 mono_ms=5396076 event=stream-sub-attach stream=5440 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain wall_ms=1784270638216 mono_ms=5396082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain stream-subscriber stream=5442 wall_ms=1784270638216 mono_ms=5396082 event=stream-sub-attach stream=5442 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain wall_ms=1784270638216 mono_ms=5396082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain stream-subscriber stream=5441 wall_ms=1784270638216 mono_ms=5396082 event=stream-sub-attach stream=5441 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain stream-subscriber stream=5440 wall_ms=1784270638219 mono_ms=5396086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11688 role=brain wall_ms=1784270638219 mono_ms=5396086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11688 role=brain wall_ms=1784270638219 mono_ms=5396086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain stream-subscriber stream=5442 wall_ms=1784270638222 mono_ms=5396088 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11689 role=brain wall_ms=1784270638222 mono_ms=5396088 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11689 role=brain wall_ms=1784270638222 mono_ms=5396088 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain stream-subscriber stream=5441 wall_ms=1784270638233 mono_ms=5396099 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11690 role=brain wall_ms=1784270638233 mono_ms=5396100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11690 role=brain wall_ms=1784270638233 mono_ms=5396100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11691 role=brain wall_ms=1784270640270 mono_ms=5398136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11691 role=brain wall_ms=1784270640270 mono_ms=5398136 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=59475688 id=1802ffd7053ac46ea93d8d235f15bbe1d80549b560ad1f0146151f58c6742e72 addr=EndpointAddr { id: PublicKey(1802ffd7053ac46ea93d8d235f15bbe1d80549b560ad1f0146151f58c6742e72), addrs: {Ip(100.68.35.65:64246), Ip(192.168.1.81:64246)} }\nPAIR_MEET_UP:SPT_DEV step=59475688 id=687fea508fc25617e560d2cbc3fc9f45e6879f487d06d1dbf16d4d91146862ee addr=EndpointAddr { id: PublicKey(687fea508fc25617e560d2cbc3fc9f45e6879f487d06d1dbf16d4d91146862ee), addrs: {Ip(100.68.35.65:64245), Ip(192.168.1.81:64245)} }\nCONN_LIFECYCLE: conn=11692 role=brain wall_ms=1784270642699 mono_ms=5400565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11692 role=brain wall_ms=1784270642699 mono_ms=5400565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain wall_ms=1784270642700 mono_ms=5400566 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain stream-subscriber stream=5443 wall_ms=1784270642700 mono_ms=5400566 event=stream-sub-attach stream=5443 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain stream-subscriber stream=5443 wall_ms=1784270642702 mono_ms=5400569 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11694 role=brain wall_ms=1784270642703 mono_ms=5400569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11694 role=brain wall_ms=1784270642703 mono_ms=5400569 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11695 role=brain wall_ms=1784270643013 mono_ms=5400880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11695 role=brain wall_ms=1784270643013 mono_ms=5400880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain wall_ms=1784270643014 mono_ms=5400881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain stream-subscriber stream=5444 wall_ms=1784270643015 mono_ms=5400881 event=stream-sub-attach stream=5444 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain stream-subscriber stream=5444 wall_ms=1784270643215 mono_ms=5401081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11697 role=brain wall_ms=1784270643215 mono_ms=5401082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11697 role=brain wall_ms=1784270643215 mono_ms=5401082 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11698 role=brain wall_ms=1784270645310 mono_ms=5403176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11698 role=brain wall_ms=1784270645310 mono_ms=5403176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11699 role=brain wall_ms=1784270650351 mono_ms=5408217 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11699 role=brain wall_ms=1784270650351 mono_ms=5408217 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11700 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11701 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11702 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11700 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11701 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11702 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5445 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5447 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5446 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11706 role=brain wall_ms=1784270655392 mono_ms=5413258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11706 role=brain wall_ms=1784270655392 mono_ms=5413258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270658067 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11707 role=brain wall_ms=1784270658068 mono_ms=5415934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11707 role=brain wall_ms=1784270658068 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11708 role=brain wall_ms=1784270658068 mono_ms=5415934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11708 role=brain wall_ms=1784270658068 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain wall_ms=1784270658070 mono_ms=5415936 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain stream-subscriber stream=5449 wall_ms=1784270658070 mono_ms=5415936 event=stream-sub-attach stream=5449 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270658075 mono_ms=5415941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11710 role=brain wall_ms=1784270658075 mono_ms=5415941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11710 role=brain wall_ms=1784270658075 mono_ms=5415941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270658077 mono_ms=5415943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11711 role=brain wall_ms=1784270658077 mono_ms=5415943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11711 role=brain wall_ms=1784270658077 mono_ms=5415943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain stream-subscriber stream=5449 wall_ms=1784270658090 mono_ms=5415956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11712 role=brain wall_ms=1784270658090 mono_ms=5415956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11712 role=brain wall_ms=1784270658090 mono_ms=5415957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11713 role=brain wall_ms=1784270658173 mono_ms=5416039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11714 role=brain wall_ms=1784270658173 mono_ms=5416039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11713 role=brain wall_ms=1784270658173 mono_ms=5416039 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11714 role=brain wall_ms=1784270658173 mono_ms=5416039 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=stream-sub-attach stream=5448 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11717 role=brain wall_ms=1784270658174 mono_ms=5416040 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11717 role=brain wall_ms=1784270658174 mono_ms=5416040 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain wall_ms=1784270658174 mono_ms=5416041 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain stream-subscriber stream=5450 wall_ms=1784270658174 mono_ms=5416041 event=stream-sub-attach stream=5450 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain stream-subscriber stream=5450 wall_ms=1784270658177 mono_ms=5416043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11718 role=brain wall_ms=1784270658177 mono_ms=5416043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11718 role=brain wall_ms=1784270658177 mono_ms=5416043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11719 role=brain wall_ms=1784270658277 mono_ms=5416144 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11719 role=brain wall_ms=1784270658277 mono_ms=5416144 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain wall_ms=1784270658279 mono_ms=5416145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain stream-subscriber stream=5461 wall_ms=1784270658279 mono_ms=5416145 event=stream-sub-attach stream=5461 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11721 role=brain wall_ms=1784270658382 mono_ms=5416248 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11721 role=brain wall_ms=1784270658382 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=stream-sub-attach stream=5462 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11723 role=brain wall_ms=1784270658383 mono_ms=5416249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11723 role=brain wall_ms=1784270658383 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain stream-subscriber stream=5461 wall_ms=1784270658666 mono_ms=5416532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11724 role=brain wall_ms=1784270658666 mono_ms=5416533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11724 role=brain wall_ms=1784270658666 mono_ms=5416533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11725 role=brain wall_ms=1784270658904 mono_ms=5416771 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11725 role=brain wall_ms=1784270658904 mono_ms=5416771 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658905 mono_ms=5416771 event=stream-sub-attach stream=5463 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658905 mono_ms=5416771 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658911 mono_ms=5416777 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11727 role=brain wall_ms=1784270658911 mono_ms=5416777 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11727 role=brain wall_ms=1784270658911 mono_ms=5416777 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11728 role=brain wall_ms=1784270659009 mono_ms=5416875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11728 role=brain wall_ms=1784270659009 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=stream-sub-attach stream=5464 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11730 role=brain wall_ms=1784270659010 mono_ms=5416876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11730 role=brain wall_ms=1784270659010 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11731 role=brain wall_ms=1784270660435 mono_ms=5418301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11731 role=brain wall_ms=1784270660435 mono_ms=5418301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11732 role=brain wall_ms=1784270665477 mono_ms=5423343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11732 role=brain wall_ms=1784270665477 mono_ms=5423343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11733 role=brain wall_ms=1784270666009 mono_ms=5423875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11733 role=brain wall_ms=1784270666009 mono_ms=5423875 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666009 mono_ms=5423875 event=stream-sub-attach stream=5465 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666009 mono_ms=5423875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666013 mono_ms=5423879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11735 role=brain wall_ms=1784270666013 mono_ms=5423880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11735 role=brain wall_ms=1784270666013 mono_ms=5423880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11736 role=brain wall_ms=1784270666534 mono_ms=5424400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11737 role=brain wall_ms=1784270666534 mono_ms=5424400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11736 role=brain wall_ms=1784270666534 mono_ms=5424400 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11737 role=brain wall_ms=1784270666534 mono_ms=5424400 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666534 mono_ms=5424401 event=stream-sub-attach stream=5466 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666535 mono_ms=5424401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain wall_ms=1784270666535 mono_ms=5424402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666536 mono_ms=5424402 event=stream-sub-attach stream=5467 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666548 mono_ms=5424414 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11741 role=brain wall_ms=1784270666548 mono_ms=5424414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 27999-28303 of 353. Use :28304 to continue]"}],"details":{"truncation":{"content":"CONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612493 mono_ms=5370360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612494 mono_ms=5370360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain wall_ms=1784270612495 mono_ms=5370361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612495 mono_ms=5370361 event=stream-sub-attach stream=5409 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612497 mono_ms=5370363 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11617 role=brain wall_ms=1784270612912 mono_ms=5370778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11617 role=brain wall_ms=1784270612912 mono_ms=5370779 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain wall_ms=1784270612914 mono_ms=5370780 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain stream-subscriber stream=5410 wall_ms=1784270612914 mono_ms=5370780 event=stream-sub-attach stream=5410 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain stream-subscriber stream=5410 wall_ms=1784270613014 mono_ms=5370880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11619 role=brain wall_ms=1784270613014 mono_ms=5370880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11619 role=brain wall_ms=1784270613014 mono_ms=5370880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11620 role=brain wall_ms=1784270615058 mono_ms=5372924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11620 role=brain wall_ms=1784270615058 mono_ms=5372924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11621 role=brain wall_ms=1784270620103 mono_ms=5377969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11621 role=brain wall_ms=1784270620103 mono_ms=5377969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11622 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11623 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11624 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11622 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11624 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11623 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620546 mono_ms=5378413 event=stream-sub-attach stream=5413 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620546 mono_ms=5378413 event=stream-sub-attach stream=5411 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620547 mono_ms=5378413 event=stream-sub-attach stream=5412 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620550 mono_ms=5378417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11628 role=brain wall_ms=1784270620551 mono_ms=5378417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11628 role=brain wall_ms=1784270620551 mono_ms=5378417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620557 mono_ms=5378423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11629 role=brain wall_ms=1784270620557 mono_ms=5378423 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11629 role=brain wall_ms=1784270620557 mono_ms=5378424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620559 mono_ms=5378425 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11630 role=brain wall_ms=1784270620559 mono_ms=5378425 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11630 role=brain wall_ms=1784270620559 mono_ms=5378425 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11631 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11632 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11633 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11631 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11632 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11633 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622123 mono_ms=5379989 event=stream-sub-attach stream=5416 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain wall_ms=1784270622124 mono_ms=5379991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain stream-subscriber stream=5417 wall_ms=1784270622124 mono_ms=5379991 event=stream-sub-attach stream=5417 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622129 mono_ms=5379995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11637 role=brain wall_ms=1784270622129 mono_ms=5379995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11637 role=brain wall_ms=1784270622129 mono_ms=5379995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain stream-subscriber stream=5417 wall_ms=1784270622137 mono_ms=5380003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11638 role=brain wall_ms=1784270622137 mono_ms=5380003 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11638 role=brain wall_ms=1784270622137 mono_ms=5380003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain wall_ms=1784270622139 mono_ms=5380006 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain stream-subscriber stream=5415 wall_ms=1784270622139 mono_ms=5380006 event=stream-sub-attach stream=5415 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain stream-subscriber stream=5415 wall_ms=1784270622146 mono_ms=5380012 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11639 role=brain wall_ms=1784270622146 mono_ms=5380012 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11639 role=brain wall_ms=1784270622146 mono_ms=5380012 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11640 role=brain wall_ms=1784270622227 mono_ms=5380094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11640 role=brain wall_ms=1784270622228 mono_ms=5380094 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622228 mono_ms=5380094 event=stream-sub-attach stream=5414 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622228 mono_ms=5380094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622232 mono_ms=5380098 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11642 role=brain wall_ms=1784270622232 mono_ms=5380098 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11642 role=brain wall_ms=1784270622232 mono_ms=5380098 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11643 role=brain wall_ms=1784270622958 mono_ms=5380825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11643 role=brain wall_ms=1784270622958 mono_ms=5380825 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain wall_ms=1784270622960 mono_ms=5380826 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain stream-subscriber stream=5418 wall_ms=1784270622960 mono_ms=5380826 event=stream-sub-attach stream=5418 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain stream-subscriber stream=5418 wall_ms=1784270622972 mono_ms=5380838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11645 role=brain wall_ms=1784270622972 mono_ms=5380838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11645 role=brain wall_ms=1784270622972 mono_ms=5380838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11646 role=brain wall_ms=1784270623063 mono_ms=5380930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11647 role=brain wall_ms=1784270623063 mono_ms=5380930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11646 role=brain wall_ms=1784270623063 mono_ms=5380930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11647 role=brain wall_ms=1784270623063 mono_ms=5380930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain wall_ms=1784270623065 mono_ms=5380931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain stream-subscriber stream=5419 wall_ms=1784270623065 mono_ms=5380931 event=stream-sub-attach stream=5419 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain stream-subscriber stream=5419 wall_ms=1784270623067 mono_ms=5380933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11650 role=brain wall_ms=1784270623067 mono_ms=5380933 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11650 role=brain wall_ms=1784270623067 mono_ms=5380933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain wall_ms=1784270623069 mono_ms=5380935 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain stream-subscriber stream=5420 wall_ms=1784270623069 mono_ms=5380935 event=stream-sub-attach stream=5420 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain stream-subscriber stream=5420 wall_ms=1784270623075 mono_ms=5380941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11651 role=brain wall_ms=1784270623075 mono_ms=5380941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11651 role=brain wall_ms=1784270623075 mono_ms=5380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11652 role=brain wall_ms=1784270625145 mono_ms=5383011 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11652 role=brain wall_ms=1784270625145 mono_ms=5383011 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11653 role=brain wall_ms=1784270627554 mono_ms=5385420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11653 role=brain wall_ms=1784270627554 mono_ms=5385421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain wall_ms=1784270627555 mono_ms=5385422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain stream-subscriber stream=5426 wall_ms=1784270627556 mono_ms=5385422 event=stream-sub-attach stream=5426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain stream-subscriber stream=5426 wall_ms=1784270627558 mono_ms=5385424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11655 role=brain wall_ms=1784270627558 mono_ms=5385424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11655 role=brain wall_ms=1784270627558 mono_ms=5385424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11656 role=brain wall_ms=1784270627972 mono_ms=5385838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11657 role=brain wall_ms=1784270627972 mono_ms=5385838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11656 role=brain wall_ms=1784270627972 mono_ms=5385838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11657 role=brain wall_ms=1784270627972 mono_ms=5385838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627972 mono_ms=5385839 event=stream-sub-attach stream=5428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627972 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627973 mono_ms=5385839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11660 role=brain wall_ms=1784270627973 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11660 role=brain wall_ms=1784270627973 mono_ms=5385839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain wall_ms=1784270627973 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain stream-subscriber stream=5427 wall_ms=1784270627973 mono_ms=5385839 event=stream-sub-attach stream=5427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain stream-subscriber stream=5427 wall_ms=1784270628031 mono_ms=5385897 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11661 role=brain wall_ms=1784270628031 mono_ms=5385898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11661 role=brain wall_ms=1784270628031 mono_ms=5385898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11662 role=brain wall_ms=1784270628181 mono_ms=5386047 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11662 role=brain wall_ms=1784270628181 mono_ms=5386047 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628181 mono_ms=5386048 event=stream-sub-attach stream=5429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628181 mono_ms=5386048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628182 mono_ms=5386048 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11664 role=brain wall_ms=1784270628182 mono_ms=5386048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11664 role=brain wall_ms=1784270628182 mono_ms=5386048 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11665 role=brain wall_ms=1784270628390 mono_ms=5386256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11665 role=brain wall_ms=1784270628390 mono_ms=5386256 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386256 event=stream-sub-attach stream=5430 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11667 role=brain wall_ms=1784270628390 mono_ms=5386257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11667 role=brain wall_ms=1784270628391 mono_ms=5386257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11668 role=brain wall_ms=1784270628808 mono_ms=5386674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11668 role=brain wall_ms=1784270628808 mono_ms=5386674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628808 mono_ms=5386674 event=stream-sub-attach stream=5431 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628808 mono_ms=5386674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628814 mono_ms=5386680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11670 role=brain wall_ms=1784270628814 mono_ms=5386680 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11670 role=brain wall_ms=1784270628814 mono_ms=5386680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11671 role=brain wall_ms=1784270630186 mono_ms=5388052 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11671 role=brain wall_ms=1784270630186 mono_ms=5388052 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270630842 mono_ms=5388708 event=stream-sub-attach stream=5432 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270631871 mono_ms=5389737 event=stream-sub-attach stream=5433 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270633639 mono_ms=5391506 event=stream-sub-attach stream=5434 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270633894 mono_ms=5391760 event=stream-sub-attach stream=5435 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11672 role=brain wall_ms=1784270635228 mono_ms=5393094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11672 role=brain wall_ms=1784270635228 mono_ms=5393094 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270635290 mono_ms=5393156 event=stream-sub-attach stream=5436 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11673 role=brain wall_ms=1784270635705 mono_ms=5393571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11673 role=brain wall_ms=1784270635705 mono_ms=5393571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635705 mono_ms=5393571 event=stream-sub-attach stream=5437 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635705 mono_ms=5393571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635709 mono_ms=5393575 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11675 role=brain wall_ms=1784270635709 mono_ms=5393576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11675 role=brain wall_ms=1784270635709 mono_ms=5393576 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11676 role=brain wall_ms=1784270637165 mono_ms=5395031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11677 role=brain wall_ms=1784270637165 mono_ms=5395031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11676 role=brain wall_ms=1784270637165 mono_ms=5395032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11677 role=brain wall_ms=1784270637165 mono_ms=5395032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain wall_ms=1784270637167 mono_ms=5395033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain stream-subscriber stream=5438 wall_ms=1784270637167 mono_ms=5395033 event=stream-sub-attach stream=5438 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain stream-subscriber stream=5438 wall_ms=1784270637171 mono_ms=5395037 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11680 role=brain wall_ms=1784270637171 mono_ms=5395038 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11680 role=brain wall_ms=1784270637171 mono_ms=5395038 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain wall_ms=1784270637178 mono_ms=5395044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain stream-subscriber stream=5439 wall_ms=1784270637178 mono_ms=5395044 event=stream-sub-attach stream=5439 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain stream-subscriber stream=5439 wall_ms=1784270637180 mono_ms=5395046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11681 role=brain wall_ms=1784270637180 mono_ms=5395046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11681 role=brain wall_ms=1784270637180 mono_ms=5395046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11683 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11682 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11684 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11682 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11683 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11684 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain wall_ms=1784270638210 mono_ms=5396076 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain stream-subscriber stream=5440 wall_ms=1784270638210 mono_ms=5396076 event=stream-sub-attach stream=5440 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain wall_ms=1784270638216 mono_ms=5396082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain stream-subscriber stream=5442 wall_ms=1784270638216 mono_ms=5396082 event=stream-sub-attach stream=5442 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain wall_ms=1784270638216 mono_ms=5396082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain stream-subscriber stream=5441 wall_ms=1784270638216 mono_ms=5396082 event=stream-sub-attach stream=5441 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain stream-subscriber stream=5440 wall_ms=1784270638219 mono_ms=5396086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11688 role=brain wall_ms=1784270638219 mono_ms=5396086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11688 role=brain wall_ms=1784270638219 mono_ms=5396086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain stream-subscriber stream=5442 wall_ms=1784270638222 mono_ms=5396088 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11689 role=brain wall_ms=1784270638222 mono_ms=5396088 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11689 role=brain wall_ms=1784270638222 mono_ms=5396088 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain stream-subscriber stream=5441 wall_ms=1784270638233 mono_ms=5396099 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11690 role=brain wall_ms=1784270638233 mono_ms=5396100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11690 role=brain wall_ms=1784270638233 mono_ms=5396100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11691 role=brain wall_ms=1784270640270 mono_ms=5398136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11691 role=brain wall_ms=1784270640270 mono_ms=5398136 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=59475688 id=1802ffd7053ac46ea93d8d235f15bbe1d80549b560ad1f0146151f58c6742e72 addr=EndpointAddr { id: PublicKey(1802ffd7053ac46ea93d8d235f15bbe1d80549b560ad1f0146151f58c6742e72), addrs: {Ip(100.68.35.65:64246), Ip(192.168.1.81:64246)} }\nPAIR_MEET_UP:SPT_DEV step=59475688 id=687fea508fc25617e560d2cbc3fc9f45e6879f487d06d1dbf16d4d91146862ee addr=EndpointAddr { id: PublicKey(687fea508fc25617e560d2cbc3fc9f45e6879f487d06d1dbf16d4d91146862ee), addrs: {Ip(100.68.35.65:64245), Ip(192.168.1.81:64245)} }\nCONN_LIFECYCLE: conn=11692 role=brain wall_ms=1784270642699 mono_ms=5400565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11692 role=brain wall_ms=1784270642699 mono_ms=5400565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain wall_ms=1784270642700 mono_ms=5400566 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain stream-subscriber stream=5443 wall_ms=1784270642700 mono_ms=5400566 event=stream-sub-attach stream=5443 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain stream-subscriber stream=5443 wall_ms=1784270642702 mono_ms=5400569 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11694 role=brain wall_ms=1784270642703 mono_ms=5400569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11694 role=brain wall_ms=1784270642703 mono_ms=5400569 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11695 role=brain wall_ms=1784270643013 mono_ms=5400880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11695 role=brain wall_ms=1784270643013 mono_ms=5400880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain wall_ms=1784270643014 mono_ms=5400881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain stream-subscriber stream=5444 wall_ms=1784270643015 mono_ms=5400881 event=stream-sub-attach stream=5444 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain stream-subscriber stream=5444 wall_ms=1784270643215 mono_ms=5401081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11697 role=brain wall_ms=1784270643215 mono_ms=5401082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11697 role=brain wall_ms=1784270643215 mono_ms=5401082 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11698 role=brain wall_ms=1784270645310 mono_ms=5403176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11698 role=brain wall_ms=1784270645310 mono_ms=5403176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11699 role=brain wall_ms=1784270650351 mono_ms=5408217 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11699 role=brain wall_ms=1784270650351 mono_ms=5408217 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11700 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11701 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11702 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11700 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11701 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11702 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5445 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5447 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5446 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11706 role=brain wall_ms=1784270655392 mono_ms=5413258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11706 role=brain wall_ms=1784270655392 mono_ms=5413258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270658067 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11707 role=brain wall_ms=1784270658068 mono_ms=5415934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11707 role=brain wall_ms=1784270658068 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11708 role=brain wall_ms=1784270658068 mono_ms=5415934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11708 role=brain wall_ms=1784270658068 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain wall_ms=1784270658070 mono_ms=5415936 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain stream-subscriber stream=5449 wall_ms=1784270658070 mono_ms=5415936 event=stream-sub-attach stream=5449 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270658075 mono_ms=5415941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11710 role=brain wall_ms=1784270658075 mono_ms=5415941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11710 role=brain wall_ms=1784270658075 mono_ms=5415941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270658077 mono_ms=5415943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11711 role=brain wall_ms=1784270658077 mono_ms=5415943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11711 role=brain wall_ms=1784270658077 mono_ms=5415943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain stream-subscriber stream=5449 wall_ms=1784270658090 mono_ms=5415956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11712 role=brain wall_ms=1784270658090 mono_ms=5415956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11712 role=brain wall_ms=1784270658090 mono_ms=5415957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11713 role=brain wall_ms=1784270658173 mono_ms=5416039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11714 role=brain wall_ms=1784270658173 mono_ms=5416039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11713 role=brain wall_ms=1784270658173 mono_ms=5416039 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11714 role=brain wall_ms=1784270658173 mono_ms=5416039 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=stream-sub-attach stream=5448 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11717 role=brain wall_ms=1784270658174 mono_ms=5416040 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11717 role=brain wall_ms=1784270658174 mono_ms=5416040 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain wall_ms=1784270658174 mono_ms=5416041 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain stream-subscriber stream=5450 wall_ms=1784270658174 mono_ms=5416041 event=stream-sub-attach stream=5450 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain stream-subscriber stream=5450 wall_ms=1784270658177 mono_ms=5416043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11718 role=brain wall_ms=1784270658177 mono_ms=5416043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11718 role=brain wall_ms=1784270658177 mono_ms=5416043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11719 role=brain wall_ms=1784270658277 mono_ms=5416144 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11719 role=brain wall_ms=1784270658277 mono_ms=5416144 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain wall_ms=1784270658279 mono_ms=5416145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain stream-subscriber stream=5461 wall_ms=1784270658279 mono_ms=5416145 event=stream-sub-attach stream=5461 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11721 role=brain wall_ms=1784270658382 mono_ms=5416248 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11721 role=brain wall_ms=1784270658382 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=stream-sub-attach stream=5462 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11723 role=brain wall_ms=1784270658383 mono_ms=5416249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11723 role=brain wall_ms=1784270658383 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain stream-subscriber stream=5461 wall_ms=1784270658666 mono_ms=5416532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11724 role=brain wall_ms=1784270658666 mono_ms=5416533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11724 role=brain wall_ms=1784270658666 mono_ms=5416533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11725 role=brain wall_ms=1784270658904 mono_ms=5416771 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11725 role=brain wall_ms=1784270658904 mono_ms=5416771 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658905 mono_ms=5416771 event=stream-sub-attach stream=5463 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658905 mono_ms=5416771 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658911 mono_ms=5416777 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11727 role=brain wall_ms=1784270658911 mono_ms=5416777 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11727 role=brain wall_ms=1784270658911 mono_ms=5416777 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11728 role=brain wall_ms=1784270659009 mono_ms=5416875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11728 role=brain wall_ms=1784270659009 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=stream-sub-attach stream=5464 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11730 role=brain wall_ms=1784270659010 mono_ms=5416876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11730 role=brain wall_ms=1784270659010 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11731 role=brain wall_ms=1784270660435 mono_ms=5418301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11731 role=brain wall_ms=1784270660435 mono_ms=5418301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11732 role=brain wall_ms=1784270665477 mono_ms=5423343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11732 role=brain wall_ms=1784270665477 mono_ms=5423343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11733 role=brain wall_ms=1784270666009 mono_ms=5423875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11733 role=brain wall_ms=1784270666009 mono_ms=5423875 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666009 mono_ms=5423875 event=stream-sub-attach stream=5465 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666009 mono_ms=5423875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666013 mono_ms=5423879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11735 role=brain wall_ms=1784270666013 mono_ms=5423880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11735 role=brain wall_ms=1784270666013 mono_ms=5423880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11736 role=brain wall_ms=1784270666534 mono_ms=5424400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11737 role=brain wall_ms=1784270666534 mono_ms=5424400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11736 role=brain wall_ms=1784270666534 mono_ms=5424400 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11737 role=brain wall_ms=1784270666534 mono_ms=5424400 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666534 mono_ms=5424401 event=stream-sub-attach stream=5466 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666535 mono_ms=5424401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain wall_ms=1784270666535 mono_ms=5424402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666536 mono_ms=5424402 event=stream-sub-attach stream=5467 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666548 mono_ms=5424414 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11741 role=brain wall_ms=1784270666548 mono_ms=5424414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"lines","totalLines":353,"totalBytes":47779,"outputLines":305,"outputBytes":47779,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"CONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612493 mono_ms=5370360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612494 mono_ms=5370360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain wall_ms=1784270612495 mono_ms=5370361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612495 mono_ms=5370361 event=stream-sub-attach stream=5409 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612497 mono_ms=5370363 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11617 role=brain wall_ms=1784270612912 mono_ms=5370778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11617 role=brain wall_ms=1784270612912 mono_ms=5370779 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain wall_ms=1784270612914 mono_ms=5370780 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain stream-subscriber stream=5410 wall_ms=1784270612914 mono_ms=5370780 event=stream-sub-attach stream=5410 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11618 role=brain stream-subscriber stream=5410 wall_ms=1784270613014 mono_ms=5370880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11619 role=brain wall_ms=1784270613014 mono_ms=5370880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11619 role=brain wall_ms=1784270613014 mono_ms=5370880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11620 role=brain wall_ms=1784270615058 mono_ms=5372924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11620 role=brain wall_ms=1784270615058 mono_ms=5372924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11621 role=brain wall_ms=1784270620103 mono_ms=5377969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11621 role=brain wall_ms=1784270620103 mono_ms=5377969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11622 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11623 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11624 role=brain wall_ms=1784270620546 mono_ms=5378412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11622 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11624 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11623 role=brain wall_ms=1784270620546 mono_ms=5378412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620546 mono_ms=5378413 event=stream-sub-attach stream=5413 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620546 mono_ms=5378413 event=stream-sub-attach stream=5411 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620547 mono_ms=5378413 event=stream-sub-attach stream=5412 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620547 mono_ms=5378413 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11625 role=brain stream-subscriber stream=5413 wall_ms=1784270620550 mono_ms=5378417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11628 role=brain wall_ms=1784270620551 mono_ms=5378417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11628 role=brain wall_ms=1784270620551 mono_ms=5378417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11627 role=brain stream-subscriber stream=5412 wall_ms=1784270620557 mono_ms=5378423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11629 role=brain wall_ms=1784270620557 mono_ms=5378423 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11629 role=brain wall_ms=1784270620557 mono_ms=5378424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11626 role=brain stream-subscriber stream=5411 wall_ms=1784270620559 mono_ms=5378425 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11630 role=brain wall_ms=1784270620559 mono_ms=5378425 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11630 role=brain wall_ms=1784270620559 mono_ms=5378425 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11631 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11632 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11633 role=brain wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11631 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11632 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11633 role=brain wall_ms=1784270622123 mono_ms=5379989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622123 mono_ms=5379989 event=stream-sub-attach stream=5416 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622123 mono_ms=5379989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain wall_ms=1784270622124 mono_ms=5379991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain stream-subscriber stream=5417 wall_ms=1784270622124 mono_ms=5379991 event=stream-sub-attach stream=5417 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11635 role=brain stream-subscriber stream=5416 wall_ms=1784270622129 mono_ms=5379995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11637 role=brain wall_ms=1784270622129 mono_ms=5379995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11637 role=brain wall_ms=1784270622129 mono_ms=5379995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11634 role=brain stream-subscriber stream=5417 wall_ms=1784270622137 mono_ms=5380003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11638 role=brain wall_ms=1784270622137 mono_ms=5380003 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11638 role=brain wall_ms=1784270622137 mono_ms=5380003 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain wall_ms=1784270622139 mono_ms=5380006 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain stream-subscriber stream=5415 wall_ms=1784270622139 mono_ms=5380006 event=stream-sub-attach stream=5415 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11636 role=brain stream-subscriber stream=5415 wall_ms=1784270622146 mono_ms=5380012 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11639 role=brain wall_ms=1784270622146 mono_ms=5380012 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11639 role=brain wall_ms=1784270622146 mono_ms=5380012 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11640 role=brain wall_ms=1784270622227 mono_ms=5380094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11640 role=brain wall_ms=1784270622228 mono_ms=5380094 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622228 mono_ms=5380094 event=stream-sub-attach stream=5414 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622228 mono_ms=5380094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11641 role=brain stream-subscriber stream=5414 wall_ms=1784270622232 mono_ms=5380098 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11642 role=brain wall_ms=1784270622232 mono_ms=5380098 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11642 role=brain wall_ms=1784270622232 mono_ms=5380098 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11643 role=brain wall_ms=1784270622958 mono_ms=5380825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11643 role=brain wall_ms=1784270622958 mono_ms=5380825 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain wall_ms=1784270622960 mono_ms=5380826 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain stream-subscriber stream=5418 wall_ms=1784270622960 mono_ms=5380826 event=stream-sub-attach stream=5418 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11644 role=brain stream-subscriber stream=5418 wall_ms=1784270622972 mono_ms=5380838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11645 role=brain wall_ms=1784270622972 mono_ms=5380838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11645 role=brain wall_ms=1784270622972 mono_ms=5380838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11646 role=brain wall_ms=1784270623063 mono_ms=5380930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11647 role=brain wall_ms=1784270623063 mono_ms=5380930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11646 role=brain wall_ms=1784270623063 mono_ms=5380930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11647 role=brain wall_ms=1784270623063 mono_ms=5380930 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain wall_ms=1784270623065 mono_ms=5380931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain stream-subscriber stream=5419 wall_ms=1784270623065 mono_ms=5380931 event=stream-sub-attach stream=5419 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11649 role=brain stream-subscriber stream=5419 wall_ms=1784270623067 mono_ms=5380933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11650 role=brain wall_ms=1784270623067 mono_ms=5380933 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11650 role=brain wall_ms=1784270623067 mono_ms=5380933 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain wall_ms=1784270623069 mono_ms=5380935 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain stream-subscriber stream=5420 wall_ms=1784270623069 mono_ms=5380935 event=stream-sub-attach stream=5420 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11648 role=brain stream-subscriber stream=5420 wall_ms=1784270623075 mono_ms=5380941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11651 role=brain wall_ms=1784270623075 mono_ms=5380941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11651 role=brain wall_ms=1784270623075 mono_ms=5380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11652 role=brain wall_ms=1784270625145 mono_ms=5383011 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11652 role=brain wall_ms=1784270625145 mono_ms=5383011 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11653 role=brain wall_ms=1784270627554 mono_ms=5385420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11653 role=brain wall_ms=1784270627554 mono_ms=5385421 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain wall_ms=1784270627555 mono_ms=5385422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain stream-subscriber stream=5426 wall_ms=1784270627556 mono_ms=5385422 event=stream-sub-attach stream=5426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11654 role=brain stream-subscriber stream=5426 wall_ms=1784270627558 mono_ms=5385424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11655 role=brain wall_ms=1784270627558 mono_ms=5385424 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11655 role=brain wall_ms=1784270627558 mono_ms=5385424 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11656 role=brain wall_ms=1784270627972 mono_ms=5385838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11657 role=brain wall_ms=1784270627972 mono_ms=5385838 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11656 role=brain wall_ms=1784270627972 mono_ms=5385838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11657 role=brain wall_ms=1784270627972 mono_ms=5385838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627972 mono_ms=5385839 event=stream-sub-attach stream=5428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627972 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11658 role=brain stream-subscriber stream=5428 wall_ms=1784270627973 mono_ms=5385839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11660 role=brain wall_ms=1784270627973 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11660 role=brain wall_ms=1784270627973 mono_ms=5385839 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain wall_ms=1784270627973 mono_ms=5385839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain stream-subscriber stream=5427 wall_ms=1784270627973 mono_ms=5385839 event=stream-sub-attach stream=5427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11659 role=brain stream-subscriber stream=5427 wall_ms=1784270628031 mono_ms=5385897 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11661 role=brain wall_ms=1784270628031 mono_ms=5385898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11661 role=brain wall_ms=1784270628031 mono_ms=5385898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11662 role=brain wall_ms=1784270628181 mono_ms=5386047 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11662 role=brain wall_ms=1784270628181 mono_ms=5386047 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628181 mono_ms=5386048 event=stream-sub-attach stream=5429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628181 mono_ms=5386048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11663 role=brain stream-subscriber stream=5429 wall_ms=1784270628182 mono_ms=5386048 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11664 role=brain wall_ms=1784270628182 mono_ms=5386048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11664 role=brain wall_ms=1784270628182 mono_ms=5386048 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11665 role=brain wall_ms=1784270628390 mono_ms=5386256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11665 role=brain wall_ms=1784270628390 mono_ms=5386256 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386256 event=stream-sub-attach stream=5430 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11666 role=brain stream-subscriber stream=5430 wall_ms=1784270628390 mono_ms=5386257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11667 role=brain wall_ms=1784270628390 mono_ms=5386257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11667 role=brain wall_ms=1784270628391 mono_ms=5386257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11668 role=brain wall_ms=1784270628808 mono_ms=5386674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11668 role=brain wall_ms=1784270628808 mono_ms=5386674 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628808 mono_ms=5386674 event=stream-sub-attach stream=5431 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628808 mono_ms=5386674 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11669 role=brain stream-subscriber stream=5431 wall_ms=1784270628814 mono_ms=5386680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11670 role=brain wall_ms=1784270628814 mono_ms=5386680 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11670 role=brain wall_ms=1784270628814 mono_ms=5386680 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11671 role=brain wall_ms=1784270630186 mono_ms=5388052 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11671 role=brain wall_ms=1784270630186 mono_ms=5388052 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270630842 mono_ms=5388708 event=stream-sub-attach stream=5432 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270631871 mono_ms=5389737 event=stream-sub-attach stream=5433 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270633639 mono_ms=5391506 event=stream-sub-attach stream=5434 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270633894 mono_ms=5391760 event=stream-sub-attach stream=5435 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11672 role=brain wall_ms=1784270635228 mono_ms=5393094 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11672 role=brain wall_ms=1784270635228 mono_ms=5393094 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784270635290 mono_ms=5393156 event=stream-sub-attach stream=5436 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11673 role=brain wall_ms=1784270635705 mono_ms=5393571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11673 role=brain wall_ms=1784270635705 mono_ms=5393571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635705 mono_ms=5393571 event=stream-sub-attach stream=5437 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635705 mono_ms=5393571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11674 role=brain stream-subscriber stream=5437 wall_ms=1784270635709 mono_ms=5393575 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11675 role=brain wall_ms=1784270635709 mono_ms=5393576 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11675 role=brain wall_ms=1784270635709 mono_ms=5393576 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11676 role=brain wall_ms=1784270637165 mono_ms=5395031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11677 role=brain wall_ms=1784270637165 mono_ms=5395031 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11676 role=brain wall_ms=1784270637165 mono_ms=5395032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11677 role=brain wall_ms=1784270637165 mono_ms=5395032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain wall_ms=1784270637167 mono_ms=5395033 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain stream-subscriber stream=5438 wall_ms=1784270637167 mono_ms=5395033 event=stream-sub-attach stream=5438 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11678 role=brain stream-subscriber stream=5438 wall_ms=1784270637171 mono_ms=5395037 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11680 role=brain wall_ms=1784270637171 mono_ms=5395038 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11680 role=brain wall_ms=1784270637171 mono_ms=5395038 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain wall_ms=1784270637178 mono_ms=5395044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain stream-subscriber stream=5439 wall_ms=1784270637178 mono_ms=5395044 event=stream-sub-attach stream=5439 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11679 role=brain stream-subscriber stream=5439 wall_ms=1784270637180 mono_ms=5395046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11681 role=brain wall_ms=1784270637180 mono_ms=5395046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11681 role=brain wall_ms=1784270637180 mono_ms=5395046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11683 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11682 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11684 role=brain wall_ms=1784270638208 mono_ms=5396074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11682 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11683 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11684 role=brain wall_ms=1784270638208 mono_ms=5396074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain wall_ms=1784270638210 mono_ms=5396076 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain stream-subscriber stream=5440 wall_ms=1784270638210 mono_ms=5396076 event=stream-sub-attach stream=5440 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain wall_ms=1784270638216 mono_ms=5396082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain stream-subscriber stream=5442 wall_ms=1784270638216 mono_ms=5396082 event=stream-sub-attach stream=5442 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain wall_ms=1784270638216 mono_ms=5396082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain stream-subscriber stream=5441 wall_ms=1784270638216 mono_ms=5396082 event=stream-sub-attach stream=5441 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11685 role=brain stream-subscriber stream=5440 wall_ms=1784270638219 mono_ms=5396086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11688 role=brain wall_ms=1784270638219 mono_ms=5396086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11688 role=brain wall_ms=1784270638219 mono_ms=5396086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11686 role=brain stream-subscriber stream=5442 wall_ms=1784270638222 mono_ms=5396088 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11689 role=brain wall_ms=1784270638222 mono_ms=5396088 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11689 role=brain wall_ms=1784270638222 mono_ms=5396088 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11687 role=brain stream-subscriber stream=5441 wall_ms=1784270638233 mono_ms=5396099 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11690 role=brain wall_ms=1784270638233 mono_ms=5396100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11690 role=brain wall_ms=1784270638233 mono_ms=5396100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11691 role=brain wall_ms=1784270640270 mono_ms=5398136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11691 role=brain wall_ms=1784270640270 mono_ms=5398136 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=59475688 id=1802ffd7053ac46ea93d8d235f15bbe1d80549b560ad1f0146151f58c6742e72 addr=EndpointAddr { id: PublicKey(1802ffd7053ac46ea93d8d235f15bbe1d80549b560ad1f0146151f58c6742e72), addrs: {Ip(100.68.35.65:64246), Ip(192.168.1.81:64246)} }\nPAIR_MEET_UP:SPT_DEV step=59475688 id=687fea508fc25617e560d2cbc3fc9f45e6879f487d06d1dbf16d4d91146862ee addr=EndpointAddr { id: PublicKey(687fea508fc25617e560d2cbc3fc9f45e6879f487d06d1dbf16d4d91146862ee), addrs: {Ip(100.68.35.65:64245), Ip(192.168.1.81:64245)} }\nCONN_LIFECYCLE: conn=11692 role=brain wall_ms=1784270642699 mono_ms=5400565 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11692 role=brain wall_ms=1784270642699 mono_ms=5400565 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain wall_ms=1784270642700 mono_ms=5400566 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain stream-subscriber stream=5443 wall_ms=1784270642700 mono_ms=5400566 event=stream-sub-attach stream=5443 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11693 role=brain stream-subscriber stream=5443 wall_ms=1784270642702 mono_ms=5400569 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11694 role=brain wall_ms=1784270642703 mono_ms=5400569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11694 role=brain wall_ms=1784270642703 mono_ms=5400569 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11695 role=brain wall_ms=1784270643013 mono_ms=5400880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11695 role=brain wall_ms=1784270643013 mono_ms=5400880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain wall_ms=1784270643014 mono_ms=5400881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain stream-subscriber stream=5444 wall_ms=1784270643015 mono_ms=5400881 event=stream-sub-attach stream=5444 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11696 role=brain stream-subscriber stream=5444 wall_ms=1784270643215 mono_ms=5401081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11697 role=brain wall_ms=1784270643215 mono_ms=5401082 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11697 role=brain wall_ms=1784270643215 mono_ms=5401082 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11698 role=brain wall_ms=1784270645310 mono_ms=5403176 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11698 role=brain wall_ms=1784270645310 mono_ms=5403176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11699 role=brain wall_ms=1784270650351 mono_ms=5408217 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11699 role=brain wall_ms=1784270650351 mono_ms=5408217 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11700 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11701 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11702 role=brain wall_ms=1784270651899 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11700 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11701 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11702 role=brain wall_ms=1784270651899 mono_ms=5409766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5445 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5447 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270651900 mono_ms=5409766 event=stream-sub-attach stream=5446 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270651900 mono_ms=5409766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11706 role=brain wall_ms=1784270655392 mono_ms=5413258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11706 role=brain wall_ms=1784270655392 mono_ms=5413258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11704 role=brain stream-subscriber stream=5447 wall_ms=1784270658067 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11707 role=brain wall_ms=1784270658068 mono_ms=5415934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11707 role=brain wall_ms=1784270658068 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11708 role=brain wall_ms=1784270658068 mono_ms=5415934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11708 role=brain wall_ms=1784270658068 mono_ms=5415934 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain wall_ms=1784270658070 mono_ms=5415936 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain stream-subscriber stream=5449 wall_ms=1784270658070 mono_ms=5415936 event=stream-sub-attach stream=5449 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11705 role=brain stream-subscriber stream=5446 wall_ms=1784270658075 mono_ms=5415941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11710 role=brain wall_ms=1784270658075 mono_ms=5415941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11710 role=brain wall_ms=1784270658075 mono_ms=5415941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11703 role=brain stream-subscriber stream=5445 wall_ms=1784270658077 mono_ms=5415943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11711 role=brain wall_ms=1784270658077 mono_ms=5415943 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11711 role=brain wall_ms=1784270658077 mono_ms=5415943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11709 role=brain stream-subscriber stream=5449 wall_ms=1784270658090 mono_ms=5415956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11712 role=brain wall_ms=1784270658090 mono_ms=5415956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11712 role=brain wall_ms=1784270658090 mono_ms=5415957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11713 role=brain wall_ms=1784270658173 mono_ms=5416039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11714 role=brain wall_ms=1784270658173 mono_ms=5416039 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11713 role=brain wall_ms=1784270658173 mono_ms=5416039 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11714 role=brain wall_ms=1784270658173 mono_ms=5416039 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=stream-sub-attach stream=5448 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11716 role=brain stream-subscriber stream=5448 wall_ms=1784270658174 mono_ms=5416040 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11717 role=brain wall_ms=1784270658174 mono_ms=5416040 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11717 role=brain wall_ms=1784270658174 mono_ms=5416040 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain wall_ms=1784270658174 mono_ms=5416041 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain stream-subscriber stream=5450 wall_ms=1784270658174 mono_ms=5416041 event=stream-sub-attach stream=5450 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11715 role=brain stream-subscriber stream=5450 wall_ms=1784270658177 mono_ms=5416043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11718 role=brain wall_ms=1784270658177 mono_ms=5416043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11718 role=brain wall_ms=1784270658177 mono_ms=5416043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11719 role=brain wall_ms=1784270658277 mono_ms=5416144 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11719 role=brain wall_ms=1784270658277 mono_ms=5416144 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain wall_ms=1784270658279 mono_ms=5416145 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain stream-subscriber stream=5461 wall_ms=1784270658279 mono_ms=5416145 event=stream-sub-attach stream=5461 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11721 role=brain wall_ms=1784270658382 mono_ms=5416248 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11721 role=brain wall_ms=1784270658382 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=stream-sub-attach stream=5462 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11722 role=brain stream-subscriber stream=5462 wall_ms=1784270658383 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11723 role=brain wall_ms=1784270658383 mono_ms=5416249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11723 role=brain wall_ms=1784270658383 mono_ms=5416249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11720 role=brain stream-subscriber stream=5461 wall_ms=1784270658666 mono_ms=5416532 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11724 role=brain wall_ms=1784270658666 mono_ms=5416533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11724 role=brain wall_ms=1784270658666 mono_ms=5416533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11725 role=brain wall_ms=1784270658904 mono_ms=5416771 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11725 role=brain wall_ms=1784270658904 mono_ms=5416771 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658905 mono_ms=5416771 event=stream-sub-attach stream=5463 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658905 mono_ms=5416771 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11726 role=brain stream-subscriber stream=5463 wall_ms=1784270658911 mono_ms=5416777 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11727 role=brain wall_ms=1784270658911 mono_ms=5416777 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11727 role=brain wall_ms=1784270658911 mono_ms=5416777 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11728 role=brain wall_ms=1784270659009 mono_ms=5416875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11728 role=brain wall_ms=1784270659009 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=stream-sub-attach stream=5464 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11729 role=brain stream-subscriber stream=5464 wall_ms=1784270659010 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11730 role=brain wall_ms=1784270659010 mono_ms=5416876 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11730 role=brain wall_ms=1784270659010 mono_ms=5416876 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11731 role=brain wall_ms=1784270660435 mono_ms=5418301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11731 role=brain wall_ms=1784270660435 mono_ms=5418301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11732 role=brain wall_ms=1784270665477 mono_ms=5423343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11732 role=brain wall_ms=1784270665477 mono_ms=5423343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11733 role=brain wall_ms=1784270666009 mono_ms=5423875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11733 role=brain wall_ms=1784270666009 mono_ms=5423875 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666009 mono_ms=5423875 event=stream-sub-attach stream=5465 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666009 mono_ms=5423875 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11734 role=brain stream-subscriber stream=5465 wall_ms=1784270666013 mono_ms=5423879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11735 role=brain wall_ms=1784270666013 mono_ms=5423880 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11735 role=brain wall_ms=1784270666013 mono_ms=5423880 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11736 role=brain wall_ms=1784270666534 mono_ms=5424400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11737 role=brain wall_ms=1784270666534 mono_ms=5424400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11736 role=brain wall_ms=1784270666534 mono_ms=5424400 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11737 role=brain wall_ms=1784270666534 mono_ms=5424400 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666534 mono_ms=5424401 event=stream-sub-attach stream=5466 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666535 mono_ms=5424401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain wall_ms=1784270666535 mono_ms=5424402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666536 mono_ms=5424402 event=stream-sub-attach stream=5467 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11738 role=brain stream-subscriber stream=5466 wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666548 mono_ms=5424414 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=11741 role=brain wall_ms=1784270666548 mono_ms=5424414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]","startLine":27999,"lineNumbers":[27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":353,"totalBytes":47779,"outputLines":305,"outputBytes":47779,"shownRange":{"start":27999,"end":28303},"nextOffset":28304}}},"isError":false,"timestamp":1784271994998}}
{"type":"message","id":"cb514f2e","parentId":"de0875ae","timestamp":"2026-07-17T07:06:35.002Z","message":{"role":"toolResult","toolCallId":"call_ITcAEu248TNZfcQOJmFOJeeD|fc_0fcf561150331aac016a59d47a44cc8190a34c53831d427006","toolName":"read","content":[{"type":"text","text":"CONN_LIFECYCLE: conn=13271 role=brain wall_ms=1784271317129 mono_ms=6074993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078438 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain wall_ms=1784271320575 mono_ms=6078440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320575 mono_ms=6078440 event=stream-sub-attach stream=6175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13275 role=brain wall_ms=1784271320784 mono_ms=6078648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13275 role=brain wall_ms=1784271320784 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320784 mono_ms=6078649 event=stream-sub-attach stream=6176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320784 mono_ms=6078649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320785 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13277 role=brain wall_ms=1784271320785 mono_ms=6078649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13277 role=brain wall_ms=1784271320785 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13278 role=brain wall_ms=1784271320994 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13278 role=brain wall_ms=1784271320994 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=stream-sub-attach stream=6177 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13280 role=brain wall_ms=1784271320995 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13280 role=brain wall_ms=1784271320995 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13281 role=brain wall_ms=1784271321206 mono_ms=6079070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13281 role=brain wall_ms=1784271321206 mono_ms=6079070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079070 event=stream-sub-attach stream=6178 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13283 role=brain wall_ms=1784271321206 mono_ms=6079071 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13283 role=brain wall_ms=1784271321206 mono_ms=6079071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13284 role=brain wall_ms=1784271322174 mono_ms=6080038 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13284 role=brain wall_ms=1784271322174 mono_ms=6080038 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13285 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13287 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13286 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13285 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13287 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13286 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain wall_ms=1784271323106 mono_ms=6080970 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain stream-subscriber stream=6180 wall_ms=1784271323106 mono_ms=6080970 event=stream-sub-attach stream=6180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain stream-subscriber stream=6180 wall_ms=1784271323108 mono_ms=6080972 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13291 role=brain wall_ms=1784271323108 mono_ms=6080973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13291 role=brain wall_ms=1784271323108 mono_ms=6080973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain wall_ms=1784271323120 mono_ms=6080984 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain wall_ms=1784271323120 mono_ms=6080984 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain stream-subscriber stream=6181 wall_ms=1784271323120 mono_ms=6080984 event=stream-sub-attach stream=6181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain stream-subscriber stream=6179 wall_ms=1784271323120 mono_ms=6080984 event=stream-sub-attach stream=6179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain stream-subscriber stream=6181 wall_ms=1784271323127 mono_ms=6080991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13292 role=brain wall_ms=1784271323127 mono_ms=6080991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13292 role=brain wall_ms=1784271323127 mono_ms=6080991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain stream-subscriber stream=6179 wall_ms=1784271323130 mono_ms=6080994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13293 role=brain wall_ms=1784271323130 mono_ms=6080994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13293 role=brain wall_ms=1784271323130 mono_ms=6080994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13294 role=brain wall_ms=1784271325317 mono_ms=6083181 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13294 role=brain wall_ms=1784271325317 mono_ms=6083181 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325317 mono_ms=6083181 event=stream-sub-attach stream=6182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325317 mono_ms=6083181 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325322 mono_ms=6083186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13296 role=brain wall_ms=1784271325322 mono_ms=6083186 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13296 role=brain wall_ms=1784271325322 mono_ms=6083186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13297 role=brain wall_ms=1784271325422 mono_ms=6083286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13297 role=brain wall_ms=1784271325422 mono_ms=6083286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083286 event=stream-sub-attach stream=6183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083287 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13299 role=brain wall_ms=1784271325423 mono_ms=6083287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13299 role=brain wall_ms=1784271325423 mono_ms=6083287 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13300 role=brain wall_ms=1784271325526 mono_ms=6083391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13300 role=brain wall_ms=1784271325527 mono_ms=6083391 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083391 event=stream-sub-attach stream=6184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13302 role=brain wall_ms=1784271325527 mono_ms=6083392 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13302 role=brain wall_ms=1784271325527 mono_ms=6083392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13303 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13304 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13305 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13303 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13304 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13305 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325740 mono_ms=6083604 event=stream-sub-attach stream=6185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325740 mono_ms=6083604 event=stream-sub-attach stream=6187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325740 mono_ms=6083605 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain wall_ms=1784271325741 mono_ms=6083606 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain stream-subscriber stream=6186 wall_ms=1784271325741 mono_ms=6083606 event=stream-sub-attach stream=6186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325746 mono_ms=6083611 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13309 role=brain wall_ms=1784271325746 mono_ms=6083611 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13309 role=brain wall_ms=1784271325747 mono_ms=6083611 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325751 mono_ms=6083615 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13310 role=brain wall_ms=1784271325751 mono_ms=6083615 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13310 role=brain wall_ms=1784271325751 mono_ms=6083616 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain stream-subscriber stream=6186 wall_ms=1784271325764 mono_ms=6083628 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13311 role=brain wall_ms=1784271325764 mono_ms=6083628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13311 role=brain wall_ms=1784271325764 mono_ms=6083629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13312 role=brain wall_ms=1784271325845 mono_ms=6083709 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13312 role=brain wall_ms=1784271325845 mono_ms=6083709 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain wall_ms=1784271325846 mono_ms=6083710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain stream-subscriber stream=6188 wall_ms=1784271325846 mono_ms=6083710 event=stream-sub-attach stream=6188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain stream-subscriber stream=6188 wall_ms=1784271325848 mono_ms=6083713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13314 role=brain wall_ms=1784271325848 mono_ms=6083713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13314 role=brain wall_ms=1784271325848 mono_ms=6083713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13315 role=brain wall_ms=1784271326055 mono_ms=6083919 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13315 role=brain wall_ms=1784271326055 mono_ms=6083919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain wall_ms=1784271326056 mono_ms=6083920 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain stream-subscriber stream=6189 wall_ms=1784271326056 mono_ms=6083920 event=stream-sub-attach stream=6189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain stream-subscriber stream=6189 wall_ms=1784271326083 mono_ms=6083947 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13317 role=brain wall_ms=1784271326083 mono_ms=6083948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13317 role=brain wall_ms=1784271326083 mono_ms=6083948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13318 role=brain wall_ms=1784271327218 mono_ms=6085083 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13318 role=brain wall_ms=1784271327218 mono_ms=6085083 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=59475711 id=ab4ce425789cdb94af2ad4eac560c1bef4bec5a2a27b3a98651c8b93d2357ef0 addr=EndpointAddr { id: PublicKey(ab4ce425789cdb94af2ad4eac560c1bef4bec5a2a27b3a98651c8b93d2357ef0), addrs: {Ip(100.68.35.65:61460), Ip(192.168.1.81:61460)} }\nPAIR_MEET_UP:BIGNET step=59475711 id=baa1ef0727290a214689bebaa1d8c781db6122db0a1ee00f357d44699770cc78 addr=EndpointAddr { id: PublicKey(baa1ef0727290a214689bebaa1d8c781db6122db0a1ee00f357d44699770cc78), addrs: {Ip(100.68.35.65:61466), Ip(192.168.1.81:61466)} }\nCONN_LIFECYCLE: conn=13319 role=brain wall_ms=1784271332264 mono_ms=6090129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13319 role=brain wall_ms=1784271332265 mono_ms=6090129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13320 role=brain wall_ms=1784271335753 mono_ms=6093617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13320 role=brain wall_ms=1784271335753 mono_ms=6093617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain wall_ms=1784271335754 mono_ms=6093618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain stream-subscriber stream=6190 wall_ms=1784271335754 mono_ms=6093618 event=stream-sub-attach stream=6190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain stream-subscriber stream=6190 wall_ms=1784271335756 mono_ms=6093620 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13322 role=brain wall_ms=1784271335756 mono_ms=6093620 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13322 role=brain wall_ms=1784271335756 mono_ms=6093620 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13323 role=brain wall_ms=1784271337306 mono_ms=6095170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13323 role=brain wall_ms=1784271337306 mono_ms=6095170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13324 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13325 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13326 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13324 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13325 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13326 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain wall_ms=1784271338183 mono_ms=6096048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain stream-subscriber stream=6191 wall_ms=1784271338183 mono_ms=6096048 event=stream-sub-attach stream=6191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain stream-subscriber stream=6191 wall_ms=1784271338191 mono_ms=6096056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13330 role=brain wall_ms=1784271338192 mono_ms=6096056 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13330 role=brain wall_ms=1784271338192 mono_ms=6096056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain wall_ms=1784271338198 mono_ms=6096063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain stream-subscriber stream=6192 wall_ms=1784271338198 mono_ms=6096063 event=stream-sub-attach stream=6192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain stream-subscriber stream=6192 wall_ms=1784271338201 mono_ms=6096065 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13331 role=brain wall_ms=1784271338201 mono_ms=6096066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13331 role=brain wall_ms=1784271338201 mono_ms=6096066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain wall_ms=1784271338214 mono_ms=6096079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain stream-subscriber stream=6193 wall_ms=1784271338215 mono_ms=6096079 event=stream-sub-attach stream=6193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain stream-subscriber stream=6193 wall_ms=1784271338220 mono_ms=6096084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13332 role=brain wall_ms=1784271338220 mono_ms=6096084 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13332 role=brain wall_ms=1784271338220 mono_ms=6096084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13333 role=brain wall_ms=1784271340827 mono_ms=6098691 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13334 role=brain wall_ms=1784271340827 mono_ms=6098691 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13333 role=brain wall_ms=1784271340827 mono_ms=6098691 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13334 role=brain wall_ms=1784271340827 mono_ms=6098691 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain wall_ms=1784271340828 mono_ms=6098693 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain stream-subscriber stream=6195 wall_ms=1784271340828 mono_ms=6098693 event=stream-sub-attach stream=6195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain stream-subscriber stream=6195 wall_ms=1784271340831 mono_ms=6098695 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13337 role=brain wall_ms=1784271340831 mono_ms=6098695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13337 role=brain wall_ms=1784271340831 mono_ms=6098695 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain wall_ms=1784271340837 mono_ms=6098702 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain stream-subscriber stream=6194 wall_ms=1784271340837 mono_ms=6098702 event=stream-sub-attach stream=6194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain stream-subscriber stream=6194 wall_ms=1784271340843 mono_ms=6098707 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13338 role=brain wall_ms=1784271340843 mono_ms=6098707 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13338 role=brain wall_ms=1784271340843 mono_ms=6098707 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13339 role=brain wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13340 role=brain wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13339 role=brain wall_ms=1784271341144 mono_ms=6099008 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13340 role=brain wall_ms=1784271341144 mono_ms=6099008 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271341144 mono_ms=6099008 event=stream-sub-attach stream=6196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain wall_ms=1784271341145 mono_ms=6099009 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain stream-subscriber stream=6197 wall_ms=1784271341145 mono_ms=6099009 event=stream-sub-attach stream=6197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain stream-subscriber stream=6197 wall_ms=1784271341154 mono_ms=6099019 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13343 role=brain wall_ms=1784271341154 mono_ms=6099019 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13343 role=brain wall_ms=1784271341154 mono_ms=6099019 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13344 role=brain wall_ms=1784271342354 mono_ms=6100218 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13344 role=brain wall_ms=1784271342354 mono_ms=6100218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271347139 mono_ms=6105004 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13345 role=brain wall_ms=1784271347140 mono_ms=6105004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13345 role=brain wall_ms=1784271347140 mono_ms=6105005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271347195 mono_ms=6105059 event=stream-sub-attach stream=6208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13346 role=brain wall_ms=1784271347398 mono_ms=6105262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13346 role=brain wall_ms=1784271347398 mono_ms=6105262 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271348003 mono_ms=6105868 event=stream-sub-attach stream=6209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271349199 mono_ms=6107063 event=stream-sub-attach stream=6210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271349580 mono_ms=6107444 event=stream-sub-attach stream=6214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13347 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13348 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13349 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13347 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13348 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13349 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349595 mono_ms=6107460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349605 mono_ms=6107470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13353 role=brain wall_ms=1784271349605 mono_ms=6107470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13353 role=brain wall_ms=1784271349605 mono_ms=6107470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349610 mono_ms=6107474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13354 role=brain wall_ms=1784271349610 mono_ms=6107474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13354 role=brain wall_ms=1784271349610 mono_ms=6107474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349613 mono_ms=6107477 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13355 role=brain wall_ms=1784271349613 mono_ms=6107477 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13355 role=brain wall_ms=1784271349613 mono_ms=6107477 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271350018 mono_ms=6107882 event=stream-sub-attach stream=6215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13356 role=brain wall_ms=1784271352441 mono_ms=6110306 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13356 role=brain wall_ms=1784271352441 mono_ms=6110306 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13357 role=brain wall_ms=1784271355621 mono_ms=6113486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13357 role=brain wall_ms=1784271355621 mono_ms=6113486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355622 mono_ms=6113486 event=stream-sub-attach stream=6216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355622 mono_ms=6113486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355626 mono_ms=6113490 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13359 role=brain wall_ms=1784271355626 mono_ms=6113490 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13359 role=brain wall_ms=1784271355626 mono_ms=6113490 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13360 role=brain wall_ms=1784271355831 mono_ms=6113695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13361 role=brain wall_ms=1784271355831 mono_ms=6113695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13360 role=brain wall_ms=1784271355831 mono_ms=6113696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13361 role=brain wall_ms=1784271355831 mono_ms=6113696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355831 mono_ms=6113696 event=stream-sub-attach stream=6218 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355832 mono_ms=6113696 event=stream-sub-attach stream=6217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355832 mono_ms=6113696 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355832 mono_ms=6113696 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355838 mono_ms=6113703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13364 role=brain wall_ms=1784271355839 mono_ms=6113703 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13364 role=brain wall_ms=1784271355839 mono_ms=6113703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355840 mono_ms=6113705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13365 role=brain wall_ms=1784271355841 mono_ms=6113705 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13365 role=brain wall_ms=1784271355841 mono_ms=6113705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13366 role=brain wall_ms=1784271356146 mono_ms=6114010 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13366 role=brain wall_ms=1784271356146 mono_ms=6114011 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain wall_ms=1784271356148 mono_ms=6114012 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain stream-subscriber stream=6219 wall_ms=1784271356148 mono_ms=6114012 event=stream-sub-attach stream=6219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain stream-subscriber stream=6219 wall_ms=1784271356213 mono_ms=6114077 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13368 role=brain wall_ms=1784271356213 mono_ms=6114077 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13368 role=brain wall_ms=1784271356213 mono_ms=6114077 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13369 role=brain wall_ms=1784271357488 mono_ms=6115353 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13369 role=brain wall_ms=1784271357488 mono_ms=6115353 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=59475712 id=667372f620c5a3355e62a5b6757b4ba11738510b0fa5dbfd7eb6c3d4b26693ac addr=EndpointAddr { id: PublicKey(667372f620c5a3355e62a5b6757b4ba11738510b0fa5dbfd7eb6c3d4b26693ac), addrs: {Ip(100.68.35.65:63577), Ip(192.168.1.81:63577)} }\nPAIR_MEET_UP:BIGNET step=59475712 id=225511abb3ba7dd4f2323f721e8f98fe61193bac538b3d7cf914dd9b3c0e85e7 addr=EndpointAddr { id: PublicKey(225511abb3ba7dd4f2323f721e8f98fe61193bac538b3d7cf914dd9b3c0e85e7), addrs: {Ip(100.68.35.65:63583), Ip(192.168.1.81:63583)} }\nCONN_LIFECYCLE: conn=13370 role=brain wall_ms=1784271360895 mono_ms=6118759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13370 role=brain wall_ms=1784271360895 mono_ms=6118759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain wall_ms=1784271360897 mono_ms=6118761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain stream-subscriber stream=6220 wall_ms=1784271360897 mono_ms=6118761 event=stream-sub-attach stream=6220 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain stream-subscriber stream=6220 wall_ms=1784271361077 mono_ms=6118941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13372 role=brain wall_ms=1784271361077 mono_ms=6118942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13372 role=brain wall_ms=1784271361077 mono_ms=6118942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13373 role=brain wall_ms=1784271362532 mono_ms=6120396 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13373 role=brain wall_ms=1784271362532 mono_ms=6120396 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13374 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13375 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13376 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13374 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13375 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13376 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain wall_ms=1784271363216 mono_ms=6121081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain wall_ms=1784271363216 mono_ms=6121081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain stream-subscriber stream=6226 wall_ms=1784271363216 mono_ms=6121081 event=stream-sub-attach stream=6226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain stream-subscriber stream=6228 wall_ms=1784271363216 mono_ms=6121081 event=stream-sub-attach stream=6228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain stream-subscriber stream=6228 wall_ms=1784271363222 mono_ms=6121086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13380 role=brain wall_ms=1784271363222 mono_ms=6121086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13380 role=brain wall_ms=1784271363222 mono_ms=6121086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain stream-subscriber stream=6226 wall_ms=1784271363225 mono_ms=6121089 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13381 role=brain wall_ms=1784271363225 mono_ms=6121089 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13381 role=brain wall_ms=1784271363225 mono_ms=6121089 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain wall_ms=1784271363229 mono_ms=6121093 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain stream-subscriber stream=6227 wall_ms=1784271363229 mono_ms=6121093 event=stream-sub-attach stream=6227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain stream-subscriber stream=6227 wall_ms=1784271363231 mono_ms=6121095 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13382 role=brain wall_ms=1784271363231 mono_ms=6121095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13382 role=brain wall_ms=1784271363231 mono_ms=6121095 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13383 role=brain wall_ms=1784271365853 mono_ms=6123718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13384 role=brain wall_ms=1784271365853 mono_ms=6123718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13383 role=brain wall_ms=1784271365854 mono_ms=6123718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13384 role=brain wall_ms=1784271365854 mono_ms=6123718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain wall_ms=1784271365855 mono_ms=6123719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain stream-subscriber stream=6229 wall_ms=1784271365855 mono_ms=6123719 event=stream-sub-attach stream=6229 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain wall_ms=1784271365856 mono_ms=6123721 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain stream-subscriber stream=6230 wall_ms=1784271365856 mono_ms=6123721 event=stream-sub-attach stream=6230 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain stream-subscriber stream=6230 wall_ms=1784271365858 mono_ms=6123722 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13387 role=brain wall_ms=1784271365858 mono_ms=6123723 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13387 role=brain wall_ms=1784271365858 mono_ms=6123723 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain stream-subscriber stream=6229 wall_ms=1784271365861 mono_ms=6123725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13388 role=brain wall_ms=1784271365861 mono_ms=6123725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13388 role=brain wall_ms=1784271365861 mono_ms=6123725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13389 role=brain wall_ms=1784271367578 mono_ms=6125442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13389 role=brain wall_ms=1784271367578 mono_ms=6125443 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13390 role=brain wall_ms=1784271371235 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13391 role=brain wall_ms=1784271371235 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13390 role=brain wall_ms=1784271371235 mono_ms=6129100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13391 role=brain wall_ms=1784271371235 mono_ms=6129100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371236 mono_ms=6129100 event=stream-sub-attach stream=6231 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371236 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain wall_ms=1784271371237 mono_ms=6129101 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain stream-subscriber stream=6232 wall_ms=1784271371237 mono_ms=6129101 event=stream-sub-attach stream=6232 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371244 mono_ms=6129108 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13394 role=brain wall_ms=1784271371244 mono_ms=6129108 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13394 role=brain wall_ms=1784271371244 mono_ms=6129108 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain stream-subscriber stream=6232 wall_ms=1784271371260 mono_ms=6129124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13395 role=brain wall_ms=1784271371260 mono_ms=6129124 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13395 role=brain wall_ms=1784271371260 mono_ms=6129124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=stream-sub-attach stream=6233 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 31999-32303 of 336. Use :32304 to continue]"}],"details":{"truncation":{"content":"CONN_LIFECYCLE: conn=13271 role=brain wall_ms=1784271317129 mono_ms=6074993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078438 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain wall_ms=1784271320575 mono_ms=6078440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320575 mono_ms=6078440 event=stream-sub-attach stream=6175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13275 role=brain wall_ms=1784271320784 mono_ms=6078648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13275 role=brain wall_ms=1784271320784 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320784 mono_ms=6078649 event=stream-sub-attach stream=6176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320784 mono_ms=6078649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320785 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13277 role=brain wall_ms=1784271320785 mono_ms=6078649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13277 role=brain wall_ms=1784271320785 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13278 role=brain wall_ms=1784271320994 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13278 role=brain wall_ms=1784271320994 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=stream-sub-attach stream=6177 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13280 role=brain wall_ms=1784271320995 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13280 role=brain wall_ms=1784271320995 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13281 role=brain wall_ms=1784271321206 mono_ms=6079070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13281 role=brain wall_ms=1784271321206 mono_ms=6079070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079070 event=stream-sub-attach stream=6178 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13283 role=brain wall_ms=1784271321206 mono_ms=6079071 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13283 role=brain wall_ms=1784271321206 mono_ms=6079071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13284 role=brain wall_ms=1784271322174 mono_ms=6080038 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13284 role=brain wall_ms=1784271322174 mono_ms=6080038 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13285 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13287 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13286 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13285 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13287 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13286 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain wall_ms=1784271323106 mono_ms=6080970 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain stream-subscriber stream=6180 wall_ms=1784271323106 mono_ms=6080970 event=stream-sub-attach stream=6180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain stream-subscriber stream=6180 wall_ms=1784271323108 mono_ms=6080972 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13291 role=brain wall_ms=1784271323108 mono_ms=6080973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13291 role=brain wall_ms=1784271323108 mono_ms=6080973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain wall_ms=1784271323120 mono_ms=6080984 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain wall_ms=1784271323120 mono_ms=6080984 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain stream-subscriber stream=6181 wall_ms=1784271323120 mono_ms=6080984 event=stream-sub-attach stream=6181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain stream-subscriber stream=6179 wall_ms=1784271323120 mono_ms=6080984 event=stream-sub-attach stream=6179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain stream-subscriber stream=6181 wall_ms=1784271323127 mono_ms=6080991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13292 role=brain wall_ms=1784271323127 mono_ms=6080991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13292 role=brain wall_ms=1784271323127 mono_ms=6080991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain stream-subscriber stream=6179 wall_ms=1784271323130 mono_ms=6080994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13293 role=brain wall_ms=1784271323130 mono_ms=6080994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13293 role=brain wall_ms=1784271323130 mono_ms=6080994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13294 role=brain wall_ms=1784271325317 mono_ms=6083181 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13294 role=brain wall_ms=1784271325317 mono_ms=6083181 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325317 mono_ms=6083181 event=stream-sub-attach stream=6182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325317 mono_ms=6083181 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325322 mono_ms=6083186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13296 role=brain wall_ms=1784271325322 mono_ms=6083186 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13296 role=brain wall_ms=1784271325322 mono_ms=6083186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13297 role=brain wall_ms=1784271325422 mono_ms=6083286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13297 role=brain wall_ms=1784271325422 mono_ms=6083286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083286 event=stream-sub-attach stream=6183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083287 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13299 role=brain wall_ms=1784271325423 mono_ms=6083287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13299 role=brain wall_ms=1784271325423 mono_ms=6083287 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13300 role=brain wall_ms=1784271325526 mono_ms=6083391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13300 role=brain wall_ms=1784271325527 mono_ms=6083391 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083391 event=stream-sub-attach stream=6184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13302 role=brain wall_ms=1784271325527 mono_ms=6083392 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13302 role=brain wall_ms=1784271325527 mono_ms=6083392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13303 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13304 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13305 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13303 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13304 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13305 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325740 mono_ms=6083604 event=stream-sub-attach stream=6185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325740 mono_ms=6083604 event=stream-sub-attach stream=6187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325740 mono_ms=6083605 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain wall_ms=1784271325741 mono_ms=6083606 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain stream-subscriber stream=6186 wall_ms=1784271325741 mono_ms=6083606 event=stream-sub-attach stream=6186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325746 mono_ms=6083611 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13309 role=brain wall_ms=1784271325746 mono_ms=6083611 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13309 role=brain wall_ms=1784271325747 mono_ms=6083611 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325751 mono_ms=6083615 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13310 role=brain wall_ms=1784271325751 mono_ms=6083615 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13310 role=brain wall_ms=1784271325751 mono_ms=6083616 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain stream-subscriber stream=6186 wall_ms=1784271325764 mono_ms=6083628 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13311 role=brain wall_ms=1784271325764 mono_ms=6083628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13311 role=brain wall_ms=1784271325764 mono_ms=6083629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13312 role=brain wall_ms=1784271325845 mono_ms=6083709 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13312 role=brain wall_ms=1784271325845 mono_ms=6083709 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain wall_ms=1784271325846 mono_ms=6083710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain stream-subscriber stream=6188 wall_ms=1784271325846 mono_ms=6083710 event=stream-sub-attach stream=6188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain stream-subscriber stream=6188 wall_ms=1784271325848 mono_ms=6083713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13314 role=brain wall_ms=1784271325848 mono_ms=6083713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13314 role=brain wall_ms=1784271325848 mono_ms=6083713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13315 role=brain wall_ms=1784271326055 mono_ms=6083919 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13315 role=brain wall_ms=1784271326055 mono_ms=6083919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain wall_ms=1784271326056 mono_ms=6083920 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain stream-subscriber stream=6189 wall_ms=1784271326056 mono_ms=6083920 event=stream-sub-attach stream=6189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain stream-subscriber stream=6189 wall_ms=1784271326083 mono_ms=6083947 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13317 role=brain wall_ms=1784271326083 mono_ms=6083948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13317 role=brain wall_ms=1784271326083 mono_ms=6083948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13318 role=brain wall_ms=1784271327218 mono_ms=6085083 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13318 role=brain wall_ms=1784271327218 mono_ms=6085083 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=59475711 id=ab4ce425789cdb94af2ad4eac560c1bef4bec5a2a27b3a98651c8b93d2357ef0 addr=EndpointAddr { id: PublicKey(ab4ce425789cdb94af2ad4eac560c1bef4bec5a2a27b3a98651c8b93d2357ef0), addrs: {Ip(100.68.35.65:61460), Ip(192.168.1.81:61460)} }\nPAIR_MEET_UP:BIGNET step=59475711 id=baa1ef0727290a214689bebaa1d8c781db6122db0a1ee00f357d44699770cc78 addr=EndpointAddr { id: PublicKey(baa1ef0727290a214689bebaa1d8c781db6122db0a1ee00f357d44699770cc78), addrs: {Ip(100.68.35.65:61466), Ip(192.168.1.81:61466)} }\nCONN_LIFECYCLE: conn=13319 role=brain wall_ms=1784271332264 mono_ms=6090129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13319 role=brain wall_ms=1784271332265 mono_ms=6090129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13320 role=brain wall_ms=1784271335753 mono_ms=6093617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13320 role=brain wall_ms=1784271335753 mono_ms=6093617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain wall_ms=1784271335754 mono_ms=6093618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain stream-subscriber stream=6190 wall_ms=1784271335754 mono_ms=6093618 event=stream-sub-attach stream=6190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain stream-subscriber stream=6190 wall_ms=1784271335756 mono_ms=6093620 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13322 role=brain wall_ms=1784271335756 mono_ms=6093620 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13322 role=brain wall_ms=1784271335756 mono_ms=6093620 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13323 role=brain wall_ms=1784271337306 mono_ms=6095170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13323 role=brain wall_ms=1784271337306 mono_ms=6095170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13324 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13325 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13326 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13324 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13325 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13326 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain wall_ms=1784271338183 mono_ms=6096048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain stream-subscriber stream=6191 wall_ms=1784271338183 mono_ms=6096048 event=stream-sub-attach stream=6191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain stream-subscriber stream=6191 wall_ms=1784271338191 mono_ms=6096056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13330 role=brain wall_ms=1784271338192 mono_ms=6096056 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13330 role=brain wall_ms=1784271338192 mono_ms=6096056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain wall_ms=1784271338198 mono_ms=6096063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain stream-subscriber stream=6192 wall_ms=1784271338198 mono_ms=6096063 event=stream-sub-attach stream=6192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain stream-subscriber stream=6192 wall_ms=1784271338201 mono_ms=6096065 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13331 role=brain wall_ms=1784271338201 mono_ms=6096066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13331 role=brain wall_ms=1784271338201 mono_ms=6096066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain wall_ms=1784271338214 mono_ms=6096079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain stream-subscriber stream=6193 wall_ms=1784271338215 mono_ms=6096079 event=stream-sub-attach stream=6193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain stream-subscriber stream=6193 wall_ms=1784271338220 mono_ms=6096084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13332 role=brain wall_ms=1784271338220 mono_ms=6096084 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13332 role=brain wall_ms=1784271338220 mono_ms=6096084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13333 role=brain wall_ms=1784271340827 mono_ms=6098691 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13334 role=brain wall_ms=1784271340827 mono_ms=6098691 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13333 role=brain wall_ms=1784271340827 mono_ms=6098691 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13334 role=brain wall_ms=1784271340827 mono_ms=6098691 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain wall_ms=1784271340828 mono_ms=6098693 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain stream-subscriber stream=6195 wall_ms=1784271340828 mono_ms=6098693 event=stream-sub-attach stream=6195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain stream-subscriber stream=6195 wall_ms=1784271340831 mono_ms=6098695 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13337 role=brain wall_ms=1784271340831 mono_ms=6098695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13337 role=brain wall_ms=1784271340831 mono_ms=6098695 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain wall_ms=1784271340837 mono_ms=6098702 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain stream-subscriber stream=6194 wall_ms=1784271340837 mono_ms=6098702 event=stream-sub-attach stream=6194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain stream-subscriber stream=6194 wall_ms=1784271340843 mono_ms=6098707 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13338 role=brain wall_ms=1784271340843 mono_ms=6098707 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13338 role=brain wall_ms=1784271340843 mono_ms=6098707 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13339 role=brain wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13340 role=brain wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13339 role=brain wall_ms=1784271341144 mono_ms=6099008 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13340 role=brain wall_ms=1784271341144 mono_ms=6099008 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271341144 mono_ms=6099008 event=stream-sub-attach stream=6196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain wall_ms=1784271341145 mono_ms=6099009 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain stream-subscriber stream=6197 wall_ms=1784271341145 mono_ms=6099009 event=stream-sub-attach stream=6197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain stream-subscriber stream=6197 wall_ms=1784271341154 mono_ms=6099019 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13343 role=brain wall_ms=1784271341154 mono_ms=6099019 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13343 role=brain wall_ms=1784271341154 mono_ms=6099019 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13344 role=brain wall_ms=1784271342354 mono_ms=6100218 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13344 role=brain wall_ms=1784271342354 mono_ms=6100218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271347139 mono_ms=6105004 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13345 role=brain wall_ms=1784271347140 mono_ms=6105004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13345 role=brain wall_ms=1784271347140 mono_ms=6105005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271347195 mono_ms=6105059 event=stream-sub-attach stream=6208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13346 role=brain wall_ms=1784271347398 mono_ms=6105262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13346 role=brain wall_ms=1784271347398 mono_ms=6105262 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271348003 mono_ms=6105868 event=stream-sub-attach stream=6209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271349199 mono_ms=6107063 event=stream-sub-attach stream=6210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271349580 mono_ms=6107444 event=stream-sub-attach stream=6214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13347 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13348 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13349 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13347 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13348 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13349 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349595 mono_ms=6107460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349605 mono_ms=6107470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13353 role=brain wall_ms=1784271349605 mono_ms=6107470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13353 role=brain wall_ms=1784271349605 mono_ms=6107470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349610 mono_ms=6107474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13354 role=brain wall_ms=1784271349610 mono_ms=6107474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13354 role=brain wall_ms=1784271349610 mono_ms=6107474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349613 mono_ms=6107477 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13355 role=brain wall_ms=1784271349613 mono_ms=6107477 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13355 role=brain wall_ms=1784271349613 mono_ms=6107477 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271350018 mono_ms=6107882 event=stream-sub-attach stream=6215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13356 role=brain wall_ms=1784271352441 mono_ms=6110306 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13356 role=brain wall_ms=1784271352441 mono_ms=6110306 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13357 role=brain wall_ms=1784271355621 mono_ms=6113486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13357 role=brain wall_ms=1784271355621 mono_ms=6113486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355622 mono_ms=6113486 event=stream-sub-attach stream=6216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355622 mono_ms=6113486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355626 mono_ms=6113490 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13359 role=brain wall_ms=1784271355626 mono_ms=6113490 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13359 role=brain wall_ms=1784271355626 mono_ms=6113490 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13360 role=brain wall_ms=1784271355831 mono_ms=6113695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13361 role=brain wall_ms=1784271355831 mono_ms=6113695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13360 role=brain wall_ms=1784271355831 mono_ms=6113696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13361 role=brain wall_ms=1784271355831 mono_ms=6113696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355831 mono_ms=6113696 event=stream-sub-attach stream=6218 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355832 mono_ms=6113696 event=stream-sub-attach stream=6217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355832 mono_ms=6113696 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355832 mono_ms=6113696 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355838 mono_ms=6113703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13364 role=brain wall_ms=1784271355839 mono_ms=6113703 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13364 role=brain wall_ms=1784271355839 mono_ms=6113703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355840 mono_ms=6113705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13365 role=brain wall_ms=1784271355841 mono_ms=6113705 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13365 role=brain wall_ms=1784271355841 mono_ms=6113705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13366 role=brain wall_ms=1784271356146 mono_ms=6114010 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13366 role=brain wall_ms=1784271356146 mono_ms=6114011 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain wall_ms=1784271356148 mono_ms=6114012 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain stream-subscriber stream=6219 wall_ms=1784271356148 mono_ms=6114012 event=stream-sub-attach stream=6219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain stream-subscriber stream=6219 wall_ms=1784271356213 mono_ms=6114077 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13368 role=brain wall_ms=1784271356213 mono_ms=6114077 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13368 role=brain wall_ms=1784271356213 mono_ms=6114077 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13369 role=brain wall_ms=1784271357488 mono_ms=6115353 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13369 role=brain wall_ms=1784271357488 mono_ms=6115353 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=59475712 id=667372f620c5a3355e62a5b6757b4ba11738510b0fa5dbfd7eb6c3d4b26693ac addr=EndpointAddr { id: PublicKey(667372f620c5a3355e62a5b6757b4ba11738510b0fa5dbfd7eb6c3d4b26693ac), addrs: {Ip(100.68.35.65:63577), Ip(192.168.1.81:63577)} }\nPAIR_MEET_UP:BIGNET step=59475712 id=225511abb3ba7dd4f2323f721e8f98fe61193bac538b3d7cf914dd9b3c0e85e7 addr=EndpointAddr { id: PublicKey(225511abb3ba7dd4f2323f721e8f98fe61193bac538b3d7cf914dd9b3c0e85e7), addrs: {Ip(100.68.35.65:63583), Ip(192.168.1.81:63583)} }\nCONN_LIFECYCLE: conn=13370 role=brain wall_ms=1784271360895 mono_ms=6118759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13370 role=brain wall_ms=1784271360895 mono_ms=6118759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain wall_ms=1784271360897 mono_ms=6118761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain stream-subscriber stream=6220 wall_ms=1784271360897 mono_ms=6118761 event=stream-sub-attach stream=6220 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain stream-subscriber stream=6220 wall_ms=1784271361077 mono_ms=6118941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13372 role=brain wall_ms=1784271361077 mono_ms=6118942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13372 role=brain wall_ms=1784271361077 mono_ms=6118942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13373 role=brain wall_ms=1784271362532 mono_ms=6120396 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13373 role=brain wall_ms=1784271362532 mono_ms=6120396 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13374 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13375 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13376 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13374 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13375 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13376 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain wall_ms=1784271363216 mono_ms=6121081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain wall_ms=1784271363216 mono_ms=6121081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain stream-subscriber stream=6226 wall_ms=1784271363216 mono_ms=6121081 event=stream-sub-attach stream=6226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain stream-subscriber stream=6228 wall_ms=1784271363216 mono_ms=6121081 event=stream-sub-attach stream=6228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain stream-subscriber stream=6228 wall_ms=1784271363222 mono_ms=6121086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13380 role=brain wall_ms=1784271363222 mono_ms=6121086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13380 role=brain wall_ms=1784271363222 mono_ms=6121086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain stream-subscriber stream=6226 wall_ms=1784271363225 mono_ms=6121089 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13381 role=brain wall_ms=1784271363225 mono_ms=6121089 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13381 role=brain wall_ms=1784271363225 mono_ms=6121089 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain wall_ms=1784271363229 mono_ms=6121093 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain stream-subscriber stream=6227 wall_ms=1784271363229 mono_ms=6121093 event=stream-sub-attach stream=6227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain stream-subscriber stream=6227 wall_ms=1784271363231 mono_ms=6121095 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13382 role=brain wall_ms=1784271363231 mono_ms=6121095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13382 role=brain wall_ms=1784271363231 mono_ms=6121095 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13383 role=brain wall_ms=1784271365853 mono_ms=6123718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13384 role=brain wall_ms=1784271365853 mono_ms=6123718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13383 role=brain wall_ms=1784271365854 mono_ms=6123718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13384 role=brain wall_ms=1784271365854 mono_ms=6123718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain wall_ms=1784271365855 mono_ms=6123719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain stream-subscriber stream=6229 wall_ms=1784271365855 mono_ms=6123719 event=stream-sub-attach stream=6229 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain wall_ms=1784271365856 mono_ms=6123721 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain stream-subscriber stream=6230 wall_ms=1784271365856 mono_ms=6123721 event=stream-sub-attach stream=6230 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain stream-subscriber stream=6230 wall_ms=1784271365858 mono_ms=6123722 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13387 role=brain wall_ms=1784271365858 mono_ms=6123723 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13387 role=brain wall_ms=1784271365858 mono_ms=6123723 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain stream-subscriber stream=6229 wall_ms=1784271365861 mono_ms=6123725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13388 role=brain wall_ms=1784271365861 mono_ms=6123725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13388 role=brain wall_ms=1784271365861 mono_ms=6123725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13389 role=brain wall_ms=1784271367578 mono_ms=6125442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13389 role=brain wall_ms=1784271367578 mono_ms=6125443 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13390 role=brain wall_ms=1784271371235 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13391 role=brain wall_ms=1784271371235 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13390 role=brain wall_ms=1784271371235 mono_ms=6129100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13391 role=brain wall_ms=1784271371235 mono_ms=6129100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371236 mono_ms=6129100 event=stream-sub-attach stream=6231 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371236 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain wall_ms=1784271371237 mono_ms=6129101 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain stream-subscriber stream=6232 wall_ms=1784271371237 mono_ms=6129101 event=stream-sub-attach stream=6232 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371244 mono_ms=6129108 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13394 role=brain wall_ms=1784271371244 mono_ms=6129108 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13394 role=brain wall_ms=1784271371244 mono_ms=6129108 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain stream-subscriber stream=6232 wall_ms=1784271371260 mono_ms=6129124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13395 role=brain wall_ms=1784271371260 mono_ms=6129124 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13395 role=brain wall_ms=1784271371260 mono_ms=6129124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=stream-sub-attach stream=6233 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"lines","totalLines":336,"totalBytes":47843,"outputLines":305,"outputBytes":47843,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"CONN_LIFECYCLE: conn=13271 role=brain wall_ms=1784271317129 mono_ms=6074993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078438 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain wall_ms=1784271320575 mono_ms=6078440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320575 mono_ms=6078440 event=stream-sub-attach stream=6175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13275 role=brain wall_ms=1784271320784 mono_ms=6078648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13275 role=brain wall_ms=1784271320784 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320784 mono_ms=6078649 event=stream-sub-attach stream=6176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320784 mono_ms=6078649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13276 role=brain stream-subscriber stream=6176 wall_ms=1784271320785 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13277 role=brain wall_ms=1784271320785 mono_ms=6078649 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13277 role=brain wall_ms=1784271320785 mono_ms=6078649 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13278 role=brain wall_ms=1784271320994 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13278 role=brain wall_ms=1784271320994 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=stream-sub-attach stream=6177 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13279 role=brain stream-subscriber stream=6177 wall_ms=1784271320995 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13280 role=brain wall_ms=1784271320995 mono_ms=6078859 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13280 role=brain wall_ms=1784271320995 mono_ms=6078859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13281 role=brain wall_ms=1784271321206 mono_ms=6079070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13281 role=brain wall_ms=1784271321206 mono_ms=6079070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079070 event=stream-sub-attach stream=6178 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13282 role=brain stream-subscriber stream=6178 wall_ms=1784271321206 mono_ms=6079071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13283 role=brain wall_ms=1784271321206 mono_ms=6079071 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13283 role=brain wall_ms=1784271321206 mono_ms=6079071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13284 role=brain wall_ms=1784271322174 mono_ms=6080038 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13284 role=brain wall_ms=1784271322174 mono_ms=6080038 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13285 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13287 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13286 role=brain wall_ms=1784271323104 mono_ms=6080968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13285 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13287 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13286 role=brain wall_ms=1784271323104 mono_ms=6080968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain wall_ms=1784271323106 mono_ms=6080970 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain stream-subscriber stream=6180 wall_ms=1784271323106 mono_ms=6080970 event=stream-sub-attach stream=6180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13288 role=brain stream-subscriber stream=6180 wall_ms=1784271323108 mono_ms=6080972 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13291 role=brain wall_ms=1784271323108 mono_ms=6080973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13291 role=brain wall_ms=1784271323108 mono_ms=6080973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain wall_ms=1784271323120 mono_ms=6080984 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain wall_ms=1784271323120 mono_ms=6080984 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain stream-subscriber stream=6181 wall_ms=1784271323120 mono_ms=6080984 event=stream-sub-attach stream=6181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain stream-subscriber stream=6179 wall_ms=1784271323120 mono_ms=6080984 event=stream-sub-attach stream=6179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13289 role=brain stream-subscriber stream=6181 wall_ms=1784271323127 mono_ms=6080991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13292 role=brain wall_ms=1784271323127 mono_ms=6080991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13292 role=brain wall_ms=1784271323127 mono_ms=6080991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13290 role=brain stream-subscriber stream=6179 wall_ms=1784271323130 mono_ms=6080994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13293 role=brain wall_ms=1784271323130 mono_ms=6080994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13293 role=brain wall_ms=1784271323130 mono_ms=6080994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13294 role=brain wall_ms=1784271325317 mono_ms=6083181 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13294 role=brain wall_ms=1784271325317 mono_ms=6083181 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325317 mono_ms=6083181 event=stream-sub-attach stream=6182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325317 mono_ms=6083181 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13295 role=brain stream-subscriber stream=6182 wall_ms=1784271325322 mono_ms=6083186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13296 role=brain wall_ms=1784271325322 mono_ms=6083186 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13296 role=brain wall_ms=1784271325322 mono_ms=6083186 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13297 role=brain wall_ms=1784271325422 mono_ms=6083286 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13297 role=brain wall_ms=1784271325422 mono_ms=6083286 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083286 event=stream-sub-attach stream=6183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13298 role=brain stream-subscriber stream=6183 wall_ms=1784271325422 mono_ms=6083287 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13299 role=brain wall_ms=1784271325423 mono_ms=6083287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13299 role=brain wall_ms=1784271325423 mono_ms=6083287 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13300 role=brain wall_ms=1784271325526 mono_ms=6083391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13300 role=brain wall_ms=1784271325527 mono_ms=6083391 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083391 event=stream-sub-attach stream=6184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083391 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13301 role=brain stream-subscriber stream=6184 wall_ms=1784271325527 mono_ms=6083392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13302 role=brain wall_ms=1784271325527 mono_ms=6083392 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13302 role=brain wall_ms=1784271325527 mono_ms=6083392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13303 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13304 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13305 role=brain wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13303 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13304 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13305 role=brain wall_ms=1784271325740 mono_ms=6083604 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325740 mono_ms=6083604 event=stream-sub-attach stream=6185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325740 mono_ms=6083604 event=stream-sub-attach stream=6187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325740 mono_ms=6083604 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325740 mono_ms=6083605 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain wall_ms=1784271325741 mono_ms=6083606 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain stream-subscriber stream=6186 wall_ms=1784271325741 mono_ms=6083606 event=stream-sub-attach stream=6186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13306 role=brain stream-subscriber stream=6185 wall_ms=1784271325746 mono_ms=6083611 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13309 role=brain wall_ms=1784271325746 mono_ms=6083611 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13309 role=brain wall_ms=1784271325747 mono_ms=6083611 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13308 role=brain stream-subscriber stream=6187 wall_ms=1784271325751 mono_ms=6083615 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13310 role=brain wall_ms=1784271325751 mono_ms=6083615 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13310 role=brain wall_ms=1784271325751 mono_ms=6083616 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13307 role=brain stream-subscriber stream=6186 wall_ms=1784271325764 mono_ms=6083628 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13311 role=brain wall_ms=1784271325764 mono_ms=6083628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13311 role=brain wall_ms=1784271325764 mono_ms=6083629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13312 role=brain wall_ms=1784271325845 mono_ms=6083709 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13312 role=brain wall_ms=1784271325845 mono_ms=6083709 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain wall_ms=1784271325846 mono_ms=6083710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain stream-subscriber stream=6188 wall_ms=1784271325846 mono_ms=6083710 event=stream-sub-attach stream=6188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13313 role=brain stream-subscriber stream=6188 wall_ms=1784271325848 mono_ms=6083713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13314 role=brain wall_ms=1784271325848 mono_ms=6083713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13314 role=brain wall_ms=1784271325848 mono_ms=6083713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13315 role=brain wall_ms=1784271326055 mono_ms=6083919 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13315 role=brain wall_ms=1784271326055 mono_ms=6083919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain wall_ms=1784271326056 mono_ms=6083920 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain stream-subscriber stream=6189 wall_ms=1784271326056 mono_ms=6083920 event=stream-sub-attach stream=6189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13316 role=brain stream-subscriber stream=6189 wall_ms=1784271326083 mono_ms=6083947 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13317 role=brain wall_ms=1784271326083 mono_ms=6083948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13317 role=brain wall_ms=1784271326083 mono_ms=6083948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13318 role=brain wall_ms=1784271327218 mono_ms=6085083 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13318 role=brain wall_ms=1784271327218 mono_ms=6085083 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=59475711 id=ab4ce425789cdb94af2ad4eac560c1bef4bec5a2a27b3a98651c8b93d2357ef0 addr=EndpointAddr { id: PublicKey(ab4ce425789cdb94af2ad4eac560c1bef4bec5a2a27b3a98651c8b93d2357ef0), addrs: {Ip(100.68.35.65:61460), Ip(192.168.1.81:61460)} }\nPAIR_MEET_UP:BIGNET step=59475711 id=baa1ef0727290a214689bebaa1d8c781db6122db0a1ee00f357d44699770cc78 addr=EndpointAddr { id: PublicKey(baa1ef0727290a214689bebaa1d8c781db6122db0a1ee00f357d44699770cc78), addrs: {Ip(100.68.35.65:61466), Ip(192.168.1.81:61466)} }\nCONN_LIFECYCLE: conn=13319 role=brain wall_ms=1784271332264 mono_ms=6090129 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13319 role=brain wall_ms=1784271332265 mono_ms=6090129 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13320 role=brain wall_ms=1784271335753 mono_ms=6093617 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13320 role=brain wall_ms=1784271335753 mono_ms=6093617 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain wall_ms=1784271335754 mono_ms=6093618 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain stream-subscriber stream=6190 wall_ms=1784271335754 mono_ms=6093618 event=stream-sub-attach stream=6190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13321 role=brain stream-subscriber stream=6190 wall_ms=1784271335756 mono_ms=6093620 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13322 role=brain wall_ms=1784271335756 mono_ms=6093620 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13322 role=brain wall_ms=1784271335756 mono_ms=6093620 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13323 role=brain wall_ms=1784271337306 mono_ms=6095170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13323 role=brain wall_ms=1784271337306 mono_ms=6095170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13324 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13325 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13326 role=brain wall_ms=1784271338182 mono_ms=6096046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13324 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13325 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13326 role=brain wall_ms=1784271338182 mono_ms=6096046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain wall_ms=1784271338183 mono_ms=6096048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain stream-subscriber stream=6191 wall_ms=1784271338183 mono_ms=6096048 event=stream-sub-attach stream=6191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13329 role=brain stream-subscriber stream=6191 wall_ms=1784271338191 mono_ms=6096056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13330 role=brain wall_ms=1784271338192 mono_ms=6096056 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13330 role=brain wall_ms=1784271338192 mono_ms=6096056 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain wall_ms=1784271338198 mono_ms=6096063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain stream-subscriber stream=6192 wall_ms=1784271338198 mono_ms=6096063 event=stream-sub-attach stream=6192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13327 role=brain stream-subscriber stream=6192 wall_ms=1784271338201 mono_ms=6096065 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13331 role=brain wall_ms=1784271338201 mono_ms=6096066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13331 role=brain wall_ms=1784271338201 mono_ms=6096066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain wall_ms=1784271338214 mono_ms=6096079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain stream-subscriber stream=6193 wall_ms=1784271338215 mono_ms=6096079 event=stream-sub-attach stream=6193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13328 role=brain stream-subscriber stream=6193 wall_ms=1784271338220 mono_ms=6096084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13332 role=brain wall_ms=1784271338220 mono_ms=6096084 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13332 role=brain wall_ms=1784271338220 mono_ms=6096084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13333 role=brain wall_ms=1784271340827 mono_ms=6098691 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13334 role=brain wall_ms=1784271340827 mono_ms=6098691 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13333 role=brain wall_ms=1784271340827 mono_ms=6098691 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13334 role=brain wall_ms=1784271340827 mono_ms=6098691 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain wall_ms=1784271340828 mono_ms=6098693 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain stream-subscriber stream=6195 wall_ms=1784271340828 mono_ms=6098693 event=stream-sub-attach stream=6195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13335 role=brain stream-subscriber stream=6195 wall_ms=1784271340831 mono_ms=6098695 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13337 role=brain wall_ms=1784271340831 mono_ms=6098695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13337 role=brain wall_ms=1784271340831 mono_ms=6098695 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain wall_ms=1784271340837 mono_ms=6098702 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain stream-subscriber stream=6194 wall_ms=1784271340837 mono_ms=6098702 event=stream-sub-attach stream=6194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13336 role=brain stream-subscriber stream=6194 wall_ms=1784271340843 mono_ms=6098707 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13338 role=brain wall_ms=1784271340843 mono_ms=6098707 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13338 role=brain wall_ms=1784271340843 mono_ms=6098707 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13339 role=brain wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13340 role=brain wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13339 role=brain wall_ms=1784271341144 mono_ms=6099008 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13340 role=brain wall_ms=1784271341144 mono_ms=6099008 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271341144 mono_ms=6099008 event=stream-sub-attach stream=6196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271341144 mono_ms=6099008 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain wall_ms=1784271341145 mono_ms=6099009 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain stream-subscriber stream=6197 wall_ms=1784271341145 mono_ms=6099009 event=stream-sub-attach stream=6197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13342 role=brain stream-subscriber stream=6197 wall_ms=1784271341154 mono_ms=6099019 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13343 role=brain wall_ms=1784271341154 mono_ms=6099019 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13343 role=brain wall_ms=1784271341154 mono_ms=6099019 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13344 role=brain wall_ms=1784271342354 mono_ms=6100218 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13344 role=brain wall_ms=1784271342354 mono_ms=6100218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13341 role=brain stream-subscriber stream=6196 wall_ms=1784271347139 mono_ms=6105004 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13345 role=brain wall_ms=1784271347140 mono_ms=6105004 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13345 role=brain wall_ms=1784271347140 mono_ms=6105005 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271347195 mono_ms=6105059 event=stream-sub-attach stream=6208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13346 role=brain wall_ms=1784271347398 mono_ms=6105262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13346 role=brain wall_ms=1784271347398 mono_ms=6105262 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271348003 mono_ms=6105868 event=stream-sub-attach stream=6209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271349199 mono_ms=6107063 event=stream-sub-attach stream=6210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271349580 mono_ms=6107444 event=stream-sub-attach stream=6214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13347 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13348 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13349 role=brain wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13347 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13348 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13349 role=brain wall_ms=1784271349595 mono_ms=6107459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349595 mono_ms=6107459 event=stream-sub-attach stream=6212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349595 mono_ms=6107459 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349595 mono_ms=6107460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13351 role=brain stream-subscriber stream=6213 wall_ms=1784271349605 mono_ms=6107470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13353 role=brain wall_ms=1784271349605 mono_ms=6107470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13353 role=brain wall_ms=1784271349605 mono_ms=6107470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13350 role=brain stream-subscriber stream=6211 wall_ms=1784271349610 mono_ms=6107474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13354 role=brain wall_ms=1784271349610 mono_ms=6107474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13354 role=brain wall_ms=1784271349610 mono_ms=6107474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13352 role=brain stream-subscriber stream=6212 wall_ms=1784271349613 mono_ms=6107477 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13355 role=brain wall_ms=1784271349613 mono_ms=6107477 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13355 role=brain wall_ms=1784271349613 mono_ms=6107477 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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=1784271350018 mono_ms=6107882 event=stream-sub-attach stream=6215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13356 role=brain wall_ms=1784271352441 mono_ms=6110306 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13356 role=brain wall_ms=1784271352441 mono_ms=6110306 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13357 role=brain wall_ms=1784271355621 mono_ms=6113486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13357 role=brain wall_ms=1784271355621 mono_ms=6113486 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355622 mono_ms=6113486 event=stream-sub-attach stream=6216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355622 mono_ms=6113486 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13358 role=brain stream-subscriber stream=6216 wall_ms=1784271355626 mono_ms=6113490 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13359 role=brain wall_ms=1784271355626 mono_ms=6113490 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13359 role=brain wall_ms=1784271355626 mono_ms=6113490 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13360 role=brain wall_ms=1784271355831 mono_ms=6113695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13361 role=brain wall_ms=1784271355831 mono_ms=6113695 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13360 role=brain wall_ms=1784271355831 mono_ms=6113696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13361 role=brain wall_ms=1784271355831 mono_ms=6113696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355831 mono_ms=6113696 event=stream-sub-attach stream=6218 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355832 mono_ms=6113696 event=stream-sub-attach stream=6217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355832 mono_ms=6113696 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355832 mono_ms=6113696 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13363 role=brain stream-subscriber stream=6217 wall_ms=1784271355838 mono_ms=6113703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13364 role=brain wall_ms=1784271355839 mono_ms=6113703 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13364 role=brain wall_ms=1784271355839 mono_ms=6113703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13362 role=brain stream-subscriber stream=6218 wall_ms=1784271355840 mono_ms=6113705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13365 role=brain wall_ms=1784271355841 mono_ms=6113705 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13365 role=brain wall_ms=1784271355841 mono_ms=6113705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13366 role=brain wall_ms=1784271356146 mono_ms=6114010 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13366 role=brain wall_ms=1784271356146 mono_ms=6114011 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain wall_ms=1784271356148 mono_ms=6114012 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain stream-subscriber stream=6219 wall_ms=1784271356148 mono_ms=6114012 event=stream-sub-attach stream=6219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13367 role=brain stream-subscriber stream=6219 wall_ms=1784271356213 mono_ms=6114077 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13368 role=brain wall_ms=1784271356213 mono_ms=6114077 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13368 role=brain wall_ms=1784271356213 mono_ms=6114077 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13369 role=brain wall_ms=1784271357488 mono_ms=6115353 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13369 role=brain wall_ms=1784271357488 mono_ms=6115353 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=59475712 id=667372f620c5a3355e62a5b6757b4ba11738510b0fa5dbfd7eb6c3d4b26693ac addr=EndpointAddr { id: PublicKey(667372f620c5a3355e62a5b6757b4ba11738510b0fa5dbfd7eb6c3d4b26693ac), addrs: {Ip(100.68.35.65:63577), Ip(192.168.1.81:63577)} }\nPAIR_MEET_UP:BIGNET step=59475712 id=225511abb3ba7dd4f2323f721e8f98fe61193bac538b3d7cf914dd9b3c0e85e7 addr=EndpointAddr { id: PublicKey(225511abb3ba7dd4f2323f721e8f98fe61193bac538b3d7cf914dd9b3c0e85e7), addrs: {Ip(100.68.35.65:63583), Ip(192.168.1.81:63583)} }\nCONN_LIFECYCLE: conn=13370 role=brain wall_ms=1784271360895 mono_ms=6118759 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13370 role=brain wall_ms=1784271360895 mono_ms=6118759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain wall_ms=1784271360897 mono_ms=6118761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain stream-subscriber stream=6220 wall_ms=1784271360897 mono_ms=6118761 event=stream-sub-attach stream=6220 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13371 role=brain stream-subscriber stream=6220 wall_ms=1784271361077 mono_ms=6118941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13372 role=brain wall_ms=1784271361077 mono_ms=6118942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13372 role=brain wall_ms=1784271361077 mono_ms=6118942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13373 role=brain wall_ms=1784271362532 mono_ms=6120396 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13373 role=brain wall_ms=1784271362532 mono_ms=6120396 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13374 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13375 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13376 role=brain wall_ms=1784271363215 mono_ms=6121079 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13374 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13375 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13376 role=brain wall_ms=1784271363215 mono_ms=6121079 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain wall_ms=1784271363216 mono_ms=6121081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain wall_ms=1784271363216 mono_ms=6121081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain stream-subscriber stream=6226 wall_ms=1784271363216 mono_ms=6121081 event=stream-sub-attach stream=6226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain stream-subscriber stream=6228 wall_ms=1784271363216 mono_ms=6121081 event=stream-sub-attach stream=6228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13379 role=brain stream-subscriber stream=6228 wall_ms=1784271363222 mono_ms=6121086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13380 role=brain wall_ms=1784271363222 mono_ms=6121086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13380 role=brain wall_ms=1784271363222 mono_ms=6121086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13377 role=brain stream-subscriber stream=6226 wall_ms=1784271363225 mono_ms=6121089 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13381 role=brain wall_ms=1784271363225 mono_ms=6121089 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13381 role=brain wall_ms=1784271363225 mono_ms=6121089 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain wall_ms=1784271363229 mono_ms=6121093 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain stream-subscriber stream=6227 wall_ms=1784271363229 mono_ms=6121093 event=stream-sub-attach stream=6227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13378 role=brain stream-subscriber stream=6227 wall_ms=1784271363231 mono_ms=6121095 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13382 role=brain wall_ms=1784271363231 mono_ms=6121095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13382 role=brain wall_ms=1784271363231 mono_ms=6121095 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13383 role=brain wall_ms=1784271365853 mono_ms=6123718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13384 role=brain wall_ms=1784271365853 mono_ms=6123718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13383 role=brain wall_ms=1784271365854 mono_ms=6123718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13384 role=brain wall_ms=1784271365854 mono_ms=6123718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain wall_ms=1784271365855 mono_ms=6123719 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain stream-subscriber stream=6229 wall_ms=1784271365855 mono_ms=6123719 event=stream-sub-attach stream=6229 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain wall_ms=1784271365856 mono_ms=6123721 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain stream-subscriber stream=6230 wall_ms=1784271365856 mono_ms=6123721 event=stream-sub-attach stream=6230 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13386 role=brain stream-subscriber stream=6230 wall_ms=1784271365858 mono_ms=6123722 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13387 role=brain wall_ms=1784271365858 mono_ms=6123723 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13387 role=brain wall_ms=1784271365858 mono_ms=6123723 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13385 role=brain stream-subscriber stream=6229 wall_ms=1784271365861 mono_ms=6123725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13388 role=brain wall_ms=1784271365861 mono_ms=6123725 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13388 role=brain wall_ms=1784271365861 mono_ms=6123725 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13389 role=brain wall_ms=1784271367578 mono_ms=6125442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13389 role=brain wall_ms=1784271367578 mono_ms=6125443 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13390 role=brain wall_ms=1784271371235 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13391 role=brain wall_ms=1784271371235 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13390 role=brain wall_ms=1784271371235 mono_ms=6129100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13391 role=brain wall_ms=1784271371235 mono_ms=6129100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371236 mono_ms=6129100 event=stream-sub-attach stream=6231 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371236 mono_ms=6129100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain wall_ms=1784271371237 mono_ms=6129101 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain stream-subscriber stream=6232 wall_ms=1784271371237 mono_ms=6129101 event=stream-sub-attach stream=6232 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13392 role=brain stream-subscriber stream=6231 wall_ms=1784271371244 mono_ms=6129108 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13394 role=brain wall_ms=1784271371244 mono_ms=6129108 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13394 role=brain wall_ms=1784271371244 mono_ms=6129108 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13393 role=brain stream-subscriber stream=6232 wall_ms=1784271371260 mono_ms=6129124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13395 role=brain wall_ms=1784271371260 mono_ms=6129124 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13395 role=brain wall_ms=1784271371260 mono_ms=6129124 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=stream-sub-attach stream=6233 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","startLine":31999,"lineNumbers":[31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":336,"totalBytes":47843,"outputLines":305,"outputBytes":47843,"shownRange":{"start":31999,"end":32303},"nextOffset":32304}}},"isError":false,"timestamp":1784271995002}}
{"type":"message","id":"c3280725","parentId":"cb514f2e","timestamp":"2026-07-17T07:06:51.139Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Estimating attachment events on connection 137**\n\n**Analyzing attachment frequency and connection candidates**"},{"type":"toolCall","id":"call_bRU0V6UWRkJ7ioO6BAzawgzw|fc_0fcf561150331aac016a59d48a6b288190adb9ab2b11249dbb","name":"grep","arguments":{"i":"Checking carrier 136 seats","pattern":"CONN_LIFECYCLE: conn=136 .*event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_GGpvQFwEK35IU0pYWxe8THWH|fc_0fcf561150331aac016a59d48a6b3c819081349b747e7ed0cd","name":"grep","arguments":{"i":"Checking carrier 138 seats","pattern":"CONN_LIFECYCLE: conn=138 .*event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_RuKS9aULsrXVBD4H89jgvD2d|fc_0fcf561150331aac016a59d48a6b4481908c23b965cf406a70","name":"grep","arguments":{"i":"Checking carrier 12 closure","pattern":"CONN_LIFECYCLE: conn=12 .*event=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_EBGBmMVbemBj129IayPh2rCD|fc_0fcf561150331aac016a59d48a6b4c8190839f3de26e82d4e5","name":"grep","arguments":{"i":"Finding repeated active carriers","pattern":"CONN_LIFECYCLE: conn=[0-9]+ role=brain .*stream-subscriber.*stream-subscriber.*event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"20000-24000","case":true,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":67697,"output":588,"cacheRead":195072,"cacheWrite":0,"totalTokens":263357,"reasoningTokens":243,"cost":{"input":0.33848500000000004,"output":0.01764,"cacheRead":0.097536,"cacheWrite":0,"total":0.45366100000000004}},"stopReason":"toolUse","timestamp":1784271995037,"responseId":"resp_0fcf561150331aac016a59d47b5f4c81909549c384501f604b","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0fcf561150331aac016a59d47fb4d08190b12d6a973aecfd5a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdSKQhBoUu_kp2CmH6gSIsLAPXEuT9ABByG6nAfDln2_aXhe8V2_6v-M3XOeUXXxcjtLB7NdhauC7nqMtRuxm40TkG5KRRw1ENryS7bv2M3e6I3ig-S0Q9hkiDASr5j7CnN3dpenPBwnTkHOzdRgNpD9fiBeNQ0H7m35CGrYp9HLW4eBL6EbdazOr_To9r1l-cRG9-qwd6vaJD77MZSFn5Rh6mr7p-KZaDl9-w1k0b_0VrYXrv40OCH8X6kElp0l3dYCJ1JShFc7QS3IjHgf0SuKv5zyUgxmtk45W_71LEAIOY8RtdAZgEokTjc-B7JqbTehrNL7-VxGaY2qjArprDGXG_mjmLlhTjhz9NNcst-m-NA1uh7Gq6T4QflPWZ1OJPj402UQcVVtcSv88bNk6__1oAJCIitP-9JM0f6LDMKAdxwwaory9w6EegJuPhh6cMTYQX_f81sVFLXaRmq6k8ihwiCr-RYuzu7loCjyICHfgOnFJZJBX9Wx4T2EXc7RPkRmP1AQK-JfPahfhxfTcdosmONrv6WMTV7rcS9Aw7CKIwZX0vaj6R1vPHX7-gWtRLNSbQhisYiBz5ZHZlSApXaYOYSGhX79KLTU9tsRqU9VSr3eVo67QqAIDZD0L1-MP5SQ3HAodXGu_KsWPtrTsXLbcIqKCibay28lOyVn4NWBIyZ1NP6eXSQZGTS7w1IRqudPSX2xn__x02pJqcPcaGdGZJgfiCh2go2G1azsHVhzwWz7clTHiPsMSyfe8b0hmfaj2arAKYfzQOGk37440twSiRHfLkKgDcYN5Tl3zrE-ItB9AhejYRRmvpGOCyuGu0CUC38hoRWrO66bkLEdM_mF_GZSf6cSELD3tVvH1yRf7y6n4VlIqvYvO4B6wy9VvLIP4yDYxmV1HkvvMQaa8LXaL56uBjOoQNgsjWJvPzKDvOpRBWRjfbh8n_J4ZX3LCaRMDc4UdRDLLmai7blDqpnb7EY92RBItaINrYoEeJ3jbBvyfsrSMawJgE5vzecemAd4aCwg-kdIwiSk5FeovHUPHTMV5lqnk6eK95rdq8RwS1GCv4fKeBrWYOyeQ2pFFgbOmxXebtKJO_OkoHFt_tVlCuEhNwL4YZTEqouN1GXaoKhOGYTzfpaaDOgItRMqz1MthG9xUOG7TpwxOwNmQmruXSEnaWP7uFDHF6aYPA5WOxg4qdQImm9XIWRdMJe4_FkCsQmS2AtcYaXbcGUwXF_bisUh54wyxMPUhDtbfQcJOjYVSmB9q8_NXP-N7Jr1NsV-VulsgdS4WCQX5xNCxzKicKAiLwQyR8oGB4wrEpFu6-AFK05S1OmZ7oL6imPQ8WZ8iaGDJj5NM7frpmQ4kj00eMLPSxgPXMoSCrglw2wCQYVvwKvwQClwhJJrfyFEjCixjbP298Agdt91MKDzR_Giqvel0kBXxMyngqeId0nYr6LykHLfulsrVUhNTyJ8VkmqnsNeuyPLjE0UFTjAM1RC6P3IaXfjDgLweClRDHdpaxqruj0SfDhGLBI6fR0GAouPgdqyEwqUZDhr6iOMWD3AJB8AW3k7N_vxVw3O6yUCZy7Av4pL0hsruuOeBPVtc_aU2LJVKX6vOyw-6xLMcIAWfQMHGkCzN2J21aWBHAh0-2KxTExXXB5Fp6DSHmSQttM109NWlQ7yIXzasor9SuKKah6UKKpZVn3V8W-ooSVLTIKuIcXzSv_v3tbnmU8RBfT8Nd9xPRLiuqDnI_9AfYuHPR4v4tl_vcEd3Hgnv_nvA3j9eamglrIJUS-lBTq_vYlROHC-8fHFdx4khXlAZTcmStjHdw3An7UO2h7d7JwCQpyN-phUb3CI_8C0ilriEnIweW868RNYKgfYuWtIPHBh4zO8YNAuAWqOEYHeMjWlL2sD-h191k_Sr3gxfxOl_w5es2f4vxug7CxBKLkamwiwgqyd7YrdjlCLBrIWFQJsggpu4GMJDsxdITz-o9OpfdX3oc3sUp_kazpROnHAnb1yhmX2bwtqOxOyjoShI4YW4mU0Eyo0KsdpQGHvNdKeYa8LIcMuvZuW86Yi-fg19XZRxqKXhYFKaPVAnkl46vAAko0H4SvPXmNTU6dgwZBBlUs-nz6xC0ApG1OUTZv93knvcVaF9K3yECBe6HunabCuhBaEzf72OTV3Z7QBUdQ7mBERgdY7ZrKlqXTRQgzs2i9gRA==","summary":[{"type":"summary_text","text":"**Estimating attachment events on connection 137**"},{"type":"summary_text","text":"**Analyzing attachment frequency and connection candidates**"}]},{"id":"fc_0fcf561150331aac016a59d48a6b288190adb9ab2b11249dbb","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking carrier 136 seats\",\"pattern\":\"CONN_LIFECYCLE: conn=136 .*event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_bRU0V6UWRkJ7ioO6BAzawgzw","name":"grep"},{"id":"fc_0fcf561150331aac016a59d48a6b3c819081349b747e7ed0cd","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking carrier 138 seats\",\"pattern\":\"CONN_LIFECYCLE: conn=138 .*event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_GGpvQFwEK35IU0pYWxe8THWH","name":"grep"},{"id":"fc_0fcf561150331aac016a59d48a6b4481908c23b965cf406a70","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking carrier 12 closure\",\"pattern\":\"CONN_LIFECYCLE: conn=12 .*event=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_RuKS9aULsrXVBD4H89jgvD2d","name":"grep"},{"id":"fc_0fcf561150331aac016a59d48a6b4c8190839f3de26e82d4e5","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding repeated active carriers\",\"pattern\":\"CONN_LIFECYCLE: conn=[0-9]+ role=brain .*stream-subscriber.*stream-subscriber.*event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"20000-24000\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_EBGBmMVbemBj129IayPh2rCD","name":"grep"}]},"duration":16101.486699998379,"ttft":4683.995499998331,"contextSnapshot":{"promptTokens":262769,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_bRU0V6UWRkJ7ioO6BAzawgzw|fc_0fcf561150331aac016a59d48a6b288190adb9ab2b11249dbb","toolName":"grep","startedAt":"2026-07-17T07:06:51.140Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking carrier 136 seats"},"id":"6e2a41aa","parentId":"c3280725","timestamp":"2026-07-17T07:06:51.140Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GGpvQFwEK35IU0pYWxe8THWH|fc_0fcf561150331aac016a59d48a6b3c819081349b747e7ed0cd","toolName":"grep","startedAt":"2026-07-17T07:06:51.140Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking carrier 138 seats"},"id":"f9309c71","parentId":"6e2a41aa","timestamp":"2026-07-17T07:06:51.140Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_RuKS9aULsrXVBD4H89jgvD2d|fc_0fcf561150331aac016a59d48a6b4481908c23b965cf406a70","toolName":"grep","startedAt":"2026-07-17T07:06:51.140Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking carrier 12 closure"},"id":"6f6ef3d1","parentId":"f9309c71","timestamp":"2026-07-17T07:06:51.140Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_EBGBmMVbemBj129IayPh2rCD|fc_0fcf561150331aac016a59d48a6b4c8190839f3de26e82d4e5","toolName":"grep","startedAt":"2026-07-17T07:06:51.140Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding repeated active carriers"},"id":"b2fd85e1","parentId":"6f6ef3d1","timestamp":"2026-07-17T07:06:51.140Z"}
{"type":"message","id":"1ef7b47f","parentId":"b2fd85e1","timestamp":"2026-07-17T07:06:51.155Z","message":{"role":"toolResult","toolCallId":"call_GGpvQFwEK35IU0pYWxe8THWH|fc_0fcf561150331aac016a59d48a6b3c819081349b747e7ed0cd","toolName":"grep","content":[{"type":"text","text":"No matches found\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"}],"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":1784272011155}}
{"type":"message","id":"145939a7","parentId":"1ef7b47f","timestamp":"2026-07-17T07:06:51.155Z","message":{"role":"toolResult","toolCallId":"call_RuKS9aULsrXVBD4H89jgvD2d|fc_0fcf561150331aac016a59d48a6b4481908c23b965cf406a70","toolName":"grep","content":[{"type":"text","text":" 376|CONN_LIFECYCLE: conn=116 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*377|CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 378|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 379|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 380|CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=6 reason=channel-closed [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"}],"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":1,"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":1}],"truncated":false,"displayContent":" 376│CONN_LIFECYCLE: conn=116 role=brain wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*377│CONN_LIFECYCLE: conn=12 role=brain stream-subscriber stream=14 stream-subscriber stream=20 stream-subscriber stream=23 stream-subscriber stream=24 stream-subscriber stream=27 stream-subscriber stream=28 stream-subscriber stream=31 stream-subscriber stream=32 wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 378│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 379│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265298295 mono_ms=56176 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 380│CONN_LIFECYCLE: conn=46 role=brain stream-subscriber stream=5 controller session=6 endpoint=webbie by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784272011155}}
{"type":"message","id":"a28d08d7","parentId":"145939a7","timestamp":"2026-07-17T07:06:51.156Z","message":{"role":"toolResult","toolCallId":"call_bRU0V6UWRkJ7ioO6BAzawgzw|fc_0fcf561150331aac016a59d48a6b288190adb9ab2b11249dbb","toolName":"grep","content":[{"type":"text","text":"No matches found\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"}],"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":1784272011156}}
{"type":"message","id":"83cc9ddb","parentId":"a28d08d7","timestamp":"2026-07-17T07:06:51.161Z","message":{"role":"toolResult","toolCallId":"call_EBGBmMVbemBj129IayPh2rCD|fc_0fcf561150331aac016a59d48a6b4c8190839f3de26e82d4e5","toolName":"grep","content":[{"type":"text","text":" 20229|CONN_LIFECYCLE: conn=8369 role=brain wall_ms=1784269299500 mono_ms=4057370 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20230|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=1784269299518 mono_ms=4057388 event=stream-sub-attach stream=3883 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20231|CONN_LIFECYCLE: conn=8370 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20232|CONN_LIFECYCLE: conn=8372 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20233|CONN_LIFECYCLE: conn=8371 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 20286|CONN_LIFECYCLE: conn=8393 role=brain wall_ms=1784269300131 mono_ms=4058001 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20287|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=1784269301060 mono_ms=4058930 event=stream-sub-attach stream=3888 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20288|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=1784269301769 mono_ms=4059639 event=stream-sub-attach stream=3889 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20289|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=1784269302153 mono_ms=4060023 event=stream-sub-attach stream=3890 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20290|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=1784269302456 mono_ms=4060326 event=stream-sub-attach stream=3891 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20291|CONN_LIFECYCLE: conn=8394 role=brain wall_ms=1784269303681 mono_ms=4061551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20292|CONN_LIFECYCLE: conn=8394 role=brain wall_ms=1784269303681 mono_ms=4061551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20293|CONN_LIFECYCLE: conn=8395 role=brain wall_ms=1784269308724 mono_ms=4066594 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 20653|CONN_LIFECYCLE: conn=8546 role=brain wall_ms=1784269361727 mono_ms=4119596 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20654|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=1784269363862 mono_ms=4121731 event=stream-sub-attach stream=3954 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20655|CONN_LIFECYCLE: conn=8547 role=brain wall_ms=1784269364195 mono_ms=4122065 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20656|CONN_LIFECYCLE: conn=8547 role=brain wall_ms=1784269364195 mono_ms=4122065 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20657|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=1784269364699 mono_ms=4122569 event=stream-sub-attach stream=3955 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20658|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=1784269365170 mono_ms=4123040 event=stream-sub-attach stream=3956 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20659|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=1784269365478 mono_ms=4123347 event=stream-sub-attach stream=3957 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20660|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=1784269366883 mono_ms=4124752 event=stream-sub-attach stream=3958 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20661|CONN_LIFECYCLE: conn=8549 role=brain wall_ms=1784269369155 mono_ms=4127024 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20662|CONN_LIFECYCLE: conn=8548 role=brain wall_ms=1784269369155 mono_ms=4127024 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20663|CONN_LIFECYCLE: conn=8549 role=brain wall_ms=1784269369155 mono_ms=4127024 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21042|CONN_LIFECYCLE: conn=8709 role=brain wall_ms=1784269424851 mono_ms=4182720 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21043|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=1784269427770 mono_ms=4185639 event=stream-sub-attach stream=4029 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21044|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=1784269428402 mono_ms=4186271 event=stream-sub-attach stream=4030 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21045|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=1784269429027 mono_ms=4186896 event=stream-sub-attach stream=4031 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21046|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=1784269429350 mono_ms=4187219 event=stream-sub-attach stream=4032 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21047|CONN_LIFECYCLE: conn=8710 role=brain wall_ms=1784269429542 mono_ms=4187412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21048|CONN_LIFECYCLE: conn=8711 role=brain wall_ms=1784269429542 mono_ms=4187412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21049|CONN_LIFECYCLE: conn=8710 role=brain wall_ms=1784269429542 mono_ms=4187412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21062|CONN_LIFECYCLE: conn=8716 role=brain wall_ms=1784269429891 mono_ms=4187760 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21063|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=1784269430255 mono_ms=4188125 event=stream-sub-attach stream=4035 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21064|CONN_LIFECYCLE: conn=8717 role=brain wall_ms=1784269433059 mono_ms=4190929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21065|CONN_LIFECYCLE: conn=8717 role=brain wall_ms=1784269433059 mono_ms=4190929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21066|CONN_LIFECYCLE: conn=8718 role=brain wall_ms=1784269433060 mono_ms=4190930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21354|CONN_LIFECYCLE: conn=8839 role=brain wall_ms=1784269491971 mono_ms=4249840 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21355|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=1784269492012 mono_ms=4249881 event=stream-sub-attach stream=4105 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21356|CONN_LIFECYCLE: conn=8840 role=brain wall_ms=1784269492034 mono_ms=4249903 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21357|CONN_LIFECYCLE: conn=8841 role=brain wall_ms=1784269492034 mono_ms=4249903 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21358|CONN_LIFECYCLE: conn=8840 role=brain wall_ms=1784269492034 mono_ms=4249903 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21411|CONN_LIFECYCLE: conn=8863 role=brain wall_ms=1784269492245 mono_ms=4250114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21412|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=1784269492976 mono_ms=4250845 event=stream-sub-attach stream=4107 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21413|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=1784269493404 mono_ms=4251273 event=stream-sub-attach stream=4108 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21414|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=1784269493592 mono_ms=4251461 event=stream-sub-attach stream=4109 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21415|CONN_LIFECYCLE: conn=8864 role=brain wall_ms=1784269494104 mono_ms=4251973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21416|CONN_LIFECYCLE: conn=8864 role=brain wall_ms=1784269494104 mono_ms=4251973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21417|CONN_LIFECYCLE: conn=8865 role=brain wall_ms=1784269494105 mono_ms=4251974 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21418|CONN_LIFECYCLE: conn=8865 role=brain stream-subscriber stream=4110 wall_ms=1784269494105 mono_ms=4251974 event=stream-sub-attach stream=4110 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21419|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=1784269494367 mono_ms=4252236 event=stream-sub-attach stream=4111 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21420|CONN_LIFECYCLE: conn=8865 role=brain stream-subscriber stream=4110 wall_ms=1784269494411 mono_ms=4252280 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21421|CONN_LIFECYCLE: conn=8866 role=brain wall_ms=1784269494411 mono_ms=4252280 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21422|CONN_LIFECYCLE: conn=8866 role=brain wall_ms=1784269494411 mono_ms=4252280 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21450|CONN_LIFECYCLE: conn=8878 role=brain wall_ms=1784269494937 mono_ms=4252806 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21451|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=1784269495239 mono_ms=4253108 event=stream-sub-attach stream=4116 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21452|CONN_LIFECYCLE: conn=8879 role=brain wall_ms=1784269495477 mono_ms=4253346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21453|CONN_LIFECYCLE: conn=8879 role=brain wall_ms=1784269495477 mono_ms=4253346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21454|CONN_LIFECYCLE: conn=8880 role=brain wall_ms=1784269498347 mono_ms=4256216 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21800|CONN_LIFECYCLE: conn=9026 role=brain wall_ms=1784269555998 mono_ms=4313867 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21801|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=1784269556525 mono_ms=4314394 event=stream-sub-attach stream=4182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21802|CONN_LIFECYCLE: conn=9027 role=brain wall_ms=1784269556596 mono_ms=4314466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21803|CONN_LIFECYCLE: conn=9029 role=brain wall_ms=1784269556596 mono_ms=4314466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21804|CONN_LIFECYCLE: conn=9028 role=brain wall_ms=1784269556596 mono_ms=4314466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21829|CONN_LIFECYCLE: conn=9038 role=brain wall_ms=1784269556705 mono_ms=4314574 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21830|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=1784269557405 mono_ms=4315274 event=stream-sub-attach stream=4187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21831|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=1784269559144 mono_ms=4317013 event=stream-sub-attach stream=4188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21832|CONN_LIFECYCLE: conn=9039 role=brain wall_ms=1784269559290 mono_ms=4317159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21833|CONN_LIFECYCLE: conn=9039 role=brain wall_ms=1784269559290 mono_ms=4317159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21834|CONN_LIFECYCLE: conn=9040 role=brain stream-subscriber stream=4189 wall_ms=1784269559290 mono_ms=4317159 event=stream-sub-attach stream=4189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 21838|CONN_LIFECYCLE: conn=9041 role=brain wall_ms=1784269559291 mono_ms=4317160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21839|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=1784269559365 mono_ms=4317234 event=stream-sub-attach stream=4190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21840|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=1784269559752 mono_ms=4317621 event=stream-sub-attach stream=4191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21841|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 21842|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 21843|PAIR_MEET_UP:SPT_DEV step=59475652 id=70be67c4863a782be2ca8d8b829b4ea3cd7035166ced6fa79d93ed8de6e97bb6 addr=EndpointAddr { id: PublicKey(70be67c4863a782be2ca8d8b829b4ea3cd7035166ced6fa79d93ed8de6e97bb6), addrs: {Ip(100.68.35.65:57568), Ip(192.168.1.81:57568)} }\n...\n 22157|CONN_LIFECYCLE: conn=9172 role=brain stream-subscriber stream=4245 wall_ms=1784269627337 mono_ms=4385206 event=stream-sub-attach stream=4245 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22158|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=1784269627340 mono_ms=4385209 event=stream-sub-attach stream=4263 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22159|CONN_LIFECYCLE: conn=9172 role=brain stream-subscriber stream=4245 wall_ms=1784269627347 mono_ms=4385216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22160|CONN_LIFECYCLE: conn=9175 role=brain wall_ms=1784269627347 mono_ms=4385216 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22161|CONN_LIFECYCLE: conn=9175 role=brain wall_ms=1784269627347 mono_ms=4385216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 22189|CONN_LIFECYCLE: conn=9187 role=brain wall_ms=1784269627964 mono_ms=4385833 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22190|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=1784269628966 mono_ms=4386835 event=stream-sub-attach stream=4268 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22191|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=1784269629937 mono_ms=4387806 event=stream-sub-attach stream=4269 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22192|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=1784269630673 mono_ms=4388542 event=stream-sub-attach stream=4270 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22193|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=1784269631040 mono_ms=4388909 event=stream-sub-attach stream=4271 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22194|CONN_LIFECYCLE: conn=9188 role=brain wall_ms=1784269631687 mono_ms=4389556 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22195|CONN_LIFECYCLE: conn=9188 role=brain wall_ms=1784269631687 mono_ms=4389556 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22196|CONN_LIFECYCLE: conn=9189 role=brain wall_ms=1784269632726 mono_ms=4390595 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 22570|CONN_LIFECYCLE: conn=9346 role=brain wall_ms=1784269689105 mono_ms=4446974 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22571|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=1784269691352 mono_ms=4449221 event=stream-sub-attach stream=4336 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22572|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=1784269691786 mono_ms=4449655 event=stream-sub-attach stream=4337 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22573|CONN_LIFECYCLE: conn=9347 role=brain wall_ms=1784269692204 mono_ms=4450073 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22574|CONN_LIFECYCLE: conn=9347 role=brain wall_ms=1784269692204 mono_ms=4450073 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22575|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=1784269692526 mono_ms=4450395 event=stream-sub-attach stream=4338 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22576|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=1784269693186 mono_ms=4451055 event=stream-sub-attach stream=4339 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22577|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=1784269694521 mono_ms=4452390 event=stream-sub-attach stream=4340 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22578|CONN_LIFECYCLE: conn=9348 role=brain wall_ms=1784269696361 mono_ms=4454230 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22579|CONN_LIFECYCLE: conn=9348 role=brain wall_ms=1784269696361 mono_ms=4454230 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22580|CONN_LIFECYCLE: conn=9349 role=brain stream-subscriber stream=4341 wall_ms=1784269696362 mono_ms=4454230 event=stream-sub-attach stream=4341 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 22917|CONN_LIFECYCLE: conn=9491 role=brain wall_ms=1784269753163 mono_ms=4511031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22918|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=1784269755082 mono_ms=4512950 event=stream-sub-attach stream=4405 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22919|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=1784269755524 mono_ms=4513393 event=stream-sub-attach stream=4406 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22920|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=1784269755773 mono_ms=4513641 event=stream-sub-attach stream=4407 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22921|CONN_LIFECYCLE: conn=9492 role=brain wall_ms=1784269756267 mono_ms=4514136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22922|CONN_LIFECYCLE: conn=9492 role=brain wall_ms=1784269756268 mono_ms=4514136 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22923|CONN_LIFECYCLE: conn=9493 role=brain wall_ms=1784269756269 mono_ms=4514137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 22941|CONN_LIFECYCLE: conn=9500 role=brain wall_ms=1784269756389 mono_ms=4514258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22942|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=1784269756753 mono_ms=4514622 event=stream-sub-attach stream=4411 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22943|CONN_LIFECYCLE: conn=9501 role=brain wall_ms=1784269757757 mono_ms=4515626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22944|CONN_LIFECYCLE: conn=9501 role=brain wall_ms=1784269757757 mono_ms=4515626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22945|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=1784269758487 mono_ms=4516356 event=stream-sub-attach stream=4412 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22946|CONN_LIFECYCLE: conn=9502 role=brain wall_ms=1784269760001 mono_ms=4517870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22947|CONN_LIFECYCLE: conn=9502 role=brain wall_ms=1784269760001 mono_ms=4517870 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22948|CONN_LIFECYCLE: conn=9503 role=brain wall_ms=1784269760003 mono_ms=4517871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 23320|CONN_LIFECYCLE: conn=9660 role=brain wall_ms=1784269821442 mono_ms=4579311 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*23321|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=1784269821642 mono_ms=4579510 event=stream-sub-attach stream=4487 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23322|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=1784269822635 mono_ms=4580503 event=stream-sub-attach stream=4488 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 23323|CONN_LIFECYCLE: conn=9661 role=brain wall_ms=1784269822766 mono_ms=4580635 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23324|CONN_LIFECYCLE: conn=9661 role=brain wall_ms=1784269822766 mono_ms=4580635 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 23325|CONN_LIFECYCLE: conn=9662 role=brain stream-subscriber stream=4489 wall_ms=1784269822766 mono_ms=4580635 event=stream-sub-attach stream=4489 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 23345|CONN_LIFECYCLE: conn=9670 role=brain wall_ms=1784269823811 mono_ms=4581679 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*23346|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=1784269824602 mono_ms=4582471 event=stream-sub-attach stream=4492 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23347|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=1784269825304 mono_ms=4583173 event=stream-sub-attach stream=4493 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23348|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=1784269825449 mono_ms=4583318 event=stream-sub-attach stream=4494 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 23349|CONN_LIFECYCLE: conn=9671 role=brain wall_ms=1784269827848 mono_ms=4585716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23350|CONN_LIFECYCLE: conn=9673 role=brain wall_ms=1784269827848 mono_ms=4585716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23351|CONN_LIFECYCLE: conn=9672 role=brain wall_ms=1784269827848 mono_ms=4585716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 23723|CONN_LIFECYCLE: conn=9829 role=brain wall_ms=1784269884412 mono_ms=4642280 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*23724|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=1784269885997 mono_ms=4643865 event=stream-sub-attach stream=4564 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23725|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=1784269886690 mono_ms=4644558 event=stream-sub-attach stream=4565 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23726|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=1784269887361 mono_ms=4645229 event=stream-sub-attach stream=4566 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23727|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=1784269888065 mono_ms=4645933 event=stream-sub-attach stream=4567 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23728|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=1784269888410 mono_ms=4646279 event=stream-sub-attach stream=4568 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 23729|CONN_LIFECYCLE: conn=9830 role=brain wall_ms=1784269888871 mono_ms=4646740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23730|CONN_LIFECYCLE: conn=9830 role=brain wall_ms=1784269888871 mono_ms=4646740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 23731|CONN_LIFECYCLE: conn=9831 role=brain wall_ms=1784269889178 mono_ms=4647046 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"}],"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":51,"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":51}],"truncated":false,"displayContent":" 20229│CONN_LIFECYCLE: conn=8369 role=brain wall_ms=1784269299500 mono_ms=4057370 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20230│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=1784269299518 mono_ms=4057388 event=stream-sub-attach stream=3883 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20231│CONN_LIFECYCLE: conn=8370 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20232│CONN_LIFECYCLE: conn=8372 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20233│CONN_LIFECYCLE: conn=8371 role=brain wall_ms=1784269299591 mono_ms=4057461 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20286│CONN_LIFECYCLE: conn=8393 role=brain wall_ms=1784269300131 mono_ms=4058001 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20287│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=1784269301060 mono_ms=4058930 event=stream-sub-attach stream=3888 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20288│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=1784269301769 mono_ms=4059639 event=stream-sub-attach stream=3889 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20289│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=1784269302153 mono_ms=4060023 event=stream-sub-attach stream=3890 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20290│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=1784269302456 mono_ms=4060326 event=stream-sub-attach stream=3891 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20291│CONN_LIFECYCLE: conn=8394 role=brain wall_ms=1784269303681 mono_ms=4061551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20292│CONN_LIFECYCLE: conn=8394 role=brain wall_ms=1784269303681 mono_ms=4061551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20293│CONN_LIFECYCLE: conn=8395 role=brain wall_ms=1784269308724 mono_ms=4066594 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20653│CONN_LIFECYCLE: conn=8546 role=brain wall_ms=1784269361727 mono_ms=4119596 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20654│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=1784269363862 mono_ms=4121731 event=stream-sub-attach stream=3954 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20655│CONN_LIFECYCLE: conn=8547 role=brain wall_ms=1784269364195 mono_ms=4122065 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20656│CONN_LIFECYCLE: conn=8547 role=brain wall_ms=1784269364195 mono_ms=4122065 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20657│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=1784269364699 mono_ms=4122569 event=stream-sub-attach stream=3955 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20658│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=1784269365170 mono_ms=4123040 event=stream-sub-attach stream=3956 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20659│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=1784269365478 mono_ms=4123347 event=stream-sub-attach stream=3957 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*20660│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=1784269366883 mono_ms=4124752 event=stream-sub-attach stream=3958 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 20661│CONN_LIFECYCLE: conn=8549 role=brain wall_ms=1784269369155 mono_ms=4127024 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20662│CONN_LIFECYCLE: conn=8548 role=brain wall_ms=1784269369155 mono_ms=4127024 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20663│CONN_LIFECYCLE: conn=8549 role=brain wall_ms=1784269369155 mono_ms=4127024 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21042│CONN_LIFECYCLE: conn=8709 role=brain wall_ms=1784269424851 mono_ms=4182720 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21043│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=1784269427770 mono_ms=4185639 event=stream-sub-attach stream=4029 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21044│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=1784269428402 mono_ms=4186271 event=stream-sub-attach stream=4030 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21045│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=1784269429027 mono_ms=4186896 event=stream-sub-attach stream=4031 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21046│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=1784269429350 mono_ms=4187219 event=stream-sub-attach stream=4032 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21047│CONN_LIFECYCLE: conn=8710 role=brain wall_ms=1784269429542 mono_ms=4187412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21048│CONN_LIFECYCLE: conn=8711 role=brain wall_ms=1784269429542 mono_ms=4187412 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21049│CONN_LIFECYCLE: conn=8710 role=brain wall_ms=1784269429542 mono_ms=4187412 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21062│CONN_LIFECYCLE: conn=8716 role=brain wall_ms=1784269429891 mono_ms=4187760 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21063│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=1784269430255 mono_ms=4188125 event=stream-sub-attach stream=4035 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21064│CONN_LIFECYCLE: conn=8717 role=brain wall_ms=1784269433059 mono_ms=4190929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21065│CONN_LIFECYCLE: conn=8717 role=brain wall_ms=1784269433059 mono_ms=4190929 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21066│CONN_LIFECYCLE: conn=8718 role=brain wall_ms=1784269433060 mono_ms=4190930 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21354│CONN_LIFECYCLE: conn=8839 role=brain wall_ms=1784269491971 mono_ms=4249840 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21355│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=1784269492012 mono_ms=4249881 event=stream-sub-attach stream=4105 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21356│CONN_LIFECYCLE: conn=8840 role=brain wall_ms=1784269492034 mono_ms=4249903 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21357│CONN_LIFECYCLE: conn=8841 role=brain wall_ms=1784269492034 mono_ms=4249903 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21358│CONN_LIFECYCLE: conn=8840 role=brain wall_ms=1784269492034 mono_ms=4249903 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21411│CONN_LIFECYCLE: conn=8863 role=brain wall_ms=1784269492245 mono_ms=4250114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21412│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=1784269492976 mono_ms=4250845 event=stream-sub-attach stream=4107 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21413│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=1784269493404 mono_ms=4251273 event=stream-sub-attach stream=4108 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21414│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=1784269493592 mono_ms=4251461 event=stream-sub-attach stream=4109 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21415│CONN_LIFECYCLE: conn=8864 role=brain wall_ms=1784269494104 mono_ms=4251973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21416│CONN_LIFECYCLE: conn=8864 role=brain wall_ms=1784269494104 mono_ms=4251973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21417│CONN_LIFECYCLE: conn=8865 role=brain wall_ms=1784269494105 mono_ms=4251974 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21418│CONN_LIFECYCLE: conn=8865 role=brain stream-subscriber stream=4110 wall_ms=1784269494105 mono_ms=4251974 event=stream-sub-attach stream=4110 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21419│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=1784269494367 mono_ms=4252236 event=stream-sub-attach stream=4111 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21420│CONN_LIFECYCLE: conn=8865 role=brain stream-subscriber stream=4110 wall_ms=1784269494411 mono_ms=4252280 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21421│CONN_LIFECYCLE: conn=8866 role=brain wall_ms=1784269494411 mono_ms=4252280 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21422│CONN_LIFECYCLE: conn=8866 role=brain wall_ms=1784269494411 mono_ms=4252280 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21450│CONN_LIFECYCLE: conn=8878 role=brain wall_ms=1784269494937 mono_ms=4252806 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21451│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=1784269495239 mono_ms=4253108 event=stream-sub-attach stream=4116 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21452│CONN_LIFECYCLE: conn=8879 role=brain wall_ms=1784269495477 mono_ms=4253346 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21453│CONN_LIFECYCLE: conn=8879 role=brain wall_ms=1784269495477 mono_ms=4253346 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21454│CONN_LIFECYCLE: conn=8880 role=brain wall_ms=1784269498347 mono_ms=4256216 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21800│CONN_LIFECYCLE: conn=9026 role=brain wall_ms=1784269555998 mono_ms=4313867 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21801│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=1784269556525 mono_ms=4314394 event=stream-sub-attach stream=4182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21802│CONN_LIFECYCLE: conn=9027 role=brain wall_ms=1784269556596 mono_ms=4314466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21803│CONN_LIFECYCLE: conn=9029 role=brain wall_ms=1784269556596 mono_ms=4314466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21804│CONN_LIFECYCLE: conn=9028 role=brain wall_ms=1784269556596 mono_ms=4314466 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21829│CONN_LIFECYCLE: conn=9038 role=brain wall_ms=1784269556705 mono_ms=4314574 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21830│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=1784269557405 mono_ms=4315274 event=stream-sub-attach stream=4187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21831│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=1784269559144 mono_ms=4317013 event=stream-sub-attach stream=4188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21832│CONN_LIFECYCLE: conn=9039 role=brain wall_ms=1784269559290 mono_ms=4317159 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 21833│CONN_LIFECYCLE: conn=9039 role=brain wall_ms=1784269559290 mono_ms=4317159 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 21834│CONN_LIFECYCLE: conn=9040 role=brain stream-subscriber stream=4189 wall_ms=1784269559290 mono_ms=4317159 event=stream-sub-attach stream=4189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 21838│CONN_LIFECYCLE: conn=9041 role=brain wall_ms=1784269559291 mono_ms=4317160 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*21839│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=1784269559365 mono_ms=4317234 event=stream-sub-attach stream=4190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21840│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=1784269559752 mono_ms=4317621 event=stream-sub-attach stream=4191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 21841│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 21842│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 21843│PAIR_MEET_UP:SPT_DEV step=59475652 id=70be67c4863a782be2ca8d8b829b4ea3cd7035166ced6fa79d93ed8de6e97bb6 addr=EndpointAddr { id: PublicKey(70be67c4863a782be2ca8d8b829b4ea3cd7035166ced6fa79d93ed8de6e97bb6), addrs: {Ip(100.68.35.65:57568), Ip(192.168.1.81:57568)} }\n      │...\n 22157│CONN_LIFECYCLE: conn=9172 role=brain stream-subscriber stream=4245 wall_ms=1784269627337 mono_ms=4385206 event=stream-sub-attach stream=4245 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22158│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=1784269627340 mono_ms=4385209 event=stream-sub-attach stream=4263 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22159│CONN_LIFECYCLE: conn=9172 role=brain stream-subscriber stream=4245 wall_ms=1784269627347 mono_ms=4385216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22160│CONN_LIFECYCLE: conn=9175 role=brain wall_ms=1784269627347 mono_ms=4385216 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22161│CONN_LIFECYCLE: conn=9175 role=brain wall_ms=1784269627347 mono_ms=4385216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 22189│CONN_LIFECYCLE: conn=9187 role=brain wall_ms=1784269627964 mono_ms=4385833 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22190│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=1784269628966 mono_ms=4386835 event=stream-sub-attach stream=4268 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22191│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=1784269629937 mono_ms=4387806 event=stream-sub-attach stream=4269 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22192│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=1784269630673 mono_ms=4388542 event=stream-sub-attach stream=4270 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22193│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=1784269631040 mono_ms=4388909 event=stream-sub-attach stream=4271 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22194│CONN_LIFECYCLE: conn=9188 role=brain wall_ms=1784269631687 mono_ms=4389556 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22195│CONN_LIFECYCLE: conn=9188 role=brain wall_ms=1784269631687 mono_ms=4389556 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22196│CONN_LIFECYCLE: conn=9189 role=brain wall_ms=1784269632726 mono_ms=4390595 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 22570│CONN_LIFECYCLE: conn=9346 role=brain wall_ms=1784269689105 mono_ms=4446974 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22571│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=1784269691352 mono_ms=4449221 event=stream-sub-attach stream=4336 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22572│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=1784269691786 mono_ms=4449655 event=stream-sub-attach stream=4337 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22573│CONN_LIFECYCLE: conn=9347 role=brain wall_ms=1784269692204 mono_ms=4450073 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22574│CONN_LIFECYCLE: conn=9347 role=brain wall_ms=1784269692204 mono_ms=4450073 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22575│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=1784269692526 mono_ms=4450395 event=stream-sub-attach stream=4338 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22576│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=1784269693186 mono_ms=4451055 event=stream-sub-attach stream=4339 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22577│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=1784269694521 mono_ms=4452390 event=stream-sub-attach stream=4340 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22578│CONN_LIFECYCLE: conn=9348 role=brain wall_ms=1784269696361 mono_ms=4454230 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22579│CONN_LIFECYCLE: conn=9348 role=brain wall_ms=1784269696361 mono_ms=4454230 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22580│CONN_LIFECYCLE: conn=9349 role=brain stream-subscriber stream=4341 wall_ms=1784269696362 mono_ms=4454230 event=stream-sub-attach stream=4341 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 22917│CONN_LIFECYCLE: conn=9491 role=brain wall_ms=1784269753163 mono_ms=4511031 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22918│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=1784269755082 mono_ms=4512950 event=stream-sub-attach stream=4405 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22919│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=1784269755524 mono_ms=4513393 event=stream-sub-attach stream=4406 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22920│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=1784269755773 mono_ms=4513641 event=stream-sub-attach stream=4407 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22921│CONN_LIFECYCLE: conn=9492 role=brain wall_ms=1784269756267 mono_ms=4514136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22922│CONN_LIFECYCLE: conn=9492 role=brain wall_ms=1784269756268 mono_ms=4514136 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22923│CONN_LIFECYCLE: conn=9493 role=brain wall_ms=1784269756269 mono_ms=4514137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 22941│CONN_LIFECYCLE: conn=9500 role=brain wall_ms=1784269756389 mono_ms=4514258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22942│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=1784269756753 mono_ms=4514622 event=stream-sub-attach stream=4411 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22943│CONN_LIFECYCLE: conn=9501 role=brain wall_ms=1784269757757 mono_ms=4515626 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22944│CONN_LIFECYCLE: conn=9501 role=brain wall_ms=1784269757757 mono_ms=4515626 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*22945│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=1784269758487 mono_ms=4516356 event=stream-sub-attach stream=4412 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 22946│CONN_LIFECYCLE: conn=9502 role=brain wall_ms=1784269760001 mono_ms=4517870 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22947│CONN_LIFECYCLE: conn=9502 role=brain wall_ms=1784269760001 mono_ms=4517870 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22948│CONN_LIFECYCLE: conn=9503 role=brain wall_ms=1784269760003 mono_ms=4517871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 23320│CONN_LIFECYCLE: conn=9660 role=brain wall_ms=1784269821442 mono_ms=4579311 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*23321│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=1784269821642 mono_ms=4579510 event=stream-sub-attach stream=4487 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23322│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=1784269822635 mono_ms=4580503 event=stream-sub-attach stream=4488 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 23323│CONN_LIFECYCLE: conn=9661 role=brain wall_ms=1784269822766 mono_ms=4580635 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23324│CONN_LIFECYCLE: conn=9661 role=brain wall_ms=1784269822766 mono_ms=4580635 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 23325│CONN_LIFECYCLE: conn=9662 role=brain stream-subscriber stream=4489 wall_ms=1784269822766 mono_ms=4580635 event=stream-sub-attach stream=4489 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 23345│CONN_LIFECYCLE: conn=9670 role=brain wall_ms=1784269823811 mono_ms=4581679 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*23346│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=1784269824602 mono_ms=4582471 event=stream-sub-attach stream=4492 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23347│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=1784269825304 mono_ms=4583173 event=stream-sub-attach stream=4493 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23348│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=1784269825449 mono_ms=4583318 event=stream-sub-attach stream=4494 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 23349│CONN_LIFECYCLE: conn=9671 role=brain wall_ms=1784269827848 mono_ms=4585716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23350│CONN_LIFECYCLE: conn=9673 role=brain wall_ms=1784269827848 mono_ms=4585716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23351│CONN_LIFECYCLE: conn=9672 role=brain wall_ms=1784269827848 mono_ms=4585716 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 23723│CONN_LIFECYCLE: conn=9829 role=brain wall_ms=1784269884412 mono_ms=4642280 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*23724│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=1784269885997 mono_ms=4643865 event=stream-sub-attach stream=4564 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23725│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=1784269886690 mono_ms=4644558 event=stream-sub-attach stream=4565 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23726│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=1784269887361 mono_ms=4645229 event=stream-sub-attach stream=4566 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23727│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=1784269888065 mono_ms=4645933 event=stream-sub-attach stream=4567 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*23728│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=1784269888410 mono_ms=4646279 event=stream-sub-attach stream=4568 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 23729│CONN_LIFECYCLE: conn=9830 role=brain wall_ms=1784269888871 mono_ms=4646740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 23730│CONN_LIFECYCLE: conn=9830 role=brain wall_ms=1784269888871 mono_ms=4646740 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 23731│CONN_LIFECYCLE: conn=9831 role=brain wall_ms=1784269889178 mono_ms=4647046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784272011161}}
{"type":"compaction","id":"42890b98","parentId":"83cc9ddb","timestamp":"2026-07-17T07:06:51.816Z","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# C:/Users/decid/AppData/Local/\nspt-core (Read)\n## spt-core/logs/\ndaemon.stderr.log (Read)\n# crates/\n## spt-daemon/src/\nattach.rs (Read)\nbroker.rs (Read)\nconfig.rs (Read)\nconn.rs (Read)\ndaemon.rs (Read)\ndispatch.rs (Read)\nnethost.rs (Read)\nregistryhost.rs (Read)\ntranslation.rs (Read)\n### pump/\nmod.rs (Read)\nregistry.rs (Read)\n## spt-store/src/\nperch.rs (Read)\n## spt-term/src/\npty.rs (Read)\nreader.rs (Read)\n# docs/adr/\n0038-broker-stream-lifecycle-truth.md (Read)\n\nHISTORY\n===================","shortSummary":"Archived 227,010 chars of history onto 15 snapcompact frames (+27,833 chars as text)","firstKeptEntryId":"c3280725","tokensBefore":263357,"details":{"readFiles":["C:/Users/decid/AppData/Local/spt-core","C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","crates/spt-daemon/src/attach.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/nethost.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/translation.rs","crates/spt-store/src/perch.rs","crates/spt-term/src/pty.rs","crates/spt-term/src/reader.rs","docs/adr/0038-broker-stream-lifecycle-truth.md"],"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":"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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":4353,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"}],"totalChars":227010,"truncatedChars":0,"text":"# User ¶█Complete the assignment below, thoroughly:█# Target█Broker PTY/session/stream handling in crates/spt-daemon; thread spawn sites and lifetime. Non-goal: brain routing.█# Change█Trace every long-lived broker thread creation, especially per-stream/per-connection writers and PTY readers. Explain whether ~537 threads can be legitimate for 6 sessions, where they should exit, and any missing cancellation/reap path.█# Acceptance█Rank concrete broker-side mechanisms with exact source citations and propose a safe live probe that does not stop hosted sessions.█# Assistant ¶█_**Planning parallel grep for spawn usage**_█# 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 daemon sources█glob(path=\"crates/spt-daemon/**/*\", hidden=true, gitignore=true, limit=500)█<out>█\u000e# crates/spt-daemon/█Cargo.toml█## src/█nethost.rs█dispatch.rs█broker.rs█attach.rs█brain.rs█msg.rs█seedproofx.rs█registryhost.rs█lib.rs█endpoint.rs█sync.rs█projwriter.rs█brainproc.rs█applyhost.rs█docshost.rs█daemon.rs█config.rs█update.rs█relcache.rs█release.rs█notif.rs█relay.rs█propagate.rs█livehost.rs█inject.rs█conn.rs█autostart.rs█stderrlog.rs█lifecycle.rs█digest.rs█pairhost.rs█xfer.rs█shellwake.rs█shellchan.rs█seedmap.rs█resting.rs█resthost.rs█linkhost.rs█effect.rs█adapter_update.rs█wan.rs█tunnelhub.rs█transport.rs█translation.rs█test_home.rs█shellhost.rs█shelldisc.rs█service.rs█serveprobe.rs█rollback_compat.rs█reconcile.rs█reap.rs█psyrelay.rs█presence.rs█notifsync.rs█machineid.rs█harnesshost.rs█grants.rs█frame.rs█drivehub.rs█digesthub.rs█deelevate.rs█deadline.rs█crc_swap.rs█consent.rs█codec.rs█access.rs█### pump/█mod.rs█health.rs█update.rs█sync.rs█registry.rs█notif.rs█### bin/█xlate_choreo_fixture.rs█## tests/█inject_control_wedge.rs█attach.rs█redispatch_stall.rs█false_promote.rs█conn_blackhole_lifecycle.rs█broker.rs█brain_decouple.rs█mesh_recovery.rs█redispatch.rs█input_ack_deadlock.rs█docs_server_e2e.rs█propagate.rs█pumpdeadline.rs█pump.rs█net_worker_starve.rs█brain_resume_conn_deadlock.rs█two_origin_spanning.rs█wake_single_flight.rs█endpoint_survival.rs█xfer.rs█wanmsg.rs█twohost.rs█replicate.rs█sync.rs█notifsync.rs█netstream.rs█netbroker.rs█idempotent.rs█dispatch.rs█daemon_e2e.rs█access.rs█shellchan.rs█seedproofx.rs█rosterprop.rs█resume.rs█reseed.rs█psyche_residency_expectation_e2e.rs█psyche_event_turn_e2e.rs█psyche_context_file_e2e.rs█presence.rs█pairjoin.rs█mesh.rs█legacy_resident_sweep_e2e.rs█handoff.rs█driven_by_selfheal.rs█digest.rs█daemon_lifecycle_real_brain.rs█control_stamp_lifetime.rs█budget.rs█brain_swap.rs█### fixtures/█dispatch_fixture.rs\u000f█</out>█# Tool call ¶█//Finding spawn sites█grep(pattern=\"thread::spawn|std::thread|tokio::spawn|task::spawn|spawn_blocking|Builder::new\\\\(\\\\).*spawn|\\\\.spawn\\\\(\", path=\"crates/spt-daemon\", 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|}█...█493| broker: Arc<Broker>,█*494| handle: Option<std::thread::JoinHandle<()>>,█495| }█496| impl std::ops::Deref for ServedBroker {█497| type Target = Arc<Broker>;█...█513| let serve = Arc::clone(&broker);█*514| let handle = std::thread::spawn(move || {█515| let _ = serve.serve();█516| });█517| ServedBroker {█...█560| }█*561| std::thread::sleep(Duration::from_millis(10));█562| }█563| panic!(\"brain cold-start could not connect\");█564| }█## attach.rs█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| }█...█[...23253ch elided...] hread::sleep(Duration::from_millis(30)); // distinct mtime/len either way█1006| spt_store::gitrun::run_git_ok(█1007| &[█1008| \"-C\",█...█1082| assert!(Instant::now() < deadline, \"boot cycle never settled\");█*1083| std::thread::sleep(Duration::from_millis(25));█1084| }█1085| let enums_after_boot = stats().unwrap().cumulative.branch_enumerations;█1086|█...█1098| assert!(Instant::now() < consumed, \"burst never consumed\");█*1099| std::thread::sleep(Duration::from_millis(25));█1100| }█1101| let s = stats().unwrap();█1102| stop.store(true, Ordering::SeqCst);█Showing files 1-20 of 77+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Finding PTY stream loops█grep(pattern=\"pty|Pty|stream|writer|reader|connection|accept\\\\(|recv\\\\(|read\\\\(|write\\\\(|loop \\\\{\", path=\"crates/spt-daemon/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## access.rs█15|//! endpoint's identity or home. The subject value MUST be the QUIC█*16|//! handshake-proven remote node id from the broker's conn/stream table,█17|//! never a payload field (REQ-HAZARD-WAN-ORIGIN-AUTH).█18|//! - **Outbound** -> any visible node: the whitelist never restricts who an█19|//! endpoint talks *to*.█...█28|//! origin that *is* this node (a loopback self-dial) short-circuits Allow.█*29|//! - **Default absent = open**; setting a whitelist restricts (an empty entry█30|//! = locked down). Node-tier ships M4 (Ed25519 node pubkeys); the user tier█31|//! is an inert schema reservation until the cross-user model (ADR-0006).█32|//!█...█35|//! an `spt access` edit takes effect on the next inbound without a daemon█*36|//! restart, and the checks run at message/stream-establishment rate where a█37|//! small-file read is noise.█38|//!█39|//! **Class policy:** only the *message* funnel ([`crate::wan`]) classifies█...█143| // restricted endpoint admits listed nodes and refuses unlisted ones;█*144| // an empty entry is locked down; other endpoints stay open.█145| #[test]█146| fn gate_decision_table() {█147 [...49084ch elided...]█*703| Ok(v) if !v.is_empty() => vec![(\"SPT_HOME\".to_string(), v)],█704| _ => Vec::new(),█705| }█706| }█...█751| let mut overlaid: Vec<u16> = Vec::new();█*752| let env_ptr = if env_built && !overrides.is_empty() {█753| let raw = unsafe { env_block_to_vec(env as *const u16) };█754| overlaid = super::apply_env_overrides(&raw, &overrides);█755| overlaid.as_mut_ptr() as *mut core::ffi::c_void█...█841| if u == 0 {█*842| if cur.is_empty() {█843| break;█844| }█845| out.push(String::from_utf16_lossy(&cur));█...█905| let file = dir.path().join(\"default-user\");█[Showing lines 1-1013 of 1314 (50.0KB limit). Use :1014 to continue]\u000f█</out>█# Assistant ¶█_**Tracing broker thread creation and lifecycle**_█# Tool call ¶█//Finding all broker spawns█grep(pattern=\"thread::spawn|thread::Builder|std::thread::spawn|std::thread::Builder|runtime\\\\.spawn|tokio::spawn\", path=\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## broker.rs█947| let writer_blocked = Arc::clone(&write_blocked_since);█*948| let writer = thread::spawn(move || {█949| controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)█950| });█951| self.controller = Some(ControllerSink {█...█1137| let writer =█*1138| thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));█1139| self.viewers.insert(█1140| vid,█1141| ViewerSink {█...█1789| let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());█*1790| let writer = thread::spawn(move || input_writer(session, rx));█1791| Arc::new(InputWriter {█1792| tx,█1793| backpressure: AtomicBool::new(false),█...█1991| let sup_endpoint = endpoint_id.to_string();█*1992| thread::spawn(move || {█1993| run_inject_worker_supervised(█1994| sup_child,█1995| sup_faulted,█...█2794| let me = Arc::clone(self);█*2795| thread::spawn(move || {█2796| let _ = me.hand [...5314ch elided...] ::clone(&net_canary_tick_ms);█*1288| runtime.spawn(async move {█1289| let mut ivl = tokio::time::interval(Duration::from_millis(25));█1290| loop {█1291| ivl.tick().await;█...█1491| let gauge = Arc::clone(&self.active_dial_tasks);█*1492| self.runtime.spawn(async move {█1493| gauge.fetch_add(1, Ordering::Relaxed);█1494| let _dial_guard = DialGauge(gauge);█1495| // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline█...█2258| let sent = Arc::clone(&sent);█*2259| std::thread::spawn(move || {█2260| for f in &frames {█2261| host.send_stream(owner, f, false).expect(\"send\");█2262| sent.fetch_add(1, AtOrd::Relaxed);\u000f█</out>█# Tool call ¶█//Locating PTY implementation█grep(pattern=\"struct PtySession|impl PtySession|pub fn spawn|fn wait\\\\(|impl Drain|reader|read_loop|thread::spawn|thread::Builder\", path=\"crates\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## applyhost.rs█513| let serve = Arc::clone(&broker);█*514| let handle = std::thread::spawn(move || {█515| let _ = serve.serve();█516| });█517| ServedBroker {█## attach.rs█140|/// bounded channel is full (a controller that falls behind its own echo under a█*141|/// hard flood). The next frame this reader sees is then a FORWARD gap that the█142|/// strict reject-gap (`read_event`, legacy single-session path) FATALS. A█143|/// controller CANNOT snap-above like a viewer (B2: it is authoritative - it█144|/// advances `delivered_through`; skipping rolled frames would be a not-exactly-once█## autostart.rs█133| let (tx, rx) = mpsc::channel();█*134| let handle = std::thread::spawn(move || {█135| replay_startup_endpoints(\"bogus-broker-socket-never-dialed\");█136| let _ = tx.send(());█137| });█## brain.rs█200|/// -> deprecated `PIPE_NOWAIT`, which corrupts mid-stream - proven by the mesh█*201|/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader█202|/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each█203|/// framed result [...20833ch elided...] ct(\"send\");█2262| sent.fetch_add(1, AtOrd::Relaxed);█## bin/█### xlate_choreo_fixture.rs█12|//! On an `event` we emit (here -> spt-core, one JSON object per line on stdout,█*13|//! flushing each so the broker's reader sees them promptly):█14|//! `{\"key\":\"ctrl+s\"}` `{\"delay_ms\":50}` `{\"text\":\"XLATE_OK\"}` `{\"key\":\"enter\"}`█15|//! `{\"delay_ms\":50}` `{\"key\":\"ctrl+s\"}` then `{\"commit\":true}`.█16|//!█...█82|█*83| // Emit the choreography, flushing each line so the broker's line-reader█84| // applies it promptly (the delays are part of the sequence the broker█85| // honors, not a wall-clock the test asserts on).█86| emit(&mut out, r#\"{\"key\":\"ctrl+s\"}\"#);█Showing files 1-20 of 176+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Locating broker structures█grep(pattern=\"struct (ControllerSink|ViewerSink|InputWriter|OutputLog|HostedSession|Broker)|fn (controller_writer|viewer_writer|input_writer|handle_conn|serve|spawn_session|append|unsubscribe|retire)|impl Drop\", path=\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## broker.rs█117|/// dropped (the `tx` closes -> the writer ends) and removed from the map.█*118|struct ViewerSink {█119| /// The bounded live-frame queue to this viewer's writer thread.█120| tx: SyncSender<Envelope>,█121| /// The viewer's IPC send half - kept ONLY for identity matching on detach█...█210|█*211|impl Drop for WakeClaimGuard<'_> {█212| fn drop(&mut self) {█213| recover(self.set).remove(&self.endpoint);█214| }█...█493|/// on a single full `try_send` - only after [`CONTROLLER_WRITE_DEADLINE`].█*494|struct ControllerSink {█495| /// The bounded live-frame queue to the controller's writer thread.█496| tx: SyncSender<CtrlMsg>,█497| /// The controller's IPC send half - kept for identity matching on detach and█...█544|/// `Mutex<OutputLog>` is held, so frames reach each sink in strict `seq` order.█*545|struct OutputLog {█546| session_id: u64,█547| next_seq: u64,█548| ring: VecDeque<(u64, Vec<u8>)>,█...█800|█*801| fn append(&mut self, bytes: &[u8]) -> Option<u64> {█802| let seq = self.next_seq;█803| self.next_seq += 1;█804| self.ring.push_back((seq, bytes.to_vec()));█... [...6518ch elided...] loopback_pair().expect(\"open pair\");█2397| host.send_stream(owner, b\"{\\\"kind\\\":\\\"request\\\",\\\"session_id\\\":1}\\n\", false)█...█2434| #[test]█*2435| fn retired_row_still_flushes_a_late_reply() {█2436| let host = NetHost::start(hermetic(&Identity::generate())).expect(\"host start\");█2437| let (owner, shell) = host.open_loopback_pair().expect(\"open pair\");█2438| // The requester's one-shot request: write + FIN (the rest/sync shape -█...█2560| #[test]█*2561| fn append_halts_at_first_failed_write_removes_the_seat_and_cancels_the_lease() {█2562| let (sub, client, _recv) = seat_socket_pair(Duration::from_secs(5));█2563| let mut log = StreamLog::new(7, 64);█2564| assert_eq!(log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\"), 0);\u000f█</out>█# Tool call ¶█//Finding stream task lifecycle█grep(pattern=\"register_stream|remove\\\\(&.*stream|streams.*remove|retire_stream|NetStream|send_stream|RecvHalf|writer_poisoned|accept_bi|closed\\\\(\\\\)\", path=\"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/broker.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## nethost.rs█50| net_presence_event_envelope, net_stream_data_envelope, net_stream_eof_envelope,█*51| NetPresenceEvent, NetStreamInfo, PRESENCE_CONNECTED, PRESENCE_DIAL_FAILED, PRESENCE_DISCONNECTED,█52|};█53|█54|/// The reserved [`crate::effect::EffectKey`] session namespace for net-scoped█...█59|/// Broker-side QUIC-op deadline (REQ-HAZARD-BROKER-QUIC-DEADLINE), in ms. Each█*60|/// brain-waiting QUIC await - `dial` / `open_stream` / `send_stream` - is bounded█61|/// by this so a black-holed or dead peer fails PROMPTLY with an ORDINARY error█62|/// the broker replies, never an unbounded await that wedges the single-threaded█63|/// pump (the B-half of REQ-HAZARD-PUMP-IPC-DEADLINE; the 2.2h hfenduleam wedge).█...█194| let writer_done = Arc::clone(&done);█*195| let writer_poisoned = Arc::clone(&poisoned);█196| std::thread::spawn(move || {█197| let poison = |halt_reason: &str| {█*198| writer_poisoned.store(true, Ordering::Release);█199| if let Some(l) = &lease {█200| l.cancel();█201| }█...█256|/// mechanism): canceled when the stream's subscrib [...7936ch elided...] ect(\"NetStreamOpenerReply serializes\"),█4418| );█4419| send_frame(send, &frame);█4420| Ok(())█...█4430| ) -> Result<u64, String> {█*4431| let req: NetStreamSubscribeReq = serde_json::from_value(env.payload)█4432| .map_err(|e| format!(\"bad net-stream-subscribe payload: {e}\"))?;█4433| let host = self.net.get().ok_or(\"net disabled\")?;█4434| host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)█...█5575| /// `conn.split()`.█*5576| fn controller_socket_pair() -> (SharedSend, Stream, interprocess::local_socket::RecvHalf) {█5577| use std::sync::atomic::AtomicU32;█5578| // A process-unique pipe/UDS name so parallel test threads never collide.█5579| static SEQ: AtomicU32 = AtomicU32::new(0);\u000f█</out>█# Assistant ¶█_**Locating exact spt-term crate**_█# Tool call ¶█//Mapping terminal crate█glob(path=\"crates/spt-term/**/*\", hidden=true, gitignore=true, limit=300)█<out>█\u000e# crates/spt-term/█Cargo.toml█## src/█screen.rs█winprog.rs█surface.rs█stream.rs█reader.rs█pty.rs█projection.rs█lib.rs█digest.rs█## tests/█winspawn.rs█surface.rs█stream.rs█inject.rs█dsr.rs\u000f█</out>█# Tool call ¶█//Reading broker sink definitions█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"70-180,470-640,780-880,900-1170\")█<out>█\u000euse crate::msg::{█...█};█use crate::nethost::{NetHost, NET_EFFECT_SESSION};█use crate::translation::{key_to_bytes, InjectFloor, KeyCmd, ToBinary, TranslationChild};█use crate::transport::{recv_hello, DaemonTransport, LocalSocketTransport};█/// The shared, serialized send side of one brain connection. Output frames,█/// replay frames, command acks, and exit/error events all write through this.█/// `pub(crate)`: the net host's stream logs (D4b) live-send through the same█/// handle under the same gate discipline. Round-4█/// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): no longer a raw█/// `Arc<Mutex<SendHalf>>` - [`BrokerConn`] owns the half and every write is█/// bounded + cancelable + poison-on-failure (see [`crate::conn`]). Identity█/// matching stays `Arc::ptr_eq`.█pub(crate) type SharedSend = Arc<BrokerConn>;█/// Default bounded output-log depth (chunks). Large enough that a brain restart█/// window never evicts unreplayed output in practice; the bound is what keeps a█/// disconnected session from buffering without limit.█const DEFAULT_LOG_CHUNKS: usize = 4096;█/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it█/// OVERFLOWS the viewer is e [...33777ch elided...] take / viewer add / loud displace as a side effect. See the█/// identity matrix in the body - the `by`-keyed logic is what makes a█/// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.█fn resolve_subscribe(█&mut self,█sub: SharedSend,█from_seq: u64,█intent: AttachIntent,█by: Option<String>,█gen: u64,█) -> SubscribeOutcome {█if intent == AttachIntent::Viewer {█if self.viewers.len() >= MAX_VIEWERS {█// Soft cap reached - refuse the viewer (bounds thread count).█return SubscribeOutcome::BusyControlled {█by: \"viewer cap reached\".to_string(),█};█}█self.add_viewer(sub, from_seq);█...█}█...█}\u000f█</out>█# Tool call ¶█//Reading broker writer loops█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"1390-1625,1680-1865\")█<out>█\u000eimpl OutputLog {█...█fn stamp_reaped(&self) {█if self.endpoint.is_empty() {█return;█}█let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);█let _ = spt_store::info::set_driven_by(&perch, None);█let _ = spt_store::info::set_controlled(&perch, false);█let _ = spt_store::info::set_viewer_count(&perch, 0);█}█/// Whether `sub` is the current controller (the resize-exclusivity check).█fn is_controller(&self, sub: &SharedSend) -> bool {█self.controller█.as_ref()█.is_some_and(|c| Arc::ptr_eq(&c.send, sub))█}█/// The next seq a re-attaching controller still needs (the persisted resume█/// cursor surfaced in `KIND_SESSIONS` -> `resume_seq`). W1: read from the█/// atomic the controller writer thread advances.█fn delivered_through(&self) -> u64 {█self.delivered_through.load(Ordering::Acquire)█}█}█/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the█/// `initial` batch (size frame + ring replay) once, then drain live frames from█/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the█/// thre [...19005ch elided...] the per-session inject floor, RECOVERING a poisoned mutex instead of█/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the█/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the█/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under█/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then█/// panics too - and a panic in the inject WORKER kills its thread WITHOUT reaping█/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so█/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the█/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").█/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\u000f█</out>█# Tool call ¶█//Reading broker accept handling█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"2540-2840,3000-3140\")█<out>█\u000efn fault_translation_stamped(█...█) {█...█fault_translation(faulted, child, why);█}█/// FAULT a translation binary: mark the session degraded (so inbound delivery█/// SPOOLS until a working binary and `dispatch_input` stops pinging), log it, and█/// reap the child. The dispatch path bounded-respawns from this state█/// (REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH) - idle inbound spools (poll-fed,█/// never raw-injected) until a respawn lands or the give-up budget is exhausted.█fn fault_translation(faulted: &AtomicBool, child: &TranslationChild, why: &str) {█faulted.store(true, Ordering::Relaxed);█eprintln!(█\"TRANSLATION_FAULT: {why} - terminating binary; idle messages spool until a respawn or a working binary\"█);█child.terminate();█}█/// The broker process kernel. Owns the listening socket, the table of hosted█/// sessions, and the broker-owned idempotency anchor (B5); holds no logic state█/// (ADR-0004 §B). The [`EffectJournal`] is a §B resource - the durable█/// recovery anchor a brain crash must not lose, so it lives in the broker, not█/// the brain (Spike #6 constraint 1).█pub struct Broker {█listener: LocalSocketTransport,█/// The namespaced li [...19615ch elided...] dispatch_pair_meet(env, &send) {█send_error(&send, &msg);█}█}█KIND_PAIR_CODE_SUBMIT => {█if let Err(msg) = self.dispatch_pair_code_submit(env, &send) {█send_error(&send, &msg);█}█}█KIND_NET_STREAM_OPEN => {█if let Err(msg) = self.dispatch_net_stream_open(env, &send) {█send_error(&send, &msg);█}█}█KIND_NET_STREAM_SEND => {█if let Err(msg) = self.dispatch_net_stream_send(env, &send) {█send_error(&send, &msg);█}█}█...█}█}█...█}█...█}\u000f█</out>█# Tool call ¶█//Reading connection watchdog█read(path=\"crates/spt-daemon/src/conn.rs\", selector=\"140-190,210-380,400-470,620-675\")█<out>█\u000e/// the watchdog must not keep the conn alive).█struct Inner {█/// Stable per-physical-conn id ([`CONN_ID_SEQ`]) - on every lifecycle record.█id: u64,█/// Accreted attribution facts (subscriber role, endpoint/session where█/// known - [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].█label: Mutex<String>,█/// Latch: the once-per-conn `write-start` lifecycle record fired.█first_write_logged: AtomicBool,█gate: Mutex<Gate>,█gate_cv: Condvar,█dog: Mutex<Dog>,█dog_cv: Condvar,█/// Idempotently latched on the first deadline/failure/cancel. A poisoned█/// conn refuses every future write and is never re-gated.█poisoned: AtomicBool,█/// Latched when the retirement was DEADLINE-driven (watchdog fired, or a█/// gate-waiter exhausted its bound) - as opposed to an organic I/O error█/// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can█/// count the wedge (the W2 stall-evict tally) without conflating it with█/// an ordinary disconnect.█timed_out: AtomicBool,█/// The physical sever ran (exactly once; Windows `DisconnectNamedPipe`).█severed: AtomicBool,█/// A retired (poisoned) half parks [...13060ch elided...] self.inner.timed_out.load(Ordering::Acquire)█),█);█{█let mut d = recover(&self.inner.dog);█d.shutdown = true;█self.inner.dog_cv.notify_all();█}█if let Some(dog) = self.dog.take() {█let _ = dog.join();█}█// Halves (gate or graveyard) drop AFTER the watchdog is gone - no raw█// handle use can race the CloseHandle/limbo path.█}█}█fn poisoned_err() -> io::Error {█io::Error::new(█io::ErrorKind::BrokenPipe,█\"broker conn poisoned (bounded write retired the physical connection)\",█)█}█fn timeout_err() -> io::Error {█io::Error::new(█io::ErrorKind::TimedOut,█\"broker conn write exceeded its bound (conn poisoned + aborted)\",█)█}\u000f█</out>█# Tool call ¶█//Reading network writer tasks█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"130-280,900-1085,1180-1310,1460-1525,1810-1875\")█<out>█\u000e/// either, but only a POISON (real write failure on the conn) cancels the█/// stream's lease; an overflow is a slow-but-healthy brain being detached.█// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]█#[derive(Debug, Clone, Copy, PartialEq, Eq)]█enum SeatFail {█/// The writer thread died on a failed conn write (the 15s bounded-write█/// poison class) - halt-at-first-failure already happened writer-side.█Poisoned,█/// The bounded queue is full - the subscriber cannot keep up.█Overflow,█}█/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment█/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the█/// log mutex; the conn I/O - the deadline-bounded `SharedSend::write` that can█/// take 15s against a wedged conn - runs on this seat's OWN writer thread,█/// OUTSIDE every lock. The field stall was exactly the old shape's serial█/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).█///█/// Writer discipline: the thread HALTS at the FIRST failed write (no█/// discarded-errors iteration) and marks the seat poisoned; the next enqueue█/// sees it and the caller removes the seat. Dropping the seat drops the queue█[...25014ch elided...] er `None` = no opener pinned (first `\\n`█/// not yet arrived, or capture gave up bounded).█// [impl->REQ-STREAM-OPENER-DURABLE]█pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {█let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);█// A retired row answers no-such-stream: classification exists only to█// serve, and a retired exchange must never be served again.█if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {█return None;█}█let line = entry.log.lock().unwrap().opener_line();█Some(line)█}█/// Mark a held stream **retentive** with backpressure `cap` chunks (M11-W3,█/// REQ-SHELL-4): its read log stops evicting (no byte loss) and its read pump\u000f█</out>█# Assistant ¶█_**Gathering handle_conn and dispatch details**_█# Tool call ¶█//Finding terminal thread sites█grep(pattern=\"thread::spawn|thread::Builder|std::thread::spawn|std::thread::Builder|spawn_blocking|tokio::spawn\", path=\"crates/spt-term/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-term/src/█## reader.rs█119|█*120| let handle = thread::spawn(move || {█121| let mut reader = reader;█122| let mut matcher = DsrMatcher::default();█123| let mut buf = [0u8; 8192];\u000f█</out>█# Tool call ¶█//Finding PTY lifecycle methods█grep(pattern=\"pub struct PtySession|impl PtySession|impl SessionSurface for PtySession|pub struct Drain|fn drain|fn stop|fn wait|fn kill|impl Drop\", path=\"crates/spt-term/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-term/src/█## pty.rs█34|/// [`PtySession::wait`] / [`PtySession::kill`].█*35|pub struct PtySession {█36| /// The master end, behind a lock so `resize` never races the reader (Spike #5).█37| master: Mutex<Box<dyn MasterPty + Send>>,█38| /// The single PTY writer, shared so the A2 drain thread can answer DSR.█...█50|█*51|impl PtySession {█52| /// Spawn `cmd` under a fresh native PTY sized to `size`.█53| ///█54| /// The slave end is dropped immediately after the child is spawned: the█...█202| /// Block until the child exits, yielding its status.█*203| pub fn wait(&self) -> Result<ExitStatus, SurfaceError> {█204| self.child.lock().unwrap().wait().map_err(SurfaceError::Io)█205| }█206|█...█209| /// [`PtySession::wait`] / [`PtySession::try_wait`].█*210| pub fn kill(&self) -> Result<(), SurfaceError> {█211| let res = self.killer.lock().unwrap().kill();█212| #[cfg(windows)]█213| {█...█234|// [impl->REQ-TERM-1]█*235|impl SessionSurface for PtySession {█236| fn write_input(&self, bytes: &[u8]) -> Result<(), SurfaceError> {█237| let mut w = self.writer.lock().unwrap();█238| w.write_all [...316ch elided...] surface's output on a background thread, answering█164| /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master█165| /// reader (once - a second call returns [`SurfaceError::ReaderTaken`]).█...█169| // [impl->REQ-HAZARD-CONPTY-DSR]█*170| pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>█171| where█172| S: FnMut(&[u8]) + Send + 'static,█173| {█## stream.rs█51| /// and the cooperative stop flag.█*52| pub fn drain(&self) -> &Drain {█53| &self.drain█54| }█55|█...█61|█*62|impl PtySession {█63| /// Stream this surface's output through a bounded channel of `capacity`█64| /// chunks. `capacity == 0` is a rendezvous channel (maximum backpressure:█65| /// every chunk blocks until the consumer takes it).\u000f█</out>█# Tool call ¶█//Reading connection cleanup█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"3024-3270\")█<out>█\u000e /// sessions it subscribed to - the sessions themselves persist (B2: a brain█/// restart must not disturb the hosted children).█fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {█// RAII handler tally (panic-safe): the round-4 gate's seam for \"the█// poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).█struct HandlerTally<'a>(&'a AtomicUsize);█impl Drop for HandlerTally<'_> {█fn drop(&mut self) {█self.0.fetch_sub(1, Ordering::AcqRel);█}█}█self.conn_handlers.fetch_add(1, Ordering::AcqRel);█let _tally = HandlerTally(&self.conn_handlers);█let (mut recv, send) = conn.split();█// Round-4: the send half is owned by the bounded/cancelable conn█// primitive from birth - every write on this physical connection is█// deadline-bounded, and a wedge poisons + retires the conn.█// [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]█let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));█// Base attribution fact (F-039 leg b): broker clients are brains; role█// f [...10552ch elided...] riber but leave the sessions running.█// Clone the log Arcs out from under the sessions lock FIRST (ADR-0038█// Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json█// (`viewer_count`/`driven_by`) and emits a lifecycle record - file +█// conn I/O that must never run under the shared sessions table lock,█// or one slow perch write stalls every spawn/attach/kill dispatch.█// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]█let logs: Vec<Arc<Mutex<OutputLog>>> = {█let sessions = recover(&self.sessions);█my_subs█.iter()█.filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))█.collect()█};█...█}█[Showing lines 3023-3273 of 6298. Use :3274 to continue]\u000f█</out>█# Tool call ¶█//Reading session spawn lifecycle█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"3330-3505\")█<out>█\u000e let _wake_claim: Option<WakeClaimGuard> = if req.endpoint.is_empty() {█...█} else {█...█loop {█...█let gate = {█...█let live = sessions█...█.find(|(_, h)| h.endpoint == req.endpoint)█.map(|(sid, h)| (*sid, h.session.process_id()));█match wake_gate_decision(█live.is_some(),█inflight.contains(&req.endpoint),█Instant::now() >= deadline,█) {█WakeGate::AlreadyLive => {█let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");█Gate::AlreadyLive(sid, spid)█}█WakeGate::Racing => Gate::Racing,█WakeGate::Claim => {█inflight.insert(req.endpoint.clone());█Gate::Claimed(WakeClaimGuard {█set: &self.wake_inflight,█endpoint: req.endpoint.clone(),█})█}█[...6917ch elided...] ;█recover(&self.sessions).insert(█id,█HostedSession {█session,█input,█drain,█log,█endpoint: req.endpoint.clone(),█translation,█translation_argv: req.translation_binary.clone(),█translation_respawns,█adapter: req.adapter.clone(),█install_dir: req.install_dir.clone().map(std::path::PathBuf::from),█},█);█let resp = Spawned {█session_id: id,█pid,█};█let frame = Envelope::new(█KIND_SPAWNED,█serde_json::to_value(resp).expect(\"Spawned serializes\"),█);█[Showing lines 3329-3508 of 6298. Use :3509 to continue]\u000f█</out>█# Tool call ¶█//Reading network stream log lifecycle█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"280-590,740-890,1000-1080,1750-1870\")█<out>█\u000e/// ring and held until the stream row goes away. Recovery classifies from█/// this fact, never from ring seq 0 (which a bounded ring evicts under█/// traffic - the abandoned-active-stream leg of the hertz RCA).█enum OpenerCapture {█/// Still hunting the first `\\n` - holds every byte seen so far.█Buffering(Vec<u8>),█/// The complete first line (newline excluded), immutable from here on.█Pinned(Vec<u8>),█/// No newline within [`OPENER_PIN_MAX`] - not an NDJSON opener; give up█/// bounded (classification reads this as \"no opener\").█Oversize,█}█/// Transport backing a held connection. A real `Quic` connection (the only█/// kind an inbound handshake can produce), or a broker-minted `Loopback` -█/// an in-process connection with NO iroh handshake whose identity IS this node,█/// established BY CONSTRUCTION. A loopback conn can ONLY be minted broker-side█/// via [`NetHost::dial_loopback`]; it can never arise from an inbound handshake█/// (a remote always presents its own key and cannot claim to be us). This is█/// what lets a LOCAL `spt rc` ride the byte-identical `serve_attach` pump (M12█/// W1.5, B1) - QUIC self-dial is refused by iroh (\"Connecting to ourse [...28926ch elided...] /// The stream's pinned opener line (ADR-0038 B) - the restart-durable█/// classification fact, independent of the evictable data ring. Outer█/// `None` = no such stream; inner `None` = no opener pinned (first `\\n`█/// not yet arrived, or capture gave up bounded).█// [impl->REQ-STREAM-OPENER-DURABLE]█pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {█let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);█// A retired row answers no-such-stream: classification exists only to█// serve, and a retired exchange must never be served again.█if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {█return None;█}█let line = entry.log.lock().unwrap().opener_line();█...█}\u000f█</out>█# Tool call ¶█//Finding broker introspection surfaces█grep(pattern=\"conn_handler_count|stream_infos|session_count|net_conn_count|broker-image|BrokerImage|StallEvicts|daemon status\", path=\"crates/spt-daemon/src; crates/spt-cli/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## applyhost.rs█909| assert_eq!(█*910| broker.session_count(),█911| 1,█912| \"exactly one session across the apply\"█913| );█...█1051| assert_eq!(std::fs::read(&exe).unwrap(), b\"NEW WITHOUT SESSIONS\");█*1052| assert_eq!(broker.session_count(), 0);█1053| }█1054|█1055| // [unit->REQ-UPD-6] Broker-touching debug/update-set payloads are accepted█## brain.rs█37|use crate::msg::{█*38| decode_bytes, encode_bytes, AdapterApplyReq, AppliedEvent, BrainRestarted, BrokerImageReply, StallEvictsReply, DisplacedEvent,█39| EndpointInjected, EndpointInputReq, ErrorEvent, ExitEvent,█40| InputReq,█41| KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,█...█1143| KIND_BROKER_IMAGE_REPLY => {█*1144| let ev: BrokerImageReply = serde_json::from_value(env.payload)█1145| .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;█1146| return Ok(Some(ev.version));█1147| }█...█1160| /// is too old to answer (an older broker replies `unknown command kind`), read as█[...11401ch elided...] b heartbeat: PathBuf,█263| /// `rotation-pending.json` (Mesh-D7, REQ-MESH-4): the timeboxed seed-rotation█...█1167|/// Write the pump's last-tick heartbeat (epoch ms) - the liveness fact█*1168|/// `spt daemon status` renders and the `subnet status` stall warning reads█1169|/// (M8 decision 23). Best-effort: a failed write costs honesty, never the█1170|/// pump (and the reader treats an absent/unreadable file as \"no heartbeat█1171|/// recorded\", not as healthy).█...█1803| // stamp at the given path (creating parents) and a later write advances█*1804| // it - what the D1 `daemon status` reader + stall warning consume.█1805| #[test]█1806| fn heartbeat_writes_and_advances() {█1807| let dir = tempfile::tempdir().unwrap();█Skipped missing paths: crates/spt-cli/src\u000f█</out>█# Assistant ¶█_**Analyzing Drain drop behavior**_█# Tool call ¶█//Reading PTY ownership█read(path=\"crates/spt-term/src/pty.rs\", selector=\"1-270\")█<out>█\u000e//! Native-PTY session backend - ConPTY on Windows 10+, `forkpty(3)` on Unix,█//! both via `portable-pty` (the exact crate + handoff shape Spikes #1 / #4█//! proved).█//!█//! [`PtySession`] spawns a child under a real PTY, owns the master reader and█//! writer, and serves the [`SessionSurface`] contract. It is **single-surface█//! per handle** - one child's PTY, not the multiplexed fleet (that supervisor is█//! the M3b broker).█//!█//! ## Concurrency discipline (Spike #5, binding)█//!█//! `resize()` races the reader thread on Windows; the master is therefore held█//! behind a `Mutex` and every `resize` takes that lock. The writer is a shared█//! `Arc<Mutex<...>>` so the A2 DSR drain thread can answer ConPTY's startup█//! cursor query through the same serialized writer the caller injects input█//! through - no torn writes.█use std::io::{Read, Write};█use std::sync::{Arc, Mutex};█use portable_pty::{native_pty_system, Child, ChildKiller, CommandBuilder, ExitStatus, MasterPty};█use crate::surface::{SessionSurface, SurfaceError, SurfaceSize};█/// Shared, serialized handle to the PTY master writer. Cloned to the A2 drain█/// thread so the DSR auto-answer and caller input never interlea [...8108ch elided...] ();█w.write_all(bytes).map_err(SurfaceError::Io)?;█w.flush().map_err(SurfaceError::Io)█}█fn resize(&self, size: SurfaceSize) -> Result<(), SurfaceError> {█// Hold the master lock so resize never races a concurrent reader/resize█// (Spike #5: resize races the reader on Windows).█self.master█.lock()█.unwrap()█.resize(size.into())█.map_err(|e| SurfaceError::Io(io_other(e)))█}█}█/// Fold a `portable-pty` error (a private `anyhow::Error` alias) into a█/// `std::io::Error` so the crate's public surface never leaks `anyhow`. Generic█/// over `Display` to avoid naming the un-exported error type.█fn io_other<E: std::fmt::Display>(e: E) -> std::io::Error {█std::io::Error::other(e.to_string())█}█\u000f█</out>█# Tool call ¶█//Reading PTY drain lifecycle█read(path=\"crates/spt-term/src/reader.rs\", selector=\"1-230\")█<out>█\u000e//! Output drain pump - the ConPTY-DSR auto-answer reader (M3a A2).█//!█//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child█//! stdout until the terminal answers it** (Spike #1: a run captured exactly the█//! 4 bytes `\\e[6n` and zero program output - the child looked dead but was█//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).█//! Whether the query fires is build- and program-dependent (some ConPTY versions█//! never emit it for short commands; an app that queries DSR itself always█//! will). A real terminal *is* expected to answer DSR regardless, so the pump█//! answers every `ESC[6n` it sees on every platform unconditionally - harmless█//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY█//! that does withhold. The auto-answer is verified deterministically by injecting█//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).█//!█//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master█//! does *not* EOF while the writer is held, so the read loop runs on its own█//! thread and shutdown **never gates on a blocking `read()` returning**. The█//! bro [...7236ch elided...] Ok(n)█}█None => Ok(0),█}█}█}█/// A writer capturing everything written, behind the SharedWriter shape.█fn capturing_writer() -> (SharedWriter, Arc<Mutex<Vec<u8>>>) {█struct Cap(Arc<Mutex<Vec<u8>>>);█impl Write for Cap {█fn write(&mut self, b: &[u8]) -> std::io::Result<usize> {█self.0.lock().unwrap().extend_from_slice(b);█Ok(b.len())█}█fn flush(&mut self) -> std::io::Result<()> {█Ok(())█}█}█let sink = Arc::new(Mutex::new(Vec::new()));█let w: SharedWriter = Arc::new(Mutex::new(Box::new(Cap(Arc::clone(&sink)))));█(w, sink)█}█...█}█[Showing lines 1-233 of 287. Use :234 to continue]\u000f█</out>█# Tool call ¶█//Reading broker detach cleanup█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"3260-3335\")█<out>█\u000e fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {█...█loop {█...█}█// Brain gone: detach as subscriber but leave the sessions running.█// Clone the log Arcs out from under the sessions lock FIRST (ADR-0038█// Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json█// (`viewer_count`/`driven_by`) and emits a lifecycle record - file +█// conn I/O that must never run under the shared sessions table lock,█// or one slow perch write stalls every spawn/attach/kill dispatch.█// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]█let logs: Vec<Arc<Mutex<OutputLog>>> = {█let sessions = recover(&self.sessions);█my_subs█.iter()█.filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))█.collect()█};█for log in &logs {█recover_log(log).detach_if(&send);█}█// Same for net streams: the streams + their rings persist (D4b).█if let Some(host) = self.net.get() {█for id in &my_stream_subs {█host.detach_stream_sub(*id, &send);█}█// An [...2492ch elided...] flight);█let live = sessions█.iter()█.find(|(_, h)| h.endpoint == req.endpoint)█.map(|(sid, h)| (*sid, h.session.process_id()));█match wake_gate_decision(█live.is_some(),█inflight.contains(&req.endpoint),█Instant::now() >= deadline,█) {█WakeGate::AlreadyLive => {█let (sid, spid) = live.expect(\"live is Some on AlreadyLive\");█Gate::AlreadyLive(sid, spid)█}█...█}█};█...█}█};█...█}█[Showing lines 3259-3338 of 6298. Use :3339 to continue]\u000f█</out>█# Tool call ¶█//Reading translation worker lifecycle█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"1860-2050,2180-2380\")█<out>█\u000e/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then█/// panics too - and a panic in the inject WORKER kills its thread WITHOUT reaping█/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so█/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the█/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").█/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /█/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot█/// cascade the whole session's delivery dead.█// [impl->REQ-HAZARD-INJECT-WORKER-POISON]█fn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {█floor.lock().unwrap_or_else(|p| p.into_inner())█}█/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch█/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the█/// broker process - and every one of its `Mutex`es - ALIVE (REQ-UPD-3), so a single█/// panic while another thread held one of these locks would otherwise POISON it█/// permanently: the next `.lock().unwrap()` panics too, its [...19203ch elided...] emonstrably echoes (else a non-echoing PTY's incidental output would█// false-read head-loss). Where it does not echo, Layer 1 stands alone.█if !echo_capable || echo_verify_after(&log, seq_start, &sent_text) {█break; // delivered byte-complete (or echo-verify not applicable here)█}█if attempt < INJECT_REDRIVE_ATTEMPTS {█eprintln!(█\"INJECT_ECHO_MISS:{endpoint}: typed head did not echo (attempt {attempt}/{INJECT_REDRIVE_ATTEMPTS}) - re-driving once\"█);█committed = false; // re-drive; only a verified commit counts█...█}█...█}█}█}█...█}█...█}\u000f█</out>█# Tool call ¶█//Reading net host drop semantics█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"1080-1185,1310-1415,1870-1955\")█<out>█\u000easync fn await_ring_room(log: &Arc<Mutex<StreamLog>>, room: &tokio::sync::Notify) {█loop {█...█}█}█/// The broker-owned net endpoint + live connection/stream tables (see module█/// docs).█pub struct NetHost {█/// The dedicated tokio runtime hosting the endpoint and its accept loop.█/// Dropping the host drops the runtime, stopping every net task with it.█runtime: tokio::runtime::Runtime,█endpoint: Arc<NetEndpoint>,█shared: Arc<NetShared>,█/// `(minter, op_id) -> conn_id` for exactly-once dial replies: a deduped replay█/// of a journaled dial is answered with the connection the first apply opened.█/// Keyed by `(minter, op_id)` (ADR-0034) - the minter namespaces the op so two█/// counters that both start at 1 cannot clobber each other's dial record.█dial_ops: Mutex<HashMap<(Minter, u64), u64>>,█/// `(minter, op_id) -> stream_id` for exactly-once stream-open replies (D4b),█/// same discipline as `dial_ops`. Minter-namespaced (ADR-0034), matching the█/// journal key the broker builds for the same op.█stream_ops: Mutex<HashMap<(Minter, u64), u64>>,█/// This node's pubkey (the seed-proof's local channel-binding identity).█[...13213ch elided...] air_lock.lock().unwrap();█let (conn_id, _) = self.dial_loopback();█let before = self.inbound_rows_on(conn_id);█let owner_stream = self.open_stream(conn_id)?;█let shell_stream = self█.inbound_rows_on(conn_id)█.difference(&before)█.copied()█.next()█.ok_or_else(|| io::Error::other(\"loopback peer row not registered\"))?;█Ok((owner_stream, shell_stream))█}█/// Attach `sub` as a stream's read subscriber, replaying from `from_seq`█/// (gapless resume - the PTY `subscribe` discipline on a QUIC stream).█// [impl->REQ-DAEMON-2]█pub(crate) fn subscribe_stream(█&self,█stream_id: u64,█sub: SharedSend,█from_seq: u64,█) -> io::Result<()> {█...█}█...█}\u000f█</out>█# Tool call ¶█//Finding production thread names█grep(pattern=\"\\\\.name\\\\(|thread_name\\\\(\", path=\"crates/spt-daemon/src; crates/spt-term/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brain.rs█234| let reader = thread::Builder::new()█*235| .name(\"pump-ipc-reader\".to_string())█236| .spawn(move || {█237| eprintln!(\"PUMP_IPC_READER: spawned\");█238| loop {█## conn.rs█448| let dog = thread::Builder::new()█*449| .name(\"conn-watchdog\".into())█450| .spawn(move || dog_inner.watchdog())█451| .ok();█452| BrokerConn { inner, dog }█## docshost.rs█254| std::thread::Builder::new()█*255| .name(\"spt-docs-server\".to_string())█256| .spawn(move || {█257| let rt = match tokio::runtime::Builder::new_current_thread()█258| .enable_io()█## nethost.rs█1185| .worker_threads(2)█*1186| .thread_name(\"spt-broker-net\")█1187| .enable_all()█1188| .build()?;█1189| let endpoint = runtime█## transport.rs█46| let ns = name.to_ns_name::<GenericNamespaced>()?;█*47| let listener = ListenerOptions::new().name(ns).create_sync()?;█48| Ok(LocalSocketTransport { listener })█49| }█50|\u000f█</out>█# Assistant ¶█_**Calculating OS thread usage per IPC connection**█**Analyzing lifecycle of broker IPC threads and potential leaks**█**Assessing Brain object thread lifespan and connection counts**█**Evaluating non-invasive CPU profiling methods**█**Planning safe thread and IPC handle inspection**_█# Tool call ¶█//Reading translation process threads█read(path=\"crates/spt-daemon/src/translation.rs\", selector=null)█<out>█\u000e//! ADR-0022 idle-delivery **translation-binary** driver (v0.13.0 W2 Layer B).█//!█//! An adapter may declare a `[message-idle-translation-binary]` (see█//! [`spt_runtime::manifest::IdleTranslationBinary`]). It is a **pure█//! stdin->stdout JSON-lines filter** spt-core lifecycle-manages: spt-core feeds it█//! the inbound `<EVENT>` feed plus content-free user-activity pings, and reads█//! back keystroke-commands which spt-core (NOT the binary) applies to the█//! broker-held PTY. The binary never touches the PTY - that is what lets injection█//! coexist atomically with a live `spt rc` controller (the W1 coordination,█//! REQ-HAZARD-INJECT-CONTROL-COEXIST). This module owns only the **process + wire**█//! seam (spawn, the two JSON-lines protocols, the send-keys byte map, and a█//! bounded reap); the atomic PTY apply + controller-input buffering lives in the█//! broker (Layer C).█//!█//! **Privacy invariant (doyle gate #1):** the `input` ping is CONTENT-FREE - the█//! operator's PTY keystrokes are never duplicated into the binary's stdin. See█//! [`ToBinary::Input`].█//!█//! **No-zombie invariant (doyle gate #2):** dropping a [`TranslationChild`] closes█//! its stdin (EOF -> a well-behav [...11250ch elided...] med = line.trim();█if trimmed.is_empty() {█continue;█}█match serde_json::from_str::<KeyCmd>(trimmed) {█Ok(cmd) => {█if cmds.send(cmd).is_err() {█break; // broker dropped the receiver - stop reading█}█}█Err(e) => {█eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");█}█}█}█});█Ok(TranslationChild {█child: Mutex::new(Some(child)),█stdin: Mutex::new(Some(stdin)),█_reader: reader,█pid,█})█}█...█}█[Showing lines 1-300 of 508. Use :301 to continue]\u000f█</out>█# Tool call ¶█//Finding seat capacity and presence█grep(pattern=\"SUBSCRIBER_QUEUE_CAP|SubscriberSeat::install|begin_attach|detach_if|struct PresenceLog|subscribe_presence|detach_presence\", path=\"crates/spt-daemon/src/nethost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 126|/// resumes from its cursor (the existing gapless-resume contract).█*127|const SUBSCRIBER_QUEUE_CAP: usize = 1024;█128|█129|/// Why a subscriber seat rejected a frame - the caller removes the seat on█130|/// either, but only a POISON (real write failure on the conn) cancels the█...█189| ) -> SubscriberSeat {█*190| let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);█191| let done = Arc::new(std::sync::atomic::AtomicBool::new(false));█192| let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));█193| let writer_sub = Arc::clone(&sub);█...█508| /// replay-then-live seq order is structural (see█*509| /// [`SubscriberSeat::install`]), while every conn write still happens█510| /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring█511| /// under the lock with discarded write errors, the exact serial-poison█512| /// engine of the v0.34 field stalls). Returns the replay frame count.█...█517| // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]█*518| fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {█519| if let Some(prior) = &self.sub [...6967ch elided...] c::ptr_eq(&lease_a, &lease_b),█...█2813| log.append(\"connected\", 1, \"aa\");█*2814| let replayed = log.begin_attach(Arc::clone(&sub), 0).expect(\"attach\");█2815| assert_eq!(replayed, 1, \"retained events replay from the cursor\");█2816|█2817| drop(client);█...█2830| let mut log2 = PresenceLog::new(64);█*2831| log2.begin_attach(Arc::clone(&a), 0).expect(\"attach\");█2832| log2.subscriber█2833| .as_ref()█2834| .unwrap()█...█2837| let err = log2█*2838| .begin_attach(Arc::clone(&b), 0)█2839| .expect_err(\"poisoned prior presence seat refuses reinstall\");█2840| assert_eq!(err.kind(), io::ErrorKind::WouldBlock);█2841| assert!(err.to_string().contains(\"subscriber busy\"), \"{err}\");\u000f█</out>█# Tool call ¶█//Reading watchdog completion loop█read(path=\"crates/spt-daemon/src/conn.rs\", selector=\"330-415,470-640\")█<out>█\u000eimpl Inner {█...█fn sever(&self) {█...█#[cfg(windows)]█// SAFETY: as in poison_and_cancel - handle outlives the watchdog.█unsafe {█let _ = win::DisconnectNamedPipe(self.raw);█let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());█}█}█/// The watchdog body: park until a write is in flight, then sleep to its█/// absolute deadline. If the op is still in flight at the deadline,█/// poison + cancel, re-canceling periodically until the op reports█/// completion (the writer clears `inflight` the instant `write_frame`█/// returns - that return IS the buffer-release handshake), then sever.█fn watchdog(&self) {█let mut d = recover(&self.dog);█loop {█// Park until armed (or shutdown).█let (op, deadline) = loop {█if d.shutdown {█return;█}█if let Some(armed) = d.inflight {█break armed;█}█d = self█.dog_cv█.wait(d)█.unwrap_or_else(|p| p.into_inner());█};█// Sleep toward [...7873ch elided...] )]█impl Drop for TestGatePin {█fn drop(&mut self) {█let mut g = recover(&self.inner.gate);█g.half = self.half.take();█drop(g);█self.inner.gate_cv.notify_all();█}█}█#[cfg(test)]█impl BrokerConn {█/// Check the half out of the gate without arming the watchdog - writers█/// queue behind the gate (bounded by their own deadlines) until the█/// returned pin drops. Test-only; never a production path.█pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {█let mut g = recover(&self.inner.gate);█let half = g.half.take().expect(\"pin: gate half present\");█TestGatePin {█inner: Arc::clone(&self.inner),█half: Some(half),█}█}█}█impl Drop for BrokerConn {█fn drop(&mut self) {█...█}█}\u000f█</out>█# Tool call ¶█//Finding session deletion paths█grep(pattern=\"sessions.*remove|remove\\\\(&id\\\\)|dispatch_kill|session\\\\.kill|request_stop|\\\\.join\\\\(\\\\)\", path=\"crates/spt-daemon/src/broker.rs; crates/spt-term/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/█## spt-daemon/src/█### broker.rs█3085| KIND_KILL => {█*3086| if let Err(msg) = self.dispatch_kill(env) {█3087| send_error(&send, &msg);█3088| }█3089| }█...█3460| // Reap the dead session from the table.█*3461| recover(&sessions_exit).remove(&id);█3462| });█3463|█3464| // Layer C: if the spawn carried a translation binary, bring it up with the█...█4456| /// reaps the session once the child is dead.█*4457| fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {█4458| let req: KillReq =█4459| serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;█4460| let sessions = recover(&self.sessions);█...█4463| .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;█*4464| h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))█4465| }█4466|█4467| /// W3d (ADR-0025): apply a live adapter update to every session running█...█4791| drop(tx);█*4792| writer.join().expect(\"evicted writer joins\");█4793|█4794| let mu [...1377ch elided...] p(&self) {█90| self.stop.store(true, Ordering::Relaxed);█91| }█92|█...█97| if let Some(h) = self.handle.take() {█*98| let _ = h.join();█99| }█100| }█101|}█...█250| });█*251| drain.join(); // ScriptedReader EOFs, so this returns█252|█253| assert_eq!(█254| &*written.lock().unwrap(),█...█281| let answered = drain.dsr_answered();█*282| drain.join();█283| assert_eq!(answered, 0, \"no DSR query -> no CPR answer\");█284| assert!(written.lock().unwrap().is_empty(), \"nothing written back\");█285| }█### stream.rs█55|█*56| /// Ask the pump to stop (cooperative - see [`Drain::request_stop`]).█*57| pub fn request_stop(&self) {█*58| self.drain.request_stop();█59| }█60|}█61|\u000f█</out>█# Tool call ¶█//Finding stream table removal█grep(pattern=\"streams\\\\s*\\\\.lock|\\\\.streams|retain\\\\(|remove\\\\(\", path=\"crates/spt-daemon/src/nethost.rs\", selector=\"900-1950\", case=true, gitignore=true, skip=null)█<out>█\u000e 955| conn_close.closed().await;█*956| sh_close.conns.lock().unwrap().remove(&id);█957| // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead█958| // - nothing can ever be served on them again, and leaving them makes█959| // every future dispatcher generation replay them (the control-steal█...█963| sh_close█*964| .streams█965| .lock()█966| .unwrap()█*967| .retain(|_, e| e.conn_id != id);█968| sh_close█969| .presence█970| .lock()█...█1010| let room = Arc::new(tokio::sync::Notify::new());█*1011| shared.streams.lock().unwrap().insert(█1012| id,█1013| Arc::new(StreamEntry {█1014| conn_id,█...█1744| self.shared█*1745| .streams█1746| .lock()█1747| .unwrap()█1748| .get(&stream_id)█...█1756| let entry = {█*1757| let streams = self.shared.streams.lock().unwrap();█1758| Arc::clone(streams.get(&stream_id).ok_or_else(|| {█1759| io::Error::new(█1760| io::ErrorKind::NotFound,█...█1794| pub fn stre [...1182ch elided...] ome(e) = self.shared.streams.lock().unwrap().get(&stream_id) {█1882| e.log.lock().unwrap().set_retentive(cap);█1883| }█1884| }█...█1892| pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {█*1893| let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);█1894| let drained = entry.log.lock().unwrap().drain();█1895| // The drain freed ring room - wake a pump that was backpressure-parked.█1896| entry.room.notify_one();█...█1904| self.shared█*1905| .streams█1906| .lock()█1907| .unwrap()█1908| .get(&stream_id)█...█1916| self.shared█*1917| .streams█1918| .lock()█1919| .unwrap()█1920| .iter()\u000f█</out>█# Tool call ¶█//Finding version changes█grep(pattern=\"SubscriberSeat|conn-watchdog|BrokerConn|retire_stream|REDISPATCH|finished.*retire\", path=\"CHANGELOG.md; docs; crates/spt-daemon\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# docs/█## KNOWN-HAZARDS.md█641|- **Invariant:** every write on a physical broker connection rides ONE broker-owned bounded/cancelable framed-write primitive with an **independent out-of-band aborter**. The `SendHalf` never leaves the conn object (a bypass cannot compile). An ABSOLUTE deadline stamped at write entry covers BOTH the serialized gate-wait AND OS write completion; a per-conn watchdog fires at that deadline and aborts the in-flight op - never relying on the write returning or on opportunistic stall-evict sampling. On dead...█*642|- **spt-core mapping:** `spt-daemon/src/conn.rs` `BrokerConn` (Condvar-gated serialized write gate + poisoned state + per-in-flight op id + watchdog + `abort_physical()`: cfg(windows) `CancelIoEx` -> completion handshake -> `DisconnectNamedPipe` raw kernel32 externs; cfg(unix) `UnixStream::shutdown(Both)`); `broker.rs` `SharedSend = Arc<BrokerConn>` + `controller_writer`/`viewer_writer`/`send_frame`/`send_error` routed; `nethost.rs` stream-log/presence sends routed. int = `brain_decouple.rs` `non_drain...█643|- **Source:** UPDATE-WEDGE round-4 (hertz root doc `docs/UPDATE-WEDGE-ROOT-CAUSE.md` @f8596ca; doyle gate ruling `docs/UPDATE-WEDGE-RCA-D [...32810ch elided...] on that█*689| // separates this from D1b's finished-unretired shape).█690| let rows = probe.net_streams().expect(\"net-streams\").streams;█691| let row = rows.iter().find(|s| s.stream_id == s1_a).expect(\"s1 row\");█692| assert!(!row.finished, \"T6 precondition: the stale row must be UNFINISHED\");█### fixtures/█#### dispatch_fixture.rs█*1|//! Test-only dispatcher-generation fixture (REDISPATCH-TRUTH D-regressions,█*2|//! `tests/redispatch.rs`): runs the REAL `dispatch::run_dispatch_loop` against█3|//! the named broker, as a child process the test can KILL - a killed█4|//! generation drops its workers' broker connections exactly like a production█5|//! brain death, which no in-process thread can simulate (a parked serve-loop█[Some lines truncated to 512 chars]\u000f█</out>█# Assistant ¶█_**Implementing remainder drop semantics**_█# Tool call ¶█//Reading translation reap semantics█read(path=\"crates/spt-daemon/src/translation.rs\", selector=\"260-410\")█<out>█\u000eimpl TranslationChild {█...█pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {█...█// [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]█#[cfg(windows)]█{█use std::os::windows::process::CommandExt;█const CREATE_NO_WINDOW: u32 = 0x0800_0000;█command.creation_flags(CREATE_NO_WINDOW);█}█let mut child = command.spawn()?;█let pid = child.id().into();█let stdout = child█.stdout█.take()█.expect(\"stdout piped at spawn\");█let stdin = child.stdin.take().expect(\"stdin piped at spawn\");█let reader = thread::spawn(move || {█let buf = BufReader::new(stdout);█for line in buf.lines() {█let Ok(line) = line else { break }; // child stdout closed█let trimmed = line.trim();█if trimmed.is_empty() {█continue;█}█match serde_json::from_str::<KeyCmd>(trimmed) {█Ok(cmd) => {█if cmds.send(cmd).is_err() {█break; // broker dropped the receiver - stop reading█[...4063ch elided...] D-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows█// before spawn) must not break the spawn - the error-87 flag-combo regression█// class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,█// verified by the live watcher); this proves the flagged spawn still starts a live█// child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.█#[test]█fn flagged_spawn_still_starts() {█// A no-arg program present on each platform that TranslationChild can spawn as█// a stdin->stdout child (it need not speak the protocol - we only assert the█// CREATE_NO_WINDOW spawn succeeds, then reap via terminate/Drop).█#[cfg(windows)]█let prog = \"cmd\";█...█}█...█}█[Showing lines 259-413 of 508. Use :414 to continue]\u000f█</out>█# Tool call ¶█//Reading presence seat lifecycle█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"110-235,590-735,1940-2025\")█<out>█\u000e/// unreplayed chunks in practice; bounded so an unsubscribed stream can't█/// buffer without limit.█const DEFAULT_STREAM_RING_CHUNKS: usize = 4096;█/// Max bytes pulled per stream read (one ring chunk).█const STREAM_READ_CHUNK: usize = 64 * 1024;█/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).█/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has█/// no newline is not speaking an NDJSON protocol - capture gives up█/// (`Oversize`) and classification treats it as unclassifiable, bounded.█const OPENER_PIN_MAX: usize = 64 * 1024;█/// How many frames a subscriber's writer queue holds before the subscriber is█/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow█/// is a subscriber problem, never a producer stall - the detached brain█/// resumes from its cursor (the existing gapless-resume contract).█const SUBSCRIBER_QUEUE_CAP: usize = 1024;█/// Why a subscriber seat rejected a frame - the caller removes the seat on█/// either, but only a POISON (real write failure on the conn) cancels the█/// stream's lease; an overflow is a slow-but-healthy brain being detached.█// [impl->REQ-STREAMLOG-SUBSCRIBER-DISC [...14403ch elided...] .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);█}█/// Gracefully close the endpoint: every held connection flushes its QUIC█/// CLOSE so peers' closed-watchers fire promptly (a bare host drop kills█/// the runtime first and leaves peers to an idle timeout).█pub fn close(&self) {█let endpoint = Arc::clone(&self.endpoint);█self.runtime.handle().block_on(async move {█endpoint.close().await;█});█}█}█\u000f█</out>█# Tool call ¶█//Reading daemon broker startup threads█read(path=\"crates/spt-daemon/src/daemon.rs\", selector=\"150-315\")█<out>█\u000e {█...█if let Err(e) = att.save() {█...█}█for name in &att.detached {█// Plain prose (no Markdown markers): spt-daemon can't import the█// bin-local helpfmt renderer, so this one source string is authored█// marker-free rather than rendered. The `SUBNET_DETACHED:{name}`█// token is the machine contract; the rest is a human hint.█// [impl->REQ-CLI-OUTPUT-MARKDOWN]█eprintln!(\"SUBNET_DETACHED:{name} (startup default - run: spt subnet attach {name})\");█}█}█// The broker's network host (D4a, ADR-0004 §B): the node's iroh endpoint█// + live QUIC connections live in the broker so they survive a brain█// restart. Identity is the durable node.key (stable name across daemon█// restarts); relay stance comes from daemon.json; mDNS rides the█// endpoint (closing the §B mDNS/relay-session row by construction). A█// net failure degrades to a net-less broker - it must not cost PTY█// hosting (mirrors the broker-bind soft-fail below).█// [impl->REQ-DAEMON-2]█// Identity (the [...7857ch elided...] ren on█// every brain start. The broker no longer hosts it; see█// [`crate::brainproc::run_brain`].█// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█// Brain process supervisor (ADR-0018 Q2/Q3 - broker/brain process█// restoration): the broker is the always-up per-machine anchor; it spawns█// `spt daemon brain` as a supervised child and respawns it on exit. D3-3█// makes an update a *planned* restart on this same path: the supervisor's█// `BrainRestart` signal is wired into the broker so the `KIND_BRAIN_RESTART`█// verb (sent by `spt update apply` after the binary swap) cycles the brain█// onto the new binary with `start-reason=update`. The stop flag is held█[Showing lines 149-318 of 1725. Use :319 to continue]\u000f█</out>█# Tool call ¶█//Reading broker kill path█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"4435-4470\")█<out>█\u000e fn dispatch_net_stream_subscribe(█...█) -> Result<u64, String> {█...█host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)█.map_err(|e| e.to_string())?;█Ok(req.stream_id)█}█/// Attach a brain to the conn-liveness event log from a cursor (D4c) - the█/// PresenceChannel broker seam: gapless resume over connection presence,█/// same discipline as a stream subscribe.█// [impl->REQ-EP-4]█fn dispatch_net_presence_subscribe(█&self,█env: Envelope,█send: &SharedSend,█) -> Result<(), String> {█let req: NetPresenceSubscribeReq = serde_json::from_value(env.payload)█.map_err(|e| format!(\"bad net-presence-subscribe payload: {e}\"))?;█let host = self.net.get().ok_or(\"net disabled\")?;█host.subscribe_presence(Arc::clone(send), req.from_seq);█Ok(())█}█/// Terminate a session's child. The exit waiter emits the `exit` frame and█/// reaps the session once the child is dead.█fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {█let req: KillReq =█serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;█let sessions = recover(&self.sessions);█let h = sessions█.get(&req.session_id)█.ok_or_else(|| format!(\"no such session {}\", req.session_id))?;█h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))█}█/// W3d (ADR-0025): apply a live adapter update to every session running█/// `req.adapter`. LOCK DISCIPLINE (binding): the sessions `Mutex` is never held█/// across the bounded `terminate()` or the CRC swap - only across the█/// snapshot, the per-session `input` fetch, and the re-insert.█///█/// 1. snapshot the affected `(id, endpoint, old translation)` under the lock,█/// then RELEASE it;█[Showing lines 4434-4473 of 6298. Use :4474 to continue]\u000f█</out>█# Tool call ¶█//Reading redispatch worker bound█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"470-610\")█<out>█\u000epub fn run_dispatch_loop(█...█) -> io::Result<()> {█...█while !stop.load(Ordering::Relaxed) {█...█for s in reply.streams {█...█// after its backoff (REQ-DISPATCH-CLAIM-RETRY).█if s.initiated_locally || s.next_seq == 0 {█continue;█}█if !pool_has_room(active_workers.load(Ordering::Relaxed)) {█break; // pool full: the rest of the table waits for the next poll█}█let attempts = {█let mut c = claims.lock().unwrap();█match should_claim(c.get(&s.stream_id), Instant::now()) {█Some(attempts) => {█c.insert(s.stream_id, ClaimState::InFlight { attempts });█attempts█}█None => continue,█}█};█let name = broker_name.to_string();█let origin = s.remote_id_hex.clone();█let stream_id = s.stream_id;█let conn_id = s.conn_id;█let floor_seq = s.floor_seq;█let finished = s.finished;█let p = paths.clone();█let reg = Arc::clone(&registry);█[...4704ch elided...] xt tick (batched, never one thread per row).█// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]█fn pool_has_room(active: usize) -> bool {█active < MAX_DISPATCH_WORKERS█}█/// Connect a fresh brain IPC client (retrying through broker startup).█fn connect(broker_name: &str) -> io::Result<Brain> {█let mut last = io::Error::other(\"broker never answered\");█for _ in 0..300 {█match Brain::cold_start(broker_name, now_ms()) {█Ok(b) => return Ok(b),█Err(e) => last = e,█}█thread::sleep(Duration::from_millis(10));█}█Err(last)█}█fn now_ms() -> u64 {█std::time::SystemTime::now()█.duration_since(std::time::UNIX_EPOCH)█.map(|d| d.as_millis() as u64)█.unwrap_or(0)█}█[Showing lines 469-613 of 1558. Use :614 to continue]\u000f█</out>█# Tool call ¶█//Reading release notes█read(path=\"docs/adr/0038-broker-stream-lifecycle-truth.md\", selector=\"73-135\")█<out>█\u000e# ADR-0038: Broker stream-table lifecycle truth (redispatch eligibility)█...█## Consequences█...█- Brain cycles (refresh/update) stop being a controller-integrity hazard:█...█- Rejected alternatives: clearing the whole stream table on brain restart█...█## Amendment - REDISPATCH-STALL (2026-07-16)█<!-- [doc->REQ-DISPATCH-FALLBACK-CIRCUIT] -->█<!-- [doc->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE] -->█<!-- [doc->REQ-SERVE-OWNERSHIP-GENERATION] -->█<!-- [doc->REQ-DISPATCH-HYGIENE-TELEMETRY] -->█- **Status:** accepted (hertz v0.34 field-stall RCA + doyle seam-verify, same█day, both hours apart); RCA summary█`.claude/reports/2026-07-16-redispatch-stall/rca-summary.md`; hazard█KNOWN-HAZARDS 7.43; build shape `docs/REDISPATCH-STALL-TRIAGE.md`.█The W1 machinery this ADR shipped is field-correct on its own terms (D1/D1b█hold: finished rows never serve) but two of its legs COMPOSE into a stall█engine on live v0.34: Decision 3's retryable claims re-drive Decision 2's N-1█ring-peek fallback, whose guard arm is a broad `Err(_)`█(`dispatch.rs:414` - intended old-broker-only, catches transport█timeout/EOF/poison too), each pass installing a throwaway peek subscriber█whose `StreamLog::attach` replays th [...1792ch elided...] ver█detach a replacement controller. This also covers the UNFINISHED-stale-row█steal shape (raw-close no-FIN viewports) that Decision 1's finished-row█retirement cannot see.█6. **(new - dispatcher hygiene + telemetry)** The redispatch worker pool is█bounded with batched cold enumeration and NO claim/sessions locks held█across I/O (clone-then-drop before `detach_if`/`info.json` writes, KH 7.12█kin); dispatch telemetry is keyed per█gen/stream/family/endpoint/attempt/conn with█replay/poison/cancel/worker-outcome events and gauges.█Rejected here: reverting retryable claims (restores permanent abandonment);█widening any write deadline (hides the composition instead of removing it);█tearing down all subscribers on any poison (punishes healthy streams for a█wedged conn).█\u000f█</out>█# Assistant ¶█_**Assessing broker thread management limits**█**Analyzing Drain drop and EOF behavior**█**Identifying Windows PTY reader thread leak**█**Analyzing watchdog leak causes**█**Investigating ConPTY teardown and drain cleanup**█**Confirming drain thread leak from session reuse**█**Analyzing connection leak causes**█**Investigating session write blocking and thread leaks**█**Tracing high-throughput PTY output behavior**█**Identifying resource leak in retired QUIC streams**█**Tracing thread leaks from retained subscriber seats**█**Mapping subscription and retirement code paths**█**Assessing subscriber detachment on connection close**█**Analyzing Brain connection lifecycle and subscriber cleanup**█**Calculating thread usage for PTY sessions and viewers**█**Evaluating thread legitimacy per session count**█**Detailing long-lived broker thread types**█**Clarifying control hub connection threading scope**█**Searching daemon thread startup paths**_█# Tool call ¶█//Finding daemon startup spawns█grep(pattern=\"spawn_[a-zA-Z_]+\\\\(|thread::spawn|std::thread::spawn|Builder::new\\\\(\\\\)\", path=\"crates/spt-daemon/src/daemon.rs\", selector=\"300-450\", case=true, gitignore=true, skip=null)█<out>█\u000e 334| {█*335| let (_handle, restart) = crate::brainproc::spawn_brain_supervisor(█336| Arc::clone(&brain_stop),█337| Arc::clone(&reaper),█338| // The DRAINED promotion gate (REQ-UPDATE-PROMOTE-DRAINED) reads this\u000f█</out>█# Tool call ¶█//Finding broker control acceptors█grep(pattern=\"pub fn serve|fn serve|listener\\\\.accept|thread::spawn|std::thread::spawn\", path=\"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000eSkipped due to queued user message. Do not count this skipped result as completed work or verification. After the queued message is handled on the next step, retry the skipped tool if it is still needed.\u000f█</out>█# Tool call ¶█//Finding stream consumer lifetimes█grep(pattern=\"cold_start|net_stream_subscribe|net_presence_subscribe|net_stream_retire|serve_attach|Brain\", path=\"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/attach.rs; crates/spt-daemon/src/sync.rs; crates/spt-daemon/src/xfer.rs; crates/spt-daemon/src/propagate.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000eSkipped due to queued user message. Do not count this skipped result as completed work or verification. After the queued message is handled on the next step, retry the skipped tool if it is still needed.\u000f█</out>█# Tool call ¶█//Finding viewer count storage█grep(pattern=\"viewer_count|controlled|driven_by\", path=\"crates/spt-store/src; crates/spt-daemon/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000eSkipped due to queued user message. Do not count this skipped result as completed work or verification. After the queued message is handled on the next step, retry the skipped tool if it is still needed.\u000f█</out>█# Tool call ¶█//Reading dispatch worker connection█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"730-850\")█<out>█\u000e#[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 = match first_line(broker_name, stream_id, floor_seq) {█Ok(Some(v)) => v,█Ok(None) => return WorkerReport::bare(DispatchOutcome::Unknown),█// Pre-serve terminal exclusion (Amendment fix 6 rider): a row that█// vanished between enumeration and this query (retired by a sibling█// worker's Served report, or conn-swept) is TERMINAL - report Served█// so the claim closes now, instead of burning three transient█// retries against a stream that no longer exists.█// [impl->REQ-SERVE-OWNERSHIP-GENERATION]█Err(e) if e.to_stri [...3828ch elided...] , like Xfer's█// `endpoint`); the origin subject stays the handshake identity. The█// LOCAL path sends no endpoint_id and its session_id -> endpoint mapping█// is unchanged.█// `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())█...█};█...█}█...█};█...█}█[Showing lines 729-853 of 1558. Use :854 to continue]\u000f█</out>█# Tool call ¶█//Reading attach serve connection█read(path=\"crates/spt-daemon/src/attach.rs\", selector=\"230-340,500-625\")█<out>█\u000e/// - Role-aware subscribe (REQ-RCVIEW-1): the broker resolves controller /█/// viewer / busy / take by intent + origin and replies a `Subscribed`;█/// driven_by / viewer_count are BROKER-owned (single writer). A VIEWER█/// attach ARMS snap-above at the floor (REQ-HAZARD-VIEWER-RING-ROLL-SNAP);█/// the CONTROLLER keeps strict reject-gap (exactly-once resume, B2).█// [impl->REQ-RC-CROSS-NODE-ATTACH]█// [impl->REQ-HAZARD-VIEWER-RING-ROLL-SNAP]█#[allow(clippy::too_many_arguments)]█fn handle_attach_request(█brain: &mut Brain,█wire: &mut Brain,█stream_id: u64,█endpoint: &str,█origin_node: &str,█remote_session: Option<u64>,█session_id: u64,█from_seq: u64,█req_intent: AttachIntent,█req_gen: u64,█intent: &mut AttachIntent,█attached_session: &mut Option<u64>,█attached: &mut bool,█serve_gen: &mut u64,█) -> io::Result<Option<AttachServeOutcome>> {█if access_check(endpoint, origin_node, InboundClass::Unsolicited) == AccessDecision::Deny {█wire.net_stream_send(stream_id, &[], None, true)?;█return Ok(Some(AttachServeOutcome::Refused));█}█let sid = remote_session.unwrap_or(session_id);█*intent = req_in [...10997ch elided...] BrokerEvent::Exit { code, .. } if attached => {█let line = ndjson::encode_line(&AttachRecord::Exit { code });█wire.net_stream_send(stream_id, &line, None, true)?;█if role == Some(ServeRole::Controller) {█feed_rest(endpoint, crate::resting::RestEvent::Detach);█}█return Ok(AttachServeOutcome::Exited(code));█}█BrokerEvent::Error { message } => {█if role == Some(ServeRole::Controller) {█feed_rest(endpoint, crate::resting::RestEvent::Detach);█}█return Err(io::Error::other(message));█}█// Applied/NetSent acks and unrelated events: not ours to handle.█_ => {}█...█}\u000f█</out>█# User ¶█Your current interruptible wait was interrupted because an IRC message arrived from your parent agent `Main`.█Parent IRC message:█Fresh v0.36 evidence: repeated Registry-family stream subscriber poison. Examples stream 524/1161/1347/3053/3810: CONN_WRITE_POISONED after ~15s, DISPATCH_EV family=Registry endpoint=- elapsed 15.5-16.4s. Current broker ~550 threads; brain reads ~64 MiB/s. Investigate Registry stream lifecycle/replay specifically.█# Assistant ¶█_**Prioritizing registry feed investigation**_█# Tool call ¶█//Tracing registry stream family█grep(pattern=\"Registry|serve_registry_feed|registry-feed|registry_feed|StreamFamily::Registry|KIND_REGISTRY|retire\", path=\"crates/spt-daemon/src; crates/spt-net/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brain.rs█75|/// **Test-only continuity (restoration D4-3, ADR-0018 Q6).** This brain->brain█*76|/// frame is **retired from the production path**: a brain the broker's supervisor█77|/// respawns reconstructs continuity by querying the broker█78|/// ([`Brain::resume_sessions`] over the broker's cursor-of-record), never this█79|/// message. `BrainState` / [`Brain::handoff`] / [`Brain::snapshot`] stay `pub`█...█283| /// continuity state a cold-started brain rebuilds from the broker via█*284| /// [`Brain::resume_sessions`], replacing the retired single-session█285| /// `BrainState` handoff. A session present here is in **resume mode** - its█286| /// `KIND_OUTPUT` dedup is **dedup-below + snap-above, NO reject-gap** (seeded█287| /// at the broker's `resume_seq`): drop `seq < cursor` (the at-least-once█...█1009| /// from the broker's per-session delivered cursor (`resume_seq`). This is the█*1010| /// production replacement for the retired single-session `BrainState` handoff█1011| /// frame - a brain the supervisor respawns (crash *or* update) reconstructs█1012| /// all session continuity by querying the persistent side, nev [...36628ch elided...] registry_snapshots(&d);█## projwriter.rs█1119| // same ids, same dirs, same display names, same newest-first order (order█*1120| // is contract) - proven against an oracle that reconstructs the retired█1121| // picker wiring verbatim: sessions.log (reversed) ∪ info.cwd origin ∪█1122| // p-* branches by recency, derived through the REAL git█1123| // `project_id_and_display_for_dir`. Fixture mixes every leg: a git repo█...█1166|█*1167| // THE ORACLE: the retired picker wiring, reconstructed verbatim from█1168| // the same public APIs it used (git-backed, newest-first).█1169| let owlery = fx.paths.owlery.clone();█1170| let seed_git = fx.paths.seed_git.clone();█Showing files 1-20 of 36+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Finding registry request producers█grep(pattern=\"RegistryRecord|registry.*stream|open_stream|net_stream_open|net_stream_send|subscribe_stream\", path=\"crates/spt-daemon/src/registryhost.rs; crates/spt-daemon/src/pump; crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brainproc.rs\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## dispatch.rs█16|//! requester stream would deadlock the requester against ourselves. The flag█*17|//! is broker-recorded at registration (`open_stream` vs the accept loop),█18|//! never inferred.█19|//!█20|//! ## Classification (first-record demux)█...█352|/// request and await the reply on the same stream (sync.rs `request_sync` and█*353|/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the█354|/// opener), so every pull that arrives while the brain is down reads█355|/// `finished=true` while genuinely PENDING - filtering it breaks context sync█356|/// across exactly the refresh window this milestone fixes.█...█624|) -> io::Result<Option<serde_json::Value>> {█*625| match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {█626| // Pinned: classify from the durable fact. A pinned line that does not█627| // parse is terminally unclassifiable (same contract as the peek path).█628| Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),█...█830| StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),█*831| StreamFamily::Re [...2003ch elided...] ESTART: a dead BROKER conn restarts the pump; a dead PEER never█787|/// does (the decouple W2 delivers).█788|// [impl->REQ-PUMP-PEER-ISOLATION]█...█1119|fn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {█*1120| let opened = brain.net_open_stream(conn_id, None)?;█*1121| brain.net_stream_send(opened.stream_id, feed, None, true)?;█1122| Ok(())█1123|}█1124|█### registry.rs█63|/// The registry leg as a [`PumpWorker`]: own-row re-advertisement█*64|/// ([`RegistryHost::advertise_local`] -> one feed stream per peer). The node█65|/// re-advertises its own rows; peers reconverge within one cadence█66|/// (replay-is-recovery). Own rows only - a relayed third-party row would carry█67|/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10).\u000f█</out>█# Tool call ¶█//Finding registry replay behavior█grep(pattern=\"fn first_line|peek_first_line|net_stream_opener|fallback|from_seq|floor_seq\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 489| let conn_id = s.conn_id;█*490| let floor_seq = s.floor_seq;█491| let finished = s.finished;█492| let p = paths.clone();█493| let reg = Arc::clone(&registry);█...█499| let started = Instant::now();█*500| let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);█501| pool.fetch_sub(1, Ordering::Relaxed);█502| let outcome = report.outcome;█503| let elapsed_ms = started.elapsed().as_millis();█...█619|/// (terminal); `Err` = transient (the claim requeues bounded).█*620|fn first_line(█621| broker_name: &str,█622| stream_id: u64,█*623| floor_seq: u64,█624|) -> io::Result<Option<serde_json::Value>> {█*625| match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {█626| // Pinned: classify from the durable fact. A pinned line that does not█627| // parse is terminally unclassifiable (same contract as the peek path).█628| Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),█...█649| }█*650| peek_first_line(broker_name, stream_id, floor_seq)█651|}█652| [...1140ch elided...] origin,█*889| floor_seq,█890| remote_session,█891| serde_json::from_value(line.clone()).ok(),█892| ) {█...█1223|█*1224| let attach = json!({\"kind\": \"request\", \"session_id\": 3, \"from_seq\": 0});█1225| assert_eq!(classify_first_line(&attach), StreamFamily::Attach);█1226|█1227| // [unit->REQ-INST-6] the rest op's opener disambiguates by shape too.█...█1348|█*1349| // [unit->REQ-DISPATCH-FALLBACK-CIRCUIT] fallback narrowing (Amendment█1350| // fix 1): ONLY the old broker's literal `unknown command kind` answer may█1351| // fall back to the ring peek. Transport timeout / EOF / poison - the█1352| // pre-Amendment broad Err(_) classes that manufactured throwaway replay\u000f█</out>█# Tool call ¶█//Finding broker control acceptors█grep(pattern=\"pub fn serve|fn serve|listener\\\\.accept|thread::spawn|std::thread::spawn\", path=\"crates/spt-daemon/src/digesthub.rs; crates/spt-daemon/src/drivehub.rs; crates/spt-daemon/src/tunnelhub.rs; crates/spt-daemon/src/docshost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## digesthub.rs█174|/// would stall every other client.█*175|pub fn serve_digest_control(name: &str, hub: Arc<DigestHub>) -> io::Result<()> {█176| let listener = LocalSocketTransport::bind(name)?;█177| loop {█*178| let conn = listener.accept()?;█179| let hub = Arc::clone(&hub);█*180| thread::spawn(move || {█181| let _ = handle_conn(conn, &hub);█182| });█183| }█## drivehub.rs█180|/// Thread-per-connection (mirroring the digest / broker / seed-control channels).█*181|pub fn serve_drive_control(name: &str, hub: Arc<DriveHub>) -> io::Result<()> {█182| let listener = LocalSocketTransport::bind(name)?;█183| loop {█*184| let conn = listener.accept()?;█185| let hub = Arc::clone(&hub);█*186| thread::spawn(move || {█187| let _ = handle_conn(conn, &hub);█188| });█189| }█## tunnelhub.rs█272|// [impl->REQ-SHELL-4]█*273|pub fn serve_tunnel_control(name: &str, hub: Arc<TunnelHub>, broker: Arc<Broker>) -> io::Result<()> {█274| let listener = LocalSocketTransport::bind(name)?;█275| loop {█*276| let conn = listener.accept()?;█277| let hub = Arc::clone(&hub);█278| let broker = Arc::clone(&broker);█*279| thread::spawn(move || {█280| let _ = handle_conn(conn, &hub, &broker);█281| });█282| }█## docshost.rs█148|// [impl->REQ-DOCS-LOCAL-SERVER]█*149|fn serve_path(docs_root: &Path, uri_path: &str, head_only: bool) -> Response<Full<Bytes>> {█150| let respond = |status: StatusCode, ctype: &'static str, body: Vec<u8>| {█151| let body = if head_only { Vec::new() } else { body };█152| Response::builder()█...█229| loop {█*230| let Ok((stream, _peer)) = listener.accept().await else {█231| continue;█232| };█233| let io = hyper_util::rt::TokioIo::new(stream);\u000f█</out>█# Tool call ¶█//Finding viewer count storage█grep(pattern=\"viewer_count|controlled|driven_by\", path=\"crates/spt-store/src; crates/spt-daemon/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/█## spt-store/src/█### info.rs█99| #[serde(default, skip_serializing_if = \"Option::is_none\")]█*100| pub driven_by: Option<String>,█101| /// Whether ANY operator - local OR remote - currently drives this endpoint's█102| /// session (#3, REQ-GOSSIP-CONTROLLED-ANY). The BROKER is the single writer,█*103| /// stamped alongside `driven_by` on every controller add/clear. DISTINCT from█*104| /// `driven_by`, which is `Some` ONLY for a REMOTE controller (a local-only█*105| /// controller must NOT latch `driven_by` - KH 7.15 /█*106| /// `REQ-HAZARD-DRIVEN-BY-SELFHEAL`): `driven_by` answers \"is a remote node█*107| /// driving me\", `controlled` answers \"is ANYONE driving me\", so a█*108| /// locally-controlled endpoint still gossips as controlled to remote viewers.█109| /// `default false` so a pre-#3 record parses.█110| #[serde(default)]█*111| pub controlled: bool,█112| /// The number of read-only viewers currently attached to this endpoint's█113| /// session under the W2.5 controller/viewer model (REQ-RCVIEW-1). The BROKER█114| /// is the single writer (it owns the viewers map), stamped on every viewer█*115| /// add/remove/ [...17174ch elided...] mapping is unit-tested.█868|// [impl->REQ-GOSSIP-CONTROLLED-ANY]█869|fn gossip_controller_node(█*870| driven_by: Option<&str>,█*871| controlled: bool,█872| self_node: &str,█873|) -> Option<String> {█*874| match driven_by {█875| Some(remote) => Some(remote.to_string()),█*876| None if controlled => Some(self_node.to_string()),█877| None => None,█878| }█879|}█### shelldisc.rs█336| recent_projects: Vec::new(),█*337| controlled: false,█338| };█339| let mut reg = SubnetRegistry::new();█340| // Two endpoints on the same remote node carry the same node-level█### wan.rs█431| recent_projects: Vec::new(),█*432| controlled: false,█433| };█434| let proven = \"aa11node\";█435|\u000f█</out>█# Tool call ¶█//Reading registry dispatch arm█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"840-960\")█<out>█\u000e let outcome = match family {█...█StreamFamily::Attach => {█...█// Request carries `endpoint_id`, THAT is the gate subject - but only if█// we actually host a live session for it (D5 session-presence gate;█// D6: a stale registry row that named a gone endpoint resolves to no█// session -> refuse cleanly, never a false attach). The endpoint id is█// WHICH endpoint the operator asks for (client-supplied, like Xfer's█// `endpoint`); the origin subject stays the handshake identity. The█// LOCAL path sends no endpoint_id and its session_id -> endpoint mapping█// is unchanged.█// `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())█{█[...4645ch elided...] ome::Served(format!(\"{out:?}\")),█Err(e) => DispatchOutcome::Failed(e.to_string()),█}█}█StreamFamily::ServeProbe => {█// No gate (serveprobe module docs): the answer is public█// serve-state for a named subnet, read fresh from this node's█// own stores - the QUIC handshake is the only subject.█// [impl->REQ-SUBNET-5]█match crate::serveprobe::serve_subnet_probe(&mut brain, stream_id) {█Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),█Err(e) => DispatchOutcome::Failed(e.to_string()),█}█}█StreamFamily::Unknown => DispatchOutcome::Unknown,█};█WorkerReport {█...█}█[Showing lines 839-963 of 1558. Use :964 to continue]\u000f█</out>█# Assistant ¶█_**Planning to read and pump registry feed**_█# Tool call ¶█//Locating registry serve function█grep(pattern=\"fn serve_registry_feed|pub fn serve_registry_feed\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 983|// [impl->REQ-INST-7]█*984|fn serve_registry_feed(█985| brain: &mut Brain,█986| stream_id: u64,█987| origin: &str,\u000f█</out>█# Tool call ¶█//Reading registry pump cadence█read(path=\"crates/spt-daemon/src/pump/registry.rs\", selector=\"1-180\")█<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.█/ [...6045ch elided...] .█self.adverts = self.registry.advertise_local(&self.owlery);█}█/// Push this node's own rows for `subnet` over the peer's feed stream█/// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one█/// stream per feed.█fn peer_step(█&mut self,█io: &mut PeerIo,█subnet: &str,█_peer_hex: &str,█_ctx: &RoundCtx,█) -> io::Result<()> {█let lines: Vec<u8> = self█.adverts█.iter()█.filter(|u| u.subnet() == subnet)█.flat_map(|u| u.encode_line())█.collect();█if !lines.is_empty() {█io.push_feed(&lines)?;█}█Ok(())█}█}█#[cfg(test)]█mod tests {█use super::*;█...█}█[Showing lines 1-183 of 334. Use :184 to continue]\u000f█</out>█# Tool call ¶█//Reading pump feed send loop█read(path=\"crates/spt-daemon/src/pump/mod.rs\", selector=\"1080-1140\")█<out>█\u000efn startup_reconcile_peeraddrs(paths: &PumpPaths, self_hex: &str) {█...█for k in invalid {█eprintln!(█\"PEERADDR_INVARIANT_REPAIR:{k}: dropped a cached row whose address.id does not match its key (no roster repair available) [REQ-PEERADDR-INVARIANT]\"█);█changed |= pa.forget(&k);█}█if changed {█let _ = pa.save_to(&paths.peer_addrs);█}█}█/// The roster leg of the route chain: any subnet's `RosterEntry` for█/// `peer_hex` whose advertised address passes id-match validation (gate█/// ruling 4 - an address claiming a different identity resolves NOTHING).█// [impl->REQ-PEER-ROUTE-CHAIN]█fn roster_route(█roster: &spt_store::roster::RosterStore,█peer_hex: &str,█) -> Option<serde_json::Value> {█roster█.members█.iter()█.filter(|m| m.pubkey_hex == peer_hex)█.filter_map(|m| m.address.as_ref())█.find(|a| spt_store::peeraddrs::addr_peer_id(a) == Some(peer_hex))█.cloned()█}█/// Monotonic milliseconds since the process's first stamp - the `mono_ms`█/// half of the stamped failure lines (REQ-PUMP-STAGE-TRUTH): wall time can█/// step; this cannot, so intra-incident ordering is trust [...725ch elided...] construction with the per-call deadline█/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the█/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).█// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]█fn connect(broker_name: &str) -> io::Result<Brain> {█let mut last = io::Error::other(\"broker never answered\");█for _ in 0..300 {█match Brain::cold_start_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {█Ok(b) => return Ok(b),█Err(e) => last = e,█}█thread::sleep(Duration::from_millis(10));█}█Err(last)█}█fn now_ms() -> u64 {█std::time::SystemTime::now()█.duration_since(std::time::UNIX_EPOCH)█.map(|d| d.as_millis() as u64)█.unwrap_or(0)█}█[Showing lines 1079-1143 of 1982. Use :1144 to continue]\u000f█</out>█# Tool call ¶█//Reading dispatcher classification█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"80-170,330-375,615-710\")█<out>█\u000euse crate::relcache::ReleaseCache;█use crate::sync::{serve_sync, SyncPolicy};█use crate::wan::receive_wan;█use crate::xfer::serve_xfer;█/// Poll cadence for the stream-table watch (the dispatcher's only busy-wait;█/// workers block on their stream's event feed).█pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);█/// What protocol a peer-initiated stream speaks, by its first record's shape.█#[derive(Debug, Clone, Copy, PartialEq, Eq)]█pub enum StreamFamily {█/// A context sync pull (`SyncRecord::Request`).█Sync,█/// An update pull (`UpdRecord::Query`).█Update,█/// A notif replication feed (`NotifRecord::Row`).█Notif,█/// A WAN message feed (untagged `WanMessage` lines).█WanMsg,█/// A registry replication feed (untagged `RegistryUpdate` lines).█Registry,█/// A remote-drive attach (`AttachRecord::Request`).█Attach,█/// A file transfer (`XferRecord::Fetch`/`Push`).█Xfer,█/// A remote rest op (`RestRecord::Request` - suspend/wake from another█/// node, M5-D5b).█Rest,█/// A cross-node shell-link op (`ShellLinkRecord::Request` - relink/cmd█/// against an owner's shell on this node, M5-D8c).█[...8661ch elided...] m's opener names, where the family carries█/// one (Amendment fix 9 - hertz's live catch on stream 7058 could not bind█/// the stalled stream to an endpoint; this key is what makes the next catch█/// a bound stream->endpoint proof). Families without an endpoint concept█/// answer `None` honestly.█// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]█fn line_endpoint(family: StreamFamily, line: &serde_json::Value) -> Option<String> {█let key = match family {█StreamFamily::Attach => \"endpoint_id\",█StreamFamily::Rest | StreamFamily::Xfer => \"endpoint\",█StreamFamily::ShellLink => \"owner\",█StreamFamily::WanMsg => \"target\",█_ => return None,█};█line.get(key)█.and_then(|v| v.as_str())█.filter(|s| !s.is_empty())█.map(str::to_string)█}█\u000f█</out>█# Tool call ¶█//Finding registry feed loop█grep(pattern=\"RegistryDecoder|RegistryGatePolicy|receive|decode|read_event|NetStreamEof\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"960-1200\", case=true, gitignore=true, skip=null)█<out>█\u000e 969|█*970|/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into█971|/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧█972|/// origin trusted in that subnet), until the peer finishes.█973|///█...█989|) -> DispatchOutcome {█*990| let policy = RegistryGatePolicy::load();█991| if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {█992| return DispatchOutcome::Failed(e.to_string());█993| }█*994| let mut decoder = RegistryDecoder::new();█995| let mut merged = 0usize;█996| loop {█*997| match brain.read_event() {█998| Ok(BrokerEvent::NetStreamData {█999| stream_id: sid,█1000| bytes,█...█1002| }) if sid == stream_id => {█*1003| let records = decoder.push(&bytes);█1004| if records.is_empty() {█1005| continue;█1006| }█...█1040| }█*1041| Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {█1042| return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));█1043| }█1044| Ok(Bro [...1626ch elided...] stream_id: sid,█1159| bytes,█...█1161| }) if sid == stream_id => {█*1162| for msg in decoder.push(&bytes) {█*1163| let outcome = receive_wan(&msg, origin, &paths.owlery, registry);█1164| handled += 1;█1165| // #9/#10 (REQ-WAN-SEND-DELIVERY): reply the outcome so the█1166| // sender reports an HONEST SENT (was: outcome discarded, sender█...█1184| }█*1185| Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {█1186| return DispatchOutcome::Served(format!(\"wan feed: {handled} record(s)\"));█1187| }█1188| Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\u000f█</out>█# Tool call ¶█//Reading registry pump config█read(path=\"crates/spt-daemon/src/config.rs\", selector=\"130-170,240-300\")█<out>█\u000e/// (No longer `Copy` - `resources_blurb` carries a `String`; callers clone.)█#[derive(Debug, Clone, PartialEq, Eq)]█pub struct DaemonConfig {█/// The pulse loop period (config-driven; defaults to [`DEFAULT_PULSE_PERIOD`]).█pub pulse_period: Duration,█/// The drop-file precedence protection window in epoch-ms (6.5).█pub protection_window_ms: u64,█/// The orphan-watch grace window (B7): the recovery wait before a█/// supervised-crash teardown rechecks liveness and signs off (1.1).█pub crash_grace: Duration,█/// Whether self-update is full-auto (C2, REQ-UPD-4). **Default `false`** - an█/// update is gated on user confirmation delivered to the most-recently-active█/// live session. Setting this to `true` is the explicit opt-in to the█/// seamless, prompt-free path.█pub full_auto_update: bool,█/// The broker net endpoint's relay stance (D4a, REQ-NET-2). Default█/// [`RelayChoice::N0`] - the ADR-0002 zero-config path. An unrecognized█/// string degrades to the default (forward-compat: a future value must not█/// wedge an older daemon).█pub relay: RelayChoice,█/// Whether the peer pump runs at all (D9-1). Default `tr [...3046ch elided...] : file█.sync_pull_period_ms█.map(Duration::from_millis)█.unwrap_or(d.sync_pull_period),█update_check_period: file█.update_check_period_ms█.map(Duration::from_millis)█.unwrap_or(d.update_check_period),█auto_suspend_after_ms: file.auto_suspend_after_ms,█resources_blurb: file.resources_blurb,█detached_subnets: file.detached_subnets.unwrap_or_default(),█worker_reap_ttl_secs: file.worker_reap_ttl_secs.unwrap_or(d.worker_reap_ttl_secs),█startup_endpoints: file.startup_endpoints.unwrap_or_default(),█docs_port: file.docs_port,█}█}█/// Persist this config to an explicit path (for `spt` to write the knob).\u000f█</out>█# Assistant ¶█_**Analyzing registry feed replay issues**█**Diagnosing connection wedging and registry merge load**_█# Tool call ¶█//Reading registry serve loop█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"969-1050\")█<out>█\u000efn worker(█...█) -> WorkerReport {█...█}█/// 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) {█return DispatchOutcome::Failed(e.to_string());█}█let mut deco [...1980ch elided...] println!(\"REST_SHIFT_FAIL:{id}:{e}\");█}█}█}█}█Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {█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()),█}█}█}█/// Notif feed arm: decode rows as they arrive, apply each batch under the█/// fail-closed gate, until the peer finishes. The policy re-loads per feed█/// (not per record) - the same freshness the other arms get per request.█[Showing lines 968-1053 of 1558. Use :1054 to continue]\u000f█</out>█# Tool call ¶█//Finding registry merge methods█grep(pattern=\"pub fn merge|fn merge|apply.*feed|merge_feed|admit|RegistryGatePolicy\", path=\"crates/spt-daemon/src/registryhost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 58|/// without a restart; the access-gate stance shared with sync/notif).█*59|pub struct RegistryGatePolicy {█60| /// Names of every subnet this node is a member of.█61| pub subnets: Vec<String>,█62| /// The membership directory (Mesh-D5, REQ-MESH-5): authorization is now█...█68|█*69|impl RegistryGatePolicy {█70| /// Load from the node's canonical stores.█*71| pub fn load() -> RegistryGatePolicy {█72| let subnets = SubnetStore::load()█73| .subnets█74| .iter()█...█76| .collect();█*77| RegistryGatePolicy {█78| subnets,█79| roster: RosterStore::load(),█80| }█...█85| // [impl->REQ-MESH-5]█*86| pub fn admits(&self, subnet: &str, origin_node: &str) -> bool {█87| self.subnets.iter().any(|s| s == subnet) && self.roster.is_member(subnet, origin_node)█88| }█89|}█...█107| machine_id: Option<String>,█*108| /// When each peer node was last *heard* (an admitted inbound feed,█109| /// wall-clock ms) - the gossip-recency half of the M7 D2 hybrid█110| /// liveness (REQ-SUBNET-1): a recently-heard node renders online without█111| /// a probe; only stale rows [...11124ch elided...] t heard: BTreeMap<String, u64> =█2024| serde_json::from_slice(&std::fs::read(&heard_file).unwrap()).unwrap();█...█2042| // The peer feeds (heard stamped at ~now)...█*2043| h.apply_feed(\"bb22\", &[upd(\"home\", \"sergey\", \"bb22\", 5)], &p);█2044| let stamped = {█2045| let heard: BTreeMap<String, u64> = serde_json::from_slice(█2046| &std::fs::read(RegistryHost::heard_path(&dir.path().join(\"registry\"))).unwrap(),█...█2109| // A still-trusted peer advertises an Offline endpoint (a purge ghost).█*2110| h.apply_feed(\"bb22\", &[upd_offline(\"home\", \"ghost\", \"bb22\", 5)], &p);█2111| assert_eq!(h.rows(\"home\", \"ghost\").len(), 1);█2112|█2113| // First sweep stamps the receiver-observed offline_since; within the grace\u000f█</out>█# Tool call ¶█//Reading pump peer loop lifecycle█read(path=\"crates/spt-daemon/src/pump/mod.rs\", selector=\"560-850\")█<out>█\u000epub fn run_peer_pump(█...█) -> io::Result<()> {█...█startup_reconcile_peeraddrs(paths, registry.node_hex());█// Reachability health (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): loaded█// so the last-good stamps survive a restart; the live counts re-prime as█// rounds run. Persisted beside the heartbeat; the status CLI reads it.█let health_path = PumpHealth::path_beside(&paths.heartbeat);█let mut health = PumpHealth::load_from(&health_path);█health.note_disconnected(0); // no conns exist yet in this pump generation█let mut ops = EpochSource::load_from(&paths.ops);█// The live per-peer connection cache (updated by presence events) + the█// per-peer dial schedule (G5 backoff). Both RAM-only, re-primed on restart.█let mut conns: HashMap<String, u64> = HashMap::new();█let mut sched: HashMap<String, PeerSched> = HashMap::new();█// The four cadenced legs behind the worker seam, in fan-out order█// (registry -> notif -> sync -> update). The shell drives them generically;█// each leg's *what* lives in its module (§Frozen). Construction capture█// (§Frozen-4): each worker owns the registry Arc / path slices / config█// knob it need [...12840ch 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 559-853 of 1982. Use :854 to continue]\u000f█</out>█# Tool call ¶█//Finding registry defaults█grep(pattern=\"DEFAULT_REGISTRY|registry_pump_period|registry: Duration|PumpCadence\", path=\"crates/spt-daemon/src/config.rs; crates/spt-daemon/src/pump/mod.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## 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);█...█49|/// stops poisoning bare-id resolution within minutes.█*50|pub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);█51|█52|/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) -█53|/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in█...█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\")]█...█153| /// Registry feed push cadence (D9-1).█*154| pub registry_pump_period: Duration,█155| /// Silent-peer registry eviction window (KNOWN-HAZ [...2115ch elided...] pdate: Duration,█...█304|█*305|impl PumpCadence {█306| /// From the daemon config knobs.█*307| pub fn from_config(cfg: &DaemonConfig) -> PumpCadence {█*308| PumpCadence {█*309| registry: cfg.registry_pump_period,█310| notif: cfg.notif_pump_period,█311| sync: cfg.sync_pull_period,█312| update: cfg.update_check_period,█...█320|pub struct PumpConfig {█*321| pub cadence: PumpCadence,█322| /// `true` = the explicit opt-in to prompt-free updates; default `false`█323| /// surfaces every staged release as a consent notif.█324| pub full_auto_update: bool,█...█330| PumpConfig {█*331| cadence: PumpCadence::from_config(cfg),█332| full_auto_update: cfg.full_auto_update,█333| }█334| }\u000f█</out>█# Tool call ¶█//Finding registry persistence writes█grep(pattern=\"fs::write|save_to|save\\\\(|atomic|snapshot|write\", path=\"crates/spt-daemon/src/registryhost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 23|//! consumers (`spt send`'s WAN resolution, D9-1-4) the host mirrors each█*24|//! subnet's registry to an atomic JSON snapshot under█25|//! `identity/registry/` - readers tolerate staleness (the 4.3█26|//! stale-clean posture), never block on the daemon.█27|// [impl->REQ-INST-7]█...█104| /// REQ-SUBNET-7): stamped onto every advertised row beside the label -█*105| /// the re-pair overwrite anchor. Already domain-separated-hashed by█106| /// [`crate::machineid`]; never the raw id.█107| machine_id: Option<String>,█108| /// When each peer node was last *heard* (an admitted inbound feed,█...█111| /// a probe; only stale rows get dialed. Local-only (never on the wire);█*112| /// mirrored to `heard.meta` beside the snapshots for the CLI reader.█113| heard: Mutex<BTreeMap<String, u64>>,█114| /// Wall-clock ms of the LAST admitted inbound registry/label feed from█115| /// ANY origin - the \"last admitted registry update\" health field█...█117| /// progress, as opposed to `heard`'s per-origin recency. `0` = never.█*118| last_admit_ms: std::sync::atomic::AtomicU64,█119| regs: Mutex<BTreeMap<String, SubnetRegistry>>,█120| /// The node' [...19910ch elided...] d(), \"s\", \"ready_agent\");█*2145| info::write_info(&p, &rec).unwrap();█2146| let mut subnets = SubnetStore::load();█2147| subnets.create_subnet(\"home\").unwrap();█*2148| subnets.save().unwrap();█2149|█2150| let h = host(home); // node_hex = \"aa11\", never in heard█2151| h.advertise_local(&owlery);█...█2178| let rec = InfoJson::new(\"lab-ag\", \"now\", std::process::id(), \"s\", \"ready_agent\");█*2179| info::write_info(&p, &rec).unwrap();█2180| let mut subnets = SubnetStore::load();█2181| subnets.create_subnet(\"lab\").unwrap();█*2182| subnets.save().unwrap();█2183|█2184| let instance_row = |out: &[RegistryFeedRecord], id: &str| {█2185| out.iter()\u000f█</out>█# Tool call ¶█//Finding pump connection ownership█grep(pattern=\"struct PeerIo|impl PeerIo|push_feed|Brain|peer_step|for .*peer|run_round\", path=\"crates/spt-daemon/src/pump/mod.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 7|//! whom* (every roster member of every non-detached member subnet); each worker█*8|//! owns *what* (its node-local `pre_round` and its per-peer `peer_step`), a thin█9|//! call over an already-shipped, idempotent driver. The four legs, in fan-out█10|//! order, each in its own module:█11|//!█...█34|//! choreography table below): [`compute_due`] (prime-all / wake-forces-one),█*35|//! [`pre_rounds`] (once per due round, before any peer_step), [`run_due`]█36|//! (abort-on-first-fail), [`mark_ran`] (the §V4 stagger), [`fan_targets`]█37|//! (detached-skip). LLM-bearing work is never a [`PumpWorker`] (KNOWN-HAZARDS█38|//! 7.4) - see the trait's contract.█...█74|█*75|use crate::brain::{Brain, BrokerEvent, PEER_REPLY_READ_BUDGET};█76|use crate::config::DaemonConfig;█77|use crate::effect::{Minter, MintedOp};█78|use crate::msg::{█...█140|/// dial-eligible when `now >= next_due`. A `DIAL_FAILED` (or a mid-round█*141|/// `peer_step` failure - Q3) doubles `backoff` (capped [`PEER_BACKOFF_CAP`]) and█142|/// pushes `next_due` out; a successful connect drops the entry (reset). Kept in a█143|/// `HashMap<peer_hex, PeerSched>` on the pump loop - RAM-only, re-primed on a█144|/// supe [...9007ch elided...] r() == \"step:2\").count(), 2);█...█1473|█*1474| // Fact 4 - failed-peer_step-aborts-remaining-due-workers-for-that-peer:█1475| // the first error stops the per-peer fan-out (the caller then drops the█1476| // conn); a not-due index is skipped entirely.█1477| #[test]█*1478| fn choreography_peer_step_aborts_on_first_failure() {█1479| // Abort: index 1 fails -> index 2 never reached.█1480| let mut seen = Vec::new();█1481| let res = run_due(&[true, true, true], |i| {█...█1679|█*1680| // CONNECTED for a peer that is NOT a target -> cache but DON'T run legs.█1681| assert!(!presence_state_effect(█1682| &ev(PRESENCE_CONNECTED, 5, \"bystander\"),█1683| &mut conns, &mut sched, &mut pending, &seeds, &mut health, false, now,\u000f█</out>█# Assistant ¶█_**Classifying repeated stream failures**_█# Tool call ¶█//Reading dispatch retry policy█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"180-365,1280-1345\")█<out>█\u000eenum ClaimState {█...█/// 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 per dispatcher lifetime - transient setup█/// failures recover, a persistently-failing stream goes terminal loud.█const MAX_DISPATCH_ATTEMPTS: u32 = 3;█/// Backoff base for a released claim (doubles per failed attempt).█const DISPATCH_RETRY_BASE: Duration = Duration::from_millis(500);█/// The backoff before retry number `attempts` (1-based) runs.█fn retry_backoff(attempts: u32) -> Duration {█DISPATCH_RETRY_BASE * 2u32.saturating_pow(attempts.saturating_sub(1))█}█/// Why a worker failed - the retry CLASSIFICATION (ADR-0038 Amendment fix 5,█/// REQ-DISPATCH-FALLBACK-CIRCUIT). The two classes retry differently:█/// a pre-setup transient keeps the bounded ×3 budget (the D3 semantics);█/// a seat-blocked failure (poisoned replay / prior subscriber still draining)█/// trips the GLOBAL circuit breaker and requeues WITHOUT burning budget -█/// the stream must recover once the wedged seat's writer dies (≤ the 15s█/// bou [...9429ch elided...] bscriber busy: prior subscriber still draining\",█\"stream 7058 replay halted: subscriber write failed\",█\"stream 7058 lease canceled (subscriber poisoned) - serve leg terminated\",█] {█assert_eq!(█classify_failure(seat_blocked),█FailClass::SeatBlocked,█\"for {seat_blocked:?}\"█);█}█for transient in [█\"brain IPC read deadline elapsed\",█\"stream 7058: opener not pinned yet\",█\"unexpected EOF reading broker frame\",█\"no such session 12\",█\"\",█] {█assert_eq!(█classify_failure(transient),█FailClass::Transient,█\"for {transient:?}\"█);█}█}\u000f█</out>█# Tool call ¶█//Reading registry apply writes█read(path=\"crates/spt-daemon/src/registryhost.rs\", selector=\"210-350,730-765,1070-1100\")█<out>█\u000e█/// Apply one inbound feed under the gate. `origin_node` MUST be the█/// handshake-proven stream-table origin, never payload bytes.█// [impl->REQ-INST-7]█// [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]█pub fn apply_feed(█&self,█origin_node: &str,█updates: &[RegistryUpdate],█policy: &RegistryGatePolicy,█) -> Vec<RegistryApplyVerdict> {█self.apply_feed_flips(origin_node, updates, policy).0█}█/// [`apply_feed`](Self::apply_feed) that ALSO reports **attention█/// flips** (D9-2, REQ-INST-3): the endpoint ids whose admitted update was█/// an observed *transition to `Active` on a peer node* - the wire signal█/// that another instance of the id just became the driven one (its█/// daemon advertises transitions epoch-bumped), which rests a local█/// instance of the same id warm (CONTEXT: driving `ling@laptop` makes█/// `ling@desktop` dormant).█///█/// Flip = `Updated` merge where the stored row's status was NOT `Active`█/// and the incoming one is. Deliberately **never `Inserted`**: this█/// registry is in-memory, so a daemon restart re-inserts every peer row█/// at its *current* statu [...6599ch elided...] ure.█fn atomic_write(path: &Path, bytes: &[u8]) -> io::Result<()> {█let tmp = path.with_extension(\"json.tmp\");█std::fs::write(&tmp, bytes)?;█for attempt in 0..5 {█match std::fs::rename(&tmp, path) {█Ok(()) => return Ok(()),█Err(_) if attempt < 4 => {█std::thread::sleep(std::time::Duration::from_millis(20 << attempt));█}█Err(e) => return Err(e),█}█}█unreachable!(\"loop returns on every path\")█}█#[cfg(test)]█mod tests {█use super::*;█use crate::test_home::with_home;█use spt_store::info::{self, InfoJson};█// [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped█// project IDs from the session ledger newest->oldest, excludes owlery-internal cwds█...█}\u000f█</out>█# Tool call ¶█//Finding brain stream subscribe semantics█grep(pattern=\"pub fn net_stream_subscribe|fn net_stream_subscribe|KIND_NET_STREAM_SUBSCRIBE|read_event_until|read_event\\\\(\", path=\"crates/spt-daemon/src/brain.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 53| KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,█*54| 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,█55| KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,█56| KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,█57|};█...█339| /// call deadline of `io_timeout`. This is the peer pump's dedicated client -█*340| /// every reply read is bounded ([`Brain::read_event_until`] via█341| /// [`Brain::call_deadline`]) so a black-holed peer can never wedge the█342| /// single-threaded pump. The split is done at CONSTRUCTION (not flipped on a█343| /// live `Whole` after the fact - moving the `Stream` out by value to split it█...█471| loop {█*472| match self.read_event()? {█473| BrokerEvent::Spawned { session_id, pid } => {█474| self.session_id = Some(session_id);█475| // A resume-mode brain tracks this fresh session per-session via█...█587| }█*588| match [...8511ch elided...] h((seq, bytes)),█2158| other => panic!(\"expected Output, got {other:?}\"),█2159| }█...█2212| stub.feed.send(output_envelope(sid, 4504, b\"ROLLED\")).unwrap();█*2213| match brain.read_event().expect(\"pre-eviction forward ring-roll gap accepted\") {█2214| BrokerEvent::Output { seq, bytes, .. } => {█2215| assert_eq!(seq, 4504, \"the forward-jumped live seq is accepted, not rejected\");█2216| assert_eq!(bytes, b\"ROLLED\");█...█2233| for _ in 0..2 {█*2234| match brain.read_event().expect(\"subsequent live frames\") {█2235| BrokerEvent::Output { seq, bytes, .. } => accepted.push((seq, bytes)),█2236| other => panic!(\"expected Output, got {other:?}\"),█2237| }\u000f█</out>█# Tool call ¶█//Reading broker status methods█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"2890-3010\")█<out>█\u000e pub fn test_seed_wedged_local_controller(&self, id: u64, blocked_ms_ago: u64) -> bool {█...█true█}█/// TEST-SUPPORT seam for the round-3 structural resume guard (stale-guard█/// swap, doyle ruling `docs/UPDATE-WEDGE-R4-STALE-GUARD-RULING.md`): the█/// count of read-only viewers currently attached to hosted session `id`,█/// or `None` if no session with that id is hosted. Lets the deterministic█/// zero-subscriber resume guard assert - with no timing window - that the█/// daemon brain's cursor-only resume attaches NO subscriber to any session,█/// while the paired hazard arm (a `resume_sessions` subscribe) is observed█/// to raise the same count to >= 1. Follows the exact locking idiom of█/// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` ->█/// `get(&id)` -> `Arc::clone(&h.log)` -> `recover_log`).█/// `#[doc(hidden)]` - test support, not a product surface.█// [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]█#[doc(hidden)]█pub fn test_session_viewer_count(&self, id: u64) -> Option<usize> {█let log = {█let sessions = recover(&self.sessions);█match sessions.get(&id) {█[...4588ch elided...] -> usize {█self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)█}█/// The output-log high-water\u000e (`next_seq`) of a hosted session, or `None` if█/// absent. It advances every time the child emits output - the█/// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):█/// after a brain-PROCESS swap, writing input to the broker-held PTY child and█/// watching THIS advance proves the path is alive end-to-end (input -> child ->█/// echo -> broker ring), not merely that the handle is held. A read-only direct█/// peek, like [`session_pid`](Self::session_pid).█// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█pub fn session_output_seq(&self, id: u64) -> Option<u64> {█...█}█[Showing lines 2889-3013 of 6298. Use :3014 to continue]\u000f█</out>█# Assistant ¶█_**Analyzing registry feed I/O behavior**█**Investigating Windows IPC cleanup issues**█**Identifying delayed brain read causing poison**█**Analyzing potential lock ordering and pipe behavior**█**Identifying inefficient snapshot writes causing IO issues**█**Clarifying broker thread count discrepancy**█**Planning thread cleanup investigation**█**Identifying connection lifecycle leak**_█# Tool call ¶█//Reporting registry mechanism█irc(op=\"send\", to=\"Main\", message=\"Registry-specific chain found: each 30s registry round opens+FINs a fresh stream per peer/subnet (`pump/registry.rs:153-171`, `pump/mod.rs:1118-1122`). Receiver classifies every finished Registry row as pending (`dispatch.rs:347-369` only finished Attach terminal), subscribes from seq 0 (`dispatch. [...500ch elided...] stry poison + brain I/O. Need live WPR stack/probe to prove. Also retirement only hides row/clears ring, retains entry/subscriber until QUIC conn close (`nethost.rs:1828-1855`; only removal 953-967).\", replyTo=null, await=false, from=null, timeoutMs=null, peek=null)█<out>█\u000eDelivered to 1 peer(s):█- Main: injected\u000f█</out>█# Assistant ¶█_**Inspecting thread management and stream cleanup**█**Analyzing stream retention and subscriber cleanup issues**█**Verifying BrokerConn drop and Arc cleanup**█**Investigating PTY drain leak and registry poison**_█# Tool call ¶█//Finding drain leak documentation█grep(pattern=\"Drain|PTY reader|reader thread|no-EOF-while-writer-held|request_stop|drain thread\", path=\"docs; crates/spt-daemon/tests; crates/spt-term\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# docs/█## BROKER-BRAIN-SPLIT-RESTORATION.md█55|- ADR-0004 Consequences: *\"A small internal broker **process** exists beneath the daemon - a deliberate, bounded walk-back of 'literally one process,' ... guaranteeing endpoint survival across updates.\"*█*56|- ADR-0004 rejected alternatives include **\"whole-daemon live FD-passing\"** and **\"drain + restart\"** - i.e. the chosen design is specifically *restart the brain, the broker process survives.*█57|- `M3a-PLAN.md`, `M3-PLAN.md`, `M3b-PLAN.md` all name \"the broker **process** + IPC (M3b).\"█58|- Spikes 01/03/04/05/06 each **PROVEN** with *two separate binaries* (`spt-spikes/spike-01-broker-handoff`): a PTY child + a live QUIC transfer survive 100× brain restarts, gapless and exactly-once. A spike that proves \"survives a brain restart\" presupposes the broker is a separate process.█59|█## DEFERRED.md█41|| **Quarantine operator override (`spt update apply --force` - the note-i escape hatch)**: D6-2's quarantine guard refuses re-applying a version that auto-rolled-back on this node (the `RolledBack` record is the marker; clears naturally when N+1 stages). But a version whose failure was **environmental** (a transient boot condition, no [...46027ch elided...] mon brain has no consumer for it today. The brain conn then carries only█90| request/reply -> no subscriber backpressure -> no deadlock. Smallest, brain-side, seamless.█91| Forward-seam: when genuinely daemon-driven sessions land (the live-agent adapter), THOSE█*92| attach on a drained carrier (option B).█*93|- **(B) Drain the brain conn on a DEDICATED reader thread** (`BrainConn::Split` - the exact█94| carrier the pump already uses, brain.rs:230) so the heartbeat reply is never blocked by█95| subscriber backpressure, and subscriptions can persist. Brain-side, seamless.█96|- **(C) [broker-side - deployment risk, FLAG] subscriber writers use a bounded/non-blocking█Showing files 1-20 of 69+. Use skip=20 for the next page, or narrow paths/pattern.█[Some lines truncated to 512 chars]\u000f█</out>█# Tool call ¶█//Finding thread count telemetry█grep(pattern=\"thread count|threads|conn_handler_count|conn-watchdog|watchdog\", path=\"docs; .claude/reports\", selector=null, case=false, gitignore=false, skip=null)█<out>█\u000e# docs/█## BROKER-BRAIN-SPLIT-RESTORATION.md█65|- `daemon.rs:165-170` - `Broker::bind_in_with_net(...)` returns an `Arc<Broker>`; the daemon `thread::spawn`s `broker.serve()`. `broker.rs:181/196` confirm `bind` returns `Arc<Self>` (an in-process object, not a spawned child).█*66|- The pump (`daemon.rs:280`), dispatcher, digest hub, net consumers, psyche loops - **all threads in the same process.**█67|- A repo-wide search finds **no** `Command`/subcommand that spawns a broker child anywhere.█68|█69|### 2.3 Why this is a regression, not a deferral█## CONTEXT-MEMORY.md█6|█*7|- **live context** (per-agent, project-independent - the agent's *mind*): identity/persona, relationship + rapport with the user, the user's cross-project preferences & working style, cross-project life threads, **learnings from work that may apply to other projects**, a thin **project roster** (one line per project the agent works on), the agent's self-model. Synced to **all** instances of the endpoint.█8|- **project context** (per-agent-per-project - what the agent is doing *here*): codebase/architecture, decisions made here, **current focus / next steps / todos**, project conventions, build/test commands, [...20892ch elided...] ive** (`required_stages = []`) until the delivering milestone.█*28|- All Discord-specific design (webhooks, per-agent threads, inbound routing, hybrid delivery, echo-loop prevention, secrets) is recorded in the sister repo **`../spt-discord/`**, deliberately not here.█### 0034-per-minter-op-id-namespacing.md█91| paths, so an unstamped op is uncompilable - the minter resolves at the█*92| genuine minting site and threads by construction, not by discipline. The█93| wire keeps the additive optional field (legacy materialized at broker█94| decode); the newtype is not forced into wire structs.█95|- **The journal-line minter token is TEXTUAL** (derived from the canonical█Showing files 1-20 of 21. Use skip=20 for the next page, or narrow paths/pattern.█[Some lines truncated to 512 chars]\u000f█</out>█# Tool call ¶█//Reading stream retirement exact path█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"940-990,1000-1070,1800-1860\")█<out>█\u000e shared█.presence█.lock()█.unwrap()█.append_connected(id, &remote_id_hex, observed);█// Closed-watcher: the row's exit path. Awaits the connection's end (clean█// close, conn loss, or our own endpoint close), removes the row - conns█// finally LEAVE the table - then appends the `disconnected` event (row█// gone before the event is observable).█// [impl->REQ-EP-4]█let sh_close = Arc::clone(shared);█let conn_close = conn.clone();█let hex_close = remote_id_hex.clone();█tokio::spawn(async move {█conn_close.closed().await;█sh_close.conns.lock().unwrap().remove(&id);█// Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead█// - nothing can ever be served on them again, and leaving them makes█// every future dispatcher generation replay them (the control-steal█// hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing█// else reads a dead conn's stream ring.█// [impl->REQ-REDISPATCH-FINISHED-RETIRE]█sh_close█.streams█.lock()█.unwrap()█.retain(|_, e| e.conn_id != id);█[...5665ch elided...] ome(entry) = self█.shared█.streams█.lock()█.unwrap()█.get(&stream_id)█.map(Arc::clone)█else {█return false;█};█let newly = !entry█.retired█.swap(true, std::sync::atomic::Ordering::SeqCst);█if newly {█// A retired exchange's request bytes are dead weight - free the█// ring; the pinned opener and cursors stay (cheap, bounded).█entry.log.lock().unwrap().ring.clear();█}█newly█}█/// The stream's pinned opener line (ADR-0038 B) - the restart-durable█/// classification fact, independent of the evictable data ring. Outer█/// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\u000f█</out>█# Tool call ¶█//Reading session thread exact path█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"1410-1468,1548-1650,1760-1852,3400-3470\")█<out>█\u000eimpl OutputLog {█...█fn delivered_through(&self) -> u64 {█self.delivered_through.load(Ordering::Acquire)█}█}█/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the█/// `initial` batch (size frame + ring replay) once, then drain live frames from█/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the█/// thread; the drain thread's next `try_send` then sees `Disconnected` and█/// evicts the row. The drain thread itself never blocks on this socket.█fn viewer_writer(█send: SharedSend,█session_id: u64,█initial: Vec<Envelope>,█rx: Receiver<Envelope>,█evicted: Arc<AtomicBool>,█) {█// Bounded writer-exit record on every return path (F-039 leg d) - RAII so█// the reason is stamped exactly once however the thread ends.█// [impl->REQ-CONN-POISON-ATTRIBUTION]█struct ExitNote {█send: SharedSend,█session_id: u64,█reason: &'static str,█}█impl Drop for ExitNote {█fn drop(&mut self) {█self.send.lifecycle_event(█\"writer-exit\",█&format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),█);█[...14130ch elided...] session in info.json (or gossip a stale controller).█// [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]█recover_log(&log_exit).stamp_reaped();█// Reap the dead session from the table.█recover(&sessions_exit).remove(&id);█});█// Layer C: if the spawn carried a translation binary, bring it up with the█// session - spawn the pure stdin->stdout filter + the inject worker that█// owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING█// (logged, `None` -> idle inbound spools, never raw-injected) rather than█// aborting the session - a missing binary costs idle delivery, never the█// operator their agent.█// C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\u000f█</out>█# Tool call ¶█//Reading watcher exact lifetime█read(path=\"crates/spt-daemon/src/conn.rs\", selector=\"414-455,639-665\")█<out>█\u000e/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.█pub(crate) struct BrokerConn {█inner: Arc<Inner>,█/// Joined on drop - after `shutdown` is raised - so the raw handle the█/// watchdog aborts through strictly outlives every raw use.█dog: Option<JoinHandle<()>>,█}█impl BrokerConn {█/// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write█/// deadline (gate-wait + OS write completion) - the broker passes its█/// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).█pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {█let raw = raw_of(&half);█let inner = Arc::new(Inner {█id: CONN_ID_SEQ.fetch_add(1, Ordering::Relaxed) + 1,█label: Mutex::new(String::new()),█first_write_logged: AtomicBool::new(false),█gate: Mutex::new(Gate { half: Some(half) }),█gate_cv: Condvar::new(),█dog: Mutex::new(Dog {█inflight: None,█shutdown: false,█}),█dog_cv: Condvar::new(),█poisoned: AtomicBool::new(false),█timed_out: AtomicBool::new(false),█sever [...644ch elided...] l record of this conn id's life, with█// how it ended (organic EOF vs poisoned vs deadline-poisoned).█self.inner.lifecycle(█\"transport-close\",█&format!(█\"poisoned={} timed_out={}\",█self.inner.poisoned.load(Ordering::Acquire),█self.inner.timed_out.load(Ordering::Acquire)█),█);█{█let mut d = recover(&self.inner.dog);█d.shutdown = true;█self.inner.dog_cv.notify_all();█}█if let Some(dog) = self.dog.take() {█let _ = dog.join();█}█// Halves (gate or graveyard) drop AFTER the watchdog is gone - no raw█// handle use can race the CloseHandle/limbo path.█}█}█fn poisoned_err() -> io::Error {█...█}\u000f█</out>█# Tool call ¶█//Reading PTY drain exact lifetime█read(path=\"crates/spt-term/src/reader.rs\", selector=\"65-182\")█<out>█\u000eimpl DsrMatcher {█...█}█/// A running drain pump over a surface's output. Holds live counters and a█/// cooperative stop flag; see the module docs for the teardown contract.█pub struct Drain {█stop: Arc<AtomicBool>,█dsr_answered: Arc<AtomicU64>,█bytes: Arc<AtomicU64>,█handle: Option<thread::JoinHandle<()>>,█}█impl Drain {█/// Total DSR queries answered so far (live).█pub fn dsr_answered(&self) -> u64 {█self.dsr_answered.load(Ordering::Relaxed)█}█/// Total bytes forwarded to the sink so far (live).█pub fn bytes_forwarded(&self) -> u64 {█self.bytes.load(Ordering::Relaxed)█}█/// Ask the pump to stop. Observed the next time a `read()` returns; it does█/// **not** interrupt a read already blocked (that requires tearing the child█/// down - the no-EOF-while-writer-held discipline).█pub fn request_stop(&self) {█self.stop.store(true, Ordering::Relaxed);█}█/// Join the pump thread. Only returns once the underlying `read()` has█/// unblocked (EOF / error / a returned read that observes the stop flag) -█/// on ConPTY that means the child must be torn down first. Best-effort.█pub fn join(mut [...2361ch elided...] ession {█/// Start draining this surface's output on a background thread, answering█/// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master█/// reader (once - a second call returns [`SurfaceError::ReaderTaken`]).█///█/// This is the substrate the A4 bounded byte-stream and the A5 digest ride.█//█// [impl->REQ-HAZARD-CONPTY-DSR]█pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>█where█S: FnMut(&[u8]) + Send + 'static,█{█let reader = self.take_reader()?;█let writer = self.shared_writer();█Ok(Drain::spawn(reader, writer, sink))█}█}█#[cfg(test)]█mod tests {█use super::*;█use std::sync::Mutex;█use std::time::Duration;█...█}█[Showing lines 64-185 of 287. Use :186 to continue]\u000f█</out>█# Assistant ¶█_**Quantifying thread classes and naming**█**Analyzing connection handler thread lifecycle**_█# Tool call ¶█//Reading broker gauges█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"2860-2945\")█<out>█\u000e pub fn test_seed_wedged_local_controller(&self, id: u64, blocked_ms_ago: u64) -> bool {█...█static SEED_SEQ: AtomicU32 = AtomicU32::new(0);█let name = format!(█\"spt-daemon-wedgeseed-{}-{}.sock\",█std::process::id(),█SEED_SEQ.fetch_add(1, Ordering::Relaxed)█);█let Ok(listener) = LocalSocketTransport::bind(&name) else {█return false;█};█let Ok(_client) = LocalSocketTransport::connect(&name) else {█return false;█};█let Ok(server) = listener.accept() else {█return false;█};█let (_recv, send_half) = server.split();█let send: SharedSend = Arc::new(BrokerConn::new(send_half, brain_write_deadline()));█let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);█// Drain-forever (never a socket write, never finishes while tx lives):█// stays un-reapable as a live-but-wedged writer even under child output.█let writer = thread::spawn(move || for _ in rx.iter() {});█recover_log(&log).controller = Some(ControllerSink {█tx,█send,█attach_gen: 0,█b [...2526ch elided...] let map = recover(&self.sessions);█map.values()█.filter(|s| s.endpoint == endpoint)█.filter_map(|s| s.translation.clone())█.collect()█}█/// The live endpoints running `adapter`, each with its install dir - the apply█/// targets for a live adapter update (W3d decides daemon-apply vs CLI-direct█/// from whether this is empty). Distinct, sorted. (W3a, ADR-0025)█// [impl->REQ-ADAPTER-LIVE-UPDATE]█#[allow(dead_code)] // consumed by W3d `dispatch_adapter_apply` (next sub-commit)█fn endpoints_running_adapter(&self, adapter: &str) -> Vec<(String, std::path::PathBuf)> {█let rows: Vec<_> = {█let map = recover(&self.sessions);█...█};█...█}█[Showing lines 2859-2948 of 6298. Use :2949 to continue]\u000f█</out>█# Tool call ¶█//Finding gauge protocol kinds█grep(pattern=\"CONN_HANDLER|conn_handler|NET_STREAMS|net_streams|session_count\\\\(|active.*tasks\", path=\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/msg.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/brainproc.rs; crates/spt-daemon/src/daemon.rs\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## broker.rs█65| KIND_BROKER_IMAGE, KIND_BROKER_IMAGE_REPLY, KIND_STALL_EVICTS, KIND_STALL_EVICTS_REPLY,█*66| KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,█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,█68| 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,█69| KIND_SPAWNED, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,█...█2611| /// bound WITHOUT the client dropping - the test watches this count fall.█*2612| conn_handlers: AtomicUsize,█2613|}█2614|█2615|/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).█...█2743| wake_inflight: Mutex::new(HashSet::new()),█*2744| conn_handlers: AtomicUsize::new(0),█2745| }))█2746| }█2747|█...█2823| /// Number of currently hosted sessions (for tests / introspection).█*2824| pub fn session_count(&self) -> usize {█2825| recover(&self.sessions).len( [...2445ch elided...] KIND_NET_STREAM_SUBSCRIBE, KIND_OUTPUT, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET,█...█787| }█*788| KIND_NET_STREAMS_REPLY => {█789| let ev: NetStreamsReply = serde_json::from_value(env.payload)█790| .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;█791| return Ok(BrokerEvent::NetStreams(ev));█...█1435| /// finds streams (incl. peer-initiated ones) that arrived while it was down.█*1436| pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {█*1437| self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;█1438| loop {█1439| match self.read_event()? {█1440| BrokerEvent::NetStreams(ev) => return Ok(ev),\u000f█</out>█# Tool call ¶█//Reading broker serve entry█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"3000-3095\")█<out>█\u000e /// D7-1), the net sibling of [`session_count`](Self::session_count).█// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█pub fn net_conn_count(&self) -> usize {█self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)█}█/// The output-log high-water (`next_seq`) of a hosted session, or `None` if█/// absent. It advances every time the child emits output - the█/// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):█/// after a brain-PROCESS swap, writing input to the broker-held PTY child and█/// watching THIS advance proves the path is alive end-to-end (input -> child ->█/// echo -> broker ring), not merely that the handle is held. A read-only direct█/// peek, like [`session_pid`](Self::session_pid).█// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█pub fn session_output_seq(&self, id: u64) -> Option<u64> {█self.sessions█.lock()█.unwrap()█.get(&id)█.map(|h| recover_log(&h.log).next_seq)█}█/// Drive one brain connection: handshake, then dispatch its command frames█/// until it disconnects. On disconnect, detach this connection from any█// [...2797ch elided...] send_error(&send, &msg);█}█}█KIND_KILL => {█if let Err(msg) = self.dispatch_kill(env) {█send_error(&send, &msg);█}█}█// [impl->REQ-ADAPTER-LIVE-UPDATE]█KIND_ADAPTER_APPLY => {█if let Err(msg) = self.dispatch_adapter_apply(env, &send) {█send_error(&send, &msg);█}█}█KIND_NET_STATUS => self.dispatch_net_status(&send),█// [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]█KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),█...█}█}█...█}█[Showing lines 2999-3098 of 6298. Use :3099 to continue]\u000f█</out>█# Tool call ¶█//Reading network task gauges█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"1150-1215,1980-2045\")█<out>█\u000efn epoch_ms() -> u64 {█std::time::SystemTime::now()█.duration_since(std::time::UNIX_EPOCH)█.map(|d| d.as_millis() as u64)█.unwrap_or(0)█}█/// DIAGNOSTIC (round-3): decrement the in-flight dial gauge on drop, so a dial█/// task that panics or is cancelled still leaves the count correct.█struct DialGauge(Arc<AtomicUsize>);█impl Drop for DialGauge {█fn drop(&mut self) {█self.0.fetch_sub(1, Ordering::Relaxed);█}█}█impl NetHost {█/// Bind the broker's endpoint on a fresh dedicated runtime and start the█/// accept loop. The endpoint speaks TWO ALPNs (M7 D3, REQ-SUBNET-2): the█/// trusted [`SPT_NET_ALPN`] (connections join the table as before) and█/// the pre-trust pairing ALPN - routed to the always-on responder█/// ([`crate::pairhost::respond`]), never registered in the stream table.█/// One endpoint for both is deliberate: the pairing transcript binds and█/// pins the REAL node pubkey, and the relay can only route one endpoint█/// per key - the ALPN is the pre-trust/trusted boundary (ADR-0005).█/// The meet-rotation listener loop rides the same runtime.█// [impl->REQ-DAEMON-2]█// [impl->REQ-SUBNET [...3662ch elided...] Arc::clone(&self.endpoint);█self.runtime.handle().block_on(async move {█endpoint.close().await;█});█}█}█#[cfg(test)]█mod tests {█use super::*;█fn hermetic(identity: &Identity) -> NetConfig {█NetConfig {█identity: Identity::from_seed(&identity.seed()),█relay: RelayPolicy::Disabled,█discovery: LocalDiscovery::Off,█scope: BindScope::Loopback,█membership: None,█}█}█// [unit->REQ-DAEMON-2] the endpoint is constructed broker-side (inside the█// host's dedicated runtime) with relays disabled, bound to the node's own█// identity, with an empty conn table.█#[test]█fn host_binds_endpoint_to_node_identity() {█let id = Identity::generate();█...█}█...█}\u000f█</out>█# Assistant ¶█_**Planning exact loop cleanup**_█# Tool call ¶█//Reading connection cleanup█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"3230-3305\")█<out>█\u000e fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {█...█loop {█...█match env.kind.as_str() {█...█KIND_SESSIONS => {█...█let reply = SessionsReply {█sessions: snaps█...█.map(|s| SessionInfo {█...█resume_seq: s.resume_seq,█controller_by: s.controller_by,█})█.collect(),█};█let frame = Envelope::new(█KIND_SESSIONS_REPLY,█serde_json::to_value(reply).expect(\"SessionsReply serializes\"),█);█send_frame(&send, &frame);█}█KIND_ENDPOINT_INPUT => {█if let Err(msg) = self.dispatch_endpoint_input(env, &send) {█send_error(&send, &msg);█}█}█KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {█Ok(id) => my_stream_subs.push(id),█Err(msg) => send_err [...2576ch elided...] bad spawn payload: {e}\"))?;█// Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the█// sole spawner post-W3, so its own spawn choke is the single-flight authority.█// Dedup a duplicate wake/resume for an endpoint that already has a live session█// OR a spawn in flight - closing the check-then-spawn TOCTOU that let one wake█// spawn two identical launch trees (perri's flynn dup: duplicate perch writers█// then stomped info.json, routing injects to a contended record). The claim +█// the live-session check are read together under one atomic critical section so█// a concurrent spawn either sees our claim or its registered session - never a█...█}█[Showing lines 3229-3308 of 6298. Use :3309 to continue]\u000f█</out>█# Tool call ¶█//Reading network subscriptions█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"490-585,1725-1810,1880-1930\")█<out>█\u000e /// Mark the read side finished and tell the subscriber (with the final█/// cursor, so it can verify completeness).█fn finish(&mut self) {█self.finished = true;█if let Some(seat) = &self.subscriber {█let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);█// Enqueue only - same discipline as append (Amendment fix 2:█// ALL producer sites halt-and-remove, finish included).█// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]█if let Err(fail) = seat.enqueue(frame) {█self.drop_seat(fail);█}█}█}█/// Install `sub` as the subscriber with the replay snapshot (retained█/// chunks with `seq >= from_seq`, then eof if already finished) handed to█/// its seat's WRITER THREAD, which drains it before any live frame - the█/// replay-then-live seq order is structural (see█/// [`SubscriberSeat::install`]), while every conn write still happens█/// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring█/// under the lock with discarded write errors, the exact serial-poison█/// engine of the v0.34 field stalls). Returns the [...8928ch elided...]█/// candidate set [`Self::open_loopback_pair`] diffs to find the peer it just█/// minted.█fn inbound_rows_on(&self, conn_id: u64) -> HashSet<u64> {█self.shared█.streams█.lock()█.unwrap()█.iter()█.filter(|(_, e)| e.conn_id == conn_id && !e.initiated_locally)█.map(|(id, _)| *id)█.collect()█}█/// Open a same-node loopback tunnel stream PAIR (M11-W3, REQ-SHELL-4) and█/// return `(owner_stream, shell_stream)` - the operator row the owner side█/// drives and the cross-wired peer row the shell side drives. The loopback█/// `open_stream` mints both rows in-process (one `duplex` wires them, so a█/// write to either send appears on the other's read log). Serialized so the\u000f█</out>█# Tool call ¶█//Reading subscriber worker█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"165-235\")█<out>█\u000e█impl SubscriberSeat {█/// Install a seat: spawn its writer thread and hand back the handle.█/// `replay` is the attach snapshot, moved in UNDER the log mutex (a█/// memory move, never conn I/O): the writer drains it COMPLETELY before█/// touching the live queue, so replay-then-live seq order holds by█/// construction even while producers enqueue concurrently. (Gate follow-█/// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE█/// the mutex - a concurrent append could slot a live frame into the█/// middle of the replay and break the brain's strict gap check: the xfer█/// re-serve \"got seq 134 want 6\" CI red.)█/// `lease` (StreamLog seats; `None` for presence) is the stream's serve█/// lease AT INSTALL: the writer cancels it the moment a write fails, so█/// the paired serve/wire worker's next forward refuses PROMPTLY - even on█/// a traffic-quiet stream where no producer enqueue would ever run█/// `drop_seat` (a mid-replay poison with no follow-on appends previously█/// left the lease alive until the next append; the T4 forwarder starved).█/// A LATE cancel from a superseded writer - poisoned OR heal [...1635ch elided...] poison(\"live write failed\");█break;█}█}█writer_done.store(true, Ordering::Release);█});█SubscriberSeat {█sub,█tx,█done,█poisoned,█}█}█/// Non-blocking enqueue (the producer sites: append, finish, presence█/// push). `Err` means the seat must be removed.█fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {█if self.poisoned.load(Ordering::Acquire) {█return Err(SeatFail::Poisoned);█}█match self.tx.try_send(frame) {█Ok(()) => Ok(()),█Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),█...█}█}█...█}█[Showing lines 164-238 of 2865. Use :239 to continue]\u000f█</out>█# Tool call ¶█//Reading broker writer loops█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"1405-1610,1765-1835\")█<out>█\u000eimpl OutputLog {█...█fn is_controller(&self, sub: &SharedSend) -> bool {█...█}█/// The next seq a re-attaching controller still needs (the persisted resume█/// cursor surfaced in `KIND_SESSIONS` -> `resume_seq`). W1: read from the█/// atomic the controller writer thread advances.█fn delivered_through(&self) -> u64 {█self.delivered_through.load(Ordering::Acquire)█}█}█/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the█/// `initial` batch (size frame + ring replay) once, then drain live frames from█/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the█/// thread; the drain thread's next `try_send` then sees `Disconnected` and█/// evicts the row. The drain thread itself never blocks on this socket.█fn viewer_writer(█send: SharedSend,█session_id: u64,█initial: Vec<Envelope>,█rx: Receiver<Envelope>,█evicted: Arc<AtomicBool>,█) {█// Bounded writer-exit record on every return path (F-039 leg d) - RAII so█// the reason is stamped exactly once however the thread ends.█// [impl->REQ-CONN-POISON-ATTRIBUTION]█struct ExitNote {█send: SharedSend,█session_id [...11453ch elided...] if !self.backpressure.swap(true, Ordering::AcqRel) {█self.stamp_backpressure(true);█}█false█}█// The writer thread is gone (session teardown) - nothing to do.█Err(TrySendError::Disconnected(_)) => false,█}█}█/// Mirror the input-backpressure signal to the perch's `info.json` (the█/// broker is the single writer). Best-effort: a session served without a█/// perch (raw broker tests) has nowhere to record.█fn stamp_backpressure(&self, dropping: bool) {█if self.endpoint.is_empty() {█return;█}█let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);█let _ = spt_store::info::set_input_backpressure(&perch, dropping);█}█}\u000f█</out>█# Assistant ¶█_**Verifying thread handle cleanup**█**Analyzing session attachment limits**_█# Tool call ¶█//Reading viewer caps█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"85-150,890-970,1090-1160\")█<out>█\u000e/// Default bounded output-log depth (chunks). Large enough that a brain restart█/// window never evicts unreplayed output in practice; the bound is what keeps a█/// disconnected session from buffering without limit.█const DEFAULT_LOG_CHUNKS: usize = 4096;█/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it█/// OVERFLOWS the viewer is evicted - the drain `try_send`s and never blocks█/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render█/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely█/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread█/// owns the replay batch), so a viewer attaching to a busy session is not█/// spuriously evicted.█const VIEWER_CHANNEL_DEPTH: usize = 256;█/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:█/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.█const MAX_VIEWERS: usize = 32;█/// Whether a viewer's bounded-queue `try_send` result demands EVICTION█/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with█/// the live stream) or a `Disconnected` one (its writer threa [...9677ch elided...] iter_evicted));█self.viewers.insert(█vid,█ViewerSink {█tx,█send: sub,█evicted,█_writer: writer,█},█);█}█/// Resolve a controller/viewer subscribe under the W2.5 model█/// (REQ-RCVIEW-1 / REQ-KICK-1). Returns the [`SubscribeOutcome`]; performs█/// the controller take / viewer add / loud displace as a side effect. See the█/// identity matrix in the body - the `by`-keyed logic is what makes a█/// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.█fn resolve_subscribe(█&mut self,█sub: SharedSend,█from_seq: u64,█intent: AttachIntent,█by: Option<String>,█...█) -> SubscribeOutcome {█...█}\u000f█</out>█# Tool call ¶█//Reading spawn lifecycle█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"3380-3510\")█<out>█\u000e fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {█...█let session = PtySession::spawn_program_in_env(█...█req.env.iter().map(|(k, v)| (k.as_str(), v.as_str())),█)█.map_err(|e| format!(\"spawn failed: {e}\"))?;█let session = Arc::new(session);█let id = self.next_id.fetch_add(1, Ordering::Relaxed);█let pid = session.process_id();█// The session's lone PTY input-writer (P0): the SOLE caller of the█// blocking `write_input`. Every dispatch-side write enqueues here, so a█// paste burst parks only this thread - never the broker dispatch thread█// (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it█// too, so the lone writer enforces the W2 inject-floor order.█let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());█// The output log, with the spawning connection pre-attached as the█// controller (identity `None` = LOCAL, not a remote driver) so no chunk█// is missed before an explicit subscribe - and so a remote attach to a█// spawned-but-undriven session takes control silently [...4467ch elided...] d,█HostedSession {█session,█input,█drain,█log,█endpoint: req.endpoint.clone(),█translation,█translation_argv: req.translation_binary.clone(),█translation_respawns,█adapter: req.adapter.clone(),█install_dir: req.install_dir.clone().map(std::path::PathBuf::from),█},█);█let resp = Spawned {█session_id: id,█pid,█};█let frame = Envelope::new(█KIND_SPAWNED,█serde_json::to_value(resp).expect(\"Spawned serializes\"),█);█send_frame(send, &frame);█Ok(id)█}█[Showing lines 3379-3513 of 6298. Use :3514 to continue]\u000f█</out>█# Tool call ¶█//Reading input writer loop█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"1840-1890\")█<out>█\u000e/// records from `rx` and apply each via the BLOCKING█/// [`SessionSurface::write_input`] - the ONE place that touches the PTY writer. A█/// wedged harness parks this thread (and only this thread); a write error is█/// swallowed (the same best-effort the inline callers had). The thread exits█/// when the last `tx` clone drops at session teardown.█fn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {█while let Ok(bytes) = rx.recv() {█let _ = session.write_input(&bytes);█}█}█/// Drain the inject floor's buffered controller input to the PTY **after** an█/// injected sequence, then release the floor. Each step takes the buffered bytes█/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never█/// hold a lock across a PTY write - now never block on it either); input arriving█/// mid-flush keeps buffering, so strict order is preserved until the buffer█/// drains empty and the floor frees.█/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of█/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the█/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the█/// controll [...1588ch elided...] ap ops it guards (`sessions` / `pair_holds`█/// inserts+removes stay coherent on recovery - the same argument as the floor). The█/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].█/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident█/// lock reachable from serve/dispatch - use `recover`/`recover_log` or a documented█/// fail-fast justification.█// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]█fn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {█m.lock().unwrap_or_else(|p| p.into_inner())█}█/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the█/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can█[Showing lines 1839-1893 of 6298. Use :1894 to continue]\u000f█</out>█# Tool call ¶█//Reading translation lifecycle█read(path=\"crates/spt-daemon/src/translation.rs\", selector=\"260-405\")█<out>█\u000eimpl TranslationChild {█...█pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {█...█// [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]█#[cfg(windows)]█{█use std::os::windows::process::CommandExt;█const CREATE_NO_WINDOW: u32 = 0x0800_0000;█command.creation_flags(CREATE_NO_WINDOW);█}█let mut child = command.spawn()?;█let pid = child.id().into();█let stdout = child█.stdout█.take()█.expect(\"stdout piped at spawn\");█let stdin = child.stdin.take().expect(\"stdin piped at spawn\");█let reader = thread::spawn(move || {█let buf = BufReader::new(stdout);█for line in buf.lines() {█let Ok(line) = line else { break }; // child stdout closed█let trimmed = line.trim();█if trimmed.is_empty() {█continue;█}█match serde_json::from_str::<KeyCmd>(trimmed) {█Ok(cmd) => {█if cmds.send(cmd).is_err() {█break; // broker dropped the receiver - stop reading█[...3765ch elided...] serde_json::Value = serde_json::from_str(&ping).unwrap();█assert_eq!(█v.as_object().unwrap().keys().collect::<Vec<_>>(),█vec![\"type\"],█\"the input ping must carry no field other than `type` - no PTY content\"█);█}█// [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows█// before spawn) must not break the spawn - the error-87 flag-combo regression█// class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,█// verified by the live watcher); this proves the flagged spawn still starts a live█// child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.█#[test]█fn flagged_spawn_still_starts() {█...█}█...█}█[Showing lines 259-408 of 508. Use :409 to continue]\u000f█</out>█# Assistant ¶█_**Identifying race condition in session insertion and cleanup**█**Analyzing session count discrepancy and thread races**_█# Tool call ¶█//Reading inject supervisor█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"1950-2050,2300-2395\")█<out>█\u000e/// (reused; only the translation child is created). Extracted verbatim from█/// `dispatch_spawn` so a live-update restart (`dispatch_adapter_apply`, W3d) can█/// rebuild a session's translation child from the NEW binary without disturbing█/// the PTY / output log / session (brain-parity).█// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]█// [impl->REQ-ADAPTER-LIVE-UPDATE]█fn build_translation(█argv: &[String],█endpoint_id: &str,█input: &Arc<InputWriter>,█respawns: Arc<AtomicU32>,█log: &Arc<Mutex<OutputLog>>,█) -> Option<Arc<Translation>> {█let (cmd_tx, cmd_rx) = channel::<KeyCmd>();█match TranslationChild::spawn(argv, cmd_tx) {█Ok(child) => {█let child = Arc::new(child);█// First line: identity (content-free of any PTY bytes).█let _ = child.send(&ToBinary::Init {█endpoint_id: endpoint_id.to_string(),█node: spt_store::hostlabel::os_hostname().unwrap_or_default(),█});█let floor = Arc::new(Mutex::new(InjectFloor::default()));█let faulted = Arc::new(AtomicBool::new(false));█let (event_tx, event_rx) = channel::<String>();█let w_inp [...8824ch elided...] CHO_MISS:{endpoint}: typed head did not echo (attempt {attempt}/{INJECT_REDRIVE_ATTEMPTS}) - re-driving once\"█);█committed = false; // re-drive; only a verified commit counts█continue;█}█// Second miss -> the head is swallowed even after a re-drive.█integrity_lost = true;█break;█}█}█}█if send_failed {█// stdin write FAILED -> the binary is genuinely GONE (a REAL fault): re-spool█// the in-flight envelope, stamp + terminate, exit for a bounded respawn.█respool_and_fault(█&endpoint,█envelope_copy,█...█);█...█}█...█}\u000f█</out>█# Tool call ¶█//Finding all broker thread spawns█grep(pattern=\"thread::spawn|thread::Builder\", path=\"crates/spt-daemon/src/broker.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 947| let writer_blocked = Arc::clone(&write_blocked_since);█*948| let writer = thread::spawn(move || {█949| controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)█950| });█951| self.controller = Some(ControllerSink {█...█1137| let writer =█*1138| thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));█1139| self.viewers.insert(█1140| vid,█1141| ViewerSink {█...█1789| let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());█*1790| let writer = thread::spawn(move || input_writer(session, rx));█1791| Arc::new(InputWriter {█1792| tx,█1793| backpressure: AtomicBool::new(false),█...█1991| let sup_endpoint = endpoint_id.to_string();█*1992| thread::spawn(move || {█1993| run_inject_worker_supervised(█1994| sup_child,█1995| sup_faulted,█...█2794| let me = Arc::clone(self);█*2795| thread::spawn(move || {█2796| let _ = me.handle_conn(conn);█2797| });█[...2915ch elided...] let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);█*5951| let writer = thread::spawn(|| {});█5952| for _ in 0..1000 {█5953| if writer.is_finished() {█5954| break;█...█5992| let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);█*5993| let writer = thread::spawn(move || {█5994| let _ = rx.recv(); // blocks (idle live controller) until tx drops█5995| });█5996| log.controller = Some(ControllerSink {█...█6030| let write_blocked_since = Arc::new(Mutex::new(blocked));█*6031| let writer = thread::spawn(move || {█6032| let _ = rx.recv(); // parked (live, not finished) until tx drops█6033| });█6034| log.controller = Some(ControllerSink {\u000f█</out>█# Tool call ¶█//Finding net thread spawns█grep(pattern=\"thread::spawn|std::thread::spawn|thread::Builder\", path=\"crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/█## spt-daemon/src/█### nethost.rs█195| let writer_poisoned = Arc::clone(&poisoned);█*196| std::thread::spawn(move || {█197| let poison = |halt_reason: &str| {█198| writer_poisoned.store(true, Ordering::Release);█199| if let Some(l) = &lease {█...█2258| let sent = Arc::clone(&sent);█*2259| std::thread::spawn(move || {█2260| for f in &frames {█2261| host.send_stream(owner, f, false).expect(\"send\");█2262| sent.fetch_add(1, AtOrd::Relaxed);█### conn.rs█447| let dog_inner = Arc::clone(&inner);█*448| let dog = thread::Builder::new()█449| .name(\"conn-watchdog\".into())█450| .spawn(move || dog_inner.watchdog())█451| .ok();█### translation.rs█272| let stdin = child.stdin.take().expect(\"stdin piped at spawn\");█*273| let reader = thread::spawn(move || {█274| let buf = BufReader::new(stdout);█275| for line in buf.lines() {█276| let Ok(line) = line else { break }; // child stdout closed█## spt-term/src/█### reader.rs█119|█*120| let handle = thread::spawn(move || {█121| let mut reader = reader;█122| let mut matcher = DsrMatcher::default();█123| let mut buf = [0u8; 8192];\u000f█</out>█# Tool call ¶█//Finding daemon broker spawns█grep(pattern=\"thread::spawn|thread::Builder\", path=\"crates/spt-daemon/src/daemon.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 192| let serve_broker = Arc::clone(&broker);█*193| thread::spawn(move || {█194| let _ = serve_broker.serve();█195| });█196| // Inbound net dispatch + outbound peer pump (D9-1) now run in█...█212| let broker = Arc::clone(&broker);█*213| thread::spawn(move || net_retry_attach(broker));█214| }█215| // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):█216| // bring saved startup defaults back up against the broker we█...█220| // [impl->REQ-ENDPOINT-AUTOSTART]█*221| thread::spawn(|| {█222| crate::autostart::replay_startup_endpoints(&broker_socket_name());█223| });█224| // The node-local docs server (ADR-0036 §4): broker-side so█...█263| let hub = Arc::clone(&digest_hub);█*264| thread::spawn(move || {█265| let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);█266| });█267| }█...█277| let hub = Arc::clone(&drive_hub);█*278| thread::spawn(move || {█279| let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);█280| });█281| }█...█294| let broker = Arc::clone(broker);█*295| thread::spawn(move || {█296| let _ = crate::tunnelhub::serve_tunnel_control(█297| &crate::endpoint::tunnel_socket_name(),█298| hub,█...█1704| let serve_name = name.clone();█*1705| thread::spawn(move || {█1706| let _ = serve_seed_control(&serve_name, srv);█1707| });█1708| for _ in 0..400 {\u000f█</out>█# Assistant ¶█_**Planning exact serve loop implementation**_█# Tool call ¶█//Reading broker accept loop█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"2760-2830\")█<out>█\u000e /// the boot-race self-heal path calls this once the background retry brings█/// the net endpoint up, after which the dispatcher + peer pump are spawned.█/// Idempotent by `OnceLock` - a second attach is a no-op returning `false`█/// (the first host wins); the hot read path (`net()`) never blocks on it.█// [impl->REQ-DAEMON-9]█pub fn attach_net(&self, host: NetHost) -> bool {█self.net.set(host).is_ok()█}█/// The broker-owned exactly-once anchor (for introspection / tests).█pub fn journal(&self) -> &Arc<EffectJournal> {█&self.journal█}█/// The broker-owned network host, if one is attached (at bind or via the█/// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.█pub fn net(&self) -> Option<&NetHost> {█self.net.get()█}█/// Accept connections forever, handling each on its own thread. The broker█/// is the long-lived process; this is its main loop. Per-connection█/// threading is half the KH 7.4 isolation stance: one brain's blocking█/// dispatch can never stall another's (the per-session half is█/// [`Broker::dispatch_spawn`]'s drain/waiter threads).█// [impl->REQ-HAZARD-DAEMON-SCH [...1629ch elided...] let me = Arc::clone(self);█Ok(thread::spawn(move || {█let _ = me.handle_conn(conn);█}))█}█/// Number of currently hosted sessions (for tests / introspection).█pub fn session_count(&self) -> usize {█recover(&self.sessions).len()█}█/// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling█/// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-█/// wedged LOCAL controller (`by: None`) on hosted session `id` - a sink█/// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and█/// whose writer thread only drains its channel (it NEVER calls█/// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical█[Showing lines 2759-2833 of 6298. Use :2834 to continue]\u000f█</out>█# Tool call ¶█//Reading PTY drain loop█read(path=\"crates/spt-term/src/reader.rs\", selector=\"95-160\")█<out>█\u000eimpl Drain {█...█/// unblocked (EOF / error / a returned read that observes the stop flag) -█/// on ConPTY that means the child must be torn down first. Best-effort.█pub fn join(mut self) {█if let Some(h) = self.handle.take() {█let _ = h.join();█}█}█}█impl Drain {█/// Spawn the drain thread over `reader`, answering DSR via `writer` and█/// forwarding every byte to `sink`. The `sink` may block (that is how A4's█/// bounded channel applies backpressure).█fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self█where█R: Read + Send + 'static,█S: FnMut(&[u8]) + Send + 'static,█{█let stop = Arc::new(AtomicBool::new(false));█let dsr_answered = Arc::new(AtomicU64::new(0));█let bytes = Arc::new(AtomicU64::new(0));█let t_stop = Arc::clone(&stop);█let t_dsr = Arc::clone(&dsr_answered);█let t_bytes = Arc::clone(&bytes);█let handle = thread::spawn(move || {█let mut reader = reader;█let mut matcher = DsrMatcher::default();█let mut buf = [0u8; 8192];█loop {█if t_stop.load(Ordering:: [...697ch elided...] }█let _ = w.flush();█}█t_dsr.fetch_add(hits, Ordering::Relaxed);█}█sink(chunk);█t_bytes.fetch_add(n as u64, Ordering::Relaxed);█}█Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,█Err(_) => break,█}█}█});█Drain {█stop,█dsr_answered,█bytes,█handle: Some(handle),█}█}█}█impl PtySession {█/// Start draining this surface's output on a background thread, answering█...█}█[Showing lines 94-163 of 287. Use :164 to continue]\u000f█</out>█# Tool call ¶█//Reading conn watchdog loop█read(path=\"crates/spt-daemon/src/conn.rs\", selector=\"330-415,440-460,625-665\")█<out>█\u000eimpl Inner {█...█fn sever(&self) {█...█#[cfg(windows)]█// SAFETY: as in poison_and_cancel - handle outlives the watchdog.█unsafe {█let _ = win::DisconnectNamedPipe(self.raw);█let _ = win::CancelIoEx(self.raw, core::ptr::null_mut());█}█}█/// The watchdog body: park until a write is in flight, then sleep to its█/// absolute deadline. If the op is still in flight at the deadline,█/// poison + cancel, re-canceling periodically until the op reports█/// completion (the writer clears `inflight` the instant `write_frame`█/// returns - that return IS the buffer-release handshake), then sever.█fn watchdog(&self) {█let mut d = recover(&self.dog);█loop {█// Park until armed (or shutdown).█let (op, deadline) = loop {█if d.shutdown {█return;█}█if let Some(armed) = d.inflight {█break armed;█}█d = self█.dog_cv█.wait(d)█.unwrap_or_else(|p| p.into_inner());█};█// Sleep toward [...3701ch elided...] l record of this conn id's life, with█// how it ended (organic EOF vs poisoned vs deadline-poisoned).█self.inner.lifecycle(█\"transport-close\",█&format!(█\"poisoned={} timed_out={}\",█self.inner.poisoned.load(Ordering::Acquire),█self.inner.timed_out.load(Ordering::Acquire)█),█);█{█let mut d = recover(&self.inner.dog);█d.shutdown = true;█self.inner.dog_cv.notify_all();█}█if let Some(dog) = self.dog.take() {█let _ = dog.join();█}█// Halves (gate or graveyard) drop AFTER the watchdog is gone - no raw█// handle use can race the CloseHandle/limbo path.█}█}█fn poisoned_err() -> io::Error {█...█}\u000f█</out>█# Tool call ¶█//Reading hosted session fields█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"1660-1770,2585-2630\")█<out>█\u000efn controller_writer(█...█) {█...█send.lifecycle_event(█...█);█}█/// The per-session translation-binary attachment (W2 Layer C, ADR-0022). Present█/// ONLY when the spawn carried a `translation_binary` path; absent -> the session█/// has no idle PTY delivery and inbound SPOOLS (ADR-0022 amendment - raw inject█/// was removed as a delivery path; it did not submit on a modern TUI).█///█/// Holds the shared inject floor (the controller-input buffer, also touched by█/// `dispatch_input`), the queue that feeds inbound `<EVENT>`s to the inject worker█/// (events serialize - never two uncommitted sequences interleaved), the shared█/// child handle (so `dispatch_input` can fire content-free `{type:input}` pings█/// while the worker drives an event), and the FAULT flag the worker raises when a█/// sequence misses its [`INJECT_COMMIT_DEADLINE`] or the binary dies - after which█/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.█struct Translation {█/// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.█floor: Arc<Mutex<InjectFloor>>,█/// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here█/// and are [...6949ch elided...] OF cleanup within the write█/// bound WITHOUT the client dropping - the test watches this count fall.█conn_handlers: AtomicUsize,█}█/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).█struct PairHold {█subnet: String,█addr: EndpointAddr,█/// When the wait-for-code window expires (meet + 5 minutes).█deadline: Instant,█}█/// The two-phase join's wait-for-code window: the daemon holds the met address█/// this long before a code must arrive (ADR-0030 / REQ-JOIN-TWO-PHASE).█const PAIR_CODE_WAIT: Duration = Duration::from_secs(5 * 60);█/// Whether a held meet is still within its wait-for-code window█/// (REQ-JOIN-TWO-PHASE). Pure (the testable core of the timeout).█fn hold_is_live(deadline: Instant, now: Instant) -> bool {█deadline > now█}\u000f█</out>█# Assistant ¶█_**Analyzing Rust struct drop order and dependencies**_█# Tool call ¶█//Reading drain drop contract█read(path=\"crates/spt-term/src/reader.rs\", selector=\"64-110\")█<out>█\u000eimpl DsrMatcher {█...█fn scan(&mut self, chunk: &[u8]) -> u64 {█...█}█}█/// A running drain pump over a surface's output. Holds live counters and a█/// cooperative stop flag; see the module docs for the teardown contract.█pub struct Drain {█stop: Arc<AtomicBool>,█dsr_answered: Arc<AtomicU64>,█bytes: Arc<AtomicU64>,█handle: Option<thread::JoinHandle<()>>,█}█impl Drain {█/// Total DSR queries answered so far (live).█pub fn dsr_answered(&self) -> u64 {█self.dsr_answered.load(Ordering::Relaxed)█}█/// Total bytes forwarded to the sink so far (live).█pub fn bytes_forwarded(&self) -> u64 {█self.bytes.load(Ordering::Relaxed)█}█/// Ask the pump to stop. Observed the next time a `read()` returns; it does█/// **not** interrupt a read already blocked (that requires tearing the child█/// down - the no-EOF-while-writer-held discipline).█pub fn request_stop(&self) {█self.stop.store(true, Ordering::Relaxed);█}█/// Join the pump thread. Only returns once the underlying `read()` has█/// unblocked (EOF / error / a returned read that observes the stop flag) -█/// on ConPTY that means the child must be torn down first. Best-effort.█pub fn join(mut self) {█if let Some(h) = self.handle.take() {█let _ = h.join();█}█}█}█impl Drain {█/// Spawn the drain thread over `reader`, answering DSR via `writer` and█/// forwarding every byte to `sink`. The `sink` may block (that is how A4's█/// bounded channel applies backpressure).█fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self█where█R: Read + Send + 'static,█S: FnMut(&[u8]) + Send + 'static,█{█let stop = Arc::new(AtomicBool::new(false));█let dsr_answered = Arc::new(AtomicU64::new(0));█...█}█}█[Showing lines 63-113 of 287. Use :114 to continue]\u000f█</out>█# Assistant ¶█_**Tracing Drain drop and EOF handling**█**Identifying EOF blockage due to writer clone**_█# Tool call ¶█//Reading reader teardown invariant█read(path=\"crates/spt-term/src/reader.rs\", selector=\"1-65\")█<out>█\u000e//! Output drain pump - the ConPTY-DSR auto-answer reader (M3a A2).█//!█//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child█//! stdout until the terminal answers it** (Spike #1: a run captured exactly the█//! 4 bytes `\\e[6n` and zero program output - the child looked dead but was█//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).█//! Whether the query fires is build- and program-dependent (some ConPTY versions█//! never emit it for short commands; an app that queries DSR itself always█//! will). A real terminal *is* expected to answer DSR regardless, so the pump█//! answers every `ESC[6n` it sees on every platform unconditionally - harmless█//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY█//! that does withhold. The auto-answer is verified deterministically by injecting█//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).█//!█//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master█//! does *not* EOF while the writer is held, so the read loop runs on its own█//! thread and shutdown **never gates on a blocking `read()` returning**. The█//! bro [...1264ch elided...] w many complete DSR queries it completed.█fn scan(&mut self, chunk: &[u8]) -> u64 {█let mut hits = 0;█for &b in chunk {█if b == DSR_QUERY[self.matched] {█self.matched += 1;█if self.matched == DSR_QUERY.len() {█hits += 1;█self.matched = 0;█}█} else {█// Restart - but `b` may itself begin a fresh match (e.g. a lone ESC).█self.matched = usize::from(b == DSR_QUERY[0]);█}█}█hits█}█}█/// A running drain pump over a surface's output. Holds live counters and a█/// cooperative stop flag; see the module docs for the teardown contract.█pub struct Drain {█...█}█[Showing lines 1-68 of 287. Use :69 to continue]\u000f█</out>█# Assistant ¶█_**Analyzing BrokerConn Arc cycle for leak**█**Identifying unbounded connection growth and subscription leaks**█**Tracing dispatcher retention of finished registry rows**█**Tracing registry stream lifecycle**_█# Tool call ¶█//Reading dispatch claims loop█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"470-620\")█<out>█\u000epub fn run_dispatch_loop(█...█) -> io::Result<()> {█...█while !stop.load(Ordering::Relaxed) {█...█for s in reply.streams {█...█// after its backoff (REQ-DISPATCH-CLAIM-RETRY).█if s.initiated_locally || s.next_seq == 0 {█continue;█}█if !pool_has_room(active_workers.load(Ordering::Relaxed)) {█break; // pool full: the rest of the table waits for the next poll█}█let attempts = {█let mut c = claims.lock().unwrap();█match should_claim(c.get(&s.stream_id), Instant::now()) {█Some(attempts) => {█c.insert(s.stream_id, ClaimState::InFlight { attempts });█attempts█}█None => continue,█}█};█let name = broker_name.to_string();█let origin = s.remote_id_hex.clone();█let stream_id = s.stream_id;█let conn_id = s.conn_id;█let floor_seq = s.floor_seq;█let finished = s.finished;█let p = paths.clone();█let reg = Arc::clone(&registry);█[...5191ch elided...] > last = e,█}█thread::sleep(Duration::from_millis(10));█}█Err(last)█}█fn now_ms() -> u64 {█std::time::SystemTime::now()█.duration_since(std::time::UNIX_EPOCH)█.map(|d| d.as_millis() as u64)█.unwrap_or(0)█}█/// The stream's first NDJSON line, restart-durable (ADR-0038 B,█/// REQ-STREAM-OPENER-DURABLE): read the broker-pinned opener fact first -█/// it survives any ring roll - and fall back to the ring peek only when the█/// broker predates the verb (KH-2.3 N-1 window). `Ok(None)` = unclassifiable█/// (terminal); `Err` = transient (the claim requeues bounded).█fn first_line(█broker_name: &str,█stream_id: u64,█floor_seq: u64,█) -> io::Result<Option<serde_json::Value>> {█...█}█[Showing lines 469-623 of 1558. Use :624 to continue]\u000f█</out>█# Tool call ¶█//Reading dispatch worker end█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"730-850,960-1055\")█<out>█\u000efn 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 = match first_line(broker_name, stream_id, floor_seq) {█Ok(Some(v)) => v,█Ok(None) => return WorkerReport::bare(DispatchOutcome::Unknown),█// Pre-serve terminal exclusion (Amendment fix 6 rider): a row that█// vanished between enumeration and this query (retired by a sibling█// worker's Served report, or conn-swept) is TERMINAL - report Served█// so the claim closes now, instead of burning three transient█// retries against a stream that no longer exists.█// [impl->REQ-SERVE-OWNERSHIP-GENERATION]█Err(e) if e.to_string().contains(\"no such stream\") => {█[...7709ch elided...] {id}:{e}\");█}█}█}█}█Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {█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()),█}█}█}█/// Notif feed arm: decode rows as they arrive, apply each batch under the█/// fail-closed gate, until the peer finishes. The policy re-loads per feed█/// (not per record) - the same freshness the other arms get per request.█///█/// A **freshly inserted** undismissed row additionally gets a first-fire here\u000f█</out>█# Tool call ¶█//Finding stream retire calls█grep(pattern=\"net_stream_retire|retire_stream|KIND_NET_STREAM_RETIRE|retire\\\\(\", path=\"crates/spt-daemon/src/dispatch.rs; crates/spt-daemon/src/brain.rs; crates/spt-daemon/src/attach.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## dispatch.rs█511| if let Ok(mut retire_brain) = connect(&name) {█*512| let _ = retire_brain.net_stream_retire(stream_id);█513| }█514| // Breaker reset = REAL progress only (gate round 1): a row█515| // that vanished before serve proves nothing about the█## 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_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,█55| KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,█56| KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,█...█1453| // [impl->REQ-REDISPATCH-FINISHED-RETIRE]█*1454| pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {█1455| self.send(█*1456| KIND_NET_STREAM_RETIRE,█1457| serde_json::to_value(NetStreamRetireReq { stream_id })█1458| .expect(\"NetStreamRetireReq serializes\"),█1459| )?;█...█1461| match self.read_event()? {█*1462| BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {█1463| let reply: NetStreamRetired = serde_json::from_value(env.payload)█1464| .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;█1465| return Ok(reply.removed);\u000f█</out>█# Tool call ¶█//Reading stream terminal classification█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"330-375\")█<out>█\u000efn outcome_transition(█...█) -> ClaimState {█match outcome {█...█DispatchOutcome::Failed(msg) => match classify_failure(msg) {█FailClass::SeatBlocked => ClaimState::Retry {█...█next_at: now + breaker_window,█},█FailClass::Transient => {█let attempts = attempts + 1;█if attempts >= MAX_DISPATCH_ATTEMPTS {█ClaimState::Terminal█} else {█ClaimState::Retry {█attempts,█next_at: now + retry_backoff(attempts),█}█}█}█},█}█}█/// PURE lifecycle+family discriminator (gate round 1, ADR-0038 Decision 1's█/// \"excluded by lifecycle state\" half): is a `finished` row TERMINAL for█/// redispatch - retire unserved, never replay?█///█/// `finished` alone is NOT the answer, and a bare `s.finished` claim filter█/// would be a regression: the request/reply families FIN their send WITH the█/// request and await the reply on the same stream (sync.rs `request_sync` and█/// propagate.rs `fetch_update` both `net_stream_send(.., finish=true)` on the█/// opener) [...647ch elided...] ng█/// else = a pending request - serve it.█// [impl->REQ-REDISPATCH-FINISHED-RETIRE]█// [impl->REQ-HAZARD-REDISPATCH-CONTROL-STEAL]█fn finished_row_is_terminal(family: StreamFamily, finished: bool) -> bool {█finished && family == StreamFamily::Attach█}█/// TEST-RIG-ONLY (the D3 regression): `SPT_DISPATCH_INJECT_TRANSIENT_ONCE`█/// set at dispatcher start makes exactly ONE worker fail before setup -█/// proving a transient worker-start failure requeues and recovers through█/// the REAL claim path. Never set in production; the latch arms once per█/// process and disarms on first take.█fn take_injected_transient() -> bool {█static ARMED: OnceLock<AtomicBool> = OnceLock::new();█let armed = ARMED.get_or_init(|| {█...█});█...█}█[Showing lines 329-378 of 1558. Use :379 to continue]\u000f█</out>█# Assistant ¶█_**Tracing worker connection cleanup issues**█**Analyzing Brain connection poisoning and blocking**█**Identifying broker version mismatch impact**█**Planning safe live probes with WPR and Process Explorer**█**Using PowerShell for safe thread sampling**_█# Tool call ¶█//Reading connection lifecycle format█read(path=\"crates/spt-daemon/src/conn.rs\", selector=\"140-225\")█<out>█\u000e/// The state shared with the watchdog thread (no `Arc<BrokerConn>` cycle -█/// the watchdog must not keep the conn alive).█struct Inner {█/// Stable per-physical-conn id ([`CONN_ID_SEQ`]) - on every lifecycle record.█id: u64,█/// Accreted attribution facts (subscriber role, endpoint/session where█/// known - [`BrokerConn::describe`]). Bounded by [`LABEL_CAP`].█label: Mutex<String>,█/// Latch: the once-per-conn `write-start` lifecycle record fired.█first_write_logged: AtomicBool,█gate: Mutex<Gate>,█gate_cv: Condvar,█dog: Mutex<Dog>,█dog_cv: Condvar,█/// Idempotently latched on the first deadline/failure/cancel. A poisoned█/// conn refuses every future write and is never re-gated.█poisoned: AtomicBool,█/// Latched when the retirement was DEADLINE-driven (watchdog fired, or a█/// gate-waiter exhausted its bound) - as opposed to an organic I/O error█/// (peer death). Callers see it as `io::ErrorKind::TimedOut` and can█/// count the wedge (the W2 stall-evict tally) without conflating it with█/// an ordinary disconnect.█timed_out: AtomicBool,█/// The physical sever ran (exactly once; Windows `DisconnectN [...1646ch elided...] n {█// kernel32 is in the MSVC default link set - raw externs, no new dep█// (the deelevate.rs / daemon.rs posture).█extern \"system\" {█pub fn CancelIoEx(handle: isize, overlapped: *mut core::ffi::c_void) -> i32;█pub fn DisconnectNamedPipe(handle: isize) -> i32;█}█}█impl Inner {█/// The attribution snapshot every lifecycle record carries: stable conn id,█/// accreted role/endpoint/session facts, wall + monotonic stamps.█// [impl->REQ-CONN-POISON-ATTRIBUTION]█fn attribution(&self) -> String {█let label = recover(&self.label);█let facts: &str = if label.is_empty() { \"role=unattributed\" } else { &label };█format!(\"conn={} {} {}\", self.id, facts, log_stamp())█}█...█}█[Showing lines 139-228 of 815. Use :229 to continue]\u000f█</out>█# User ¶█Your current interruptible wait was interrupted because an IRC message arrived from your parent agent `Main`.█Parent IRC message:█Doyle requests broker thread-name census: distinguish conn watchdog, conn handler, SubscriberSeat writer counts for ~550 threads. Please trace named/unnamed spawn sites and derive expected counts from live telemetry/source if direct Windows names unavailable. Also confirm poison conn IDs fresh vs reused.█# Assistant ¶█_**Locating default SPT_HOME directory**_█# Tool call ¶█//Reading lifecycle prefix█grep(pattern=\"fn lifecycle|CONN_|write-start|stream-sub-writer-poison\", path=\"crates/spt-daemon/src/conn.rs\", selector=\"220-330\", case=true, gitignore=true, skip=null)█<out>█\u000e 229| /// Render the once-per-conn retirement record - the F-039 token split█*230| /// (leg a): `CONN_WRITE_POISONED` is RESERVED for the deadline class█231| /// (`timed_out` latched - the wedge observable blackhole-controller.ps1█232| /// watches); an ORGANIC write failure (peer death / broken pipe on an█233| /// already-dead counterpart, the offline-peer dial churn) emits the█*234| /// distinct `CONN_WRITE_RETIRED` token carrying the error kind and the█235| /// SAME attribution fields - quieter class, never thinner (the retired█236| /// class is what discriminates fresh-carrier churn from interleave█237| /// artifact in the field). Behavior is identical either way: poison,█...█242| format!(█*243| \"CONN_WRITE_POISONED: {} - physical broker conn retired: a write \\█244| exceeded its {}ms bound; in-flight I/O aborted, conn never reused \\█245| [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\",█246| self.attribution(),█...█254| format!(█*255| \"CONN_WRITE_RETIRED: {} - organic write failure ({cause}); physical \\█256| broker conn po [...499ch elided...]█268| /// timeout/cancel leg is the retirement record itself.█269| // [impl->REQ-CONN-POISON-ATTRIBUTION]█*270| fn lifecycle(&self, event: &str, extra: &str) {█271| let sep = if extra.is_empty() { \"\" } else { \" \" };█272| eprintln!(█*273| \"CONN_LIFECYCLE: {} event={event}{sep}{extra} [REQ-CONN-POISON-ATTRIBUTION]\",█274| self.attribution()█275| );█276| }█...█287| // First poison of this conn: loud, once. The token is class-split█*288| // (F-039 leg a): deadline -> CONN_WRITE_POISONED (the wedge█*289| // observable), organic fast-fail -> CONN_WRITE_RETIRED.█290| eprintln!(█291| \"{}\",█292| self.render_retirement(self.timed_out.load(Ordering::Acquire), cause)\u000f█</out>█# Tool call ¶█//Finding broker thread names█grep(pattern=\"\\\\.name\\\\(|thread_name\\\\(\", path=\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/nethost.rs; crates/spt-daemon/src/conn.rs; crates/spt-term/src/reader.rs; crates/spt-daemon/src/translation.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## nethost.rs█1185| .worker_threads(2)█*1186| .thread_name(\"spt-broker-net\")█1187| .enable_all()█1188| .build()?;█1189| let endpoint = runtime█## conn.rs█448| let dog = thread::Builder::new()█*449| .name(\"conn-watchdog\".into())█450| .spawn(move || dog_inner.watchdog())█451| .ok();█452| BrokerConn { inner, dog }\u000f█</out>█# Tool call ¶█//Reading net subscriber structs█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"115-205\")█<out>█\u000e/// Max bytes pulled per stream read (one ring chunk).█const STREAM_READ_CHUNK: usize = 64 * 1024;█/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).█/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has█/// no newline is not speaking an NDJSON protocol - capture gives up█/// (`Oversize`) and classification treats it as unclassifiable, bounded.█const OPENER_PIN_MAX: usize = 64 * 1024;█/// How many frames a subscriber's writer queue holds before the subscriber is█/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow█/// is a subscriber problem, never a producer stall - the detached brain█/// resumes from its cursor (the existing gapless-resume contract).█const SUBSCRIBER_QUEUE_CAP: usize = 1024;█/// Why a subscriber seat rejected a frame - the caller removes the seat on█/// either, but only a POISON (real write failure on the conn) cancels the█/// stream's lease; an overflow is a slow-but-healthy brain being detached.█// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]█#[derive(Debug, Clone, Copy, PartialEq, Eq)]█enum SeatFail {█/// The writer thread died on a failed conn write (the 15s bounded-write█[...3267ch elided...] = Arc::clone(&done);█let writer_poisoned = Arc::clone(&poisoned);█std::thread::spawn(move || {█let poison = |halt_reason: &str| {█writer_poisoned.store(true, Ordering::Release);█if let Some(l) = &lease {█l.cancel();█}█writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);█};█// Replay first - halt at the first failed write (Amendment█// fix 2), never iterate past a poisoned conn.█for frame in replay {█if writer_sub.write(&frame).is_err() {█poison(\"replay write failed\");█...█}█}█...█});█...█}█...█}█[Showing lines 114-208 of 2865. Use :209 to continue]\u000f█</out>█# Assistant ¶█_**Searching alternative log directory**_█# Tool call ¶█//Checking default SPT logs█glob(path=\"C:/Users/decid/.spt/logs/daemon.stderr.log*\", hidden=true, gitignore=false, limit=20)█<out>█\u000ePath not found: C:/Users/decid/.spt/logs\u000f█</out>█# Tool call ¶█//Locating default SPT home█grep(pattern=\"fn spt_home|SPT_HOME|\\\\.spt\", path=\"crates/spt-store/src/perch.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 23|█*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█...█31|/// full parity with modern spt this may simply stay `spt-core/` for good; the█*32|/// override (`$SPT_HOME`) is the relocation knob either way.█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);█38| }█...█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/`.█...█495| let lock = ENV_LOCK.lock().unwrap_or_else(|e| e.into_inner());█*496| let prev = std::env::var(\"SPT_HOME\").ok();█*497| std::env::set_var(\"SPT_HOME\", tmp);█498| EnvGuard { _lock: lock, prev }█499| }█500| }█...█503| match &self.prev {█*504| Some(v) => std::env::set_var(\"SPT_HOME\", v),█*505| None => std::env::remove_var(\"SPT_HOME\"),█506| }█507| }█508| }█...█683|█*684| // [unit->REQ-HAZARD-SINGLE-PATH-SOURCE] spt_home is pure: honors SPT_HOME,█685| // creates nothing.█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 ¶█//Updating parent census█irc(op=\"send\", to=\"Main\", message=\"Thread census source: only BrokerConn watchdog is explicitly named `conn-watchdog` (conn.rs:447-451). Broker accept handler is unnamed (broker.rs:2777-2797), SubscriberSeat writer unnamed (nethost.rs:189-225), session controller/viewer/input/waiter/drain/translation threads all unnamed. Tokio network contributes exactly 2 named `spt-broker-net` workers (nethost.rs:1183-1188). Investigating live log conn-ID freshness/count now.\", replyTo=null, await=false, from=null, timeoutMs=null, peek=null)█<out>█\u000eDelivered to 1 peer(s):█- Main: injected\u000f█</out>█# Tool call ¶█//Reading Windows home derivation█read(path=\"crates/spt-store/src/perch.rs\", selector=\"20-63\")█<out>█\u000e//! The single `nested/` namespace holds both Psyche and Worker children - no█//! divergent sibling layouts (the hazard this module exists to prevent).█use std::path::{Path, PathBuf};█/// Root of all spt-core on-disk state. Honors `$SPT_HOME`, else the platform█/// default (`%LOCALAPPDATA%\\spt-core` on Windows, `$HOME/.spt-core` on Unix).█/// **Pure** - reads env, composes a path, creates nothing.█///█/// The default lives under `spt-core/`, **deliberately distinct from the modern█/// spt runtime's `spt/` home**, so a dev build never collides with a running█/// spt-plugin during the parity build-out. Once spt-core + the spt-plugin reach█/// full parity with modern spt this may simply stay `spt-core/` for good; the█/// override (`$SPT_HOME`) is the relocation knob either way.█// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]█pub fn spt_home() -> PathBuf {█if let Ok(over) = std::env::var(\"SPT_HOME\") {█if !over.is_empty() {█return PathBuf::from(over);█}█}█platform_default_spt_home()█}█#[cfg(windows)]█fn platform_default_spt_home() -> PathBuf {█if let Ok(local) = std::env::var(\"LOCALAPPDATA\") {█if !local.is_empty() {█return PathBuf::from(local).join(\"spt-core\");█}█}█let up =█std::env::var(\"USERPROFILE\").expect(\"LOCALAPPDATA or USERPROFILE must be set on Windows\");█PathBuf::from(up)█.join(\"AppData\")█.join(\"Local\")█.join(\"spt-core\")█}█#[cfg(unix)]█fn platform_default_spt_home() -> PathBuf {█let home = std::env::var(\"HOME\").expect(\"HOME must be set on Unix\");█PathBuf::from(home).join(\".spt-core\")█}█/// The owlery directory holding all perches: `<spt_home>/owlery/`.█// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]█pub fn owlery_dir() -> PathBuf {█...█}█[Showing lines 19-66 of 695. Use :67 to continue]\u000f█</out>█# Assistant ¶█_**Deciding to use exact matching**_█# Tool call ¶█//Checking default live log█glob(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log*\", hidden=true, gitignore=false, limit=20)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/logs/█daemon.stderr.log█daemon.stderr.log.1\u000f█</out>█# Tool call ¶█//Listing SPT state root█read(path=\"C:/Users/decid/AppData/Local/spt-core\", selector=null)█<out>█\u000e.█- brain.ready█- owlery/ just now█- hertz/█- mobile-gw/█- lia/ just now█- webbie/ just now█- doyle/ just now█- deployah/ just now█- todlando/ 1h ago█- chert/ 1h ago█- perri/ 1h ago█- .registry 12.0KB 1h ago█- gaki-normal-probe/ 16h ago█- ... 16 more█- sptc-diag-2/ 3w ago█- identity/ just now█- registry/ just now█- pump-health.json 766B just now█- pump-heartbeat.json 13B just now█- epoch [...23725ch 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 ¶█//Checking alternate live home█glob(path=\"C:/Users/decid/AppData/Local/spt/logs/daemon.stderr.log*\", hidden=true, gitignore=false, limit=20)█<out>█\u000ePath not found: C:/Users/decid/AppData/Local/spt/logs\u000f█</out>█# Assistant ¶█_**Grep live logs by PID and lifecycle**_█# Tool call ¶█//Finding broker generation stamp█grep(pattern=\"pid 72488|=== spt broker stderr\", 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 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)█...█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]█*63|=== spt broker stderr - generation 0 - pid 50096 ===█64|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█65|BROKER_BIND_FAIL: Access is denied. (os error 5)█66|DAEMON_EXIT: Access is denied. (os error 5)█*67|=== spt broker stderr - generation 0 - pid 83344 ===█68|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█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)} }█70|CONN_LIFECYCLE: conn=18 role=brain wall_ms=1784265243660 mono_ms=1540 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█...█76|DAEMON_ [...444ch elided...]█84|DAEMON_EXIT: Access is denied. (os error 5)█*85|=== spt broker stderr - generation 0 - pid 77688 ===█86|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█87|BROKER_BIND_FAIL: Access is denied. (os error 5)█88|DAEMON_EXIT: Access is denied. (os error 5)█*89|=== spt broker stderr - generation 0 - pid 54296 ===█90|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█*91|=== spt broker stderr - generation 0 - pid 89192 ===█92|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█93|BROKER_BIND_FAIL: Access is denied. (os error 5)█94|DAEMON_EXIT: Access is denied. (os error 5)█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\u000f█</out>█# Tool call ¶█//Sampling poisoned connections█grep(pattern=\"CONN_WRITE_POISONED:.*stream-subscriber|stream-sub-writer-poison\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 2145|CONN_WRITE_RETIRED: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 - 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]█*2146|CONN_LIFECYCLE: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]█2147|CONN_LIFECYCLE: conn=849 role=brain stream-subscriber stream=352 wall_ms=1784265730912 mono_ms=488791 event=transport-close poisoned=true timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█2148|CONN_LIFECYCLE: conn=850 role=brain wall_ms=1784265730921 mono_ms=488801 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█2149|CONN_LIFECYCLE: conn=850 role=brain wall_ms=1784265730921 mono_ms=488801 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█...█3135|CONN_LIFECYCLE: conn=1257 role=brain stream-subscriber stream=529 wall_ms=1784266006373 mono_ms=764251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*3136|CONN_WRITE_POISONED: c [...4928ch elided...] m-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]█19961|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]█19962|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19963|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 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\u000f█</out>█# Tool call ¶█//Sampling connection close lifecycle█grep(pattern=\"CONN_LIFECYCLE:.*event=transport-close\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 11|CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784265242254 mono_ms=135 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*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]█13|DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive - refusing to re-run over a live process (dup guard)█14|DAEMON_RESTART_RESUME_REFUSED:doyle: custody pid still alive - refusing to re-run over a live process (dup guard)█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]█...█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]█*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]█22|DAEMON_RESTART_RESUME_REFUSED:webbie: custody pid still alive - refusing to [...49053ch elided...] eam-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█477|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*478|CONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█479|CONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█480|CONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 1-338 of 508 (49.8KB limit). Use :339 to continue]\u000f█</out>█# Tool call ¶█//Sampling subscriber attachments█grep(pattern=\"CONN_LIFECYCLE:.*event=stream-sub-attach\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 38|CONN_LIFECYCLE: conn=10 role=brain wall_ms=1784265242657 mono_ms=538 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*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]█40|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) - dispatcher + peer pump started█41|CONN_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]█...█47|CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784265242749 mono_ms=630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*48|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 wall_ms=1784265242749 mono_ms=630 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█49|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91 [...49221ch elided...] s=132205 event=stream-sub-attach stream=97 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█757|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374325 mono_ms=132205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█758|CONN_LIFECYCLE: conn=278 role=brain wall_ms=1784265374326 mono_ms=132206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*759|CONN_LIFECYCLE: conn=278 role=brain stream-subscriber stream=98 wall_ms=1784265374326 mono_ms=132206 event=stream-sub-attach stream=98 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█760|CONN_LIFECYCLE: conn=279 role=brain stream-subscriber stream=97 wall_ms=1784265374332 mono_ms=132212 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 1-349 of 928 (50.0KB limit). Use :350 to continue]\u000f█</out>█# Assistant ¶█_**Identifying stream subscriber leak on long-lived connections**█**Analyzing retire_stream function and subscriber retention**█**Planning targeted log grep from line 19000**_█# Tool call ¶█//Finding latest stream attachments█grep(pattern=\"event=stream-sub-attach\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"19000-\", case=true, gitignore=false, skip=null)█<out>█\u000e 19009|CONN_LIFECYCLE: conn=7861 role=brain wall_ms=1784269083882 mono_ms=3841753 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*19010|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083882 mono_ms=3841753 event=stream-sub-attach stream=3635 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█19011|CONN_LIFECYCLE: conn=7861 role=brain stream-subscriber stream=3635 wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19012|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19013|CONN_LIFECYCLE: conn=7862 role=brain wall_ms=1784269083885 mono_ms=3841755 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█...█19018|CONN_LIFECYCLE: conn=7866 role=brain wall_ms=1784269084500 mono_ms=3842370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*19019|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream=3636 wall_ms=1784269084500 mono_ms=3842370 event=stream-sub-attach stream=3636 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█19020|CONN_LIFECYCLE: conn=7866 role=brain stream-subscriber stream [...49209ch elided...] 43 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*19537|CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174173 mono_ms=3932043 event=stream-sub-attach stream=3735 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█19538|CONN_LIFECYCLE: conn=8077 role=brain stream-subscriber stream=3735 wall_ms=1784269174182 mono_ms=3932052 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19539|CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19540|CONN_LIFECYCLE: conn=8081 role=brain wall_ms=1784269174182 mono_ms=3932053 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█...█[Showing lines 1-340 of 926 (50.0KB limit). Use :341 to continue]\u000f█</out>█# Tool call ¶█//Finding latest connection closes█grep(pattern=\"event=transport-close\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"19000-\", case=true, gitignore=false, skip=null)█<out>█\u000e*19000|CONN_LIFECYCLE: conn=7858 role=brain wall_ms=1784269079966 mono_ms=3837836 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19001|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█19002|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█19003|PAIR_MEET_UP:SPT_DEV step=59475636 id=c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89 addr=EndpointAddr { id: PublicKey(c5f2989f5bc63165a6f9ad11863ae254ae0390687225694e3c65ca9935f9ee89), addrs: {Ip(100.68.35.65:51511), Ip(192.168.1.81:51511)} }█...█19005|CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*19006|CONN_LIFECYCLE: conn=7859 role=brain wall_ms=1784269081676 mono_ms=3839547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19007|CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841751 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*19008|CONN_LIFECYCLE: conn=7860 role=brain wall_ms=1784269083881 mono_ms=3841752 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19009|CONN_LIFECYCLE: con [...49110ch elided...] =1784269133811 mono_ms=3891682 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*19323|CONN_LIFECYCLE: conn=7993 role=brain wall_ms=1784269133812 mono_ms=3891682 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*19324|CONN_LIFECYCLE: conn=7990 role=brain stream-subscriber stream=3694 wall_ms=1784269133813 mono_ms=3891683 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19325|CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133814 mono_ms=3891685 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*19326|CONN_LIFECYCLE: conn=7994 role=brain wall_ms=1784269133815 mono_ms=3891685 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 1-323 of 480 (49.9KB limit). Use :324 to continue]\u000f█</out>█# Tool call ¶█//Finding latest poison IDs█grep(pattern=\"CONN_WRITE_POISONED\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"19000-\", case=true, gitignore=false, skip=null)█<out>█\u000e 19958|CONN_LIFECYCLE: conn=8257 role=brain wall_ms=1784269248117 mono_ms=4005987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*19959|CONN_WRITE_POISONED: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252412 mono_ms=4010282 - physical broker conn retired: a write exceeded its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]█19960|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]█19961|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]█19962|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 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\u000f█</out>█# Tool call ¶█//Reading stream retirement body█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"1810-1860\")█<out>█\u000e pub fn stream_infos(&self) -> Vec<NetStreamInfo> {█...█streams█...█.filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))█.map(|(id, e)| {█let log = e.log.lock().unwrap();█NetStreamInfo {█stream_id: *id,█conn_id: e.conn_id,█remote_id_hex: e.remote_id_hex.clone(),█next_seq: log.next_seq,█finished: log.finished,█initiated_locally: e.initiated_locally,█floor_seq: log.floor_seq(),█}█})█.collect()█}█/// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose█/// serve loop ran to completion - its exchange is over, so no future█/// dispatcher generation may rediscover and replay it (the control-steal█/// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is█/// hidden from [`stream_infos`](Self::stream_infos) and the opener query█/// and its ring is freed, but the entry (send half, subscriber, pump) stays█/// alive so an in-flight reply always flushes - retire raced [...598ch elided...] .retired█.swap(true, std::sync::atomic::Ordering::SeqCst);█if newly {█// A retired exchange's request bytes are dead weight - free the█// ring; the pinned opener and cursors stay (cheap, bounded).█entry.log.lock().unwrap().ring.clear();█}█newly█}█/// The stream's pinned opener line (ADR-0038 B) - the restart-durable█/// classification fact, independent of the evictable data ring. Outer█/// `None` = no such stream; inner `None` = no opener pinned (first `\\n`█/// not yet arrived, or capture gave up bounded).█// [impl->REQ-STREAM-OPENER-DURABLE]█pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {█...█}█[Showing lines 1809-1863 of 2865. Use :1864 to continue]\u000f█</out>█# Assistant ¶█_**Deriving thread count from attach events**_█# Tool call ¶█//Counting long carrier seats█grep(pattern=\"CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 499|CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*500|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█501|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█502|CONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█503|CONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█...█514|CONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*515|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber \u000estream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█*516|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream [...48986ch elided...] 1678670 event=stream-sub-attach stream=1157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█6528|CONN_LIFECYCLE: conn=2656 role=brain wall_ms=1784266920885 mono_ms=1678761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█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]█6530|CONN_LIFECYCLE: conn=2657 role=brain stream-subscriber stream=1156 wall_ms=1784266920885 mono_ms=1678762 event=stream-sub-attach stream=1156 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█...█6534|CONN_LIFECYCLE: conn=2658 role=brain wall_ms=1784266920890 mono_ms=1678767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 1-260 of 684 (49.9KB limit). Use :261 to continue]\u000f█</out>█# Tool call ¶█//Checking current process thread facts█grep(pattern=\"CONN_LIFECYCLE: conn=137 |CONN_WRITE_POISONED: conn=\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"19000-20000\", case=true, gitignore=false, skip=null)█<out>█\u000e 19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█...█19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*19073|CONN_LIFECYCLE: conn=137 role=brain stream-subscr [...7897ch elided...] ed its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]█19960|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]█19961|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]█19962|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 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\u000f█</out>█# Tool call ¶█//Reading stream removal sweep█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"940-975\")█<out>█\u000e let observed = observed_addr_json(&conn);█shared█.presence█.lock()█.unwrap()█.append_connected(id, &remote_id_hex, observed);█// Closed-watcher: the row's exit path. Awaits the connection's end (clean█// close, conn loss, or our own endpoint close), removes the row - conns█// finally LEAVE the table - then appends the `disconnected` event (row█// gone before the event is observable).█// [impl->REQ-EP-4]█let sh_close = Arc::clone(shared);█let conn_close = conn.clone();█let hex_close = remote_id_hex.clone();█tokio::spawn(async move {█conn_close.closed().await;█sh_close.conns.lock().unwrap().remove(&id);█// Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead█// - nothing can ever be served on them again, and leaving them makes█// every future dispatcher generation replay them (the control-steal█// hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing█// else reads a dead conn's stream ring.█// [impl->REQ-REDISPATCH-FINISHED-RETIRE]█sh_close█.streams█.lock()█.unwrap()█.retain(|_, e| e.conn_id != id);█sh_close█.presence█.lock()█.unwrap()█.append(PRESENCE_DISCONNECTED, id, &hex_close);█});█// Inbound-stream acceptor: every peer-opened bidi stream joins the table█// and gets a read pump. (QUIC streams are lazy - the peer's open becomes█// visible here on its first write.) Ends when the connection does.█let sh = Arc::clone(shared);█[Showing lines 939-978 of 2865. Use :979 to continue]\u000f█</out>█# Assistant ¶█_**Assessing connection ID persistence**█**Estimating thread and connection distributions**█**Confirming file read limitations**█**Estimating log line ranges**_█# Tool call ¶█//Reading current log tail block█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"24500-24850\")█<out>█\u000eCONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021377 mono_ms=4779245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█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=1784270022814 mono_ms=4780682 event=stream-sub-attach stream=4720 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█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 st [...53441ch elided...] N_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=stream-sub-attach stream=4785 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10301 role=brain wall_ms=1784270085561 mono_ms=4843429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 24499-24853 of 386. Use :24854 to continue]\u000f█</out>█# Tool call ¶█//Reading later log block█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"28000-28300\")█<out>█\u000eCONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612493 mono_ms=5370360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612494 mono_ms=5370360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11615 role=brain wall_ms=1784270612495 mono_ms=5370361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612495 mono_ms=5370361 event=stream-sub-attach stream=5409 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612497 mono_ms=5370363 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE [...45829ch elided...] -subscriber stream=5466 wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666548 mono_ms=5424414 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11741 role=brain wall_ms=1784270666548 mono_ms=5424414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 27999-28303 of 353. Use :28304 to continue]\u000f█</out>█# Tool call ¶█//Reading end log block█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"32000-32300\")█<out>█\u000eCONN_LIFECYCLE: conn=13271 role=brain wall_ms=1784271317129 mono_ms=6074993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078438 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13273 role=brain wall_ms=1784271320575 mono_ms=6078440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320575 mono_ms=6078440 event=stream-sub-attach stream=6175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN [...45893ch elided...] 6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=stream-sub-attach stream=6233 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 31999-32303 of 336. Use :32304 to continue]\u000f█</out>█# Tool call ¶█//Finding long-lived carrier IDs█grep(pattern=\"conn=[0-9]+ role=brain .*stream-subscriber.*stream-subscriber.*event=stream-sub-attach\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"15000-20000\", case=true, gitignore=false, skip=null)█<out>█\u000e 15101|CONN_LIFECYCLE: conn=6234 role=brain wall_ms=1784268417345 mono_ms=3175218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*15102|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=1784268417538 mono_ms=3175411 event=stream-sub-attach stream=2855 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█15103|CONN_LIFECYCLE: conn=6235 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█15104|CONN_LIFECYCLE: conn=6236 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█15105|CONN_LIFECYCLE: conn=6237 role=brain wall_ms=1784268418223 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█...█15151|CONN_LIFECYCLE: conn=6255 role=brain wall_ms=1784268418789 mono_ms=3176662 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*15152|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber st [...42788ch elided...] r stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108... wall_ms=1784269226702 mono_ms=3984573 event=stream-sub-attach stream=3795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█19801|CONN_LIFECYCLE: conn=8191 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19802|CONN_LIFECYCLE: conn=8193 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19803|CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 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\u000f█</out>","textHead":"# User ¶█Complete the assignment below, thoroughly:█# Target█Broker PTY/session/stream handling in crates/spt-daemon; thread spawn sites and lifetime. Non-goal: brain routing.█# Change█Trace every long-lived broker thread creation, especially per-stream/per-connection writers and PTY readers. Explain whether ~537 threads can be legitimate for 6 sessions, where they should exit, and any missing cancellation/reap path.█# Acceptance█Rank concrete broker-side mechanisms with exact source citations and propose a safe live probe that does not stop hosted sessions.█# Assistant ¶█_**Planning parallel grep for spawn usage**_█# 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 daemon sources█glob(path=\"crates/spt-daemon/**/*\", hidden=true, gitignore=true, limit=500)█<out>█\u000e# crates/spt-daemon/█Cargo.toml█## src/█nethost.rs█dispatch.rs█broker.rs█attach.rs█brain.rs█msg.rs█seedproofx.rs█registryhost.rs█lib.rs█endpoint.rs█sync.rs█projwriter.rs█brainproc.rs█applyhost.rs█docshost.rs█daemon.rs█config.rs█update.rs█relcache.rs█release.rs█notif.rs█relay.rs█propagate.rs█livehost.rs█inject.rs█conn.rs█autostart.rs█stderrlog.rs█lifecycle.rs█digest.rs█pairhost.rs█xfer.rs█shellwake.rs█shellchan.rs█seedmap.rs█resting.rs█resthost.rs█linkhost.rs█effect.rs█adapter_update.rs█wan.rs█tunnelhub.rs█transport.rs█translation.rs█test_home.rs█shellhost.rs█shelldisc.rs█service.rs█serveprobe.rs█rollback_compat.rs█reconcile.rs█reap.rs█psyrelay.rs█presence.rs█notifsync.rs█machineid.rs█harnesshost.rs█grants.rs█frame.rs█drivehub.rs█digesthub.rs█deelevate.rs█deadline.rs█crc_swap.rs█consent.rs█codec.rs█access.rs█### pump/█mod.rs█health.rs█update.rs█sync.rs█registry.rs█notif.rs█### bin/█xlate_choreo_fixture.rs█## tests/█inject_control_wedge.rs█attach.rs█redispatch_stall.rs█false_promote.rs█conn_blackhole_lifecycle.rs█broker.rs█brain_decouple.rs█mesh_recovery.rs█redispatch.rs█input_ack_deadlock.rs█docs_server_e2e.rs█propagate.rs█pumpdeadline.rs█pump.rs█net_worker_starve.rs█brain_resume_conn_deadlock.rs█two_origin_spanning.rs█wake_single_flight.rs█endpoint_survival.rs█xfer.rs█wanmsg.rs█twohost.rs█replicate.rs█sync.rs█notifsync.rs█netstream.rs█netbroker.rs█idempotent.rs█dispatch.rs█daemon_e2e.rs█access.rs█shellchan.rs█seedproofx.rs█rosterprop.rs█resume.rs█reseed.rs█psyche_residency_expectation_e2e.rs█psyche_event_turn_e2e.rs█psyche_context_file_e2e.rs█presence.rs█pairjoin.rs█mesh.rs█legacy_resident_sweep_e2e.rs█handoff.rs█driven_by_selfheal.rs█digest.rs█daemon_lifecycle_real_brain.rs█control_stamp_lifetime.rs█budget.rs█brain_swap.rs█### fixtures/█dispatch_fixture.rs\u000f█</out>█# Tool call ¶█//Finding spawn sites█grep(pattern=\"thread::spawn|std::thread|tokio::spawn|task::spawn|spawn_blocking|Builder::new\\\\(\\\\).*spawn|\\\\.spawn\\\\(\", path=\"crates/spt-daemon\", 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|}█...█493| broker: Arc<Broker>,█*494| handle: Option<std::thread::JoinHandle<()>>,█495| }█496| impl std::ops::Deref for ServedBroker {█497| type Target = Arc<Broker>;█...█513| let serve = Arc::clone(&broker);█*514| let handle = std::thread::spawn(move || {█515| let _ = serve.serve();█516| });█517| ServedBroker {█...█560| }█*561| std::thread::sleep(Duration::from_millis(10));█562| }█563| panic!(\"brain cold-start could not connect\");█564| }█## attach.rs█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| }█...█[...23253ch elided...] hread::sleep(Duration::from_millis(30)); // distinct mtime/len either way█1006| spt_store::gitrun::run_git_ok(█1007| &[█1008| \"-C\",█...█1082| assert!(Instant::now() < deadline, \"boot cycle never settled\");█*1083| std::thread::sleep(Duration::from_millis(25));█1084| }█1085| let enums_after_boot = stats().unwrap().cumulative.branch_enumerations;█1086|█...█1098| assert!(Instant::now() < consumed, \"burst never consumed\");█*1099| std::thread::sleep(Duration::from_millis(25));█1100| }█1101| let s = stats().unwrap();█1102| stop.store(true, Ordering::SeqCst);█Showing files 1-20 of 77+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Finding PTY stream loops█grep(pattern=\"pty|Pty|stream|writer|reader|connection|accept\\\\(|recv\\\\(|read\\\\(|write\\\\(|loop \\\\{\", path=\"crates/spt-daemon/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## access.rs█15|//! endpoint's identity or home. The subject value MUST be the QUIC█*16|//! handshake-proven remote node id from the broker's conn/stream table,█17|//! never a payload field (REQ-HAZARD-WAN-ORIGIN-AUTH).█18|//! - **Outbound** -> any visible node: the whitelist never restricts who an█19|//! endpoint talks *to*.█...█28|//! origin that *is* this node (a loopback self-dial) short-circuits Allow.█*29|//! - **Default absent = open**; setting a whitelist restricts (an empty entry█30|//! = locked down). Node-tier ships M4 (Ed25519 node pubkeys); the user tier█31|//! is an inert schema reservation until the cross-user model (ADR-0006).█32|//!█...█35|//! an `spt access` edit takes effect on the next inbound without a daemon█*36|//! restart, and the checks run at message/stream-establishment rate where a█37|//! small-file read is noise.█38|//!█39|//! **Class policy:** only the *message* funnel ([`crate::wan`]) classifies█...█143| // restricted endpoint admits listed nodes and refuses unlisted ones;█*144| // an empty entry is locked down; other endpoints stay open.█145| #[test]█146| fn gate_decision_table() {█147 [...49084ch elided...]█*703| Ok(v) if !v.is_empty() => vec![(\"SPT_HOME\".to_string(), v)],█704| _ => Vec::new(),█705| }█706| }█...█751| let mut overlaid: Vec<u16> = Vec::new();█*752| let env_ptr = if env_built && !overrides.is_empty() {█753| let raw = unsafe { env_block_to_vec(env as *const u16) };█754| overlaid = super::apply_env_overrides(&raw, &overrides);█755| overlaid.as_mut_ptr() as *mut core::ffi::c_void█...█841| if u == 0 {█*842| if cur.is_empty() {█843| break;█844| }█845| out.push(String::from_utf16_lossy(&cur));█...█905| let file = dir.path().join(\"default-user\");█[Showing lines 1-1013 of 1314 (50.0KB limit). Use :1014 to continue]\u000f█</out>█# Assistant ¶█_**Tracing broker thread creation and lifecycle**_█# Tool call ¶█//Finding all broker spawns█grep(pattern=\"thread::spawn|thread::Builder|std::thread::spawn|std::thread::Builder|runtime\\\\.spawn|tokio::spawn\", path=\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## broker.rs█947| let writer_blocked = Arc::clone(&write_blocked_since);█*948| let writer = thread::spawn(move || {█949| controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)█950| });█951| self.controller = Some(ControllerSink {█...█1137| let writer =█*1138| thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));█1139| self.viewers.insert(█1140| vid,█1141| ViewerSink {█...█1789| let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());█*1790| let writer = thread::spawn(move || input_writer(session, rx));█1791| Arc::new(InputWriter {█1792| tx,█1793| backpressure: AtomicBool::new(false),█...█1991| let sup_endpoint = endpoint_id.to_string();█*1992| thread::spawn(move || {█1993| run_inject_worker_supervised(█1994| sup_child,█1995| sup_faulted,█...█2794| let me = Arc::clone(self);█*2795| thread::spawn(move || {█2796| let _ = me.hand [...5314ch elided...] ::clone(&net_canary_tick_ms);█*1288| runtime.spawn(async move {█1289| let mut ivl = tokio::time::interval(Duration::from_millis(25));█1290| loop {█1291| ivl.tick().await;█...█1491| let gauge = Arc::clone(&self.active_dial_tasks);█*1492| self.runtime.spawn(async move {█1493| gauge.fetch_add(1, Ordering::Relaxed);█1494| let _dial_guard = DialGauge(gauge);█1495| // Stage cell (ADR-0039 Decision 5): the connect+prove pipeline█...█2258| let sent = Arc::clone(&sent);█*2259| std::thread::spawn(move || {█2260| for f in &frames {█2261| host.send_stream(owner, f, false).expect(\"send\");█2262| sent.fetch_add(1, AtOrd::Relaxed);\u000f█</out>█# Tool call ¶█//Locating PTY implementation█grep(pattern=\"struct PtySession|impl PtySession|pub fn spawn|fn wait\\\\(|impl Drain|reader|read_loop|thread::spawn|thread::Builder\", path=\"crates\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## applyhost.rs█513| let serve = Arc::clone(&broker);█*514| let handle = std::thread::spawn(move || {█515| let _ = serve.serve();█516| });█517| ServedBroker {█## attach.rs█140|/// bounded channel is full (a controller that falls behind its own echo under a█*141|/// hard flood). The next frame this reader sees is then a FORWARD gap that the█142|/// strict reject-gap (`read_event`, legacy single-session path) FATALS. A█143|/// controller CANNOT snap-above like a viewer (B2: it is authoritative - it█144|/// advances `delivered_through`; skipping rolled frames would be a not-exactly-once█## autostart.rs█133| let (tx, rx) = mpsc::channel();█*134| let handle = std::thread::spawn(move || {█135| replay_startup_endpoints(\"bogus-broker-socket-never-dialed\");█136| let _ = tx.send(());█137| });█## brain.rs█200|/// -> deprecated `PIPE_NOWAIT`, which corrupts mid-stream - proven by the mesh█*201|/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader█202|/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each█203|/// framed result [...20833ch elided...] ct(\"send\");█2262| sent.fetch_add(1, AtOrd::Relaxed);█## bin/█### xlate_choreo_fixture.rs█12|//! On an `event` we emit (here -> spt-core, one JSON object per line on stdout,█*13|//! flushing each so the broker's reader sees them promptly):█14|//! `{\"key\":\"ctrl+s\"}` `{\"delay_ms\":50}` `{\"text\":\"XLATE_OK\"}` `{\"key\":\"enter\"}`█15|//! `{\"delay_ms\":50}` `{\"key\":\"ctrl+s\"}` then `{\"commit\":true}`.█16|//!█...█82|█*83| // Emit the choreography, flushing each line so the broker's line-reader█84| // applies it promptly (the delays are part of the sequence the broker█85| // honors, not a wall-clock the test asserts on).█86| emit(&mut out, r#\"{\"key\":\"ctrl+s\"}\"#);█Showing files 1-20 of 176+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Locating broker structures█grep(pattern=\"struct (ControllerSink|ViewerSink|InputWriter|OutputLog|HostedSession|Broker)|fn (controller_writer|viewer_writer|input_writer|handle_conn|serve|spawn_session|append|unsubscribe|retire)|impl Drop\", path=\"crates/spt-daemon/src/broker.rs; crates/spt-daemon/src/conn.rs; crates/spt-daemon/src/nethost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## broker.rs█117|/// dropped (the `tx` closes -> the writer ends) and removed from the map.█*118|struct ViewerSink {█119| /// The bounded live-frame queue to this viewer's writer thread.█120| tx: SyncSender<Envelope>,█121| /// The viewer's IPC send half - kept ONLY for identity matching on detach█...█210|█*211|impl Drop for WakeClaimGuard<'_> {█212| fn drop(&mut self) {█213| recover(self.set).remove(&self.endpoint);█214| }█...█493|/// on a single full `try_send` - only after [`CONTROLLER_WRITE_DEADLINE`].█*494|struct ControllerSink {█495| /// The bounded live-frame queue to the controller's writer thread.█496| tx: SyncSender<CtrlMsg>,█497| /// The controller's IPC send half - kept for identity matching on detach and█...█544|/// `Mutex<OutputLog>` is held, so frames reach each sink in strict `seq` order.█*545|struct OutputLog {█546| session_id: u64,█547","textTail":"\u000estream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█*516|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream [...48986ch elided...] 1678670 event=stream-sub-attach stream=1157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█6528|CONN_LIFECYCLE: conn=2656 role=brain wall_ms=1784266920885 mono_ms=1678761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█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]█6530|CONN_LIFECYCLE: conn=2657 role=brain stream-subscriber stream=1156 wall_ms=1784266920885 mono_ms=1678762 event=stream-sub-attach stream=1156 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█...█6534|CONN_LIFECYCLE: conn=2658 role=brain wall_ms=1784266920890 mono_ms=1678767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 1-260 of 684 (49.9KB limit). Use :261 to continue]\u000f█</out>█# Tool call ¶█//Checking current process thread facts█grep(pattern=\"CONN_LIFECYCLE: conn=137 |CONN_WRITE_POISONED: conn=\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"19000-20000\", case=true, gitignore=false, skip=null)█<out>█\u000e 19062|CONN_LIFECYCLE: conn=7883 role=brain wall_ms=1784269086262 mono_ms=3844133 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*19063|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=1784269086643 mono_ms=3844513 event=stream-sub-attach stream=3643 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█19064|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086717 mono_ms=3844588 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19065|CONN_LIFECYCLE: conn=7884 role=brain wall_ms=1784269086718 mono_ms=3844588 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19066|CONN_LIFECYCLE: conn=7885 role=brain wall_ms=1784269086869 mono_ms=3844740 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█...█19072|CONN_LIFECYCLE: conn=7887 role=brain wall_ms=1784269086875 mono_ms=3844746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*19073|CONN_LIFECYCLE: conn=137 role=brain stream-subscr [...7897ch elided...] ed its 15000ms bound; in-flight I/O aborted, conn never reused [REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]█19960|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=stream-sub-writer-poison replay write failed [REQ-CONN-POISON-ATTRIBUTION]█19961|CONN_LIFECYCLE: conn=8236 role=brain stream-subscriber stream=3810 wall_ms=1784269252413 mono_ms=4010283 event=transport-close poisoned=true timed_out=true [REQ-CONN-POISON-ATTRIBUTION]█19962|CONN_LIFECYCLE: conn=8258 role=brain wall_ms=1784269253160 mono_ms=4011030 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\u000f█</out>█# Tool call ¶█//Reading stream removal sweep█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"940-975\")█<out>█\u000e let observed = observed_addr_json(&conn);█shared█.presence█.lock()█.unwrap()█.append_connected(id, &remote_id_hex, observed);█// Closed-watcher: the row's exit path. Awaits the connection's end (clean█// close, conn loss, or our own endpoint close), removes the row - conns█// finally LEAVE the table - then appends the `disconnected` event (row█// gone before the event is observable).█// [impl->REQ-EP-4]█let sh_close = Arc::clone(shared);█let conn_close = conn.clone();█let hex_close = remote_id_hex.clone();█tokio::spawn(async move {█conn_close.closed().await;█sh_close.conns.lock().unwrap().remove(&id);█// Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead█// - nothing can ever be served on them again, and leaving them makes█// every future dispatcher generation replay them (the control-steal█// hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing█// else reads a dead conn's stream ring.█// [impl->REQ-REDISPATCH-FINISHED-RETIRE]█sh_close█.streams█.lock()█.unwrap()█.retain(|_, e| e.conn_id != id);█sh_close█.presence█.lock()█.unwrap()█.append(PRESENCE_DISCONNECTED, id, &hex_close);█});█// Inbound-stream acceptor: every peer-opened bidi stream joins the table█// and gets a read pump. (QUIC streams are lazy - the peer's open becomes█// visible here on its first write.) Ends when the connection does.█let sh = Arc::clone(shared);█[Showing lines 939-978 of 2865. Use :979 to continue]\u000f█</out>█# Assistant ¶█_**Assessing connection ID persistence**█**Estimating thread and connection distributions**█**Confirming file read limitations**█**Estimating log line ranges**_█# Tool call ¶█//Reading current log tail block█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"24500-24850\")█<out>█\u000eCONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021377 mono_ms=4779245 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10152 role=brain stream-subscriber stream=4719 wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10153 role=brain wall_ms=1784270021384 mono_ms=4779252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█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=1784270022814 mono_ms=4780682 event=stream-sub-attach stream=4720 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█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 st [...53441ch elided...] N_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10299 role=brain wall_ms=1784270081665 mono_ms=4839533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=stream-sub-attach stream=4785 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10300 role=brain stream-subscriber stream=4785 wall_ms=1784270081666 mono_ms=4839533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=10301 role=brain wall_ms=1784270085561 mono_ms=4843429 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 24499-24853 of 386. Use :24854 to continue]\u000f█</out>█# Tool call ¶█//Reading later log block█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"28000-28300\")█<out>█\u000eCONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11613 role=brain wall_ms=1784270611735 mono_ms=5369601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612493 mono_ms=5370360 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11614 role=brain wall_ms=1784270612494 mono_ms=5370360 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11615 role=brain wall_ms=1784270612495 mono_ms=5370361 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612495 mono_ms=5370361 event=stream-sub-attach stream=5409 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11615 role=brain stream-subscriber stream=5409 wall_ms=1784270612497 mono_ms=5370363 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11616 role=brain wall_ms=1784270612497 mono_ms=5370364 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE [...45829ch elided...] -subscriber stream=5466 wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11740 role=brain wall_ms=1784270666539 mono_ms=5424405 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11739 role=brain stream-subscriber stream=5467 wall_ms=1784270666548 mono_ms=5424414 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=11741 role=brain wall_ms=1784270666548 mono_ms=5424414 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 27999-28303 of 353. Use :28304 to continue]\u000f█</out>█# Tool call ¶█//Reading end log block█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"32000-32300\")█<out>█\u000eCONN_LIFECYCLE: conn=13271 role=brain wall_ms=1784271317129 mono_ms=6074993 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078438 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13272 role=brain wall_ms=1784271320574 mono_ms=6078439 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13273 role=brain wall_ms=1784271320575 mono_ms=6078440 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320575 mono_ms=6078440 event=stream-sub-attach stream=6175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13273 role=brain stream-subscriber stream=6175 wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13274 role=brain wall_ms=1784271320577 mono_ms=6078442 event=transport-close poisoned=false timed_out=false [REQ-CONN [...45893ch elided...] 6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13396 role=brain wall_ms=1784271371341 mono_ms=6129205 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=stream-sub-attach stream=6233 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13397 role=brain stream-subscriber stream=6233 wall_ms=1784271371341 mono_ms=6129206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 31999-32303 of 336. Use :32304 to continue]\u000f█</out>█# Tool call ¶█//Finding long-lived carrier IDs█grep(pattern=\"conn=[0-9]+ role=brain .*stream-subscriber.*stream-subscriber.*event=stream-sub-attach\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"15000-20000\", case=true, gitignore=false, skip=null)█<out>█\u000e 15101|CONN_LIFECYCLE: conn=6234 role=brain wall_ms=1784268417345 mono_ms=3175218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*15102|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=1784268417538 mono_ms=3175411 event=stream-sub-attach stream=2855 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█15103|CONN_LIFECYCLE: conn=6235 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█15104|CONN_LIFECYCLE: conn=6236 role=brain wall_ms=1784268418222 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█15105|CONN_LIFECYCLE: conn=6237 role=brain wall_ms=1784268418223 mono_ms=3176095 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█...█15151|CONN_LIFECYCLE: conn=6255 role=brain wall_ms=1784268418789 mono_ms=3176662 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*15152|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber st [...42788ch elided...] r stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108... wall_ms=1784269226702 mono_ms=3984573 event=stream-sub-attach stream=3795 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█19801|CONN_LIFECYCLE: conn=8191 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19802|CONN_LIFECYCLE: conn=8193 role=brain wall_ms=1784269227086 mono_ms=3984956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█19803|CONN_LIFECYCLE: conn=8192 role=brain wall_ms=1784269227086 mono_ms=3984956 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\u000f█</out>"}}}
{"type":"custom_message","customType":"irc:incoming","content":"<irc>\nIncoming IRC message from agent `RedispatchCpuRca`:\n\nI found unbounded stream_infos hot enumeration + Registry local stream retention. Do your thread findings identify what accounts for ~532 broker threads (conn handlers/watchdogs vs PTY/other)? One-line answer useful.\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: \"RedispatchCpuRca\"`) — you may finish your current step first. Nobody replies on your behalf.\n</irc>","display":true,"details":{"id":"153306deba9c5f47","from":"RedispatchCpuRca","message":"I found unbounded stream_infos hot enumeration + Registry local stream retention. Do your thread findings identify what accounts for ~532 broker threads (conn handlers/watchdogs vs PTY/other)? One-line answer useful."},"attribution":"agent","id":"173a10b0","parentId":"42890b98","timestamp":"2026-07-17T07:06:51.834Z"}
{"type":"message","id":"b71e26d9","parentId":"173a10b0","timestamp":"2026-07-17T07:07:09.208Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Investigating subscriber retention issue**"},{"type":"toolCall","id":"call_pCrnbKN7xwzn4Qk3TbupMwwn|fc_0365286983a6ba82016a59d497b47c8194ad73c87d54c62553","name":"irc","arguments":{"i":"Sharing broker thread attribution","op":"send","to":"RedispatchCpuRca","message":"~532 is best explained by leaked `SubscriberSeat` writer threads on long-lived brain conn 137: one `std::thread::spawn` per subscribe (`nethost.rs:189-208`), seat retained in each `StreamLog`; `retire_stream` only sets retired+clears ring, not subscriber/cancel (`nethost.rs:1810-1834`). Logs show conn=137 accumulating `stream-subscriber stream=...` tags for every Registry wave. Not conn-watchdogs (1/physical conn, fresh short-lived conns close) nor PTYs (~2/session).","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":63210,"output":321,"cacheRead":12800,"cacheWrite":0,"totalTokens":76331,"reasoningTokens":138,"cost":{"input":0.31605000000000005,"output":0.00963,"cacheRead":0.0063999999999999994,"cacheWrite":0,"total":0.3320800000000001}},"stopReason":"toolUse","timestamp":1784272011839,"responseId":"resp_0365286983a6ba82016a59d48cb6108194b43ed8e883ba01d0","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d492485481948cc19856a3b85814","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdSXW5986g_V93IOteTs6AnE2SlDyospuxujVF_KY0J2iq3wXVT2EG85fGrmEeQlHBCNmte9H06gtLuGl8jbZaWugKn6RHxHj-413Y-K8V6O3luuPyBuBYEq8oC5XrYfnUD8yzdKjD1iicbFeqMfTm-Jn4aHXs8Y2ng7myoUAX57oOQdhZfmI8LQh5rNbXIJwNoqDabspFgOJ5K3FkQohASokJxPSLZmvLlnkDaef6X_G7CnjswKBzcAxpEj_NLVS8OCuOC1ixNSPR5Ze7y0mo700iqjp8rp7Q30lck8g0Je4Wcyas6TrU-BtQBzYWfdKk0yunnhUdyPndat_32t1MFIinYQsLPodnm66xnXwftdYnOvwfaG94eI_pH7pkIrSg3xUYbhz9-MTmtSCeiQP3ytUB0ZL8qiurJwJ-3qALzpLVJVAeE_NkZHbOIMdOU0CGZHW5QpU8uIUQJX1C91qxh9cgkFVaGd8QwCIZSNolKX6-6gtwxrHZAO6qlKULhXRKaHG4sIjLbSciG_BeXPn6vTq1dZIug2VZzpoKqRqc0SxZbolWs9F1LX75dr8_dSZieUwScWxjZUHj1fduebNYo23AqLPH3-CcZyAt7aRFgueVgn9_WK0SonvZ0DmamGRcRKRAnGGknfxgrRcySPBV67VVGq2S11IKWkCt0y0h4pOJaU-0XmzFxGSEZah8r7XJG5iDeVZeJ77Njo9RvXlk7sq-KA93PPlZ0PBoNrhVXUK9CJmtcR1CXYYoXbQtJ-lLLxL4vx2elELRdfpnRrq1CVQAp2zSjCUb9a8KemyNuzrUe74xPZEtJSGZf__QUTttlNIGndyzWHGY4f3GB6VcIfa-VJNpYGRpjcLytldDFclxtzXVzMvXsp28hgOuNo7B_E-ht8WKVF5x0l085jVieEwdyYWhvmsc3D1rP8dzAxhPSETkiYAgiAuG1Oz84cPhTQh2SAS1EJdrIapGdCmJRfv6v246-8S7ga1-1Y6eCSYddwssB_4-sOwtTaaWtw4Twn-yjn0hVbeYYymaVPaVgK2ju4IRyfJXTQ3-KHDmFNb7r2Um6pXZGn7TQ0aPT5SfN_XM9GpQAkS7kldOUFmxQO-ECLplmQrYnWb5vmIoaIzipGVUrnDETs1GNDm6C5aLsYVdsQQU3rGQVzv2i62A9CrooATzlw_weFixFauMOAg6Xdlvkn4w-fhTkWjQ7pOSV1Bx4ivJZXZXpol4wyotfZ8ikGiBxwN9kLvNyYlf0_ccm97a8nX34f04r9jMakAwgNqQnazotvO6g1n2ifRyMj8oeVqsavCs72COp8xL9KPJy75kksLHxmUd9VygueozUP9_zyta53MHPMaXyFE16swvw9tkLK6XCF5CgRbs80RHHyEdzdEPyEZpTxtHT8OSdlVb01HQLk1iyZZzrFqDSQ6l9wYi8VtXWhtnd2vFSLIYmpTGuG7bO6ux3lz7gp2phv3WzwEkbhW5h_WFGQB5gRE3jzUUyUM9MhxO_C_lvqa3SkmB5KhlZe23EOI5ysoxFE-QeG4gkWP-5SgBIN7NiUav5zIhXHdaSFk1GQUHfxVKL_FclWTuu8JRpREql9mk6QBtY4SumtpX1xQ-webs_BDp_RJAjRx9ie_hMMea9PsUmBPE_2I13ef7e3IX0JldihH5p90kX-KJ6ptSUOKGQlUhNvYaEwxf_YuSVVaXtw7zFYBNUetqLNbBHXoYIY9apK-_2uyBELdi_z_KKPs5mXrmM9n8b_9CsEjQRUpr5jXTbupU0uweJLCI2c9tUAQx10MojND1fHVa7t6FZ21xwmNUkMiAHCrChqtu-I2K-bgSn4fXXJPOjFIh26ScQbJkXT","summary":[{"type":"summary_text","text":"**Investigating subscriber retention issue**"}]},{"id":"fc_0365286983a6ba82016a59d497b47c8194ad73c87d54c62553","type":"function_call","status":"completed","arguments":"{\"i\":\"Sharing broker thread attribution\",\"op\":\"send\",\"to\":\"RedispatchCpuRca\",\"message\":\"~532 is best explained by leaked `SubscriberSeat` writer threads on long-lived brain conn 137: one `std::thread::spawn` per subscribe (`nethost.rs:189-208`), seat retained in each `StreamLog`; `retire_stream` only sets retired+clears ring, not subscriber/cancel (`nethost.rs:1810-1834`). Logs show conn=137 accumulating `stream-subscriber stream=...` tags for every Registry wave. Not conn-watchdogs (1/physical conn, fresh short-lived conns close) nor PTYs (~2/session).\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_pCrnbKN7xwzn4Qk3TbupMwwn","name":"irc"}]},"duration":17367.741499990225,"ttft":6458.2748999893665,"contextSnapshot":{"promptTokens":76010,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_pCrnbKN7xwzn4Qk3TbupMwwn|fc_0365286983a6ba82016a59d497b47c8194ad73c87d54c62553","toolName":"irc","startedAt":"2026-07-17T07:07:09.209Z","intent":"Sharing broker thread attribution"},"id":"c8ec107b","parentId":"b71e26d9","timestamp":"2026-07-17T07:07:09.209Z"}
{"type":"message","id":"e7c2b116","parentId":"c8ec107b","timestamp":"2026-07-17T07:07:09.209Z","message":{"role":"toolResult","toolCallId":"call_pCrnbKN7xwzn4Qk3TbupMwwn|fc_0365286983a6ba82016a59d497b47c8194ad73c87d54c62553","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- RedispatchCpuRca: injected"}],"details":{"op":"send","from":"BrokerCpuRca","to":"RedispatchCpuRca","receipts":[{"to":"RedispatchCpuRca","outcome":"injected"}]},"isError":false,"timestamp":1784272029209}}
{"type":"message","id":"2b1d366a","parentId":"e7c2b116","timestamp":"2026-07-17T07:07:31.266Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying long-lived broker threads**\n\n**Mapping session and stream threads**\n\n**Investigating dispatch worker threads**"},{"type":"toolCall","id":"call_UoMx8MREHebwLJgqUHHllHE7|fc_0365286983a6ba82016a59d4b1d89881948252cd1045a24c7b","name":"read","arguments":{"i":"Reading subscriber worker lifecycle","path":"crates/spt-daemon/src/nethost.rs","selector":"165-245,500-570,1809-1865,1885-1935"}},{"type":"toolCall","id":"call_ydgFC2nzBrbVqXJPh9GXkCPN|fc_0365286983a6ba82016a59d4b1d9008194b29c13cbfc9e6466","name":"read","arguments":{"i":"Reading session writer lifecycles","path":"crates/spt-daemon/src/broker.rs","selector":"890-970,1090-1160,1405-1468,1548-1650,1760-1810"}},{"type":"toolCall","id":"call_8mO2miL1qsvWyE2MvjZwA3U6|fc_0365286983a6ba82016a59d4b1dab8819485f345b9ce1f9bb4","name":"read","arguments":{"i":"Reading broker cleanup lifecycles","path":"crates/spt-daemon/src/broker.rs","selector":"1935-2045,2760-2835,3020-3100,3230-3305,4434-4475"}},{"type":"toolCall","id":"call_BIrjkjAPQKwioJ32R0QFNGSp|fc_0365286983a6ba82016a59d4b1db3c8194a455d9a2d5d142ba","name":"read","arguments":{"i":"Reading PTY ownership lifecycle","path":"crates/spt-term/src/pty.rs","selector":"45-90,195-225"}},{"type":"toolCall","id":"call_AiEBZHCPrOqQEe02arCMrH1f|fc_0365286983a6ba82016a59d4b1db4881948ae046546b2465a4","name":"read","arguments":{"i":"Reading PTY drain lifecycle","path":"crates/spt-term/src/reader.rs","selector":"64-185"}},{"type":"toolCall","id":"call_oqErfTSlEYg20ZDLtlD5NrQn|fc_0365286983a6ba82016a59d4b1db508194ac7001b54357cf84","name":"read","arguments":{"i":"Reading daemon startup threads","path":"crates/spt-daemon/src/daemon.rs","selector":"185-315,325-365"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8261,"output":760,"cacheRead":68096,"cacheWrite":0,"totalTokens":77117,"reasoningTokens":449,"cost":{"input":0.041305,"output":0.0228,"cacheRead":0.034048,"cacheWrite":0,"total":0.09815299999999999}},"stopReason":"toolUse","timestamp":1784272029225,"responseId":"resp_0365286983a6ba82016a59d49e14b88194b7553d2788366d74","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d4a1c4f88194ad31b6b06fd5f931","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdSxi5N9b1qTzHvRhFBAoLYb8tCAiLjySlEGU5Ak4hfGeykd6poeraOOv0EiXJt3qN11qa1S5Uh-KpuF1LZNpQ7n6Q8hiQJYtSXpXjEYN-Iz0JgmDFOM-kmScv-2H3Cm9CldRijv3pTJFEYI_NYvKROTB9dmUbbesDGqhsNK2nOo3Uu67Z8eFzLo6BGWt6ikHQGyxi2xYJQrexBaIlumO9VJgfUaX_vHftjgsXZWbGlsS5YR8_7R-9a_omWjabGNzVatfVNdwW-z5u5lBdQURYiaSG5VzWZw4yn-z8eb6QlTiWTWt5QO0WugTAXdhIjZThPNaDyjWME3M9UZ2946aGdpdgEnoTD-qRxvKXhb_bgSmwa87Z2inoScwZ5FXbEjdJ3YwA7LERjhn2QzdsLOh70pZdbVTPhdulLa0kfHMBx2N8I2OvlFuoXU7QvzLnc4vtdqGaDyAXW5OIGVdJ2MQgDUBkFT9JEiweLvAmXk2twKHYDoXFxsuDZ_TE48j1r2rLetW056KcbL0tx8l1spM_4Lfdr7N0DispOJsrAIo-lJs1RODcay1Zb0I0optnZDF5K3CpY8ZDLBtrAbB9qVa3alj38mmJm9levQ1EGEVmYYwC2pDtLwc-ccXrEkCEOxVYg_FNHgJbmzrOgR3v2Pa1lDChO_7_s8q4AJqnU8YqmWBifjOlOwJ1jAsS_cTkU011WWIqe9Od49s6nEMt6OL_qLbodF17iEiGL_BpleSEHN_HKYxuXvpJ7P3rW_MFRWY2x1Xx4u9KsR11loMuvpB0sW8nR5LNwT5zfIrFBb1yM1wqBQse7EqF6yfget1-iHQ9xvFh1zNyHFcHi4XpPuZRidjf2lFhjTvc4wnznveBULi2TgLeW-sneZ8BTRChbnviVvAsQw21fsoEiiR4YHD1-kQqGx_AKcdUJ52O6wPLbvi2v4oNTCfxwD0FQVDeGuTI7FHkz1zmnNGcKkBbNBEG3cv3LlQDeopoVsUySr1BawEXae88axdon7ous332DI2jI_VEw2kWrw7Mw8mlX_2Cl94wTnP_ZucSp0jsGXIIKT2K86Big48kmJpIfW0yaEHeWM5FjyKnaudKNh666nAvR8KK9xWL5xKRjPt6NYyyQuwV-rlr22IikpQ1AcbrKH20Srb0Bht8d00ig5MAdG8wonchPErQLF334GDCtOBrzqRCMhwQyz31Rv0ZDvac_sfMJ7iNcCBvp3FApS8D2YV5CZFyMQVe1RXNii0lYne-2AWwV83Ew8vSEw_DTc1WfHgxfmzh7slW2yS2Jaeg-9TUiJPWhPGU0I4A8Mk04cz2WCZ6I5LmH1SfbVyHsQ6Yk-aX8x9_XqavAErKlK_3mWiGnSUA5znDgo94TWKZOkppSQBcy50y7_83WxmfWWqSnkhC-KeIE0Sjjtm7TF60HYFVTPC-efRxdF_nMU_9hLUIpIvZZVjzZiSXRx7rNzUMfaXliIhbHCUxLMkX1VGsbj4WTd0oxbyU-7fwsefEDj3lcK-A7hmcmAOhaqVD-5gtwMjSGD1MJLOpeumpE7sM1hpFBW2ysaiGvG58Z3u86fDBf8Sa3fXLmvhcyqqY_hzUuQNaoStPADIRX67gqcc2nZEJnIQcblczrhYxknRzgEoZS_ACdYybFyGoeujS5Aqy54aYSoQj9OvpBha6p45i5Sg4Hc3jhXI_wJa7biZPtELof9CFNs1TJUPjpPbo6fxjR4DTXjTOdbEouYrQIxZffXIxcTyZJlIXZPzMc6qSDxSsOOtd8dYXcd35XkVnedNXLjwRTfxKbMMACWOgelUXf0GZKdiVEFHAs4xpCcjrZBoGzVecQrhLRJYCXAlHt8ox85QJuE8rwOh1B59co04ECYdmUgDVEXyEPF5iCF8hN508Vv5wEa75kCqmnpNCRiFSbvZrjG5XW6A6IttWNGAuY5O7KIOvpLeTqRlJnRgoQLyuq0QvS5nNqBDU6p7a1vVXZ_yUEQ2yYR2vmKATAJWbR9XIVon42qzJjEorQf2k9IxHgjgw1X2f-RHIK5dVmCWhIBjicDKAqnTlyol_lsMIQLL6BZ4jvGRzMpKBdavSYym2XlwyENAHAPtwnfx52HxZds8KeSnG5U73fFekafmTJ7JsxaMfgjtXtz1Vu8VPTdSvY5vl3bfF5Q4IZ_pu0IR62BtVLj6XfMfBS5Xl4DcGXHEeC95iOwOzaqVrfvWL9ROIP9mZuWVXwSUpqsNKaifAnD3lCDYBqVkWgrLFKwxTG-KBPAtJV5kKC7Emtp3xIWPs1-u11sRVdCay4aw0P3X_b8nk51kAROoFAxxcDYbuAzrHcSpUGVWvtU6Lqzk_-TGQ70wPTBJp8klO7h3ISxCZZaFlIDVdkqFzBTiMj_z0NKJHFNe-77EUpY8GHAjCGmf8oPNus4c6-5_4duqJ3zVbVDUcOc7GYtRNSKakZlPL1qly0YpqYfPSHWPXJDWT5wUHRJvg9ofd1dRv4vFaPAuECs2KuHvTzEqxT8lylWWR8_InuNHP_FH-Y1nRON0xLj309iqF7KhgjKRKQa3oPK2slmSRTSHRLE1Vsj9J9c1PA4vun7hFXoDk9CrQoJ0wBgbMlW2W6ccNhrRGPcdMeHKYYffz-AC9cfFd-3mAYa4bFh_ge_iazh62K3wZUCs4G57Us9KVoVXS0lP3D5hsb2vaJzSjX1occ1RFCq31MxhD0z5dEn4xyeoKuClQww1Ik8QjgMGo1Tqi0DOVi6g-fDa8ImAw8dx0bAjMhdXfhSDgpJd_Gh32tc8FibwJ-NeEIsf7tkuWzC9V8zgZ8Ck41t9pBROmiYm8vpSZ6E5M09xIigkMWO9nFzlFIS17OjLARPL_RAnCGAdjcUnXZFxCRsWkUbHa-42WhPwpAnMl4Cemd2XzKmjX5XnkV40VkigJQt7ylIS62sPZ3U_8w4nOkJKE7RS-eNCsRDGsD86PJnSpbsrMSQpoBJQJz23qYnyWIWAdGfdHiBmxyKxpsv-X3c00wwAdzB6STOG83xNaI31dpc9Lm0ZNlEkl9zvUiZW8TvUL0WcxELNx8r2JT5PNliGWxTLk3ldsi7B2-nujlOfkgcw8TDBDWLfL1BAF_g0b9gnDADsehC4zK2rLqHrv2NIIR_2--GZi_r-2hCxy-EZ3IbIB-5SUSxSIsAtqoAEe2mJFmZurc31DkwwnLY-Tn41NpC_YWRV2tq2YTATVl4V3rX72DheKhVrbb0v6jOJdrAT-ssMP6FPH7M1z1jAW6KLtL-B6BAV7Us67W8p0ZjnR3wMnjvub8qtJwIOa-q_ceXjZ8K6HR-D4gOfyFt116VN7wBJyDg4FhTqmScEdMmoOy-ZAsBT6aaDJkc1NXKZpuaCexbupkgvAHxQDMTsBHSOoyuBj5aXdh5_gUI5SkfvScnEPsbzSzFZB31aJ4p6qtHL6RLQYwidaZ0fQVwDDSZ9EkTXk7ZoqGbZGF9sszf6eE8mqIn3Sp5CiX-U4xNkR8n5PBVCTWETgB7LtQByMJelOWdTVRyaZxO4bpii8kN-JACQCWlsPYz9HoL5vsZPPtmzo71TcOi_As9VmfCNFcFZsdbe2uVd2jfuFcp4fP9tFrwF0tEGAsCjJ2tc8f7vc_7jbbzeIw3EDbzNCFoJa8gUsvEhvI3BwLQH5SshqpxvEyKqjgNyBgY_XS7VYAta4NcQaq6YoswbaHN_WsBtf1zF6UE2lgvUrSDDYDyXiKqD7juGShGxvJhx8JLP4UEYztredgxROc=","summary":[{"type":"summary_text","text":"**Identifying long-lived broker threads**"},{"type":"summary_text","text":"**Mapping session and stream threads**"},{"type":"summary_text","text":"**Investigating dispatch worker threads**"}]},{"id":"fc_0365286983a6ba82016a59d4b1d89881948252cd1045a24c7b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading subscriber worker lifecycle\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"165-245,500-570,1809-1865,1885-1935\"}","call_id":"call_UoMx8MREHebwLJgqUHHllHE7","name":"read"},{"id":"fc_0365286983a6ba82016a59d4b1d9008194b29c13cbfc9e6466","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading session writer lifecycles\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"890-970,1090-1160,1405-1468,1548-1650,1760-1810\"}","call_id":"call_ydgFC2nzBrbVqXJPh9GXkCPN","name":"read"},{"id":"fc_0365286983a6ba82016a59d4b1dab8819485f345b9ce1f9bb4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker cleanup lifecycles\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1935-2045,2760-2835,3020-3100,3230-3305,4434-4475\"}","call_id":"call_8mO2miL1qsvWyE2MvjZwA3U6","name":"read"},{"id":"fc_0365286983a6ba82016a59d4b1db3c8194a455d9a2d5d142ba","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading PTY ownership lifecycle\",\"path\":\"crates/spt-term/src/pty.rs\",\"selector\":\"45-90,195-225\"}","call_id":"call_BIrjkjAPQKwioJ32R0QFNGSp","name":"read"},{"id":"fc_0365286983a6ba82016a59d4b1db4881948ae046546b2465a4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading PTY drain lifecycle\",\"path\":\"crates/spt-term/src/reader.rs\",\"selector\":\"64-185\"}","call_id":"call_AiEBZHCPrOqQEe02arCMrH1f","name":"read"},{"id":"fc_0365286983a6ba82016a59d4b1db508194ac7001b54357cf84","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading daemon startup threads\",\"path\":\"crates/spt-daemon/src/daemon.rs\",\"selector\":\"185-315,325-365\"}","call_id":"call_oqErfTSlEYg20ZDLtlD5NrQn","name":"read"}]},"duration":22040.408600002527,"ttft":4558.6212000101805,"contextSnapshot":{"promptTokens":76357,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_UoMx8MREHebwLJgqUHHllHE7|fc_0365286983a6ba82016a59d4b1d89881948252cd1045a24c7b","toolName":"read","startedAt":"2026-07-17T07:07:31.266Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading subscriber worker lifecycle"},"id":"51937214","parentId":"2b1d366a","timestamp":"2026-07-17T07:07:31.266Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ydgFC2nzBrbVqXJPh9GXkCPN|fc_0365286983a6ba82016a59d4b1d9008194b29c13cbfc9e6466","toolName":"read","startedAt":"2026-07-17T07:07:31.266Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading session writer lifecycles"},"id":"0c27eb22","parentId":"51937214","timestamp":"2026-07-17T07:07:31.266Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_8mO2miL1qsvWyE2MvjZwA3U6|fc_0365286983a6ba82016a59d4b1dab8819485f345b9ce1f9bb4","toolName":"read","startedAt":"2026-07-17T07:07:31.266Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker cleanup lifecycles"},"id":"1ef78a54","parentId":"0c27eb22","timestamp":"2026-07-17T07:07:31.266Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_BIrjkjAPQKwioJ32R0QFNGSp|fc_0365286983a6ba82016a59d4b1db3c8194a455d9a2d5d142ba","toolName":"read","startedAt":"2026-07-17T07:07:31.266Z","args":{"path":"crates/spt-term/src/pty.rs"},"intent":"Reading PTY ownership lifecycle"},"id":"c146da4b","parentId":"1ef78a54","timestamp":"2026-07-17T07:07:31.266Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_AiEBZHCPrOqQEe02arCMrH1f|fc_0365286983a6ba82016a59d4b1db4881948ae046546b2465a4","toolName":"read","startedAt":"2026-07-17T07:07:31.266Z","args":{"path":"crates/spt-term/src/reader.rs"},"intent":"Reading PTY drain lifecycle"},"id":"73f44505","parentId":"c146da4b","timestamp":"2026-07-17T07:07:31.266Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_oqErfTSlEYg20ZDLtlD5NrQn|fc_0365286983a6ba82016a59d4b1db508194ac7001b54357cf84","toolName":"read","startedAt":"2026-07-17T07:07:31.266Z","args":{"path":"crates/spt-daemon/src/daemon.rs"},"intent":"Reading daemon startup threads"},"id":"880d3f8c","parentId":"73f44505","timestamp":"2026-07-17T07:07:31.266Z"}
{"type":"message","id":"5aa2dc83","parentId":"880d3f8c","timestamp":"2026-07-17T07:07:31.319Z","message":{"role":"toolResult","toolCallId":"call_UoMx8MREHebwLJgqUHHllHE7|fc_0365286983a6ba82016a59d4b1d89881948252cd1045a24c7b","toolName":"read","content":[{"type":"text","text":"impl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n                    writer_done.store(true, Ordering::Release);\n                    return;\n                }\n            }\n            // Then live frames, same halt discipline.\n            while let Ok(frame) = rx.recv() {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"live write failed\");\n                    break;\n                }\n            }\n            writer_done.store(true, Ordering::Release);\n        });\n        SubscriberSeat {\n            sub,\n            tx,\n            done,\n            poisoned,\n        }\n    }\n\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\n    /// push). `Err` means the seat must be removed.\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\n        if self.poisoned.load(Ordering::Acquire) {\n            return Err(SeatFail::Poisoned);\n        }\n        match self.tx.try_send(frame) {\n            Ok(()) => Ok(()),\n            Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),\n            Err(std::sync::mpsc::TrySendError::Disconnected(_)) => Err(SeatFail::Poisoned),\n        }\n    }\n\n    /// Whether this seat belongs to `sub` (detach correlation).\n    fn is(&self, sub: &SharedSend) -> bool {\n        Arc::ptr_eq(&self.sub, sub)\n    }\n…\n}\n…\n    fn finish(&mut self) {\n…\n        if let Some(seat) = &self.subscriber {\n…\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Install `sub` as the subscriber with the replay snapshot (retained\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\n    /// replay-then-live seq order is structural (see\n    /// [`SubscriberSeat::install`]), while every conn write still happens\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n    /// under the lock with discarded write errors, the exact serial-poison\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\n    ///\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\n    /// a replacement subscriber is never installed until the prior one is\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // No-reinstall-until-gone applies to the POISON class only\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n            // 15s bounded write — installing a replacement now would hand the\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\n            // DISPLACED as before (the newer-brain-takes-over contract).\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    format!(\n                        \"stream {} subscriber busy: prior subscriber still draining\",\n                        self.stream_id\n                    ),\n                ));\n            }\n            // Healthy displacement, prior fully gone, or same sub re-attach.\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\n        // record — this is one of the two RCA-pinned shared-carrier classes.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\n        sub.lifecycle_event(\n            \"stream-sub-attach\",\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\n        );\n        let mut replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|(s, _)| *s >= from_seq)\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\n            .collect();\n        if self.finished {\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\n        }\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\n        // prior writer — poisoned OR healthily displaced — holds only its own\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\n        // brain-swap displacement left the displaced writer and the successor\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\n        // write failure (its conn dying — every daemon refresh) canceled the\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\n        // displaced stream on exactly the post-refresh path this wave calms.\n        // One poison never dead-ends the stream (T5 recovery): the next\n        // generation's mint IS the renewal; `send_stream` reads this current\n        // Arc, old workers' handles stay theirs (C2 consumes via\n        // [`NetHost::stream_lease`]).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        self.lease = Arc::new(StreamLease::default());\n        let replay_len = replay.len();\n        self.subscriber = Some(SubscriberSeat::install(\n…\n        ));\n…\n    }\n…\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n…\n        streams\n…\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\n    /// not yet arrived, or capture gave up bounded).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        // A retired row answers no-such-stream: classification exists only to\n…\n    }\n…\n\n    /// Drain a retentive stream's undrained bytes (the shell-tunnel recv cursor):\n    /// pops the whole ring in order, concatenated, and wakes the read pump (which\n    /// may have been lagging the sender at the backpressure cap). Returns\n    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n    // [impl->REQ-SHELL-4]\n    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        let drained = entry.log.lock().unwrap().drain();\n        // The drain freed ring room — wake a pump that was backpressure-parked.\n        entry.room.notify_one();\n        Some(drained)\n    }\n\n    /// A held stream's current undrained ring depth in chunks (test introspection\n    /// for the retentive backpressure bound). `None` ⇒ no such stream.\n    #[cfg(test)]\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\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…\n    }"}],"details":{"displayContent":{"text":"impl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n    /// the mutex — a concurrent append could slot a live frame into the\n    /// middle of the replay and break the brain's strict gap check: the xfer\n    /// re-serve \"got seq 134 want 6\" CI red.)\n    /// `lease` (StreamLog seats; `None` for presence) is the stream's serve\n    /// lease AT INSTALL: the writer cancels it the moment a write fails, so\n    /// the paired serve/wire worker's next forward refuses PROMPTLY — even on\n    /// a traffic-quiet stream where no producer enqueue would ever run\n    /// `drop_seat` (a mid-replay poison with no follow-on appends previously\n    /// left the lease alive until the next append; the T4 forwarder starved).\n    /// A LATE cancel from a superseded writer — poisoned OR healthily\n    /// displaced — is harmless by construction: every install mints a fresh\n    /// lease Arc, so an old writer cancels only its own generation's Arc.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn install(\n        sub: SharedSend,\n        replay: Vec<Envelope>,\n        lease: Option<Arc<StreamLease>>,\n    ) -> SubscriberSeat {\n        let (tx, rx) = std::sync::mpsc::sync_channel::<Envelope>(SUBSCRIBER_QUEUE_CAP);\n        let done = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let poisoned = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        let writer_sub = Arc::clone(&sub);\n        let writer_done = Arc::clone(&done);\n        let writer_poisoned = Arc::clone(&poisoned);\n        std::thread::spawn(move || {\n            let poison = |halt_reason: &str| {\n                writer_poisoned.store(true, Ordering::Release);\n                if let Some(l) = &lease {\n                    l.cancel();\n                }\n                writer_sub.lifecycle_event(\"stream-sub-writer-poison\", halt_reason);\n            };\n            // Replay first — halt at the first failed write (Amendment\n            // fix 2), never iterate past a poisoned conn.\n            for frame in replay {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"replay write failed\");\n                    writer_done.store(true, Ordering::Release);\n                    return;\n                }\n            }\n            // Then live frames, same halt discipline.\n            while let Ok(frame) = rx.recv() {\n                if writer_sub.write(&frame).is_err() {\n                    poison(\"live write failed\");\n                    break;\n                }\n            }\n            writer_done.store(true, Ordering::Release);\n        });\n        SubscriberSeat {\n            sub,\n            tx,\n            done,\n            poisoned,\n        }\n    }\n\n    /// Non-blocking enqueue (the producer sites: append, finish, presence\n    /// push). `Err` means the seat must be removed.\n    fn enqueue(&self, frame: Envelope) -> Result<(), SeatFail> {\n        if self.poisoned.load(Ordering::Acquire) {\n            return Err(SeatFail::Poisoned);\n        }\n        match self.tx.try_send(frame) {\n            Ok(()) => Ok(()),\n            Err(std::sync::mpsc::TrySendError::Full(_)) => Err(SeatFail::Overflow),\n            Err(std::sync::mpsc::TrySendError::Disconnected(_)) => Err(SeatFail::Poisoned),\n        }\n    }\n\n    /// Whether this seat belongs to `sub` (detach correlation).\n    fn is(&self, sub: &SharedSend) -> bool {\n        Arc::ptr_eq(&self.sub, sub)\n    }\n…\n}\n…\n    fn finish(&mut self) {\n…\n        if let Some(seat) = &self.subscriber {\n…\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Install `sub` as the subscriber with the replay snapshot (retained\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\n    /// replay-then-live seq order is structural (see\n    /// [`SubscriberSeat::install`]), while every conn write still happens\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n    /// under the lock with discarded write errors, the exact serial-poison\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\n    ///\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\n    /// a replacement subscriber is never installed until the prior one is\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // No-reinstall-until-gone applies to the POISON class only\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n            // 15s bounded write — installing a replacement now would hand the\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\n            // DISPLACED as before (the newer-brain-takes-over contract).\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    format!(\n                        \"stream {} subscriber busy: prior subscriber still draining\",\n                        self.stream_id\n                    ),\n                ));\n            }\n            // Healthy displacement, prior fully gone, or same sub re-attach.\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\n        // record — this is one of the two RCA-pinned shared-carrier classes.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\n        sub.lifecycle_event(\n            \"stream-sub-attach\",\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\n        );\n        let mut replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|(s, _)| *s >= from_seq)\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\n            .collect();\n        if self.finished {\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\n        }\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\n        // prior writer — poisoned OR healthily displaced — holds only its own\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\n        // brain-swap displacement left the displaced writer and the successor\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\n        // write failure (its conn dying — every daemon refresh) canceled the\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\n        // displaced stream on exactly the post-refresh path this wave calms.\n        // One poison never dead-ends the stream (T5 recovery): the next\n        // generation's mint IS the renewal; `send_stream` reads this current\n        // Arc, old workers' handles stay theirs (C2 consumes via\n        // [`NetHost::stream_lease`]).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        self.lease = Arc::new(StreamLease::default());\n        let replay_len = replay.len();\n        self.subscriber = Some(SubscriberSeat::install(\n…\n        ));\n…\n    }\n…\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n…\n        streams\n…\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n        else {\n            return false;\n        };\n        let newly = !entry\n            .retired\n            .swap(true, std::sync::atomic::Ordering::SeqCst);\n        if newly {\n            // A retired exchange's request bytes are dead weight — free the\n            // ring; the pinned opener and cursors stay (cheap, bounded).\n            entry.log.lock().unwrap().ring.clear();\n        }\n        newly\n    }\n\n    /// The stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, independent of the evictable data ring. Outer\n    /// `None` = no such stream; inner `None` = no opener pinned (first `\\n`\n    /// not yet arrived, or capture gave up bounded).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn stream_opener(&self, stream_id: u64) -> Option<Option<Vec<u8>>> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        // A retired row answers no-such-stream: classification exists only to\n…\n    }\n…\n\n    /// Drain a retentive stream's undrained bytes (the shell-tunnel recv cursor):\n    /// pops the whole ring in order, concatenated, and wakes the read pump (which\n    /// may have been lagging the sender at the backpressure cap). Returns\n    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n    // [impl->REQ-SHELL-4]\n    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n        let drained = entry.log.lock().unwrap().drain();\n        // The drain freed ring room — wake a pump that was backpressure-parked.\n        entry.room.notify_one();\n        Some(drained)\n    }\n\n    /// A held stream's current undrained ring depth in chunks (test introspection\n    /// for the retentive backpressure bound). `None` ⇒ no such stream.\n    #[cfg(test)]\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\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…\n    }","startLine":165,"lineNumbers":[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,null,252,null,492,null,494,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,null,574,null,576,null,1805,null,1807,null,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,null,1872,null,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,1931,1932,1933,1934,1935,null,1945]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784272051319}}
{"type":"message","id":"830cec0e","parentId":"5aa2dc83","timestamp":"2026-07-17T07:07:31.320Z","message":{"role":"toolResult","toolCallId":"call_BIrjkjAPQKwioJ32R0QFNGSp|fc_0365286983a6ba82016a59d4b1db3c8194a455d9a2d5d142ba","toolName":"read","content":[{"type":"text","text":"pub struct PtySession {\n…\n    /// The master reader, taken at most once (`take_reader`).\n    reader: Mutex<Option<Box<dyn Read + Send>>>,\n    /// The child OS pid, captured at spawn.\n    pid: Option<u32>,\n}\n\nimpl PtySession {\n    /// Spawn `cmd` under a fresh native PTY sized to `size`.\n    ///\n    /// The slave end is dropped immediately after the child is spawned: the\n    /// child holds the only remaining slave handle, which lets EOF propagate on\n    /// the Unix raw-pipe backend once the child exits. (On Windows the no-EOF\n    /// behaviour is governed by the writer, handled by the A2 drain discipline.)\n    //\n    // [impl->REQ-TERM-1]\n    pub fn spawn(cmd: CommandBuilder, size: SurfaceSize) -> Result<Self, SurfaceError> {\n        let pty_system = native_pty_system();\n        let pair = pty_system\n            .openpty(size.into())\n            .map_err(|e| SurfaceError::OpenPty(e.to_string()))?;\n\n        let child = pair\n            .slave\n            .spawn_command(cmd)\n            .map_err(|e| SurfaceError::Spawn(e.to_string()))?;\n        // Drop the slave so the child owns the only slave-side handle.\n        drop(pair.slave);\n\n        let reader = pair\n            .master\n            .try_clone_reader()\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\n        let writer = pair\n            .master\n            .take_writer()\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\n        let killer = child.clone_killer();\n        let pid = child.process_id();\n\n        Ok(Self {\n            master: Mutex::new(pair.master),\n            writer: Arc::new(Mutex::new(writer)),\n            child: Mutex::new(child),\n            killer: Mutex::new(killer),\n            reader: Mutex::new(Some(reader)),\n            pid,\n        })\n    }\n…\n    pub fn try_wait(&self) -> Result<Option<ExitStatus>, SurfaceError> {\n        self.child\n            .lock()\n            .unwrap()\n            .try_wait()\n            .map_err(SurfaceError::Io)\n    }\n\n    /// Block until the child exits, yielding its status.\n    pub fn wait(&self) -> Result<ExitStatus, SurfaceError> {\n        self.child.lock().unwrap().wait().map_err(SurfaceError::Io)\n    }\n\n    /// Terminate the child. Safe to call from another thread while `wait`\n    /// blocks (uses the split `ChildKiller`). Confirm the reap via\n    /// [`PtySession::wait`] / [`PtySession::try_wait`].\n    pub fn kill(&self) -> Result<(), SurfaceError> {\n        let res = self.killer.lock().unwrap().kill();\n        #[cfg(windows)]\n        {\n            // portable-pty 0.8's Windows `ChildKiller` returns the spurious\n            // `last_os_error` even when `TerminateProcess` *succeeds* (the\n            // upstream success check is inverted; `WinChild::kill` swallows it,\n            // the cloned killer does not). Its Result is therefore untrustworthy\n            // — kill is best-effort; confirm death by reaping.\n            let _ = res;\n            Ok(())\n        }\n        #[cfg(unix)]\n        {\n            res.map_err(SurfaceError::Io)\n        }\n    }\n…\n}"}],"details":{"displayContent":{"text":"pub struct PtySession {\n…\n    /// The master reader, taken at most once (`take_reader`).\n    reader: Mutex<Option<Box<dyn Read + Send>>>,\n    /// The child OS pid, captured at spawn.\n    pid: Option<u32>,\n}\n\nimpl PtySession {\n    /// Spawn `cmd` under a fresh native PTY sized to `size`.\n    ///\n    /// The slave end is dropped immediately after the child is spawned: the\n    /// child holds the only remaining slave handle, which lets EOF propagate on\n    /// the Unix raw-pipe backend once the child exits. (On Windows the no-EOF\n    /// behaviour is governed by the writer, handled by the A2 drain discipline.)\n    //\n    // [impl->REQ-TERM-1]\n    pub fn spawn(cmd: CommandBuilder, size: SurfaceSize) -> Result<Self, SurfaceError> {\n        let pty_system = native_pty_system();\n        let pair = pty_system\n            .openpty(size.into())\n            .map_err(|e| SurfaceError::OpenPty(e.to_string()))?;\n\n        let child = pair\n            .slave\n            .spawn_command(cmd)\n            .map_err(|e| SurfaceError::Spawn(e.to_string()))?;\n        // Drop the slave so the child owns the only slave-side handle.\n        drop(pair.slave);\n\n        let reader = pair\n            .master\n            .try_clone_reader()\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\n        let writer = pair\n            .master\n            .take_writer()\n            .map_err(|e| SurfaceError::Io(io_other(e)))?;\n        let killer = child.clone_killer();\n        let pid = child.process_id();\n\n        Ok(Self {\n            master: Mutex::new(pair.master),\n            writer: Arc::new(Mutex::new(writer)),\n            child: Mutex::new(child),\n            killer: Mutex::new(killer),\n            reader: Mutex::new(Some(reader)),\n            pid,\n        })\n    }\n…\n    pub fn try_wait(&self) -> Result<Option<ExitStatus>, SurfaceError> {\n        self.child\n            .lock()\n            .unwrap()\n            .try_wait()\n            .map_err(SurfaceError::Io)\n    }\n\n    /// Block until the child exits, yielding its status.\n    pub fn wait(&self) -> Result<ExitStatus, SurfaceError> {\n        self.child.lock().unwrap().wait().map_err(SurfaceError::Io)\n    }\n\n    /// Terminate the child. Safe to call from another thread while `wait`\n    /// blocks (uses the split `ChildKiller`). Confirm the reap via\n    /// [`PtySession::wait`] / [`PtySession::try_wait`].\n    pub fn kill(&self) -> Result<(), SurfaceError> {\n        let res = self.killer.lock().unwrap().kill();\n        #[cfg(windows)]\n        {\n            // portable-pty 0.8's Windows `ChildKiller` returns the spurious\n            // `last_os_error` even when `TerminateProcess` *succeeds* (the\n            // upstream success check is inverted; `WinChild::kill` swallows it,\n            // the cloned killer does not). Its Result is therefore untrustworthy\n            // — kill is best-effort; confirm death by reaping.\n            let _ = res;\n            Ok(())\n        }\n        #[cfg(unix)]\n        {\n            res.map_err(SurfaceError::Io)\n        }\n    }\n…\n}","startLine":35,"lineNumbers":[35,null,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,null,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,null,232]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\pty.rs"}}},"isError":false,"timestamp":1784272051319}}
{"type":"message","id":"d47dead0","parentId":"830cec0e","timestamp":"2026-07-17T07:07:31.320Z","message":{"role":"toolResult","toolCallId":"call_ydgFC2nzBrbVqXJPh9GXkCPN|fc_0365286983a6ba82016a59d4b1d9008194b29c13cbfc9e6466","toolName":"read","content":[{"type":"text","text":"impl OutputLog {\n…\n    /// ends its writer's LIVE loop when `tx` drops; bumping `controller_epoch`\n    /// additionally makes a stale deadline-evict a no-op AND stops a superseded\n    /// writer mid-INITIAL-BATCH (P1c — a writer still flushing its owned `initial`\n    /// batch ignores the dropped `tx`, so the epoch gate is what guarantees a\n    /// single live writer per connection and a monotonic on-wire seq stream,\n    /// [`REQ-HAZARD-CONTROLLER-WRITER-REORDER`]). Stamps `driven_by` to the new\n    /// controller's identity.\n    fn become_controller(&mut self, sub: SharedSend, by: Option<String>, from_seq: u64, attach_gen: u64) {\n        // Drop the prior controller sink first (its writer's live loop ends when\n        // tx drops), and bump the generation so (a) an in-flight deadline-evict\n        // for the old controller can't unseat this one and (b) a prior writer\n        // still flushing its initial batch returns before its next frame.\n        // Attribution (F-039 legs b+d): the replaced conn's record names its\n        // successor, and the new conn accretes the controller role fact.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        if let Some(old) = self.controller.take() {\n            old.send.lifecycle_event(\n                \"controller-replaced\",\n                &format!(\"session={} new_conn={}\", self.session_id, sub.id()),\n            );\n        }\n        sub.describe(&format!(\n            \"controller session={} endpoint={} by={}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint },\n            by.as_deref().unwrap_or(\"local\")\n        ));\n        sub.lifecycle_event(\n            \"controller-attach\",\n            &format!(\"session={} from_seq={from_seq}\", self.session_id),\n        );\n        self.controller = None;\n        let epoch = self.controller_epoch.fetch_add(1, Ordering::AcqRel) + 1;\n        // #6 (ADR-0031): a COLD attach's initial batch is a single synthesized clean\n        // repaint of the CURRENT SCREEN (at pseudo-seq `next_seq - 1`) instead of the\n        // raw ring — replaying an alt-screen TUI's raw ring into a fresh terminal is\n        // exactly the corruption #6/#7/#8 report. A resume-from-floor (`from_seq > 0`)\n        // keeps the raw-ring exactly-once re-fetch untouched (B2). Either way the\n        // batch is owned by the writer thread (never pushed through the live channel —\n        // it must not block the drain); live frames stream raw + in-order afterwards.\n        let initial: Vec<(u64, Vec<u8>)> = match self.repaint_initial(from_seq) {\n            Some(repaint) => vec![repaint],\n            None => self\n                .ring\n                .iter()\n                .filter(|(s, _)| *s >= from_seq)\n                .cloned()\n                .collect(),\n        };\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let dt = Arc::clone(&self.delivered_through);\n        let epoch_gate = Arc::clone(&self.controller_epoch);\n        let sid = self.session_id;\n        // W2 decouple: the writer publishes its in-flight-write window here so a\n        // stall-evict can distinguish a wedged writer from an idle one.\n        let write_blocked_since = Arc::new(Mutex::new(None));\n        let writer_blocked = Arc::clone(&write_blocked_since);\n        let writer = thread::spawn(move || {\n            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n        });\n        self.controller = Some(ControllerSink {\n            tx,\n            send: sub,\n            by,\n            last_ok: Instant::now(),\n            write_blocked_since,\n            _writer: writer,\n            attach_gen,\n            });\n        self.stamp_driven_by();\n    }\n\n    /// Detach the controller and UNLATCH the perch — the ONE unlatch path shared\n    /// by W1's deadline-evict ([`mark_controller_gone`]), [`detach_if`], and (per\n    /// the W1↔W5 synergy) W5's reconcile self-heal. Dropping the sink ends its\n    /// writer thread; clearing the slot re-stamps `driven_by` to `None` (so an\n    /// `ONLINE+CONTROLLED` latch cannot outlive a gone controller).\n    fn clear_controller(&mut self) {\n        if self.controller.take().is_some() {\n            self.stamp_driven_by();\n        }\n    }\n…\n    fn stall_evict_controller(&mut self, now: Instant, stamp: StampMode) -> bool {\n…\n        match stamp {\n…\n            // sibling — the take/reattach path is already I/O-under-log-lock).\n            StampMode::Inline => self.clear_controller(),\n            // Deferred: in-memory drop ONLY (the reap closure forbids I/O under the\n            // shared sessions lock); converge_perch_stamps writes the release off-lock.\n            StampMode::Deferred => self.controller = None,\n        }\n        true\n    }\n\n    /// Add a read-only viewer: snapshot the ring from `from_seq` into the writer\n    /// thread (NOT through the bounded live queue — replay must not trip the\n    /// overflow eviction), seed it the current size frame first, then run the\n    /// live queue. The drain thread fans live frames in via `try_send`.\n    fn add_viewer(&mut self, sub: SharedSend, from_seq: u64) {\n        let vid = self.next_viewer_id;\n        self.next_viewer_id += 1;\n        // Attribution (F-039 legs b+d): viewer role fact + attach record.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\n            \"viewer session={} endpoint={} vid={vid}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint }\n        ));\n        sub.lifecycle_event(\n            \"viewer-attach\",\n            &format!(\"session={} vid={vid} from_seq={from_seq}\", self.session_id),\n        );\n        // The size frame + the initial batch (owned by the thread, not the bounded\n        // queue). A COLD viewer attach (`from_seq == 0`) gets the #6 clean repaint;\n        // a skip-to-live / snap re-attach (`from_seq > 0`, incl. `u64::MAX`) keeps\n        // the raw-ring slice (`s >= from_seq`) — empty for skip-to-live, as before.\n        let mut initial: Vec<Envelope> =\n            vec![size_envelope(self.session_id, self.size.0, self.size.1)];\n        match self.repaint_initial(from_seq) {\n            Some((seq, bytes)) => initial.push(output_envelope(self.session_id, seq, &bytes)),\n            None => initial.extend(\n                self.ring\n                    .iter()\n                    .filter(|(s, _)| *s >= from_seq)\n                    .map(|(seq, bytes)| output_envelope(self.session_id, *seq, bytes)),\n            ),\n        }\n        let (tx, rx) = sync_channel::<Envelope>(VIEWER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let evicted = Arc::new(AtomicBool::new(false));\n        let writer_evicted = Arc::clone(&evicted);\n        let session_id = self.session_id;\n        let writer =\n            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n        self.viewers.insert(\n            vid,\n            ViewerSink {\n                tx,\n                send: sub,\n                evicted,\n                _writer: writer,\n            },\n        );\n    }\n\n    /// Resolve a controller/viewer subscribe under the W2.5 model\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). Returns the [`SubscribeOutcome`]; performs\n    /// the controller take / viewer add / loud displace as a side effect. See the\n    /// identity matrix in the body — the `by`-keyed logic is what makes a\n    /// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.\n    fn resolve_subscribe(\n        &mut self,\n        sub: SharedSend,\n        from_seq: u64,\n        intent: AttachIntent,\n        by: Option<String>,\n…\n    ) -> SubscribeOutcome {\n…\n    }\n…\n    fn is_controller(&self, sub: &SharedSend) -> bool {\n…\n    }\n\n    /// The next seq a re-attaching controller still needs (the persisted resume\n    /// cursor surfaced in `KIND_SESSIONS` → `resume_seq`). W1: read from the\n    /// atomic the controller writer thread advances.\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n…\n}\n…\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        advance_delivered(&delivered_through, *seq);\n    }\n    while let Ok(msg) = rx.recv() {\n        let (frame, seq) = match &msg {\n            CtrlMsg::Output(seq, frame) => (frame, Some(*seq)),\n            CtrlMsg::Control(frame) => (frame, None),\n        };\n        // NO epoch gate on the live path (P1c): new output only ever flows to the\n        // CURRENT controller's channel (the drain clones `self.controller.tx`), so\n        // a superseded writer's channel holds only its pre-supersede output\n        // backlog (seq the consumer dedups via snap-above) plus its own TERMINAL\n        // control frames — notably the `Displaced` kick the displaced controller\n        // MUST still receive. The loop ends naturally when `tx` drops. Gating\n        // output here would suppress that `Displaced` (the cv-matrix loud-take\n        // hang). The reorder hazard is the INITIAL-BATCH replay, gated above.\n        mark_blocked(true);\n        let res = send.write(frame);\n        mark_blocked(false);\n        match res {\n            Ok(_) => {}\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        if let Some(seq) = seq {\n            // (a) CONTIGUOUS cursor (b4 / B2 gapless-resume — doyle's gate): with the\n            // drop-on-full handoff in `append`, the controller's live channel can SKIP\n            // a seq (dropped while Full). The frame still went to the socket (the live\n            // operator sees it), but the durable resume cursor must NOT jump past the\n…\n        }\n    }\n…\n}\n…\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n…\n            }\n…\n        }\n    }\n…\n}"}],"details":{"displayContent":{"text":"impl OutputLog {\n…\n    /// ends its writer's LIVE loop when `tx` drops; bumping `controller_epoch`\n    /// additionally makes a stale deadline-evict a no-op AND stops a superseded\n    /// writer mid-INITIAL-BATCH (P1c — a writer still flushing its owned `initial`\n    /// batch ignores the dropped `tx`, so the epoch gate is what guarantees a\n    /// single live writer per connection and a monotonic on-wire seq stream,\n    /// [`REQ-HAZARD-CONTROLLER-WRITER-REORDER`]). Stamps `driven_by` to the new\n    /// controller's identity.\n    fn become_controller(&mut self, sub: SharedSend, by: Option<String>, from_seq: u64, attach_gen: u64) {\n        // Drop the prior controller sink first (its writer's live loop ends when\n        // tx drops), and bump the generation so (a) an in-flight deadline-evict\n        // for the old controller can't unseat this one and (b) a prior writer\n        // still flushing its initial batch returns before its next frame.\n        // Attribution (F-039 legs b+d): the replaced conn's record names its\n        // successor, and the new conn accretes the controller role fact.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        if let Some(old) = self.controller.take() {\n            old.send.lifecycle_event(\n                \"controller-replaced\",\n                &format!(\"session={} new_conn={}\", self.session_id, sub.id()),\n            );\n        }\n        sub.describe(&format!(\n            \"controller session={} endpoint={} by={}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint },\n            by.as_deref().unwrap_or(\"local\")\n        ));\n        sub.lifecycle_event(\n            \"controller-attach\",\n            &format!(\"session={} from_seq={from_seq}\", self.session_id),\n        );\n        self.controller = None;\n        let epoch = self.controller_epoch.fetch_add(1, Ordering::AcqRel) + 1;\n        // #6 (ADR-0031): a COLD attach's initial batch is a single synthesized clean\n        // repaint of the CURRENT SCREEN (at pseudo-seq `next_seq - 1`) instead of the\n        // raw ring — replaying an alt-screen TUI's raw ring into a fresh terminal is\n        // exactly the corruption #6/#7/#8 report. A resume-from-floor (`from_seq > 0`)\n        // keeps the raw-ring exactly-once re-fetch untouched (B2). Either way the\n        // batch is owned by the writer thread (never pushed through the live channel —\n        // it must not block the drain); live frames stream raw + in-order afterwards.\n        let initial: Vec<(u64, Vec<u8>)> = match self.repaint_initial(from_seq) {\n            Some(repaint) => vec![repaint],\n            None => self\n                .ring\n                .iter()\n                .filter(|(s, _)| *s >= from_seq)\n                .cloned()\n                .collect(),\n        };\n        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let dt = Arc::clone(&self.delivered_through);\n        let epoch_gate = Arc::clone(&self.controller_epoch);\n        let sid = self.session_id;\n        // W2 decouple: the writer publishes its in-flight-write window here so a\n        // stall-evict can distinguish a wedged writer from an idle one.\n        let write_blocked_since = Arc::new(Mutex::new(None));\n        let writer_blocked = Arc::clone(&write_blocked_since);\n        let writer = thread::spawn(move || {\n            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n        });\n        self.controller = Some(ControllerSink {\n            tx,\n            send: sub,\n            by,\n            last_ok: Instant::now(),\n            write_blocked_since,\n            _writer: writer,\n            attach_gen,\n            });\n        self.stamp_driven_by();\n    }\n\n    /// Detach the controller and UNLATCH the perch — the ONE unlatch path shared\n    /// by W1's deadline-evict ([`mark_controller_gone`]), [`detach_if`], and (per\n    /// the W1↔W5 synergy) W5's reconcile self-heal. Dropping the sink ends its\n    /// writer thread; clearing the slot re-stamps `driven_by` to `None` (so an\n    /// `ONLINE+CONTROLLED` latch cannot outlive a gone controller).\n    fn clear_controller(&mut self) {\n        if self.controller.take().is_some() {\n            self.stamp_driven_by();\n        }\n    }\n…\n    fn stall_evict_controller(&mut self, now: Instant, stamp: StampMode) -> bool {\n…\n        match stamp {\n…\n            // sibling — the take/reattach path is already I/O-under-log-lock).\n            StampMode::Inline => self.clear_controller(),\n            // Deferred: in-memory drop ONLY (the reap closure forbids I/O under the\n            // shared sessions lock); converge_perch_stamps writes the release off-lock.\n            StampMode::Deferred => self.controller = None,\n        }\n        true\n    }\n\n    /// Add a read-only viewer: snapshot the ring from `from_seq` into the writer\n    /// thread (NOT through the bounded live queue — replay must not trip the\n    /// overflow eviction), seed it the current size frame first, then run the\n    /// live queue. The drain thread fans live frames in via `try_send`.\n    fn add_viewer(&mut self, sub: SharedSend, from_seq: u64) {\n        let vid = self.next_viewer_id;\n        self.next_viewer_id += 1;\n        // Attribution (F-039 legs b+d): viewer role fact + attach record.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\n            \"viewer session={} endpoint={} vid={vid}\",\n            self.session_id,\n            if self.endpoint.is_empty() { \"-\" } else { &self.endpoint }\n        ));\n        sub.lifecycle_event(\n            \"viewer-attach\",\n            &format!(\"session={} vid={vid} from_seq={from_seq}\", self.session_id),\n        );\n        // The size frame + the initial batch (owned by the thread, not the bounded\n        // queue). A COLD viewer attach (`from_seq == 0`) gets the #6 clean repaint;\n        // a skip-to-live / snap re-attach (`from_seq > 0`, incl. `u64::MAX`) keeps\n        // the raw-ring slice (`s >= from_seq`) — empty for skip-to-live, as before.\n        let mut initial: Vec<Envelope> =\n            vec![size_envelope(self.session_id, self.size.0, self.size.1)];\n        match self.repaint_initial(from_seq) {\n            Some((seq, bytes)) => initial.push(output_envelope(self.session_id, seq, &bytes)),\n            None => initial.extend(\n                self.ring\n                    .iter()\n                    .filter(|(s, _)| *s >= from_seq)\n                    .map(|(seq, bytes)| output_envelope(self.session_id, *seq, bytes)),\n            ),\n        }\n        let (tx, rx) = sync_channel::<Envelope>(VIEWER_CHANNEL_DEPTH);\n        let writer_send = Arc::clone(&sub);\n        let evicted = Arc::new(AtomicBool::new(false));\n        let writer_evicted = Arc::clone(&evicted);\n        let session_id = self.session_id;\n        let writer =\n            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n        self.viewers.insert(\n            vid,\n            ViewerSink {\n                tx,\n                send: sub,\n                evicted,\n                _writer: writer,\n            },\n        );\n    }\n\n    /// Resolve a controller/viewer subscribe under the W2.5 model\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). Returns the [`SubscribeOutcome`]; performs\n    /// the controller take / viewer add / loud displace as a side effect. See the\n    /// identity matrix in the body — the `by`-keyed logic is what makes a\n    /// brain-restart re-serve silent (gate #7) and a cross-operator `Take` loud.\n    fn resolve_subscribe(\n        &mut self,\n        sub: SharedSend,\n        from_seq: u64,\n        intent: AttachIntent,\n        by: Option<String>,\n…\n    ) -> SubscribeOutcome {\n…\n    }\n…\n    fn is_controller(&self, sub: &SharedSend) -> bool {\n…\n    }\n\n    /// The next seq a re-attaching controller still needs (the persisted resume\n    /// cursor surfaced in `KIND_SESSIONS` → `resume_seq`). W1: read from the\n    /// atomic the controller writer thread advances.\n    fn delivered_through(&self) -> u64 {\n        self.delivered_through.load(Ordering::Acquire)\n    }\n}\n\n/// A viewer's dedicated writer thread (REQ-HAZARD-VIEWER-ISOLATION): write the\n/// `initial` batch (size frame + ring replay) once, then drain live frames from\n/// `rx` with a BLOCKING socket write each. A failed write (dead viewer) ends the\n/// thread; the drain thread's next `try_send` then sees `Disconnected` and\n/// evicts the row. The drain thread itself never blocks on this socket.\nfn viewer_writer(\n    send: SharedSend,\n    session_id: u64,\n    initial: Vec<Envelope>,\n    rx: Receiver<Envelope>,\n    evicted: Arc<AtomicBool>,\n) {\n    // Bounded writer-exit record on every return path (F-039 leg d) — RAII so\n    // the reason is stamped exactly once however the thread ends.\n    // [impl->REQ-CONN-POISON-ATTRIBUTION]\n    struct ExitNote {\n        send: SharedSend,\n        session_id: u64,\n        reason: &'static str,\n    }\n    impl Drop for ExitNote {\n        fn drop(&mut self) {\n            self.send.lifecycle_event(\n                \"writer-exit\",\n                &format!(\"role=viewer session={} reason={}\", self.session_id, self.reason),\n            );\n        }\n    }\n    let mut note = ExitNote {\n        send: Arc::clone(&send),\n        session_id,\n        reason: \"write-failed\",\n    };\n    for frame in &initial {\n        // Bounded, cancelable conn write (round-4): a viewer that stops\n        // reading poisons + retires ITS conn at the deadline instead of\n        // parking this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        if !matches!(send.write(frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    while let Ok(frame) = rx.recv() {\n        if !matches!(send.write(&frame), Ok(ConnWrite::Done)) {\n            return;\n        }\n    }\n    note.reason = \"channel-closed\";\n    // `tx` dropped. If this was an EVICTION for overflow (append set the flag\n    // before dropping the sink), emit a KIND_VIEWER_EVICTED marker — DISTINCT from\n    // a session-exit EOF — so the serving brain skips to live (re-subscribes from\n    // the ring floor) instead of dying silently. A NORMAL teardown (session end /\n    // conn drop) leaves the flag false → no marker, exit quietly. This write is in\n    // the dedicated writer thread, OFF the log lock / off the drain (the W1/b4\n…\n}\n…\n/// send then sees `Disconnected` and detaches the row. `Output` advances\n/// `delivered_through`; `Control` (Displaced/…) does not.\n// [impl->REQ-HAZARD-INJECT-CONTROL-COEXIST]\n// [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n#[allow(clippy::too_many_arguments)] // per-writer thread-handoff channels (W2 added the blocked-since signal); a struct would obscure the call\nfn controller_writer(\n    sid: u64,\n    send: SharedSend,\n    initial: Vec<(u64, Vec<u8>)>,\n    rx: Receiver<CtrlMsg>,\n    delivered_through: Arc<AtomicU64>,\n    epoch: u64,\n    controller_epoch: Arc<AtomicU64>,\n    write_blocked_since: Arc<Mutex<Option<Instant>>>,\n) {\n    // W2 decouple (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE): mark the exact window a\n    // BLOCKING socket write is in flight, so a reader can tell a WEDGED writer (brain\n    // conn suspended) from a merely idle one and stall-evict it. Set BEFORE the write,\n    // cleared AFTER — the mutex is never held across `write_frame` (that would just\n    // move the wedge onto the mutex).\n    let mark_blocked = |on: bool| {\n        if let Ok(mut g) = write_blocked_since.lock() {\n            *g = if on { Some(Instant::now()) } else { None };\n        }\n    };\n    for (seq, bytes) in &initial {\n        let frame = output_envelope(sid, *seq, bytes);\n        // P1c: a SUPERSEDED writer (a newer `become_controller` bumped the shared\n        // epoch past ours) must write NOTHING further — otherwise its owned\n        // initial batch races the new writer on the same socket and reorders the\n        // seq stream. The gate closure runs AFTER the conn's serialized write\n        // gate is acquired and BEFORE any byte is written — the same\n        // serialization point the old epoch-check-under-`send.lock()` had: both\n        // writers serialize on the one conn gate, and `become_controller` bumps\n        // the epoch BEFORE spawning the new writer, so whichever superseded\n        // writer next holds the gate observes the bump and bails before\n        // committing — no check-then-block-then-write window. (A frame the\n        // stale writer committed BEFORE the bump is irreducible at the broker;\n        // fix #1 removes the contradictory double-take that produced it.)\n        // Round-4: the write itself is bounded + cancelable — a non-draining\n        // consumer poisons + retires the physical conn at the deadline instead\n        // of wedging this thread in the OS write forever.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        mark_blocked(true);\n        let outcome =\n            send.write_gated(&frame, || controller_epoch.load(Ordering::Acquire) == epoch);\n        mark_blocked(false);\n        match outcome {\n            Ok(ConnWrite::Done) => {}\n            Ok(ConnWrite::Superseded) => {\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=superseded\"),\n                );\n                return;\n            }\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        advance_delivered(&delivered_through, *seq);\n    }\n    while let Ok(msg) = rx.recv() {\n        let (frame, seq) = match &msg {\n            CtrlMsg::Output(seq, frame) => (frame, Some(*seq)),\n            CtrlMsg::Control(frame) => (frame, None),\n        };\n        // NO epoch gate on the live path (P1c): new output only ever flows to the\n        // CURRENT controller's channel (the drain clones `self.controller.tx`), so\n        // a superseded writer's channel holds only its pre-supersede output\n        // backlog (seq the consumer dedups via snap-above) plus its own TERMINAL\n        // control frames — notably the `Displaced` kick the displaced controller\n        // MUST still receive. The loop ends naturally when `tx` drops. Gating\n        // output here would suppress that `Displaced` (the cv-matrix loud-take\n        // hang). The reorder hazard is the INITIAL-BATCH replay, gated above.\n        mark_blocked(true);\n        let res = send.write(frame);\n        mark_blocked(false);\n        match res {\n            Ok(_) => {}\n            Err(e) => {\n                note_controller_write_retired(sid, send.id(), &e);\n                // Bounded writer-exit record (F-039 leg d).\n                // [impl->REQ-CONN-POISON-ATTRIBUTION]\n                send.lifecycle_event(\n                    \"writer-exit\",\n                    &format!(\"role=controller session={sid} reason=write-failed kind={:?}\", e.kind()),\n                );\n                return;\n            }\n        }\n        if let Some(seq) = seq {\n            // (a) CONTIGUOUS cursor (b4 / B2 gapless-resume — doyle's gate): with the\n            // drop-on-full handoff in `append`, the controller's live channel can SKIP\n            // a seq (dropped while Full). The frame still went to the socket (the live\n            // operator sees it), but the durable resume cursor must NOT jump past the\n…\n        }\n    }\n…\n}\n…\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n    /// the next accepted enqueue (heal-on-resume). Mirrored to the perch's\n    /// `input_backpressure` so the operator sees the drop.\n    backpressure: AtomicBool,\n    /// The owning endpoint (the spawn's label; empty = unlabeled / raw test) —\n    /// the perch whose `input_backpressure` this stamps. Empty ⇒ nowhere to record.\n    endpoint: String,\n    /// The writer thread handle (held for ownership; the thread drains until the\n    /// last `tx` clone drops at session teardown, then exits).\n    _writer: JoinHandle<()>,\n}\n\nimpl InputWriter {\n    /// Spawn a session's input-writer thread. `session` is the `Arc<PtySession>`\n    /// whose PTY write handle this thread now exclusively owns.\n    fn spawn(session: Arc<PtySession>, endpoint: String) -> Arc<InputWriter> {\n        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n        let writer = thread::spawn(move || input_writer(session, rx));\n        Arc::new(InputWriter {\n            tx,\n            backpressure: AtomicBool::new(false),\n            endpoint,\n            _writer: writer,\n        })\n    }\n\n    /// Enqueue `bytes` for the PTY write thread — NON-BLOCKING. Returns `true`\n    /// when accepted (ordered, will land), `false` when the FIFO was full and the\n    /// record was DROPPED. A full queue stamps `INPUT_BACKPRESSURE` (once, on the\n    /// rising edge); the next accepted enqueue clears it (heal). The dispatch\n    /// thread never blocks here, however stuck the harness is.\n    // [impl->REQ-HAZARD-PTY-INPUT-WRITER-WEDGE]\n    fn enqueue(&self, bytes: InputRecord) -> bool {\n        match self.tx.try_send(bytes) {\n            Ok(()) => {\n                // Heal: input is flowing again — clear a prior backpressure stamp.\n                if self.backpressure.swap(false, Ordering::AcqRel) {\n                    self.stamp_backpressure(false);\n                }\n…\n            }\n…\n        }\n    }\n…\n}","startLine":684,"lineNumbers":[684,null,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,null,1071,null,1088,null,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,null,1162,null,1245,null,1401,null,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,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,null,1475,null,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,null,1653,1654,null,1661,null,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,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,null,1813,null,1823,1824,null,1836]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784272051319}}
{"type":"message","id":"a344777a","parentId":"d47dead0","timestamp":"2026-07-17T07:07:31.363Z","message":{"role":"toolResult","toolCallId":"call_oqErfTSlEYg20ZDLtlD5NrQn|fc_0365286983a6ba82016a59d4b1db508194ac7001b54357cf84","toolName":"read","content":[{"type":"text","text":"        let net_up = net.is_some();\n        // Keep the broker handle alive past the bind so the brain supervisor's\n        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\n        // `KIND_BRAIN_RESTART` verb the broker serves must reach the supervisor.\n        let broker_handle: Option<Arc<Broker>> =\n            match Broker::bind_in_with_net(&broker_socket_name(), default_journal_path(), net) {\n                Ok(broker) => {\n                    let serve_broker = Arc::clone(&broker);\n                    thread::spawn(move || {\n                        let _ = serve_broker.serve();\n                    });\n                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n                // the BRAIN child (restoration D2-1): they are pure IPC clients,\n                // so they live with the restartable brain and respawn with it.\n                // The broker keeps only the NetHost bring-up and the boot-race\n                // self-heal that binds it; the brain polls `net-status` and\n                // starts the consumers once net reports enabled.\n                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n                    if !net_up && node_hex.is_some() {\n                        // Boot-race self-heal (REQ-DAEMON-9): net failed to bind\n                        // but identity is sound — almost always the autostart\n                        // racing the network up at boot. Retry net in the\n                        // background and attach it to the broker when it\n                        // succeeds, so the node becomes reachable WITHOUT a\n                        // manual restart; the brain notices `net-status` flip\n                        // enabled and starts the consumers then.\n                        // [impl->REQ-DAEMON-9]\n                        let broker = Arc::clone(&broker);\n                        thread::spawn(move || net_retry_attach(broker));\n                    }\n                    // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):\n                    // bring saved startup defaults back up against the broker we\n                    // just bound. Background thread — a saved endpoint that fails\n                    // to come up logs loud and never blocks daemon start, the\n                    // seed channel, or the other replays.\n                    // [impl->REQ-ENDPOINT-AUTOSTART]\n                    thread::spawn(|| {\n                        crate::autostart::replay_startup_endpoints(&broker_socket_name());\n                    });\n                    // The node-local docs server (ADR-0036 §4): broker-side so\n                    // docs are up whenever the daemon is. Loopback only; a bind\n                    // failure (port squatted) logs loud and the daemon runs on —\n                    // docs are a degradable surface, never a boot blocker.\n                    // [impl->REQ-DOCS-LOCAL-SERVER]\n                    {\n                        let port = crate::docshost::resolve_docs_port(\n                            crate::config::DaemonConfig::load().docs_port,\n                            std::env::var(crate::docshost::DOCS_PORT_ENV).ok().as_deref(),\n                        );\n                        let docs_root = spt_store::perch::spt_home().join(\"docs\");\n                        match crate::docshost::start(docs_root, port) {\n                            Ok(bound) => eprintln!(\n                                \"DOCS_SERVER_UP: {}\",\n                                crate::docshost::docs_url(bound)\n                            ),\n                            Err(e) => eprintln!(\n                                \"DOCS_SERVER_BIND_FAIL: port {port}: {e} — docs surface \\\n                                 unavailable this run (daemon continues)\"\n                            ),\n                        }\n                    }\n                    Some(broker)\n                }\n                Err(e) => {\n                    eprintln!(\"BROKER_BIND_FAIL: {e}\");\n                    None\n                }\n            };\n\n        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\n        // the digest-control channel serves `spt digest <id>` snapshot pulls +\n        // delta-stream subscribes against it. Served on a background thread like\n        // the broker. The per-session feed that *populates* the hub is driven by\n        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\n        // sessions are spawned through the broker; a bare daemon serves the\n        // channel and answers \"no live digest\" until a session is hosted.\n        let digest_hub = Arc::new(DigestHub::new());\n        {\n            let hub = Arc::clone(&digest_hub);\n            thread::spawn(move || {\n                let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);\n            });\n        }\n\n        // The drive hub (M11-W2, REQ-SHELL-3) holds the per-shell ephemeral drive\n        // slot — the owner→shell control surface. Broker-held like the digest hub\n        // (the daemon-lifetime CLI-reachable anchor; a brain restart loses\n        // nothing — the slot is ephemeral control, a restart correctly drops it).\n        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\n        // [impl->REQ-SHELL-3]\n        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\n        {\n            let hub = Arc::clone(&drive_hub);\n            thread::spawn(move || {\n                let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);\n            });\n        }\n\n        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\n        // reliable-ordered byte stream's identifier map. Broker-held like the drive\n        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\n        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\n        // the shell binary's `api tunnel` resolve their stream end through it.\n        // [impl->REQ-SHELL-4]\n        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\n        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\n        // so it serves only when the broker bound; a net-less daemon has no tunnel.\n        if let Some(broker) = &broker_handle {\n            let hub = Arc::clone(&tunnel_hub);\n            let broker = Arc::clone(broker);\n            thread::spawn(move || {\n                let _ = crate::tunnelhub::serve_tunnel_control(\n                    &crate::endpoint::tunnel_socket_name(),\n                    hub,\n                    broker,\n                );\n            });\n        }\n\n        // Shell wake-watchers (M5-D4b) — the offline half of the shell\n        // online/offline exclusivity — now run in the BRAIN child (restoration\n        // D2-2): shellwake is brain-owned logic (ADR-0018 Q5 exception), a pure\n        // disk-reconciler whose boot sweep re-reconciles the watcher children on\n        // every brain start. The broker no longer hosts it; see\n        // [`crate::brainproc::run_brain`].\n        // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n\n        // Brain process supervisor (ADR-0018 Q2/Q3 — broker/brain process\n        // restoration): the broker is the always-up per-machine anchor; it spawns\n        // `spt daemon brain` as a supervised child and respawns it on exit. D3-3\n        // makes an update a *planned* restart on this same path: the supervisor's\n…\n        // graceful-stop path below. The brain subtree (the brain + its shellwake\n        // watchers + its detached Psyches) reaps as one unit; the daemon itself is\n        // never in the container.\n        // [impl->REQ-HAZARD-DAEMON-STOP-REAP]\n        let reaper = crate::reap::BrainReaper::new();\n        // The supervisor stop flag — hoisted out of the wiring block (was held\n        // \"for symmetry, never raised\") because the graceful-stop path NOW raises\n        // it, so the supervisor does not respawn the brain we are about to reap.\n        let brain_stop = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        {\n            let (_handle, restart) = crate::brainproc::spawn_brain_supervisor(\n                Arc::clone(&brain_stop),\n                Arc::clone(&reaper),\n                // The DRAINED promotion gate (REQ-UPDATE-PROMOTE-DRAINED) reads this\n                // broker's live control-plane truth in-process; None on a bind-failed\n                // daemon degrades the gate to readiness-only.\n                broker_handle.clone(),\n            );\n            if let Some(broker) = &broker_handle {\n                broker.set_brain_restart(restart);\n            }\n        }\n\n        // Best-effort breadcrumb: record our pid for management/cleanup. Liveness\n        // is the socket ping, never this file, so a stale value is harmless.\n        let _ = std::fs::write(daemon_pid_path(), std::process::id().to_string());\n\n        // The seed-control channel is the foreground loop. Binding it is what\n        // arbitrates the single-daemon-per-home invariant: a second daemon racing\n        // to start fails this bind and exits, leaving the winner serving. It\n        // returns only on a graceful `daemon stop` (the KIND_STOP latch).\n        let serve = seedmap::serve_seed_control(&seed_socket_name(), reg);\n\n        // Graceful-stop reap (REQ-HAZARD-DAEMON-STOP-REAP / Breap): the serve loop\n        // returned because a `daemon stop` acked. Stop the supervisor FIRST (so it\n        // does not respawn the brain we are about to kill) THEN reap the brain\n        // subtree — the brain, its shellwake watchers, and its detached Psyches die\n        // with the daemon instead of orphaning as ~8 stray claude-spt-psyche.exe /\n        // spt.exe. The daemon is not in the reap container, so this never\n        // self-terminates: it returns cleanly below.\n        // [impl->REQ-HAZARD-DAEMON-STOP-REAP]"}],"details":{"displayContent":{"text":"        let net_up = net.is_some();\n        // Keep the broker handle alive past the bind so the brain supervisor's\n        // planned-restart signal can be wired into it below (ADR-0018 D3-3): the\n        // `KIND_BRAIN_RESTART` verb the broker serves must reach the supervisor.\n        let broker_handle: Option<Arc<Broker>> =\n            match Broker::bind_in_with_net(&broker_socket_name(), default_journal_path(), net) {\n                Ok(broker) => {\n                    let serve_broker = Arc::clone(&broker);\n                    thread::spawn(move || {\n                        let _ = serve_broker.serve();\n                    });\n                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n                // the BRAIN child (restoration D2-1): they are pure IPC clients,\n                // so they live with the restartable brain and respawn with it.\n                // The broker keeps only the NetHost bring-up and the boot-race\n                // self-heal that binds it; the brain polls `net-status` and\n                // starts the consumers once net reports enabled.\n                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n                    if !net_up && node_hex.is_some() {\n                        // Boot-race self-heal (REQ-DAEMON-9): net failed to bind\n                        // but identity is sound — almost always the autostart\n                        // racing the network up at boot. Retry net in the\n                        // background and attach it to the broker when it\n                        // succeeds, so the node becomes reachable WITHOUT a\n                        // manual restart; the brain notices `net-status` flip\n                        // enabled and starts the consumers then.\n                        // [impl->REQ-DAEMON-9]\n                        let broker = Arc::clone(&broker);\n                        thread::spawn(move || net_retry_attach(broker));\n                    }\n                    // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):\n                    // bring saved startup defaults back up against the broker we\n                    // just bound. Background thread — a saved endpoint that fails\n                    // to come up logs loud and never blocks daemon start, the\n                    // seed channel, or the other replays.\n                    // [impl->REQ-ENDPOINT-AUTOSTART]\n                    thread::spawn(|| {\n                        crate::autostart::replay_startup_endpoints(&broker_socket_name());\n                    });\n                    // The node-local docs server (ADR-0036 §4): broker-side so\n                    // docs are up whenever the daemon is. Loopback only; a bind\n                    // failure (port squatted) logs loud and the daemon runs on —\n                    // docs are a degradable surface, never a boot blocker.\n                    // [impl->REQ-DOCS-LOCAL-SERVER]\n                    {\n                        let port = crate::docshost::resolve_docs_port(\n                            crate::config::DaemonConfig::load().docs_port,\n                            std::env::var(crate::docshost::DOCS_PORT_ENV).ok().as_deref(),\n                        );\n                        let docs_root = spt_store::perch::spt_home().join(\"docs\");\n                        match crate::docshost::start(docs_root, port) {\n                            Ok(bound) => eprintln!(\n                                \"DOCS_SERVER_UP: {}\",\n                                crate::docshost::docs_url(bound)\n                            ),\n                            Err(e) => eprintln!(\n                                \"DOCS_SERVER_BIND_FAIL: port {port}: {e} — docs surface \\\n                                 unavailable this run (daemon continues)\"\n                            ),\n                        }\n                    }\n                    Some(broker)\n                }\n                Err(e) => {\n                    eprintln!(\"BROKER_BIND_FAIL: {e}\");\n                    None\n                }\n            };\n\n        // The digest hub (B8) holds the live per-endpoint PTY-digest projections;\n        // the digest-control channel serves `spt digest <id>` snapshot pulls +\n        // delta-stream subscribes against it. Served on a background thread like\n        // the broker. The per-session feed that *populates* the hub is driven by\n        // the brain (the parse is logic — ADR-0004 §B), wired as daemon-hosted\n        // sessions are spawned through the broker; a bare daemon serves the\n        // channel and answers \"no live digest\" until a session is hosted.\n        let digest_hub = Arc::new(DigestHub::new());\n        {\n            let hub = Arc::clone(&digest_hub);\n            thread::spawn(move || {\n                let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);\n            });\n        }\n\n        // The drive hub (M11-W2, REQ-SHELL-3) holds the per-shell ephemeral drive\n        // slot — the owner→shell control surface. Broker-held like the digest hub\n        // (the daemon-lifetime CLI-reachable anchor; a brain restart loses\n        // nothing — the slot is ephemeral control, a restart correctly drops it).\n        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\n        // [impl->REQ-SHELL-3]\n        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\n        {\n            let hub = Arc::clone(&drive_hub);\n            thread::spawn(move || {\n                let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);\n            });\n        }\n\n        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\n        // reliable-ordered byte stream's identifier map. Broker-held like the drive\n        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\n        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\n        // the shell binary's `api tunnel` resolve their stream end through it.\n        // [impl->REQ-SHELL-4]\n        let tunnel_hub = Arc::new(crate::tunnelhub::TunnelHub::new());\n        // The relay needs the broker-owned NetHost (doyle gate A: broker-homed),\n        // so it serves only when the broker bound; a net-less daemon has no tunnel.\n        if let Some(broker) = &broker_handle {\n            let hub = Arc::clone(&tunnel_hub);\n            let broker = Arc::clone(broker);\n            thread::spawn(move || {\n                let _ = crate::tunnelhub::serve_tunnel_control(\n                    &crate::endpoint::tunnel_socket_name(),\n                    hub,\n                    broker,\n                );\n            });\n        }\n\n        // Shell wake-watchers (M5-D4b) — the offline half of the shell\n        // online/offline exclusivity — now run in the BRAIN child (restoration\n        // D2-2): shellwake is brain-owned logic (ADR-0018 Q5 exception), a pure\n        // disk-reconciler whose boot sweep re-reconciles the watcher children on\n        // every brain start. The broker no longer hosts it; see\n        // [`crate::brainproc::run_brain`].\n        // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n\n        // Brain process supervisor (ADR-0018 Q2/Q3 — broker/brain process\n        // restoration): the broker is the always-up per-machine anchor; it spawns\n        // `spt daemon brain` as a supervised child and respawns it on exit. D3-3\n        // makes an update a *planned* restart on this same path: the supervisor's\n…\n        // graceful-stop path below. The brain subtree (the brain + its shellwake\n        // watchers + its detached Psyches) reaps as one unit; the daemon itself is\n        // never in the container.\n        // [impl->REQ-HAZARD-DAEMON-STOP-REAP]\n        let reaper = crate::reap::BrainReaper::new();\n        // The supervisor stop flag — hoisted out of the wiring block (was held\n        // \"for symmetry, never raised\") because the graceful-stop path NOW raises\n        // it, so the supervisor does not respawn the brain we are about to reap.\n        let brain_stop = Arc::new(std::sync::atomic::AtomicBool::new(false));\n        {\n            let (_handle, restart) = crate::brainproc::spawn_brain_supervisor(\n                Arc::clone(&brain_stop),\n                Arc::clone(&reaper),\n                // The DRAINED promotion gate (REQ-UPDATE-PROMOTE-DRAINED) reads this\n                // broker's live control-plane truth in-process; None on a bind-failed\n                // daemon degrades the gate to readiness-only.\n                broker_handle.clone(),\n            );\n            if let Some(broker) = &broker_handle {\n                broker.set_brain_restart(restart);\n            }\n        }\n\n        // Best-effort breadcrumb: record our pid for management/cleanup. Liveness\n        // is the socket ping, never this file, so a stale value is harmless.\n        let _ = std::fs::write(daemon_pid_path(), std::process::id().to_string());\n\n        // The seed-control channel is the foreground loop. Binding it is what\n        // arbitrates the single-daemon-per-home invariant: a second daemon racing\n        // to start fails this bind and exits, leaving the winner serving. It\n        // returns only on a graceful `daemon stop` (the KIND_STOP latch).\n        let serve = seedmap::serve_seed_control(&seed_socket_name(), reg);\n\n        // Graceful-stop reap (REQ-HAZARD-DAEMON-STOP-REAP / Breap): the serve loop\n        // returned because a `daemon stop` acked. Stop the supervisor FIRST (so it\n        // does not respawn the brain we are about to kill) THEN reap the brain\n        // subtree — the brain, its shellwake watchers, and its detached Psyches die\n        // with the daemon instead of orphaning as ~8 stray claude-spt-psyche.exe /\n        // spt.exe. The daemon is not in the reap container, so this never\n        // self-terminates: it returns cleanly below.\n        // [impl->REQ-HAZARD-DAEMON-STOP-REAP]","startLine":185,"lineNumbers":[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,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\daemon.rs"}}},"isError":false,"timestamp":1784272051363}}
{"type":"message","id":"9815da92","parentId":"a344777a","timestamp":"2026-07-17T07:07:31.363Z","message":{"role":"toolResult","toolCallId":"call_8mO2miL1qsvWyE2MvjZwA3U6|fc_0365286983a6ba82016a59d4b1dab8819485f345b9ce1f9bb4","toolName":"read","content":[{"type":"text","text":"/// deadline-miss or binary death: flush+release anyway (operator input is never\n/// stranded), then FAULT — terminate the binary, set `faulted`, and exit (idle\n/// inbound then SPOOLS, never raw-injected). The loop ends when `event_tx` is dropped\n/// (session teardown), reaping the child.\n///\n/// The atomic open→drain→commit→flush is the W1 coexistence mechanism: an injected\n/// sequence and the operator's live controller share one PTY without clobbering\n/// each other (REQ-HAZARD-INJECT-CONTROL-COEXIST), and the deadline FAULT path is\n/// the \"never park forever\" bound applied to injection.\n/// Bring up a translation binary at `path` for `endpoint_id`: spawn the\n/// stdin→stdout filter, send the identity `Init`, start the inject worker that\n/// owns the atomic PTY apply, and return the `Arc<Translation>`. A spawn failure\n/// FAILS CLOSED to SPOOLING (`None`, logged): `None` now MEANS the inbound spools\n/// (idle delivery is translation-binary-only, never a raw PTY inject) — a missing\n/// binary costs idle delivery, never the operator their agent. `input` is the session's EXISTING PTY input writer\n/// (reused; only the translation child is created). Extracted verbatim from\n/// `dispatch_spawn` so a live-update restart (`dispatch_adapter_apply`, W3d) can\n/// rebuild a session's translation child from the NEW binary without disturbing\n/// the PTY / output log / session (brain-parity).\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn build_translation(\n    argv: &[String],\n    endpoint_id: &str,\n    input: &Arc<InputWriter>,\n    respawns: Arc<AtomicU32>,\n    log: &Arc<Mutex<OutputLog>>,\n) -> Option<Arc<Translation>> {\n    let (cmd_tx, cmd_rx) = channel::<KeyCmd>();\n    match TranslationChild::spawn(argv, cmd_tx) {\n        Ok(child) => {\n            let child = Arc::new(child);\n            // First line: identity (content-free of any PTY bytes).\n            let _ = child.send(&ToBinary::Init {\n                endpoint_id: endpoint_id.to_string(),\n                node: spt_store::hostlabel::os_hostname().unwrap_or_default(),\n            });\n            let floor = Arc::new(Mutex::new(InjectFloor::default()));\n            let faulted = Arc::new(AtomicBool::new(false));\n            let (event_tx, event_rx) = channel::<String>();\n            let w_input = Arc::clone(input);\n            let w_child = Arc::clone(&child);\n            let w_floor = Arc::clone(&floor);\n            let w_faulted = Arc::clone(&faulted);\n            let w_respawns = Arc::clone(&respawns);\n            let w_log = Arc::clone(log);\n            let w_endpoint = endpoint_id.to_string();\n            // B6 (REQ-HAZARD-INJECT-WORKER-POISON): run the worker under a panic\n            // guard. A panic inside the worker (a residual unwrap, a poisoned lock the\n            // recovery missed, anything) must NOT silently kill the thread and orphan\n            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n            let sup_child = Arc::clone(&child);\n            let sup_faulted = Arc::clone(&faulted);\n            let sup_endpoint = endpoint_id.to_string();\n            thread::spawn(move || {\n                run_inject_worker_supervised(\n                    sup_child,\n                    sup_faulted,\n                    sup_endpoint,\n                    std::panic::AssertUnwindSafe(move || {\n                        run_inject_worker(\n                            w_input, w_child, w_floor, event_rx, cmd_rx, w_faulted, w_respawns,\n                            w_log, w_endpoint,\n                        );\n                    }),\n                );\n            });\n            Some(Arc::new(Translation {\n                floor,\n                event_tx,\n                child,\n                faulted,\n            }))\n        }\n        Err(e) => {\n            eprintln!(\n                \"TRANSLATION_SPAWN_FAILED:{argv:?}: {e} — no idle PTY delivery; inbound spools (declare/repair the binary)\"\n            );\n            None\n        }\n    }\n}\n\n/// The resident translation binary path declared by the manifest at\n/// `<install_dir>/manifest.toml` (`[message-idle-translation-binary].path`), or\n/// `None` if there is no such manifest / declaration. Read fresh from disk so a\n/// live-update restart picks up a MOVED/renamed binary (verdict flag-5: never\n/// reuse the stale cached `SpawnReq.translation_binary`). (W3d)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\n// [impl->REQ-TRANSLATE-COMMAND]\nfn read_translation_command(install_dir: &std::path::Path) -> Option<Vec<String>> {\n    let s = std::fs::read_to_string(install_dir.join(\"manifest.toml\")).ok()?;\n    let manifest = spt_runtime::Manifest::from_toml_str(&s).ok()?;\n    let decl = manifest.message_idle_translation_binary.as_ref()?;\n    // F-019 / REQ-INSTALL-11 + ADR-0029: resolve `command` (preferred) else the\n    // deprecated `path` to a spawnable argv — adapter-static keys substituted, the\n    // program token resolved against the install dir (same as the initial spawn in\n    // harnesshost) so the W3d live-update RESPAWN runs the real binary, not a\n    // verbatim path Command::new fails to find (which would spool idle inbound).\n    spt_runtime::runtime::resolve_translation_argv(\n        decl,\n        Some(install_dir),\n        Some(manifest.adapter.name.as_str()),\n    )\n}\n\n/// Run the inject worker under a panic guard (B6, REQ-HAZARD-INJECT-WORKER-POISON):\n/// `body` is the [`run_inject_worker`] call. If it PANICS, the guard FAULTs the\n…\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n    /// Idempotent by `OnceLock` — a second attach is a no-op returning `false`\n    /// (the first host wins); the hot read path (`net()`) never blocks on it.\n    // [impl->REQ-DAEMON-9]\n    pub fn attach_net(&self, host: NetHost) -> bool {\n        self.net.set(host).is_ok()\n    }\n\n    /// The broker-owned exactly-once anchor (for introspection / tests).\n    pub fn journal(&self) -> &Arc<EffectJournal> {\n        &self.journal\n    }\n\n    /// The broker-owned network host, if one is attached (at bind or via the\n    /// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.\n    pub fn net(&self) -> Option<&NetHost> {\n        self.net.get()\n    }\n\n    /// Accept connections forever, handling each on its own thread. The broker\n    /// is the long-lived process; this is its main loop. Per-connection\n    /// threading is half the KH 7.4 isolation stance: one brain's blocking\n    /// dispatch can never stall another's (the per-session half is\n    /// [`Broker::dispatch_spawn`]'s drain/waiter threads).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n        loop {\n            let conn = self.listener.accept()?;\n            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n            // throwaway connection that woke this accept — observe it and return so the\n            // serve thread (and, with it, the listener) tears down instead of leaking.\n            if self.stop.load(Ordering::Acquire) {\n                return Ok(());\n            }\n            let me = Arc::clone(self);\n            thread::spawn(move || {\n                let _ = me.handle_conn(conn);\n            });\n        }\n    }\n\n    /// Gracefully stop the [`serve`](Self::serve) accept loop: raise the latch, then\n    /// dial one throwaway connection so the blocked `accept()` wakes, observes the\n    /// latch, and returns (dropping the listener). Best-effort + idempotent — a second\n    /// call, or a call after the loop already exited, just fails the dial harmlessly.\n    /// Fills the honest gap that `serve` is otherwise unstoppable (the leaked-serve\n    /// load that starved the seed stop barrier — REQ-HAZARD-DAEMON-STOP-BARRIER).\n    // [impl->REQ-HAZARD-DAEMON-STOP-BARRIER]\n    pub fn stop(&self) {\n        self.stop.store(true, Ordering::Release);\n        let _ = LocalSocketTransport::connect(&self.name);\n    }\n\n    /// Accept exactly one connection and handle it on a spawned thread, returning\n    /// that thread's handle. The single-brain entry point the tests exercise.\n    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n        let conn = self.listener.accept()?;\n        let me = Arc::clone(self);\n        Ok(thread::spawn(move || {\n            let _ = me.handle_conn(conn);\n        }))\n    }\n\n    /// Number of currently hosted sessions (for tests / introspection).\n    pub fn session_count(&self) -> usize {\n        recover(&self.sessions).len()\n    }\n\n    /// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling\n    /// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-\n    /// wedged LOCAL controller (`by: None`) on hosted session `id` — a sink\n    /// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and\n    /// whose writer thread only drains its channel (it NEVER calls\n    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical\n    /// bound cannot clear the injected wedge). Lets an integration rig\n    /// exercise the REQ-UPDATE-PROMOTE-DRAINED gate DECISION in isolation —\n…\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n                KIND_STALL_EVICTS => self.dispatch_stall_evicts(&send),\n                KIND_NET_DIAL => {\n…\n                }\n…\n                KIND_SESSIONS => {\n…\n                    let reply = SessionsReply {\n                        sessions: snaps\n…\n                            .map(|s| SessionInfo {\n…\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n…\n    }\n…\n    fn dispatch_net_stream_subscribe(\n…\n    ) -> Result<u64, String> {\n…\n        host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)\n            .map_err(|e| e.to_string())?;\n        Ok(req.stream_id)\n    }\n\n    /// Attach a brain to the conn-liveness event log from a cursor (D4c) — the\n    /// PresenceChannel broker seam: gapless resume over connection presence,\n    /// same discipline as a stream subscribe.\n    // [impl->REQ-EP-4]\n    fn dispatch_net_presence_subscribe(\n        &self,\n        env: Envelope,\n        send: &SharedSend,\n    ) -> Result<(), String> {\n        let req: NetPresenceSubscribeReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-presence-subscribe payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        host.subscribe_presence(Arc::clone(send), req.from_seq);\n        Ok(())\n    }\n\n    /// Terminate a session's child. The exit waiter emits the `exit` frame and\n    /// reaps the session once the child is dead.\n    fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {\n        let req: KillReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;\n        let sessions = recover(&self.sessions);\n        let h = sessions\n            .get(&req.session_id)\n            .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n        h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))\n    }\n\n    /// W3d (ADR-0025): apply a live adapter update to every session running\n    /// `req.adapter`. LOCK DISCIPLINE (binding): the sessions `Mutex` is never held\n    /// across the bounded `terminate()` or the CRC swap — only across the\n    /// snapshot, the per-session `input` fetch, and the re-insert.\n    ///\n    /// 1. snapshot the affected `(id, endpoint, old translation)` under the lock,\n    ///    then RELEASE it;\n    /// 2. stop each resident translation child (`terminate()`, bounded 500ms) —\n    ///    frees the OS file lock on the install-dir binary;"}],"details":{"displayContent":{"text":"/// deadline-miss or binary death: flush+release anyway (operator input is never\n/// stranded), then FAULT — terminate the binary, set `faulted`, and exit (idle\n/// inbound then SPOOLS, never raw-injected). The loop ends when `event_tx` is dropped\n/// (session teardown), reaping the child.\n///\n/// The atomic open→drain→commit→flush is the W1 coexistence mechanism: an injected\n/// sequence and the operator's live controller share one PTY without clobbering\n/// each other (REQ-HAZARD-INJECT-CONTROL-COEXIST), and the deadline FAULT path is\n/// the \"never park forever\" bound applied to injection.\n/// Bring up a translation binary at `path` for `endpoint_id`: spawn the\n/// stdin→stdout filter, send the identity `Init`, start the inject worker that\n/// owns the atomic PTY apply, and return the `Arc<Translation>`. A spawn failure\n/// FAILS CLOSED to SPOOLING (`None`, logged): `None` now MEANS the inbound spools\n/// (idle delivery is translation-binary-only, never a raw PTY inject) — a missing\n/// binary costs idle delivery, never the operator their agent. `input` is the session's EXISTING PTY input writer\n/// (reused; only the translation child is created). Extracted verbatim from\n/// `dispatch_spawn` so a live-update restart (`dispatch_adapter_apply`, W3d) can\n/// rebuild a session's translation child from the NEW binary without disturbing\n/// the PTY / output log / session (brain-parity).\n// [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn build_translation(\n    argv: &[String],\n    endpoint_id: &str,\n    input: &Arc<InputWriter>,\n    respawns: Arc<AtomicU32>,\n    log: &Arc<Mutex<OutputLog>>,\n) -> Option<Arc<Translation>> {\n    let (cmd_tx, cmd_rx) = channel::<KeyCmd>();\n    match TranslationChild::spawn(argv, cmd_tx) {\n        Ok(child) => {\n            let child = Arc::new(child);\n            // First line: identity (content-free of any PTY bytes).\n            let _ = child.send(&ToBinary::Init {\n                endpoint_id: endpoint_id.to_string(),\n                node: spt_store::hostlabel::os_hostname().unwrap_or_default(),\n            });\n            let floor = Arc::new(Mutex::new(InjectFloor::default()));\n            let faulted = Arc::new(AtomicBool::new(false));\n            let (event_tx, event_rx) = channel::<String>();\n            let w_input = Arc::clone(input);\n            let w_child = Arc::clone(&child);\n            let w_floor = Arc::clone(&floor);\n            let w_faulted = Arc::clone(&faulted);\n            let w_respawns = Arc::clone(&respawns);\n            let w_log = Arc::clone(log);\n            let w_endpoint = endpoint_id.to_string();\n            // B6 (REQ-HAZARD-INJECT-WORKER-POISON): run the worker under a panic\n            // guard. A panic inside the worker (a residual unwrap, a poisoned lock the\n            // recovery missed, anything) must NOT silently kill the thread and orphan\n            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n            let sup_child = Arc::clone(&child);\n            let sup_faulted = Arc::clone(&faulted);\n            let sup_endpoint = endpoint_id.to_string();\n            thread::spawn(move || {\n                run_inject_worker_supervised(\n                    sup_child,\n                    sup_faulted,\n                    sup_endpoint,\n                    std::panic::AssertUnwindSafe(move || {\n                        run_inject_worker(\n                            w_input, w_child, w_floor, event_rx, cmd_rx, w_faulted, w_respawns,\n                            w_log, w_endpoint,\n                        );\n                    }),\n                );\n            });\n            Some(Arc::new(Translation {\n                floor,\n                event_tx,\n                child,\n                faulted,\n            }))\n        }\n        Err(e) => {\n            eprintln!(\n                \"TRANSLATION_SPAWN_FAILED:{argv:?}: {e} — no idle PTY delivery; inbound spools (declare/repair the binary)\"\n            );\n            None\n        }\n    }\n}\n\n/// The resident translation binary path declared by the manifest at\n/// `<install_dir>/manifest.toml` (`[message-idle-translation-binary].path`), or\n/// `None` if there is no such manifest / declaration. Read fresh from disk so a\n/// live-update restart picks up a MOVED/renamed binary (verdict flag-5: never\n/// reuse the stale cached `SpawnReq.translation_binary`). (W3d)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\n// [impl->REQ-TRANSLATE-COMMAND]\nfn read_translation_command(install_dir: &std::path::Path) -> Option<Vec<String>> {\n    let s = std::fs::read_to_string(install_dir.join(\"manifest.toml\")).ok()?;\n    let manifest = spt_runtime::Manifest::from_toml_str(&s).ok()?;\n    let decl = manifest.message_idle_translation_binary.as_ref()?;\n    // F-019 / REQ-INSTALL-11 + ADR-0029: resolve `command` (preferred) else the\n    // deprecated `path` to a spawnable argv — adapter-static keys substituted, the\n    // program token resolved against the install dir (same as the initial spawn in\n    // harnesshost) so the W3d live-update RESPAWN runs the real binary, not a\n    // verbatim path Command::new fails to find (which would spool idle inbound).\n    spt_runtime::runtime::resolve_translation_argv(\n        decl,\n        Some(install_dir),\n        Some(manifest.adapter.name.as_str()),\n    )\n}\n\n/// Run the inject worker under a panic guard (B6, REQ-HAZARD-INJECT-WORKER-POISON):\n/// `body` is the [`run_inject_worker`] call. If it PANICS, the guard FAULTs the\n…\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n    /// Idempotent by `OnceLock` — a second attach is a no-op returning `false`\n    /// (the first host wins); the hot read path (`net()`) never blocks on it.\n    // [impl->REQ-DAEMON-9]\n    pub fn attach_net(&self, host: NetHost) -> bool {\n        self.net.set(host).is_ok()\n    }\n\n    /// The broker-owned exactly-once anchor (for introspection / tests).\n    pub fn journal(&self) -> &Arc<EffectJournal> {\n        &self.journal\n    }\n\n    /// The broker-owned network host, if one is attached (at bind or via the\n    /// REQ-DAEMON-9 self-heal `attach_net`). Lock-free.\n    pub fn net(&self) -> Option<&NetHost> {\n        self.net.get()\n    }\n\n    /// Accept connections forever, handling each on its own thread. The broker\n    /// is the long-lived process; this is its main loop. Per-connection\n    /// threading is half the KH 7.4 isolation stance: one brain's blocking\n    /// dispatch can never stall another's (the per-session half is\n    /// [`Broker::dispatch_spawn`]'s drain/waiter threads).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    pub fn serve(self: &Arc<Self>) -> io::Result<()> {\n        loop {\n            let conn = self.listener.accept()?;\n            // C1 graceful stop: [`Broker::stop`] raises the latch then dials the\n            // throwaway connection that woke this accept — observe it and return so the\n            // serve thread (and, with it, the listener) tears down instead of leaking.\n            if self.stop.load(Ordering::Acquire) {\n                return Ok(());\n            }\n            let me = Arc::clone(self);\n            thread::spawn(move || {\n                let _ = me.handle_conn(conn);\n            });\n        }\n    }\n\n    /// Gracefully stop the [`serve`](Self::serve) accept loop: raise the latch, then\n    /// dial one throwaway connection so the blocked `accept()` wakes, observes the\n    /// latch, and returns (dropping the listener). Best-effort + idempotent — a second\n    /// call, or a call after the loop already exited, just fails the dial harmlessly.\n    /// Fills the honest gap that `serve` is otherwise unstoppable (the leaked-serve\n    /// load that starved the seed stop barrier — REQ-HAZARD-DAEMON-STOP-BARRIER).\n    // [impl->REQ-HAZARD-DAEMON-STOP-BARRIER]\n    pub fn stop(&self) {\n        self.stop.store(true, Ordering::Release);\n        let _ = LocalSocketTransport::connect(&self.name);\n    }\n\n    /// Accept exactly one connection and handle it on a spawned thread, returning\n    /// that thread's handle. The single-brain entry point the tests exercise.\n    pub fn serve_once(self: &Arc<Self>) -> io::Result<JoinHandle<()>> {\n        let conn = self.listener.accept()?;\n        let me = Arc::clone(self);\n        Ok(thread::spawn(move || {\n            let _ = me.handle_conn(conn);\n        }))\n    }\n\n    /// Number of currently hosted sessions (for tests / introspection).\n    pub fn session_count(&self) -> usize {\n        recover(&self.sessions).len()\n    }\n\n    /// TEST-SUPPORT seam (round-4 false_promote rig, doyle Option C ruling\n    /// `docs/UPDATE-WEDGE-R4-FALSE-PROMOTE-RULING.md`): install a STATICALLY-\n    /// wedged LOCAL controller (`by: None`) on hosted session `id` — a sink\n    /// whose `write_blocked_since` is seeded `blocked_ms_ago` in the past and\n    /// whose writer thread only drains its channel (it NEVER calls\n    /// [`BrokerConn::write`], so no watchdog is armed and the round-4 physical\n    /// bound cannot clear the injected wedge). Lets an integration rig\n    /// exercise the REQ-UPDATE-PROMOTE-DRAINED gate DECISION in isolation —\n…\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n        impl Drop for HandlerTally<'_> {\n            fn drop(&mut self) {\n                self.0.fetch_sub(1, Ordering::AcqRel);\n            }\n        }\n        self.conn_handlers.fetch_add(1, Ordering::AcqRel);\n        let _tally = HandlerTally(&self.conn_handlers);\n\n        let (mut recv, send) = conn.split();\n        // Round-4: the send half is owned by the bounded/cancelable conn\n        // primitive from birth — every write on this physical connection is\n        // deadline-bounded, and a wedge poisons + retires the conn.\n        // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n        let send: SharedSend = Arc::new(BrokerConn::new(send, brain_write_deadline()));\n        // Base attribution fact (F-039 leg b): broker clients are brains; role\n        // facts (controller/viewer/presence/stream subscriber) accrete at the\n        // attach sites. [impl->REQ-CONN-POISON-ATTRIBUTION]\n        send.describe(\"role=brain\");\n\n        // Version handshake: this connection must be a brain (2.3).\n        recv_hello(&mut recv, Role::Brain)?;\n\n        let mut my_subs: Vec<u64> = Vec::new();\n        let mut my_stream_subs: Vec<u64> = Vec::new();\n        let mut my_presence_sub = false;\n\n        loop {\n            let env = match read_frame(&mut recv) {\n                Ok(e) => e,\n                // Any read failure (EOF included) ends the connection.\n                Err(_) => break,\n            };\n            match env.kind.as_str() {\n                KIND_SPAWN => match self.dispatch_spawn(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_SUBSCRIBE => match self.dispatch_subscribe(env, &send) {\n                    Ok(id) => my_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_UNSUBSCRIBE => {\n                    if let Err(msg) = self.dispatch_unsubscribe(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_INPUT => {\n                    if let Err(msg) = self.dispatch_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_RESIZE => {\n                    if let Err(msg) = self.dispatch_resize(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_KILL => {\n                    if let Err(msg) = self.dispatch_kill(env) {\n                        send_error(&send, &msg);\n                    }\n                }\n                // [impl->REQ-ADAPTER-LIVE-UPDATE]\n                KIND_ADAPTER_APPLY => {\n                    if let Err(msg) = self.dispatch_adapter_apply(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STATUS => self.dispatch_net_status(&send),\n                // [impl->REQ-UPDATE-RUNNING-IMAGE-SURFACE]\n                KIND_BROKER_IMAGE => self.dispatch_broker_image(&send),\n                KIND_STALL_EVICTS => self.dispatch_stall_evicts(&send),\n                KIND_NET_DIAL => {\n…\n                }\n…\n                KIND_SESSIONS => {\n…\n                    let reply = SessionsReply {\n                        sessions: snaps\n…\n                            .map(|s| SessionInfo {\n…\n                                controller_by: s.controller_by,\n                            })\n                            .collect(),\n                    };\n                    let frame = Envelope::new(\n                        KIND_SESSIONS_REPLY,\n                        serde_json::to_value(reply).expect(\"SessionsReply serializes\"),\n                    );\n                    send_frame(&send, &frame);\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n    /// 7.4): a hung child blocks only its own threads — shell instances ride\n    /// exactly this isolation (one owner's hung shell binary stalls neither\n    /// another owner's delivery nor the broker's control dispatch).\n    // [impl->REQ-HAZARD-DAEMON-SCHED-NONBLOCKING]\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n        let req: SpawnReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad spawn payload: {e}\"))?;\n        // Single-flight WAKE (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP): the broker is the\n        // sole spawner post-W3, so its own spawn choke is the single-flight authority.\n        // Dedup a duplicate wake/resume for an endpoint that already has a live session\n        // OR a spawn in flight — closing the check-then-spawn TOCTOU that let one wake\n        // spawn two identical launch trees (perri's flynn dup: duplicate perch writers\n…\n    }\n…\n    fn dispatch_net_stream_subscribe(\n…\n    ) -> Result<u64, String> {\n…\n        host.subscribe_stream(req.stream_id, Arc::clone(send), req.from_seq)\n            .map_err(|e| e.to_string())?;\n        Ok(req.stream_id)\n    }\n\n    /// Attach a brain to the conn-liveness event log from a cursor (D4c) — the\n    /// PresenceChannel broker seam: gapless resume over connection presence,\n    /// same discipline as a stream subscribe.\n    // [impl->REQ-EP-4]\n    fn dispatch_net_presence_subscribe(\n        &self,\n        env: Envelope,\n        send: &SharedSend,\n    ) -> Result<(), String> {\n        let req: NetPresenceSubscribeReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-presence-subscribe payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        host.subscribe_presence(Arc::clone(send), req.from_seq);\n        Ok(())\n    }\n\n    /// Terminate a session's child. The exit waiter emits the `exit` frame and\n    /// reaps the session once the child is dead.\n    fn dispatch_kill(&self, env: Envelope) -> Result<(), String> {\n        let req: KillReq =\n            serde_json::from_value(env.payload).map_err(|e| format!(\"bad kill payload: {e}\"))?;\n        let sessions = recover(&self.sessions);\n        let h = sessions\n            .get(&req.session_id)\n            .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n        h.session.kill().map_err(|e| format!(\"kill failed: {e}\"))\n    }\n\n    /// W3d (ADR-0025): apply a live adapter update to every session running\n    /// `req.adapter`. LOCK DISCIPLINE (binding): the sessions `Mutex` is never held\n    /// across the bounded `terminate()` or the CRC swap — only across the\n    /// snapshot, the per-session `input` fetch, and the re-insert.\n    ///\n    /// 1. snapshot the affected `(id, endpoint, old translation)` under the lock,\n    ///    then RELEASE it;\n    /// 2. stop each resident translation child (`terminate()`, bounded 500ms) —\n    ///    frees the OS file lock on the install-dir binary;","startLine":1935,"lineNumbers":[1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,null,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,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,null,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,null,3104,null,3165,null,3223,3224,null,3226,null,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,null,3512,null,4426,null,4430,null,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784272051363}}
{"type":"message","id":"ba689735","parentId":"9815da92","timestamp":"2026-07-17T07:07:31.369Z","message":{"role":"toolResult","toolCallId":"call_AiEBZHCPrOqQEe02arCMrH1f|fc_0365286983a6ba82016a59d4b1db4881948ae046546b2465a4","toolName":"read","content":[{"type":"text","text":"impl DsrMatcher {\n…\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\n…\n    }\n}\n\n/// A running drain pump over a surface's output. Holds live counters and a\n/// cooperative stop flag; see the module docs for the teardown contract.\npub struct Drain {\n    stop: Arc<AtomicBool>,\n    dsr_answered: Arc<AtomicU64>,\n    bytes: Arc<AtomicU64>,\n    handle: Option<thread::JoinHandle<()>>,\n}\n\nimpl Drain {\n    /// Total DSR queries answered so far (live).\n    pub fn dsr_answered(&self) -> u64 {\n        self.dsr_answered.load(Ordering::Relaxed)\n    }\n\n    /// Total bytes forwarded to the sink so far (live).\n    pub fn bytes_forwarded(&self) -> u64 {\n        self.bytes.load(Ordering::Relaxed)\n    }\n\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\n    /// **not** interrupt a read already blocked (that requires tearing the child\n    /// down — the no-EOF-while-writer-held discipline).\n    pub fn request_stop(&self) {\n        self.stop.store(true, Ordering::Relaxed);\n    }\n\n    /// Join the pump thread. Only returns once the underlying `read()` has\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\n    /// on ConPTY that means the child must be torn down first. Best-effort.\n    pub fn join(mut self) {\n        if let Some(h) = self.handle.take() {\n            let _ = h.join();\n        }\n    }\n}\n\nimpl Drain {\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\n    /// bounded channel applies backpressure).\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\n    where\n        R: Read + Send + 'static,\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let stop = Arc::new(AtomicBool::new(false));\n        let dsr_answered = Arc::new(AtomicU64::new(0));\n        let bytes = Arc::new(AtomicU64::new(0));\n\n        let t_stop = Arc::clone(&stop);\n        let t_dsr = Arc::clone(&dsr_answered);\n        let t_bytes = Arc::clone(&bytes);\n\n        let handle = thread::spawn(move || {\n            let mut reader = reader;\n            let mut matcher = DsrMatcher::default();\n            let mut buf = [0u8; 8192];\n            loop {\n                if t_stop.load(Ordering::Relaxed) {\n                    break;\n                }\n                match reader.read(&mut buf) {\n                    Ok(0) => break, // EOF — child gone and handles released\n                    Ok(n) => {\n                        let chunk = &buf[..n];\n                        let hits = matcher.scan(chunk);\n                        if hits > 0 {\n                            // Answer through the shared, serialized writer so the\n                            // CPR never interleaves with caller-injected input.\n                            if let Ok(mut w) = writer.lock() {\n                                for _ in 0..hits {\n                                    let _ = w.write_all(DSR_REPLY);\n                                }\n                                let _ = w.flush();\n                            }\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\n                        }\n                        sink(chunk);\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\n                    }\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\n                    Err(_) => break,\n                }\n            }\n        });\n\n        Drain {\n            stop,\n            dsr_answered,\n            bytes,\n            handle: Some(handle),\n        }\n    }\n}\n\nimpl PtySession {\n    /// Start draining this surface's output on a background thread, answering\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\n    ///\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\n    //\n    // [impl->REQ-HAZARD-CONPTY-DSR]\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\n    where\n        S: FnMut(&[u8]) + Send + 'static,\n    {\n        let reader = self.take_reader()?;\n        let writer = self.shared_writer();\n        Ok(Drain::spawn(reader, writer, sink))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::sync::Mutex;\n    use std::time::Duration;\n\n    // [unit->REQ-HAZARD-CONPTY-DSR]\n    #[test]\n    fn dsr_matcher_finds_query_across_chunk_boundary() {\n…\n    }\n…\n}\n\n[Showing lines 63-188 of 287. Use :189 to continue]"}],"details":{"truncation":{"content":"    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\r\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\r\n    ///\r\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\r\n    //\r\n    // [impl->REQ-HAZARD-CONPTY-DSR]\r\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\r\n    where\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let reader = self.take_reader()?;\r\n        let writer = self.shared_writer();\r\n        Ok(Drain::spawn(reader, writer, sink))\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use std::sync::Mutex;\r\n    use std::time::Duration;\r\n\r\n    // [unit->REQ-HAZARD-CONPTY-DSR]\r\n    #[test]\r\n    fn dsr_matcher_finds_query_across_chunk_boundary() {\r","truncated":true,"truncatedBy":"lines","totalLines":225,"totalBytes":4530,"outputLines":126,"outputBytes":4530,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl DsrMatcher {\n…\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\n…\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r\n    handle: Option<thread::JoinHandle<()>>,\r\n}\r\n\r\nimpl Drain {\r\n    /// Total DSR queries answered so far (live).\r\n    pub fn dsr_answered(&self) -> u64 {\r\n        self.dsr_answered.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Total bytes forwarded to the sink so far (live).\r\n    pub fn bytes_forwarded(&self) -> u64 {\r\n        self.bytes.load(Ordering::Relaxed)\r\n    }\r\n\r\n    /// Ask the pump to stop. Observed the next time a `read()` returns; it does\r\n    /// **not** interrupt a read already blocked (that requires tearing the child\r\n    /// down — the no-EOF-while-writer-held discipline).\r\n    pub fn request_stop(&self) {\r\n        self.stop.store(true, Ordering::Relaxed);\r\n    }\r\n\r\n    /// Join the pump thread. Only returns once the underlying `read()` has\r\n    /// unblocked (EOF / error / a returned read that observes the stop flag) —\r\n    /// on ConPTY that means the child must be torn down first. Best-effort.\r\n    pub fn join(mut self) {\r\n        if let Some(h) = self.handle.take() {\r\n            let _ = h.join();\r\n        }\r\n    }\r\n}\r\n\r\nimpl Drain {\r\n    /// Spawn the drain thread over `reader`, answering DSR via `writer` and\r\n    /// forwarding every byte to `sink`. The `sink` may block (that is how A4's\r\n    /// bounded channel applies backpressure).\r\n    fn spawn<R, S>(reader: R, writer: SharedWriter, mut sink: S) -> Self\r\n    where\r\n        R: Read + Send + 'static,\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let stop = Arc::new(AtomicBool::new(false));\r\n        let dsr_answered = Arc::new(AtomicU64::new(0));\r\n        let bytes = Arc::new(AtomicU64::new(0));\r\n\r\n        let t_stop = Arc::clone(&stop);\r\n        let t_dsr = Arc::clone(&dsr_answered);\r\n        let t_bytes = Arc::clone(&bytes);\r\n\r\n        let handle = thread::spawn(move || {\r\n            let mut reader = reader;\r\n            let mut matcher = DsrMatcher::default();\r\n            let mut buf = [0u8; 8192];\r\n            loop {\r\n                if t_stop.load(Ordering::Relaxed) {\r\n                    break;\r\n                }\r\n                match reader.read(&mut buf) {\r\n                    Ok(0) => break, // EOF — child gone and handles released\r\n                    Ok(n) => {\r\n                        let chunk = &buf[..n];\r\n                        let hits = matcher.scan(chunk);\r\n                        if hits > 0 {\r\n                            // Answer through the shared, serialized writer so the\r\n                            // CPR never interleaves with caller-injected input.\r\n                            if let Ok(mut w) = writer.lock() {\r\n                                for _ in 0..hits {\r\n                                    let _ = w.write_all(DSR_REPLY);\r\n                                }\r\n                                let _ = w.flush();\r\n                            }\r\n                            t_dsr.fetch_add(hits, Ordering::Relaxed);\r\n                        }\r\n                        sink(chunk);\r\n                        t_bytes.fetch_add(n as u64, Ordering::Relaxed);\r\n                    }\r\n                    Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,\r\n                    Err(_) => break,\r\n                }\r\n            }\r\n        });\r\n\r\n        Drain {\r\n            stop,\r\n            dsr_answered,\r\n            bytes,\r\n            handle: Some(handle),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PtySession {\r\n    /// Start draining this surface's output on a background thread, answering\r\n    /// ConPTY's DSR query and forwarding every byte to `sink`. Takes the master\r\n    /// reader (once — a second call returns [`SurfaceError::ReaderTaken`]).\r\n    ///\r\n    /// This is the substrate the A4 bounded byte-stream and the A5 digest ride.\r\n    //\r\n    // [impl->REQ-HAZARD-CONPTY-DSR]\r\n    pub fn drain<S>(&self, sink: S) -> Result<Drain, SurfaceError>\r\n    where\r\n        S: FnMut(&[u8]) + Send + 'static,\r\n    {\r\n        let reader = self.take_reader()?;\r\n        let writer = self.shared_writer();\r\n        Ok(Drain::spawn(reader, writer, sink))\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use std::sync::Mutex;\r\n    use std::time::Duration;\r\n\r\n    // [unit->REQ-HAZARD-CONPTY-DSR]\r\n    #[test]\r\n    fn dsr_matcher_finds_query_across_chunk_boundary() {\r\n…\n    }\n…\n}","startLine":46,"lineNumbers":[46,null,48,null,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,null,199,null,286]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\reader.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":287,"totalBytes":4530,"outputLines":126,"outputBytes":4530,"shownRange":{"start":63,"end":188},"nextOffset":189}}},"isError":false,"timestamp":1784272051369}}
{"type":"custom_message","customType":"irc:incoming","content":"<irc>\nIncoming IRC message from agent `RedispatchCpuRca`:\n\nHow can one long-lived conn 137 subscribe every Registry wave? `worker()` creates a fresh Brain per stream, then handler EOF cleanup detaches `my_stream_subs` when worker Brain drops. Is conn=137 perhaps a stale-generation process connection that never EOFs? Need exact retention path distinguishing temporary 15s writer vs permanent seat.\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: \"RedispatchCpuRca\"`) — you may finish your current step first. Nobody replies on your behalf.\n</irc>","display":true,"details":{"id":"153307078adc5f4d","from":"RedispatchCpuRca","message":"How can one long-lived conn 137 subscribe every Registry wave? `worker()` creates a fresh Brain per stream, then handler EOF cleanup detaches `my_stream_subs` when worker Brain drops. Is conn=137 perhaps a stale-generation process connection that never EOFs? Need exact retention path distinguishing temporary 15s writer vs permanent seat."},"attribution":"agent","id":"c12a368b","parentId":"ba689735","timestamp":"2026-07-17T07:07:31.401Z"}
{"type":"message","id":"04010c5b","parentId":"c12a368b","timestamp":"2026-07-17T07:07:41.323Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Examining dispatcher and Brain connections**"},{"type":"toolCall","id":"call_V8xH2aCc2E1iVZLCju4ASMia|fc_0365286983a6ba82016a59d4bc004c8194835a9fab04e6a243","name":"read","arguments":{"i":"Tracing dispatcher brain connection","path":"crates/spt-daemon/src/dispatch.rs","selector":"469-545,729-850,968-1053"}},{"type":"toolCall","id":"call_yjGfkYBIVH4HHP0Rb3KqmEwV|fc_0365286983a6ba82016a59d4bc00608194806bd87f14ae3cf8","name":"read","arguments":{"i":"Tracing dispatcher subscription APIs","path":"crates/spt-daemon/src/brain.rs","selector":"280-365,1430-1480"}},{"type":"toolCall","id":"call_GDoNpKGJB9y3lK9tjuAM6yu8|fc_0365286983a6ba82016a59d4bc0070819489806939573f8e5b","name":"grep","arguments":{"i":"Finding dispatcher connection creation","pattern":"worker\\(|connect\\(broker_name\\)|Brain::cold_start|Brain::resume|let mut brain|&mut Brain","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":24293,"output":240,"cacheRead":69120,"cacheWrite":0,"totalTokens":93653,"reasoningTokens":57,"cost":{"input":0.121465,"output":0.0072,"cacheRead":0.03456,"cacheWrite":0,"total":0.163225}},"stopReason":"toolUse","timestamp":1784272051422,"responseId":"resp_0365286983a6ba82016a59d4b3da30819483e918988021f5a7","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d4b670488194997674d56d0862e8","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdS88iK94IynZqWOZX0gRpX9trYzYF6DQm5eR3yqRqqbmRXq2Llh3Ar4GOijcoGcWw7D-WbuKYgB5sGcgAC-QuEI-eRhcTMdXBM38CdIFeebCz8fPPJ08UlimXQUn2mjLnWvkCixiGmoM5bv0jnI9z_zK-Jjpdb0Gv-9jjktUIi8eNQO5Ss9LUkaYOie3VZcUKJYiv2cKt7aDI_6AxmufCPZeBrsEHI_w8IPiYomnQnkzStPsL0UYI8GALeLv9nbhIszdr_6Am4L8bJztooPSWFtS2kRI3jFtoZ4dx7GtqrOkPu-KZaVh5tJEAxg2VbKBC-U-6_AiKI16YrNspnRE1EqtsHqaju5_9DoYVb4ghaZsG03LHtm_YIS9y2h0p9oUrW0G45y1XVB9om4uH6ko_8QuQrSVhawNeu4EgCop0_Qpy33nYIm344NYcouzpHZ0Nn8l_l7tPMjeIJrbXnQZm1ZXp5XmqyomDI3RcO1f7T21wfACwxISb4g7yAW8Usf-viTLwEmHHPJJ8xth7Meto2JCNEgbxUMmitsyf-OSHuXAwIV9bIsslPVIa7iZGcEl2zsgCLBiq79fqnKqJm048t0sSgKD8dmbjBPfketr-fI1gpqR6t_f_NYs_AobfiSzuGOMI3AuGkyyG09l-HUAOTZW-59xjrFQi7cS0Gak7t-O5I_ZgiLcm48mlOS61dTY9Aiul75RlykvgCayO2IyRMOa_UH9wtI2JWr3Nnet7raOn1Lu6j4qJzasFDMrTfNf5vKs9eAjBg4d1TeelDDKLK4HFJb8MikdP7wrwpI9tdp5DgRY5rHKmf5Rc7YOUWqgH2WaqBHZFZvsvZ4Afbxr7w91ah1Oi6qV1tY1jhpVNxc2YSsafirtP2ulj0VgT_ZiyP2Lat5k3HNEdE0E6zEYq57rVkUr7A3j2_b9qh128Bf5uNnzNegDAoSb6YQcS6qPcKgPux_0wT5d7m5naFmCl-UcPpqJKVa5oYwcuM0NchLXq9AFzmBJQUhSbChIexrx030SNyr4GCGQbCnIvZ-4n8lSklEVKIgUMWwwqebkLl5Ucj6WQptrw8RvmqEI9uaxVUid-feCu3YtI3b32ToQ_06RpIOjot_NfS4d4p7DTITl_8Ud8k4cWS_mvIsUwjDMsvuptOhW2OFQdGmROOJpiQ6cRyi17tGYnOF6L69ndVoZ1gG317EkwYrqEK4YIDpQ2Uiz3BMVBG-wUh-KlVSpdi0KlzNl9vPCEDCX5RjBcDe8VLzrbEvs05411jF0nCBB45zv_14S5y1iMTdESJrLa5Xzw==","summary":[{"type":"summary_text","text":"**Examining dispatcher and Brain connections**"}]},{"id":"fc_0365286983a6ba82016a59d4bc004c8194835a9fab04e6a243","type":"function_call","status":"completed","arguments":"{\"i\":\"Tracing dispatcher brain connection\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"469-545,729-850,968-1053\"}","call_id":"call_V8xH2aCc2E1iVZLCju4ASMia","name":"read"},{"id":"fc_0365286983a6ba82016a59d4bc00608194806bd87f14ae3cf8","type":"function_call","status":"completed","arguments":"{\"i\":\"Tracing dispatcher subscription APIs\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":\"280-365,1430-1480\"}","call_id":"call_yjGfkYBIVH4HHP0Rb3KqmEwV","name":"read"},{"id":"fc_0365286983a6ba82016a59d4bc0070819489806939573f8e5b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding dispatcher connection creation\",\"pattern\":\"worker\\\\(|connect\\\\(broker_name\\\\)|Brain::cold_start|Brain::resume|let mut brain|&mut Brain\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_GDoNpKGJB9y3lK9tjuAM6yu8","name":"grep"}]},"duration":9899.058800011873,"ttft":3044.190700009465,"contextSnapshot":{"promptTokens":93413,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_V8xH2aCc2E1iVZLCju4ASMia|fc_0365286983a6ba82016a59d4bc004c8194835a9fab04e6a243","toolName":"read","startedAt":"2026-07-17T07:07:41.323Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Tracing dispatcher brain connection"},"id":"c04d7596","parentId":"04010c5b","timestamp":"2026-07-17T07:07:41.323Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_yjGfkYBIVH4HHP0Rb3KqmEwV|fc_0365286983a6ba82016a59d4bc00608194806bd87f14ae3cf8","toolName":"read","startedAt":"2026-07-17T07:07:41.323Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Tracing dispatcher subscription APIs"},"id":"74617328","parentId":"c04d7596","timestamp":"2026-07-17T07:07:41.323Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GDoNpKGJB9y3lK9tjuAM6yu8|fc_0365286983a6ba82016a59d4bc0070819489806939573f8e5b","toolName":"grep","startedAt":"2026-07-17T07:07:41.323Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Finding dispatcher connection creation"},"id":"963af3f7","parentId":"74617328","timestamp":"2026-07-17T07:07:41.323Z"}
{"type":"message","id":"23227eed","parentId":"963af3f7","timestamp":"2026-07-17T07:07:41.325Z","message":{"role":"toolResult","toolCallId":"call_GDoNpKGJB9y3lK9tjuAM6yu8|fc_0365286983a6ba82016a59d4bc0070819489806939573f8e5b","toolName":"grep","content":[{"type":"text","text":" 435|) -> io::Result<()> {\n*436|    let mut brain = connect(broker_name)?;\n 437|    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\n 438|    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\n 439|    // abandoned a stream on the first transient failure.\n...\n 499|                let started = Instant::now();\n*500|                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n 501|                pool.fetch_sub(1, Ordering::Relaxed);\n 502|                let outcome = report.outcome;\n 503|                let elapsed_ms = started.elapsed().as_millis();\n...\n 598|    for _ in 0..300 {\n*599|        match Brain::cold_start(broker_name, now_ms()) {\n 600|            Ok(b) => return Ok(b),\n 601|            Err(e) => last = e,\n 602|        }\n...\n 624|) -> io::Result<Option<serde_json::Value>> {\n*625|    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n 626|        // Pinned: classify from the durable fact. A pinned line that does not\n 627|        // parse is terminally unclassifiable (same contract as the peek path).\n 628|        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n...\n 662|) -> io::Result<Option<serde_json::Value>> {\n*663|    let mut brain = connect(broker_name)?;\n 664|    brain.net_stream_subscribe(stream_id, floor_seq)?;\n 665|    let mut buf: Vec<u8> = Vec::new();\n 666|    loop {\n...\n 729|#[allow(clippy::too_many_arguments)]\n*730|fn worker(\n 731|    broker_name: &str,\n 732|    stream_id: u64,\n 733|    origin: &str,\n...\n 783|\n*784|    let mut brain = match connect(broker_name) {\n 785|        Ok(b) => b,\n 786|        Err(e) => {\n 787|            return WorkerReport {\n...\n 984|fn serve_registry_feed(\n*985|    brain: &mut Brain,\n 986|    stream_id: u64,\n 987|    origin: &str,\n 988|    registry: &RegistryHost,\n...\n 1062|// [impl->REQ-PRES-1]\n*1063|fn serve_notif_feed(brain: &mut Brain, stream_id: u64, origin: &str) -> DispatchOutcome {\n 1064|    let store = match NotifStore::open() {\n 1065|        Ok(s) => s,\n 1066|        Err(e) => return DispatchOutcome::Failed(e.to_string()),\n...\n 1142|fn serve_wan_feed(\n*1143|    brain: &mut Brain,\n 1144|    stream_id: u64,\n 1145|    origin: &str,\n 1146|    paths: &DispatchPaths,"}],"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":10,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":10}],"truncated":false,"displayContent":"  435│) -> io::Result<()> {\n *436│    let mut brain = connect(broker_name)?;\n  437│    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\n  438│    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\n  439│    // abandoned a stream on the first transient failure.\n     │...\n  499│                let started = Instant::now();\n *500│                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n  501│                pool.fetch_sub(1, Ordering::Relaxed);\n  502│                let outcome = report.outcome;\n  503│                let elapsed_ms = started.elapsed().as_millis();\n     │...\n  598│    for _ in 0..300 {\n *599│        match Brain::cold_start(broker_name, now_ms()) {\n  600│            Ok(b) => return Ok(b),\n  601│            Err(e) => last = e,\n  602│        }\n     │...\n  624│) -> io::Result<Option<serde_json::Value>> {\n *625│    match connect(broker_name).and_then(|mut b| b.net_stream_opener(stream_id)) {\n  626│        // Pinned: classify from the durable fact. A pinned line that does not\n  627│        // parse is terminally unclassifiable (same contract as the peek path).\n  628│        Ok(Some(bytes)) => return Ok(serde_json::from_slice(&bytes).ok()),\n     │...\n  662│) -> io::Result<Option<serde_json::Value>> {\n *663│    let mut brain = connect(broker_name)?;\n  664│    brain.net_stream_subscribe(stream_id, floor_seq)?;\n  665│    let mut buf: Vec<u8> = Vec::new();\n  666│    loop {\n     │...\n  729│#[allow(clippy::too_many_arguments)]\n *730│fn worker(\n  731│    broker_name: &str,\n  732│    stream_id: u64,\n  733│    origin: &str,\n     │...\n  783│\n *784│    let mut brain = match connect(broker_name) {\n  785│        Ok(b) => b,\n  786│        Err(e) => {\n  787│            return WorkerReport {\n     │...\n  984│fn serve_registry_feed(\n *985│    brain: &mut Brain,\n  986│    stream_id: u64,\n  987│    origin: &str,\n  988│    registry: &RegistryHost,\n     │...\n 1062│// [impl->REQ-PRES-1]\n*1063│fn serve_notif_feed(brain: &mut Brain, stream_id: u64, origin: &str) -> DispatchOutcome {\n 1064│    let store = match NotifStore::open() {\n 1065│        Ok(s) => s,\n 1066│        Err(e) => return DispatchOutcome::Failed(e.to_string()),\n     │...\n 1142│fn serve_wan_feed(\n*1143│    brain: &mut Brain,\n 1144│    stream_id: u64,\n 1145│    origin: &str,\n 1146│    paths: &DispatchPaths,"},"isError":false,"timestamp":1784272061325}}
{"type":"message","id":"6b264f35","parentId":"23227eed","timestamp":"2026-07-17T07:07:41.336Z","message":{"role":"toolResult","toolCallId":"call_V8xH2aCc2E1iVZLCju4ASMia|fc_0365286983a6ba82016a59d4bc004c8194835a9fab04e6a243","toolName":"read","content":[{"type":"text","text":"            // 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…\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    // 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            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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…\n        }\n…\n    };\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 merged = 0usize;\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                let records = decoder.push(&bytes);\n                if records.is_empty() {\n                    continue;\n                }\n                // Split the feed into instance rows and node-level labels\n                // (REQ-SUBNET-3) — each goes through its own gated apply path.\n                let mut updates: Vec<RegistryUpdate> = Vec::new();\n                let mut labels: Vec<NodeLabelUpdate> = Vec::new();\n                for rec in records {\n                    match rec {\n                        RegistryFeedRecord::Instance(u) => updates.push(u),\n                        RegistryFeedRecord::NodeLabel(n) => labels.push(n),\n                    }\n                }\n                if !labels.is_empty() {\n                    merged += registry.apply_node_labels(origin, &labels, &policy).len();\n                }\n                if updates.is_empty() {\n                    continue;\n                }\n                let (verdicts, flips) = registry.apply_feed_flips(origin, &updates, &policy);\n                merged += verdicts.len();\n                // Attention shift (D9-2): only ids this node actually hosts\n                // (a perch with a record); everything else is a no-op here.\n                // [impl->REQ-INST-3]\n                for id in flips {\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                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\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/// 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."}],"details":{"displayContent":{"text":"            // 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…\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    // 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            // Request carries `endpoint_id`, THAT is the gate subject — but only if\n            // we actually host a live session for it (D5 session-presence gate;\n            // D6: a stale registry row that named a gone endpoint resolves to no\n            // session → refuse cleanly, never a false attach). The endpoint id is\n            // WHICH endpoint the operator asks for (client-supplied, like Xfer's\n            // `endpoint`); the origin subject stays the handshake identity. The\n            // LOCAL path sends no endpoint_id and its session_id → endpoint mapping\n            // is unchanged.\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…\n        }\n…\n    };\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 merged = 0usize;\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                let records = decoder.push(&bytes);\n                if records.is_empty() {\n                    continue;\n                }\n                // Split the feed into instance rows and node-level labels\n                // (REQ-SUBNET-3) — each goes through its own gated apply path.\n                let mut updates: Vec<RegistryUpdate> = Vec::new();\n                let mut labels: Vec<NodeLabelUpdate> = Vec::new();\n                for rec in records {\n                    match rec {\n                        RegistryFeedRecord::Instance(u) => updates.push(u),\n                        RegistryFeedRecord::NodeLabel(n) => labels.push(n),\n                    }\n                }\n                if !labels.is_empty() {\n                    merged += registry.apply_node_labels(origin, &labels, &policy).len();\n                }\n                if updates.is_empty() {\n                    continue;\n                }\n                let (verdicts, flips) = registry.apply_feed_flips(origin, &updates, &policy);\n                merged += verdicts.len();\n                // Attention shift (D9-2): only ids this node actually hosts\n                // (a perch with a record); everything else is a no-op here.\n                // [impl->REQ-INST-3]\n                for id in flips {\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                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\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/// 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.","startLine":469,"lineNumbers":[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,null,575,null,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,null,902,null,962,null,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\\dispatch.rs"}}},"isError":false,"timestamp":1784272061336}}
{"type":"message","id":"d0e9d1e0","parentId":"6b264f35","timestamp":"2026-07-17T07:07:41.350Z","message":{"role":"toolResult","toolCallId":"call_yjGfkYBIVH4HHP0Rb3KqmEwV|fc_0365286983a6ba82016a59d4bc00608194806bd87f14ae3cf8","toolName":"read","content":[{"type":"text","text":"pub struct Brain {\n…\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    /// [`Brain::resume_sessions`], replacing the retired single-session\n    /// `BrainState` handoff. A session present here is in **resume mode** — its\n    /// `KIND_OUTPUT` dedup is **dedup-below + snap-above, NO reject-gap** (seeded\n    /// at the broker's `resume_seq`): drop `seq < cursor` (the at-least-once\n    /// boundary re-send) and accept-and-snap `seq >= cursor` (the contiguous case\n    /// *and* a post-eviction ring-floor jump — the broker's `Mutex`-held replay\n    /// cannot reorder, so a forward jump is only ever a legitimate eviction clamp,\n    /// never a real gap). A session **absent** here uses the strict single-session\n    /// `next_seq` path (reject-gap) byte-for-byte — the legacy spawn/drive seat.\n    session_cursors: std::collections::HashMap<u64, u64>,\n    /// When `Some`, every reply read is bounded by this per-call deadline budget\n    /// — set only by [`Brain::cold_start_pump`], which also splits the carrier\n    /// into the reader-thread form so the deadline can be honored over a channel\n    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n    /// single-threaded pump, where a black-holed peer would wedge the whole loop\n    /// (KNOWN-HAZARDS — a blocked brain-IPC read must never wedge the pump). The\n    /// two facts are coupled at construction: `Some` ⇔ [`BrainConn::Split`].\n    io_timeout: Option<Duration>,\n    /// #6 (ADR-0031): a COLD attach (`from_seq == 0`, set by [`Brain::attach`] /\n    /// [`Brain::attach_as`]) receives a synthesized clean-screen REPAINT as its\n    /// first `KIND_OUTPUT` frame, at pseudo-seq `broker.next_seq - 1` — NOT seq 0.\n    /// When `true`, the strict legacy `next_seq` path adopts that first frame's seq\n    /// as the baseline (accept-and-seed) instead of reject-gapping it, then reverts\n    /// to strict reject-gap for every subsequent LIVE frame (so a b4 drop still\n    /// re-fetches — B2 live exactly-once preserved). Only ever consulted on the\n    /// legacy single-session path; a resume-mode brain (snap-above) ignores it. A\n    /// resume-from-floor re-fetch (`from_seq > 0`) leaves this `false` → raw-ring\n    /// replay + strict reject-gap, entirely unchanged.\n    baseline_next_output: bool,\n}\n\nimpl Brain {\n    /// Cold start: connect, handshake, fresh generation 0, `gen_start = now`.\n    /// The ordinary blocking carrier ([`BrainConn::Whole`]) — every client\n    /// except the peer pump, which uses [`Brain::cold_start_pump`].\n    pub fn cold_start(name: &str, now_ms: u64) -> io::Result<Self> {\n        let mut conn = LocalSocketTransport::connect(name)?;\n        send_hello(&mut conn, Role::Brain)?;\n        Ok(Brain {\n            conn: BrainConn::Whole(conn),\n            generation: 0,\n            gen_start_ms: now_ms,\n            session_id: None,\n            next_seq: 0,\n            net_cursors: std::collections::HashMap::new(),\n            presence_cursor: None,\n            session_cursors: std::collections::HashMap::new(),\n            io_timeout: None,\n            baseline_next_output: false,\n        })\n    }\n\n    /// Cold start in **PUMP mode**: connect, handshake, then SPLIT the stream\n    /// into the reader-thread carrier ([`BrainConn::Split`]) and arm a per-IPC-\n    /// call deadline of `io_timeout`. This is the peer pump's dedicated client —\n    /// every reply read is bounded ([`Brain::read_event_until`] via\n    /// [`Brain::call_deadline`]) so a black-holed peer can never wedge the\n    /// single-threaded pump. The split is done at CONSTRUCTION (not flipped on a\n    /// live `Whole` after the fact — moving the `Stream` out by value to split it\n    /// is impossible behind `&mut self`), so a pump brain is split-and-bounded\n    /// for its whole life and a non-pump brain never pays the reader thread.\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n    pub fn cold_start_pump(name: &str, now_ms: u64, io_timeout: Duration) -> io::Result<Self> {\n        let mut stream = LocalSocketTransport::connect(name)?;\n        send_hello(&mut stream, Role::Brain)?;\n        Ok(Brain {\n            conn: BrainConn::split_with_reader(stream),\n            generation: 0,\n            gen_start_ms: now_ms,\n            session_id: None,\n            next_seq: 0,\n            net_cursors: std::collections::HashMap::new(),\n            presence_cursor: None,\n            session_cursors: std::collections::HashMap::new(),\n            io_timeout: Some(io_timeout),\n            baseline_next_output: false,\n        })\n    }\n\n    /// Handoff: connect, handshake, rehydrate the resume cursor + generation\n    /// from `prior`, but stamp `gen_start = now()` (NOT `prior.gen_start_ms` —\n…\n    pub fn net_stream_send(\n…\n    ) -> io::Result<Option<NetSent>> {\n…\n        loop {\n            match self.read_event_until(deadline)? {\n…\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.send(\n            KIND_NET_STREAM_RETIRE,\n            serde_json::to_value(NetStreamRetireReq { stream_id })\n                .expect(\"NetStreamRetireReq serializes\"),\n        )?;\n        loop {\n            match self.read_event()? {\n                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n                    return Ok(reply.removed);\n                }\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n                _ => continue,\n            }\n        }\n    }\n\n    /// A stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, read instead of peeking ring seq 0 (which a\n    /// bounded ring evicts under traffic). `Ok(None)` = the broker holds the\n    /// stream but no opener is pinned (no newline yet / capture gave up).\n    /// `Err` = no such stream, or an older broker without the verb (KH-2.3 —\n    /// the dispatcher falls back to the ring peek).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn net_stream_opener(&mut self, stream_id: u64) -> io::Result<Option<Vec<u8>>> {\n…\n    }\n…\n}"}],"details":{"displayContent":{"text":"pub struct Brain {\n…\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    /// [`Brain::resume_sessions`], replacing the retired single-session\n    /// `BrainState` handoff. A session present here is in **resume mode** — its\n    /// `KIND_OUTPUT` dedup is **dedup-below + snap-above, NO reject-gap** (seeded\n    /// at the broker's `resume_seq`): drop `seq < cursor` (the at-least-once\n    /// boundary re-send) and accept-and-snap `seq >= cursor` (the contiguous case\n    /// *and* a post-eviction ring-floor jump — the broker's `Mutex`-held replay\n    /// cannot reorder, so a forward jump is only ever a legitimate eviction clamp,\n    /// never a real gap). A session **absent** here uses the strict single-session\n    /// `next_seq` path (reject-gap) byte-for-byte — the legacy spawn/drive seat.\n    session_cursors: std::collections::HashMap<u64, u64>,\n    /// When `Some`, every reply read is bounded by this per-call deadline budget\n    /// — set only by [`Brain::cold_start_pump`], which also splits the carrier\n    /// into the reader-thread form so the deadline can be honored over a channel\n    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n    /// single-threaded pump, where a black-holed peer would wedge the whole loop\n    /// (KNOWN-HAZARDS — a blocked brain-IPC read must never wedge the pump). The\n    /// two facts are coupled at construction: `Some` ⇔ [`BrainConn::Split`].\n    io_timeout: Option<Duration>,\n    /// #6 (ADR-0031): a COLD attach (`from_seq == 0`, set by [`Brain::attach`] /\n    /// [`Brain::attach_as`]) receives a synthesized clean-screen REPAINT as its\n    /// first `KIND_OUTPUT` frame, at pseudo-seq `broker.next_seq - 1` — NOT seq 0.\n    /// When `true`, the strict legacy `next_seq` path adopts that first frame's seq\n    /// as the baseline (accept-and-seed) instead of reject-gapping it, then reverts\n    /// to strict reject-gap for every subsequent LIVE frame (so a b4 drop still\n    /// re-fetches — B2 live exactly-once preserved). Only ever consulted on the\n    /// legacy single-session path; a resume-mode brain (snap-above) ignores it. A\n    /// resume-from-floor re-fetch (`from_seq > 0`) leaves this `false` → raw-ring\n    /// replay + strict reject-gap, entirely unchanged.\n    baseline_next_output: bool,\n}\n\nimpl Brain {\n    /// Cold start: connect, handshake, fresh generation 0, `gen_start = now`.\n    /// The ordinary blocking carrier ([`BrainConn::Whole`]) — every client\n    /// except the peer pump, which uses [`Brain::cold_start_pump`].\n    pub fn cold_start(name: &str, now_ms: u64) -> io::Result<Self> {\n        let mut conn = LocalSocketTransport::connect(name)?;\n        send_hello(&mut conn, Role::Brain)?;\n        Ok(Brain {\n            conn: BrainConn::Whole(conn),\n            generation: 0,\n            gen_start_ms: now_ms,\n            session_id: None,\n            next_seq: 0,\n            net_cursors: std::collections::HashMap::new(),\n            presence_cursor: None,\n            session_cursors: std::collections::HashMap::new(),\n            io_timeout: None,\n            baseline_next_output: false,\n        })\n    }\n\n    /// Cold start in **PUMP mode**: connect, handshake, then SPLIT the stream\n    /// into the reader-thread carrier ([`BrainConn::Split`]) and arm a per-IPC-\n    /// call deadline of `io_timeout`. This is the peer pump's dedicated client —\n    /// every reply read is bounded ([`Brain::read_event_until`] via\n    /// [`Brain::call_deadline`]) so a black-holed peer can never wedge the\n    /// single-threaded pump. The split is done at CONSTRUCTION (not flipped on a\n    /// live `Whole` after the fact — moving the `Stream` out by value to split it\n    /// is impossible behind `&mut self`), so a pump brain is split-and-bounded\n    /// for its whole life and a non-pump brain never pays the reader thread.\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n    pub fn cold_start_pump(name: &str, now_ms: u64, io_timeout: Duration) -> io::Result<Self> {\n        let mut stream = LocalSocketTransport::connect(name)?;\n        send_hello(&mut stream, Role::Brain)?;\n        Ok(Brain {\n            conn: BrainConn::split_with_reader(stream),\n            generation: 0,\n            gen_start_ms: now_ms,\n            session_id: None,\n            next_seq: 0,\n            net_cursors: std::collections::HashMap::new(),\n            presence_cursor: None,\n            session_cursors: std::collections::HashMap::new(),\n            io_timeout: Some(io_timeout),\n            baseline_next_output: false,\n        })\n    }\n\n    /// Handoff: connect, handshake, rehydrate the resume cursor + generation\n    /// from `prior`, but stamp `gen_start = now()` (NOT `prior.gen_start_ms` —\n…\n    pub fn net_stream_send(\n…\n    ) -> io::Result<Option<NetSent>> {\n…\n        loop {\n            match self.read_event_until(deadline)? {\n…\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.send(\n            KIND_NET_STREAM_RETIRE,\n            serde_json::to_value(NetStreamRetireReq { stream_id })\n                .expect(\"NetStreamRetireReq serializes\"),\n        )?;\n        loop {\n            match self.read_event()? {\n                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n                    return Ok(reply.removed);\n                }\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n                _ => continue,\n            }\n        }\n    }\n\n    /// A stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact, read instead of peeking ring seq 0 (which a\n    /// bounded ring evicts under traffic). `Ok(None)` = the broker holds the\n    /// stream but no opener is pinned (no newline yet / capture gave up).\n    /// `Err` = no such stream, or an older broker without the verb (KH-2.3 —\n    /// the dispatcher falls back to the ring peek).\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    pub fn net_stream_opener(&mut self, stream_id: u64) -> io::Result<Option<Vec<u8>>> {\n…\n    }\n…\n}","startLine":264,"lineNumbers":[264,null,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,null,1402,null,1408,null,1425,1426,null,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,null,1502,null,1793]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs"}}},"isError":false,"timestamp":1784272061350}}
{"type":"message","id":"6aed3dca","parentId":"d0e9d1e0","timestamp":"2026-07-17T07:07:56.417Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Tracing connection ID lifecycle**\n\n**Verifying connection ID timeline and logs**"},{"type":"toolCall","id":"call_Rqdj1R9VaUWwNYKKusrf3sPR|fc_0365286983a6ba82016a59d4caea288194b70505a42a77c436","name":"read","arguments":{"i":"Inspecting conn 137 origin","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"450-525"}},{"type":"toolCall","id":"call_ccEMPI7z3qQDVHtI3GABuVoh|fc_0365286983a6ba82016a59d4caea988194af2941368fc55a6d","name":"read","arguments":{"i":"Reading dispatcher main carrier","path":"crates/spt-daemon/src/dispatch.rs","selector":"410-470,540-590"}},{"type":"toolCall","id":"call_uYopMAfAv8zWkXwVqbE8n9Nr|fc_0365286983a6ba82016a59d4caeaa08194b016b97b7b91fc57","name":"grep","arguments":{"i":"Finding shared dispatcher brain use","pattern":"brain\\.net_stream_subscribe|net_stream_subscribe\\(","path":"crates/spt-daemon/src/dispatch.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_ZpVR2tjyLo2udlZ0wWPCKku4|fc_0365286983a6ba82016a59d4caeaa88194b599d80abb92d2a4","name":"read","arguments":{"i":"Reading Brain drop implementation","path":"crates/spt-daemon/src/brain.rs","selector":"180-280"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":13540,"output":481,"cacheRead":85504,"cacheWrite":0,"totalTokens":99525,"reasoningTokens":276,"cost":{"input":0.06770000000000001,"output":0.01443,"cacheRead":0.042752,"cacheWrite":0,"total":0.124882}},"stopReason":"toolUse","timestamp":1784272061402,"responseId":"resp_0365286983a6ba82016a59d4bdbd5c8194884d03ec220b635c","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d4c067388194b7dc7d2125735f72","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdTK0loEjry2q4lkYFTDbagsB7KDsNfGkKrI9JtnOBLko8LQeB3yzMTsx9IIZ0ZXrPMTUv2u7O8utHtwuhvd8GNQERHZuYbHzi9E5GRzDlWkeRFxrRiTQHz0AtSGq1DAXdBColy5s9Em7w72-BfLc7cVRQK1BAcuggT-fmWWzvE0P1OQV_2B1lSIJ9gNkrYr_u1Kbz-UOhgi1mnsG04V4Y_1qHj7bNul33-H5Q1wtxXC-YNPdEAZ4eiMRNcIatTev4EnBrmgHQENO7irBDTX--Gyiac2W1ZitNn8BK2fV8edXHhiu_-Kr8WBckruuSeu_InrMfb7hNWjlsgMG41L5NT_vNW_L1Qy7etLW3EXktKFjh_WrwZwTi4jgW23W0LGgi1b_fQCHn4YjfqjjWMd_Zuz_2_1zkJizOMBDQ_SaZZBnPHMXXfGJF5KpTpSEcD2NNqfQLfjQi6qAFQx3BBDvZwFJMtnl-BQPzWR0DWnAFcmLtuP4OPWSyT7gkqa-KhfJTQiValqS05bvuxyAsSGvuIEHncvWegiNflw805Ic5Sb7eOBMJSlzVXSWYabzh-gseCETQpp8qT2u9S0FqzUCAA3ssC4nyITyWUR5jygdFeTocnEek-ioEND-vgG2_JFzqZ5BgSbZYA56_z-KwMaj_V3bDvx8zn4UpTWfjstl-2l5o8Cbwec6bZZgQLwJQQO5tTwbehaO0SHzD8w_UKpwXzM_JRhbUEO0oiU5lvhtyeiUtIUCHVFA_O5UXGJvPqgpACh-PYht9z97hwiKpTTocUWAaLEneD3qshWtylAQP9B-f7uns0u29KaYjsRNkTexskN0tg0YdWcBtEXd8AuL9S-41jk_fd-TDGMgVhogQmsfspn8KhSlMWRE2zsNYXfQu7ymgQXitt1bjnb23voPCBSX29IlHDG4rF1TdSIMViprSjq1CRXcHwKPlxkmBV-vsBkiPAGgQJBNnKIxioC6S4Hsvseg6RszambleWX3m04XGFPVPDV1WvMql37HSuNbUJuC4oHhguCjCSkTeDcD7uRtIj1IRgEUxEkcgDu0U1-VOI_wlrrsdJoIZNhYo-j-BuTft3jUWSNpyVx_XQqu13NIpf310BEfZkjY1yaa4ME7OkKwzITDQdEogTe7cq4XgKNgAwqp2EIy43O0Q3mxNDQs3WRiQVgjLCbYwQEg-8xmXGgQGJ2VJbt3Y8MvPMMIu3rWxWROX3V-bELVO2VcOyp6ySeoTy73CT6p0nuTD_PszX911AZ20-pabCHyM38xGqfC7fIR-fQlJeekRW0ppnW3jmbYbeFXn7HFtXylWVpHuuPoHA1bzaVvtyvqIU-GrCxS9IjbG1NJqwInnC3O4OxAj_cIpjLtqmeefChD-e0pK48JuVjq54z1QDEp5KPeZYc11n3Aj-nKpxz-EsRjmbFP2JntBOqKWTD9GqbjwfDcMWNJ26LR4LhU9M0Yml5HRXxrlQRsYfnlVweRO0JWa14tmYbM-9RNU1CgEHqNbAwB6GyD_ymiwRu2XGV4acTTA-9yj3855DbbubVWZz1YyClKzXnWVtQtsedrDtddlQrZO7Ebt_dK5sJX_NXYrNPFIdLcR82EXQDRq7v088i6msiw2DeOK3jlbeFNCfBkWDSuKfEHRU2hl0nv6TNJ36G0oBv335UQWIISwCmPaRj27IyYInLGrwMGO8hCEPrV0JYohVr4J1FF_RXsI5kD7NdgrdaBeORvIZ_sERq-A-vMaZCb_MDd88ssb99mFc_g7J9Bpgsdio3gpw6ZmsO1o_eNTks52j0NI8OfXjRX4QPRv8hA84SKgraumfrVSq-LanxNFuamaz7DTwRVJRg0W2XU_IwjazpDNDTKVVJ6YYcIwyedzUiDmxBp2XsEyACf0x9AvaSsajj8dTYO4pbx8M07hP_y4Fz5dfLHVkFUewRO0cGKuCeatC1MFQuxUUcCaTLDg9nzTU1YiRLQriIaoLiB0xg3rK_B-lJTZeVcKS5l5zPJJU1m6dOlCKZvNNul7Z06NUEItVfL0SHrHSddPw-qVFVC1d6DDsMovOciY9H8ulIdpth-qWl2OJ649jAUjPJqR7V__f2fn9Tx9PRBdhB-UDkLS6fe8QqxgsrBzYFGrUF5g9LlYfVIenEtuw6NUVUkJCabo68jbe8p1R6OXQaLWld6a8tUaVQYVe_FUTtBhSgQX9J_599v_UP5O0WfX3AGrfLNyqTiiPuprEakSb0l1NLtV1Fqy7cIQu1mizwxJ4xPU3yWNebDoqertNGHlytyqKt_2snnDRY0KOEDgp72WHyPp-aEDH94djw1us_iCRx8M-Ldbxe8MysRJHm9FbvdG-xgPz5OU47w_c3b0wQRWBuSiSvmM-0858JWDSTaK-5l-HhinpyFyL4F4WP10pqqYohTPsroboliqakLvxc1yxLfoopLmTlOfwCGnc3J0qOThIHpz00ErXdRykKey3CtI_jJ-CLLk6FUhqH2-b9IH6C7DpPrroJZOCv7ln04vOWnlXUeHcQ0b1WUCukGXpM3mnBaZZbCVcCGPP0BECP1cgN5_q0kWMZy2gXC7iy0590GXJNTuN1cHSBVNvpxpunU7k=","summary":[{"type":"summary_text","text":"**Tracing connection ID lifecycle**"},{"type":"summary_text","text":"**Verifying connection ID timeline and logs**"}]},{"id":"fc_0365286983a6ba82016a59d4caea288194b70505a42a77c436","type":"function_call","status":"completed","arguments":"{\"i\":\"Inspecting conn 137 origin\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"450-525\"}","call_id":"call_Rqdj1R9VaUWwNYKKusrf3sPR","name":"read"},{"id":"fc_0365286983a6ba82016a59d4caea988194af2941368fc55a6d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatcher main carrier\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"410-470,540-590\"}","call_id":"call_ccEMPI7z3qQDVHtI3GABuVoh","name":"read"},{"id":"fc_0365286983a6ba82016a59d4caeaa08194b016b97b7b91fc57","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding shared dispatcher brain use\",\"pattern\":\"brain\\\\.net_stream_subscribe|net_stream_subscribe\\\\(\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_uYopMAfAv8zWkXwVqbE8n9Nr","name":"grep"},{"id":"fc_0365286983a6ba82016a59d4caeaa88194b599d80abb92d2a4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading Brain drop implementation\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":\"180-280\"}","call_id":"call_ZpVR2tjyLo2udlZ0wWPCKku4","name":"read"}]},"duration":15014.089100003242,"ttft":3012.827500000596,"contextSnapshot":{"promptTokens":99044,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Rqdj1R9VaUWwNYKKusrf3sPR|fc_0365286983a6ba82016a59d4caea288194b70505a42a77c436","toolName":"read","startedAt":"2026-07-17T07:07:56.417Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Inspecting conn 137 origin"},"id":"d88a61fe","parentId":"6aed3dca","timestamp":"2026-07-17T07:07:56.417Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ccEMPI7z3qQDVHtI3GABuVoh|fc_0365286983a6ba82016a59d4caea988194af2941368fc55a6d","toolName":"read","startedAt":"2026-07-17T07:07:56.417Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatcher main carrier"},"id":"e98303ad","parentId":"d88a61fe","timestamp":"2026-07-17T07:07:56.417Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_uYopMAfAv8zWkXwVqbE8n9Nr|fc_0365286983a6ba82016a59d4caeaa08194b016b97b7b91fc57","toolName":"grep","startedAt":"2026-07-17T07:07:56.417Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Finding shared dispatcher brain use"},"id":"fca4750a","parentId":"e98303ad","timestamp":"2026-07-17T07:07:56.417Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ZpVR2tjyLo2udlZ0wWPCKku4|fc_0365286983a6ba82016a59d4caeaa88194b599d80abb92d2a4","toolName":"read","startedAt":"2026-07-17T07:07:56.417Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Reading Brain drop implementation"},"id":"dadfdbc7","parentId":"fca4750a","timestamp":"2026-07-17T07:07:56.417Z"}
{"type":"message","id":"82cebbeb","parentId":"dadfdbc7","timestamp":"2026-07-17T07:07:56.419Z","message":{"role":"toolResult","toolCallId":"call_uYopMAfAv8zWkXwVqbE8n9Nr|fc_0365286983a6ba82016a59d4caeaa08194b016b97b7b91fc57","toolName":"grep","content":[{"type":"text","text":" 663|    let mut brain = connect(broker_name)?;\n*664|    brain.net_stream_subscribe(stream_id, floor_seq)?;\n 665|    let mut buf: Vec<u8> = Vec::new();\n 666|    loop {\n 667|        match brain.read_event()? {\n...\n 990|    let policy = RegistryGatePolicy::load();\n*991|    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 992|        return DispatchOutcome::Failed(e.to_string());\n 993|    }\n 994|    let mut decoder = RegistryDecoder::new();\n...\n 1075|        .unwrap_or_default();\n*1076|    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1077|        return DispatchOutcome::Failed(e.to_string());\n 1078|    }\n 1079|    let mut decoder = NotifDecoder::new();\n...\n 1148|) -> DispatchOutcome {\n*1149|    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1150|        return DispatchOutcome::Failed(e.to_string());\n 1151|    }\n 1152|    let mut decoder = WanDecoder::new();"}],"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":4,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":4}],"truncated":false,"displayContent":"  663│    let mut brain = connect(broker_name)?;\n *664│    brain.net_stream_subscribe(stream_id, floor_seq)?;\n  665│    let mut buf: Vec<u8> = Vec::new();\n  666│    loop {\n  667│        match brain.read_event()? {\n     │...\n  990│    let policy = RegistryGatePolicy::load();\n *991│    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n  992│        return DispatchOutcome::Failed(e.to_string());\n  993│    }\n  994│    let mut decoder = RegistryDecoder::new();\n     │...\n 1075│        .unwrap_or_default();\n*1076│    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1077│        return DispatchOutcome::Failed(e.to_string());\n 1078│    }\n 1079│    let mut decoder = NotifDecoder::new();\n     │...\n 1148│) -> DispatchOutcome {\n*1149│    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1150│        return DispatchOutcome::Failed(e.to_string());\n 1151│    }\n 1152│    let mut decoder = WanDecoder::new();"},"isError":false,"timestamp":1784272076418}}
{"type":"message","id":"5a084fe7","parentId":"82cebbeb","timestamp":"2026-07-17T07:07:56.429Z","message":{"role":"toolResult","toolCallId":"call_ccEMPI7z3qQDVHtI3GABuVoh|fc_0365286983a6ba82016a59d4caea988194af2941368fc55a6d","toolName":"read","content":[{"type":"text","text":"pub struct DispatchPaths {\n…\n    pub scratch: PathBuf,\n}\n\nimpl DispatchPaths {\n    /// The production layout under [`perch::spt_home`].\n    pub fn production() -> DispatchPaths {\n        let home = perch::spt_home();\n        DispatchPaths {\n            owlery: perch::owlery_dir(),\n            releases: home.join(\"releases\"),\n            scratch: home.join(\"scratch\").join(\"net\"),\n        }\n    }\n}\n\n/// Watch the broker's stream table and dispatch every **peer-initiated**\n/// 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…\n            }\n…\n            thread::spawn(move || {\n…\n                if let DispatchOutcome::Served(detail) = &outcome {\n…\n                } else {\n…\n                    eprintln!(\n…\n                        dispatch_event(\n…\n                            &format!(\n…\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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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]"}],"details":{"displayContent":{"text":"pub struct DispatchPaths {\n…\n    pub scratch: PathBuf,\n}\n\nimpl DispatchPaths {\n    /// The production layout under [`perch::spt_home`].\n    pub fn production() -> DispatchPaths {\n        let home = perch::spt_home();\n        DispatchPaths {\n            owlery: perch::owlery_dir(),\n            releases: home.join(\"releases\"),\n            scratch: home.join(\"scratch\").join(\"net\"),\n        }\n    }\n}\n\n/// Watch the broker's stream table and dispatch every **peer-initiated**\n/// 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…\n            }\n…\n            thread::spawn(move || {\n…\n                if let DispatchOutcome::Served(detail) = &outcome {\n…\n                } else {\n…\n                    eprintln!(\n…\n                        dispatch_event(\n…\n                            &format!(\n…\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 mut c = claims_done.lock().unwrap();\n                c.insert(\n                    stream_id,\n                    outcome_transition(&outcome, attempts, Instant::now(), breaker_window),\n                );\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]","startLine":404,"lineNumbers":[404,null,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,null,472,null,498,null,504,null,523,null,529,null,531,null,538,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"}}},"isError":false,"timestamp":1784272076429}}
{"type":"message","id":"5585ae78","parentId":"5a084fe7","timestamp":"2026-07-17T07:07:56.446Z","message":{"role":"toolResult","toolCallId":"call_ZpVR2tjyLo2udlZ0wWPCKku4|fc_0365286983a6ba82016a59d4caeaa88194b599d80abb92d2a4","toolName":"read","content":[{"type":"text","text":"/// 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 179-283 of 2247. Use :284 to continue]"}],"details":{"truncation":{"content":"/// 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","truncated":true,"truncatedBy":"lines","totalLines":2069,"totalBytes":5207,"outputLines":105,"outputBytes":5207,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// 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}","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,null,314]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2247,"totalBytes":5207,"outputLines":105,"outputBytes":5207,"shownRange":{"start":179,"end":283},"nextOffset":284}}},"isError":false,"timestamp":1784272076446}}
{"type":"message","id":"6464be37","parentId":"5585ae78","timestamp":"2026-07-17T07:07:56.449Z","message":{"role":"toolResult","toolCallId":"call_Rqdj1R9VaUWwNYKKusrf3sPR|fc_0365286983a6ba82016a59d4caea288194b70505a42a77c436","toolName":"read","content":[{"type":"text","text":"PAIR_MEET_UP:BIGNET step=59475510 id=914f5d0c20817beda8707922a89631de75b0b3b1587415f8d2d1467bd1b079cd addr=EndpointAddr { id: PublicKey(914f5d0c20817beda8707922a89631de75b0b3b1587415f8d2d1467bd1b079cd), addrs: {Ip(100.68.35.65:64689), Ip(192.168.1.81:64689)} }\nCONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303894 mono_ms=61775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=stream-sub-attach stream=47 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain wall_ms=1784265314905 mono_ms=72785 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265314912 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain wall_ms=1784265315044 mono_ms=72924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315044 mono_ms=72924 event=stream-sub-attach stream=52 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain wall_ms=1784265315054 mono_ms=72934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315054 mono_ms=72934 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain wall_ms=1784265318460 mono_ms=76340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318460 mono_ms=76341 event=stream-sub-attach stream=63 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318462 mono_ms=76342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 449-528 of 132. Use :529 to continue]"}],"details":{"truncation":{"content":"PAIR_MEET_UP:BIGNET step=59475510 id=914f5d0c20817beda8707922a89631de75b0b3b1587415f8d2d1467bd1b079cd addr=EndpointAddr { id: PublicKey(914f5d0c20817beda8707922a89631de75b0b3b1587415f8d2d1467bd1b079cd), addrs: {Ip(100.68.35.65:64689), Ip(192.168.1.81:64689)} }\nCONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303894 mono_ms=61775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=stream-sub-attach stream=47 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain wall_ms=1784265314905 mono_ms=72785 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265314912 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain wall_ms=1784265315044 mono_ms=72924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315044 mono_ms=72924 event=stream-sub-attach stream=52 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain wall_ms=1784265315054 mono_ms=72934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315054 mono_ms=72934 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain wall_ms=1784265318460 mono_ms=76340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318460 mono_ms=76341 event=stream-sub-attach stream=63 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318462 mono_ms=76342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"lines","totalLines":132,"totalBytes":12426,"outputLines":80,"outputBytes":12426,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"PAIR_MEET_UP:BIGNET step=59475510 id=914f5d0c20817beda8707922a89631de75b0b3b1587415f8d2d1467bd1b079cd addr=EndpointAddr { id: PublicKey(914f5d0c20817beda8707922a89631de75b0b3b1587415f8d2d1467bd1b079cd), addrs: {Ip(100.68.35.65:64689), Ip(192.168.1.81:64689)} }\nCONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=154 role=brain wall_ms=1784265303485 mono_ms=61366 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=155 role=brain wall_ms=1784265303492 mono_ms=61373 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain wall_ms=1784265303494 mono_ms=61374 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303494 mono_ms=61374 event=stream-sub-attach stream=42 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=156 role=brain stream-subscriber stream=42 wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=157 role=brain wall_ms=1784265303496 mono_ms=61377 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303894 mono_ms=61775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=158 role=brain wall_ms=1784265303895 mono_ms=61775 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=stream-sub-attach stream=43 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=159 role=brain stream-subscriber stream=43 wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=160 role=brain wall_ms=1784265303895 mono_ms=61776 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=161 role=brain wall_ms=1784265305200 mono_ms=63080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63080 event=stream-sub-attach stream=44 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265305200 mono_ms=63081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=163 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=164 role=brain wall_ms=1784265308314 mono_ms=66195 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain wall_ms=1784265308315 mono_ms=66196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308315 mono_ms=66196 event=stream-sub-attach stream=46 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=166 role=brain stream-subscriber stream=46 wall_ms=1784265308317 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=167 role=brain wall_ms=1784265308318 mono_ms=66198 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain wall_ms=1784265308325 mono_ms=66206 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308325 mono_ms=66206 event=stream-sub-attach stream=45 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=165 role=brain stream-subscriber stream=45 wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=168 role=brain wall_ms=1784265308329 mono_ms=66210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=169 role=brain wall_ms=1784265308530 mono_ms=66411 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=170 role=brain wall_ms=1784265309018 mono_ms=66898 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=stream-sub-attach stream=47 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265309018 mono_ms=66899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=172 role=brain wall_ms=1784265313573 mono_ms=71454 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain wall_ms=1784265314905 mono_ms=72785 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=162 role=brain stream-subscriber stream=44 wall_ms=1784265314912 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=173 role=brain wall_ms=1784265314913 mono_ms=72793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=171 role=brain stream-subscriber stream=47 wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=174 role=brain wall_ms=1784265314918 mono_ms=72798 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265314924 mono_ms=72805 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 wall_ms=1784265314981 mono_ms=72862 event=stream-sub-attach stream=50 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=175 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=176 role=brain wall_ms=1784265315042 mono_ms=72923 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain wall_ms=1784265315044 mono_ms=72924 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315044 mono_ms=72924 event=stream-sub-attach stream=52 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=177 role=brain stream-subscriber stream=52 wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=179 role=brain wall_ms=1784265315046 mono_ms=72926 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain wall_ms=1784265315054 mono_ms=72934 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315054 mono_ms=72934 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=178 role=brain stream-subscriber stream=51 wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=180 role=brain wall_ms=1784265315058 mono_ms=72939 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 wall_ms=1784265315656 mono_ms=73536 event=stream-sub-attach stream=53 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 wall_ms=1784265315791 mono_ms=73672 event=stream-sub-attach stream=56 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 wall_ms=1784265316135 mono_ms=74015 event=stream-sub-attach stream=57 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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 wall_ms=1784265317399 mono_ms=75280 event=stream-sub-attach stream=60 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_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 wall_ms=1784265317566 mono_ms=75447 event=stream-sub-attach stream=61 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=181 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=182 role=brain wall_ms=1784265318459 mono_ms=76339 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain wall_ms=1784265318460 mono_ms=76340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318460 mono_ms=76341 event=stream-sub-attach stream=63 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=184 role=brain stream-subscriber stream=63 wall_ms=1784265318462 mono_ms=76342 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=185 role=brain wall_ms=1784265318462 mono_ms=76343 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","startLine":449,"lineNumbers":[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]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":132,"totalBytes":12426,"outputLines":80,"outputBytes":12426,"shownRange":{"start":449,"end":528},"nextOffset":529}}},"isError":false,"timestamp":1784272076449}}
{"type":"message","id":"0d915d6f","parentId":"6464be37","timestamp":"2026-07-17T07:08:06.153Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Investigating shared connection reuse across streams**\n\n**Exploring pump using single brain connection for streams**"},{"type":"toolCall","id":"call_nMB3agmViuhCbLwwRowjRK6p|fc_0365286983a6ba82016a59d4d47b1c819481f58f05407b4938","name":"grep","arguments":{"i":"Finding all stream subscription callers","pattern":"net_stream_subscribe\\(","path":"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":14573,"output":239,"cacheRead":91648,"cacheWrite":0,"totalTokens":106460,"reasoningTokens":180,"cost":{"input":0.072865,"output":0.00717,"cacheRead":0.045824,"cacheWrite":0,"total":0.125859}},"stopReason":"toolUse","timestamp":1784272076498,"responseId":"resp_0365286983a6ba82016a59d4ccdb248194bafcf00815667afc","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d4ceb3cc8194b43455453e1e48be","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdTU4GqlH4pztr4EsWtUGsp8EyZupaFgIrxWmxmMy4E71Px-lg_PccwGDqpMUWzsbSb-7rxMo5kQynqic70BhbZpTSC7LTyN6efTZNrjEKekkc-JuqAs15ptyFySnst_xfQWfVF7R0ENJw-m7eqdwJ38ZUP1h8XKWbfRXm-LWOkgPA4q9IFWF_15S50KihYG4I-WItcGnLFkYm8Xu_oCCs8GeVAVwckC30veZWcKW0mMs2tMF71OJK_7S3W21P4v7t1gPhIvkHhNNF-Af65XWpz_q8oNK4ElAnI-PE4BgK0Ejpby7zhdRbZBE5QMmDR9OT8f-hvKP5-YYU_gah6D99IwKGJqzfm6AEiNYmQ1HJXe5XAX54qnFW5_8p37n-nHdUw2ggQ2Y7A6l1GdRM3S6lW6epkLjEQrXwxBUAloOjSwN--fzAdPrDFqKucfeiM_PGFzPR9Q1E9abQwtp5tvaGBWp8HoKkIsTDaeDsf0HowXCiQ5UKLqGcECd1W5CXEPMUwCMUGj2NwgElJwtFx9yKVpkeKyqS-12tf9J8fnleYjbN0P7FfwNfTHj6uOg-wa1G0QmGocrGIzo3d84dvXb6IuIqM8QMNElv9WdfgRZ7oxeSqF1mC3WOmAJYAiED7NsTMQ_a0NbYccF7AcklkWcUg_Cza9JUNuC71yikeL4xAHqn2ieFMp1CySJMDkaolNvn__4iQuFJ1ZAQwSUw85sqs9QP7lAf68KN9e_eJKtZ-EtCmzkOnEjNcUH-xFZGHWujGdyQxNzt3Pa_uMtLOfVADfNLvFAS-y8NDRCqQO72oMfoOvBa5zyr4dh_9eot2XvXVMtD8mPgD1IgxG_R9tjN0awnpfgjuUBKpnWYG0GGKbOMnA3cXzVh3UoN2o4QznbkQY7xLgIXz1imHgdJQ8osT8PbpgPFLpkObMfR2v472SJ8Ehl002Bc-8nnySJa2Vs_FSNf3TBP0WasN9-usUbbyANPihwzDJ-Ig8bTkHS8XGYBSaDnVZuSZd4ZIBZhPDC1FSVcv7Ex80HYMzKrMEv11RgLW3use52aEKS77_oZ_6CmkN4cUDOuY8Wak-MWdGpGtxAg6gVutgNqY4yMZYUDEKz7HEKHUSmZ2BrSfBM5hq40R5bWU0laMv3uHlSYkF0Kx2D-VmMgmsKGGbCsLaAVRpeMxTEGbIc1_xU8oSICJqnXYw4ki1R4UI4eUf0ArkZJkBDOEBYbRDYvuZ9abDULkUHC4uf7pxtAdZu9GMTQUeKqYfvvIoOMapnZqG2o-xZQ6UVEEt0FzsRozEe9QbaqTL56QUv9LxZJx-P8B5a_TSJfwLJd36vZHEbeIGIdD3T7T0FKssDwfkLb9WwFftvIeoFp2vxQGexafc3HBtQ-8fZn-pRpWuV6uuu-ktG_o3NXE6nppu5NPGyt6Ez5ziX32oe0FvhSpfxuTsARrXL5DnNMOVBMnGNjHxfs7m8Fm7ypkpl2lvl8o9nqkuq2RYTQVdlzNQpp7WgHVS4qOxVwBMVlfmYi89AcGVuwMQx4OPOVmgVmro9oX2POUgPGJIRS-81J-IG2x6JXK16K_k47T6KfCUnqLEWd2Bcw-WNBXZxFXPSXQGWlhtDbtnzhj5d3KboGDvZWvZHv3LA6ZfbFarf1-8rlq-61yrdSrOqF0os6sE2SxelwTgutDwy2PYn5h5BE3a-8p6z7KO4tVKmB617TyKT3puT1l6j0WqnttRXcT3zgNNKqnCjRyFBWNXbFdbFeIigk991Q_7ruaE7LGgjhbNirdYK1dGEtlRCf2DcMeg80jEnWNTLVa1FSCcMlSbG_fUtFBqeASxfwQbEp-xnJZwr3-mk_45Y_fN-pn3QL3MqzwE4gjTQ_Os1S5Z8fz-7ouuZDKPRp-vT9nfioQbUe7y7NIMWqRxQc452m_kxGteVq0mqu4X6QonrfAHTqmch_0SDSPYF-gH3dG3vWf6bL89tJT3igRPzwNvEh5AgZWaM0GeAwPpA1UvkpI4seN0nI0A1U1KnquBpyEmTgfzos_kRcM_6LJnwHyHY1KI4ulaeuP8S-eE42D9MuwF-V32som-jlfaHqFYo-a4zY66wBJWgs-PHVzQZu4XqCDTz_FjIM7iLoHRHr8XlAzaanzceQ==","summary":[{"type":"summary_text","text":"**Investigating shared connection reuse across streams**"},{"type":"summary_text","text":"**Exploring pump using single brain connection for streams**"}]},{"id":"fc_0365286983a6ba82016a59d4d47b1c819481f58f05407b4938","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding all stream subscription callers\",\"pattern\":\"net_stream_subscribe\\\\(\",\"path\":\"crates/spt-daemon/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_nMB3agmViuhCbLwwRowjRK6p","name":"grep"}]},"duration":9654.005500003695,"ttft":2215.6203999966383,"contextSnapshot":{"promptTokens":106221,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_nMB3agmViuhCbLwwRowjRK6p|fc_0365286983a6ba82016a59d4d47b1c819481f58f05407b4938","toolName":"grep","startedAt":"2026-07-17T07:08:06.153Z","args":{"path":"crates/spt-daemon/src"},"intent":"Finding all stream subscription callers"},"id":"2f8e529e","parentId":"0d915d6f","timestamp":"2026-07-17T07:08:06.153Z"}
{"type":"message","id":"63099993","parentId":"2f8e529e","timestamp":"2026-07-17T07:08:06.161Z","message":{"role":"toolResult","toolCallId":"call_nMB3agmViuhCbLwwRowjRK6p|fc_0365286983a6ba82016a59d4d47b1c819481f58f05407b4938","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## attach.rs\n 313|) -> io::Result<AttachServeOutcome> {\n*314|    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 315|    // TWO-CONN SPLIT (REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT): the wire FORWARDS\n 316|    // (session Output / Size / Exit / Displaced / detach-finish onto the operator\n 317|    // stream) ride a SEPARATE broker connection from `brain`. `brain` RECEIVES\n## brain.rs\n 1589|    // [impl->REQ-DAEMON-2]\n*1590|    pub fn net_stream_subscribe(&mut self, stream_id: u64, from_seq: u64) -> io::Result<()> {\n 1591|        self.net_cursors.insert(stream_id, from_seq);\n 1592|        self.send(\n 1593|            KIND_NET_STREAM_SUBSCRIBE,\n## broker.rs\n 3244|                }\n*3245|                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n 3246|                    Ok(id) => my_stream_subs.push(id),\n 3247|                    Err(msg) => send_error(&send, &msg),\n 3248|                },\n...\n 4425|    // [impl->REQ-DAEMON-2]\n*4426|    fn dispatch_net_stream_subscribe(\n 4427|        &self,\n 4428|        env: Envelope,\n 4429|        send: &SharedSend,\n## dispatch.rs\n 663|    let mut brain = connect(broker_name)?;\n*664|    brain.net_stream_subscribe(stream_id, floor_seq)?;\n 665|    let mut buf: Vec<u8> = Vec::new();\n 666|    loop {\n 667|        match brain.read_event()? {\n...\n 990|    let policy = RegistryGatePolicy::load();\n*991|    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 992|        return DispatchOutcome::Failed(e.to_string());\n 993|    }\n 994|    let mut decoder = RegistryDecoder::new();\n...\n 1075|        .unwrap_or_default();\n*1076|    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1077|        return DispatchOutcome::Failed(e.to_string());\n 1078|    }\n 1079|    let mut decoder = NotifDecoder::new();\n...\n 1148|) -> DispatchOutcome {\n*1149|    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1150|        return DispatchOutcome::Failed(e.to_string());\n 1151|    }\n 1152|    let mut decoder = WanDecoder::new();\n## linkhost.rs\n 453|) -> io::Result<ShellLinkServeOutcome> {\n*454|    brain.net_stream_subscribe(stream_id, 0)?;\n 455|    let mut decoder = ShellLinkDecoder::new();\n 456|    loop {\n 457|        match brain.read_event()? {\n...\n 682|\n*683|    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 684|    let mut decoder = ShellLinkDecoder::new();\n 685|    loop {\n 686|        match brain.read_event()? {\n## propagate.rs\n 114|) -> io::Result<UpdateServeOutcome> {\n*115|    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 116|    let mut decoder = UpdDecoder::new();\n 117|    // Set once an Offer goes out; the Fetch must echo the same pull id.\n 118|    let mut offered: Option<String> = None;\n...\n 355|    let stream_id = opened.stream_id;\n*356|    brain.net_stream_subscribe(stream_id, 0)?;\n 357|\n 358|    let upd_id = format!(\"upd-{}\", open_op.seq);\n 359|    let query = UpdRecord::Query {\n...\n 557|    let stream_id = opened.stream_id;\n*558|    brain.net_stream_subscribe(stream_id, 0)?;\n 559|\n 560|    let upd_id = format!(\"upds-{stream_id}\");\n 561|    let query = UpdRecord::StatusQuery {\n## resthost.rs\n 81|) -> io::Result<RestServeOutcome> {\n*82|    brain.net_stream_subscribe(stream_id, 0)?;\n 83|    let mut decoder = RestDecoder::new();\n 84|    loop {\n 85|        match brain.read_event()? {\n...\n 201|\n*202|    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 203|    let mut decoder = RestDecoder::new();\n 204|    loop {\n 205|        match brain.read_event()? {\n## serveprobe.rs\n 73|) -> io::Result<ServeProbeServeOutcome> {\n*74|    brain.net_stream_subscribe(stream_id, 0)?;\n 75|    let mut decoder = ServeProbeDecoder::new();\n 76|    loop {\n 77|        match brain.read_event()? {\n...\n 120|\n*121|    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 122|    let mut decoder = ServeProbeDecoder::new();\n 123|    loop {\n 124|        match brain.read_event()? {\n## sync.rs\n 194|) -> io::Result<SyncServeOutcome> {\n*195|    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 196|    let mut decoder = SyncDecoder::new();\n 197|\n 198|    loop {\n...\n 344|    let stream_id = opened.stream_id;\n*345|    brain.net_stream_subscribe(stream_id, 0)?;\n 346|\n 347|    let sync_id = format!(\"pull-{}\", open_op.seq);\n 348|    let mut have_tips = BTreeMap::new();\n## wan.rs\n 202|    brain.net_stream_send(opened.stream_id, &ndjson::encode_line(msg), None, true)?;\n*203|    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 204|    let mut decoder = WanReplyDecoder::new();\n 205|    loop {\n 206|        match brain.read_event()? {\n## xfer.rs\n 233|) -> io::Result<XferServeOutcome> {\n*234|    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 235|    let mut decoder = XferDecoder::new();\n 236|    let mut recv: Option<RecvState> = None;\n 237|\n...\n 436|    let stream_id = opened.stream_id;\n*437|    brain.net_stream_subscribe(stream_id, 0)?;\n 438|    let line = XferRecord::Fetch {\n 439|        path: remote_path.to_string(),\n 440|        xfer_id: xfer_id.to_string(),\n...\n 546|    let stream_id = opened.stream_id;\n*547|    brain.net_stream_subscribe(stream_id, 0)?;\n 548|    let push = XferRecord::Push {\n 549|        path: remote_path.to_string(),\n 550|        total,"}],"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":23,"fileCount":11,"files":["crates/spt-daemon/src/attach.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/linkhost.rs","crates/spt-daemon/src/propagate.rs","crates/spt-daemon/src/resthost.rs","crates/spt-daemon/src/serveprobe.rs","crates/spt-daemon/src/sync.rs","crates/spt-daemon/src/wan.rs","crates/spt-daemon/src/xfer.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/attach.rs","count":1},{"path":"crates/spt-daemon/src/brain.rs","count":1},{"path":"crates/spt-daemon/src/broker.rs","count":2},{"path":"crates/spt-daemon/src/dispatch.rs","count":4},{"path":"crates/spt-daemon/src/linkhost.rs","count":2},{"path":"crates/spt-daemon/src/propagate.rs","count":3},{"path":"crates/spt-daemon/src/resthost.rs","count":2},{"path":"crates/spt-daemon/src/serveprobe.rs","count":2},{"path":"crates/spt-daemon/src/sync.rs","count":2},{"path":"crates/spt-daemon/src/wan.rs","count":1},{"path":"crates/spt-daemon/src/xfer.rs","count":3}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## attach.rs\n 313│) -> io::Result<AttachServeOutcome> {\n*314│    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 315│    // TWO-CONN SPLIT (REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT): the wire FORWARDS\n 316│    // (session Output / Size / Exit / Displaced / detach-finish onto the operator\n 317│    // stream) ride a SEPARATE broker connection from `brain`. `brain` RECEIVES\n## brain.rs\n 1589│    // [impl->REQ-DAEMON-2]\n*1590│    pub fn net_stream_subscribe(&mut self, stream_id: u64, from_seq: u64) -> io::Result<()> {\n 1591│        self.net_cursors.insert(stream_id, from_seq);\n 1592│        self.send(\n 1593│            KIND_NET_STREAM_SUBSCRIBE,\n## broker.rs\n 3244│                }\n*3245│                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n 3246│                    Ok(id) => my_stream_subs.push(id),\n 3247│                    Err(msg) => send_error(&send, &msg),\n 3248│                },\n     │...\n 4425│    // [impl->REQ-DAEMON-2]\n*4426│    fn dispatch_net_stream_subscribe(\n 4427│        &self,\n 4428│        env: Envelope,\n 4429│        send: &SharedSend,\n## dispatch.rs\n  663│    let mut brain = connect(broker_name)?;\n *664│    brain.net_stream_subscribe(stream_id, floor_seq)?;\n  665│    let mut buf: Vec<u8> = Vec::new();\n  666│    loop {\n  667│        match brain.read_event()? {\n     │...\n  990│    let policy = RegistryGatePolicy::load();\n *991│    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n  992│        return DispatchOutcome::Failed(e.to_string());\n  993│    }\n  994│    let mut decoder = RegistryDecoder::new();\n     │...\n 1075│        .unwrap_or_default();\n*1076│    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1077│        return DispatchOutcome::Failed(e.to_string());\n 1078│    }\n 1079│    let mut decoder = NotifDecoder::new();\n     │...\n 1148│) -> DispatchOutcome {\n*1149│    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n 1150│        return DispatchOutcome::Failed(e.to_string());\n 1151│    }\n 1152│    let mut decoder = WanDecoder::new();\n## linkhost.rs\n 453│) -> io::Result<ShellLinkServeOutcome> {\n*454│    brain.net_stream_subscribe(stream_id, 0)?;\n 455│    let mut decoder = ShellLinkDecoder::new();\n 456│    loop {\n 457│        match brain.read_event()? {\n    │...\n 682│\n*683│    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 684│    let mut decoder = ShellLinkDecoder::new();\n 685│    loop {\n 686│        match brain.read_event()? {\n## propagate.rs\n 114│) -> io::Result<UpdateServeOutcome> {\n*115│    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 116│    let mut decoder = UpdDecoder::new();\n 117│    // Set once an Offer goes out; the Fetch must echo the same pull id.\n 118│    let mut offered: Option<String> = None;\n    │...\n 355│    let stream_id = opened.stream_id;\n*356│    brain.net_stream_subscribe(stream_id, 0)?;\n 357│\n 358│    let upd_id = format!(\"upd-{}\", open_op.seq);\n 359│    let query = UpdRecord::Query {\n    │...\n 557│    let stream_id = opened.stream_id;\n*558│    brain.net_stream_subscribe(stream_id, 0)?;\n 559│\n 560│    let upd_id = format!(\"upds-{stream_id}\");\n 561│    let query = UpdRecord::StatusQuery {\n## resthost.rs\n  81│) -> io::Result<RestServeOutcome> {\n *82│    brain.net_stream_subscribe(stream_id, 0)?;\n  83│    let mut decoder = RestDecoder::new();\n  84│    loop {\n  85│        match brain.read_event()? {\n    │...\n 201│\n*202│    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 203│    let mut decoder = RestDecoder::new();\n 204│    loop {\n 205│        match brain.read_event()? {\n## serveprobe.rs\n  73│) -> io::Result<ServeProbeServeOutcome> {\n *74│    brain.net_stream_subscribe(stream_id, 0)?;\n  75│    let mut decoder = ServeProbeDecoder::new();\n  76│    loop {\n  77│        match brain.read_event()? {\n    │...\n 120│\n*121│    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 122│    let mut decoder = ServeProbeDecoder::new();\n 123│    loop {\n 124│        match brain.read_event()? {\n## sync.rs\n 194│) -> io::Result<SyncServeOutcome> {\n*195│    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 196│    let mut decoder = SyncDecoder::new();\n 197│\n 198│    loop {\n    │...\n 344│    let stream_id = opened.stream_id;\n*345│    brain.net_stream_subscribe(stream_id, 0)?;\n 346│\n 347│    let sync_id = format!(\"pull-{}\", open_op.seq);\n 348│    let mut have_tips = BTreeMap::new();\n## wan.rs\n 202│    brain.net_stream_send(opened.stream_id, &ndjson::encode_line(msg), None, true)?;\n*203│    brain.net_stream_subscribe(opened.stream_id, 0)?;\n 204│    let mut decoder = WanReplyDecoder::new();\n 205│    loop {\n 206│        match brain.read_event()? {\n## xfer.rs\n 233│) -> io::Result<XferServeOutcome> {\n*234│    brain.net_stream_subscribe(stream_id, net_from_seq)?;\n 235│    let mut decoder = XferDecoder::new();\n 236│    let mut recv: Option<RecvState> = None;\n 237│\n    │...\n 436│    let stream_id = opened.stream_id;\n*437│    brain.net_stream_subscribe(stream_id, 0)?;\n 438│    let line = XferRecord::Fetch {\n 439│        path: remote_path.to_string(),\n 440│        xfer_id: xfer_id.to_string(),\n    │...\n 546│    let stream_id = opened.stream_id;\n*547│    brain.net_stream_subscribe(stream_id, 0)?;\n 548│    let push = XferRecord::Push {\n 549│        path: remote_path.to_string(),\n 550│        total,"},"isError":false,"timestamp":1784272086161}}
{"type":"message","id":"251016c7","parentId":"63099993","timestamp":"2026-07-17T07:08:23.182Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Tracing pump peer connection reuse**\n\n**Identifying unbounded outbound stream retention**"},{"type":"toolCall","id":"call_dkxJHvAjLkN0PWHt44Qu3NnB|fc_0365286983a6ba82016a59d4e039e88194874629afa1daf5d6","name":"irc","arguments":{"i":"Clarifying carrier identity","op":"send","to":"RedispatchCpuRca","message":"Correction/precision: conn137 is almost certainly the long-lived **peer-pump** `Brain::cold_start_pump`, not dispatcher worker. Pump reuses one broker IPC carrier for many locally-initiated request/response streams (sync/update/registry/etc); callers subscribe each opened response stream, but there is no net-stream-unsubscribe and the `Brain.net_cursors` + broker handler `my_stream_subs: Vec` only clear on physical conn EOF. Each finished stream seat remains `Some`, writer blocks forever on `rx.recv`; `retire_stream` (dispatcher inbound only) also explicitly keeps subscriber alive. Thus seats are permanent for lifetime of pump conn, not temporary 15s: 15s applies only failed writes; finished+idle seat never writes/fails. conn137’s first subscriptions at mono 72s and continuing through >6,100s fit that pump lifetime.","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9200,"output":473,"cacheRead":98816,"cacheWrite":0,"totalTokens":108489,"reasoningTokens":232,"cost":{"input":0.046000000000000006,"output":0.014190000000000001,"cacheRead":0.049408,"cacheWrite":0,"total":0.109598}},"stopReason":"toolUse","timestamp":1784272086223,"responseId":"resp_0365286983a6ba82016a59d4d69a6881948b8e434621d878ad","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d4d847d881948f4717dfa7d68d96","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdTgdg2N6qABtreaXM9JNOqW8t60NZn78uOm-ZTZrda-wrZrMXjpshODwpp0GJ88kHoCCUULcWhwTZuScQUcdGMjx37zriJ43zVO7_DZR-rab_L1LuYuaxDZNosFy0YQDPXH6VzuxfLAXp0iiGhse79GCzT42GHDbsbTYd-hA-CG3XtjdR5_nAJrgOoufyCBecYD7Whx-GQKtpX6pltPYXmRMCFaELvB4Dvg7L7GGZr9asLJofcX0-fwA4OONe4Nvf291dGW6o5ubtj5wUJ5Dxdcn_-K-7eQk0KNqoaBAZoCMXg6U7V1jn_0-3YavtPP4MTMbvMMatj68xX24zh95tNEnAPJ4uKZGVly5OdXdnfkcBEpqCbcR-jS63joKRJob3k_S_Tt27b0SSTwO0pIX-3yHR7r4DQTzK3LFsQDijNfwhbDpr2cUOHi9D8pZ8gc0CJDnUKpB2YM6AxYM1aQppoS-jOOzX8mMGJwziREaYV6luPqiLZKaGv2aL6P-UFb-KZ-D4-A9d-kA2RNRRnt2D_juC7TjpTZmChKi-bgYW4tejqdqY9fLaRpqPN-pL3shgafMiyO1dRoYMFJSECtO0wFyYQlTeMTzXMKbVHCR_B-foN8fFv3XmtClUuuFTTp7w7Rx6aKL2LY2nHnI4Z7dZVuVL_xb1yWfyi4wPk6tRZZNPpu1vs1MDI9oSykRO0zhBtTo_9E4NtxzaHFBEfSoULFrBJTid5VqaAkv_BLrNDAdNRCMnxcLRMZUo7vSyqzMinJITihWfdExstAzcXFo4vI29yNThZpHo9e6ueAHCiAYLUs0-1VJ77fxEys7eLX3jNzXIDJ8f4tPsdYGSiXH3IYzqDBcihSr7i9RuWKgs-kokNKf6OvfTcfXs-wQB7SIOstRE16j5VzH-4Voum7ZPkl4LezvgpKZWGsbjo0HvtNUxMl2b7LRAM0_M8R0CoSYTSMNvBDAxtu3nGPBkIiswscnZivFA-o23HTGWUnV0GwKpl9p_2ArvoXkm_po71iPxux0reLJAqJVRc_pZW-6pLabDCHGOdqxXnD3oBuG4X2W2EqVroLFX89Kaz8hVx7I9NZP-t3mC-FlyVl0OxW3dFdVgX-8ZRWhG7RGEpANJzYdgMHAKqTsFMC8KdDMdQPbIUiIS0gezR-erXB1jxu3LGAbAV8T9VgPvk9kEoAxNd6tdvXqW6BYXUIFxgpUZF6-c0knS2payH1OgIC7rj_UtYcCLP0Aj0UWWGzEebgegU9S-UVKgR1cZOOCpOwRm85qm_Rf_H_4g6GXG-JJALxBGrc3yXSjSE7o6uJ6TafE3KLqunWq9_jA1N8Y9LORUFNwulhKV8ehNmyK8KmVvlbwuHI6fBCvRziIQld1IkCdT-SpHrXatb1tnBqIMbvdm30T-VL_d88GlPcx8l9mhudjiDB9C3NHdL8O95oWoiXqnuALxOz7ZzEvdWYweg21LeuZpwy30DPSoNMS4JGvNKNguVjCs4gF-GvyO47JJ2Vup4g0DwgpH2xTucsC1bALOp-zjd7HcWv4O6CO6tciNOy24YgqfCc7mw2kDWOxH2aGNcUkoG8PWv8lGKuX2Zi324q_c0cYNHcNPMhzXOTi-dMNGMVesYSqoMH9kFD8Evtts7kLRCVfespL6BpC_Lz2rhU_oqKex-zeVdlzAAIKWVRoujmQgd8VSCyiw8tz0NJC686EHRdYagP70TwZ6A-4PhGdc9JZjFxg4H5SuukwEs43CfNr4q2mNwt05gkepfqFQUCagZdNYhmugNK2E_uZwdp1J80aHNrDSZ2YPBNYNw_caFIU-19Q_jh6x4N692tnl3IrBn8M6qLL8CVnRFuxXpmfTzONoexZ_ONvdnCeAIBvGuEzEY_6j--ZXflazuu1HFxVVDc-cX26ONEYjn7p9V7_EcCz-8CnvAgb1SpPsKpJBVOYxGk_nNlCprR7bonfdFlMlTOHy8UvsP3jCfFfeeREZ-S---MFf8kzGtun9ZbbKkYyRf-fKC8O-oR5xtCo3hYGwl5F4GPoxouwxgFRFzFhDSV64U5dAWWFv8nZCOceBATZoMHc9V4NY75fVOl1a5Se5_LRZYOjJ5Sw-JbXmana5mys5d8wcPUBlaaPmESCA-Z-2hsY9qoTJMKOHNOklCGx2dL4J6D4lNSy2HKCbujSW65w-UysgoKN4qFluDxqyzZ8DM7fFNeNMbydPXjcd1QJzCS7VcwxKbPs1_I-Gt91InB6vso8LmwuDLhOQy2NJPx5FX7AkeqHoOzhaLfgic0TaDn6dlD0dXMIGcl_qi33_gTp5z2lx4YGYcZRmpJAIlQDbYSu7EhslqCSnwRpaeGTpDUI0b7dW1aMdsND83HMbrGZh386h6p-hnfEBKTkbBSQ2z1F_rFzI_U5bhPCUus-8Q_I3Z3APbhqU-0Np9p4R9a4DNrBfGmaqN_sTOhoDSvTDcyQWCZvcT8-D_ctkIYrmHs0qwKEpdXgtFKyy02bTY_","summary":[{"type":"summary_text","text":"**Tracing pump peer connection reuse**"},{"type":"summary_text","text":"**Identifying unbounded outbound stream retention**"}]},{"id":"fc_0365286983a6ba82016a59d4e039e88194874629afa1daf5d6","type":"function_call","status":"completed","arguments":"{\"i\":\"Clarifying carrier identity\",\"op\":\"send\",\"to\":\"RedispatchCpuRca\",\"message\":\"Correction/precision: conn137 is almost certainly the long-lived **peer-pump** `Brain::cold_start_pump`, not dispatcher worker. Pump reuses one broker IPC carrier for many locally-initiated request/response streams (sync/update/registry/etc); callers subscribe each opened response stream, but there is no net-stream-unsubscribe and the `Brain.net_cursors` + broker handler `my_stream_subs: Vec` only clear on physical conn EOF. Each finished stream seat remains `Some`, writer blocks forever on `rx.recv`; `retire_stream` (dispatcher inbound only) also explicitly keeps subscriber alive. Thus seats are permanent for lifetime of pump conn, not temporary 15s: 15s applies only failed writes; finished+idle seat never writes/fails. conn137’s first subscriptions at mono 72s and continuing through >6,100s fit that pump lifetime.\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_dkxJHvAjLkN0PWHt44Qu3NnB","name":"irc"}]},"duration":16957.980899989605,"ttft":2069.473600000143,"contextSnapshot":{"promptTokens":108016,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_dkxJHvAjLkN0PWHt44Qu3NnB|fc_0365286983a6ba82016a59d4e039e88194874629afa1daf5d6","toolName":"irc","startedAt":"2026-07-17T07:08:23.182Z","intent":"Clarifying carrier identity"},"id":"ab56cc1f","parentId":"251016c7","timestamp":"2026-07-17T07:08:23.182Z"}
{"type":"message","id":"0cf76032","parentId":"ab56cc1f","timestamp":"2026-07-17T07:08:23.183Z","message":{"role":"toolResult","toolCallId":"call_dkxJHvAjLkN0PWHt44Qu3NnB|fc_0365286983a6ba82016a59d4e039e88194874629afa1daf5d6","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- RedispatchCpuRca: injected"}],"details":{"op":"send","from":"BrokerCpuRca","to":"RedispatchCpuRca","receipts":[{"to":"RedispatchCpuRca","outcome":"injected"}]},"isError":false,"timestamp":1784272103183}}
{"type":"message","id":"de94e13d","parentId":"0cf76032","timestamp":"2026-07-17T07:08:33.875Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Examining pump run loop and cold_start_pump**"},{"type":"toolCall","id":"call_eo2zTT6I4LTTXmxSMieFz2BE|fc_0365286983a6ba82016a59d4f086c48194986d39a8c38dbad3","name":"grep","arguments":{"i":"Locating pump carrier creation","pattern":"cold_start_pump|let mut brain|Brain","path":"crates/spt-daemon/src/pump/mod.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_Vx0xTlKYJhJ4FsP5TRXJRnim|fc_0365286983a6ba82016a59d4f086e081948a56814ca820f281","name":"read","arguments":{"i":"Reading pump carrier ownership","path":"crates/spt-daemon/src/pump/mod.rs","selector":"560-650,650-760,1080-1140"}},{"type":"toolCall","id":"call_mpxWo9xCxqhZHLNsrvDugjZx|fc_0365286983a6ba82016a59d4f086ec81949b7b195316adc241","name":"read","arguments":{"i":"Reading stream subscribe cursor lifecycle","path":"crates/spt-daemon/src/brain.rs","selector":"1575-1625"}},{"type":"toolCall","id":"call_cFibhBh8jekLRMyOd3ifQ2Sg|fc_0365286983a6ba82016a59d4f087f88194bb75dc17bfe2a825","name":"grep","arguments":{"i":"Checking unsubscribe support","pattern":"NET_STREAM_UNSUBSCRIBE|net_stream_unsubscribe|detach_stream_sub","path":"crates/spt-daemon/src; crates/spt-msg/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_7078G5tpOJsmIDaV7oM7TFPa|fc_0365286983a6ba82016a59d4f08808819487760352996bd8e2","name":"read","arguments":{"i":"Reading stream detach implementation","path":"crates/spt-daemon/src/nethost.rs","selector":"570-620,1750-1810"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":7651,"output":306,"cacheRead":100864,"cacheWrite":0,"totalTokens":108821,"reasoningTokens":30,"cost":{"input":0.038255000000000004,"output":0.00918,"cacheRead":0.050432,"cacheWrite":0,"total":0.09786700000000001}},"stopReason":"toolUse","timestamp":1784272103288,"responseId":"resp_0365286983a6ba82016a59d4e7c7688194879c0e4eecda9e81","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d4e9ece88194ac356a2c4e770d6b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdTwfwB1VsDXJ61C92kuf2OziHKSaRB0GNN_hawJZWfVZM85YVUxt3zRdLaXXRRIqcNUe4xECK_OdePjfKuvupRlvqS3iXbjijG8vY05UPCBUEXkGTecvITBzK_4Nydkr7hl-e1KQzGp2xxY32xojVfQCAfD3JOPRke11XzSony3ArfcwTRjipybffM-VcIfBqE2V0kT8X5QRXCecmvXa59c3u7G4YCmlb-GHliTstmJ8mPlxWPtKINpZY5M1RQw6yZ0ni3niQNdFBxHjle_8M0W2-T_0Y0-4I0WUzJN1oTFYxPLEHfwQkzGHV95skqk0cPOrf8StpZhOgk5f-nxhy8zF_b_UNRatkm574ZH5I6FB-7gEWIfsXvJpvWBz3xkPt7R7OmywSF8wpC1zMl6f1n3FMAEaFfPCoYSPLCWEXwxW1Al5EUE5bHHrvCkblRkZ6K9oTfjdCPcgqng5I2eHq6Nr7HBBBh7hjPyA8fspNaJdnUNETEF0dm5JAGZFvVQ2o1KVI2CYjO2g7CROn-vovl2ouncQm9gU918SLuT0nweYxJh8zBU5VPv9WqIL6mWDj6m31jqr6NYvXM6Wy3rffmhjqtaTEErPVJXPyaF-uyCGuyRPXXmYyIid5JUPmxoScX6HBwp8rACrjrqmAOyj-jA7PbtREaJ9hvAC-325OUu0TsZ_TqmESOQW1JkOGmNie-JcYhLRQ9Rn8_xOdxnzam2097O5kOpRaTLJ6n0HHsEuXxwZdL8hX7srJ9Ndhu9IO996Ppd_OBvpH-E-AOqgx8tjOYr97MT86hp9kXuDu4v_aMQ2zRDFrM4ah1cfsQQkZv7OBS3dlwRieKFX_9RZ-3Pw8I17bGxzRwbhKO-Q0WosZvkz0kkbQGcwtsOvsGEJgfbQwLEEaHQvxMcrrM1qUzoLtw-2lKm4OukZRCubaSM_yTKQL2xigi3TuoZSqzLf720WtaELab93QWulLbr6TNBqbKkhMtlK-RG23lGEaUAZFEcFgX5f9JfhjxyNiGX26KmC7jYfF-GIlc7WvmpW6FvmHkCz9cQAgHuJstq8gGie6g=","summary":[{"type":"summary_text","text":"**Examining pump run loop and cold_start_pump**"}]},{"id":"fc_0365286983a6ba82016a59d4f086c48194986d39a8c38dbad3","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating pump carrier creation\",\"pattern\":\"cold_start_pump|let mut brain|Brain\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_eo2zTT6I4LTTXmxSMieFz2BE","name":"grep"},{"id":"fc_0365286983a6ba82016a59d4f086e081948a56814ca820f281","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump carrier ownership\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"560-650,650-760,1080-1140\"}","call_id":"call_Vx0xTlKYJhJ4FsP5TRXJRnim","name":"read"},{"id":"fc_0365286983a6ba82016a59d4f086ec81949b7b195316adc241","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream subscribe cursor lifecycle\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":\"1575-1625\"}","call_id":"call_mpxWo9xCxqhZHLNsrvDugjZx","name":"read"},{"id":"fc_0365286983a6ba82016a59d4f087f88194bb75dc17bfe2a825","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking unsubscribe support\",\"pattern\":\"NET_STREAM_UNSUBSCRIBE|net_stream_unsubscribe|detach_stream_sub\",\"path\":\"crates/spt-daemon/src; crates/spt-msg/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_cFibhBh8jekLRMyOd3ifQ2Sg","name":"grep"},{"id":"fc_0365286983a6ba82016a59d4f08808819487760352996bd8e2","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream detach implementation\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"570-620,1750-1810\"}","call_id":"call_7078G5tpOJsmIDaV7oM7TFPa","name":"read"}]},"duration":10585.722299993038,"ttft":2651.6819999963045,"contextSnapshot":{"promptTokens":108515,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_eo2zTT6I4LTTXmxSMieFz2BE|fc_0365286983a6ba82016a59d4f086c48194986d39a8c38dbad3","toolName":"grep","startedAt":"2026-07-17T07:08:33.876Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Locating pump carrier creation"},"id":"bc1c610a","parentId":"de94e13d","timestamp":"2026-07-17T07:08:33.876Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Vx0xTlKYJhJ4FsP5TRXJRnim|fc_0365286983a6ba82016a59d4f086e081948a56814ca820f281","toolName":"read","startedAt":"2026-07-17T07:08:33.876Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump carrier ownership"},"id":"fe5ce7a6","parentId":"bc1c610a","timestamp":"2026-07-17T07:08:33.876Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_mpxWo9xCxqhZHLNsrvDugjZx|fc_0365286983a6ba82016a59d4f086ec81949b7b195316adc241","toolName":"read","startedAt":"2026-07-17T07:08:33.876Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Reading stream subscribe cursor lifecycle"},"id":"a082c4e7","parentId":"fe5ce7a6","timestamp":"2026-07-17T07:08:33.876Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_cFibhBh8jekLRMyOd3ifQ2Sg|fc_0365286983a6ba82016a59d4f087f88194bb75dc17bfe2a825","toolName":"grep","startedAt":"2026-07-17T07:08:33.876Z","args":{"path":"crates/spt-daemon/src; crates/spt-msg/src"},"intent":"Checking unsubscribe support"},"id":"7d674e23","parentId":"a082c4e7","timestamp":"2026-07-17T07:08:33.876Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_7078G5tpOJsmIDaV7oM7TFPa|fc_0365286983a6ba82016a59d4f08808819487760352996bd8e2","toolName":"read","startedAt":"2026-07-17T07:08:33.876Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream detach implementation"},"id":"c4bca1fc","parentId":"7d674e23","timestamp":"2026-07-17T07:08:33.876Z"}
{"type":"message","id":"99ec0c53","parentId":"c4bca1fc","timestamp":"2026-07-17T07:08:33.878Z","message":{"role":"toolResult","toolCallId":"call_eo2zTT6I4LTTXmxSMieFz2BE|fc_0365286983a6ba82016a59d4f086c48194986d39a8c38dbad3","toolName":"grep","content":[{"type":"text","text":" 74|\n*75|use crate::brain::{Brain, BrokerEvent, PEER_REPLY_READ_BUDGET};\n 76|use crate::config::DaemonConfig;\n 77|use crate::effect::{Minter, MintedOp};\n 78|use crate::msg::{\n...\n 482|    /// The one brain IPC handle.\n*483|    brain: &'a mut Brain,\n 484|    /// The established peer conn id for this step.\n 485|    conn_id: u64,\n 486|    /// The pump's sole durable open-op counter. Workers mint open-ops only\n...\n 537|    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*538|    let mut brain = connect(broker_name)?;\n 539|    // The DEDICATED event-drain carrier (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION):\n 540|    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\n 541|    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\n...\n 780|/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\n*781|/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\n 782|/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\n 783|/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\n 784|/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n...\n 817|fn run_peer_subnets(\n*818|    brain: &mut Brain,\n 819|    ops: &mut EpochSource,\n 820|    workers: &mut [&mut dyn PumpWorker],\n 821|    due_flags: &[bool],\n...\n 858|    ev: NetPresenceEvent,\n*859|    brain: &mut Brain,\n 860|    ops: &mut EpochSource,\n 861|    workers: &mut [&mut dyn PumpWorker],\n 862|    due_flags: &[bool],\n...\n 1118|/// stream per feed: streams are single-purpose by the demux contract.\n*1119|fn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n 1120|    let opened = brain.net_open_stream(conn_id, None)?;\n 1121|    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n 1122|    Ok(())\n...\n 1126|/// startup): the carrier is split at construction with the per-call deadline\n*1127|/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\n 1128|/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\n 1129|// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*1130|fn connect(broker_name: &str) -> io::Result<Brain> {\n 1131|    let mut last = io::Error::other(\"broker never answered\");\n 1132|    for _ in 0..300 {\n*1133|        match Brain::cold_start_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\n 1134|            Ok(b) => return Ok(b),\n 1135|            Err(e) => last = e,\n 1136|        }"}],"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":"   74│\n  *75│use crate::brain::{Brain, BrokerEvent, PEER_REPLY_READ_BUDGET};\n   76│use crate::config::DaemonConfig;\n   77│use crate::effect::{Minter, MintedOp};\n   78│use crate::msg::{\n     │...\n  482│    /// The one brain IPC handle.\n *483│    brain: &'a mut Brain,\n  484│    /// The established peer conn id for this step.\n  485│    conn_id: u64,\n  486│    /// The pump's sole durable open-op counter. Workers mint open-ops only\n     │...\n  537│    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n *538│    let mut brain = connect(broker_name)?;\n  539│    // The DEDICATED event-drain carrier (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION):\n  540│    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\n  541│    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\n     │...\n  780│/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\n *781│/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\n  782│/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\n  783│/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\n  784│/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n     │...\n  817│fn run_peer_subnets(\n *818│    brain: &mut Brain,\n  819│    ops: &mut EpochSource,\n  820│    workers: &mut [&mut dyn PumpWorker],\n  821│    due_flags: &[bool],\n     │...\n  858│    ev: NetPresenceEvent,\n *859│    brain: &mut Brain,\n  860│    ops: &mut EpochSource,\n  861│    workers: &mut [&mut dyn PumpWorker],\n  862│    due_flags: &[bool],\n     │...\n 1118│/// stream per feed: streams are single-purpose by the demux contract.\n*1119│fn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n 1120│    let opened = brain.net_open_stream(conn_id, None)?;\n 1121│    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n 1122│    Ok(())\n     │...\n 1126│/// startup): the carrier is split at construction with the per-call deadline\n*1127│/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\n 1128│/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\n 1129│// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n*1130│fn connect(broker_name: &str) -> io::Result<Brain> {\n 1131│    let mut last = io::Error::other(\"broker never answered\");\n 1132│    for _ in 0..300 {\n*1133│        match Brain::cold_start_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\n 1134│            Ok(b) => return Ok(b),\n 1135│            Err(e) => last = e,\n 1136│        }"},"isError":false,"timestamp":1784272113878}}
{"type":"message","id":"5dfef814","parentId":"99ec0c53","timestamp":"2026-07-17T07:08:33.892Z","message":{"role":"toolResult","toolCallId":"call_Vx0xTlKYJhJ4FsP5TRXJRnim|fc_0365286983a6ba82016a59d4f086e081948a56814ca820f281","toolName":"read","content":[{"type":"text","text":"pub fn run_peer_pump(\n…\n) -> io::Result<()> {\n…\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…\nfn startup_reconcile_peeraddrs(paths: &PumpPaths, self_hex: &str) {\n…\n    for k in invalid {\n        eprintln!(\n            \"PEERADDR_INVARIANT_REPAIR:{k}: dropped a cached row whose address.id does not match its key (no roster repair available) [REQ-PEERADDR-INVARIANT]\"\n        );\n        changed |= pa.forget(&k);\n    }\n    if changed {\n        let _ = pa.save_to(&paths.peer_addrs);\n    }\n}\n\n/// The roster leg of the route chain: any subnet's `RosterEntry` for\n/// `peer_hex` whose advertised address passes id-match validation (gate\n/// ruling 4 — an address claiming a different identity resolves NOTHING).\n// [impl->REQ-PEER-ROUTE-CHAIN]\nfn roster_route(\n    roster: &spt_store::roster::RosterStore,\n    peer_hex: &str,\n) -> Option<serde_json::Value> {\n    roster\n        .members\n        .iter()\n        .filter(|m| m.pubkey_hex == peer_hex)\n        .filter_map(|m| m.address.as_ref())\n        .find(|a| spt_store::peeraddrs::addr_peer_id(a) == Some(peer_hex))\n        .cloned()\n}\n\n/// Monotonic milliseconds since the process's first stamp — the `mono_ms`\n/// half of the stamped failure lines (REQ-PUMP-STAGE-TRUTH): wall time can\n/// step; this cannot, so intra-incident ordering is trustworthy.\nfn mono_ms() -> u64 {\n    use std::sync::OnceLock;\n    static BASE: OnceLock<Instant> = OnceLock::new();\n    BASE.get_or_init(Instant::now).elapsed().as_millis() as u64\n}\n\n/// Open a fresh stream on `conn_id`, write one whole feed fire-and-forget,\n/// and finish it (the receiver's dispatcher classifies + applies). One\n/// stream per feed: streams are single-purpose by the demux contract.\nfn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n    let opened = brain.net_open_stream(conn_id, None)?;\n    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n    Ok(())\n}\n\n/// Connect a fresh brain IPC client in PUMP mode (retrying through broker\n/// startup): the carrier is split at construction with the per-call deadline\n/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\n/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\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_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\n            Ok(b) => return Ok(b),\n            Err(e) => last = e,\n        }\n        thread::sleep(Duration::from_millis(10));\n    }\n    Err(last)\n}"}],"details":{"displayContent":{"text":"pub fn run_peer_pump(\n…\n) -> io::Result<()> {\n…\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…\nfn startup_reconcile_peeraddrs(paths: &PumpPaths, self_hex: &str) {\n…\n    for k in invalid {\n        eprintln!(\n            \"PEERADDR_INVARIANT_REPAIR:{k}: dropped a cached row whose address.id does not match its key (no roster repair available) [REQ-PEERADDR-INVARIANT]\"\n        );\n        changed |= pa.forget(&k);\n    }\n    if changed {\n        let _ = pa.save_to(&paths.peer_addrs);\n    }\n}\n\n/// The roster leg of the route chain: any subnet's `RosterEntry` for\n/// `peer_hex` whose advertised address passes id-match validation (gate\n/// ruling 4 — an address claiming a different identity resolves NOTHING).\n// [impl->REQ-PEER-ROUTE-CHAIN]\nfn roster_route(\n    roster: &spt_store::roster::RosterStore,\n    peer_hex: &str,\n) -> Option<serde_json::Value> {\n    roster\n        .members\n        .iter()\n        .filter(|m| m.pubkey_hex == peer_hex)\n        .filter_map(|m| m.address.as_ref())\n        .find(|a| spt_store::peeraddrs::addr_peer_id(a) == Some(peer_hex))\n        .cloned()\n}\n\n/// Monotonic milliseconds since the process's first stamp — the `mono_ms`\n/// half of the stamped failure lines (REQ-PUMP-STAGE-TRUTH): wall time can\n/// step; this cannot, so intra-incident ordering is trustworthy.\nfn mono_ms() -> u64 {\n    use std::sync::OnceLock;\n    static BASE: OnceLock<Instant> = OnceLock::new();\n    BASE.get_or_init(Instant::now).elapsed().as_millis() as u64\n}\n\n/// Open a fresh stream on `conn_id`, write one whole feed fire-and-forget,\n/// and finish it (the receiver's dispatcher classifies + applies). One\n/// stream per feed: streams are single-purpose by the demux contract.\nfn push_feed(brain: &mut Brain, conn_id: u64, feed: &[u8]) -> io::Result<()> {\n    let opened = brain.net_open_stream(conn_id, None)?;\n    brain.net_stream_send(opened.stream_id, feed, None, true)?;\n    Ok(())\n}\n\n/// Connect a fresh brain IPC client in PUMP mode (retrying through broker\n/// startup): the carrier is split at construction with the per-call deadline\n/// armed ([`Brain::cold_start_pump`]), so the pump's reads are bounded from the\n/// first tick (REQ-HAZARD-PUMP-IPC-DEADLINE).\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\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_pump(broker_name, now_ms(), PUMP_PEER_IO_TIMEOUT) {\n            Ok(b) => return Ok(b),\n            Err(e) => last = e,\n        }\n        thread::sleep(Duration::from_millis(10));\n    }\n    Err(last)\n}","startLine":519,"lineNumbers":[519,null,527,null,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,null,1064,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs"}}},"isError":false,"timestamp":1784272113892}}
{"type":"message","id":"8d2da914","parentId":"5dfef814","timestamp":"2026-07-17T07:08:33.897Z","message":{"role":"toolResult","toolCallId":"call_cFibhBh8jekLRMyOd3ifQ2Sg|fc_0365286983a6ba82016a59d4f087f88194bb75dc17bfe2a825","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## broker.rs\n 3280|            for id in &my_stream_subs {\n*3281|                host.detach_stream_sub(*id, &send);\n 3282|            }\n 3283|            // And presence: the liveness log + its ring persist (D4c).\n 3284|            if my_presence_sub {\n## nethost.rs\n 1980|    /// disconnect cleanup; the stream + its ring persist).\n*1981|    pub(crate) fn detach_stream_sub(&self, stream_id: u64, sub: &SharedSend) {\n 1982|        let log = {\n 1983|            let streams = self.shared.streams.lock().unwrap();\n 1984|            streams.get(&stream_id).map(|e| Arc::clone(&e.log))"}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt-msg/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":2,"fileCount":2,"files":["crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":1},{"path":"crates/spt-daemon/src/nethost.rs","count":1}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## broker.rs\n 3280│            for id in &my_stream_subs {\n*3281│                host.detach_stream_sub(*id, &send);\n 3282│            }\n 3283│            // And presence: the liveness log + its ring persist (D4c).\n 3284│            if my_presence_sub {\n## nethost.rs\n 1980│    /// disconnect cleanup; the stream + its ring persist).\n*1981│    pub(crate) fn detach_stream_sub(&self, stream_id: u64, sub: &SharedSend) {\n 1982│        let log = {\n 1983│            let streams = self.shared.streams.lock().unwrap();\n 1984│            streams.get(&stream_id).map(|e| Arc::clone(&e.log))"},"isError":false,"timestamp":1784272113897}}
{"type":"message","id":"9e7c38a3","parentId":"8d2da914","timestamp":"2026-07-17T07:08:33.912Z","message":{"role":"toolResult","toolCallId":"call_7078G5tpOJsmIDaV7oM7TFPa|fc_0365286983a6ba82016a59d4f08808819487760352996bd8e2","toolName":"read","content":[{"type":"text","text":"impl StreamLog {\n…\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n…\n        self.subscriber = Some(SubscriberSeat::install(\n            sub,\n            replay,\n            Some(Arc::clone(&self.lease)),\n        ));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n}\n\n/// A bounded, sequenced log of connection liveness events — the broker-owned\n/// PresenceChannel seam (D4c, REQ-EP-4): the StreamLog ring/cursor discipline\n/// applied to the conn table itself. `register_conn` appends `connected`; each\n/// connection's closed-watcher appends `disconnected` after removing the row.\n/// A brain subscribes with a cursor and replays events produced while it was\n/// down, so presence survives a brain restart exactly like stream reads do.\n// [impl->REQ-EP-4]\nstruct PresenceLog {\n    next_seq: u64,\n    ring: VecDeque<NetPresenceEvent>,\n    cap_events: usize,\n    /// Behind the same bounded writer-queue seat as `StreamLog` (ADR-0038\n    /// Amendment fixes 2+3 — the PresenceLog mirrors ride the same change).\n    subscriber: Option<SubscriberSeat>,\n}\n\nimpl PresenceLog {\n    fn new(cap_events: usize) -> Self {\n        PresenceLog {\n            next_seq: 0,\n            ring: VecDeque::new(),\n            cap_events,\n            subscriber: None,\n        }\n    }\n\n    /// Append a liveness event: assign the next `seq`, retain it in the bounded\n    /// ring, live-send to the current subscriber. Producers: `register_conn`\n    /// (connected) and the per-conn closed-watchers (disconnected) — every\n    /// append serializes on the enclosing `Mutex`, so subscriber frames arrive\n    /// in strict `seq` order.\n    fn append(&mut self, kind: &str, conn_id: u64, remote_id_hex: &str) {\n…\n    }\n…\n}\n…\n    pub fn stream_conn(&self, stream_id: u64) -> Option<(u64, String)> {\n…\n    }\n\n    /// Write `bytes` to a held stream's send side; `finish` closes the send\n    /// side after the write (the peer's read pump then sees a clean end).\n    // [impl->REQ-DAEMON-2]\n    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n        let entry = {\n            let streams = self.shared.streams.lock().unwrap();\n            Arc::clone(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        };\n        // Serve-lease gate (ADR-0038 Amendment fix 4): a stream whose\n        // subscriber POISONED has its lease canceled — refusing the send here\n        // is what terminates the paired serve/wire worker at its next\n        // forward instead of leaving an orphan forwarding leg running.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        if entry.log.lock().unwrap().lease.is_canceled() {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n            )));\n        }\n        let bytes = bytes.to_vec();\n        // Bounded (REQ-HAZARD-BROKER-QUIC-DEADLINE): `write_all` / `finish` on a\n        // black-holed QUIC stream blocks on flow-control the dead peer never grants.\n        // Loopback (in-process) never hangs, so the bound is a no-op for it.\n        self.bounded_block_on(async move {\n            let mut send = entry.send.lock().await;\n            if !bytes.is_empty() {\n                send.write_all(&bytes).await?;\n            }\n            if finish {\n                send.finish().await?;\n            }\n            Ok(())\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n            .map(|(id, e)| {\n…\n            })\n            .collect()\n    }"}],"details":{"displayContent":{"text":"impl StreamLog {\n…\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n…\n        self.subscriber = Some(SubscriberSeat::install(\n            sub,\n            replay,\n            Some(Arc::clone(&self.lease)),\n        ));\n        Ok(replay_len)\n    }\n\n    /// Detach `sub` iff it is the current subscriber (a late disconnect must\n    /// not unsubscribe a newer brain).\n    fn detach_if(&mut self, sub: &SharedSend) {\n        if let Some(cur) = &self.subscriber {\n            if cur.is(sub) {\n                self.subscriber = None;\n            }\n        }\n    }\n}\n\n/// A bounded, sequenced log of connection liveness events — the broker-owned\n/// PresenceChannel seam (D4c, REQ-EP-4): the StreamLog ring/cursor discipline\n/// applied to the conn table itself. `register_conn` appends `connected`; each\n/// connection's closed-watcher appends `disconnected` after removing the row.\n/// A brain subscribes with a cursor and replays events produced while it was\n/// down, so presence survives a brain restart exactly like stream reads do.\n// [impl->REQ-EP-4]\nstruct PresenceLog {\n    next_seq: u64,\n    ring: VecDeque<NetPresenceEvent>,\n    cap_events: usize,\n    /// Behind the same bounded writer-queue seat as `StreamLog` (ADR-0038\n    /// Amendment fixes 2+3 — the PresenceLog mirrors ride the same change).\n    subscriber: Option<SubscriberSeat>,\n}\n\nimpl PresenceLog {\n    fn new(cap_events: usize) -> Self {\n        PresenceLog {\n            next_seq: 0,\n            ring: VecDeque::new(),\n            cap_events,\n            subscriber: None,\n        }\n    }\n\n    /// Append a liveness event: assign the next `seq`, retain it in the bounded\n    /// ring, live-send to the current subscriber. Producers: `register_conn`\n    /// (connected) and the per-conn closed-watchers (disconnected) — every\n    /// append serializes on the enclosing `Mutex`, so subscriber frames arrive\n    /// in strict `seq` order.\n    fn append(&mut self, kind: &str, conn_id: u64, remote_id_hex: &str) {\n…\n    }\n…\n}\n…\n    pub fn stream_conn(&self, stream_id: u64) -> Option<(u64, String)> {\n…\n    }\n\n    /// Write `bytes` to a held stream's send side; `finish` closes the send\n    /// side after the write (the peer's read pump then sees a clean end).\n    // [impl->REQ-DAEMON-2]\n    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n        let entry = {\n            let streams = self.shared.streams.lock().unwrap();\n            Arc::clone(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        };\n        // Serve-lease gate (ADR-0038 Amendment fix 4): a stream whose\n        // subscriber POISONED has its lease canceled — refusing the send here\n        // is what terminates the paired serve/wire worker at its next\n        // forward instead of leaving an orphan forwarding leg running.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        if entry.log.lock().unwrap().lease.is_canceled() {\n            return Err(io::Error::other(format!(\n                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n            )));\n        }\n        let bytes = bytes.to_vec();\n        // Bounded (REQ-HAZARD-BROKER-QUIC-DEADLINE): `write_all` / `finish` on a\n        // black-holed QUIC stream blocks on flow-control the dead peer never grants.\n        // Loopback (in-process) never hangs, so the bound is a no-op for it.\n        self.bounded_block_on(async move {\n            let mut send = entry.send.lock().await;\n            if !bytes.is_empty() {\n                send.write_all(&bytes).await?;\n            }\n            if finish {\n                send.finish().await?;\n            }\n            Ok(())\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n            .map(|(id, e)| {\n…\n            })\n            .collect()\n    }","startLine":374,"lineNumbers":[374,null,518,null,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,null,629,null,730,null,1743,null,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,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,null,1821,1822,1823]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784272113912}}
{"type":"message","id":"7cefceae","parentId":"9e7c38a3","timestamp":"2026-07-17T07:08:33.927Z","message":{"role":"toolResult","toolCallId":"call_mpxWo9xCxqhZHLNsrvDugjZx|fc_0365286983a6ba82016a59d4f086ec81949b7b195316adc241","toolName":"read","content":[{"type":"text","text":"    /// dispatcher's session→endpoint resolution (D9-1).\n    pub fn sessions(&mut self) -> io::Result<SessionsReply> {\n        self.send(KIND_SESSIONS, serde_json::Value::Null)?;\n        loop {\n            match self.read_event()? {\n                BrokerEvent::Sessions(ev) => return Ok(ev),\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n                _ => continue,\n            }\n        }\n    }\n\n    /// (Re)subscribe to a stream's buffered reads from `from_seq`, setting the\n    /// local cursor (gapless, exactly-once resume — the PTY `subscribe`\n    /// discipline on a QUIC stream, D4b).\n    // [impl->REQ-DAEMON-2]\n    pub fn net_stream_subscribe(&mut self, stream_id: u64, from_seq: u64) -> io::Result<()> {\n        self.net_cursors.insert(stream_id, from_seq);\n        self.send(\n            KIND_NET_STREAM_SUBSCRIBE,\n            serde_json::to_value(NetStreamSubscribeReq {\n                stream_id,\n                from_seq,\n            })\n            .expect(\"NetStreamSubscribeReq serializes\"),\n        )\n    }\n\n    /// The next stream-read sequence still needed for `stream_id` (the durable\n    /// state a handed-off brain carries to resubscribe gaplessly).\n    pub fn net_cursor(&self, stream_id: u64) -> Option<u64> {\n        self.net_cursors.get(&stream_id).copied()\n    }\n\n    /// (Re)subscribe to the broker's conn-liveness event log from `from_seq`,\n    /// setting the local cursor (D4c) — gapless, exactly-once presence resume:\n    /// events produced while no brain was attached replay from the cursor.\n    // [impl->REQ-EP-4]\n    pub fn net_presence_subscribe(&mut self, from_seq: u64) -> io::Result<()> {\n        self.presence_cursor = Some(from_seq);\n        self.send(\n            KIND_NET_PRESENCE_SUBSCRIBE,\n            serde_json::to_value(NetPresenceSubscribeReq { from_seq })\n                .expect(\"NetPresenceSubscribeReq serializes\"),\n        )\n    }\n\n    /// The next presence sequence still needed (the durable state a handed-off\n    /// brain carries to resubscribe gaplessly).\n    pub fn presence_cursor(&self) -> Option<u64> {\n        self.presence_cursor\n    }\n\n    /// PUMP-TRUTH W2 (REQ-PUMP-PEER-ISOLATION): subscribe the pump's DEDICATED\n    /// event carrier to presence in TAIL-FOLLOW mode — no history replay, and the\n\n[Showing lines 1574-1628 of 2247. Use :1629 to continue]"}],"details":{"truncation":{"content":"    /// dispatcher's session→endpoint resolution (D9-1).\n    pub fn sessions(&mut self) -> io::Result<SessionsReply> {\n        self.send(KIND_SESSIONS, serde_json::Value::Null)?;\n        loop {\n            match self.read_event()? {\n                BrokerEvent::Sessions(ev) => return Ok(ev),\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n                _ => continue,\n            }\n        }\n    }\n\n    /// (Re)subscribe to a stream's buffered reads from `from_seq`, setting the\n    /// local cursor (gapless, exactly-once resume — the PTY `subscribe`\n    /// discipline on a QUIC stream, D4b).\n    // [impl->REQ-DAEMON-2]\n    pub fn net_stream_subscribe(&mut self, stream_id: u64, from_seq: u64) -> io::Result<()> {\n        self.net_cursors.insert(stream_id, from_seq);\n        self.send(\n            KIND_NET_STREAM_SUBSCRIBE,\n            serde_json::to_value(NetStreamSubscribeReq {\n                stream_id,\n                from_seq,\n            })\n            .expect(\"NetStreamSubscribeReq serializes\"),\n        )\n    }\n\n    /// The next stream-read sequence still needed for `stream_id` (the durable\n    /// state a handed-off brain carries to resubscribe gaplessly).\n    pub fn net_cursor(&self, stream_id: u64) -> Option<u64> {\n        self.net_cursors.get(&stream_id).copied()\n    }\n\n    /// (Re)subscribe to the broker's conn-liveness event log from `from_seq`,\n    /// setting the local cursor (D4c) — gapless, exactly-once presence resume:\n    /// events produced while no brain was attached replay from the cursor.\n    // [impl->REQ-EP-4]\n    pub fn net_presence_subscribe(&mut self, from_seq: u64) -> io::Result<()> {\n        self.presence_cursor = Some(from_seq);\n        self.send(\n            KIND_NET_PRESENCE_SUBSCRIBE,\n            serde_json::to_value(NetPresenceSubscribeReq { from_seq })\n                .expect(\"NetPresenceSubscribeReq serializes\"),\n        )\n    }\n\n    /// The next presence sequence still needed (the durable state a handed-off\n    /// brain carries to resubscribe gaplessly).\n    pub fn presence_cursor(&self) -> Option<u64> {\n        self.presence_cursor\n    }\n\n    /// PUMP-TRUTH W2 (REQ-PUMP-PEER-ISOLATION): subscribe the pump's DEDICATED\n    /// event carrier to presence in TAIL-FOLLOW mode — no history replay, and the","truncated":true,"truncatedBy":"lines","totalLines":674,"totalBytes":2323,"outputLines":55,"outputBytes":2323,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    /// dispatcher's session→endpoint resolution (D9-1).\n    pub fn sessions(&mut self) -> io::Result<SessionsReply> {\n        self.send(KIND_SESSIONS, serde_json::Value::Null)?;\n        loop {\n            match self.read_event()? {\n                BrokerEvent::Sessions(ev) => return Ok(ev),\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n                _ => continue,\n            }\n        }\n    }\n\n    /// (Re)subscribe to a stream's buffered reads from `from_seq`, setting the\n    /// local cursor (gapless, exactly-once resume — the PTY `subscribe`\n    /// discipline on a QUIC stream, D4b).\n    // [impl->REQ-DAEMON-2]\n    pub fn net_stream_subscribe(&mut self, stream_id: u64, from_seq: u64) -> io::Result<()> {\n        self.net_cursors.insert(stream_id, from_seq);\n        self.send(\n            KIND_NET_STREAM_SUBSCRIBE,\n            serde_json::to_value(NetStreamSubscribeReq {\n                stream_id,\n                from_seq,\n            })\n            .expect(\"NetStreamSubscribeReq serializes\"),\n        )\n    }\n\n    /// The next stream-read sequence still needed for `stream_id` (the durable\n    /// state a handed-off brain carries to resubscribe gaplessly).\n    pub fn net_cursor(&self, stream_id: u64) -> Option<u64> {\n        self.net_cursors.get(&stream_id).copied()\n    }\n\n    /// (Re)subscribe to the broker's conn-liveness event log from `from_seq`,\n    /// setting the local cursor (D4c) — gapless, exactly-once presence resume:\n    /// events produced while no brain was attached replay from the cursor.\n    // [impl->REQ-EP-4]\n    pub fn net_presence_subscribe(&mut self, from_seq: u64) -> io::Result<()> {\n        self.presence_cursor = Some(from_seq);\n        self.send(\n            KIND_NET_PRESENCE_SUBSCRIBE,\n            serde_json::to_value(NetPresenceSubscribeReq { from_seq })\n                .expect(\"NetPresenceSubscribeReq serializes\"),\n        )\n    }\n\n    /// The next presence sequence still needed (the durable state a handed-off\n    /// brain carries to resubscribe gaplessly).\n    pub fn presence_cursor(&self) -> Option<u64> {\n        self.presence_cursor\n    }\n\n    /// PUMP-TRUTH W2 (REQ-PUMP-PEER-ISOLATION): subscribe the pump's DEDICATED\n    /// event carrier to presence in TAIL-FOLLOW mode — no history replay, and the","startLine":1574,"lineNumbers":[1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2247,"totalBytes":2323,"outputLines":55,"outputBytes":2323,"shownRange":{"start":1574,"end":1628},"nextOffset":1629}}},"isError":false,"timestamp":1784272113927}}
{"type":"message","id":"dac36b30","parentId":"7cefceae","timestamp":"2026-07-17T07:08:45.889Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Tracing subscriber seat lifecycle**"},{"type":"toolCall","id":"call_zx9da9SLTFSxc14X1pmyqPq4|fc_0365286983a6ba82016a59d4fcb1708194bf3ef72856e1e6cd","name":"read","arguments":{"i":"Reading stream finish semantics","path":"crates/spt-daemon/src/nethost.rs","selector":"400-560"}},{"type":"toolCall","id":"call_Ww7gG7ifeksXHs6dKuHGaDRR|fc_0365286983a6ba82016a59d4fcb410819483bc1fab69c05c9f","name":"read","arguments":{"i":"Reading stream detach cleanup","path":"crates/spt-daemon/src/nethost.rs","selector":"1965-2000"}},{"type":"toolCall","id":"call_cNfzR49esl95mvgWDBWzabFO|fc_0365286983a6ba82016a59d4fcb42481948bc7a5a6201d4b93","name":"read","arguments":{"i":"Reading hosted drop and waiter","path":"crates/spt-daemon/src/broker.rs","selector":"2600-2760,3380-3515,3460-3515"}},{"type":"toolCall","id":"call_ZjPficdSaXjqfbGLCTMM6X7K|fc_0365286983a6ba82016a59d4fcb4308194b09d29450bf4cb88","name":"read","arguments":{"i":"Reading translation child drop","path":"crates/spt-daemon/src/translation.rs","selector":"259-414"}},{"type":"toolCall","id":"call_IWUeyMqs3covAAH7pMIcRFWF|fc_0365286983a6ba82016a59d4fcb4388194913ae4c5768c0160","name":"grep","arguments":{"i":"Finding waiter drain teardown","pattern":"drain\\.request_stop|drain\\.join|session\\.wait|sessions_exit\\.remove|thread::spawn","path":"crates/spt-daemon/src/broker.rs","selector":"3380-3600","case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":13915,"output":427,"cacheRead":100864,"cacheWrite":0,"totalTokens":115206,"reasoningTokens":169,"cost":{"input":0.06957500000000001,"output":0.01281,"cacheRead":0.050432,"cacheWrite":0,"total":0.13281700000000002}},"stopReason":"toolUse","timestamp":1784272113968,"responseId":"resp_0365286983a6ba82016a59d4f295b881948452d253cd775b2b","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d4f473188194b7bae268a2b87a46","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdT8eQ1s9oHb_l-FFqjqg9y3B1lmJkA8BE8KjBvW_z6aVKq3zgsYXH6KxHzFb4ecNIHrEy6FzzmB5d7RvNA8OT4Unm-R59ZgMUtNSguqY-xjzLwfw5b-0mMcTnIPXw2liSoDjv9EOIjXjTbStVHpBTlyQG3-Qq8BQDaLuQYiETOSCZ-SpkUkFwBP0h0fhS3i487GgnSk5JVxeDae0YeIpPa5MdkjkHfiClQqYydoaxz4U9DTPXPPx2EsMAA-K0P8I4h9u5BwEM8z0klNo36wTrmX9iLz-YGjNbxseQuSj1RKRlQILQfpKeHe8yML1yENG2zc2k0AZdi26F7zwS4sOYxx01HBvZ-F3t4_645l0MCRF4Gr-TZtnjwFvRfnPruVBURn5xEOSsaGoXDRfPvqsiUD8za03DZuwJYFv5g31RWo0rJcFsAcguW21cCk6cD3Ch693KKAXnhtK0GSoq-JF2LWdLKRtKblguCRLbvIADhjdhlIxMANjCOBSn1Iuhpl5WlaQkpSiwxTjix4NOtslCAj1P5xbb60NIEBiRNT2dbhxYJKQoNpk-X49CGLX8ua3Nr8GDx4RoKQ9Qv-sDmtByas_w4rmaqYc1hK53FtKHCNRq1AspISe48etKitwcL2dmkP8xMAaHXZWicF900pVR_So_0eZZZMF_40Z9tgZcBwyIZCTjhpNE5qZP1b_jsc3Ga7qstw8BtQU2KANejJMFhIlc6Lbvei2IuK5ZDAO49tzGNMEN-XaXP5aRohvz8kyn0XC7bYTwdfBHYIQmnLEXgy1CgDI2lmr8d45a7G_ggPZnzdjuuqB0DgNELy8wulzig4MYvvkiOAlHllDh23cfvKdnu-vTHJiGeE2YOUdoD7TbdPbHoBILEAiMrx7t2ZNQcmLjNVM4gaChIr4RVYfXqyPIdwfi79UObwtD42AWK0xPKHPC0G70agDZMTXCjHKTH9A_Y02wRDasxRbMGG2yjcpI9LfEDvKXtSR3Gapv7y5tZwu_WB42kSoSzMtBMmm68JjkfSErjqDqbA2GrAAUWKDRTSsIjE_C-QSqk_rX-aFcheajqVSLz98BmtzBrNPDhx0VOeJt52VKGex5KuFTlDPEONV3OtRtHw1muckVIxEDVz4ALSu6uXgXzBkAJuEM9k5kG2CboD-C8kduHSfEmq3yQ3bx5vvLeejezEndozOxabhzx-0VPYatQqKDJC2iwwirgkmbddZcgT5Gt2JA88B5MWSy-VB6KKcfOfms1ORcjjhlJkH5gyCJ0UgIBtaohDaaIUYiMJl3fG9quB-mryTc7iZEnRDuGfGHhnDrnN1DG6XhwxfQw-t7-2OU9Vub50x6iBJpzryGQ8UMNGykk8sKUI4J4IglYZFMA9SGMHkTfYT3903poAJbVQJc8Gd7NFj4nxkI0adxhaob03BLzEw6xxYqvL0EtAvg5up3gfU3vYlinVd1ZnkiW6t3JZWIpaF9wYQOh0I714u2UqqBJLBne3FcS2fE0XUHVrmoUyu0F0StMaA7qPY8v5Q-euEADDUah0dy6xxOP4kf9LpgC6DdWE0Ne7M868Sz3fKwuJr90kc5xisDnMybumBOYCocxvKEswhnGIqTpnq8mV6TBKvSooHp88Wqn3Bci0fOZJVdxT9-2kyW97L_bRjuUGdU04bJf83nWKmuE3AKojY_n2izjgsjPS3uz1iXKdvBX9siC5I0S0Wx6kbDociO5AYtMpfxVrByKQKWj1tWdmp4FHnMd8VIeG6exj9an7GlRRk75fhWNaKEPzIZOVYbu9Rxhe6-y6qg1vVqWvW-XWtxOWgPlHYr82h27DYAHqIEOn_W49kdHS7gZL8isInuGMPUfOOykBtLcsQ2bVtAd2gbPlFzcBUrcSThF-xDYhb40ehcSisYjlKLfSoLrk7u4zhte3","summary":[{"type":"summary_text","text":"**Tracing subscriber seat lifecycle**"}]},{"id":"fc_0365286983a6ba82016a59d4fcb1708194bf3ef72856e1e6cd","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream finish semantics\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"400-560\"}","call_id":"call_zx9da9SLTFSxc14X1pmyqPq4","name":"read"},{"id":"fc_0365286983a6ba82016a59d4fcb410819483bc1fab69c05c9f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream detach cleanup\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1965-2000\"}","call_id":"call_Ww7gG7ifeksXHs6dKuHGaDRR","name":"read"},{"id":"fc_0365286983a6ba82016a59d4fcb42481948bc7a5a6201d4b93","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading hosted drop and waiter\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"2600-2760,3380-3515,3460-3515\"}","call_id":"call_cNfzR49esl95mvgWDBWzabFO","name":"read"},{"id":"fc_0365286983a6ba82016a59d4fcb4308194b09d29450bf4cb88","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading translation child drop\",\"path\":\"crates/spt-daemon/src/translation.rs\",\"selector\":\"259-414\"}","call_id":"call_ZjPficdSaXjqfbGLCTMM6X7K","name":"read"},{"id":"fc_0365286983a6ba82016a59d4fcb4388194913ae4c5768c0160","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding waiter drain teardown\",\"pattern\":\"drain\\\\.request_stop|drain\\\\.join|session\\\\.wait|sessions_exit\\\\.remove|thread::spawn\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3380-3600\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_IWUeyMqs3covAAH7pMIcRFWF","name":"grep"}]},"duration":11920.909600004554,"ttft":2524.3707000017166,"contextSnapshot":{"promptTokens":114779,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zx9da9SLTFSxc14X1pmyqPq4|fc_0365286983a6ba82016a59d4fcb1708194bf3ef72856e1e6cd","toolName":"read","startedAt":"2026-07-17T07:08:45.890Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream finish semantics"},"id":"94d78b76","parentId":"dac36b30","timestamp":"2026-07-17T07:08:45.890Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Ww7gG7ifeksXHs6dKuHGaDRR|fc_0365286983a6ba82016a59d4fcb410819483bc1fab69c05c9f","toolName":"read","startedAt":"2026-07-17T07:08:45.890Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream detach cleanup"},"id":"befc2e28","parentId":"94d78b76","timestamp":"2026-07-17T07:08:45.890Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_cNfzR49esl95mvgWDBWzabFO|fc_0365286983a6ba82016a59d4fcb42481948bc7a5a6201d4b93","toolName":"read","startedAt":"2026-07-17T07:08:45.890Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading hosted drop and waiter"},"id":"b2988cdd","parentId":"befc2e28","timestamp":"2026-07-17T07:08:45.890Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ZjPficdSaXjqfbGLCTMM6X7K|fc_0365286983a6ba82016a59d4fcb4308194b09d29450bf4cb88","toolName":"read","startedAt":"2026-07-17T07:08:45.890Z","args":{"path":"crates/spt-daemon/src/translation.rs"},"intent":"Reading translation child drop"},"id":"0c680e38","parentId":"b2988cdd","timestamp":"2026-07-17T07:08:45.890Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_IWUeyMqs3covAAH7pMIcRFWF|fc_0365286983a6ba82016a59d4fcb4388194913ae4c5768c0160","toolName":"grep","startedAt":"2026-07-17T07:08:45.890Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Finding waiter drain teardown"},"id":"20c84175","parentId":"0c680e38","timestamp":"2026-07-17T07:08:45.890Z"}
{"type":"message","id":"4ffa91f9","parentId":"20c84175","timestamp":"2026-07-17T07:08:45.898Z","message":{"role":"toolResult","toolCallId":"call_IWUeyMqs3covAAH7pMIcRFWF|fc_0365286983a6ba82016a59d4fcb4388194913ae4c5768c0160","toolName":"grep","content":[{"type":"text","text":" 3434|        let waiter = Arc::clone(&session);\n*3435|        thread::spawn(move || {\n 3436|            if let Ok(status) = waiter.wait() {\n 3437|                let ev = ExitEvent {\n 3438|                    session_id: id,"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs","searchPath":"C:/Users/decid/Documents/projects/spt-core/crates/spt-daemon/src/broker.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":1,"fileCount":1,"files":["crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":1}],"truncated":false,"displayContent":" 3434│        let waiter = Arc::clone(&session);\n*3435│        thread::spawn(move || {\n 3436│            if let Ok(status) = waiter.wait() {\n 3437│                let ev = ExitEvent {\n 3438│                    session_id: id,"},"isError":false,"timestamp":1784272125897}}
{"type":"message","id":"03d6dd1c","parentId":"4ffa91f9","timestamp":"2026-07-17T07:08:45.948Z","message":{"role":"toolResult","toolCallId":"call_cNfzR49esl95mvgWDBWzabFO|fc_0365286983a6ba82016a59d4fcb42481948bc7a5a6201d4b93","toolName":"read","content":[{"type":"text","text":"pub struct Broker {\n…\n    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n    /// perch-record claim (that would add another info.json writer, the exact\n    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n    /// a duplicate wake for a claimed-or-already-live endpoint stands down (no-op ack).\n    wake_inflight: Mutex<HashSet<String>>,\n    /// Live per-connection handler-thread tally: incremented on [`handle_conn`]\n    /// entry, decremented (RAII, panic-safe) when the handler returns. The\n    /// UPDATE-WEDGE round-4 int gate's observability seam\n    /// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): a poisoned/aborted\n    /// physical conn must drive its handler to EOF cleanup within the write\n    /// bound WITHOUT the client dropping — the test watches this count fall.\n    conn_handlers: AtomicUsize,\n}\n\n/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\nstruct PairHold {\n    subnet: String,\n    addr: EndpointAddr,\n    /// When the wait-for-code window expires (meet + 5 minutes).\n    deadline: Instant,\n}\n\n/// The two-phase join's wait-for-code window: the daemon holds the met address\n/// this long before a code must arrive (ADR-0030 / REQ-JOIN-TWO-PHASE).\nconst PAIR_CODE_WAIT: Duration = Duration::from_secs(5 * 60);\n\n/// Whether a held meet is still within its wait-for-code window\n/// (REQ-JOIN-TWO-PHASE). Pure (the testable core of the timeout).\nfn hold_is_live(deadline: Instant, now: Instant) -> bool {\n    deadline > now\n}\n\n/// Whether a failed code submission should KEEP the held meet for another try\n/// (REQ-JOIN-TWO-PHASE): only a wrong code — the operator re-enters it and the\n/// ceremony re-runs against the same held address (no re-search). Every other\n/// verdict (rate-limited, clock-skew, unknown-subnet, plumbing) is terminal.\nfn fail_keeps_hold(fail: &crate::pairhost::JoinFail) -> bool {\n    matches!(fail, crate::pairhost::JoinFail::WrongCode)\n}\n\n/// Render a [`JoinFail`](crate::pairhost::JoinFail) as the classified\n/// `pair-joined` failure frame the CLI's guided UX reads — single-sourced so the\n/// one-shot join, the meet phase, and the code phase all classify identically.\nfn pair_fail_frame(fail: &crate::pairhost::JoinFail) -> Envelope {\n    use crate::pairhost::JoinFail;\n    let (class, retry) = match fail {\n        JoinFail::NoSeedHolder(_) => (\"no-seed-holder\", None),\n        JoinFail::WrongCode => (\"wrong-code\", None),\n        JoinFail::RateLimited(retry) => (\"rate-limited\", *retry),\n        JoinFail::UnknownSubnet(_) => (\"unknown-subnet\", None),\n        JoinFail::ClockSkew => (\"clock-skew\", None),\n        JoinFail::Other(_) => (\"other\", None),\n    };\n    Envelope::new(\n        KIND_PAIR_JOINED,\n        serde_json::to_value(PairJoinReply {\n            ok: false,\n            class: Some(class.to_string()),\n            retry_after_secs: retry,\n            detail: fail.to_string(),\n        })\n        .expect(\"PairJoinReply serializes\"),\n    )\n}\n\n/// The distinct `(endpoint, install_dir)` pairs whose session runs `adapter`,\n/// from per-session `(endpoint, adapter, install_dir)` rows. Sessions with no\n/// recorded install dir are dropped (a live update needs a target). Pure (no\n/// lock, no I/O) so the live-update endpoint-selection is unit-testable without\n/// constructing real `HostedSession`s. (W3a, ADR-0025)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn select_endpoints_running_adapter(\n    rows: impl IntoIterator<Item = (String, String, Option<std::path::PathBuf>)>,\n    adapter: &str,\n) -> Vec<(String, std::path::PathBuf)> {\n    let mut out: Vec<(String, std::path::PathBuf)> = rows\n        .into_iter()\n        .filter_map(|(endpoint, adp, dir)| {\n            // Parent-match: a profile-composite `<adapter>:<profile>` session belongs\n            // to the update's parent record name (F015B — no exact-match skew).\n            spt_runtime::profile::adapter_parent_matches(&adp, adapter)\n                .then_some(dir.map(|d| (endpoint, d)))?\n        })\n        .collect();\n    out.sort();\n    out.dedup();\n    out\n}\n\nimpl Broker {\n    /// Bind the broker's listening endpoint at the namespaced `name`, with the\n    /// effect journal at the default path (`<spt_home>/daemon-effects.log`).\n    pub fn bind(name: &str) -> io::Result<Arc<Self>> {\n        Self::bind_in(name, default_journal_path())\n    }\n\n    /// Bind with an explicit effect-journal path — the testable seam (tests point\n    /// the broker-owned anchor at a temp file rather than the shared home).\n    pub fn bind_in(name: &str, journal_path: std::path::PathBuf) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net(name, journal_path, None)\n    }\n\n    /// Bind with an already-started broker-owned network host (D4a). Taking the\n    /// host (not its config) keeps a net bind failure separable from a listener\n    /// bind failure — the daemon degrades to a net-less broker rather than\n    /// losing PTY hosting (see `Daemon::run`).\n    // [impl->REQ-DAEMON-2]\n    pub fn bind_in_with_net(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n    ) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net_cap(name, journal_path, net, DEFAULT_LOG_CHUNKS)\n    }\n\n    /// [`bind_in_with_net`](Self::bind_in_with_net) with an explicit output-log\n    /// ring cap (the per-session eviction bound). Production binds at\n    /// [`DEFAULT_LOG_CHUNKS`]; the restoration D4-2 resume harness binds a **tiny**\n    /// cap to force ring eviction and exercise the post-eviction floor clamp (a\n    /// `resume_seq` below the surviving ring floor must resume forward, losing only\n    /// the evicted tail — never gap-erroring the live stream).\n    pub fn bind_in_with_net_cap(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n        log_cap_chunks: usize,\n    ) -> io::Result<Arc<Self>> {\n        let net_cell = std::sync::OnceLock::new();\n        if let Some(host) = net {\n            let _ = net_cell.set(host);\n        }\n        Ok(Arc::new(Broker {\n            listener: LocalSocketTransport::bind(name)?,\n            name: name.to_string(),\n            stop: AtomicBool::new(false),\n            sessions: Arc::new(Mutex::new(HashMap::new())),\n            next_id: AtomicU64::new(1),\n            log_cap_chunks,\n            journal: Arc::new(EffectJournal::open(journal_path)?),\n            net: net_cell,\n            brain_restart: std::sync::OnceLock::new(),\n            pair_holds: Mutex::new(HashMap::new()),\n            wake_inflight: Mutex::new(HashSet::new()),\n            conn_handlers: AtomicUsize::new(0),\n        }))\n    }\n\n    /// Wire the brain supervisor's planned-restart signal (ADR-0018 D3-3) so the\n    /// `KIND_BRAIN_RESTART` verb can drive a real brain-process restart. Called\n    /// once by `Daemon::run` after spawning the supervisor; idempotent by\n    /// `OnceLock` (the first wins). A broker without it accepts the verb but\n    /// reports `honored: false` (no supervisor to respawn the child).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn set_brain_restart(&self, signal: Arc<crate::brainproc::BrainRestart>) -> bool {\n        self.brain_restart.set(signal).is_ok()\n    }\n\n    /// Attach a network host to a broker that was bound net-less (REQ-DAEMON-9):\n    /// the boot-race self-heal path calls this once the background retry brings\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n…\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n…\n        let session = PtySession::spawn_program_in_env(\n…\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(id)\n    }\n\n    /// Re-attach a brain to a session's output under the W2.5 controller/viewer\n    /// model (REQ-RCVIEW-1 / REQ-KICK-1), replaying from `from_seq` for gapless,\n…\n}"}],"details":{"displayContent":{"text":"pub struct Broker {\n…\n    /// rc WMI auto-launch retired by REQ-RC-RECONNECT-TRUTH), so its own spawn choke\n    /// ([`dispatch_spawn`](Self::dispatch_spawn)) is the single-flight authority — no\n    /// perch-record claim (that would add another info.json writer, the exact\n    /// write-stomp this REQ kills). An id is claimed for the duration of one spawn;\n    /// a duplicate wake for a claimed-or-already-live endpoint stands down (no-op ack).\n    wake_inflight: Mutex<HashSet<String>>,\n    /// Live per-connection handler-thread tally: incremented on [`handle_conn`]\n    /// entry, decremented (RAII, panic-safe) when the handler returns. The\n    /// UPDATE-WEDGE round-4 int gate's observability seam\n    /// (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK): a poisoned/aborted\n    /// physical conn must drive its handler to EOF cleanup within the write\n    /// bound WITHOUT the client dropping — the test watches this count fall.\n    conn_handlers: AtomicUsize,\n}\n\n/// One held meet result for the two-phase join (see [`Broker::pair_holds`]).\nstruct PairHold {\n    subnet: String,\n    addr: EndpointAddr,\n    /// When the wait-for-code window expires (meet + 5 minutes).\n    deadline: Instant,\n}\n\n/// The two-phase join's wait-for-code window: the daemon holds the met address\n/// this long before a code must arrive (ADR-0030 / REQ-JOIN-TWO-PHASE).\nconst PAIR_CODE_WAIT: Duration = Duration::from_secs(5 * 60);\n\n/// Whether a held meet is still within its wait-for-code window\n/// (REQ-JOIN-TWO-PHASE). Pure (the testable core of the timeout).\nfn hold_is_live(deadline: Instant, now: Instant) -> bool {\n    deadline > now\n}\n\n/// Whether a failed code submission should KEEP the held meet for another try\n/// (REQ-JOIN-TWO-PHASE): only a wrong code — the operator re-enters it and the\n/// ceremony re-runs against the same held address (no re-search). Every other\n/// verdict (rate-limited, clock-skew, unknown-subnet, plumbing) is terminal.\nfn fail_keeps_hold(fail: &crate::pairhost::JoinFail) -> bool {\n    matches!(fail, crate::pairhost::JoinFail::WrongCode)\n}\n\n/// Render a [`JoinFail`](crate::pairhost::JoinFail) as the classified\n/// `pair-joined` failure frame the CLI's guided UX reads — single-sourced so the\n/// one-shot join, the meet phase, and the code phase all classify identically.\nfn pair_fail_frame(fail: &crate::pairhost::JoinFail) -> Envelope {\n    use crate::pairhost::JoinFail;\n    let (class, retry) = match fail {\n        JoinFail::NoSeedHolder(_) => (\"no-seed-holder\", None),\n        JoinFail::WrongCode => (\"wrong-code\", None),\n        JoinFail::RateLimited(retry) => (\"rate-limited\", *retry),\n        JoinFail::UnknownSubnet(_) => (\"unknown-subnet\", None),\n        JoinFail::ClockSkew => (\"clock-skew\", None),\n        JoinFail::Other(_) => (\"other\", None),\n    };\n    Envelope::new(\n        KIND_PAIR_JOINED,\n        serde_json::to_value(PairJoinReply {\n            ok: false,\n            class: Some(class.to_string()),\n            retry_after_secs: retry,\n            detail: fail.to_string(),\n        })\n        .expect(\"PairJoinReply serializes\"),\n    )\n}\n\n/// The distinct `(endpoint, install_dir)` pairs whose session runs `adapter`,\n/// from per-session `(endpoint, adapter, install_dir)` rows. Sessions with no\n/// recorded install dir are dropped (a live update needs a target). Pure (no\n/// lock, no I/O) so the live-update endpoint-selection is unit-testable without\n/// constructing real `HostedSession`s. (W3a, ADR-0025)\n// [impl->REQ-ADAPTER-LIVE-UPDATE]\nfn select_endpoints_running_adapter(\n    rows: impl IntoIterator<Item = (String, String, Option<std::path::PathBuf>)>,\n    adapter: &str,\n) -> Vec<(String, std::path::PathBuf)> {\n    let mut out: Vec<(String, std::path::PathBuf)> = rows\n        .into_iter()\n        .filter_map(|(endpoint, adp, dir)| {\n            // Parent-match: a profile-composite `<adapter>:<profile>` session belongs\n            // to the update's parent record name (F015B — no exact-match skew).\n            spt_runtime::profile::adapter_parent_matches(&adp, adapter)\n                .then_some(dir.map(|d| (endpoint, d)))?\n        })\n        .collect();\n    out.sort();\n    out.dedup();\n    out\n}\n\nimpl Broker {\n    /// Bind the broker's listening endpoint at the namespaced `name`, with the\n    /// effect journal at the default path (`<spt_home>/daemon-effects.log`).\n    pub fn bind(name: &str) -> io::Result<Arc<Self>> {\n        Self::bind_in(name, default_journal_path())\n    }\n\n    /// Bind with an explicit effect-journal path — the testable seam (tests point\n    /// the broker-owned anchor at a temp file rather than the shared home).\n    pub fn bind_in(name: &str, journal_path: std::path::PathBuf) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net(name, journal_path, None)\n    }\n\n    /// Bind with an already-started broker-owned network host (D4a). Taking the\n    /// host (not its config) keeps a net bind failure separable from a listener\n    /// bind failure — the daemon degrades to a net-less broker rather than\n    /// losing PTY hosting (see `Daemon::run`).\n    // [impl->REQ-DAEMON-2]\n    pub fn bind_in_with_net(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n    ) -> io::Result<Arc<Self>> {\n        Self::bind_in_with_net_cap(name, journal_path, net, DEFAULT_LOG_CHUNKS)\n    }\n\n    /// [`bind_in_with_net`](Self::bind_in_with_net) with an explicit output-log\n    /// ring cap (the per-session eviction bound). Production binds at\n    /// [`DEFAULT_LOG_CHUNKS`]; the restoration D4-2 resume harness binds a **tiny**\n    /// cap to force ring eviction and exercise the post-eviction floor clamp (a\n    /// `resume_seq` below the surviving ring floor must resume forward, losing only\n    /// the evicted tail — never gap-erroring the live stream).\n    pub fn bind_in_with_net_cap(\n        name: &str,\n        journal_path: std::path::PathBuf,\n        net: Option<NetHost>,\n        log_cap_chunks: usize,\n    ) -> io::Result<Arc<Self>> {\n        let net_cell = std::sync::OnceLock::new();\n        if let Some(host) = net {\n            let _ = net_cell.set(host);\n        }\n        Ok(Arc::new(Broker {\n            listener: LocalSocketTransport::bind(name)?,\n            name: name.to_string(),\n            stop: AtomicBool::new(false),\n            sessions: Arc::new(Mutex::new(HashMap::new())),\n            next_id: AtomicU64::new(1),\n            log_cap_chunks,\n            journal: Arc::new(EffectJournal::open(journal_path)?),\n            net: net_cell,\n            brain_restart: std::sync::OnceLock::new(),\n            pair_holds: Mutex::new(HashMap::new()),\n            wake_inflight: Mutex::new(HashSet::new()),\n            conn_handlers: AtomicUsize::new(0),\n        }))\n    }\n\n    /// Wire the brain supervisor's planned-restart signal (ADR-0018 D3-3) so the\n    /// `KIND_BRAIN_RESTART` verb can drive a real brain-process restart. Called\n    /// once by `Daemon::run` after spawning the supervisor; idempotent by\n    /// `OnceLock` (the first wins). A broker without it accepts the verb but\n    /// reports `honored: false` (no supervisor to respawn the child).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn set_brain_restart(&self, signal: Arc<crate::brainproc::BrainRestart>) -> bool {\n        self.brain_restart.set(signal).is_ok()\n    }\n\n    /// Attach a network host to a broker that was bound net-less (REQ-DAEMON-9):\n    /// the boot-race self-heal path calls this once the background retry brings\n    /// the net endpoint up, after which the dispatcher + peer pump are spawned.\n…\n    fn dispatch_spawn(&self, env: Envelope, send: &SharedSend) -> Result<u64, String> {\n…\n        let session = PtySession::spawn_program_in_env(\n…\n        )\n        .map_err(|e| format!(\"spawn failed: {e}\"))?;\n        let session = Arc::new(session);\n        let id = self.next_id.fetch_add(1, Ordering::Relaxed);\n        let pid = session.process_id();\n\n        // The session's lone PTY input-writer (P0): the SOLE caller of the\n        // blocking `write_input`. Every dispatch-side write enqueues here, so a\n        // paste burst parks only this thread — never the broker dispatch thread\n        // (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The inject worker writes through it\n        // too, so the lone writer enforces the W2 inject-floor order.\n        let input = InputWriter::spawn(Arc::clone(&session), req.endpoint.clone());\n\n        // The output log, with the spawning connection pre-attached as the\n        // controller (identity `None` = LOCAL, not a remote driver) so no chunk\n        // is missed before an explicit subscribe — and so a remote attach to a\n        // spawned-but-undriven session takes control silently (no loud displace\n        // of the local-spawner placeholder; REQ-RCVIEW-1).\n        let log = Arc::new(Mutex::new(OutputLog::new(\n            id,\n            self.log_cap_chunks,\n            req.endpoint.clone(),\n            (req.rows, req.cols),\n        )));\n        log.lock()\n            .unwrap()\n            .become_controller(Arc::clone(send), None, 0, 0);\n\n        // Output drain → append under the log lock (fast: ring + viewer fan-out),\n        // then deliver to the controller OFF the lock with a bounded deadline\n        // (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST). The controller write is no\n        // longer inline under the log lock, so a backed-up controller can never\n        // wedge the session; a fully-stalled controller is detached after the\n        // deadline (bounded wedge, never permanent).\n        let log_drain = Arc::clone(&log);\n        let drain = session\n            .drain(move |chunk| {\n                // append() does the controller handoff inline now (one non-blocking\n                // try_send — b4) and returns Some(epoch) ONLY when the controller is\n                // stalled-past-deadline / gone and must be evicted. mark it gone OFF\n                // the first lock (a fresh lock, no self-deadlock). The drain never\n                // sleeps here, so a slow controller can't throttle the viewer fan-out.\n                let evict = recover_log(&log_drain).append(chunk);\n                if let Some(epoch) = evict {\n                    recover_log(&log_drain).mark_controller_gone(epoch);\n                }\n            })\n            .map_err(|e| format!(\"drain failed: {e}\"))?;\n\n        // Exit waiter → one `exit` frame when the child is reaped, then the dead\n        // session is removed from the table. Runs on its own thread; `wait`\n        // holds the child lock but `kill` uses a split killer.\n        let sessions_exit = Arc::clone(&self.sessions);\n        let log_exit = Arc::clone(&log);\n        let waiter = Arc::clone(&session);\n        thread::spawn(move || {\n            if let Ok(status) = waiter.wait() {\n                let ev = ExitEvent {\n                    session_id: id,\n                    code: Some(status.exit_code() as i32),\n                };\n                let frame = Envelope::new(\n                    KIND_EXIT,\n                    serde_json::to_value(ev).expect(\"ExitEvent serializes\"),\n                );\n                // Send to every attached sink — controller + all viewers (under\n                // the log lock).\n                let sinks = recover_log(&log_exit).all_sinks();\n                for sink in sinks {\n                    // Bounded conn write (round-4): a wedged sink can no longer\n                    // park the exit-waiter thread indefinitely.\n                    let _ = sink.write(&frame);\n                }\n            }\n            // Reap-time unlatch (REQ-HAZARD-CONTROL-STAMP-LIFETIME): the child\n            // died, not the controller conn, so no detach path clears the perch\n            // — do it here so ONLINE+CONTROLLED / driven_by / viewer_count cannot\n            // outlive the session in info.json (or gossip a stale controller).\n            // [impl->REQ-HAZARD-CONTROL-STAMP-LIFETIME]\n            recover_log(&log_exit).stamp_reaped();\n            // Reap the dead session from the table.\n            recover(&sessions_exit).remove(&id);\n        });\n\n        // Layer C: if the spawn carried a translation binary, bring it up with the\n        // session — spawn the pure stdin→stdout filter + the inject worker that\n        // owns the atomic PTY apply. A spawn failure FAILS CLOSED to SPOOLING\n        // (logged, `None` → idle inbound spools, never raw-injected) rather than\n        // aborting the session — a missing binary costs idle delivery, never the\n        // operator their agent.\n        // C-1: the shared bounded-respawn give-up counter (starts at 0; the worker\n        // resets it on a healthy commit, the dispatch respawn path increments it).\n        let translation_respawns = Arc::new(AtomicU32::new(0));\n        let translation = req\n            .translation_binary\n            .as_deref()\n            .and_then(|argv| {\n                build_translation(\n                    argv,\n                    &req.endpoint,\n                    &input,\n                    Arc::clone(&translation_respawns),\n                    &log,\n                )\n            });\n\n        recover(&self.sessions).insert(\n            id,\n            HostedSession {\n                session,\n                input,\n                drain,\n                log,\n                endpoint: req.endpoint.clone(),\n                translation,\n                translation_argv: req.translation_binary.clone(),\n                translation_respawns,\n                adapter: req.adapter.clone(),\n                install_dir: req.install_dir.clone().map(std::path::PathBuf::from),\n            },\n        );\n\n        let resp = Spawned {\n            session_id: id,\n            pid,\n        };\n        let frame = Envelope::new(\n            KIND_SPAWNED,\n            serde_json::to_value(resp).expect(\"Spawned serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(id)\n    }\n\n    /// Re-attach a brain to a session's output under the W2.5 controller/viewer\n    /// model (REQ-RCVIEW-1 / REQ-KICK-1), replaying from `from_seq` for gapless,\n…\n}","startLine":2561,"lineNumbers":[2561,null,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,null,3298,null,3374,null,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,null,4579]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"}}},"isError":false,"timestamp":1784272125947}}
{"type":"message","id":"fc2fe3d4","parentId":"03d6dd1c","timestamp":"2026-07-17T07:08:45.956Z","message":{"role":"toolResult","toolCallId":"call_ZjPficdSaXjqfbGLCTMM6X7K|fc_0365286983a6ba82016a59d4fcb4308194b09d29450bf4cb88","toolName":"read","content":[{"type":"text","text":"impl TranslationChild {\n…\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\n…\n        // sets this for its spawns — runtime/brainproc parity). No-op elsewhere.\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\n        #[cfg(windows)]\n        {\n            use std::os::windows::process::CommandExt;\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\n            command.creation_flags(CREATE_NO_WINDOW);\n        }\n        let mut child = command.spawn()?;\n        let pid = child.id().into();\n        let stdout = child\n            .stdout\n            .take()\n            .expect(\"stdout piped at spawn\");\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\n        let reader = thread::spawn(move || {\n            let buf = BufReader::new(stdout);\n            for line in buf.lines() {\n                let Ok(line) = line else { break }; // child stdout closed\n                let trimmed = line.trim();\n                if trimmed.is_empty() {\n                    continue;\n                }\n                match serde_json::from_str::<KeyCmd>(trimmed) {\n                    Ok(cmd) => {\n                        if cmds.send(cmd).is_err() {\n                            break; // broker dropped the receiver — stop reading\n                        }\n                    }\n                    Err(e) => {\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\n                    }\n                }\n            }\n        });\n        Ok(TranslationChild {\n            child: Mutex::new(Some(child)),\n            stdin: Mutex::new(Some(stdin)),\n            _reader: reader,\n            pid,\n        })\n    }\n\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\n    pub fn pid(&self) -> Option<u32> {\n        self.pid\n    }\n\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\n        let mut guard = self.stdin.lock().unwrap();\n        if let Some(w) = guard.as_mut() {\n            w.write_all(line.as_bytes())?;\n            w.write_all(b\"\\n\")?;\n            w.flush()?;\n        }\n        Ok(())\n    }\n\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\n    /// exits on its own. Idempotent.\n    fn close_stdin(&self) {\n        let _ = self.stdin.lock().unwrap().take();\n    }\n\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\n    /// (`None`) returns immediately, and every step swallows errors (a child that\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\n    /// the binary; Drop reaps on teardown).\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\n    pub fn terminate(&self) {\n        self.close_stdin();\n        let mut guard = self.child.lock().unwrap();\n        let Some(child) = guard.as_mut() else {\n            return; // already reaped\n        };\n        let deadline = Instant::now() + REAP_GRACE;\n        loop {\n            match child.try_wait() {\n                Ok(Some(_)) => {\n                    *guard = None;\n                    return; // exited on its own after EOF\n                }\n                Ok(None) => {\n                    if Instant::now() >= deadline {\n                        break;\n                    }\n                    thread::sleep(REAP_POLL);\n                }\n                Err(_) => break,\n            }\n        }\n        let _ = child.kill();\n        let _ = child.wait();\n        *guard = None;\n    }\n}\n\nimpl Drop for TranslationChild {\n    fn drop(&mut self) {\n        self.terminate();\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\n    #[test]\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\n        assert_eq!(\n            serde_json::to_string(&ToBinary::Init {\n                endpoint_id: \"doyle\".into(),\n                node: \"n1\".into(),\n            })\n            .unwrap(),\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\n        );\n        assert_eq!(\n            serde_json::to_string(&ToBinary::Event {\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\n            })\n            .unwrap(),\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\n        );\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\n        // Privacy invariant, structurally: the only field is `type`.\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\n        assert_eq!(\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\n            vec![\"type\"],\n            \"the input ping must carry no field other than `type` — no PTY content\"\n        );\n    }\n\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\n    // verified by the live watcher); this proves the flagged spawn still starts a live\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\n    #[test]\n    fn flagged_spawn_still_starts() {\n        // A no-arg program present on each platform that TranslationChild can spawn as\n        // a stdin→stdout child (it need not speak the protocol — we only assert the\n        // CREATE_NO_WINDOW spawn succeeds, then reap via terminate/Drop).\n        #[cfg(windows)]\n        let prog = \"cmd\";\n        #[cfg(unix)]\n        let prog = \"cat\";\n        let (tx, _rx) = std::sync::mpsc::channel::<KeyCmd>();\n        match TranslationChild::spawn(&[prog.to_string()], tx) {\n…\n        }\n    }\n…\n}\n\n[Showing lines 258-417 of 508. Use :418 to continue]"}],"details":{"truncation":{"content":"        // sets this for its spawns — runtime/brainproc parity). No-op elsewhere.\r\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\r\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\r\n    pub fn pid(&self) -> Option<u32> {\r\n        self.pid\r\n    }\r\n\r\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\r\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\r\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\r\n        let mut guard = self.stdin.lock().unwrap();\r\n        if let Some(w) = guard.as_mut() {\r\n            w.write_all(line.as_bytes())?;\r\n            w.write_all(b\"\\n\")?;\r\n            w.flush()?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\r\n    /// exits on its own. Idempotent.\r\n    fn close_stdin(&self) {\r\n        let _ = self.stdin.lock().unwrap().take();\r\n    }\r\n\r\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\r\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\r\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\r\n    /// (`None`) returns immediately, and every step swallows errors (a child that\r\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\r\n    /// the binary; Drop reaps on teardown).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn terminate(&self) {\r\n        self.close_stdin();\r\n        let mut guard = self.child.lock().unwrap();\r\n        let Some(child) = guard.as_mut() else {\r\n            return; // already reaped\r\n        };\r\n        let deadline = Instant::now() + REAP_GRACE;\r\n        loop {\r\n            match child.try_wait() {\r\n                Ok(Some(_)) => {\r\n                    *guard = None;\r\n                    return; // exited on its own after EOF\r\n                }\r\n                Ok(None) => {\r\n                    if Instant::now() >= deadline {\r\n                        break;\r\n                    }\r\n                    thread::sleep(REAP_POLL);\r\n                }\r\n                Err(_) => break,\r\n            }\r\n        }\r\n        let _ = child.kill();\r\n        let _ = child.wait();\r\n        *guard = None;\r\n    }\r\n}\r\n\r\nimpl Drop for TranslationChild {\r\n    fn drop(&mut self) {\r\n        self.terminate();\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\r\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\r\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\r\n    #[test]\r\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Init {\r\n                endpoint_id: \"doyle\".into(),\r\n                node: \"n1\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\r\n        );\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Event {\r\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\r\n        );\r\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\r\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\r\n        // Privacy invariant, structurally: the only field is `type`.\r\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\r\n        assert_eq!(\r\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\r\n            vec![\"type\"],\r\n            \"the input ping must carry no field other than `type` — no PTY content\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\r\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\r\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\r\n    // verified by the live watcher); this proves the flagged spawn still starts a live\r\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\r\n    #[test]\r\n    fn flagged_spawn_still_starts() {\r\n        // A no-arg program present on each platform that TranslationChild can spawn as\r\n        // a stdin→stdout child (it need not speak the protocol — we only assert the\r\n        // CREATE_NO_WINDOW spawn succeeds, then reap via terminate/Drop).\r\n        #[cfg(windows)]\r\n        let prog = \"cmd\";\r\n        #[cfg(unix)]\r\n        let prog = \"cat\";\r\n        let (tx, _rx) = std::sync::mpsc::channel::<KeyCmd>();\r\n        match TranslationChild::spawn(&[prog.to_string()], tx) {\r","truncated":true,"truncatedBy":"lines","totalLines":251,"totalBytes":6325,"outputLines":160,"outputBytes":6325,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl TranslationChild {\n…\n    pub fn spawn(argv: &[String], cmds: Sender<KeyCmd>) -> io::Result<Self> {\n…\n        // sets this for its spawns — runtime/brainproc parity). No-op elsewhere.\r\n        // [impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]\r\n        #[cfg(windows)]\r\n        {\r\n            use std::os::windows::process::CommandExt;\r\n            const CREATE_NO_WINDOW: u32 = 0x0800_0000;\r\n            command.creation_flags(CREATE_NO_WINDOW);\r\n        }\r\n        let mut child = command.spawn()?;\r\n        let pid = child.id().into();\r\n        let stdout = child\r\n            .stdout\r\n            .take()\r\n            .expect(\"stdout piped at spawn\");\r\n        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\r\n        let reader = thread::spawn(move || {\r\n            let buf = BufReader::new(stdout);\r\n            for line in buf.lines() {\r\n                let Ok(line) = line else { break }; // child stdout closed\r\n                let trimmed = line.trim();\r\n                if trimmed.is_empty() {\r\n                    continue;\r\n                }\r\n                match serde_json::from_str::<KeyCmd>(trimmed) {\r\n                    Ok(cmd) => {\r\n                        if cmds.send(cmd).is_err() {\r\n                            break; // broker dropped the receiver — stop reading\r\n                        }\r\n                    }\r\n                    Err(e) => {\r\n                        eprintln!(\"TRANSLATION_BIN_BAD_LINE: {e}: {trimmed}\");\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        Ok(TranslationChild {\r\n            child: Mutex::new(Some(child)),\r\n            stdin: Mutex::new(Some(stdin)),\r\n            _reader: reader,\r\n            pid,\r\n        })\r\n    }\r\n\r\n    /// The child's OS pid (for tests / introspection / the no-zombie assertion).\r\n    pub fn pid(&self) -> Option<u32> {\r\n        self.pid\r\n    }\r\n\r\n    /// Write one [`ToBinary`] line to the child's stdin (newline-terminated,\r\n    /// flushed). A closed stdin (post-shutdown) is a no-op `Ok`.\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn send(&self, msg: &ToBinary) -> io::Result<()> {\r\n        let line = serde_json::to_string(msg).map_err(io::Error::other)?;\r\n        let mut guard = self.stdin.lock().unwrap();\r\n        if let Some(w) = guard.as_mut() {\r\n            w.write_all(line.as_bytes())?;\r\n            w.write_all(b\"\\n\")?;\r\n            w.flush()?;\r\n        }\r\n        Ok(())\r\n    }\r\n\r\n    /// Drop the child's stdin handle, sending EOF — a well-behaved filter then\r\n    /// exits on its own. Idempotent.\r\n    fn close_stdin(&self) {\r\n        let _ = self.stdin.lock().unwrap().take();\r\n    }\r\n\r\n    /// Bounded reap (doyle gate #2): close stdin (EOF), give the child\r\n    /// [`REAP_GRACE`] to exit, then kill + `wait` it so no zombie outlives a\r\n    /// session-down or a FAULT. Best-effort + idempotent — a child already reaped\r\n    /// (`None`) returns immediately, and every step swallows errors (a child that\r\n    /// already exited is fine). Callable through a shared `Arc` (the worker faults\r\n    /// the binary; Drop reaps on teardown).\r\n    // [impl->REQ-MSG-IDLE-TRANSLATION-BINARY]\r\n    pub fn terminate(&self) {\r\n        self.close_stdin();\r\n        let mut guard = self.child.lock().unwrap();\r\n        let Some(child) = guard.as_mut() else {\r\n            return; // already reaped\r\n        };\r\n        let deadline = Instant::now() + REAP_GRACE;\r\n        loop {\r\n            match child.try_wait() {\r\n                Ok(Some(_)) => {\r\n                    *guard = None;\r\n                    return; // exited on its own after EOF\r\n                }\r\n                Ok(None) => {\r\n                    if Instant::now() >= deadline {\r\n                        break;\r\n                    }\r\n                    thread::sleep(REAP_POLL);\r\n                }\r\n                Err(_) => break,\r\n            }\r\n        }\r\n        let _ = child.kill();\r\n        let _ = child.wait();\r\n        *guard = None;\r\n    }\r\n}\r\n\r\nimpl Drop for TranslationChild {\r\n    fn drop(&mut self) {\r\n        self.terminate();\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-MSG-IDLE-TRANSLATION-BINARY] the stdin protocol serializes to the\r\n    // exact ADR-0022 JSON-lines wire — and the `input` ping is CONTENT-FREE (doyle\r\n    // gate #1: it carries `type` ONLY, no PTY bytes can ride it).\r\n    #[test]\r\n    fn to_binary_serializes_to_wire_and_input_is_content_free() {\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Init {\r\n                endpoint_id: \"doyle\".into(),\r\n                node: \"n1\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"init\",\"endpoint_id\":\"doyle\",\"node\":\"n1\"}\"#\r\n        );\r\n        assert_eq!(\r\n            serde_json::to_string(&ToBinary::Event {\r\n                envelope: \"<EVENT type=\\\"msg\\\"/>\".into(),\r\n            })\r\n            .unwrap(),\r\n            r#\"{\"type\":\"event\",\"envelope\":\"<EVENT type=\\\"msg\\\"/>\"}\"#\r\n        );\r\n        let ping = serde_json::to_string(&ToBinary::Input).unwrap();\r\n        assert_eq!(ping, r#\"{\"type\":\"input\"}\"#);\r\n        // Privacy invariant, structurally: the only field is `type`.\r\n        let v: serde_json::Value = serde_json::from_str(&ping).unwrap();\r\n        assert_eq!(\r\n            v.as_object().unwrap().keys().collect::<Vec<_>>(),\r\n            vec![\"type\"],\r\n            \"the input ping must carry no field other than `type` — no PTY content\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-CHILD-CONSOLE-FLASH] the CREATE_NO_WINDOW flag (set on Windows\r\n    // before spawn) must not break the spawn — the error-87 flag-combo regression\r\n    // class. Window-absence itself is unobservable from a consoled test runner (KH 5.8,\r\n    // verified by the live watcher); this proves the flagged spawn still starts a live\r\n    // child. Mirrors the runtime.rs CREATE_NO_WINDOW unit pattern.\r\n    #[test]\r\n    fn flagged_spawn_still_starts() {\r\n        // A no-arg program present on each platform that TranslationChild can spawn as\r\n        // a stdin→stdout child (it need not speak the protocol — we only assert the\r\n        // CREATE_NO_WINDOW spawn succeeds, then reap via terminate/Drop).\r\n        #[cfg(windows)]\r\n        let prog = \"cmd\";\r\n        #[cfg(unix)]\r\n        let prog = \"cat\";\r\n        let (tx, _rx) = std::sync::mpsc::channel::<KeyCmd>();\r\n        match TranslationChild::spawn(&[prog.to_string()], tx) {\r\n…\n        }\n    }\n…\n}","startLine":235,"lineNumbers":[235,null,245,null,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,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,null,422,423,null,507]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\translation.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":508,"totalBytes":6325,"outputLines":160,"outputBytes":6325,"shownRange":{"start":258,"end":417},"nextOffset":418}}},"isError":false,"timestamp":1784272125956}}
{"type":"message","id":"6ab7ad5e","parentId":"fc2fe3d4","timestamp":"2026-07-17T07:08:45.976Z","message":{"role":"toolResult","toolCallId":"call_Ww7gG7ifeksXHs6dKuHGaDRR|fc_0365286983a6ba82016a59d4fcb410819483bc1fab69c05c9f","toolName":"read","content":[{"type":"text","text":"    pub(crate) fn subscribe_stream(\n…\n    ) -> io::Result<()> {\n        let log = {\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    /// 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[Showing lines 1964-2003 of 2865. Use :2004 to continue]"}],"details":{"truncation":{"content":"            Arc::clone(&e.log)\r\n        };\r\n        // Install the seat WITH its replay snapshot in one atomic critical\r\n        // section (ADR-0038 Amendment fix 3, gate follow-up): the snapshot\r\n        // handoff is a memory move; the seat's writer thread performs every\r\n        // conn write outside the mutex, replay first, live after — so a\r\n        // producer appending concurrently can never slot a live frame into\r\n        // the middle of the replay (the \"got seq 134 want 6\" re-serve red).\r\n        // A replay write failure poisons the seat writer-side; the next\r\n        // producer enqueue halt-and-removes it (the T1 discipline).\r\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n        log.lock().unwrap().begin_attach(Arc::clone(&sub), from_seq)?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Detach `sub` from a stream iff it is the current subscriber (brain\r\n    /// disconnect cleanup; the stream + its ring persist).\r\n    pub(crate) fn detach_stream_sub(&self, stream_id: u64, sub: &SharedSend) {\r\n        let log = {\r\n            let streams = self.shared.streams.lock().unwrap();\r\n            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\r\n        };\r\n        if let Some(log) = log {\r\n            log.lock().unwrap().detach_if(sub);\r\n        }\r\n    }\r\n\r\n    /// Attach `sub` as the presence subscriber, replaying liveness events from\r\n    /// `from_seq` (D4c) — the stream `subscribe` discipline on the conn table.\r\n    // [impl->REQ-EP-4]\r\n    pub(crate) fn subscribe_presence(&self, sub: SharedSend, from_seq: u64) {\r\n        // Same atomic install-with-replay discipline as subscribe_stream\r\n        // (the PresenceLog mirror): the seat's writer drains the replay\r\n        // before any live event, conn I/O outside the mutex. A replay write\r\n        // failure poisons the seat; the next push halt-and-removes it — the\r\n        // brain re-subscribes from its cursor.\r\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n        let _ = self\r\n            .shared\r\n            .presence\r","truncated":true,"truncatedBy":"lines","totalLines":902,"totalBytes":2031,"outputLines":40,"outputBytes":2031,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub(crate) fn subscribe_stream(\n…\n    ) -> io::Result<()> {\n        let log = {\n…\n            Arc::clone(&e.log)\r\n        };\r\n        // Install the seat WITH its replay snapshot in one atomic critical\r\n        // section (ADR-0038 Amendment fix 3, gate follow-up): the snapshot\r\n        // handoff is a memory move; the seat's writer thread performs every\r\n        // conn write outside the mutex, replay first, live after — so a\r\n        // producer appending concurrently can never slot a live frame into\r\n        // the middle of the replay (the \"got seq 134 want 6\" re-serve red).\r\n        // A replay write failure poisons the seat writer-side; the next\r\n        // producer enqueue halt-and-removes it (the T1 discipline).\r\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n        log.lock().unwrap().begin_attach(Arc::clone(&sub), from_seq)?;\r\n        Ok(())\r\n    }\r\n\r\n    /// Detach `sub` from a stream iff it is the current subscriber (brain\r\n    /// disconnect cleanup; the stream + its ring persist).\r\n    pub(crate) fn detach_stream_sub(&self, stream_id: u64, sub: &SharedSend) {\r\n        let log = {\r\n            let streams = self.shared.streams.lock().unwrap();\r\n            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\r\n        };\r\n        if let Some(log) = log {\r\n            log.lock().unwrap().detach_if(sub);\r\n        }\r\n    }\r\n\r\n    /// Attach `sub` as the presence subscriber, replaying liveness events from\r\n    /// `from_seq` (D4c) — the stream `subscribe` discipline on the conn table.\r\n    // [impl->REQ-EP-4]\r\n    pub(crate) fn subscribe_presence(&self, sub: SharedSend, from_seq: u64) {\r\n        // Same atomic install-with-replay discipline as subscribe_stream\r\n        // (the PresenceLog mirror): the seat's writer drains the replay\r\n        // before any live event, conn I/O outside the mutex. A replay write\r\n        // failure poisons the seat; the next push halt-and-removes it — the\r\n        // brain re-subscribes from its cursor.\r\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n        let _ = self\r\n            .shared\r\n            .presence\r\n            .lock()\n            .unwrap()\n            .begin_attach(Arc::clone(&sub), from_seq); // busy refusal: quiet, as before\n    }","startLine":1950,"lineNumbers":[1950,null,1955,1956,null,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":2031,"outputLines":40,"outputBytes":2031,"shownRange":{"start":1964,"end":2003},"nextOffset":2004}}},"isError":false,"timestamp":1784272125976}}
{"type":"message","id":"7cfc7f20","parentId":"6ab7ad5e","timestamp":"2026-07-17T07:08:45.995Z","message":{"role":"toolResult","toolCallId":"call_zx9da9SLTFSxc14X1pmyqPq4|fc_0365286983a6ba82016a59d4fcb1708194bf3ef72856e1e6cd","toolName":"read","content":[{"type":"text","text":"    /// rolled (a `from_seq` below this floor makes the brain's gap check\n    /// reject the resume). `next_seq` when the ring is empty.\n    fn floor_seq(&self) -> u64 {\n        self.ring.front().map(|(s, _)| *s).unwrap_or(self.next_seq)\n    }\n\n    /// Mark this log retentive with backpressure `cap` (chunks). Idempotent set.\n    fn set_retentive(&mut self, cap: usize) {\n        self.retentive_cap = cap;\n    }\n\n    /// Append a freshly-read chunk: assign the next `seq`, retain it in the ring,\n    /// live-send to the current subscriber. Read-pump only. A non-retentive log\n    /// cap-evicts the oldest chunks past `cap_chunks`; a retentive (tunnel) log\n    /// never evicts — bytes leave only via [`drain`](Self::drain).\n    fn append(&mut self, bytes: &[u8]) {\n        // Opener capture (ADR-0038 B): pin the first NDJSON line as it streams\n        // past, before ring bounds can ever evict it. One-shot: `Pinned` and\n        // `Oversize` are terminal states.\n        // [impl->REQ-STREAM-OPENER-DURABLE]\n        if let OpenerCapture::Buffering(buf) = &mut self.opener {\n            match bytes.iter().position(|&b| b == b'\\n') {\n                Some(nl) => {\n                    buf.extend_from_slice(&bytes[..nl]);\n                    let line = std::mem::take(buf);\n                    self.opener = if line.len() > OPENER_PIN_MAX {\n                        OpenerCapture::Oversize\n                    } else {\n                        OpenerCapture::Pinned(line)\n                    };\n                }\n                None => {\n                    buf.extend_from_slice(bytes);\n                    if buf.len() > OPENER_PIN_MAX {\n                        self.opener = OpenerCapture::Oversize;\n                    }\n                }\n            }\n        }\n        let seq = self.next_seq;\n        self.next_seq += 1;\n        self.ring.push_back((seq, bytes.to_vec()));\n        if self.retentive_cap == 0 {\n            while self.ring.len() > self.cap_chunks {\n                self.ring.pop_front();\n            }\n        }\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_data_envelope(self.stream_id, seq, bytes);\n            // ENQUEUE only (ADR-0038 Amendment fix 3): the conn I/O runs on\n            // the seat's writer thread, outside this mutex — a wedged\n            // subscriber can no longer park this producer OR the lock.\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Remove the current seat after an enqueue failure (halt-at-first-\n    /// failure, all producer sites): a POISON also cancels the stream's\n    /// lease so the paired serve/wire worker terminates (Amendment fix 4);\n    /// an OVERFLOW just detaches — the brain resumes from its cursor.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn drop_seat(&mut self, fail: SeatFail) {\n        if let Some(seat) = self.subscriber.take() {\n            seat.sub.lifecycle_event(\n                \"stream-sub-halt\",\n                &format!(\"stream={} reason={fail:?}\", self.stream_id),\n            );\n            if fail == SeatFail::Poisoned {\n                self.lease.cancel();\n            }\n        }\n    }\n\n    /// Drain every undrained chunk in order (the shell-tunnel recv cursor, W3).\n    /// Pops the whole ring front-to-back (FIFO by `seq`) and concatenates the\n    /// bytes — chunk boundaries are arbitrary read-pump splits, irrelevant to an\n    /// opaque byte stream. Lossless + ordered: a byte leaves the ring only here,\n    /// once. Returns `(bytes, finished)`; `finished` reflects a clean/torn end so\n    /// the poller sees EOF and closes. Empty bytes with `finished=false` ⇒ nothing\n    /// pending yet.\n    fn drain(&mut self) -> (Vec<u8>, bool) {\n        let mut out = Vec::new();\n        while let Some((_, chunk)) = self.ring.pop_front() {\n            out.extend_from_slice(&chunk);\n        }\n        (out, self.finished)\n    }\n\n    /// Mark the read side finished and tell the subscriber (with the final\n    /// cursor, so it can verify completeness).\n    fn finish(&mut self) {\n        self.finished = true;\n        if let Some(seat) = &self.subscriber {\n            let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);\n            // Enqueue only — same discipline as append (Amendment fix 2:\n            // ALL producer sites halt-and-remove, finish included).\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n            if let Err(fail) = seat.enqueue(frame) {\n                self.drop_seat(fail);\n            }\n        }\n    }\n\n    /// Install `sub` as the subscriber with the replay snapshot (retained\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\n    /// replay-then-live seq order is structural (see\n    /// [`SubscriberSeat::install`]), while every conn write still happens\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\n    /// under the lock with discarded write errors, the exact serial-poison\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\n    ///\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\n    /// a replacement subscriber is never installed until the prior one is\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\n        if let Some(prior) = &self.subscriber {\n            // No-reinstall-until-gone applies to the POISON class only\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\n            // 15s bounded write — installing a replacement now would hand the\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\n            // DISPLACED as before (the newer-brain-takes-over contract).\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\n                return Err(io::Error::new(\n                    io::ErrorKind::WouldBlock,\n                    format!(\n                        \"stream {} subscriber busy: prior subscriber still draining\",\n                        self.stream_id\n                    ),\n                ));\n            }\n            // Healthy displacement, prior fully gone, or same sub re-attach.\n            self.subscriber = None;\n        }\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\n        // record — this is one of the two RCA-pinned shared-carrier classes.\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\n        sub.lifecycle_event(\n            \"stream-sub-attach\",\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\n        );\n        let mut replay: Vec<Envelope> = self\n            .ring\n            .iter()\n            .filter(|(s, _)| *s >= from_seq)\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\n            .collect();\n        if self.finished {\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\n        }\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\n        // prior writer — poisoned OR healthily displaced — holds only its own\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\n        // brain-swap displacement left the displaced writer and the successor\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\n        // write failure (its conn dying — every daemon refresh) canceled the\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\n        // displaced stream on exactly the post-refresh path this wave calms.\n        // One poison never dead-ends the stream (T5 recovery): the next\n…\n    }\n\n[Showing lines 399-563 of 2865. Use :564 to continue]"}],"details":{"truncation":{"content":"    /// rolled (a `from_seq` below this floor makes the brain's gap check\r\n    /// reject the resume). `next_seq` when the ring is empty.\r\n    fn floor_seq(&self) -> u64 {\r\n        self.ring.front().map(|(s, _)| *s).unwrap_or(self.next_seq)\r\n    }\r\n\r\n    /// Mark this log retentive with backpressure `cap` (chunks). Idempotent set.\r\n    fn set_retentive(&mut self, cap: usize) {\r\n        self.retentive_cap = cap;\r\n    }\r\n\r\n    /// Append a freshly-read chunk: assign the next `seq`, retain it in the ring,\r\n    /// live-send to the current subscriber. Read-pump only. A non-retentive log\r\n    /// cap-evicts the oldest chunks past `cap_chunks`; a retentive (tunnel) log\r\n    /// never evicts — bytes leave only via [`drain`](Self::drain).\r\n    fn append(&mut self, bytes: &[u8]) {\r\n        // Opener capture (ADR-0038 B): pin the first NDJSON line as it streams\r\n        // past, before ring bounds can ever evict it. One-shot: `Pinned` and\r\n        // `Oversize` are terminal states.\r\n        // [impl->REQ-STREAM-OPENER-DURABLE]\r\n        if let OpenerCapture::Buffering(buf) = &mut self.opener {\r\n            match bytes.iter().position(|&b| b == b'\\n') {\r\n                Some(nl) => {\r\n                    buf.extend_from_slice(&bytes[..nl]);\r\n                    let line = std::mem::take(buf);\r\n                    self.opener = if line.len() > OPENER_PIN_MAX {\r\n                        OpenerCapture::Oversize\r\n                    } else {\r\n                        OpenerCapture::Pinned(line)\r\n                    };\r\n                }\r\n                None => {\r\n                    buf.extend_from_slice(bytes);\r\n                    if buf.len() > OPENER_PIN_MAX {\r\n                        self.opener = OpenerCapture::Oversize;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        let seq = self.next_seq;\r\n        self.next_seq += 1;\r\n        self.ring.push_back((seq, bytes.to_vec()));\r\n        if self.retentive_cap == 0 {\r\n            while self.ring.len() > self.cap_chunks {\r\n                self.ring.pop_front();\r\n            }\r\n        }\r\n        if let Some(seat) = &self.subscriber {\r\n            let frame = net_stream_data_envelope(self.stream_id, seq, bytes);\r\n            // ENQUEUE only (ADR-0038 Amendment fix 3): the conn I/O runs on\r\n            // the seat's writer thread, outside this mutex — a wedged\r\n            // subscriber can no longer park this producer OR the lock.\r\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n            if let Err(fail) = seat.enqueue(frame) {\r\n                self.drop_seat(fail);\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Remove the current seat after an enqueue failure (halt-at-first-\r\n    /// failure, all producer sites): a POISON also cancels the stream's\r\n    /// lease so the paired serve/wire worker terminates (Amendment fix 4);\r\n    /// an OVERFLOW just detaches — the brain resumes from its cursor.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn drop_seat(&mut self, fail: SeatFail) {\r\n        if let Some(seat) = self.subscriber.take() {\r\n            seat.sub.lifecycle_event(\r\n                \"stream-sub-halt\",\r\n                &format!(\"stream={} reason={fail:?}\", self.stream_id),\r\n            );\r\n            if fail == SeatFail::Poisoned {\r\n                self.lease.cancel();\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Drain every undrained chunk in order (the shell-tunnel recv cursor, W3).\r\n    /// Pops the whole ring front-to-back (FIFO by `seq`) and concatenates the\r\n    /// bytes — chunk boundaries are arbitrary read-pump splits, irrelevant to an\r\n    /// opaque byte stream. Lossless + ordered: a byte leaves the ring only here,\r\n    /// once. Returns `(bytes, finished)`; `finished` reflects a clean/torn end so\r\n    /// the poller sees EOF and closes. Empty bytes with `finished=false` ⇒ nothing\r\n    /// pending yet.\r\n    fn drain(&mut self) -> (Vec<u8>, bool) {\r\n        let mut out = Vec::new();\r\n        while let Some((_, chunk)) = self.ring.pop_front() {\r\n            out.extend_from_slice(&chunk);\r\n        }\r\n        (out, self.finished)\r\n    }\r\n\r\n    /// Mark the read side finished and tell the subscriber (with the final\r\n    /// cursor, so it can verify completeness).\r\n    fn finish(&mut self) {\r\n        self.finished = true;\r\n        if let Some(seat) = &self.subscriber {\r\n            let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);\r\n            // Enqueue only — same discipline as append (Amendment fix 2:\r\n            // ALL producer sites halt-and-remove, finish included).\r\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n            if let Err(fail) = seat.enqueue(frame) {\r\n                self.drop_seat(fail);\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Install `sub` as the subscriber with the replay snapshot (retained\r\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\r\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\r\n    /// replay-then-live seq order is structural (see\r\n    /// [`SubscriberSeat::install`]), while every conn write still happens\r\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\r\n    /// under the lock with discarded write errors, the exact serial-poison\r\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\r\n    ///\r\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\r\n    /// a replacement subscriber is never installed until the prior one is\r\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\r\n        if let Some(prior) = &self.subscriber {\r\n            // No-reinstall-until-gone applies to the POISON class only\r\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\r\n            // 15s bounded write — installing a replacement now would hand the\r\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\r\n            // DISPLACED as before (the newer-brain-takes-over contract).\r\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\r\n                return Err(io::Error::new(\r\n                    io::ErrorKind::WouldBlock,\r\n                    format!(\r\n                        \"stream {} subscriber busy: prior subscriber still draining\",\r\n                        self.stream_id\r\n                    ),\r\n                ));\r\n            }\r\n            // Healthy displacement, prior fully gone, or same sub re-attach.\r\n            self.subscriber = None;\r\n        }\r\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\r\n        // record — this is one of the two RCA-pinned shared-carrier classes.\r\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\r\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\r\n        sub.lifecycle_event(\r\n            \"stream-sub-attach\",\r\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\r\n        );\r\n        let mut replay: Vec<Envelope> = self\r\n            .ring\r\n            .iter()\r\n            .filter(|(s, _)| *s >= from_seq)\r\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\r\n            .collect();\r\n        if self.finished {\r\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\r\n        }\r\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\r\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\r\n        // prior writer — poisoned OR healthily displaced — holds only its own\r\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\r\n        // brain-swap displacement left the displaced writer and the successor\r\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\r\n        // write failure (its conn dying — every daemon refresh) canceled the\r\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\r\n        // displaced stream on exactly the post-refresh path this wave calms.\r\n        // One poison never dead-ends the stream (T5 recovery): the next\r","truncated":true,"truncatedBy":"lines","totalLines":2467,"totalBytes":8287,"outputLines":165,"outputBytes":8287,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    /// rolled (a `from_seq` below this floor makes the brain's gap check\r\n    /// reject the resume). `next_seq` when the ring is empty.\r\n    fn floor_seq(&self) -> u64 {\r\n        self.ring.front().map(|(s, _)| *s).unwrap_or(self.next_seq)\r\n    }\r\n\r\n    /// Mark this log retentive with backpressure `cap` (chunks). Idempotent set.\r\n    fn set_retentive(&mut self, cap: usize) {\r\n        self.retentive_cap = cap;\r\n    }\r\n\r\n    /// Append a freshly-read chunk: assign the next `seq`, retain it in the ring,\r\n    /// live-send to the current subscriber. Read-pump only. A non-retentive log\r\n    /// cap-evicts the oldest chunks past `cap_chunks`; a retentive (tunnel) log\r\n    /// never evicts — bytes leave only via [`drain`](Self::drain).\r\n    fn append(&mut self, bytes: &[u8]) {\r\n        // Opener capture (ADR-0038 B): pin the first NDJSON line as it streams\r\n        // past, before ring bounds can ever evict it. One-shot: `Pinned` and\r\n        // `Oversize` are terminal states.\r\n        // [impl->REQ-STREAM-OPENER-DURABLE]\r\n        if let OpenerCapture::Buffering(buf) = &mut self.opener {\r\n            match bytes.iter().position(|&b| b == b'\\n') {\r\n                Some(nl) => {\r\n                    buf.extend_from_slice(&bytes[..nl]);\r\n                    let line = std::mem::take(buf);\r\n                    self.opener = if line.len() > OPENER_PIN_MAX {\r\n                        OpenerCapture::Oversize\r\n                    } else {\r\n                        OpenerCapture::Pinned(line)\r\n                    };\r\n                }\r\n                None => {\r\n                    buf.extend_from_slice(bytes);\r\n                    if buf.len() > OPENER_PIN_MAX {\r\n                        self.opener = OpenerCapture::Oversize;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        let seq = self.next_seq;\r\n        self.next_seq += 1;\r\n        self.ring.push_back((seq, bytes.to_vec()));\r\n        if self.retentive_cap == 0 {\r\n            while self.ring.len() > self.cap_chunks {\r\n                self.ring.pop_front();\r\n            }\r\n        }\r\n        if let Some(seat) = &self.subscriber {\r\n            let frame = net_stream_data_envelope(self.stream_id, seq, bytes);\r\n            // ENQUEUE only (ADR-0038 Amendment fix 3): the conn I/O runs on\r\n            // the seat's writer thread, outside this mutex — a wedged\r\n            // subscriber can no longer park this producer OR the lock.\r\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n            if let Err(fail) = seat.enqueue(frame) {\r\n                self.drop_seat(fail);\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Remove the current seat after an enqueue failure (halt-at-first-\r\n    /// failure, all producer sites): a POISON also cancels the stream's\r\n    /// lease so the paired serve/wire worker terminates (Amendment fix 4);\r\n    /// an OVERFLOW just detaches — the brain resumes from its cursor.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn drop_seat(&mut self, fail: SeatFail) {\r\n        if let Some(seat) = self.subscriber.take() {\r\n            seat.sub.lifecycle_event(\r\n                \"stream-sub-halt\",\r\n                &format!(\"stream={} reason={fail:?}\", self.stream_id),\r\n            );\r\n            if fail == SeatFail::Poisoned {\r\n                self.lease.cancel();\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Drain every undrained chunk in order (the shell-tunnel recv cursor, W3).\r\n    /// Pops the whole ring front-to-back (FIFO by `seq`) and concatenates the\r\n    /// bytes — chunk boundaries are arbitrary read-pump splits, irrelevant to an\r\n    /// opaque byte stream. Lossless + ordered: a byte leaves the ring only here,\r\n    /// once. Returns `(bytes, finished)`; `finished` reflects a clean/torn end so\r\n    /// the poller sees EOF and closes. Empty bytes with `finished=false` ⇒ nothing\r\n    /// pending yet.\r\n    fn drain(&mut self) -> (Vec<u8>, bool) {\r\n        let mut out = Vec::new();\r\n        while let Some((_, chunk)) = self.ring.pop_front() {\r\n            out.extend_from_slice(&chunk);\r\n        }\r\n        (out, self.finished)\r\n    }\r\n\r\n    /// Mark the read side finished and tell the subscriber (with the final\r\n    /// cursor, so it can verify completeness).\r\n    fn finish(&mut self) {\r\n        self.finished = true;\r\n        if let Some(seat) = &self.subscriber {\r\n            let frame = net_stream_eof_envelope(self.stream_id, self.next_seq);\r\n            // Enqueue only — same discipline as append (Amendment fix 2:\r\n            // ALL producer sites halt-and-remove, finish included).\r\n            // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n            if let Err(fail) = seat.enqueue(frame) {\r\n                self.drop_seat(fail);\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Install `sub` as the subscriber with the replay snapshot (retained\r\n    /// chunks with `seq >= from_seq`, then eof if already finished) handed to\r\n    /// its seat's WRITER THREAD, which drains it before any live frame — the\r\n    /// replay-then-live seq order is structural (see\r\n    /// [`SubscriberSeat::install`]), while every conn write still happens\r\n    /// OUTSIDE this mutex (the pre-Amendment shape replayed the whole ring\r\n    /// under the lock with discarded write errors, the exact serial-poison\r\n    /// engine of the v0.34 field stalls). Returns the replay frame count.\r\n    ///\r\n    /// Refuses while a prior seat writer is still alive (`WouldBlock`):\r\n    /// a replacement subscriber is never installed until the prior one is\r\n    /// fully gone (REQ-DISPATCH-FALLBACK-CIRCUIT no-reinstall rule).\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    fn begin_attach(&mut self, sub: SharedSend, from_seq: u64) -> io::Result<usize> {\r\n        if let Some(prior) = &self.subscriber {\r\n            // No-reinstall-until-gone applies to the POISON class only\r\n            // (REQ-DISPATCH-FALLBACK-CIRCUIT): a wedged writer may sit in a\r\n            // 15s bounded write — installing a replacement now would hand the\r\n            // retry machinery a fresh replay victim. A HEALTHY prior seat is\r\n            // DISPLACED as before (the newer-brain-takes-over contract).\r\n            if prior.poisoned.load(Ordering::Acquire) && !prior.gone() && !prior.is(&sub) {\r\n                return Err(io::Error::new(\r\n                    io::ErrorKind::WouldBlock,\r\n                    format!(\r\n                        \"stream {} subscriber busy: prior subscriber still draining\",\r\n                        self.stream_id\r\n                    ),\r\n                ));\r\n            }\r\n            // Healthy displacement, prior fully gone, or same sub re-attach.\r\n            self.subscriber = None;\r\n        }\r\n        // Attribution (F-039 legs b+d): stream-subscriber role fact + attach\r\n        // record — this is one of the two RCA-pinned shared-carrier classes.\r\n        // [impl->REQ-CONN-POISON-ATTRIBUTION]\r\n        sub.describe(&format!(\"stream-subscriber stream={}\", self.stream_id));\r\n        sub.lifecycle_event(\r\n            \"stream-sub-attach\",\r\n            &format!(\"stream={} from_seq={from_seq}\", self.stream_id),\r\n        );\r\n        let mut replay: Vec<Envelope> = self\r\n            .ring\r\n            .iter()\r\n            .filter(|(s, _)| *s >= from_seq)\r\n            .map(|(seq, bytes)| net_stream_data_envelope(self.stream_id, *seq, bytes))\r\n            .collect();\r\n        if self.finished {\r\n            replay.push(net_stream_eof_envelope(self.stream_id, self.next_seq));\r\n        }\r\n        // Mint a FRESH lease at EVERY install (Amendment fix 4 + gate round 1\r\n        // on the fix PR): each subscriber generation gets its OWN Arc, and a\r\n        // prior writer — poisoned OR healthily displaced — holds only its own\r\n        // generation's handle. Renewal-on-canceled alone was WRONG: a healthy\r\n        // brain-swap displacement left the displaced writer and the successor\r\n        // SHARING one Arc, so the displaced writer's eventual queued-frame\r\n        // write failure (its conn dying — every daemon refresh) canceled the\r\n        // SUCCESSOR's lease: a spurious serve-kill + breaker trip per\r\n        // displaced stream on exactly the post-refresh path this wave calms.\r\n        // One poison never dead-ends the stream (T5 recovery): the next\r\n…\n    }","startLine":399,"lineNumbers":[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,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,null,576]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":8287,"outputLines":165,"outputBytes":8287,"shownRange":{"start":399,"end":563},"nextOffset":564}}},"isError":false,"timestamp":1784272125995}}
{"type":"message","id":"29f47438","parentId":"7cfc7f20","timestamp":"2026-07-17T07:09:22.780Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing Rust struct drop order in HostedSession**\n\n**Identifying PTY drain thread leak on Windows**\n\n**Reviewing Drain Drop and watchdog lifecycle**"},{"type":"thinking","thinking":"**Tracing Arc cycle in BrokerConn drop**\n\n**Analyzing connection seat and thread cleanup semantics**"},{"type":"toolCall","id":"call_nspCw8zcJjLt46obDsqfkqkD|fc_0365286983a6ba82016a59d52189e08194a632ba232f1a6677","name":"read","arguments":{"i":"Reading hosted session fields","path":"crates/spt-daemon/src/broker.rs","selector":"1645-1770"}},{"type":"toolCall","id":"call_wC5pDtcQqJmUmmMrUm2lHUfd|fc_0365286983a6ba82016a59d52189f481949529956624ae57d8","name":"grep","arguments":{"i":"Checking drain drop implementation","pattern":"impl Drop for Drain|impl Drop for HostedSession|impl Drop for InputWriter|impl Drop for ControllerSink|impl Drop for ViewerSink","path":"crates/spt-daemon/src; crates/spt-term/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_ROVNNq7UBWwF41TsyVcPizPO|fc_0365286983a6ba82016a59d5218a008194adab694601b09a23","name":"read","arguments":{"i":"Reading PTY teardown contract","path":"crates/spt-term/src/reader.rs","selector":"1-68"}},{"type":"toolCall","id":"call_icTflxa7VLtZBAZAPBNWA2hD|fc_0365286983a6ba82016a59d5218a0c8194986813bf4c7c5f21","name":"grep","arguments":{"i":"Finding translation container type","pattern":"struct Translation|impl Drop for Translation|event_tx|fn run_inject_worker","path":"crates/spt-daemon/src/broker.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_vOfcKspXk1pa23cM3zLtWND2|fc_0365286983a6ba82016a59d5218a188194a5c96a508bf6883f","name":"read","arguments":{"i":"Reading conn watchdog lifecycle","path":"crates/spt-daemon/src/conn.rs","selector":"414-455,625-665"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":15661,"output":1175,"cacheRead":107008,"cacheWrite":0,"totalTokens":123844,"reasoningTokens":895,"cost":{"input":0.078305,"output":0.035250000000000004,"cacheRead":0.053503999999999996,"cacheWrite":0,"total":0.167059}},"stopReason":"toolUse","timestamp":1784272126050,"responseId":"resp_0365286983a6ba82016a59d4fe60348194b0647918039d117a","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5014ff081948c8d8c70669dc661","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdUReGb8z4S9LaAYVc28uGke5tHjE81ysjkvgmpL0u7h1rweH8QN4FyQrqkLhWhQfSukUn7Ydf1dmkuBgP6vaG7y-mYram9V5bRYgOPfITRyZ6QImt_iGIAEHJZbfOAnFgPcKQMrmSseSNU3Al6zXtK4hyvBsoQ3ptSho0jW7iuOEcKsLCPWwqu8tLPncLCP-NJ10qJi_EwisUQutnTp4CTvTg_Id8l50qvna7Ikz2l8Z4PeoVH0hP09Kdvw_oPlaR5OmSj9GhpevXklcRFi36CoxMJsRBCta296YZ17HISPHtEAZDD1DYHuSqhHOogfi8DBRxjMEi5d3j7cof1tDIhwSyTuPAGec4ympz5oWgSgI9u4tUj-AMDnjpSaZ9yb_xKYH-D2NwlKxC1nVlVVS2RVxgENSzpy0R2FW71qynRe55Vv1clSAsr2RhjTQqEhbZt16V_bPFfs1r-mI55rHtkWZ_z0PyXEFDO1Z3X0cebj7nYuoHE-D68-vKLjYcUqRpynwn2W7ILo22h18FfX_-a2HWi_-xdv2_DtDBTi3b-6mlgq-38dvfRrod0cVZmd7Ix5GIkpzQYP4GwAkZ2JRyu_2pXlRmZ2N333lXqNh6GW3wYenTa8dmYsGDXmCSP13f2aKyB0K79abuCvc-OWOpOCnQAEoo5wnu1dJeSZdi0Fi0h60mH6dcZyD08iOvPUq4KISqDEuep-ZmFwbG98bRHD_iec7QUy-vcfR_bcplnK9RsEfbVluiJvxudFRojXa-Q_lgLIrZcWuR8iq7h7I3mdoQMNcIXbNTZs3cbb4x2CGKdtFW9bSrUiEPBdRkCSbx9toeHm_tw0cRX9Lm5GS6_-dDUj407jSOqfptdgSp25_B9_cRNxWuvR8_lMOiDG2wbeIA4WqZkTC99pwpSLApoXlIz2DGbsedQPUjfwhju6Fczt1SPS8mriahfaa41e20L8f0zUkHO-fj39utfTm_ar82cwhajaxnor7SmUIE3swgrPGOOY5huNRO-EDVlpvncQy7b5yFtEqSqkDcxzY9B-3fXtXtwIy4I1Q8MRWW9ajTj2c3fy2HhwtZH7z9GVX6I8iAjHp7IB7iZH7sorJYs9bmqHNjAGfY5fzWCofeZ6m3rlll-ZqLDkG8JlBbHqQFttUyqv8U6x3k_38z7ilBCigP6qBUu_9-iVRxGrOxeCbjCoPhmkWvSZI7-8HyxFyyDHkDpuL-TRwzQqLytQWAA2IZbQthWIXzNPZWPtOCW06TqxVDsDZQjfu_0R15hGvtA-1djo5c9Su3DTDRFfbye6sBbhR_VMK2HXsm5RCHjepKBWXwOcbCyRT4DLUnFLqdhah1OohmB4NXL1-QXVAGi1SxRAjYpL7MshdSCbtUd9dSWB-aQAhkGemnLlVnBaH9uNhbRse3RO-X8R6U7lKvHrVkT3XeeO4aVzrXd964yBLabQAeg88n4YSZD-UkizQkm7EsXwJtAKRMGzShvnH__tmG27Hdc6V0TExHbCVrYoPdeb8WWpyh8NR24yy76O6QF89XGiJRv6gAHbAcm73XGfn6CQhYw1LYPVHp5GPL7xQfjlw7XJBCqXYz7msOe4piNGHnRdH7GO7baJVvK5IXTsjp5QnChE6hlFY0e43kbnutEJwrOf5x53T-TVk_AyMrFwCWq8CSL8YLCSi7iHHsxRbW6T90JhBcJxVcQscOEu_CTkJ1D0g-_6KLBsSZiaw7jISiYnth49aSuwB4kW7NW36z5UFnPJra_A8GzU1yDn4XD9sNY3683P-p_AgWxhIH48LC4XdmoNibpB88Y0gC8EHfeN49NViRyBnMgUslxB8ef-rQ9vvacZToadMUQdmUoTwDJUtcpa71F3pMSrN1AxdUAcgh9N5Onz9dmcVjrCmthqF3SUgz_NZL3anHVklmf5kdP2r2f2UJ2Xox5cadpTzxX4_cltczoSkuFC9e615mMsSyfr1uS1ADecp5uFOvxl2xMYmdSmDzE6hoinwvV5NClDgGArJ7ZCsA3yaF2qTmgXhU0KcJkBWify4-YlvviYr5MMEek7LNs__2sUPFSisZdTAVfDePTHZWlaQ2OO__itIGA-D_BavE4bjP37oyMKGlDvSi5ZyH-8GN67ac2y04_lNmsGA6U87riMCuokZ65wg_Fc9zJvu8PWtdLCPKpUxeDLXI9hRxS54XRVzJYTw623SvXcVkatxR9m740qn-gcqi701AQyNvxirATCb3pQ6OArmp9NWXpgAdAieUo6fyqlFPkKGYCQGPDlbOXZmNI_XV3hbtMp5IB0Zi6nylXRXyVorkbjRo5HGuQUiI-hWl7C5kzS98A8D5MQtnR7Vtl-kDCp-244bxo03rUA_vOmPdUiQAPGG3gS9Wh6kTwSQzuztGwWmL_w3oXqHsP9oaN9NFp18_HtaL3xkdCXi_MC1t6y5NVb_zhnocPO_Rht_xv1ymdbGrt5eJLeIDXkH2G8bDRjG7DgLfH526FpgsCCgvnI9kE7Z5A_2XnTkeaWUMao6lXQbsaDn31pfTi3kM6SGY2cOuYVmchLl4DlamrmryvL5RuM65D7uMrmd55I2OjgzrktTISKTkVk4j_FCwZGJaOSoxrlNyCvunO5tgcB8mI-Yn2ZzzZWInBbFjrSzSFTIdvS-zc16XS3FnpKUzokB1hJCOJUbrzrgAjcscefqhnkvghrhavvVDXy9YJKs9kvZCa4tI93E4Y5HyfcX9IZsl2aCIbKvlSC4sMIm-a7yP1KKPzHggqKHLvoZaaEfii9vzZ4Ph50kvLPxCN08gn4nxdaxvDLNUA_MeZJQCzAv5s5UnFvRuM87BFZeV7WMhXAoRuX2vG2hMS5ZrdPYFrkOWPoqVF2ULAoheZes9kY8HYvCBrJdYPl8m9qUBuDlrhuSXCwgByoBuNcKCKQQ0-dBUMYABaTlE4E2q0N_Gsxc57d-fkhg4najmujJw83_CW6d8vVyk9IxJGKUIRm7Fl1qb3Re9T1y2gZr57s3dZ_jLuQO3sYe9KbSbpTfQ73D0ibobw6K0g6W8njGlOddPwkXeredsQ3RBlJc4G-kwWVwMqA9F_2XcRr9xSp5VZpuRjTjxKGEh99wk5nd_EG0qbNpyTb-FhcghTEiEOCT6Oya0bVZkflUhUnyJD8iJQxGdEzc5lfkD_UmhOkHEk-iCOjTUZKc0dvJBkLz5IPE4DGXWrnUKNRTOplND0OaYQYtj-9kFCs1muFtH3DQ1gnAbxB4SkM4fklwCnXIGjvALKdwnhRuj1SPWcHTK3HdIgdhCLsMj-uCNyerJci9onGV2QZoahXPT06tyYRbE2cdPzr-zGIVx9eP2zLEey9OjKRjV7zdoPIG3OAlB0WzZEkrF7Kq9atDX_w1Kr026a7AMYljQwoSPxxowzJHYZWTVzpalx6dXnxwyJ_iIo_k3HRpr8fO0YjXSq26MIEAYrEtszlxtknWMwmhkHbVmT79E2zySEnTz4QIjwXSPRCZ0qf-f1mMLbDm8FlqTKHEAjMurFjxtLkeWT1YUD2SH0Wan3Q13GKA9S8wXUszbP6V4x-3IFXswUEq3utjMCc0nH76toTgnKT8p95lPtgYO8eWPLnyLMjahTBnZkT0eZQ8j0_Nav4WBw_FZHEKKY9vWGBDvN1ZOoRrX6IKskuByrsGGgFO647hJuyKpPW_8sXmN5jh_BMfjOE9doF2PtsTjo9NMnj0kfJwVj8FYSacHwaV-5bjEqriW7gMBMdcEdB6Z8xJkKsHbyVjeQRBQDDwMClAj0WghHFFwL7uFBzfbXJ9bDril1k8u-ibF8sh-uGx7Fl0yxsewPd71JfzzHGllrjWntKd6UFPwY1wrgAwJxJ3XmjTC9m2g6uD489LiTVPRHruVYa2AUMoAWBCSmwODEMawFVInBAaPemWcCq0rDxiUk_AR3fLHTDy0S4JdiADAHXv6jY8GdoQeU9_nXM8gZdklEkq5qfZyZk2KsQ2l9svzpwfJwszfuG6Y9OcvKBoyyxp5Yezp7c45U1_eZ4WGudIKzzbB7UeyMP4H3qcYAOBc0uFtFCbR28MxJgmGwp29Vh3_P5j3rRIby1fX4gcr4N6gG0NMbMcpDdznruz1yv_SpTjQb4wz6GF7Jjs4_Jk1qiMJyC8IlbQcKEaDs5dbzhlvvglEXymFl1IXpvKheESE-wqNyAhc-GHxMF-lCzqlKiVXwHV7_-hgSDpP-F-M75vNpnZxt_tqr8QfH2gRvp5QLoDu9Oa_m40kU8AWQ45NEeVQf_k6WkeJAQwOtRBWOg0kdnaO2ofYCyX0gqaGJI4VE5BXyUU6Jtv7QHn3iw1Ral1Z4zD3_MX3idmidpCMiJucQ2","summary":[{"type":"summary_text","text":"**Analyzing Rust struct drop order in HostedSession**"},{"type":"summary_text","text":"**Identifying PTY drain thread leak on Windows**"},{"type":"summary_text","text":"**Reviewing Drain Drop and watchdog lifecycle**"}]},{"id":"rs_0365286983a6ba82016a59d511f44481948806eed361d03ea3","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdUh_GIoj3kcmRtKPSiEzRosAcSLduj4Lo9cXuu1koMglRHkjXk1KvNmoUhqJOnq-pFq5WqEgldiTPfxlrk8Fdy6N7lxj6ALDyo-EQ16qDJKEwXVb7GXUNn7S1Rh3vR-X6v-JZp4XcMl6Z8zFIOE9cyBBzk3uAMM62MEZycrRkdP8h20QrUW-pDDQiceQvQH7Djvp52rndVR2mVgIYzXkTDIIAeZ4qHawYQ4Shgla0KLKWnDfPf5INsQjJZ4ZfA8n7TSytb4s7AbU5H08NbVf0ckspTps21W8pxatcYU81OlueDF__CKeaV4e4KJtDc-EgdPGd6ZqPQvfDetU9bwTFUXesseCE6kqmopIUSRrX8hHxnSm_z36L6hJu7nkBcz7U7BtMa-YvHsZ0YOmdrRrLTN30rYoe9Ndg3oCkvQeT6fVRRG3UsEaLhfvrthXT0IA4q-AZJQfRNT9Cdk_OGS63UMa-dBWbS8l0d6wZr_8BLF0WvNdOMf9R_H9dX4HfcpWgbNEmeQOQZtsbBByqqxx0SwwWKlRgPZbGpt8BAa2EDM4vaMS--xjS5qtqX2dyVLljBxjn8k2Dzvg8H2pD-1LshxeCRBYGqdRxyR_9VGYHnAhpws8gfvVKSqFI9I1CF5nsxmCxiQncuJeEMC80mKW2OxpG3woFI5mKvx0JepIxpZzSpB7hAx_TaFgvbD58x2NhYtwl1bTuNKUJ3FKmmT-tlZvvVKGdEjqSN3EEyupHzH4Wi8GuAjbZdMDo671kC7O0Q0zPK4Dg1Mo_4h3NBaly8sCutsNew1aVYCrcU5dBYEr-AjBMKa647chwNUDeP-fcyvjx8lpJBYapF1g33MDIJbaC55TBGQUq2T5qOPxpN_vsc8TjfmmIgfqr8sw8lO0Oi53Ut4G3hIFd-JgoHm2WpjfbWBB8EbidpmSdTxLhfMVz6IRMH_WW73P-vVb1gWOQbHX2M9sscJdgZn4IN49pl_ewc5JaruhlC2HWFPAtQSBqdQozU0vwvEQLfHwDFhQsIHqMArYaJtMWHxsUs1kRYVMY428FTDl_GMJBbHR7WJdEa7ZjDc9GKsT8mLY48Koo7C6ACmXAfEBvuLDoxwOvoWgaQjLRPmWmpW8nVUT_iKulcudbnFIHQrb8leruAR2nDzF_cLESckCwMU9ug2dzEaVC2mXklsjuctH-5RRirbhuB9Xv4EOEhqJ9mrN6mmPP5LfqFYJ2IBbEZHm9eApbZH6-7ISG6XuWm8wVv4g4T1SmyHsn-3p5TC_ozkKBbZX_lXs5aiY_36MGitdNdesRhCegohQjYbNFiu0iuJfEJo2VzlBbZ8l5kNwZiRStxc3LMBEnpuNPYORWwSaHrWjgalXkz-_a5r0_Gy40Uj_xH50RTlGfHnUgAQqA82FoHp4RxGVAJMxjqbHc2kiAvrGg-sbQRS9s_8hNTV5IueDjPSBFvQILXQyOjQvYhcgspYqJjj4I_3aOX5a_kRAYxMKxfo9DpWU75DmUa7qN0E1VyTeeOfQ0flX7tb5Bb2XyYTE8nUqUiwVpjQZRHrz70GYfXdQDaQW5F5i2ZnIlSBPdWhnVoSCMi25ZgLUeR6WeKNjomazZrGpMswsNLknxNO0zgLNXik5-_-XkjTASeCdzs6_gLUa6Vt53XdNLqvF3IE4HzxIFEbzW1PbDwrtNrJS-7X2SpdEGsGL8CydJx30broca_dgNCQgYYRzg9msVXkgqadtQv8xvtlbcF-pMRReW99AUADMl2dgz6Wkd-C_B3-N4I43--v_DN595Zrybr8LU7xBMQvlwuTo7pPxccVFlhIM3hy8O_YhaffzSkCI6q1mNK2U_zsukyH8ftl_vGzc8_f7VNs9NfLqiismeJxeoaYsd792QHevf5juXP4FdaCb7PpDzcP0k7Wed56lxQm4DztS_WEaa9DTbXHBglBfIPVQTOPWOquIEdAHPZNFhGRFcRJX8lBfS1NwNd-DdMPFHYhqNF22Qv4Ib8LxMnJDFqYN0-RxNq-DtGhIKI1GLOwUIwGfm4z2IZU7aY2bKQSc4wekAp9I2r93Rb4vUogkudalc89siM3oe4lkzzErrixSd-xjv3GUwaSn12ab5Pukwpw7qICffOIDzAWn6NbpJrR5nc5sgCMzdq4VMIMrIAwkfWmRaQ9l58S4qZU0N12JyNScgquIj4sH94Iur9M1bVgeIHnfcf5maYMyywSLOJdzxOikOb4O6LHsFAHdIHDhJhiCNEa3rfnXL7Z3HUJNygCv4ZnFdiPg-3IwAgQmGukC0A_n6qeD60hQUwnP37m3MICnKLGj1jouF9r6J81H81Yiyr2UaqwHSuX-1_CA7RZRPvA24gHs_KSGqYyOmvdydLOnRtpCbB-PkwTwOkSKmTztu3ftfuH0QgQWrxS3Omgf89brEkFILf3YXfe25wx3Zku0UiqU10uIgC35ThtWk8BHOyGqy6_Z_AGijl1rDTL6gzKyjuSb8a1U-gJ_SB1zGo8xR_jcsOFTtJ5D6K-E1_Z_Xn4xSAKHoMc7mT5_7WiEUXo_jqF61wUE7pINALqLB-AINZwdQ8Hl22cimniq6sjl1S72r1trEY01wxDO3TP7YWkaADxojJS1SaihInDZINzJrmpGeEDbM7Vm5PLJCx1RqiyhqpOqj2y7BwyZh_Usj6GDlHEgnaCKI9Z4N-ejMeB3tU9sb_HY9YYOWqJK-yZtBTWQxfM0YGTq06nUE6Rs9v3f7sCViu8u3RuPZa3FTonK1Nc6EVgy_4pdozxTcPx-aaRaJzuD_-XLJS_ce7tsDXo52sJIB0kQHsh9Qhejx_83uNsIVFPEoPdU5RuJcx5iStAg_NtJEPyH_V-jbDRc6XpAE89yNl3KIvoz8UgWeAxOAVvB8UBjaiaS5byRyRme3XKFgwpdwZAkeiMtj6BIOCquLco6puX4mzAdoPVVIr4yqfpZJRjx3tdyG5YU5jBgYmPkNjgELoAOlZ_kgx61nBJxu8gFh8k-Yv851FKO8fZE2L0w7l8giBeEdO4JmjjBlswvZA84Eot60MT8o46g7HpqhIFZp4vYo3O-aXaXwElk7iZlT9vSc7_vhtJR8dANoTe4JIwSWrhAmQDjxb43y10ZrT2o1LD3HmWGBQCWw_B8be8vhdxlO9grfpt5p5MjBs1qwa3w9HyUeCvnKsXqLB2_na_6WiIFnWuyCMSyh29tTaCkLf49d84R7ILv7Q8zTat_j4y4mI8vJFZ5zX2E-FdOpEeMGvXyyDj3T3qrSIOMzZBS78J900wdOV2-f_LmVSW6Ppexyoh_k1c1Mf99wkZ9N8UP5EsnwjkAwlx00rjxVKPSGPY0YSaTWj2eYH4dUA3JQGDXHdy19ur7SjIcdjLuYzvfndLeVby2yJjfZH3gK9-O9q-LGO6oN5eadDMoQ==","summary":[{"type":"summary_text","text":"**Tracing Arc cycle in BrokerConn drop**"},{"type":"summary_text","text":"**Analyzing connection seat and thread cleanup semantics**"}]},{"id":"fc_0365286983a6ba82016a59d52189e08194a632ba232f1a6677","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading hosted session fields\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1645-1770\"}","call_id":"call_nspCw8zcJjLt46obDsqfkqkD","name":"read"},{"id":"fc_0365286983a6ba82016a59d52189f481949529956624ae57d8","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking drain drop implementation\",\"pattern\":\"impl Drop for Drain|impl Drop for HostedSession|impl Drop for InputWriter|impl Drop for ControllerSink|impl Drop for ViewerSink\",\"path\":\"crates/spt-daemon/src; crates/spt-term/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_wC5pDtcQqJmUmmMrUm2lHUfd","name":"grep"},{"id":"fc_0365286983a6ba82016a59d5218a008194adab694601b09a23","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading PTY teardown contract\",\"path\":\"crates/spt-term/src/reader.rs\",\"selector\":\"1-68\"}","call_id":"call_ROVNNq7UBWwF41TsyVcPizPO","name":"read"},{"id":"fc_0365286983a6ba82016a59d5218a0c8194986813bf4c7c5f21","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding translation container type\",\"pattern\":\"struct Translation|impl Drop for Translation|event_tx|fn run_inject_worker\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_icTflxa7VLtZBAZAPBNWA2hD","name":"grep"},{"id":"fc_0365286983a6ba82016a59d5218a188194a5c96a508bf6883f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading conn watchdog lifecycle\",\"path\":\"crates/spt-daemon/src/conn.rs\",\"selector\":\"414-455,625-665\"}","call_id":"call_vOfcKspXk1pa23cM3zLtWND2","name":"read"}]},"duration":36728.61290000379,"ttft":3276.0756999999285,"contextSnapshot":{"promptTokens":122669,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_nspCw8zcJjLt46obDsqfkqkD|fc_0365286983a6ba82016a59d52189e08194a632ba232f1a6677","toolName":"read","startedAt":"2026-07-17T07:09:22.781Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading hosted session fields"},"id":"3d2dcf6f","parentId":"29f47438","timestamp":"2026-07-17T07:09:22.781Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_wC5pDtcQqJmUmmMrUm2lHUfd|fc_0365286983a6ba82016a59d52189f481949529956624ae57d8","toolName":"grep","startedAt":"2026-07-17T07:09:22.781Z","args":{"path":"crates/spt-daemon/src; crates/spt-term/src"},"intent":"Checking drain drop implementation"},"id":"72ffaaf6","parentId":"3d2dcf6f","timestamp":"2026-07-17T07:09:22.781Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ROVNNq7UBWwF41TsyVcPizPO|fc_0365286983a6ba82016a59d5218a008194adab694601b09a23","toolName":"read","startedAt":"2026-07-17T07:09:22.781Z","args":{"path":"crates/spt-term/src/reader.rs"},"intent":"Reading PTY teardown contract"},"id":"d983d43e","parentId":"72ffaaf6","timestamp":"2026-07-17T07:09:22.781Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_icTflxa7VLtZBAZAPBNWA2hD|fc_0365286983a6ba82016a59d5218a0c8194986813bf4c7c5f21","toolName":"grep","startedAt":"2026-07-17T07:09:22.781Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Finding translation container type"},"id":"9f1eb170","parentId":"d983d43e","timestamp":"2026-07-17T07:09:22.781Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_vOfcKspXk1pa23cM3zLtWND2|fc_0365286983a6ba82016a59d5218a188194a5c96a508bf6883f","toolName":"read","startedAt":"2026-07-17T07:09:22.781Z","args":{"path":"crates/spt-daemon/src/conn.rs"},"intent":"Reading conn watchdog lifecycle"},"id":"b2977573","parentId":"9f1eb170","timestamp":"2026-07-17T07:09:22.781Z"}
{"type":"message","id":"cb78dec2","parentId":"b2977573","timestamp":"2026-07-17T07:09:22.787Z","message":{"role":"toolResult","toolCallId":"call_icTflxa7VLtZBAZAPBNWA2hD|fc_0365286983a6ba82016a59d5218a0c8194986813bf4c7c5f21","toolName":"grep","content":[{"type":"text","text":" 1674|/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.\n*1675|struct Translation {\n 1676|    /// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.\n 1677|    floor: Arc<Mutex<InjectFloor>>,\n 1678|    /// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here\n 1679|    /// and are driven one-at-a-time so two sequences never interleave.\n*1680|    event_tx: Sender<String>,\n 1681|    /// The live child — shared so `dispatch_input` fires content-free pings while\n 1682|    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n 1683|    child: Arc<TranslationChild>,\n...\n 1861|/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n*1862|/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n 1863|/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n 1864|/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n 1865|/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n...\n 1936|/// stranded), then FAULT — terminate the binary, set `faulted`, and exit (idle\n*1937|/// inbound then SPOOLS, never raw-injected). The loop ends when `event_tx` is dropped\n 1938|/// (session teardown), reaping the child.\n 1939|///\n 1940|/// The atomic open→drain→commit→flush is the W1 coexistence mechanism: an injected\n...\n 1973|            let faulted = Arc::new(AtomicBool::new(false));\n*1974|            let (event_tx, event_rx) = channel::<String>();\n 1975|            let w_input = Arc::clone(input);\n 1976|            let w_child = Arc::clone(&child);\n 1977|            let w_floor = Arc::clone(&floor);\n...\n 1985|            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n*1986|            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n 1987|            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n 1988|            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n 1989|            let sup_child = Arc::clone(&child);\n...\n 2006|                floor,\n*2007|                event_tx,\n 2008|                child,\n 2009|                faulted,\n 2010|            }))\n...\n 2049|/// panic drops `event_rx` while the child keeps running: every later inject sees\n*2050|/// `event_tx.send` fail and reports delivered=false forever. `child` + `faulted` are\n 2051|/// the guard's OWN clones (the `body` moves its own into `run_inject_worker`).\n 2052|// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\n*2053|fn run_inject_worker_supervised(\n 2054|    child: Arc<TranslationChild>,\n 2055|    faulted: Arc<AtomicBool>,\n 2056|    endpoint: String,\n...\n 2270|#[allow(clippy::too_many_arguments)] // per-session worker wiring (C-1 added the respawn counter, W5-A the output-log tap); a struct would obscure the call\n*2271|fn run_inject_worker(\n 2272|    input: Arc<InputWriter>,\n 2273|    child: Arc<TranslationChild>,\n 2274|    floor: Arc<Mutex<InjectFloor>>,\n...\n 2484|    }\n*2485|    // `event_tx` dropped → session teardown. Reap the child (no zombie).\n 2486|    child.terminate();\n 2487|}\n 2488|\n...\n 3814|                        let envelope = String::from_utf8_lossy(&bytes).into_owned();\n*3815|                        if tr.event_tx.send(envelope).is_ok() {\n 3816|                            eprintln!(\n 3817|                                \"ENDPOINT_INJECT:{} ({} bytes → translation binary{})\",\n 3818|                                req.endpoint,\n...\n 5438|    // supervisor a worker panic drops event_rx while the child keeps running — a live\n*5439|    // pid whose event_tx.send now fails, so force-native reports \"worker-gone\" forever.\n 5440|    // The supervisor catch_unwinds and faults (terminate + set faulted). RED-FIRST:\n 5441|    // drop the catch_unwind (call the body directly) and the panic propagates + the\n 5442|    // child is left alive (faulted stays false), going red on the orphan."}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":13,"fileCount":1,"files":["crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":13}],"truncated":false,"displayContent":" 1674│/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.\n*1675│struct Translation {\n 1676│    /// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.\n 1677│    floor: Arc<Mutex<InjectFloor>>,\n 1678│    /// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here\n 1679│    /// and are driven one-at-a-time so two sequences never interleave.\n*1680│    event_tx: Sender<String>,\n 1681│    /// The live child — shared so `dispatch_input` fires content-free pings while\n 1682│    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n 1683│    child: Arc<TranslationChild>,\n     │...\n 1861│/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n*1862│/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n 1863│/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n 1864│/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n 1865│/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n     │...\n 1936│/// stranded), then FAULT — terminate the binary, set `faulted`, and exit (idle\n*1937│/// inbound then SPOOLS, never raw-injected). The loop ends when `event_tx` is dropped\n 1938│/// (session teardown), reaping the child.\n 1939│///\n 1940│/// The atomic open→drain→commit→flush is the W1 coexistence mechanism: an injected\n     │...\n 1973│            let faulted = Arc::new(AtomicBool::new(false));\n*1974│            let (event_tx, event_rx) = channel::<String>();\n 1975│            let w_input = Arc::clone(input);\n 1976│            let w_child = Arc::clone(&child);\n 1977│            let w_floor = Arc::clone(&floor);\n     │...\n 1985│            // the translation child — that drops `event_rx` WITHOUT reaping the binary,\n*1986│            // so a live pid + failed `event_tx.send` reports \"worker-gone\" forever. On\n 1987│            // a panic, FAULT (terminate the child + set faulted) — the same terminal\n 1988│            // state the worker's own fault paths reach — so idle inbound cleanly spools.\n 1989│            let sup_child = Arc::clone(&child);\n     │...\n 2006│                floor,\n*2007│                event_tx,\n 2008│                child,\n 2009│                faulted,\n 2010│            }))\n     │...\n 2049│/// panic drops `event_rx` while the child keeps running: every later inject sees\n*2050│/// `event_tx.send` fail and reports delivered=false forever. `child` + `faulted` are\n 2051│/// the guard's OWN clones (the `body` moves its own into `run_inject_worker`).\n 2052│// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\n*2053│fn run_inject_worker_supervised(\n 2054│    child: Arc<TranslationChild>,\n 2055│    faulted: Arc<AtomicBool>,\n 2056│    endpoint: String,\n     │...\n 2270│#[allow(clippy::too_many_arguments)] // per-session worker wiring (C-1 added the respawn counter, W5-A the output-log tap); a struct would obscure the call\n*2271│fn run_inject_worker(\n 2272│    input: Arc<InputWriter>,\n 2273│    child: Arc<TranslationChild>,\n 2274│    floor: Arc<Mutex<InjectFloor>>,\n     │...\n 2484│    }\n*2485│    // `event_tx` dropped → session teardown. Reap the child (no zombie).\n 2486│    child.terminate();\n 2487│}\n 2488│\n     │...\n 3814│                        let envelope = String::from_utf8_lossy(&bytes).into_owned();\n*3815│                        if tr.event_tx.send(envelope).is_ok() {\n 3816│                            eprintln!(\n 3817│                                \"ENDPOINT_INJECT:{} ({} bytes → translation binary{})\",\n 3818│                                req.endpoint,\n     │...\n 5438│    // supervisor a worker panic drops event_rx while the child keeps running — a live\n*5439│    // pid whose event_tx.send now fails, so force-native reports \"worker-gone\" forever.\n 5440│    // The supervisor catch_unwinds and faults (terminate + set faulted). RED-FIRST:\n 5441│    // drop the catch_unwind (call the body directly) and the panic propagates + the\n 5442│    // child is left alive (faulted stays false), going red on the orphan."},"isError":false,"timestamp":1784272162786}}
{"type":"message","id":"23cabf31","parentId":"cb78dec2","timestamp":"2026-07-17T07:09:22.792Z","message":{"role":"toolResult","toolCallId":"call_vOfcKspXk1pa23cM3zLtWND2|fc_0365286983a6ba82016a59d5218a188194a5c96a508bf6883f","toolName":"read","content":[{"type":"text","text":"/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n    inner: Arc<Inner>,\n    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n    /// watchdog aborts through strictly outlives every raw use.\n    dog: Option<JoinHandle<()>>,\n}\n\nimpl BrokerConn {\n    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n    /// deadline (gate-wait + OS write completion) — the broker passes its\n    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n        let raw = raw_of(&half);\n        let inner = Arc::new(Inner {\n            id: CONN_ID_SEQ.fetch_add(1, Ordering::Relaxed) + 1,\n            label: Mutex::new(String::new()),\n            first_write_logged: AtomicBool::new(false),\n            gate: Mutex::new(Gate { half: Some(half) }),\n            gate_cv: Condvar::new(),\n            dog: Mutex::new(Dog {\n                inflight: None,\n                shutdown: false,\n            }),\n            dog_cv: Condvar::new(),\n            poisoned: AtomicBool::new(false),\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n…\n}\n…\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n…\n}"}],"details":{"displayContent":{"text":"/// [`SendHalf`] (it never leaves this module) and the per-conn watchdog.\npub(crate) struct BrokerConn {\n    inner: Arc<Inner>,\n    /// Joined on drop — after `shutdown` is raised — so the raw handle the\n    /// watchdog aborts through strictly outlives every raw use.\n    dog: Option<JoinHandle<()>>,\n}\n\nimpl BrokerConn {\n    /// Wrap a freshly-split send half. `bound` is the ABSOLUTE per-write\n    /// deadline (gate-wait + OS write completion) — the broker passes its\n    /// `brain_write_deadline()` (`SPT_BRAIN_WRITE_DEADLINE_MS` knob).\n    pub(crate) fn new(half: SendHalf, bound: Duration) -> Self {\n        let raw = raw_of(&half);\n        let inner = Arc::new(Inner {\n            id: CONN_ID_SEQ.fetch_add(1, Ordering::Relaxed) + 1,\n            label: Mutex::new(String::new()),\n            first_write_logged: AtomicBool::new(false),\n            gate: Mutex::new(Gate { half: Some(half) }),\n            gate_cv: Condvar::new(),\n            dog: Mutex::new(Dog {\n                inflight: None,\n                shutdown: false,\n            }),\n            dog_cv: Condvar::new(),\n            poisoned: AtomicBool::new(false),\n            timed_out: AtomicBool::new(false),\n            severed: AtomicBool::new(false),\n            graveyard: Mutex::new(None),\n            op_seq: AtomicU64::new(0),\n            bound,\n            raw,\n        });\n        let dog_inner = Arc::clone(&inner);\n        let dog = thread::Builder::new()\n            .name(\"conn-watchdog\".into())\n            .spawn(move || dog_inner.watchdog())\n            .ok();\n        BrokerConn { inner, dog }\n    }\n\n    /// The stable per-physical-conn id — what lifecycle records key on\n…\n}\n…\nimpl BrokerConn {\n    /// Check the half out of the gate without arming the watchdog — writers\n    /// queue behind the gate (bounded by their own deadlines) until the\n    /// returned pin drops. Test-only; never a production path.\n    pub(crate) fn pin_gate_for_test(&self) -> TestGatePin {\n        let mut g = recover(&self.inner.gate);\n        let half = g.half.take().expect(\"pin: gate half present\");\n        TestGatePin {\n            inner: Arc::clone(&self.inner),\n            half: Some(half),\n        }\n    }\n}\n\nimpl Drop for BrokerConn {\n    fn drop(&mut self) {\n        // Once-per-conn `transport-close` lifecycle record (leg d): the handle\n        // is about to close — the terminal record of this conn id's life, with\n        // how it ended (organic EOF vs poisoned vs deadline-poisoned).\n        self.inner.lifecycle(\n            \"transport-close\",\n            &format!(\n                \"poisoned={} timed_out={}\",\n                self.inner.poisoned.load(Ordering::Acquire),\n                self.inner.timed_out.load(Ordering::Acquire)\n            ),\n        );\n        {\n            let mut d = recover(&self.inner.dog);\n            d.shutdown = true;\n            self.inner.dog_cv.notify_all();\n        }\n        if let Some(dog) = self.dog.take() {\n            let _ = dog.join();\n        }\n        // Halves (gate or graveyard) drop AFTER the watchdog is gone — no raw\n        // handle use can race the CloseHandle/limbo path.\n    }\n}\n\nfn poisoned_err() -> io::Error {\n…\n}","startLine":414,"lineNumbers":[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,null,602,null,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,null,670]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\conn.rs"}}},"isError":false,"timestamp":1784272162792}}
{"type":"message","id":"d6f664e1","parentId":"23cabf31","timestamp":"2026-07-17T07:09:22.795Z","message":{"role":"toolResult","toolCallId":"call_ROVNNq7UBWwF41TsyVcPizPO|fc_0365286983a6ba82016a59d5218a008194adab694601b09a23","toolName":"read","content":[{"type":"text","text":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\n//!\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\n//! never emit it for short commands; an app that queries DSR itself always\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\n//! that does withhold. The auto-answer is verified deterministically by injecting\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\n//!\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\n//! does *not* EOF while the writer is held, so the read loop runs on its own\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\n//! broker stops a surface by terminating the child (which tears the PTY down and\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\n\nuse std::io::{Read, Write};\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\nuse std::sync::Arc;\nuse std::thread;\n\nuse crate::pty::{PtySession, SharedWriter};\nuse crate::surface::SurfaceError;\n\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\n\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\n#[derive(Default)]\nstruct DsrMatcher {\n    matched: usize,\n}\n\nimpl DsrMatcher {\n    /// Feed a chunk; return how many complete DSR queries it completed.\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\n        let mut hits = 0;\n        for &b in chunk {\n            if b == DSR_QUERY[self.matched] {\n                self.matched += 1;\n                if self.matched == DSR_QUERY.len() {\n                    hits += 1;\n                    self.matched = 0;\n                }\n            } else {\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\n                self.matched = usize::from(b == DSR_QUERY[0]);\n            }\n        }\n        hits\n    }\n}\n\n/// A running drain pump over a surface's output. Holds live counters and a\n/// cooperative stop flag; see the module docs for the teardown contract.\npub struct Drain {\n    stop: Arc<AtomicBool>,\n    dsr_answered: Arc<AtomicU64>,\n    bytes: Arc<AtomicU64>,\n…\n}\n\n[Showing lines 1-71 of 287. Use :72 to continue]"}],"details":{"truncation":{"content":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\r\n//!\r\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\r\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\r\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\r\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\r\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\r\n//! never emit it for short commands; an app that queries DSR itself always\r\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\r\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\r\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\r\n//! that does withhold. The auto-answer is verified deterministically by injecting\r\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\r\n//!\r\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\r\n//! does *not* EOF while the writer is held, so the read loop runs on its own\r\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\r\n//! broker stops a surface by terminating the child (which tears the PTY down and\r\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\r\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\r\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\r\n\r\nuse std::io::{Read, Write};\r\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\r\nuse std::sync::Arc;\r\nuse std::thread;\r\n\r\nuse crate::pty::{PtySession, SharedWriter};\r\nuse crate::surface::SurfaceError;\r\n\r\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\r\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\r\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\r\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\r\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\r\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\r\n\r\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\r\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\r\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\r\n#[derive(Default)]\r\nstruct DsrMatcher {\r\n    matched: usize,\r\n}\r\n\r\nimpl DsrMatcher {\r\n    /// Feed a chunk; return how many complete DSR queries it completed.\r\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\r\n        let mut hits = 0;\r\n        for &b in chunk {\r\n            if b == DSR_QUERY[self.matched] {\r\n                self.matched += 1;\r\n                if self.matched == DSR_QUERY.len() {\r\n                    hits += 1;\r\n                    self.matched = 0;\r\n                }\r\n            } else {\r\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\r\n                self.matched = usize::from(b == DSR_QUERY[0]);\r\n            }\r\n        }\r\n        hits\r\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\r","truncated":true,"truncatedBy":"lines","totalLines":287,"totalBytes":3379,"outputLines":71,"outputBytes":3379,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! Output drain pump — the ConPTY-DSR auto-answer reader (M3a A2).\r\n//!\r\n//! ConPTY can emit a cursor-position query `ESC [ 6 n` and **withhold all child\r\n//! stdout until the terminal answers it** (Spike #1: a run captured exactly the\r\n//! 4 bytes `\\e[6n` and zero program output — the child looked dead but was\r\n//! ticking fine; replying `ESC [ 1;1 R` immediately unblocked the full stream).\r\n//! Whether the query fires is build- and program-dependent (some ConPTY versions\r\n//! never emit it for short commands; an app that queries DSR itself always\r\n//! will). A real terminal *is* expected to answer DSR regardless, so the pump\r\n//! answers every `ESC[6n` it sees on every platform unconditionally — harmless\r\n//! correct CPR on the Unix raw-pipe backend, and the stall-breaker on any ConPTY\r\n//! that does withhold. The auto-answer is verified deterministically by injecting\r\n//! a synthetic DSR query (it must not depend on the host's ConPTY emitting one).\r\n//!\r\n//! **No-EOF-while-writer-held (Spike #1 secondary gotcha):** a ConPTY master\r\n//! does *not* EOF while the writer is held, so the read loop runs on its own\r\n//! thread and shutdown **never gates on a blocking `read()` returning**. The\r\n//! broker stops a surface by terminating the child (which tears the PTY down and\r\n//! unblocks the read); the [`Drain`] stop flag is a cooperative secondary signal\r\n//! observed whenever a read does return. Deterministic, ordered teardown (drop\r\n//! the writer, then the master) is the M3b broker's lifecycle responsibility.\r\n\r\nuse std::io::{Read, Write};\r\nuse std::sync::atomic::{AtomicBool, AtomicU64, Ordering};\r\nuse std::sync::Arc;\r\nuse std::thread;\r\n\r\nuse crate::pty::{PtySession, SharedWriter};\r\nuse crate::surface::SurfaceError;\r\n\r\n/// The ConPTY startup cursor-position query (DSR — Device Status Report). All\r\n/// child stdout is withheld until this is answered (REQ-HAZARD-CONPTY-DSR).\r\nconst DSR_QUERY: &[u8] = b\"\\x1b[6n\";\r\n/// The reply: a Cursor Position Report placing the cursor at row 1, col 1. Any\r\n/// valid CPR unblocks ConPTY; `1;1` is the minimal answer Spike #1 proved.\r\nconst DSR_REPLY: &[u8] = b\"\\x1b[1;1R\";\r\n\r\n/// Streaming matcher for [`DSR_QUERY`] that survives chunk boundaries (the 4-byte\r\n/// query can split across two `read()`s). `DSR_QUERY` has no proper prefix that\r\n/// is also a suffix, so a single \"bytes matched so far\" counter is sufficient.\r\n#[derive(Default)]\r\nstruct DsrMatcher {\r\n    matched: usize,\r\n}\r\n\r\nimpl DsrMatcher {\r\n    /// Feed a chunk; return how many complete DSR queries it completed.\r\n    fn scan(&mut self, chunk: &[u8]) -> u64 {\r\n        let mut hits = 0;\r\n        for &b in chunk {\r\n            if b == DSR_QUERY[self.matched] {\r\n                self.matched += 1;\r\n                if self.matched == DSR_QUERY.len() {\r\n                    hits += 1;\r\n                    self.matched = 0;\r\n                }\r\n            } else {\r\n                // Restart — but `b` may itself begin a fresh match (e.g. a lone ESC).\r\n                self.matched = usize::from(b == DSR_QUERY[0]);\r\n            }\r\n        }\r\n        hits\r\n    }\r\n}\r\n\r\n/// A running drain pump over a surface's output. Holds live counters and a\r\n/// cooperative stop flag; see the module docs for the teardown contract.\r\npub struct Drain {\r\n    stop: Arc<AtomicBool>,\r\n    dsr_answered: Arc<AtomicU64>,\r\n    bytes: Arc<AtomicU64>,\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,null,73]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-term\\src\\reader.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":287,"totalBytes":3379,"outputLines":71,"outputBytes":3379,"shownRange":{"start":1,"end":71},"nextOffset":72}}},"isError":false,"timestamp":1784272162794}}
{"type":"message","id":"9286af75","parentId":"d6f664e1","timestamp":"2026-07-17T07:09:22.795Z","message":{"role":"toolResult","toolCallId":"call_wC5pDtcQqJmUmmMrUm2lHUfd|fc_0365286983a6ba82016a59d52189f481949529956624ae57d8","toolName":"grep","content":[{"type":"text","text":"No matches found"}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt-term/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":0,"fileCount":0,"files":[],"truncated":false},"isError":false,"useless":true,"timestamp":1784272162795}}
{"type":"message","id":"14fcbde9","parentId":"9286af75","timestamp":"2026-07-17T07:09:22.840Z","message":{"role":"toolResult","toolCallId":"call_nspCw8zcJjLt46obDsqfkqkD|fc_0365286983a6ba82016a59d52189e08194a632ba232f1a6677","toolName":"read","content":[{"type":"text","text":"fn controller_writer(\n…\n) {\n…\n    while let Ok(msg) = rx.recv() {\n…\n        match res {\n…\n            Err(e) => {\n…\n            }\n        }\n        if let Some(seq) = seq {\n            // (a) CONTIGUOUS cursor (b4 / B2 gapless-resume — doyle's gate): with the\n            // drop-on-full handoff in `append`, the controller's live channel can SKIP\n            // a seq (dropped while Full). The frame still went to the socket (the live\n            // operator sees it), but the durable resume cursor must NOT jump past the\n            // gap — see [`contiguous_advance`].\n            contiguous_advance(&delivered_through, seq);\n        }\n    }\n    // Bounded writer-exit record (F-039 leg d): tx dropped — a displace/detach\n    // ended the live loop normally. [impl->REQ-CONN-POISON-ATTRIBUTION]\n    send.lifecycle_event(\n        \"writer-exit\",\n        &format!(\"role=controller session={sid} reason=channel-closed\"),\n    );\n}\n\n/// The per-session translation-binary attachment (W2 Layer C, ADR-0022). Present\n/// ONLY when the spawn carried a `translation_binary` path; absent → the session\n/// has no idle PTY delivery and inbound SPOOLS (ADR-0022 amendment — raw inject\n/// was removed as a delivery path; it did not submit on a modern TUI).\n///\n/// Holds the shared inject floor (the controller-input buffer, also touched by\n/// `dispatch_input`), the queue that feeds inbound `<EVENT>`s to the inject worker\n/// (events serialize — never two uncommitted sequences interleaved), the shared\n/// child handle (so `dispatch_input` can fire content-free `{type:input}` pings\n/// while the worker drives an event), and the FAULT flag the worker raises when a\n/// sequence misses its [`INJECT_COMMIT_DEADLINE`] or the binary dies — after which\n/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.\nstruct Translation {\n    /// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.\n    floor: Arc<Mutex<InjectFloor>>,\n    /// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here\n    /// and are driven one-at-a-time so two sequences never interleave.\n    event_tx: Sender<String>,\n    /// The live child — shared so `dispatch_input` fires content-free pings while\n    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n    child: Arc<TranslationChild>,\n    /// Raised by the worker on FAULT (commit-deadline miss / binary death): the\n    /// session's idle inbound then SPOOLS (never raw-injected) and `dispatch_input`\n    /// stops pinging.\n    faulted: Arc<AtomicBool>,\n}\n\n/// A child the broker hosts under a PTY — the §B-owned resources for one\n/// session, plus its gapless-resume output log.\nstruct HostedSession {\n    /// The PTY + child (PTY master/writer + spawned child process).\n    session: Arc<PtySession>,\n    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n    /// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): the SOLE caller of the blocking\n    /// `write_input`. Every dispatch-side write ENQUEUES here and returns at once,\n    /// so a paste burst that fills the harness's input buffer parks only the\n    /// writer thread, never the broker dispatch thread.\n    input: Arc<InputWriter>,\n    /// The output drain pump (kept so teardown can stop it).\n    #[allow(dead_code)] // held for ownership/teardown; not read directly\n    drain: Drain,\n    /// The sequenced, buffered output + current subscriber.\n    log: Arc<Mutex<OutputLog>>,\n    /// The owning endpoint (the spawn's label; empty = unlabeled). The\n    /// inbound dispatcher's gate subject for remote-drive (D9-1).\n    endpoint: String,\n    /// The translation-binary attachment (Layer C), or `None` for a session with\n    /// no `[message-idle-translation-binary]` — then idle inbound delivery SPOOLS\n    /// (no raw PTY inject; ADR-0022 amendment).\n    translation: Option<Arc<Translation>>,\n    /// The resolved translation argv this session was spawned with (F029 C-1) —\n    /// held so a bounded eager respawn after a REAL fault can rebuild the binary\n    /// from the exact same command (`build_translation`) without re-reading the\n    /// manifest (works for a test session with a direct argv AND a production\n    /// session). `None` for a no-translation session. Updated on an adapter-apply\n    /// restart to the swapped-in argv.\n    translation_argv: Option<Vec<String>>,\n    /// The bounded-respawn give-up counter shared with the inject worker (F029 C-1,\n    /// REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH): the dispatch respawn path\n    /// increments it per rebuild, the worker RESETS it to 0 on a healthy `{commit}`\n    /// (so a recovered binary refreshes the whole budget). At `translate_respawn_\n    /// budget()` the daemon gives up (loud) and leaves the binary dead → spool.\n    translation_respawns: Arc<AtomicU32>,\n    /// The adapter name owning this session (W3a, ADR-0025) — empty for a\n    /// legacy/test/shell spawn. A live adapter update finds every live session\n    /// whose `adapter` matches to cycle its resident children.\n    adapter: String,\n    /// The adapter's install dir for this session (W3a) — `None` if unknown. The\n    /// apply target for a live update's CRC swap.\n    install_dir: Option<std::path::PathBuf>,\n}\n\n/// One record queued to a session's dedicated PTY input-writer thread — the raw\n/// bytes to write (v0.13.0 P0, REQ-HAZARD-PTY-INPUT-WRITER-WEDGE).\ntype InputRecord = Vec<u8>;\n\n/// The per-session PTY input FIFO depth (records). Sized for a generous paste —\n/// a wedged harness fills this and then DROPS, never blocking the dispatch\n/// thread. The int gate shrinks it via `SPT_INPUT_QUEUE_DEPTH` so the\n/// DROP+`INPUT_BACKPRESSURE` leg is forced in a handful of records rather than a\n/// few hundred KB of real paste.\nconst INPUT_QUEUE_DEPTH: usize = 4096;\n\n/// The effective input FIFO depth: production is [`INPUT_QUEUE_DEPTH`]; the int\n/// gate overrides it (`SPT_INPUT_QUEUE_DEPTH`) to a tiny value to force a\n/// deterministic queue saturation — the depth's PRESENCE (bounded, drop-on-full)\n/// is the invariant, not its exact value.\nfn input_queue_depth() -> usize {\n    match std::env::var(\"SPT_INPUT_QUEUE_DEPTH\") {\n        Ok(n) => n\n            .parse::<usize>()\n            .ok()\n            .filter(|d| *d > 0)\n            .unwrap_or(INPUT_QUEUE_DEPTH),\n        Err(_) => INPUT_QUEUE_DEPTH,\n    }\n}\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n…\n}\n\n[Showing lines 1644-1773 of 6298. Use :1774 to continue]"}],"details":{"truncation":{"content":"            }\n        }\n        if let Some(seq) = seq {\n            // (a) CONTIGUOUS cursor (b4 / B2 gapless-resume — doyle's gate): with the\n            // drop-on-full handoff in `append`, the controller's live channel can SKIP\n            // a seq (dropped while Full). The frame still went to the socket (the live\n            // operator sees it), but the durable resume cursor must NOT jump past the\n            // gap — see [`contiguous_advance`].\n            contiguous_advance(&delivered_through, seq);\n        }\n    }\n    // Bounded writer-exit record (F-039 leg d): tx dropped — a displace/detach\n    // ended the live loop normally. [impl->REQ-CONN-POISON-ATTRIBUTION]\n    send.lifecycle_event(\n        \"writer-exit\",\n        &format!(\"role=controller session={sid} reason=channel-closed\"),\n    );\n}\n\n/// The per-session translation-binary attachment (W2 Layer C, ADR-0022). Present\n/// ONLY when the spawn carried a `translation_binary` path; absent → the session\n/// has no idle PTY delivery and inbound SPOOLS (ADR-0022 amendment — raw inject\n/// was removed as a delivery path; it did not submit on a modern TUI).\n///\n/// Holds the shared inject floor (the controller-input buffer, also touched by\n/// `dispatch_input`), the queue that feeds inbound `<EVENT>`s to the inject worker\n/// (events serialize — never two uncommitted sequences interleaved), the shared\n/// child handle (so `dispatch_input` can fire content-free `{type:input}` pings\n/// while the worker drives an event), and the FAULT flag the worker raises when a\n/// sequence misses its [`INJECT_COMMIT_DEADLINE`] or the binary dies — after which\n/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.\nstruct Translation {\n    /// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.\n    floor: Arc<Mutex<InjectFloor>>,\n    /// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here\n    /// and are driven one-at-a-time so two sequences never interleave.\n    event_tx: Sender<String>,\n    /// The live child — shared so `dispatch_input` fires content-free pings while\n    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n    child: Arc<TranslationChild>,\n    /// Raised by the worker on FAULT (commit-deadline miss / binary death): the\n    /// session's idle inbound then SPOOLS (never raw-injected) and `dispatch_input`\n    /// stops pinging.\n    faulted: Arc<AtomicBool>,\n}\n\n/// A child the broker hosts under a PTY — the §B-owned resources for one\n/// session, plus its gapless-resume output log.\nstruct HostedSession {\n    /// The PTY + child (PTY master/writer + spawned child process).\n    session: Arc<PtySession>,\n    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n    /// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): the SOLE caller of the blocking\n    /// `write_input`. Every dispatch-side write ENQUEUES here and returns at once,\n    /// so a paste burst that fills the harness's input buffer parks only the\n    /// writer thread, never the broker dispatch thread.\n    input: Arc<InputWriter>,\n    /// The output drain pump (kept so teardown can stop it).\n    #[allow(dead_code)] // held for ownership/teardown; not read directly\n    drain: Drain,\n    /// The sequenced, buffered output + current subscriber.\n    log: Arc<Mutex<OutputLog>>,\n    /// The owning endpoint (the spawn's label; empty = unlabeled). The\n    /// inbound dispatcher's gate subject for remote-drive (D9-1).\n    endpoint: String,\n    /// The translation-binary attachment (Layer C), or `None` for a session with\n    /// no `[message-idle-translation-binary]` — then idle inbound delivery SPOOLS\n    /// (no raw PTY inject; ADR-0022 amendment).\n    translation: Option<Arc<Translation>>,\n    /// The resolved translation argv this session was spawned with (F029 C-1) —\n    /// held so a bounded eager respawn after a REAL fault can rebuild the binary\n    /// from the exact same command (`build_translation`) without re-reading the\n    /// manifest (works for a test session with a direct argv AND a production\n    /// session). `None` for a no-translation session. Updated on an adapter-apply\n    /// restart to the swapped-in argv.\n    translation_argv: Option<Vec<String>>,\n    /// The bounded-respawn give-up counter shared with the inject worker (F029 C-1,\n    /// REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH): the dispatch respawn path\n    /// increments it per rebuild, the worker RESETS it to 0 on a healthy `{commit}`\n    /// (so a recovered binary refreshes the whole budget). At `translate_respawn_\n    /// budget()` the daemon gives up (loud) and leaves the binary dead → spool.\n    translation_respawns: Arc<AtomicU32>,\n    /// The adapter name owning this session (W3a, ADR-0025) — empty for a\n    /// legacy/test/shell spawn. A live adapter update finds every live session\n    /// whose `adapter` matches to cycle its resident children.\n    adapter: String,\n    /// The adapter's install dir for this session (W3a) — `None` if unknown. The\n    /// apply target for a live update's CRC swap.\n    install_dir: Option<std::path::PathBuf>,\n}\n\n/// One record queued to a session's dedicated PTY input-writer thread — the raw\n/// bytes to write (v0.13.0 P0, REQ-HAZARD-PTY-INPUT-WRITER-WEDGE).\ntype InputRecord = Vec<u8>;\n\n/// The per-session PTY input FIFO depth (records). Sized for a generous paste —\n/// a wedged harness fills this and then DROPS, never blocking the dispatch\n/// thread. The int gate shrinks it via `SPT_INPUT_QUEUE_DEPTH` so the\n/// DROP+`INPUT_BACKPRESSURE` leg is forced in a handful of records rather than a\n/// few hundred KB of real paste.\nconst INPUT_QUEUE_DEPTH: usize = 4096;\n\n/// The effective input FIFO depth: production is [`INPUT_QUEUE_DEPTH`]; the int\n/// gate overrides it (`SPT_INPUT_QUEUE_DEPTH`) to a tiny value to force a\n/// deterministic queue saturation — the depth's PRESENCE (bounded, drop-on-full)\n/// is the invariant, not its exact value.\nfn input_queue_depth() -> usize {\n    match std::env::var(\"SPT_INPUT_QUEUE_DEPTH\") {\n        Ok(n) => n\n            .parse::<usize>()\n            .ok()\n            .filter(|d| *d > 0)\n            .unwrap_or(INPUT_QUEUE_DEPTH),\n        Err(_) => INPUT_QUEUE_DEPTH,\n    }\n}\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on","truncated":true,"truncatedBy":"lines","totalLines":4655,"totalBytes":7160,"outputLines":130,"outputBytes":7160,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn controller_writer(\n…\n) {\n…\n    while let Ok(msg) = rx.recv() {\n…\n        match res {\n…\n            Err(e) => {\n…\n            }\n        }\n        if let Some(seq) = seq {\n            // (a) CONTIGUOUS cursor (b4 / B2 gapless-resume — doyle's gate): with the\n            // drop-on-full handoff in `append`, the controller's live channel can SKIP\n            // a seq (dropped while Full). The frame still went to the socket (the live\n            // operator sees it), but the durable resume cursor must NOT jump past the\n            // gap — see [`contiguous_advance`].\n            contiguous_advance(&delivered_through, seq);\n        }\n    }\n    // Bounded writer-exit record (F-039 leg d): tx dropped — a displace/detach\n    // ended the live loop normally. [impl->REQ-CONN-POISON-ATTRIBUTION]\n    send.lifecycle_event(\n        \"writer-exit\",\n        &format!(\"role=controller session={sid} reason=channel-closed\"),\n    );\n}\n\n/// The per-session translation-binary attachment (W2 Layer C, ADR-0022). Present\n/// ONLY when the spawn carried a `translation_binary` path; absent → the session\n/// has no idle PTY delivery and inbound SPOOLS (ADR-0022 amendment — raw inject\n/// was removed as a delivery path; it did not submit on a modern TUI).\n///\n/// Holds the shared inject floor (the controller-input buffer, also touched by\n/// `dispatch_input`), the queue that feeds inbound `<EVENT>`s to the inject worker\n/// (events serialize — never two uncommitted sequences interleaved), the shared\n/// child handle (so `dispatch_input` can fire content-free `{type:input}` pings\n/// while the worker drives an event), and the FAULT flag the worker raises when a\n/// sequence misses its [`INJECT_COMMIT_DEADLINE`] or the binary dies — after which\n/// the session's idle inbound SPOOLS (never raw-injected) and pinging stops.\nstruct Translation {\n    /// Controller-input buffer + inject-floor flag, shared with `dispatch_input`.\n    floor: Arc<Mutex<InjectFloor>>,\n    /// Queue one inbound `<EVENT>` envelope to the inject worker. Events QUEUE here\n    /// and are driven one-at-a-time so two sequences never interleave.\n    event_tx: Sender<String>,\n    /// The live child — shared so `dispatch_input` fires content-free pings while\n    /// the worker (which also holds an `Arc`) drives events / faults the binary.\n    child: Arc<TranslationChild>,\n    /// Raised by the worker on FAULT (commit-deadline miss / binary death): the\n    /// session's idle inbound then SPOOLS (never raw-injected) and `dispatch_input`\n    /// stops pinging.\n    faulted: Arc<AtomicBool>,\n}\n\n/// A child the broker hosts under a PTY — the §B-owned resources for one\n/// session, plus its gapless-resume output log.\nstruct HostedSession {\n    /// The PTY + child (PTY master/writer + spawned child process).\n    session: Arc<PtySession>,\n    /// The session's dedicated PTY input-writer (v0.13.0 P0,\n    /// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): the SOLE caller of the blocking\n    /// `write_input`. Every dispatch-side write ENQUEUES here and returns at once,\n    /// so a paste burst that fills the harness's input buffer parks only the\n    /// writer thread, never the broker dispatch thread.\n    input: Arc<InputWriter>,\n    /// The output drain pump (kept so teardown can stop it).\n    #[allow(dead_code)] // held for ownership/teardown; not read directly\n    drain: Drain,\n    /// The sequenced, buffered output + current subscriber.\n    log: Arc<Mutex<OutputLog>>,\n    /// The owning endpoint (the spawn's label; empty = unlabeled). The\n    /// inbound dispatcher's gate subject for remote-drive (D9-1).\n    endpoint: String,\n    /// The translation-binary attachment (Layer C), or `None` for a session with\n    /// no `[message-idle-translation-binary]` — then idle inbound delivery SPOOLS\n    /// (no raw PTY inject; ADR-0022 amendment).\n    translation: Option<Arc<Translation>>,\n    /// The resolved translation argv this session was spawned with (F029 C-1) —\n    /// held so a bounded eager respawn after a REAL fault can rebuild the binary\n    /// from the exact same command (`build_translation`) without re-reading the\n    /// manifest (works for a test session with a direct argv AND a production\n    /// session). `None` for a no-translation session. Updated on an adapter-apply\n    /// restart to the swapped-in argv.\n    translation_argv: Option<Vec<String>>,\n    /// The bounded-respawn give-up counter shared with the inject worker (F029 C-1,\n    /// REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH): the dispatch respawn path\n    /// increments it per rebuild, the worker RESETS it to 0 on a healthy `{commit}`\n    /// (so a recovered binary refreshes the whole budget). At `translate_respawn_\n    /// budget()` the daemon gives up (loud) and leaves the binary dead → spool.\n    translation_respawns: Arc<AtomicU32>,\n    /// The adapter name owning this session (W3a, ADR-0025) — empty for a\n    /// legacy/test/shell spawn. A live adapter update finds every live session\n    /// whose `adapter` matches to cycle its resident children.\n    adapter: String,\n    /// The adapter's install dir for this session (W3a) — `None` if unknown. The\n    /// apply target for a live update's CRC swap.\n    install_dir: Option<std::path::PathBuf>,\n}\n\n/// One record queued to a session's dedicated PTY input-writer thread — the raw\n/// bytes to write (v0.13.0 P0, REQ-HAZARD-PTY-INPUT-WRITER-WEDGE).\ntype InputRecord = Vec<u8>;\n\n/// The per-session PTY input FIFO depth (records). Sized for a generous paste —\n/// a wedged harness fills this and then DROPS, never blocking the dispatch\n/// thread. The int gate shrinks it via `SPT_INPUT_QUEUE_DEPTH` so the\n/// DROP+`INPUT_BACKPRESSURE` leg is forced in a handful of records rather than a\n/// few hundred KB of real paste.\nconst INPUT_QUEUE_DEPTH: usize = 4096;\n\n/// The effective input FIFO depth: production is [`INPUT_QUEUE_DEPTH`]; the int\n/// gate overrides it (`SPT_INPUT_QUEUE_DEPTH`) to a tiny value to force a\n/// deterministic queue saturation — the depth's PRESENCE (bounded, drop-on-full)\n/// is the invariant, not its exact value.\nfn input_queue_depth() -> usize {\n    match std::env::var(\"SPT_INPUT_QUEUE_DEPTH\") {\n        Ok(n) => n\n            .parse::<usize>()\n            .ok()\n            .filter(|d| *d > 0)\n            .unwrap_or(INPUT_QUEUE_DEPTH),\n        Err(_) => INPUT_QUEUE_DEPTH,\n    }\n}\n\n/// One session's dedicated PTY input-writer (v0.13.0 P0,\n/// REQ-HAZARD-PTY-INPUT-WRITER-WEDGE). The `writer` thread is the SOLE caller of\n/// the blocking [`SessionSurface::write_input`]; every other site enqueues a\n/// record via [`InputWriter::enqueue`] (a non-blocking `try_send`) and returns\n/// immediately. So a paste burst that fills the ConPTY/forkpty input buffer\n/// parks ONLY this thread — the broker dispatch thread, attach-opens, resizes,\n/// and every other session stay fully live (the W1b-deferred fix (2)). Mirrors\n/// the OUTPUT-side [`ViewerSink`]/[`ControllerSink`] writer-thread pattern.\nstruct InputWriter {\n    /// The bounded input FIFO to the writer thread. `try_send` only — a full\n    /// queue (a genuinely wedged harness) DROPS, it never blocks.\n    tx: SyncSender<InputRecord>,\n    /// True while the FIFO is saturated and input is being dropped; cleared on\n…\n}","startLine":1553,"lineNumbers":[1553,null,1562,null,1617,null,1633,null,1635,null,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,null,1783]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":7160,"outputLines":130,"outputBytes":7160,"shownRange":{"start":1644,"end":1773},"nextOffset":1774}}},"isError":false,"timestamp":1784272162840}}
{"type":"message","id":"964ab160","parentId":"14fcbde9","timestamp":"2026-07-17T07:10:22.689Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying potential resource leak in PTY teardown**\n\n**Evaluating safe thread diagnostics on Windows**\n\n**Assessing limitations of non-invasive thread stack sampling**"},{"type":"thinking","thinking":"**Assessing live probe methods for broker status**\n\n**Designing log-based thread and attachment correlation**\n\n**Analyzing broker I/O and thread parking patterns**"},{"type":"thinking","thinking":"**Analyzing thread impact on I/O and CPU usage**\n\n**Differentiating thread leak, spin, and normal states**\n\n**Counting threads per PTY session and viewers**"},{"type":"thinking","thinking":"**Identifying missing Drop implementations and teardown leaks**\n\n**Analyzing potential blocking in input writer and connection handlers**"},{"type":"toolCall","id":"call_6798h6mIekYwIbq442UEioEf|fc_0365286983a6ba82016a59d55d69748194aadfc6785c478b2f","name":"read","arguments":{"i":"Reading network runtime threading","path":"crates/spt-daemon/src/nethost.rs","selector":"1175-1205,975-1065"}},{"type":"toolCall","id":"call_LlZEHaq2Q7Egj5fuhyWgvWQU|fc_0365286983a6ba82016a59d55d6a448194b7c7c2a1d821f09b","name":"read","arguments":{"i":"Reading connection handler gauge","path":"crates/spt-daemon/src/broker.rs","selector":"2990-3025"}},{"type":"toolCall","id":"call_4ysvcT8tVOKZ5zNkBWcx5EiN|fc_0365286983a6ba82016a59d55d6a4c8194a4dd62fdc574e489","name":"read","arguments":{"i":"Reading viewer hard cap","path":"crates/spt-daemon/src/broker.rs","selector":"85-150"}},{"type":"toolCall","id":"call_ajnhkL6cPfOuoIIqJlPDafbZ|fc_0365286983a6ba82016a59d55d6a548194b2896e2be9639040","name":"read","arguments":{"i":"Reading InputWriter loop exit","path":"crates/spt-daemon/src/broker.rs","selector":"1830-1898"}},{"type":"toolCall","id":"call_WKPLAkyghLU2ixWlds4FVJOX|fc_0365286983a6ba82016a59d55d6a58819497cfffc61d2bf85b","name":"grep","arguments":{"i":"Finding stream read task spawn","pattern":"read_stream|read_pump|spawn\\(async move|runtime\\.spawn","path":"crates/spt-daemon/src/nethost.rs","selector":"900-1150","case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":13231,"output":2138,"cacheRead":115200,"cacheWrite":0,"totalTokens":130569,"reasoningTokens":1892,"cost":{"input":0.066155,"output":0.06414,"cacheRead":0.0576,"cacheWrite":0,"total":0.18789499999999998}},"stopReason":"toolUse","timestamp":1784272162886,"responseId":"resp_0365286983a6ba82016a59d52372a88194abe0c0757d22bb85","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5289e408194a103d6042c66f1f9","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdU0fc45zMgXrTRkdUar0CamOovFtLsIYYjdfNI44b_LiYxD0PZI33cRHrA9E_SNAUkh29vcrv-WpswP1D5rjWL3h9DojB7ykmIzt7pGpsSEyC6rGPGNNHGhzTmL_d6Oh2lfHUwbfgq7XRF5utcomg4vvyr6NNGcWUt-zFqB41xyV-NeuFKZVdURs3MtQmoglvadYDawWcAvsFz_LAF5GbnaLky-mW7N8B87eZgF-j7_Ay1gFzBCGOWzkPWV2dWuXcnHdIMTaEeITxYSWUnU__ocrhupvra5hBEAqkrjlbpj2Ph4nYftf2H4pI3AXjyo-utce1FTmZd7HLA_W4a7XLbI2UmOQitjr2ZDdbbnFL-eXhERqRuzP4tr1Sc6uFMwp1XuF2rIG3WYiCPht3WDvZTDcYhNsOWCkDJiNouAKGdNyNmaAnCsXyXEJzlpkMZJixsBnDCNX-FecE59mCy85F69q_CbYrRIcea41_bl0Nvee1psxN6xnuCRZZZPuD4ww0LRGBl3LKJoJqYv2R8_G5K2rpab1_FC8QSuQzNvGgX0K00J5XMLCYjv-EYTaPWjMbz8e0FitLecMzIiXCwa7QxQOZ3_p6U6Pi_QK2IoaT9ncKXPYst5n5U3FWtrrhYheTllsYmEuOEdbizK-olvKvy3vvqNLL9eLs1s6EBeb1eV3xfzc77tmxebTcdMBf2Iv-IN4yPhvmtZ84HPJV3EFREb4m9_qvzN8DcSRBdfXxaBWBtViTRY6z3-VnowhoyUoZ_lQkqYD6m1zgTkI3A2WJaYxVNB3iPJK82zL8SiL08MOBQMad50lnG7ucAUYO244Jg7T5qT_hRwka1W2u6W0irT4bnn6t_2F0JY3unkld0eKjencr6fzmEYIyeAF1bFJ4Fj589OrjqASzVBeywcLtKf-lqK6bbx_lJ_mhOOfzh7cxmoD4vjd2PEEM-mgGtRsv-O0ApoHxyZ5qfsPF54EN642nK32GoW125um2CSQtkR3t0D4-uVfZFPoMIRSCaSZJInGi9h0_M5NH9dWvSvi4sJgKrILn39S8LGoDAiWheajp7bBuTLBjsDmIV6f95-qPfr3JeHlK4pBAkzNj4PP-58FK7ypy6FNdgY1WwGkDVI_W27OZHOmpNakuIiIkJie6IHEfQVwowswYXTdVsPEkHg2SqPayuIIDht4Mw3DU0WLAfN1-TSxJTH9w6pkDzF1PriKf5iYHCQs6fTug16s8ZG8ZQUTchU42xxtGgEOsEC3hF_QnSclnQtXfVZaUABN0_zh352vJ-HxFERPRRRjEoHuc0J9NQgwBsG_4d9LmkxqLbQ0aeOZ6U-lxlptG1LrfR-xjRxk4yMouDmPw3cBIrRG6FIxDh9ZAAG1gse4kvZHpFajBY5EeB8zYRfIFoZ7GuFg3J4wjPMtan-37jBMPjqSkQYe00zjPoEdfwrCYwCwN98Cl7-GNfoDnQcBbPo0GY5KHwZq0ZJb9GDvScES7F9b9_Tl_cF76jZrFyHBru5rqlcYTlxNtt8uH-lCLAvC27T-0Z8tx8F10wUvC-I0hIpMpAA1zghUspQBwmHkotjxzGAuGGuxvSJq0VdnANgAenH1-oxvPKiRjZ3NH5hXWiJh3f9b1BMkvNApvlJP5siKUq1_CQIiV2CJjL19X5bGpF3a8g6STv6nogXcTWpBPOqz4oDJFdNyK5tPRCJCw1SVizFufIjna_3tq2JDjAiN3tuq8vhCcW3JDvIZphBCmXwG4ON6KjiZPJhTWHo46Bd4aQghzeQKdQlHy-fz441wAbTUcvsb7Egi2eOMycoZRWsBTzGzaGdRuNHrQszLEGZ9n6Rldg5URcHXNrNwm0w4cq9jyEcne7NphsA4x1XRVA6au_6UsLsfw8Kc2mMXypqAXnbKLTg-1eXiZuewelKby-lKX5l0RSPmLfPU8F7RpR9nAlaIXE-dRxqLukEnZlJXjiNyhneduGqQXqcOyW-IlPAiXUSWy38_3PQZEZY0xIdzVxGovZZnG3Y4o_qFHaZjND1MjPqy0sd8aADWzGqoizopfWyL2OWCvqxe3LN1tt_96NQtMkI512a9Ipx5gkp1DTZM8TtiqT44pxRRAJCHfsiTEbeG0o6XYNiOzsy8d1IbM0-l9nABN6XGqzFpdZNVpwSf-df93AT0EVlgDqoPFQuBA2YilLLr4b-gQ3bvrj3vZNoPRvoGer03fh-UW3IpXoxz5n9fmCqWRDiTg77xrKnrM2_ihsBWMS-moPVOgsp-7oQnNfPIrdV8nPyygBfQSLuXQOe67UVp4VLKfUUhM7poqo71zmstvw7EjanczYgaoEriSQw33hdzJ4yW82o_oZxVA8eCppj0ULRMqdK_oP2DXdFcDRBQoq4f0aDmhpfeOEcVWNwMaobfzxm2wtpdNayOwBY3fTTGxGzcjQ1wRD7YzxHQZh2jIVnbt6Knx2Y7TvkwEOQv_XBeXzmMOThPiIkIifXoGo06_8OQtBb7W3STfK3wtmbvoSNgKvnEv-mYE_BkbaIkq-wIyngB12ooTfETVc68YN25GNydxmtiLJIWK1MUNFCuq3n1qTR52-TpoNeNnFa2qN3KPGp4r4vzJ1D4GfFxc0eFA2WmCiVJxFG5xVbbDLWtHDLNK5utxiLSu-LvVRvptMToTlMOqFqpE_U0C5slC4IolUMrbUqo7sjRtnJen8cSAcfnTIehH28sJ4N7meMuVU49SqfGqAPotVzGlvK9BAX7IpSqmf3O-bYD0asDFt5Zu34pVFwMYfLW4WrluPQp8NZGZkdtvNgscE7cDO9U5lgs9wvIG362QNOqrdYl1unEPRjz26AC13--lCLQR2-AwKNi6D5eF3ASHrWSypMxCMsPWH8AhV3H6jttuyoqvrFCU_fTMihZwybaSqWmoXnfAK-eK1fO15snerQWW7hsrW5Q9T8eFyZqG_a4KGwsRprSc36KJFdyatzM3RBNDIsUPTKhBa4Smr7KR2mIWLxKagY2_9iQuketkIjYH1cS7N4XgMz1wr8v5Uv9FXPxLkvW2elJsNFHJv0D9NbfrHL59A7i4LFfNIDe3ooXErzt5Q8bS-ngcbnWPrRyx9lQ51dAK-9xriyRU8VLQIxBiZ9N_aOmYfuyY4snXcDdTmGOkkxdTg-8U7HGGnLrcCkDGZ9doGVQUnYbMfx9fL4ht37Pa66IK_QkKa7ilJtkHqwF9Vyq4GgSGrpZHQojUTKrRvjn9X6WxiSCfyF3DfyOn8lTfxIRXKVSwp5AK2_btrvw8TUTPjh0AIEefOd7LNi8Y4jGls1gco1K9-R39MDEwJMyhXXP4-pAOmdhRkXH7u7p4bbphRHb7w7RoPwkOBdIR7BanXSAsqbod9HZgvdskCctkxrZM84XgEtmSs1BOR4BjJFMzy2IVorHQlU6tDfYh2uupl_89URPLxazQIj78obZSXmk0hv9KsUHbx0bDa4GK9m4om2rZ-Nz45TPmCtUBbEg2v_6-L0uxTdZ1rWcQypFDNu-cm5Wh5uJw9CHGqlKfyt7EXS9It776jlXhbGju8q4H6TtvjUQ609KyJULcYcMTs_8v3rYT7YkV2ZMAzOxySKhvYNGpZuEyRLq0DUrfy1rdWVp-jpwWpL9kQh-838rYKHUGd-gPghkgfVVTz-zVKXTwNfKpZ772FOIDIvpyYTUluJ24WVs_fSHZ726yfm-_fryuybncyWRv0n0hwsnX6DybNX3yyBtHpZuS-DaIq-6hXcfvXhrPsEfF6O3IGPfSdA8hPRMwv5bab5_JgV0OisC74AuQQIaObF1VYWcBEyfgiGbBb5dIKMDTS_8ulv08bZjErFbDBGauoIUQ2Lxb5cvLZ8LWS8f8Cqg3QDp4j1gLa9Pwe-ghqdp0TkSQB3xGj3gfC_-M_9d7UHkpk4lK6ATdtcp8DKMCccGMnPlJDIRXLz_rEa6_M-_r5HmmD3xqLBVhpvhvO_5iWwN8_ZPptxRRgcBcZSgjobD4Nqebk9Au_vju5715x3AJi3-hCbmCwt2RKPYkm2-zMd-BrXW-fr7L9HJlrXFwNlPOneqAMiBPpRHXImO0HKv5QDxtJLmlcHxdviUQolKCkI7yDUocugVhlD-o4PK-OkcQ==","summary":[{"type":"summary_text","text":"**Identifying potential resource leak in PTY teardown**"},{"type":"summary_text","text":"**Evaluating safe thread diagnostics on Windows**"},{"type":"summary_text","text":"**Assessing limitations of non-invasive thread stack sampling**"}]},{"id":"rs_0365286983a6ba82016a59d534a6cc8194911df979bfffae3d","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdVD0XMkpM_3pTX7E4jxWtffgKWql2NHQbcxWT6zCe72O-ISkhj1yQG7YLAsHowV1tXuPJ6j8bud6pnCO7uTwcXDuCrBrz_IpAqV9PvO0Tq_eeOe10UegOyXUs6ofQMjj7i9-ZsBw0f0VIOaMI8u9bZIHm-FW0Db81OzBLimV6aoZuaRhvpzk2b9WuKFNB68FjILdW2l1Z18TVPYFgDihaFG2c4So0VyEZiFgYOAw_n0mRyvL0EjryCv__9csJkSP1phtefw5i_-0KKg3r-PEeN6lQ0ixHxPOE-m-YgsBBpbBbODvThrkzfDP9i6c_m6bdzASGKA6s-uyOD6lZDfQMpAzLEriwlI3UlSRtIG4_UxktFxTeNn3IteO5IBYpQ5O1f9-wdKJUFsVQKwPOpCwgp-jvtzeZVQW7XZ55v3TUauUbd88zH6L6xiD_HcoPtmt1RLmR1NvkgMmvn-patNzdfJjEhGBVce_6PUjkxaJzbFzNu2UHwTXPV1mopEfzKKRGO6oJlvYZh-LqUlYrknwSUTsrdCUr_B3D7IQ7RHvpMyAwCaVn2z-ok-y2baqLB2M-0nTSGglBXmmowh1-Sc_1OYNjVuErDlEDzStUcdN_Y60y_-5XKV_MCxfjkwaqDUlpc32RXvAbSSFqD8TM4n9NegRsOk8gk_i_qaQFbm-ErbtLFEciXlLav103ly-ooykbFfh5VuqkDvxg6qaYDFZ2gBv1mxtlzeLBZzeoiZoslTuNRjlWKXlHfjYlf3PwcXgDFIZ2hXp3cVfoJxUE2rREbkYXlCCYN8W9cNLZPGo93IMWDMw3APsLG55EeFnL1vnfgzPPCgQxfHqeFBpmIOP6LlHgay0GERxhlZdDGmVI_2UI-BOO01RD42lPA_t77XRMy-l_dTYUCCR2nixUYcvHyXpnklTLAw_B82Lcv0thRmb7EBu6we0dpsdDNGnxdvp7b33PxQtB_tsiSglKPqZ1SALEoZBAT0znP6Wv3oCl0Nh5VKehd2Hp7TG-B8f2ueKZtGPWJlHD3uL0OIP84v6um_V1KPsegJXtOIk7h6AoTYRhPQQIYyN4ruaTO6UmU5e8NF5fItgJEzVpSWU850bNshr9S9lJ73QP0oEVi5NFgwioFsihfwTx1e36MxMgR5DYZbTAozhvX5EJ0aEIJdlRUViEtKmICtA6CGAtQfM1HXrsSAOydnJdy7XsZS5u7DZOnTfB93o8T2IxlQ1m9uCWm6OQc_EVWKgqqUKrkA0ZgG7OMu3ZwWhOp7tgxiE6doVu_CBdMYZWtY8kuTG_9Pcp17MmPpRUkRMQIaUsYCFZCBuI6aIK6DRJyepB8NpWDdw6kUkF9e0H1BRbQFlp3Q4tKN8QCIWrLxHNkVLT9kMQbiBNIOAs_WVeKkQUEwZTDYE7oDzFZWWGXVYpSsdz0X-patvSjmjmRbTd7Ces6m-b7FspCtr-vWtZ8pWVMU6ibRxzBUgISylReAembqeDYOYIBs4CdnkGfuc9EOsOyVEoluouNhYYw7MUhfFWElsM19OuWEO9y2PLzWgh4PuuSonMRpBadnOU8wIT2uf5lGCYsC7lW3zJvW-X_4oT9n_bX6Q2QCcCYcLA-dh1QANT0sTC2fTDL1n-sq6MLFjuKUOWy6PWhYyQYiLUFY0Eq1F_hLfspy3xVQFmWx4KASLOu-ij-Ai6-MMfT-GIG5CZvjE3w6SiRFfeyzujNCsTT_uhm3s1YY3V8qE5kOoVq4cwt2mEhweuOqPJIMaiSKCWXNyWEXRkVVDit-vFCBX69snADlnGENbykCvgQNDUIjS1ng19ktFSCRjeerVa6Qn1erQ2YyJOfPKzQiYBDd2dchOw_vO85q8kJfJlgUpuE5Zc94vdx-QEgMGE-Edes6_t711WcS2S9jA5DYwZDHFqEnQAtSju92eUCwmHX5Vd_mNDOOWcLGxCZyrCWQKtcja3avMVaXEPOssc0SUtaegQJRhqfj2H8M-pUWwoI0hA208CVT-I5FNmv6x5gf8a9xxHf1LeMVZNTxj2IuQbr9v24mqr-hZEC-jhjFjaSsVHhkipzZo_mmtyT7zlGk3-BVrw-SY5gSNJ_av2ws7ACCc9SUPj4hKIlP_qIjbKZ9RET12mUGb1NLBh5sVBnp7A3I9Qz0myDIczSmSwiUfv4sV9KBoJSaax4pKXt3BhTzj2cPcYfEQwNehw_30OI375awp45Z9d9RgkSfbaGl6Rnw6MyOgJ95tgnoenAjA28eVBfgoMJnvIVcqJWU4XOKN8HN8xX6YeerNN2T_AvG9_vR7B8J617qgHQ9vMLpZhduvAFGF4D-VZksHDPj43F40a036qNBBP4cjz4nrvclBdRYBTHtcesCZ_Qd3wjpZd-Dh4xJW3M70OtC_w8rHcdbrmrEwSIdkheZ6kFMr3BqOJtrWfw07IpOj1uVJd4zNHb47iWe6U72QeJnU_aoouzg429I-tHj1_40H0G6FZabQui1A3tQwapsJRSzDeuRn96zLBKsNBwGTlf9miGdIr2d1qPBan-18_9yLoFC5rBPtstRfMKrOmxk9hDsnba_RvVVFnL7WuI9wwsf8dAHsdfrQd7mQUFuLkO62MkxvhRP7p4QX3HBECQzHRHGX-ziWDzAsIFGS3PlSiLuTDcTuuV8HHaqVFNuPK1754NZaVZFZ1ea6CLcZqwT6Rx1G4EoNJtLEtpuYOeQYwHxROVzbl69UVGbBLXWi8aaikj9W0JbCoB1QTdvBsRmAsEI9eHAnD7wgCo2deqkzI1oIkL48-6XWDVsxz1VouVyTMWh0A_VlI0LFIGzZRHqOjy5_bxx8TCaJnFW2oWCYBJt14J_rAFLa9ot8JNsK06nL5L_WiwNtXfRc-OHmc-bBpywes-9f-nhiJ57xUnaE8y1EEOsuxpkDhE4CPHEIRUR_H15TMlpLnj9jkpWL_jelU-Hb62SYeftht1NxTfL1ziDNgbmBtWHukp5cf453dJbk7yoRMp2TQjNvhXEXVkQyQvtm1SaV8jBBtk6xri5TGMcrAzEzCntapzI7fwPn72MiW-AD3l7geIzcBzOejTt_GdRmLRtqChPbon4Jl8tcMf38MJiqCiBlK5K3YfXHavg6pYB4g2VuBk8G9FJJnWL7wPD8Zecg17fRMB-J7nsbVkKxGE77ZMgu841YGelOLFw84aV_ScyYLDca6WaHWa9tvmTYGNasCsC44DwNg2OWaNL2jZ9NsADQAsAGolvTfbmc8LA_SqDoHG8oQ_twtNqPEYrHN-uCy9jJkrlwKBNtxHcTui5FPzBCegYYzyzy-qGz9HM9YrNewDw12tkrwB5urGgDyilktyfkLk524cr39nC65U-HyhBXA49_dCNR3FNg-bHeLC6ItreSJ-WCJtVyoJ7QQbEKqUx9xWiU357qqPS9-hoOwyq6EEooFnNPjaNqCGI_TWDxj28LDDF3hZAMn5H05R0IpevKhhMpAEF5U0DOs5ShDgzpNDLXJq2a63kOtp8rcbqn2rV0On0pTMSoKBVVLXFV6AMneIqFzTl7E7rBR71KSB2LqvxXzMb66l4E_qWYbF6D0zlo0MkatGJZHyUAzYXOfky4yoAyoU1TGyqj6WELZWRctuIvivVwQaDzV0dDndd3uVylte8dmG43z0qzVhbjKz6Z7NOSJXOgkugVhabDyn1BJMTl98RrwfbQz9G0oTR9yfd31Ta_MYbZ8YOU_x28fPiA778_LeYts3S4uBUPBa17HeO8nncV_stbHdpMBkOkFUvwYAsSqNu_7Nrig-d7WYZPSmqvVqHfrNfV3h-6mO7w0ClCrAvfxd0s6FcZaRERwyYXYT1mEq2NFSeEUR-fzeE7W0QtCsHeMDACrSZ_bkSL8dOQVstFwcinejd306RquYkR92dPETGyNqvFnxCPwq3C5pthsWdBh5dXY-Z7V5D_jJTb6PsJQY5E1oZzydNj0qeqUXpN6cTTTfAYkjTl9PppFHhRCMZH-qXQA==","summary":[{"type":"summary_text","text":"**Assessing live probe methods for broker status**"},{"type":"summary_text","text":"**Designing log-based thread and attachment correlation**"},{"type":"summary_text","text":"**Analyzing broker I/O and thread parking patterns**"}]},{"id":"rs_0365286983a6ba82016a59d54312b48194b6f48c42da53ed57","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdVQtVYAhB4xivzEzH5ZBq62JX8n4s8JMYifimswRJY0_6OFr4gjY_Yc9iIF_TJ3GwyqEENhsEmQEtmW5CjDLVnyMSQV7bOY2cUdocIOhyxTDRnPmwpEh1wbOZ_cSZpqZzc0nCMVo0BMFvp5xNfQAzroOzkDDQ5TlmdbL6JsUI6X0F9RsuAxYHEE4JGwgybMaFrpRnHcaJnVORUHeTeE8nNCHg77VcQ5uwhxyxYTntFsFue2V34fd8vYEIyihNE9NJcXqszjITMqW-aAne04WuLzYyXFxSGo7u4xsNUoufKHkvWB6naePD1QcPlwn8M93WEcCuZhzJG9r1lhmuNOI-hm7E6mLzMqFuePNuEeMXSynITxR0wbREvVXRPfD9AtE3MkcwNnsTbmV2cbCYpprM8t-K4yFBKe0GRi9gP6eNhZhiX0PjoL_b4X7DrMQC2MPQ1cMVfQa4g_fywrCY6tndv9Mb42jFboAuRvXSsU71hTYlasElpS22VwfnUo2IVMKUdEitwRFRwd4b4vH2OPOC-RroO_qRSm6NtI_2wz9yAp2E4qYJ-9aBcGPVq5aXyv0MnLu9gueaV213I8lMZ-E2QEoAE7WhafFDq9N6IV6i33yU3nppAPd_OcEeWLIKMnp4P0ffL6hHB_xlSGItal1JdGnSbk9nQXuS9STiMppU95Hqn6g0OH-QpDZ2Jp0VSHTCBFNBLR9UwP3T8LlDMzXWkowpCxVmWvcsVa6PzbNsfsMIkirH62MZi_K3TFodsYe90yyN10bgnlq_M-nhA4K0uo0cKYLyQkyHky10Jgnvb18cFhYaibyGQbwagNqqhy-M0HkG1vUdtR-v60chvgW_x-9VcPj9-LxufP60qPVMU9GB3RdgeHXT2MfsHAc7zMZHEsZ0XOFXmHODwD_y9xs_PE53EIwJSFmMTPt65a_UA3m2eFjz5EwbrsO60GvODwsz00XnqbWia6nejeEUsVLGAzxdGf_Qx0shm8BYOzl9t6ZPQLq42hoWuAEKz5NjsFJkaZ9hSo1W29RWCrm_6_3T4YM6bBRVUy7aj5bQHjRYdtZwd2r4OF0vktCPB93NHwGAF3KGz6ZhZkIovkCqDQZ0hfM81aLCF3adCThPxsfKHUmMGGHZARzP-h6gYrtyzhS-TcU-n4z5PAOlcm_Rn9m_ENIILA0jxwvzqr8vqTIu9RMbBIL6abNYePrgmn-pABjF22sgEtR_UJ7i9uxz2LG67hQynjyzIXIFbvGe9CG_cE7HedPMZ1joUYdeYzU_4QueGOeE6Oxuh46MhBiB2dnPlnf3Y2X2Tiwn0g-51E4cToocPsvvlIo1IWAiMwu7S8SQTJHdzsA9luMVnrqPfHvwx62ivfrD2XYsJCVk7xxL3pCYIVZjA6Z9yjfwyeEBDyPchkMf9DJ4gYROdAo-wRdQQHiAf_Ex9by8frDRJlDc0F_U2y1IdSwG9Z4Vd2KNxQIvzvkx97MX38e9exqutor1w17hn-Z-oYaFJTby2JS5Mx_J1DPU0uQxo_brgeKdvsbxRgbjkNAGrSOnW6N3-UN-kybu2XChqAUrkwbnW986eg3ED4Yh8A47ZGQsyAa8KM2fZnbHNieet9swFBMTG6WH14HwdF4Gj3fLC-L8Ax3b7DZbUVUX9AnUYrDetKFMjtRmHHwNV2Z2FZG8_G1yi2eR5_9tRd4KM2wezikkEpy7qKnAmwdAjyxNLvnVkNTaTLxWB_7unpobDWYSBZPKSPO8ZEgTWUCWL53JnPv2KQy441hXTVsyzaT8sYKelYfCNBj1WBteZLp_owZLd1TlePTulbg5UkQEjEUI-7CumGOea5eXiqPvB7xmt-h6HEZSmzuXJ82p2YTia-UWCwoEwn3hr6GD81S0H0PUTH5Ul5hMurl-P8lXVL7xVMezJM1-cGjI3dBsETFZN3O9qsxgzMPNvJGeIXREygwOK_X8OWk3s1_Rtx7hRtNgG4pYPrgdKqp24vZbGoJ8seCJIW8_weZhYVhTaFIpgl4E6rmvuuRpElL8pfLPdOde-2lLAmKtntQDZ29__WzuDWGFpcDRkkTTz8AiR7nOfuAHKiF26ezhpztVzkLjU__vhgbeD-NHrbHFCzAtRsudxwCU4pQU_XSZo2jSxXCoFKOFbbB5VE8Z2T-a3tkDasSlqhTwq1q--R1T2OgV27vG-soVChXhTZ1Lp-XU8Q7RZBWlQaENn0i-cKTP2OTGm5iTU5P5_q5P6DJfHRtC1LX8o2I9ipDub1DxfWNBYzVCJUpK5ISRd7uR3nekykRE8zn2-PJFfu4-Mgesn4qQ6D5OdwDBnh2qc5tgEeWRKoiQnvXcuTMTYaWC89ENvb0Nemrzr--AmADkNmPHysbyn2szYUpNLSsutnyIrmMd5_8g_3q9dd3HV1k3jKOnqdP50rFzljW_yaOARJD9YM3KXKy4ZbdnFnXIIKeQsRAS9RlmE2oYxM6CW1R8OKqvzQkikShz7Ln0hBC43IcbicR8wFKUrksN41TwFQUbwWfaQi2hlUxlCQY_OJM7XX_GQcYFEmXe_wjajGVe-G_mgb649bH3eu4zmpWJjo6y3Sp07hfjiMj3JdZagajuD_rvkp8T7HYzi0C-g7eTfv2JzcH1ZG9SCYJfKZSGPR65SlM_fQo2BTL52R-NYmqfdYJRn4La76Lcn_Kzm6vXqFHdHKwZDnu9qdy5OP4cuMdj5bw9MdfvWcrQ5teclZVbuiEBRttmlXo8dE8Pitn11tzSs5CQhJEzQUU5NUUEPky3ZkmvBxlm26R-7xCR8Lx3sFiWCwLzsQ85l3LuTX0CCH_W038aDxPgT7VNASqPI4amgxoB9S_gEvI7UPrke9AkNeb9WOt7ea4_sHP7et0fe9IAf1LSslMsH6X4d55YW_gjcDcD4Y-CDrO_mS9W899HVELqFznE8Bl8rHk2-AyyAAVatT-Bo0SycyjyGSg6tv7gMmG3tTA7Qy2a64z38jODr3FVFpYZMLBZvQd1oLRSnzwFcWK7S8ZSW-8FcRjofc2w9Y0o0U5Zg6Rt2WKqZvhap0YufyxNtQR8alai34or7fQ1hOEWYVrHzgS3fkY9wABBdQNtEHPOtZ5xBQB5fv79pkBsF-u2K1GCbx9qOXmWs-ZqAzI7K4A8uletyqUvwY48mLbBggVbqhhPPvyv_f1gEmLEX1g2faYQ6-N4pWJxTosH2rjWv6hi_tQqUJwg90XYZ-vqX9VcCBm1JxLf6SI2A4Q176KcsmLl0zC6YWQMexBQhEoY59fNt3lZ07ZIEeH2sLNlU1Mto2f2OMLVrze8l5-hstRgDuw6MHnVxCleLj_xC4P8T10S8qnUVpAbGNOq97CbdWMX5yxZfSDTrKUm533anj37nU5tFC85giCVC2bblw0ZT6s9wIj46qzM58le-La7sO_FHmvJOSuepOtBkL3djg_16Nbtb6I4nT9Cs3UB8PbfHqmQUXHiKEFLIWgAfgFXJICY_RKkRdJ3U0qsDcpzBLo5JWlQoCM90C-HFELiNKsZxmRxUud9Gu-Zljqm8LuXVC8KzD9yYP0udh_K0OuU3SVnDGTqVZBMsuK-fJIwLDc5fiCheM4jnGnu_jIJbpMP9vc1D4RPHRcnRiysVTvc9E9zZmkM_0tZrLhO2M6kpdMTVJjfBbc5vmWV2sMUzkgg2sFBVsOluUK-aC9eyflhyqu7r9h3z_L6NbnGe8BRJQue5qB-k-6WKrBia8HJMGK1VXK6HC2sLrI4we1mcDc9g2nFi9aA_oQCjlsWLRyuq3q8_m7ee_lfuBYvhrf5FnLFnZd4TVNaFEJbx18YEoOyFymDY9QThxhu_IW0ft58Clgh7Kl7RH1vNYyMzsPWQSsVDKsf6hyDHLbxkKLDZSsvDAvgm_kKm9hVE3roXq8G7GXDq1Tp3ZKOOLX2jHZqi-Dg==","summary":[{"type":"summary_text","text":"**Analyzing thread impact on I/O and CPU usage**"},{"type":"summary_text","text":"**Differentiating thread leak, spin, and normal states**"},{"type":"summary_text","text":"**Counting threads per PTY session and viewers**"}]},{"id":"rs_0365286983a6ba82016a59d550f980819488e5f1a298e6bb66","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdVdH97Tu44yDLPO3jfmxlpHXcIyw0tuyCVHtX1qwps5hajrEas54vqOmqdNNY-_w6rArQVlJAfO2jzOKqd56iwHjl23pWG5CoCktfd1EaS0ajGD9TRZ4-XRCaBMaoCLfWOBDGvkEjv6tvP2WXy9I6DcbJWMXOdmc4tZmdUpFjkFZCPjreUmzPqdvRx2UZlHCu1qRwuU72E074Ues1755e73ttVucM-nWnSVsqOuOANl6nIRzhOoPbPJlblxFzpjoxhTJ08iJQBqnC5rK959UsMhG4o9DCdpl9LYFsQxeyYIDhWXFBF-RGSvVzjS6wKFrfqCY-YtIB2k0xxz_0Mqn7jmJejUCgPqdJYmKeJe4ECS9ORS41yffIYH63cxGIg-o_aA-VsRL6c_AXi0ecOZbHUMJAv-UBhpffwf3PRiKyCDV5La1-4xUj_OuAYb-yUSTao5Qdvn3kLAkUqqYZaWHKh717iqaG2HxYduQ2MZ9x3yADVZrqFxM1M40W0FyoGX1MsI_ncsn_qZhqg2jBSOCBv5JMgF_P4tThKfmxQGr0VyjO_G1UxULwI8vwSvbTUKLGZ9OcG7LLZl5ul4T6IQoLkWyV3w0lo_l5jwTNdrJiIjJTg3KYyBHzTqkt4Jvcm54g106c3gt2ziErHKC_KUnH7-9bL8OLWsfONei-Ztc8KpFbFrhE38JV0TeLd2w-EOYUkVpFWrIq2-Hk0LXjPyHOUa-SWXTOHgAtIt0lMh3a8nxHyiWYmLMk2ad-IX59xOEuGtjFQG-HL_4HUI6SK7ThkCQ46PFiZbBoJbgcc4JrOLGBbmao88orWXulOT_IT4lYFGm-NDbRFFIh6ZnG85VcGs-R4wjL_y_Anl4ppBBFlww25t_bSbaAtCM1Cz6jSsG9QSmWn785mgpphvpCbwI6Wt_iVjZQ46aLG4eUnZ2f8QN1nzSdJO9HeSsAObP4gigtUkYlYXL_wphYWPhweZFWRGuZYCntfWlrqccKlVvtgcjfvjs-5zhhVANhUrpPafmVA7fPvOoeCP4CDf_STYjQdoHI6S_tGa9IXqIMlurtFj7-735yjCM3ht3Das1Fp9gnpGyni0t79uZ0uUhZoC_VpFeXNKobZ5zeO7rduVSkQpt6u6Xfq7_BHLnVfT9ylMcUKOsCQQ9qByNcSq5OAUc8gKvKiXNGI6m6Jbe4mEVwR30ty8XM1B6NiRycSSOR9ACMCTPst_YUXqdA5LJsqHGJ9j7Hk4djsERSdwIpZq4FgV0ZOAGuTJIW2oYOOpgs8kidvFwep_xXil7_ANNO6SBQYj21oMC7VCL9J2Ju81ARsz4_jXmXPk5DXsmtrfNqzKD_f2O_JRh86l73clU_9ixrDyCIpinMTl74v2zapec11hah4IyxXuqSOw88muRCADlbFk6HyDwQtGzXxkgtJjTulgVyoNTHnWFvKIjHkK_oJwBMt8HfQX_O3x6MJAfD05fSNRB4eaYTCcKkEnl6s5deKgqeYE8csfpPXrwS-OqlWDwDzJHqe2h054bcR1Jm_aRmB9rceW2zlpaZGGjMyATA99_GRWWLzSlZ4Br11n4C2POyi809O5r9Oxn2HbZ4r6Kxn2c_2IcEL9kR8286DIZ14mu8qT3dMa2rqxR7KnD1zhaQtJ9CIkadF4Nco0Z0B8qGXpDdiQ9PGsv94-HJalLaJrH2TEbQKwXZ6aaYDC3GlD1DOPLQfV-tDNH1QH8gYnFStt9giV2bbZNp9PLx1vhihK-_-8NTrSyA3qB4xu9dzbLJ29NstVXLD5gHhPFy9OeNBvMOspTrn3sbmYI0LofaiOHDwOQNa22P6U9VTEDy_y9-SwBmKW5v4Oq3BilDe1pDh3jLNeQKLQdOEP2lp2riKr1dEuqZwqLdi2KXUj5yc3qbTpKmdw2TsLIXurnijRlM3vykTALBdpr7H61MayNC4t96CK_eleGI_w3dZs80FV1SIax6_QZ1DYHjVQ5sdV7QURF1RglTuZuqadUtOQ1WTHnoeu9hFBuFMNfMU_SWSfYKZ9e3XAtLVdXk3YxfGt81nlFW_Pa_FHzgkmiOEGCSfHnphJxavQD5VbfdWbPSciINQRoa2IOwQMJwM8NHzXKMuFR_pWccuIiEhPhe75jYWZakDoMNpc4iT3_cH-KdCMaQetuW8KwkTtDhbbg-yDzGAufm5QOjfDTVHLFArnRg_Z5_dwthUhm_521wJIzNR89Kd2qDwBh9u96e70DAXrEXrSpK0IRlGDcKilcLwFHIhifcjCJvztutInaQMl_SVl6OhWtKQMGdsPStlPEazMo2rAzxykr9FQ5xJNekjThBH7HpmrudxGQz8Fo2AXgR-AISGc_noKfBCSDM7_67GdtS_2r4hlKqSb1Y56DpSLAflnp3_UOSRfig94AcVV_H3LDBhcBacEZP752DFxWdP_UYigBs9Pd8lBVhuJy99ZoU0BKVrKItIE6J630ZxJFZ0WShND8RryUb9Zfqv9XmPfGeQW4E8jNMkeCXiFIP_-J1atIIt29LcGoGw7knG1BWDVVMY2WSrYAiaWiQ7DK2YGumq_HF9YIjS_vsnS3WPUk1gId2AhSGqpt43egNFajUiUMtlglI7FxyaflmP5hk6fx3BCNKf_M5LGrbOzAHZUj1qBsSYG9vcLzvlRw6xFAQy9tmNkDn3issyPxWDk8TbmVe_YBDt7LtM0s4kqOJ-QzvCziJx2MppNPXcWZmXO6Axei0CImN1FP2kah5_j6-emRsytwOvsPxfBvdttTtuhf1iEi3w_pX0PBJpdvLNcFrWVEvtDorNWBggq8hH3UmHMgrR2sPr0eOPpN1DsQl-0BHHyetp4HMQ50__qm-Al1VkTDXYFnhGWaOI7IFE436yUlDE5E5kK3lnmJxfKyZWQVFY0G660-3ewD0GkqO4U38Dj7sJu-ecnldPONbsz7jnCILm2rzKj6_gMXevi_0BeBvJ3BplvbZ9U12HXC-FnQ6OrYKqDxP7unUMwSUMnEYRw6CcJcuea0NBo2_ZQaDV38Vws1ukLw2adjCE0kMLpx5KNpb4myjw9dswQC3JnHmFR1nERal1cyFNmPKxEdPKlJBSKhBK0lX8IoqZy1xWj208AUa2nx5Xjux7-vffNALcrseF-8an8g2b8Qrr_JuPutG-2py722vb_XdKM-7uZR-E6MzM=","summary":[{"type":"summary_text","text":"**Identifying missing Drop implementations and teardown leaks**"},{"type":"summary_text","text":"**Analyzing potential blocking in input writer and connection handlers**"}]},{"id":"fc_0365286983a6ba82016a59d55d69748194aadfc6785c478b2f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading network runtime threading\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1175-1205,975-1065\"}","call_id":"call_6798h6mIekYwIbq442UEioEf","name":"read"},{"id":"fc_0365286983a6ba82016a59d55d6a448194b7c7c2a1d821f09b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading connection handler gauge\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"2990-3025\"}","call_id":"call_LlZEHaq2Q7Egj5fuhyWgvWQU","name":"read"},{"id":"fc_0365286983a6ba82016a59d55d6a4c8194a4dd62fdc574e489","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading viewer hard cap\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"85-150\"}","call_id":"call_4ysvcT8tVOKZ5zNkBWcx5EiN","name":"read"},{"id":"fc_0365286983a6ba82016a59d55d6a548194b2896e2be9639040","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading InputWriter loop exit\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"1830-1898\"}","call_id":"call_ajnhkL6cPfOuoIIqJlPDafbZ","name":"read"},{"id":"fc_0365286983a6ba82016a59d55d6a58819497cfffc61d2bf85b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding stream read task spawn\",\"pattern\":\"read_stream|read_pump|spawn\\\\(async move|runtime\\\\.spawn\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"900-1150\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_WKPLAkyghLU2ixWlds4FVJOX","name":"grep"}]},"duration":59801.979300007224,"ttft":5742.253499999642,"contextSnapshot":{"promptTokens":128431,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_6798h6mIekYwIbq442UEioEf|fc_0365286983a6ba82016a59d55d69748194aadfc6785c478b2f","toolName":"read","startedAt":"2026-07-17T07:10:22.690Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading network runtime threading"},"id":"56c3ad5a","parentId":"964ab160","timestamp":"2026-07-17T07:10:22.690Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_LlZEHaq2Q7Egj5fuhyWgvWQU|fc_0365286983a6ba82016a59d55d6a448194b7c7c2a1d821f09b","toolName":"read","startedAt":"2026-07-17T07:10:22.690Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading connection handler gauge"},"id":"914b0a1a","parentId":"56c3ad5a","timestamp":"2026-07-17T07:10:22.690Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_4ysvcT8tVOKZ5zNkBWcx5EiN|fc_0365286983a6ba82016a59d55d6a4c8194a4dd62fdc574e489","toolName":"read","startedAt":"2026-07-17T07:10:22.690Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading viewer hard cap"},"id":"fba34da7","parentId":"914b0a1a","timestamp":"2026-07-17T07:10:22.690Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ajnhkL6cPfOuoIIqJlPDafbZ|fc_0365286983a6ba82016a59d55d6a548194b2896e2be9639040","toolName":"read","startedAt":"2026-07-17T07:10:22.690Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading InputWriter loop exit"},"id":"b1efa9fd","parentId":"fba34da7","timestamp":"2026-07-17T07:10:22.690Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_WKPLAkyghLU2ixWlds4FVJOX|fc_0365286983a6ba82016a59d55d6a58819497cfffc61d2bf85b","toolName":"grep","startedAt":"2026-07-17T07:10:22.690Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Finding stream read task spawn"},"id":"53fe34c1","parentId":"b1efa9fd","timestamp":"2026-07-17T07:10:22.690Z"}
{"type":"message","id":"71060535","parentId":"53fe34c1","timestamp":"2026-07-17T07:10:22.695Z","message":{"role":"toolResult","toolCallId":"call_WKPLAkyghLU2ixWlds4FVJOX|fc_0365286983a6ba82016a59d55d6a58819497cfffc61d2bf85b","toolName":"grep","content":[{"type":"text","text":" 953|    let hex_close = remote_id_hex.clone();\n*954|    tokio::spawn(async move {\n 955|        conn_close.closed().await;\n 956|        sh_close.conns.lock().unwrap().remove(&id);\n 957|        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n...\n 979|    let hex = remote_id_hex.clone();\n*980|    tokio::spawn(async move {\n 981|        while let Ok((send, recv)) = conn.accept_bi().await {\n 982|            register_stream(\n 983|                &sh,\n...\n 1035|    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n*1036|    tokio::spawn(async move {\n 1037|        match recv {\n 1038|            RecvHalf::Quic(mut recv) => loop {\n 1039|                await_ring_room(&log, &room).await;"}],"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":3,"fileCount":1,"files":["crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/nethost.rs","count":3}],"truncated":false,"displayContent":"  953│    let hex_close = remote_id_hex.clone();\n *954│    tokio::spawn(async move {\n  955│        conn_close.closed().await;\n  956│        sh_close.conns.lock().unwrap().remove(&id);\n  957│        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n     │...\n  979│    let hex = remote_id_hex.clone();\n *980│    tokio::spawn(async move {\n  981│        while let Ok((send, recv)) = conn.accept_bi().await {\n  982│            register_stream(\n  983│                &sh,\n     │...\n 1035│    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n*1036│    tokio::spawn(async move {\n 1037│        match recv {\n 1038│            RecvHalf::Quic(mut recv) => loop {\n 1039│                await_ring_room(&log, &room).await;"},"isError":false,"timestamp":1784272222695}}
{"type":"message","id":"d336b412","parentId":"71060535","timestamp":"2026-07-17T07:10:22.713Z","message":{"role":"toolResult","toolCallId":"call_6798h6mIekYwIbq442UEioEf|fc_0365286983a6ba82016a59d55d69748194aadfc6785c478b2f","toolName":"read","content":[{"type":"text","text":"fn register_conn(\n…\n) -> (u64, String) {\n…\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n    let hex = remote_id_hex.clone();\n    tokio::spawn(async move {\n        while let Ok((send, recv)) = conn.accept_bi().await {\n            register_stream(\n                &sh,\n                id,\n                &hex,\n                SendHalf::Quic(send),\n                RecvHalf::Quic(recv),\n                false,\n            );\n        }\n    });\n\n    (id, remote_id_hex)\n}\n\n/// Register a live stream (opened or accepted): mint its broker id and spawn\n/// its read pump. Must run inside the host's runtime context.\n/// `initiated_locally` records the direction fact for the table (true only\n/// from [`NetHost::open_stream`]).\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n…\n    /// The meet-rotation listener loop rides the same runtime.\n    // [impl->REQ-DAEMON-2]\n    // [impl->REQ-SUBNET-2]\n    pub fn start(cfg: NetConfig) -> io::Result<NetHost> {\n        // Hermeticity guard (REQ-PAIR-8): a loopback-scoped endpoint is the\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n        let endpoint = runtime\n            .block_on(NetEndpoint::bind_scoped(\n                &cfg.identity,\n                cfg.relay.clone(),\n                cfg.discovery,\n                vec![\n                    SPT_NET_ALPN.to_vec(),\n                    spt_net::net::pairing::wire::SPT_PAIR_ALPN.to_vec(),\n                ],\n                cfg.scope,\n            ))\n            .map_err(|e| io::Error::other(e.to_string()))?;\n        let endpoint = Arc::new(endpoint);\n        let shared = Arc::new(NetShared::new());\n        let local_pub = cfg.identity.public_key();\n        let pair_rate = Arc::new(tokio::sync::Mutex::new(\n            spt_net::net::pairing::ratelimit::PairingRateLimiter::new(),\n        ));\n…\n    }"}],"details":{"displayContent":{"text":"fn register_conn(\n…\n) -> (u64, String) {\n…\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n    let hex = remote_id_hex.clone();\n    tokio::spawn(async move {\n        while let Ok((send, recv)) = conn.accept_bi().await {\n            register_stream(\n                &sh,\n                id,\n                &hex,\n                SendHalf::Quic(send),\n                RecvHalf::Quic(recv),\n                false,\n            );\n        }\n    });\n\n    (id, remote_id_hex)\n}\n\n/// Register a live stream (opened or accepted): mint its broker id and spawn\n/// its read pump. Must run inside the host's runtime context.\n/// `initiated_locally` records the direction fact for the table (true only\n/// from [`NetHost::open_stream`]).\nfn register_stream(\n    shared: &Arc<NetShared>,\n    conn_id: u64,\n    remote_id_hex: &str,\n    send: SendHalf,\n    recv: RecvHalf,\n    initiated_locally: bool,\n) -> u64 {\n    let id = shared.next_stream_id.fetch_add(1, Ordering::Relaxed);\n    let log = Arc::new(Mutex::new(StreamLog::new(id, shared.ring_cap)));\n    let room = Arc::new(tokio::sync::Notify::new());\n    shared.streams.lock().unwrap().insert(\n        id,\n        Arc::new(StreamEntry {\n            conn_id,\n            remote_id_hex: remote_id_hex.to_string(),\n            initiated_locally,\n            send: tokio::sync::Mutex::new(send),\n            log: Arc::clone(&log),\n            room: Arc::clone(&room),\n            retired: std::sync::atomic::AtomicBool::new(false),\n        }),\n    );\n\n    // The read pump — the stream's single producer. A clean end (peer finish)\n    // and a torn end (conn lost) both finish the log; the buffered chunks stay\n    // replayable either way. The transport differs only at this read leaf\n    // (QUIC chunk API vs the loopback duplex's `AsyncRead`); both append to the\n    // same `StreamLog`, so nothing above the pump can tell them apart.\n    //\n    // Backpressure (M11-W3, REQ-SHELL-4): a retentive (tunnel) log never evicts,\n    // so before pulling the next chunk the pump WAITS while the undrained ring is\n    // at its `retentive_cap`. The unread bytes stay in the transport's buffer, so\n    // QUIC stream flow-control (or the loopback duplex's bounded buffer) lags the\n    // SENDER — \"lag, never loss\" (CONTEXT:262). A `drain` wakes `room`. Ordinary\n    // streams have `retentive_cap == 0`, so this gate is a no-op for them.\n    tokio::spawn(async move {\n        match recv {\n            RecvHalf::Quic(mut recv) => loop {\n                await_ring_room(&log, &room).await;\n                match recv.read_chunk(STREAM_READ_CHUNK).await {\n                    Ok(Some(chunk)) => log.lock().unwrap().append(&chunk.bytes),\n                    Ok(None) | Err(_) => {\n                        log.lock().unwrap().finish();\n                        break;\n                    }\n                }\n            },\n            RecvHalf::Loopback(mut recv) => {\n                let mut buf = vec![0u8; STREAM_READ_CHUNK];\n                loop {\n                    await_ring_room(&log, &room).await;\n                    match recv.read(&mut buf).await {\n                        Ok(0) | Err(_) => {\n                            log.lock().unwrap().finish();\n                            break;\n                        }\n                        Ok(n) => log.lock().unwrap().append(&buf[..n]),\n                    }\n                }\n            }\n        }\n    });\n\n    id\n}\n…\n    /// The meet-rotation listener loop rides the same runtime.\n    // [impl->REQ-DAEMON-2]\n    // [impl->REQ-SUBNET-2]\n    pub fn start(cfg: NetConfig) -> io::Result<NetHost> {\n        // Hermeticity guard (REQ-PAIR-8): a loopback-scoped endpoint is the\n        // \"no network reached\" promise — the ceremony clock's lazy NTP query\n        // must honor it (tests must never probe a real NTP server). Real\n        // scopes keep the decision-18 offset correction.\n        spt_net::net::pairing::ntp::set_enabled(!matches!(cfg.scope, BindScope::Loopback));\n        let runtime = tokio::runtime::Builder::new_multi_thread()\n            .worker_threads(2)\n            .thread_name(\"spt-broker-net\")\n            .enable_all()\n            .build()?;\n        let endpoint = runtime\n            .block_on(NetEndpoint::bind_scoped(\n                &cfg.identity,\n                cfg.relay.clone(),\n                cfg.discovery,\n                vec![\n                    SPT_NET_ALPN.to_vec(),\n                    spt_net::net::pairing::wire::SPT_PAIR_ALPN.to_vec(),\n                ],\n                cfg.scope,\n            ))\n            .map_err(|e| io::Error::other(e.to_string()))?;\n        let endpoint = Arc::new(endpoint);\n        let shared = Arc::new(NetShared::new());\n        let local_pub = cfg.identity.public_key();\n        let pair_rate = Arc::new(tokio::sync::Mutex::new(\n            spt_net::net::pairing::ratelimit::PairingRateLimiter::new(),\n        ));\n…\n    }","startLine":916,"lineNumbers":[916,null,920,null,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,null,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,null,1312]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784272222713}}
{"type":"message","id":"168c90da","parentId":"d336b412","timestamp":"2026-07-17T07:10:22.761Z","message":{"role":"toolResult","toolCallId":"call_4ysvcT8tVOKZ5zNkBWcx5EiN|fc_0365286983a6ba82016a59d55d6a4c8194a4dd62fdc574e489","toolName":"read","content":[{"type":"text","text":"\n/// Default bounded output-log depth (chunks). Large enough that a brain restart\n/// window never evicts unreplayed output in practice; the bound is what keeps a\n/// disconnected session from buffering without limit.\nconst DEFAULT_LOG_CHUNKS: usize = 4096;\n\n/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it\n/// OVERFLOWS the viewer is evicted — the drain `try_send`s and never blocks\n/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n/// owns the replay batch), so a viewer attaching to a busy session is not\n/// spuriously evicted.\nconst VIEWER_CHANNEL_DEPTH: usize = 256;\n\n/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\nconst MAX_VIEWERS: usize = 32;\n\n/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n/// the live stream) or a `Disconnected` one (its writer thread ended after a\n/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n/// is the pure decision the fan-out applies under the log lock.\n// [impl->REQ-HAZARD-VIEWER-ISOLATION]\nfn viewer_send_evicts<T>(r: &Result<(), TrySendError<T>>) -> bool {\n    r.is_err()\n}\n\n/// One read-only viewer's isolated sink (REQ-HAZARD-VIEWER-ISOLATION). The drain\n/// thread `try_send`s output frames into `tx` (a bounded queue); a dedicated\n/// `writer` thread does the BLOCKING socket write, so a wedged viewer backs up\n/// only its own queue — never the drain. When the queue overflows the sink is\n/// dropped (the `tx` closes → the writer ends) and removed from the map.\nstruct ViewerSink {\n    /// The bounded live-frame queue to this viewer's writer thread.\n    tx: SyncSender<Envelope>,\n    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n    /// (a dropped brain connection removes its viewer rows); never written here.\n    send: SharedSend,\n    /// Set TRUE when this viewer is EVICTED for overflow (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT),\n    /// distinguishing an eviction from a normal teardown (session end / conn drop).\n    /// `append` stores `true` BEFORE dropping the sink (and thus `tx`); the writer,\n    /// on its `rx.recv()` Err, reads this and — when true — emits a\n    /// [`KIND_VIEWER_EVICTED`] marker (in the writer thread, OFF the log lock) so\n    /// the serving brain skips to live instead of tearing the attach down.\n    evicted: Arc<AtomicBool>,\n    /// The writer thread handle (held for ownership; it exits when `tx` drops or\n    /// a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// The controller live-frame channel depth (frames). Deeper than a viewer's\n/// queue because the controller is the AUTHORITATIVE view — unlike a viewer it is\n/// NOT evicted on a SINGLE full `try_send` (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// b4: the drain does ONE non-blocking `try_send` per chunk and NEVER blocks; a\n/// merely-slow controller DROPS chunks + falls behind the ring, and only a channel\n/// that stays full for [`CONTROLLER_WRITE_DEADLINE`] (tracked via\n/// [`ControllerSink::last_ok`]) is detached. Generous so a momentary slow consumer\n/// never trips the deadline.\nconst CONTROLLER_CHANNEL_DEPTH: usize = 4096;\n\n/// How long a CONTROLLER's channel may stay FULL (no successful handoff since\n/// [`ControllerSink::last_ok`]) before the drain declares it stalled and detaches it\n/// (W1, refined by b4 / REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE). This\n/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n/// untouched.\n\n[Showing lines 84-153 of 6298. Use :154 to continue]"}],"details":{"truncation":{"content":"\n/// Default bounded output-log depth (chunks). Large enough that a brain restart\n/// window never evicts unreplayed output in practice; the bound is what keeps a\n/// disconnected session from buffering without limit.\nconst DEFAULT_LOG_CHUNKS: usize = 4096;\n\n/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it\n/// OVERFLOWS the viewer is evicted — the drain `try_send`s and never blocks\n/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n/// owns the replay batch), so a viewer attaching to a busy session is not\n/// spuriously evicted.\nconst VIEWER_CHANNEL_DEPTH: usize = 256;\n\n/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\nconst MAX_VIEWERS: usize = 32;\n\n/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n/// the live stream) or a `Disconnected` one (its writer thread ended after a\n/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n/// is the pure decision the fan-out applies under the log lock.\n// [impl->REQ-HAZARD-VIEWER-ISOLATION]\nfn viewer_send_evicts<T>(r: &Result<(), TrySendError<T>>) -> bool {\n    r.is_err()\n}\n\n/// One read-only viewer's isolated sink (REQ-HAZARD-VIEWER-ISOLATION). The drain\n/// thread `try_send`s output frames into `tx` (a bounded queue); a dedicated\n/// `writer` thread does the BLOCKING socket write, so a wedged viewer backs up\n/// only its own queue — never the drain. When the queue overflows the sink is\n/// dropped (the `tx` closes → the writer ends) and removed from the map.\nstruct ViewerSink {\n    /// The bounded live-frame queue to this viewer's writer thread.\n    tx: SyncSender<Envelope>,\n    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n    /// (a dropped brain connection removes its viewer rows); never written here.\n    send: SharedSend,\n    /// Set TRUE when this viewer is EVICTED for overflow (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT),\n    /// distinguishing an eviction from a normal teardown (session end / conn drop).\n    /// `append` stores `true` BEFORE dropping the sink (and thus `tx`); the writer,\n    /// on its `rx.recv()` Err, reads this and — when true — emits a\n    /// [`KIND_VIEWER_EVICTED`] marker (in the writer thread, OFF the log lock) so\n    /// the serving brain skips to live instead of tearing the attach down.\n    evicted: Arc<AtomicBool>,\n    /// The writer thread handle (held for ownership; it exits when `tx` drops or\n    /// a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// The controller live-frame channel depth (frames). Deeper than a viewer's\n/// queue because the controller is the AUTHORITATIVE view — unlike a viewer it is\n/// NOT evicted on a SINGLE full `try_send` (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// b4: the drain does ONE non-blocking `try_send` per chunk and NEVER blocks; a\n/// merely-slow controller DROPS chunks + falls behind the ring, and only a channel\n/// that stays full for [`CONTROLLER_WRITE_DEADLINE`] (tracked via\n/// [`ControllerSink::last_ok`]) is detached. Generous so a momentary slow consumer\n/// never trips the deadline.\nconst CONTROLLER_CHANNEL_DEPTH: usize = 4096;\n\n/// How long a CONTROLLER's channel may stay FULL (no successful handoff since\n/// [`ControllerSink::last_ok`]) before the drain declares it stalled and detaches it\n/// (W1, refined by b4 / REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE). This\n/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n/// untouched.","truncated":true,"truncatedBy":"lines","totalLines":6215,"totalBytes":4121,"outputLines":70,"outputBytes":4121,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"\n/// Default bounded output-log depth (chunks). Large enough that a brain restart\n/// window never evicts unreplayed output in practice; the bound is what keeps a\n/// disconnected session from buffering without limit.\nconst DEFAULT_LOG_CHUNKS: usize = 4096;\n\n/// The viewer-channel depth (frames). A bounded SPSC queue per viewer; when it\n/// OVERFLOWS the viewer is evicted — the drain `try_send`s and never blocks\n/// (REQ-HAZARD-VIEWER-ISOLATION). Generous enough to absorb a normal render\n/// hiccup; a viewer that falls this far behind on the LIVE stream is genuinely\n/// not keeping up. Replay-at-attach does NOT ride this bound (the writer thread\n/// owns the replay batch), so a viewer attaching to a busy session is not\n/// spuriously evicted.\nconst VIEWER_CHANNEL_DEPTH: usize = 256;\n\n/// Soft cap on concurrent viewers per session (REQ-HAZARD-VIEWER-ISOLATION:\n/// bounds the writer-thread count). A `Viewer` attach beyond the cap is refused.\nconst MAX_VIEWERS: usize = 32;\n\n/// Whether a viewer's bounded-queue `try_send` result demands EVICTION\n/// (REQ-HAZARD-VIEWER-ISOLATION): a `Full` queue (the viewer can't keep up with\n/// the live stream) or a `Disconnected` one (its writer thread ended after a\n/// dead socket). The drain evicts on either and NEVER blocks on a viewer — this\n/// is the pure decision the fan-out applies under the log lock.\n// [impl->REQ-HAZARD-VIEWER-ISOLATION]\nfn viewer_send_evicts<T>(r: &Result<(), TrySendError<T>>) -> bool {\n    r.is_err()\n}\n\n/// One read-only viewer's isolated sink (REQ-HAZARD-VIEWER-ISOLATION). The drain\n/// thread `try_send`s output frames into `tx` (a bounded queue); a dedicated\n/// `writer` thread does the BLOCKING socket write, so a wedged viewer backs up\n/// only its own queue — never the drain. When the queue overflows the sink is\n/// dropped (the `tx` closes → the writer ends) and removed from the map.\nstruct ViewerSink {\n    /// The bounded live-frame queue to this viewer's writer thread.\n    tx: SyncSender<Envelope>,\n    /// The viewer's IPC send half — kept ONLY for identity matching on detach\n    /// (a dropped brain connection removes its viewer rows); never written here.\n    send: SharedSend,\n    /// Set TRUE when this viewer is EVICTED for overflow (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT),\n    /// distinguishing an eviction from a normal teardown (session end / conn drop).\n    /// `append` stores `true` BEFORE dropping the sink (and thus `tx`); the writer,\n    /// on its `rx.recv()` Err, reads this and — when true — emits a\n    /// [`KIND_VIEWER_EVICTED`] marker (in the writer thread, OFF the log lock) so\n    /// the serving brain skips to live instead of tearing the attach down.\n    evicted: Arc<AtomicBool>,\n    /// The writer thread handle (held for ownership; it exits when `tx` drops or\n    /// a socket write fails).\n    _writer: JoinHandle<()>,\n}\n\n/// The controller live-frame channel depth (frames). Deeper than a viewer's\n/// queue because the controller is the AUTHORITATIVE view — unlike a viewer it is\n/// NOT evicted on a SINGLE full `try_send` (W1 / REQ-HAZARD-INJECT-CONTROL-COEXIST).\n/// b4: the drain does ONE non-blocking `try_send` per chunk and NEVER blocks; a\n/// merely-slow controller DROPS chunks + falls behind the ring, and only a channel\n/// that stays full for [`CONTROLLER_WRITE_DEADLINE`] (tracked via\n/// [`ControllerSink::last_ok`]) is detached. Generous so a momentary slow consumer\n/// never trips the deadline.\nconst CONTROLLER_CHANNEL_DEPTH: usize = 4096;\n\n/// How long a CONTROLLER's channel may stay FULL (no successful handoff since\n/// [`ControllerSink::last_ok`]) before the drain declares it stalled and detaches it\n/// (W1, refined by b4 / REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE). This\n/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n/// untouched.","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,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":4121,"outputLines":70,"outputBytes":4121,"shownRange":{"start":84,"end":153},"nextOffset":154}}},"isError":false,"timestamp":1784272222761}}
{"type":"message","id":"b517b373","parentId":"168c90da","timestamp":"2026-07-17T07:10:22.833Z","message":{"role":"toolResult","toolCallId":"call_ajnhkL6cPfOuoIIqJlPDafbZ|fc_0365286983a6ba82016a59d55d6a548194b2896e2be9639040","toolName":"read","content":[{"type":"text","text":"impl InputWriter {\n…\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}\n\n/// A session's input-writer thread (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): drain\n/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can\n/// leave the ring torn (a bumped `next_seq` past the ring, an over-cap ring from an\n/// interrupted prune, a non-monotonic front/back), and replaying those bytes to a\n/// subscriber risks garbage. So ONLY on the recovered (poisoned) branch, run\n/// [`OutputLog::clamp_or_reset`]: cheap-check the ring invariants and RESET it empty\n/// (+ loud log) on any violation. Lost scrollback self-heals on the next PTY output +\n/// repaint — strictly better than a permanent wedge (fail-fast reintroduces the very\n/// wedge B-1 kills) or a torn serve (blind recover). The healthy `Ok` path is a pure\n/// lock — no clamp, no cost on the hot append path.\n\n[Showing lines 1829-1901 of 6298. Use :1902 to continue]"}],"details":{"truncation":{"content":"    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}\n\n/// A session's input-writer thread (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): drain\n/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can\n/// leave the ring torn (a bumped `next_seq` past the ring, an over-cap ring from an\n/// interrupted prune, a non-monotonic front/back), and replaying those bytes to a\n/// subscriber risks garbage. So ONLY on the recovered (poisoned) branch, run\n/// [`OutputLog::clamp_or_reset`]: cheap-check the ring invariants and RESET it empty\n/// (+ loud log) on any violation. Lost scrollback self-heals on the next PTY output +\n/// repaint — strictly better than a permanent wedge (fail-fast reintroduces the very\n/// wedge B-1 kills) or a torn serve (blind recover). The healthy `Ok` path is a pure\n/// lock — no clamp, no cost on the hot append path.","truncated":true,"truncatedBy":"lines","totalLines":4470,"totalBytes":4551,"outputLines":73,"outputBytes":4551,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl InputWriter {\n…\n    fn stamp_backpressure(&self, dropping: bool) {\n        if self.endpoint.is_empty() {\n            return;\n        }\n        let perch = resolve_perch_path(&self.endpoint, ParentHint::Infer);\n        let _ = spt_store::info::set_input_backpressure(&perch, dropping);\n    }\n}\n\n/// A session's input-writer thread (REQ-HAZARD-PTY-INPUT-WRITER-WEDGE): drain\n/// records from `rx` and apply each via the BLOCKING\n/// [`SessionSurface::write_input`] — the ONE place that touches the PTY writer. A\n/// wedged harness parks this thread (and only this thread); a write error is\n/// swallowed (the same best-effort the inline callers had). The thread exits\n/// when the last `tx` clone drops at session teardown.\nfn input_writer(session: Arc<PtySession>, rx: Receiver<InputRecord>) {\n    while let Ok(bytes) = rx.recv() {\n        let _ = session.write_input(&bytes);\n    }\n}\n\n/// Drain the inject floor's buffered controller input to the PTY **after** an\n/// injected sequence, then release the floor. Each step takes the buffered bytes\n/// OFF the lock before ENQUEUEING it to the lone input-writer (the W1 rule: never\n/// hold a lock across a PTY write — now never block on it either); input arriving\n/// mid-flush keeps buffering, so strict order is preserved until the buffer\n/// drains empty and the floor frees.\n/// Lock the per-session inject floor, RECOVERING a poisoned mutex instead of\n/// panicking (B6, REQ-HAZARD-INJECT-WORKER-POISON). The floor is SHARED by the\n/// inject worker (`run_inject_worker` open / `flush_inject_floor`) and the\n/// controller-input path (`dispatch_input` Layer C `buffer_if_held`). A panic under\n/// the lock on EITHER poisons it; a bare `.lock().unwrap()` at the next site then\n/// panics too — and a panic in the inject WORKER kills its thread WITHOUT reaping\n/// the translation child, ORPHANING a live binary while `event_tx.send` fails, so\n/// force-native delivery reports \"worker-gone\" (delivered=false) FOREVER though the\n/// pid is alive (the F-e mis-diagnosed \"translation-binary liveness decay\").\n/// Recovering the guard (the effect-journal poison-tolerance idiom, bug #16 /\n/// REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) keeps the floor usable so ONE panic cannot\n/// cascade the whole session's delivery dead.\n// [impl->REQ-HAZARD-INJECT-WORKER-POISON]\nfn lock_floor(floor: &Mutex<InjectFloor>) -> std::sync::MutexGuard<'_, InjectFloor> {\n    floor.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// Poison-tolerant lock for ANY broker-resident mutex reachable from serve/dispatch\n/// (B-1, REQ-HAZARD-BROKER-FLOOR-LOCK-POISON). A brain-only self-update keeps the\n/// broker process — and every one of its `Mutex`es — ALIVE (REQ-UPD-3), so a single\n/// panic while another thread held one of these locks would otherwise POISON it\n/// permanently: the next `.lock().unwrap()` panics too, its per-conn reply thread\n/// dies, and EVERY subsequent attach silently deadlines (`spt rc` → \"brain IPC read\n/// deadline elapsed\", brain.rs) while non-locked ops keep working. The `into_inner`\n/// idiom (identical to [`lock_floor`] and the effect journal, bug #16) keeps the\n/// broker serving. Safe for the SHORT map ops it guards (`sessions` / `pair_holds`\n/// inserts+removes stay coherent on recovery — the same argument as the floor). The\n/// per-session `OutputLog` RING needs the extra coherence clamp of [`recover_log`].\n/// CLASS INVARIANT (KNOWN-HAZARDS): NO bare `.lock().unwrap()` on a broker-resident\n/// lock reachable from serve/dispatch — use `recover`/`recover_log` or a documented\n/// fail-fast justification.\n// [impl->REQ-HAZARD-BROKER-FLOOR-LOCK-POISON]\nfn recover<T>(m: &Mutex<T>) -> std::sync::MutexGuard<'_, T> {\n    m.lock().unwrap_or_else(|p| p.into_inner())\n}\n\n/// [`recover`] for the per-session [`OutputLog`] RING, with a COHERENCE CLAMP on the\n/// poison-recovery path (B-1, doyle ruling). A panic mid-[`OutputLog::append`] can\n/// leave the ring torn (a bumped `next_seq` past the ring, an over-cap ring from an\n/// interrupted prune, a non-monotonic front/back), and replaying those bytes to a\n/// subscriber risks garbage. So ONLY on the recovered (poisoned) branch, run\n/// [`OutputLog::clamp_or_reset`]: cheap-check the ring invariants and RESET it empty\n/// (+ loud log) on any violation. Lost scrollback self-heals on the next PTY output +\n/// repaint — strictly better than a permanent wedge (fail-fast reintroduces the very\n/// wedge B-1 kills) or a torn serve (blind recover). The healthy `Ok` path is a pure\n/// lock — no clamp, no cost on the hot append path.","startLine":1785,"lineNumbers":[1785,null,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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":4551,"outputLines":73,"outputBytes":4551,"shownRange":{"start":1829,"end":1901},"nextOffset":1902}}},"isError":false,"timestamp":1784272222833}}
{"type":"message","id":"4da24999","parentId":"b517b373","timestamp":"2026-07-17T07:10:22.833Z","message":{"role":"toolResult","toolCallId":"call_LlZEHaq2Q7Egj5fuhyWgvWQU|fc_0365286983a6ba82016a59d55d6a448194b7c7c2a1d821f09b","toolName":"read","content":[{"type":"text","text":"    pub fn any_local_controller_wedged(&self) -> bool {\n…\n        sessions.values().any(|h| {\n            match h.log.lock() {\n…\n                // (fail toward promotion, never a permanent gate that strands apply).\n                Err(_) => false,\n            }\n        })\n    }\n\n    /// The count of live QUIC connections the broker-owned net endpoint holds\n    /// (D4a, ADR-0004 §B), or 0 when net-less. A direct read of the broker's own\n    /// state — the survival-assertion seam for the D7-1 process-level E2E: a QUIC\n    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n…\n    }\n\n[Showing lines 2989-3028 of 6298. Use :3029 to continue]"}],"details":{"truncation":{"content":"                // (fail toward promotion, never a permanent gate that strands apply).\n                Err(_) => false,\n            }\n        })\n    }\n\n    /// The count of live QUIC connections the broker-owned net endpoint holds\n    /// (D4a, ADR-0004 §B), or 0 when net-less. A direct read of the broker's own\n    /// state — the survival-assertion seam for the D7-1 process-level E2E: a QUIC\n    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);","truncated":true,"truncatedBy":"lines","totalLines":3310,"totalBytes":2101,"outputLines":40,"outputBytes":2101,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn any_local_controller_wedged(&self) -> bool {\n…\n        sessions.values().any(|h| {\n            match h.log.lock() {\n…\n                // (fail toward promotion, never a permanent gate that strands apply).\n                Err(_) => false,\n            }\n        })\n    }\n\n    /// The count of live QUIC connections the broker-owned net endpoint holds\n    /// (D4a, ADR-0004 §B), or 0 when net-less. A direct read of the broker's own\n    /// state — the survival-assertion seam for the D7-1 process-level E2E: a QUIC\n    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn net_conn_count(&self) -> usize {\n        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n    }\n\n    /// The output-log high-water (`next_seq`) of a hosted session, or `None` if\n    /// absent. It advances every time the child emits output — the\n    /// **functional**-survival seam for the D7-1 process-level E2E (doyle F1):\n    /// after a brain-PROCESS swap, writing input to the broker-held PTY child and\n    /// watching THIS advance proves the path is alive end-to-end (input → child →\n    /// echo → broker ring), not merely that the handle is held. A read-only direct\n    /// peek, like [`session_pid`](Self::session_pid).\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    pub fn session_output_seq(&self, id: u64) -> Option<u64> {\n        self.sessions\n            .lock()\n            .unwrap()\n            .get(&id)\n            .map(|h| recover_log(&h.log).next_seq)\n    }\n\n    /// Drive one brain connection: handshake, then dispatch its command frames\n    /// until it disconnects. On disconnect, detach this connection from any\n    /// sessions it subscribed to — the sessions themselves persist (B2: a brain\n    /// restart must not disturb the hosted children).\n    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n        struct HandlerTally<'a>(&'a AtomicUsize);\n…\n    }","startLine":2978,"lineNumbers":[2978,null,2985,2986,null,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,null,3289]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":2101,"outputLines":40,"outputBytes":2101,"shownRange":{"start":2989,"end":3028},"nextOffset":3029}}},"isError":false,"timestamp":1784272222833}}
{"type":"message","id":"b346b0fb","parentId":"4da24999","timestamp":"2026-07-17T07:10:36.116Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Verifying log line ranges**\n\n**Confirming transport-close absence for conn137**"},{"type":"toolCall","id":"call_NOF7LqA1uT8iVsJNJw3nh4f5|fc_0365286983a6ba82016a59d56ad0648194b016d0d5a083cea2","name":"grep","arguments":{"i":"Checking pump carrier closure","pattern":"conn=137 .*event=transport-close","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1-34000","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_bVgXCnIqPTzfJtC4mUw3eeRZ|fc_0365286983a6ba82016a59d56ad1c881949acf2adf338f9d60","name":"grep","arguments":{"i":"Checking pump reader lifecycle","pattern":"PUMP_IPC_READER: (spawned|exited)","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1-34000","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_l18nbNZr8j6Sze2df6VZrOYB|fc_0365286983a6ba82016a59d56ad1d481949bcc8977bfcb7a99","name":"grep","arguments":{"i":"Sampling late pump attachments","pattern":"CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"31900-32400","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_JZ4NS59otibD22VVUkjUJwwc|fc_0365286983a6ba82016a59d56ad1dc8194bd64e9866def2358","name":"grep","arguments":{"i":"Finding handler count API","pattern":"conn_handler_count|net_conn_count|session_count","path":"crates/spt-daemon/src/broker.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":13560,"output":539,"cacheRead":121344,"cacheWrite":0,"totalTokens":135443,"reasoningTokens":231,"cost":{"input":0.0678,"output":0.01617,"cacheRead":0.060672,"cacheWrite":0,"total":0.144642}},"stopReason":"toolUse","timestamp":1784272222913,"responseId":"resp_0365286983a6ba82016a59d55f4f6c81949160efaced1eb42b","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d560e4d481948cd812bbf4852953","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdVqdezHPFg4rTAg6rxEzF8wt28NO7xmlf7hmQH6XQB_KlIt_jVjnVudTKYobqQBLicUS1SeSDj0ynDpTjMhBdo3a0ByQ_nxJO6ug-bT6J7MyiloM03BKa0RDXV3bUoby5yTWykJ8eTpValVM9axsXLOejpExAzOsg6m6bXh_5fFX0DMSkUwd2c_lfgldE4juYp6QMviherbfsR2YjeS_q2OeKnSy7nli_ns4p08Km_thfogQDHE8JVYS63TVZ5GG83mIE0kQkWVJp1Tc9p16TSlif4kXo9sjcO_K3v_vhq24KVOWiuyWElUbGa3QVXImZ2fKwjiXL-vvUDumQWRa-0wEMnmN2-GaIpxEqZI3wd6iMynw1I6h7Gw8ZXmQjO04oj7w0l9TmFBTH7Rbr-jAg3fQWoIgER417Bsyvgu5H1t-F_cFheNPB5XSC90XgV-I6tvf3060cUrlYdxXkA-gZX0wS_dbrx-SoGo-_ShH9XxeRzXhlc4CNz_UJhuXbirRelX43yJvLEiVwyZWJnEDsO87M0KFzg2j5uenLtWT264q95WGiUFsqqzXZZmyre3-oLLl_sEWtTez9jI9Y42SN1_PvuiSsGvUlvhqEo3KDY4vEmHXgCUlU5ExPGEm1muoB30ADE2CvQVZvtbSe6Xun9vz1zbRPQTBgMOjiuC_KBCZi-o7h5P880PuvECTtcV20TgQDjxymr1B0bn0aQ_aXCK65dVRzAJRU_wSGNCt0WXNsIR0Smhzz1Rr0w-h_JWlole19A2eKkTqU-FIojUxNMmG2T0nj18oHIlcp5Xe0m8sOGm6wCcgfPtOxAXL7OUiZBvQqu-t4Ft1KC7A0JFVlem4kBx03v7ZCxLTafZHhwvP3MfUcmPvd8TyBPJMxSdBTzJzoLXzKV2Ne6o7a_vsffYrIgSNcOCgPi5SyVrMIaRYxr892VXwpAiS9hBL1QKmf7lbeDqPI3obE0qWqUZdVxanLyG8SJbwBPYNrAYCZPh-Q16OhXt0GMX9DkstS06Sd_GzHFNTZ256tmGvemFD0j9LFCtK68o95z3yV2QyEKWj2l0RknIZtZ6-KeskdIhqkkzpeFg86tLGyb8u8aDWYxCwxKX6IG95141P2G7wW6bMydnkClOEIEHZlvBeCpOWMHyTYdsYWxdrC-XQ_wJXEJWvTBrcQ6bAkHxJCeYSmPZKMDQ2ERfxdTIo4Z0x6vTi-7Sp-xJY382q7bp1rGzlADPgEDiTnVoEgruv_Cq-nV0C1eUTB0pfcEYO21gZoUay_GHy8fgDbcV5U-D_gppUtv1RYIqAftB7aVqdXZW8qIycjX2M6nbfsQy5myjy4RbIKI-xMw6Zn0Hvtl5uIIh1-z8f_qyDhFb2MCstm1vVQ12pA6SFU4Gug7CohKe7xjpXNfqGPF6LHMDKgAPPobH5RPvaXvD1YWO3N3ZzDXTVpa0HOZlh3DzQEua9A75bn1pD5d4skjYq11XAiUeK8_azf8TatYCOPXjbsVrBlKytuvx9f_c2JqZdDq_jBUven1CvqaKmxhv2Iv9N8U4twJxGuEGO4lMvDAU2uyFk2DGn19cVtLcHEkYKKb-odK8r5hc_IFcIDnxfYojHyzokGerzr8VTtdNHPodcWs8nM3_gyu8WlX3wncXpPM4tUy4dyKDBniPLRPXM-vA0ByTR_M7arlnNzjOxctjh1h5p2-G8QpRkGmmJU_Dr4pim8VRvBOuxdRzC3uR32unC_XWDqqfXj5Gi_Oxd0A55ZBkiCUPt95uf6EsP8g6PJKKRdZhaQeIFbZmL9VyzeLuNrBELz7yeuXCMAsnfw7J6kwdpYOnOvEqEGhOBxF3oxCJnHUGkGXtEBNMgZLYy4Gf4ZwGxnFY4O1-YHIhVUlX0WxVnUjeJP68xVYliFf0DoP_JnBZE1f2hEELGDfSQV46147BhpppQWzf31cgDXLqEgfIEJCeQScnrUgWii9FKYynOio_36540GR2uzlgooeUpO6xbo0J1cSofALwOZsMRGafyNV4o8jGYv-JG-z7gcvJEvP4S0vaFDFbbyq46-e3C2pzqzyIf4sR7q9Oc8uth-pmo3iiauX54eAqv4e1ta6nvi0i3zqrM5thIXAPaqq7Gq4hTUndVtlYp6Gv9QtUiY9z4MoMhpdH3iYLnJrdW-uFejDlF-oLmyoMK_Tmh4RRDzq7k6kG4g6LrLVVd_z18t6h_aGwB69QSGRHIlfFg3BzkV9fRAgsZ7PmT5vu6DYzw60IgPwywfN0ZQ==","summary":[{"type":"summary_text","text":"**Verifying log line ranges**"},{"type":"summary_text","text":"**Confirming transport-close absence for conn137**"}]},{"id":"fc_0365286983a6ba82016a59d56ad0648194b016d0d5a083cea2","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking pump carrier closure\",\"pattern\":\"conn=137 .*event=transport-close\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1-34000\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_NOF7LqA1uT8iVsJNJw3nh4f5","name":"grep"},{"id":"fc_0365286983a6ba82016a59d56ad1c881949acf2adf338f9d60","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking pump reader lifecycle\",\"pattern\":\"PUMP_IPC_READER: (spawned|exited)\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1-34000\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_bVgXCnIqPTzfJtC4mUw3eeRZ","name":"grep"},{"id":"fc_0365286983a6ba82016a59d56ad1d481949bcc8977bfcb7a99","type":"function_call","status":"completed","arguments":"{\"i\":\"Sampling late pump attachments\",\"pattern\":\"CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"31900-32400\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_l18nbNZr8j6Sze2df6VZrOYB","name":"grep"},{"id":"fc_0365286983a6ba82016a59d56ad1dc8194bd64e9866def2358","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding handler count API\",\"pattern\":\"conn_handler_count|net_conn_count|session_count\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_JZ4NS59otibD22VVUkjUJwwc","name":"grep"}]},"duration":13201.7988999933,"ttft":1992.120499998331,"contextSnapshot":{"promptTokens":134904,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_NOF7LqA1uT8iVsJNJw3nh4f5|fc_0365286983a6ba82016a59d56ad0648194b016d0d5a083cea2","toolName":"grep","startedAt":"2026-07-17T07:10:36.117Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking pump carrier closure"},"id":"fc9f5852","parentId":"b346b0fb","timestamp":"2026-07-17T07:10:36.117Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_bVgXCnIqPTzfJtC4mUw3eeRZ|fc_0365286983a6ba82016a59d56ad1c881949acf2adf338f9d60","toolName":"grep","startedAt":"2026-07-17T07:10:36.117Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking pump reader lifecycle"},"id":"391e5a18","parentId":"fc9f5852","timestamp":"2026-07-17T07:10:36.117Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_l18nbNZr8j6Sze2df6VZrOYB|fc_0365286983a6ba82016a59d56ad1d481949bcc8977bfcb7a99","toolName":"grep","startedAt":"2026-07-17T07:10:36.117Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Sampling late pump attachments"},"id":"78d6f0ba","parentId":"391e5a18","timestamp":"2026-07-17T07:10:36.117Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_JZ4NS59otibD22VVUkjUJwwc|fc_0365286983a6ba82016a59d56ad1dc8194bd64e9866def2358","toolName":"grep","startedAt":"2026-07-17T07:10:36.117Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Finding handler count API"},"id":"c2ca3227","parentId":"78d6f0ba","timestamp":"2026-07-17T07:10:36.117Z"}
{"type":"message","id":"de7357bb","parentId":"c2ca3227","timestamp":"2026-07-17T07:10:36.119Z","message":{"role":"toolResult","toolCallId":"call_JZ4NS59otibD22VVUkjUJwwc|fc_0365286983a6ba82016a59d56ad1dc8194bd64e9866def2358","toolName":"grep","content":[{"type":"text","text":" 2823|    /// Number of currently hosted sessions (for tests / introspection).\n*2824|    pub fn session_count(&self) -> usize {\n 2825|        recover(&self.sessions).len()\n 2826|    }\n 2827|\n...\n 2921|    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*2922|    pub fn conn_handler_count(&self) -> usize {\n 2923|        self.conn_handlers.load(Ordering::Acquire)\n 2924|    }\n 2925|\n...\n 2998|    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n*2999|    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n 3000|    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*3001|    pub fn net_conn_count(&self) -> usize {\n 3002|        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n 3003|    }\n 3004|\n...\n 3026|        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n*3027|        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028|        struct HandlerTally<'a>(&'a AtomicUsize);\n 3029|        impl Drop for HandlerTally<'_> {\n 3030|            fn drop(&mut self) {"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":1,"files":["crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":5}],"truncated":false,"displayContent":" 2823│    /// Number of currently hosted sessions (for tests / introspection).\n*2824│    pub fn session_count(&self) -> usize {\n 2825│        recover(&self.sessions).len()\n 2826│    }\n 2827│\n     │...\n 2921│    // [impl->REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK]\n*2922│    pub fn conn_handler_count(&self) -> usize {\n 2923│        self.conn_handlers.load(Ordering::Acquire)\n 2924│    }\n 2925│\n     │...\n 2998│    /// connection the broker holds must outlive a brain-PROCESS swap (restoration\n*2999│    /// D7-1), the net sibling of [`session_count`](Self::session_count).\n 3000│    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*3001│    pub fn net_conn_count(&self) -> usize {\n 3002│        self.net.get().map(|h| h.conn_count() as usize).unwrap_or(0)\n 3003│    }\n 3004│\n     │...\n 3026│        // RAII handler tally (panic-safe): the round-4 gate's seam for \"the\n*3027│        // poisoned conn's handler reached EOF cleanup\" (see conn_handler_count).\n 3028│        struct HandlerTally<'a>(&'a AtomicUsize);\n 3029│        impl Drop for HandlerTally<'_> {\n 3030│            fn drop(&mut self) {"},"isError":false,"timestamp":1784272236119}}
{"type":"message","id":"231bf84b","parentId":"de7357bb","timestamp":"2026-07-17T07:10:36.132Z","message":{"role":"toolResult","toolCallId":"call_NOF7LqA1uT8iVsJNJw3nh4f5|fc_0365286983a6ba82016a59d56ad0648194b016d0d5a083cea2","toolName":"grep","content":[{"type":"text","text":"No matches found\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"}],"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":1784272236132}}
{"type":"message","id":"804516c7","parentId":"231bf84b","timestamp":"2026-07-17T07:10:36.132Z","message":{"role":"toolResult","toolCallId":"call_bVgXCnIqPTzfJtC4mUw3eeRZ|fc_0365286983a6ba82016a59d56ad1c881949acf2adf338f9d60","toolName":"grep","content":[{"type":"text","text":" 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 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\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"}],"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":4,"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":4}],"truncated":false,"displayContent":"  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 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]"},"isError":false,"timestamp":1784272236132}}
{"type":"message","id":"9c662853","parentId":"804516c7","timestamp":"2026-07-17T07:10:36.133Z","message":{"role":"toolResult","toolCallId":"call_l18nbNZr8j6Sze2df6VZrOYB|fc_0365286983a6ba82016a59d56ad1d481949bcc8977bfcb7a99","toolName":"grep","content":[{"type":"text","text":"No matches found\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"}],"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":1784272236132}}
{"type":"message","id":"a0cbee1b","parentId":"9c662853","timestamp":"2026-07-17T07:11:35.233Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing connection roles and log growth**\n\n**Mapping thread count to connection logs**\n\n**Detailing SubscriberSeat lifecycle and stream retention**"},{"type":"thinking","thinking":"**Analyzing per-connection thread leaks**\n\n**Evaluating session thread counts and cleanup**\n\n**Identifying teardown contract mismatch causing thread retention**"},{"type":"thinking","thinking":"**Planning safe session probing**\n\n**Designing efficient log snapshot method**"},{"type":"thinking","thinking":"**Planning thread and connection telemetry analysis**\n\n**Investigating CPU usage sources in broker**"},{"type":"toolCall","id":"call_fDFljCFCxKpxSa1b8ymYym2G|fc_0365286983a6ba82016a59d5a5e51081949f8cb6edbb7b8b78","name":"grep","arguments":{"i":"Locating net streams dispatch","pattern":"fn dispatch_net_streams|KIND_NET_STREAMS =>","path":"crates/spt-daemon/src/broker.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_PNXxcbzZHyRim2V6YofCqbpx|fc_0365286983a6ba82016a59d5a5e54081949c19a93df96ad075","name":"read","arguments":{"i":"Reading stream enumeration dispatch","path":"crates/spt-daemon/src/broker.rs","selector":"4350-4415"}},{"type":"toolCall","id":"call_jGuVTGc04WQlY5l32MRAj4Zr|fc_0365286983a6ba82016a59d5a5e5548194a738ba3f799aa780","name":"grep","arguments":{"i":"Locating dispatch poll cadence","pattern":"DEFAULT_DISPATCH_POLL|run_dispatch_loop\\(","path":"crates/spt-daemon/src; crates/spt-daemon/tests","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_FT9VQRbSclsJ8IfwUbPf9r5S|fc_0365286983a6ba82016a59d5a5e5748194af8a6663008f0cdc","name":"read","arguments":{"i":"Reading dispatcher startup cadence","path":"crates/spt-daemon/src/dispatch.rs","selector":"90-115"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8990,"output":2164,"cacheRead":127488,"cacheWrite":0,"totalTokens":138642,"reasoningTokens":1942,"cost":{"input":0.044950000000000004,"output":0.06492,"cacheRead":0.063744,"cacheWrite":0,"total":0.173614}},"stopReason":"toolUse","timestamp":1784272236135,"responseId":"resp_0365286983a6ba82016a59d56cd61c8194b8e4d0fb5a3bafc9","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d56e7e088194bc58a5b243b2a622","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdV8NWH2x6KQLhpcfzuT7D02RqIk0yiwov5Ijbu7yLsPFrj0FyUn8hmtcWan4lNzFfwGT_MnLhytAKdZkXUDS7cqdxXbUiOneY5hCd-g4__G7fcOgSs-sLyKC56aU4vq7_hdpp-1lX0itGa3Pa2sCql03LvG4dvd4NZY3vRpcQVmde5PsSmlWy9wwZvFg7Xwu6R2gH5njMgs_gE0-_6JO60pxM2qvmFFqcX-QtqvL5QBNf76mNucODyXlZjiAlfAlEdRMYZVTUUK3-gLvFTga2Wb4ek5zg_XW1gxRJ5_RoogDlUlPzWZrGpW2eqRGJrx4jCcTv3VhFHkvjFfEuVn93IvFE-F7UmRV8Q9QrD3l9cOGDA6NHhReoRxvT8LsIVuSrQvqcRKSLP3X-cxFqtsGBXzSGg9h9t_NiNBN00wi2YvgXwjOw7MS-goFSHOfvFSIGqQXusW_wkZSlhvSXT261ukA5Pifw6ihRTzjuQzxd24hwm8TVtsPIhhlMYMzptgzwABHSqzPinzs9pSz8rGQ54yqvrBR92DQ2NNTCkdmUL9tYjfudiSru1jXf_sTwcW7HaaM6FEhtmEj3peaswKsnNXlaQHKa7MCmPlUN4ERNvpOmLZnEYE2jH6_OyAZIkqSE9SRtKaHQkd6rcasV5LcUZ7-weFzqOjv1KQtqErSQs9DloKrDFyNW_0Vr134fbtyYg4o8iQlk764OfYecb7VcYegJJ0vrI1CHSNlt2oGKxUXh69SsCoQSnzbdJEq3bk9uzzKAM_EtYr-agP80Tq59Le8vYGy3w80ZTEZwGngZV1kxuViKfEVeQGUGDZ9DK4xkIXc92hulOSXkujgbpa4M4ZhLcuuT0XBB9fyhB0JCBdGZ9QhTGqQ3ozzDJ8T8EWx0W2XSGB4CtjEfZyvdr9MQT4yIYwkFF_XRwpDadG_5B6sdVs3ZUWfqOBjR7GnEB6zVPiusTWblHS7h-D9Rr_pwt39J1kLbvyEuyJN6I3aJjkKAZiVWpXTPreZoR5MDRbuuMVrr7kY9gNo4BcnH8N-GawLE-XeNQp2zBRPOv9LYbdmmN9MGOPI8B3GyyQGr455K0jofAwWL9E25GXMJrj7HkjPCixHpm7Zv28uMPS7MQIZASsXWPuZfRCliFQ66gTbwRTxaRrcvZNJv5ZS98gaurUEmi45tqxw2vCM9mYa4eiFoikCsDfEvXZSveipaEwwqYcTvsXKeT75mlNIlEt20YwBwX99XoUHETksS2qAT82M9vkgaSeUSeJWJWb_NyqCXiFgSQ3eClZwJ8s5MvhDyK1vTXixqjBdINbWEImF6seZunlrt32obP6028ZEoY6VNKi_qB2p_juML6WukL0mpx-Fx04anmqp0jCErLJKYojtTBW5Kcn5jS6r77nfPh0TBJhd_RXtHl-UxY1Z_n4QnYv9-wOogiWpMxocW1DWI5JOXNwYcaC5Tb5bDELOsVsciEpLuykHnYazJrBHdOENRGh8tAdMJ9Wrqgt_7dm3RqOQ0PXB3YUU5mkcUASpNsOsXwXzpRjgjwTVyDQgcZiW-pDYSW26TtxtLGre6kE-gIcyhX9Pd8tKVYITYzuQDAY4a8fi02QyyOw9ch4iGmkOvBohp4aqNp7JlisHZ_7ySuJD_wdRqy_azRe0AIXa1bHA6K6XiaK7ZL3xQV_z8SA0RaERzr9ESq7rqxsfB3vaRDsboLxyjR7KDy1mZumYuBjEJbE33valuklEPTZcEBKhh00JDtinfnDm1uphc4qXjOIqeFrvnUs9DISRbFPVUeWrbrE4O4BUvzq1y3wvDvGHGRp-pPtieloC-RKnwxwqEJ5JKldgR0LOjDo1W23VuiBrHH-JRsdbbQ1atS-oZHY3GFM26ATcBnvXeg2QVOIb2eWeYtYA43xv8iczKsarcSw9TdRDYlmm-8DoqMG9fzGFDd6N6l1D9Ajvs1kJ5I-P2uA0cR9cPHbGCKu1TfE3b1mD0euAuPvvQnoid3GGyhr0SojyE9CrMCk_GPbP5hI96KuABAHNC0OLTP7chDRHpeu_1yGM01gwdTpvnFDAdQqGgy95pLjdQ1rmQHwDB8mHZQjbh0ZJurXqwG-qr-O2wr7drLaNY-BsJBSEsxoX5RaWMru1cf2CJFTZkC77uT3KWD7PZWTHO6WkJTIYNY0mLPVPOebq4smdj1kkS3ybJhIudD5a8K8Du-O0aWaqiYFjMkaM_bPdBLq5rjJWkBaJ_AV80o-lNZW_SbH1Hq55ZW7yp5ol_McQz7RuoOaXWMohLcW-DLVlxNrlJDBAJnwBG3SVu9cAYq0JlQNJgnjrpjpY-xbIbjyWgH2E7GGSGMpC9LNyLsES4aycltfoB5NeVH-FOyLSH6x6rz3e6HKQYBVGCbATW0c6SSaAUadUji98lsmgqM-36w8Vf49kJqPLYJkhQC34azjrFNzXPnEKe2SLBGgJ5WQpU6GUPBUdgk2ve3IJUv_snAH1AO1f23J1RBpQg3jssfCfzK0b2BHi6sB416NZ8ivG47xh4wn7niYETtUx8HzdiebzJnhXxZ6bqwVEypDQZRdk5SU9CkIkD_vfSGh_Me3_WTSMJ-qMtNz87ENiAnCZznaUWogx9uEbVHMwVJKCVx2GStojYWUT8mec50Y4qBeK_afkZU6wkIO5fCNCzt9Orm8pH3VWcCNj2oYZNVk6Mm3QbkMUrJDC1-ObBO5qWppntBvGU9qNjHPPgWQN0yEYLih-bhfBAjdAWY4orMP41MUvgxQ4MHvJKBAmU9pkghLsqJjJQ2Be7JMTawPSBCmk1YHKw5AB9Y5DbjMsr9HWZ7qzbEkhv5Bogd98hi3YZ-qrnwLqc0Dw7HGMSys7fxw-Ap9s3jqSx1KjACm4kr69_aMgZ-2Q5_fUV3DW2latyIUivtU4J0-FkXRVYU2zO3eIpi9n5HWumGLL6ug-7qV8IXfFig-saUaACG05NoM6u0XSBMIRcCZ4CaTTD1PPrN2L_PhNDfkAtpCoXNa_qnswz1Q-z7eywEN7nNsnBzgTV8313e5pL1PwiZ-nU1me8B5wOudEuaqXaUDNyP_RduOz277eZXrIcdcmucmVb2ySrdObieOdf6FKJaBhlvIU1H7PBc8yt3Wi_QX4nIo4sf8r2MN-S1sUqb_f5O4sGsmeyJKxLGEkxjk3caiuLZqxxzY7JF0AkOT_AQWtqLg_vWdtwwxLn6GeEAiF7mDACsQTYr8jDdDB30naqvDpAHGmebTX3x2bt_TgQx9VHyfcvKlDJPf12ANvYfFl1iWbJjaNwT5apjfLoxRAwLOfysXpbeLFaU07-MyIaxKHvvYrg3RorM5GPiCKpqeyZz-w-p7rAggd4vrGaTP_7vka8qSJfxSTuUE-Z_LSPHkgxR0fAgbvWTFNUZF447WESZuHba1Fav336buANbKa1Nr7g4OPal_IImSceLdacTrq_Fa4R36h9GOnKHz29ed-vhhgly4Azo4gNEX43deqbh2dRuTyvtw5sSTrBceUSNQagCDjihW6M3WEeuL9bYnFMTY7f4mqiWp7lGvzd6TyK8nUo5qqeDWkw0RgnJbfxqcOERWloaNAzgRiT_sJDcIJKVs2oAApufOWdhL3KDPw4tXakGhGlzEkLJ1n4A3h13A_DQDIrIZxo4N5Ubm8PffQtKE-BMoPYvhFTKqYNnrEjDtlpbFKi8ChWZ47kcEIQ7b1PdYySc1miHv1o-CXTqlzhjeNgvzEW91GobSnixPgwRyTQezO55zFvbA78WdSvDOgFHw5-78n63cBftKw5ttpAXaun4NyqrjEKhb1_I3CttGaez51R9Nphg5ICjk7VQ5nVOUaanxEyWxrfl1g3TFrwA738ApBo-_SC7loTo74gJE1zDysr4=","summary":[{"type":"summary_text","text":"**Analyzing connection roles and log growth**"},{"type":"summary_text","text":"**Mapping thread count to connection logs**"},{"type":"summary_text","text":"**Detailing SubscriberSeat lifecycle and stream retention**"}]},{"id":"rs_0365286983a6ba82016a59d57cf1788194bca9676dd1bb8bf0","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdWLucEyH9LoY5ZK3CrjeuA_Gh3B8JvxZiIZsUrXNeJG4erQjzLtAOqLSNQhH0br3OMycNMxw2gekLJflVOXguqoE5wtOT4jbtF8N1nY0y8oo102lnNGtEcyPokpsetOlIQEbRuIBI1GQdYiZFpfjl_KKSCeWH5qgq8Onu2bV_rSKcJFG7DwPGaXQQTIbrchmmKOYbqb5KLhvJk16aJdn2aceDSjU-Oy5iTltgHKKl5jDzV4SiJNDL7LyvA9xklO_8hzXQmoIIa_tCJL-ytt3tthwpZ-LtjGxe8MK8sSdT1iotPbZJjZU23crsiUThnI37ILjsIVCLf8YOJxuLgZYj8Vut0kZsAps7rOUwLQAsz2VEMkPwoi5dD3jahZsCcKkHu3Lf1l-JzEdr19pZegrFHa7v5eS9fEAYpoIEcEygWKPn5u-S_edjTyzbguchXeia8bOZIAMfA-72PNU3JgI5g2u6YJTPibNdvipwngE5zPciPKrQr5e7K4JJcE2SHV7WjxO9uXRK2Cmne43VLVloRXCN1mgTjwjLD_PDt7RcHWgHXHyKNzFEZzeLR0UHPkdSyIUJTXrUecrm3M-X0pfLjKypNX5TmPlF7PGhPno3x_KTLOT7b1GveBmSVCRru2nz2O6PsE2B7GPyY9aD_GnPX37ho8_axNYneVAW8b2TJfwc_p8aE_X0Xj-spo1DhB6NZ-1l9zOeABVylhx7Ljzbze6L2pjE5vMJjA0I7qcaZXXC3WRF25pall0SaMUWbS81S9-Qz6NygOpPkQjLmjb_k4hoWXoJ5MHK35GIEXPFu57HAwzrK61SK-lZfAJ3IrU3OBbo8Mxz60_ZozHDqMqwSrGjCTDSsEJcFIiiMk8yGC2zeAVlqE6bypnt_lSZgiIE__vduMdcsbK0GpKkuaTFl6C8An8PbtYo3ZwUThl1K4WcWCPdErJ5r6hpSmdtO1Xlx-Wo1Zq4BqBH3MFRFfi2tu4RCl6HPM2KkRzG6UxCSrg57MgZyMFj_bbaEVauC2NN4ZImTl2dMgty-vV6XkuwZhpoNRx_dsgDbH8HJoBs76O9klQ4rVMAXQWRcfuYmFGWbC2IsFEdTnbopvA3jpV6f5FE1pFnLFo9AL3addL1huH9-9n3RdEG1NjJCh-goUqghucz4C90nIs_yGwaeZXL4tVdP0waQcIT8k8NlCbpeTtCjIhUUo6eEgfFCSCNk9GeYDGEMUcPerAKmB59Fsk2hRJtX8j1vuH7C-DA2QxDCK0LgNu84YkM7J4cQrA6TqL--ZkY9hkFB8cRmpZo_mWyWU_pK-pWNsiEwb20kD8k3xBqt3Yk1hvQEMJ95J1rOX7sdpfHOaTRz56C0Ktj0KCoVh0eM0AIaQXXgnhiHPLK0TqLEIv1ScwxbDN4A2JMuj427ENB2ybxX93eYyYcAbMBJgfFXc1gR8EGSqrQHEUcMHH2VR408kSFUiZrETmzzx2p-SQpRXrq45EaqddXrAK_Ru38StBKhYpTnKuSYE3Q3BwP6Xz1RvEoObVnQjEPZpCDleXsWD4Wk5TFcz8G7cBWvGIw8L7FFVD62442FOelnfT_WR8q5V9oaJMTmJlXZpLLJ7jsd9yYmJh9aaH2OIEImix_LwXT459wpykF1Kej40ivikDxEuce5Z3xIA6nhmJhV8sX9yyB-u4AveXDUzu8t5Ie8oneGwLBLygkcnTJNAMo6GFAkOyQb2sENQlEIe10jgmInJsHJj1c5zflQVTzC-ZX4pX_nNHwOdwz8VIUJAEr07MYP6x-_akbH7fxTAbnou4AYRWgXdA_H7qSe7U7MyXVhBJzYkILFFUkUTZ5nOrucbBxVw7-jB8S_hZXDMgBnvYsvEgWoq4TdC72TN6pojsNdkbv0QTUxYPVcntCLG8dJtTlpJbq_T_2uvHXc1cLZFM0nhgSKeCkJ8GKJNkgpCj0ptOvkHiwlbZ-pKFA3_TBoGdTN4-IUXi-tSXWwX7zAXhNWa0hEbXIaeAj_uVF524m69fuvD6Hmzoi2oLD0yFJ1kFnJoVrH2wB1_dxTbi7l14rHRHDmFrW6Lbrw-PFm8muSq_5W-CCJymQqNXmNVejabJfsAZ5LygJ7XQMeVNqB4GTq_1ijC-jbljQKObgqNDZca_0IqPTKaCn8uL_0LwcrygDbly7mTcqu5sadnmv-2Y70M9o3rWzYMTf8sDyN2TP3TZt80sRJZOs70I6RhFSjnR9Kq3HWJIRHHQfqw8mpRfoRFD44j0FtFqouhnGpZCfkmNjdbvniXUGED86fPxofWnUXbk7WbR4Oiyvip0O6DmrR1lAjpePw3SxbQJeX_cAoHqkma_K8IQ4HSsbZuChK-g0zssX_zt_t_5NhDTYjvZkV44ZhRYGcjK-QSfkOGXfnyyIkNHrOkHe6c4lMJkhySDuMeZRzf4pxQ4IUpDlnAMXyjIO-e9ovsemgz47HeID4mzHkMy2LnqadSQ-aUz11FjS-GEDJjwdQyuAJakA-S2Hq_rWMBB4uTNjHwuoQQk-owwIO5IgtV_my7pMzgAMmpLl_yTLWfO_zSiwYl6CEEs4ps_sdYBW8b7pQM9a3VQkxmXrELeTjjV5w6LxHgFnwN8U0UW8fv7T9r2osLey2PTEs0PXDeOwFdxXTxJVClWLHHwiF6UpEg0q25qw-pkPnbjAgaTnoQ2f48NFMgaknBdhuaVX9nXCbSy_0mAcFN8RUnWp5frTCG9NEoPGyQ6FBmDuOjYr-8zlZHvCiTqh1n7tjpTWp1rmMgJx3pN2der1SygT2PK2mnphDWwE4l9XZiuG7rRy0UXAodr3YCuqPggS8fCwXAx28poknRY10tajjPXJxZoX3qD9BSDt1MGVbVyRuNuA2M2jXbMZoe08G6j4XwKKK3_7BwXoESlx3io5z59rhftc7BqkuOA5M8Byc3zrX81KdPNYDdXFCHojRYLujzjpUMir4lppDibaWehprFO88qZMMx3P6ePx28JqDVUEh-kDC3DYY7vbC6VVP9Ob5bcxRjtvR6iIvqLAI9mCFv4bCG3JdDBM8E2XlI9wI80qegUW84jNgTFlGKHJdJ8jfPyxGt7EB__GHiM6RqQJxEO1kWA2ij-AfqNDuSBD9w_x2Zdpw6X6Y2OjxW4sJlT9CAalI55MsXG9IQ8iETcerdLbwLY--iCxjEXhhLJVuiO5bsMj_HMtmRcBDGjs0AmR4V0jyTuE7JWsqGjXqCTYm6ywxK3rjyox8W9vfbXY1bNPDuOCZl1DaWMsfU8lMrYHkEFCGk5VXRHQnr7i-TqJTqKD22bNdZDFLuvOE3EeLutaMojYqZulv0EACxv0hb6pWcDJcJPADsATtm0jIHBlpGj6srrK7vA_WOIbFsbqVcbgJJ0DRtnem2BHOVedEasBRuccrfjZdyynZK2LtWoLgyjs1RKsKnX8OUJo05c4aEEmKpZk4SQyY7rl8dMOlOdp_F_F6EgHl2Sv3fX80xb6hnOx2wOv7a4BF3TBAFJRiDwClv9nMn6PgWDvjcCFQVXpq_80Gkd5gQiprPcpM6vsCciXvYOQyI_iqgoonTthwj6L_wU3ti2yjrjnQfpHXr5Mx_UbODczliFSEnRalpXCWV7JaT5AJ_sVNMOxuQnas_xFeaVL68Swm1TqLb7PZd_efYuAltmljVpF8oPxFcLTue1_RC5m55EDyPpjkgwukG7nJixUTEOi1TAjKc-RqiVezoHpMVHwCkiERv3ldNU5HcTcenE-HR9YWtawKk1ZeGu0aX4CBYk5lrYS4Zg6_0jN1JrlxO0MQ-YxTRhSttA4vv5gfL4ANtfzA4WiACxARZQGFxGiaKUv0GhHJOWiGPHs9eumBYciUhrZLvQK5BVKXM1Q1JfA6BDlYmv4CGtf-FTm8knvxbBGwCwyBxWXXxHb9fNDWtcpqEEbbE7el5DHt7wIroBHAVp13KQx8Ht_b5KRfGB1tcORLGMIzPYjw9rRDf4SMSKBg1Ny8qDTIgWikOeavMvOtj54MRDmUb4xn3-o0VQYX77X7cF8qLiq3eViuD2u6m2WdM1nOk5gkCTm6qQhZpOYkGbHFmjbsd2FKqh5gUM5cG9uS5F9l2lCtp44hBJI2nPWZFi1LIE6MsQA==","summary":[{"type":"summary_text","text":"**Analyzing per-connection thread leaks**"},{"type":"summary_text","text":"**Evaluating session thread counts and cleanup**"},{"type":"summary_text","text":"**Identifying teardown contract mismatch causing thread retention**"}]},{"id":"rs_0365286983a6ba82016a59d58bcc588194bb50d26fd7220d00","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdWYZkszS9g3ewpZPVQHDs9Mq5cbscqZxofo7Tuz4TWoEqg5MpwM-zrtYrQjx2U6x_31zPrai5Ws7m9XqzBKvVWOeRk0b-NS_M7r3WB5NICaITywcltMLmyPpa2-MB_UC3IwKtOBWeMbvkIqADw3rUZIQ_IPq97WIZdsIcZ6TVxgYBIWE5I_Y14Qb1rPnBZ9PNurGJ5qcbOcRPzPCjLijgcrfmHXY2eHm2oFExVJ8iCF1ntgsyNmwqPbMimBxlXuZkqXaE7CPteglCzJCs2bMPpz0ZlB3UyFeFkRthff2R3xyuy8EJ8grDnd_bR1FIdALlKTA2dNxFiCAu-qLGSUZ0u-YU-DapkoEgAKImWq6hFwxZXRYTd-spZeSXNDemmxYmJrVcSbeFRJaiFPsZdcQYmTH4CWgJdVu7NwLtme5mknb9otFIDNkLTyLW--CA4VKPmMQTlpxeLfGwNunmNqwTFFgTcosmf7gc1mfWlSlK5QVngengWHPi4Fn1TH7HeL-CK9oIiWOc9CoJv24R7mau9ERGoZKAbEL2ox4MGQFYnZJHPoxK1iOtkYjQ97zEnxRQ_eg7GftBN_gtmK0Nw28Xgfo8zrfqldsU4kXZHs1I90EtNhc3bVGQn0tAiKQGdNDfL4DyATF2PosKzeI2BxgliXWsnLAApyaewOm_cCLYNV_X3x1MIDcN_ytUdIN7c6jwuTz3UbBtPigEJDjZfNT2Ep-FSOy16gU2k3ZUlvRw3MArgtcozwj1jBxYcn7T8DNQ_zz1zOx306NYu0BSnsudr2yAKljSo_wQpqBAELrDeRLloDnWNqjR38Nxz1w_pgpmz1EC4BBM3Qk_VMuLiTY0FE_2PKeoaVFGkunqvebwwnjTzQ3VHNGQpAaEqS4shRcUYV_uIHjIjlm-YQVenjgjX69-q66f6_DUVGolAaIjbs4HLElTBzWM5VmjQUrEc5sdgU-SCj4BdylXmymCuL506E7k93DfxuSXZMzVYb1rvrq_Hh_5b4N0b0DuE3ghD0ksd5Wx1Ai7RDIZlS2rePDjfW9K1gwaDDS75ClbEIqOjHyCPaGyLnOmRtQLmifsvw2a-w-n8dyZI-gg3bvEaQ9KFb4TVGXduKm_l0d99OUJ1ePUpwOaeN87fHS7X3SuBL06dkFE2yPKqRtAibhlrjiCOFhqT6pnTA6_wtemlKVet7P1LyYiNCV_BNYic7IyKC_OQoGz0eQtGRDd5p0By40CzOCoKKDoTH2rUY4T3-WjbTNos_k3SSo0nF4F2W5kJNKNor0r8nIGwT4tQEGmoHGMLcYrgJ_ZkYZ4CfmGRPggAxwaGkgxZWBKPtfk-YiLrg_XL6l0DR95P1985E67EQ4aiVE6XgEOhDhLFlk9NeJg-hAvL48CjJI4vuyLw8E2uZ3oS7-nkxtidIiQbwrKFiJKK_bqv0o2HOqhYellky5dZTlL1rGdqvV_4WC7YtUKdn9BTRe21yr2vDVxvD5_JSxhHraX29v9lITbQXOSumwMjegJz2DC30XqzHYFqnWVCYMZIdlKhU2dzJEwxskbt5XuHgT45jkd1u8qAMtgVpVsfxIBEormVBDLg2WJ-EWzlE41NF0ff2YoZ4s8Q8ixMBCJ7yVVqLB4wykS77ke8fyWtFjDGlr6bDlGib37fmxqloDXhC_T-rA1tpv9Uqn9utLAnxKGJe7QSj6gnCSRqnl2d1oVwpfse39ioNcWn1SVFvEfSa6J7893sZvc__2jVHxtX0rrLwrKsHTsvTh-EB4E2KwB7doGx94eVbrcmw67afNq6Oxd5pN5JVP3Ba6uKzlc0CZjUBRRPhmFCsJ3qEfY_lrui9YMOEC4DYeanQLlE-zN6wv0ROQafp2BVVTXUZrp3DETep05VijtjpfKDyrUZSa7tvCMENdOJjsIGKHDc5JPrF3X9lv-0r7026YxsqQLKxXh2JWfXrWfNtxyBuJnJDH2GsQI1QFmjy3WO79o5dl-hfAsQVuvpzztOJmfZ8fD3m-4Hs5lv_RsZ9iNWj8xtYL4T3MUuJqd2_0ghC0wO-CkG8aYIvLUdPF9JL0I4vM8lWofeOx3zYiFXJZzvNq4Ku62f0IhL5MElwK8mtEVmtBnjrOwEI2OvtvwktUXYuzwGSJ9e0zpI1XOTBrIof-axvE30eeGeSov4PAK6rexW61zG9SdhCLhHJJ9wqjWHBIau55uwgBio3GHzfV3KMFGXJRFv6fRxMX0bCP_6VyO6ssy9LrEIIzArr06pGJfnAH8XC4WGCnoM1x8FWTbJueKerxi_fp48sPkOQVoaI6JUcv9pUIaxMMiKqDuPDkHcs6bh98R0n_ii0Z9pm_H6hKYs4GPOW8W7YFD5qSdmKwIQlAI2fVG8milKEiEu8ezTZMS8ZWF2GgjrPMuAgevGdDY-_DELvjRdq_QJcr_wz0Nu9oeyg47vhHECWFOM4cNururHvQHwl5q-uuRRGMyOz34waMGGCwLX5E_TDOhpkRIcJSXWQzjyKjP20rULWWE2prTYNZJ87JPz_jKcB9Et_3_nihNjMQWNbs_f1yrICogUOm4fCi9Ybff3HkfQPHiWQFPrTtk7w9sRCknWiwXUmMHzftnaJOG9q4OekKV-kQ3Bu3o5k_ARjNg9W5VHfvxeLg2YiBz8bPhGnsSIyBCNNJC_SjjksTuu1HwoR4ByqZE86ntVbFR0Dx4W-Ktz4Fb-JmoA4ZWUL-A0uJ3mxlnPlvbnFzbeGFvOPB7S8pKpi6sC4bPJArt4gjLy8ZJH0NlpAWPRvm7rccSWrVc2kk3hJcHKomvd4uqJ2gz6OREop0HsXqVlf_R3ES0av39G1_ULBf7iRp0NexkZ1iSOYDhLKaoFbaVWECAJ18kNPgBsCwkINYqRAZxP0OsXv2Hb8BxogtMd76aevzlFC31uu5Omt2o7naBqL9FeRSjzUAO6GtIt6ba4MYRSoDAiLvhfFAd9adJs9j0KOOmEkXmmVyRMxXFyLp5jg5HgOy1Wc63eEix0gYh_JZtmD6lAGcjhWvaixxp16ns35-_fov_NT8T5M9XUaHhtgIut-ZoU9teQt1omye7s6e5fY4TCGLWZXOnzNBtRDxbm2h4eyNFmYpNYFZJ-AsfVEQ7WllZ4TJz5BoNz7ZSY_2Kn4iz2TtRXCeTNJyS--wvxuTVy9KtE_ZodyuIgtrIk3N1u9ABCK0aShmm0oIdSpwzncek18B6B5MmXWDiKt84yH5UhdcqxpSJFnSBRUXt0J3P2rSzDGkwhDIJ1FUJtj1FcvtnHNCbAFyH8uli7LMOlFfKqDgy5b3nDvxF2dOaNIsaWUO5O0IA8YjF26yfq4j8iWpd41MBET7OqSJHGGq_2fzszU5NvZn_J1ui91R0_uBbWShLz4JrPYcJutvABh","summary":[{"type":"summary_text","text":"**Planning safe session probing**"},{"type":"summary_text","text":"**Designing efficient log snapshot method**"}]},{"id":"rs_0365286983a6ba82016a59d59850e08194b034c8de51714ced","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdWlOcVIf2nv2uwC2q7svoHMRtwMftXbpZEYSCOXcbv89PE6mYbEWQ2UHGOXv4LEbDN3EjI5vOofEv6Yy1LL1BcCz6q5sf3Gv7McZjbhyfanL_9cyGBWDc0l4j8s6swdB9_Qs7QfEOIgyJTVDa86OTjmug3OQISY3SAOQkHkWm6Apcac1hiXrJUyQYqidsUizcrbaW27LBejuJN27DzarrylWXWm0Akg6peiUY0FsjKSQIIfyYAT0QOsbYeB56V5nChHYJmpk__Xj7Xt1uAkNOtPcJWhpjeLEtV7nBshwXRzMzAamp2XWzF3r7TJOq57vdnJr67hf286GQk037k58RZrNSSJT4_mZvrgMK39KZbGj4x0nI5Q-JkTUx34pY2vpSqjA7czFDQPuvs5W6LkyIefxNwL1qlXJsNK7PbrZ3-K7qI2WGx-c-58SXKley_RJE3_sje7Pt3k2lT84hVicomBfHIg9UQgmZkWWB-ic1MI_5diUWZu7TRG8Oc104MzQDT26SzgPJGuQDEwAmWA375HL6M4zzFXjTm7huLdvSAopFM97Sic5kuUgW5nAF4lBk02OZSz9QaDngr16bRuYCm_PaExcMJxw32FJeqvYneivQlp8aAglst3NvpVSPJ6dUQXqNXN23_fWdPjT7nMFTGQ0ZpTp_ITtVox6jMF32RiTRm93_iRi_3T6vv6FEAt7Q8jqQQf2QSsygPjDIEDul4JnS0pJ-GgA0ZPt9oZNLhPUlKS3-uDOdq97sY4Zb0iDRKYb9xjrRCzOdw_balg80Xp66StBoGRPE_RTsFby9ubgOR4az2Zcf_xmbB3LGorNhPMD14CTH6gKeRFlhxmLB5Td1SiNNbAg1pBH0G3ejYwiGrfqeAuJkPUdbS1xAFuOCxos3AL1tt207vJrnTdVyqL6X3Eh9lKmJjCghrORCrmZZBEOAZUVnJoD1HrH8oE3mkt7qZWzy5C_91x286F0GY3nR4pPygKW9TQ6PF2odUUTyy082UXxMVnOpMSl8vT7K7jYzgMeEcg7V9N48vAh4WlMdOY5AN_HiBdzCLu3fZ41pQ7G-8KP5ZfiVWyYfCBLl028OXgZ68ae-p2lsrFWsFAlRaxcmhd_siC6vmTrMJq4PCA8QLW9TRGBjRc806V8z2j1a_EMgioZDncuFYcHM2AvyRKBIZeMfGhLDsWup56_vlXY9yx3UKg09I8vhf-Osu-Z-htt6urXMU-Gf4msH5MmeREqYAvvCbTEDkalJED-1MSxcxdENI-OJaKYwmP9yeATyLq-Hyfzc2yvGcE4mrV5JkbFYgOQbkURRjui8-9SNkk9TY-d0HhJlm4TKQImRmapH83G-LfavxUYtZvi1SCrFq0vyGye087XkmGJLZKmTTyh9BeeRWua3yJrq5lN06mdjBX61sTTwmrXFUVnFv54rqAWOuNClKm9isejDvIW36qeco_aeUvTOC9UEncVOyTqyfmz7rp3MakuDBSRZT4o6wfnXM4CbXXTmsGf2HxtzIFbXCmdi_5LIeIrrrrzTUGQPgG-Y6UToCG-Fo4P0PrKbIIuq-cbr2nXPTJjLqO6fzCzVGan27EMWOebb-wQ2Tu4IQpoW-o4H9DNY4LXhdq7v95vGMyg2HfGX7YWrXNxfxuYwU18_VhakCjK6h1fs_u8j7UtK3MA4A2dr7wjBPTxOVMY4gkKkMjIjcwX8yBFq0pVtQf-iLyi6RE44e8qDVyPFbe-BYJZhVlg5J-uq8GuJ3KroBT5ds_1JE2cNfhQllgX2hpVd4LKgOcNk37SeS4D3XvoZMsmn6p15y9LR11dUlWGdMZ7UGNLLxlgP8aHNlplZpb17zPSFjhM1CK30XcXaL7rJh74va0mrQOt7wb6NSg0oELXV7HMeYHzIIsqzxJkqgWDp1YUgYseDKEqfNcYHgUcu0DClBRjURO0_Cd0C7lpCz7-OszjoIg-HneaIcORjUoVCtaugBNCjsu4RcrxarNliYfU2htNzGH5nkL8u9ACOer_An5aV6cOIUCYknTfxswQlwQfRxRyH0q43N1NcRWQHGpsWPXyBzl8ArCWc6y6Ivyt4RljVHIF5VSzToq1lGKCCHdo5I3ZWt431ho9IN3506xAvV5bP1e-aQ_EDP1QEmbqngbgLUgKdWAs-WI9OdsToINPaLS9OLuJHvBtnWjZUNsK8_su2NpPg7gypuh8wkKbYWGL09t7PMigq5Whr_cdJmRUOO9Bl7O3KIESACt5KiNKc6irafaMQMpi-blhwyRTILDbABAaK_5DrkM5pLk10utm6ei8u-ms7fvgVGYLZa00HJHZJY7HbkR2WmOZbkjypU1E6n_UUbALfttHYCLy2zJv34fi3t70HbdMrpQw6qdfsyxrqE7eY4AW_QKUCqDAZ0fSuB4N_3QkpIg9h0q6BJzA606nUMCVbwhaXl9MqTVetSfsqg5fH9Bd2fU--spNiCHAbLaLa1u9_zlb9LLOqD5Ti_arc5vHabx3OLKxCO8URoekGRt7QwSxlM8ETxP4za0D7KcBziWYxa7ONpAgzdBn2o9Uj-IAuSlr_asBBUARa6D9kdGYhT-JI8D5S3TD_r_kzsmojC2rOE5rtQY7HLvmx50E_q7LFWSxIThdIgF-xTZplOoFQ0yuB-X_XteNatKBTjcWwP4toBzwNpVSGd87Csai0WoLhIRCF_osH7S2qwg4sXio99fvk2HB1OeNRh-ywHPqYkrMGGvYXyuypRjfyUW2QU6XqMTD5SFlELa9DzrDW2Zl5OQLpWgQRph9HO5yYdotglly9JBBJpReW4o0LozYNW-oG83RH7_LjZh4phgHgGtrp6Gsh3h5T_Z0CCs81xxmN29c1Gf_MySED1DtBHFVbIqKNOT9DlwSJ872qOYGBdxfVUv0B2tqu1VSjCipbgHseEaXLwrnTQBrywVOOCk5qreAedj-0E7KfbyiUdWG36_CCH1WIP8uViE2DTgZ7ARgdM4cRmgnG20zAevAI_AFT_IfrEVPnJUlvyqIx9BX0S517usf7cIv106pDOVU1pIYsj4v2yIU4KBWVOvD6xl4C5lz1wivUDyh1MVSxOJffeazs9w2s3hypM5GT0kChLN-GrCjyrkD-Ngm72A2oCiq9RUC_M8ft_-Vr8LvUUNrtmn_2OtWq1b7JEibr0Am5d1T3ZsOVpFOgqZFObI2RxBqOZ4v-bVlTwT03pEHi5Jo1rRpwNX00QU2Jq1plsQqoxpc09oFTuOIL_hm8iz010xplhE5eU9U_PDo-zyj6E3ox5Kp6wiwXDxgSMd1UoAkrJ8nU6JsetlAsJ4VxryIJyEOxO1T17z","summary":[{"type":"summary_text","text":"**Planning thread and connection telemetry analysis**"},{"type":"summary_text","text":"**Investigating CPU usage sources in broker**"}]},{"id":"fc_0365286983a6ba82016a59d5a5e51081949f8cb6edbb7b8b78","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating net streams dispatch\",\"pattern\":\"fn dispatch_net_streams|KIND_NET_STREAMS =>\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_fDFljCFCxKpxSa1b8ymYym2G","name":"grep"},{"id":"fc_0365286983a6ba82016a59d5a5e54081949c19a93df96ad075","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream enumeration dispatch\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"4350-4415\"}","call_id":"call_PNXxcbzZHyRim2V6YofCqbpx","name":"read"},{"id":"fc_0365286983a6ba82016a59d5a5e5548194a738ba3f799aa780","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating dispatch poll cadence\",\"pattern\":\"DEFAULT_DISPATCH_POLL|run_dispatch_loop\\\\(\",\"path\":\"crates/spt-daemon/src; crates/spt-daemon/tests\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_jGuVTGc04WQlY5l32MRAj4Zr","name":"grep"},{"id":"fc_0365286983a6ba82016a59d5a5e5748194af8a6663008f0cdc","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatcher startup cadence\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"90-115\"}","call_id":"call_FT9VQRbSclsJ8IfwUbPf9r5S","name":"read"}]},"duration":59095.4864000082,"ttft":2370.245600000024,"contextSnapshot":{"promptTokens":136478,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_fDFljCFCxKpxSa1b8ymYym2G|fc_0365286983a6ba82016a59d5a5e51081949f8cb6edbb7b8b78","toolName":"grep","startedAt":"2026-07-17T07:11:35.233Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Locating net streams dispatch"},"id":"97f29fcb","parentId":"a0cbee1b","timestamp":"2026-07-17T07:11:35.233Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_PNXxcbzZHyRim2V6YofCqbpx|fc_0365286983a6ba82016a59d5a5e54081949c19a93df96ad075","toolName":"read","startedAt":"2026-07-17T07:11:35.233Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading stream enumeration dispatch"},"id":"e13316d1","parentId":"97f29fcb","timestamp":"2026-07-17T07:11:35.233Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_jGuVTGc04WQlY5l32MRAj4Zr|fc_0365286983a6ba82016a59d5a5e5548194a738ba3f799aa780","toolName":"grep","startedAt":"2026-07-17T07:11:35.233Z","args":{"path":"crates/spt-daemon/src; crates/spt-daemon/tests"},"intent":"Locating dispatch poll cadence"},"id":"04f186f1","parentId":"e13316d1","timestamp":"2026-07-17T07:11:35.233Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_FT9VQRbSclsJ8IfwUbPf9r5S|fc_0365286983a6ba82016a59d5a5e5748194af8a6663008f0cdc","toolName":"read","startedAt":"2026-07-17T07:11:35.233Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatcher startup cadence"},"id":"bb629a77","parentId":"04f186f1","timestamp":"2026-07-17T07:11:35.233Z"}
{"type":"message","id":"8922568a","parentId":"bb629a77","timestamp":"2026-07-17T07:11:35.239Z","message":{"role":"toolResult","toolCallId":"call_fDFljCFCxKpxSa1b8ymYym2G|fc_0365286983a6ba82016a59d5a5e51081949f8cb6edbb7b8b78","toolName":"grep","content":[{"type":"text","text":" 3140|                }\n*3141|                KIND_NET_STREAMS => {\n 3142|                    if let Err(msg) = self.dispatch_net_streams(&send) {\n 3143|                        send_error(&send, &msg);\n 3144|                    }\n...\n 4365|    /// brain uses to find streams that arrived while it was down.\n*4366|    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\n 4367|        let host = self.net.get().ok_or(\"net disabled\")?;\n 4368|        let frame = Envelope::new(\n 4369|            KIND_NET_STREAMS_REPLY,"}],"details":{"scopePath":"crates/spt-daemon/src/broker.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":2,"fileCount":1,"files":["crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/broker.rs","count":2}],"truncated":false,"displayContent":" 3140│                }\n*3141│                KIND_NET_STREAMS => {\n 3142│                    if let Err(msg) = self.dispatch_net_streams(&send) {\n 3143│                        send_error(&send, &msg);\n 3144│                    }\n     │...\n 4365│    /// brain uses to find streams that arrived while it was down.\n*4366│    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\n 4367│        let host = self.net.get().ok_or(\"net disabled\")?;\n 4368│        let frame = Envelope::new(\n 4369│            KIND_NET_STREAMS_REPLY,"},"isError":false,"timestamp":1784272295239}}
{"type":"message","id":"316435ba","parentId":"8922568a","timestamp":"2026-07-17T07:11:35.255Z","message":{"role":"toolResult","toolCallId":"call_FT9VQRbSclsJ8IfwUbPf9r5S|fc_0365286983a6ba82016a59d5a5e5748194af8a6663008f0cdc","toolName":"read","content":[{"type":"text","text":"/// What protocol a peer-initiated stream speaks, by its first record's shape.\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum StreamFamily {\n    /// A context sync pull (`SyncRecord::Request`).\n    Sync,\n    /// An update pull (`UpdRecord::Query`).\n    Update,\n    /// A notif replication feed (`NotifRecord::Row`).\n    Notif,\n    /// A WAN message feed (untagged `WanMessage` lines).\n    WanMsg,\n    /// A registry replication feed (untagged `RegistryUpdate` lines).\n    Registry,\n    /// A remote-drive attach (`AttachRecord::Request`).\n    Attach,\n    /// A file transfer (`XferRecord::Fetch`/`Push`).\n    Xfer,\n    /// A remote rest op (`RestRecord::Request` — suspend/wake from another\n    /// node, M5-D5b).\n    Rest,\n    /// A cross-node shell-link op (`ShellLinkRecord::Request` — relink/cmd\n    /// against an owner's shell on this node, M5-D8c).\n    ShellLink,\n    /// A subnet-scoped liveness probe (`ServeProbeRecord::Request` — \"serving\n    /// subnet X?\", the `--nodes` view's detach-aware refinement, REQ-SUBNET-5).\n    ServeProbe,\n    /// Unclassifiable — dropped.\n    Unknown,\n}\n\n\n[Showing lines 89-118 of 1558. Use :119 to continue]"}],"details":{"truncation":{"content":"/// What protocol a peer-initiated stream speaks, by its first record's shape.\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum StreamFamily {\n    /// A context sync pull (`SyncRecord::Request`).\n    Sync,\n    /// An update pull (`UpdRecord::Query`).\n    Update,\n    /// A notif replication feed (`NotifRecord::Row`).\n    Notif,\n    /// A WAN message feed (untagged `WanMessage` lines).\n    WanMsg,\n    /// A registry replication feed (untagged `RegistryUpdate` lines).\n    Registry,\n    /// A remote-drive attach (`AttachRecord::Request`).\n    Attach,\n    /// A file transfer (`XferRecord::Fetch`/`Push`).\n    Xfer,\n    /// A remote rest op (`RestRecord::Request` — suspend/wake from another\n    /// node, M5-D5b).\n    Rest,\n    /// A cross-node shell-link op (`ShellLinkRecord::Request` — relink/cmd\n    /// against an owner's shell on this node, M5-D8c).\n    ShellLink,\n    /// A subnet-scoped liveness probe (`ServeProbeRecord::Request` — \"serving\n    /// subnet X?\", the `--nodes` view's detach-aware refinement, REQ-SUBNET-5).\n    ServeProbe,\n    /// Unclassifiable — dropped.\n    Unknown,\n}\n","truncated":true,"truncatedBy":"lines","totalLines":1470,"totalBytes":1111,"outputLines":30,"outputBytes":1111,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// What protocol a peer-initiated stream speaks, by its first record's shape.\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum StreamFamily {\n    /// A context sync pull (`SyncRecord::Request`).\n    Sync,\n    /// An update pull (`UpdRecord::Query`).\n    Update,\n    /// A notif replication feed (`NotifRecord::Row`).\n    Notif,\n    /// A WAN message feed (untagged `WanMessage` lines).\n    WanMsg,\n    /// A registry replication feed (untagged `RegistryUpdate` lines).\n    Registry,\n    /// A remote-drive attach (`AttachRecord::Request`).\n    Attach,\n    /// A file transfer (`XferRecord::Fetch`/`Push`).\n    Xfer,\n    /// A remote rest op (`RestRecord::Request` — suspend/wake from another\n    /// node, M5-D5b).\n    Rest,\n    /// A cross-node shell-link op (`ShellLinkRecord::Request` — relink/cmd\n    /// against an owner's shell on this node, M5-D8c).\n    ShellLink,\n    /// A subnet-scoped liveness probe (`ServeProbeRecord::Request` — \"serving\n    /// subnet X?\", the `--nodes` view's detach-aware refinement, REQ-SUBNET-5).\n    ServeProbe,\n    /// Unclassifiable — dropped.\n    Unknown,\n}\n","startLine":89,"lineNumbers":[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":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":1111,"outputLines":30,"outputBytes":1111,"shownRange":{"start":89,"end":118},"nextOffset":119}}},"isError":false,"timestamp":1784272295255}}
{"type":"message","id":"9ef20918","parentId":"316435ba","timestamp":"2026-07-17T07:11:35.295Z","message":{"role":"toolResult","toolCallId":"call_PNXxcbzZHyRim2V6YofCqbpx|fc_0365286983a6ba82016a59d5a5e54081949c19a93df96ad075","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                    KIND_NET_SENT,\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        let frame = Envelope::new(\n            KIND_NET_STREAMS_REPLY,\n            serde_json::to_value(NetStreamsReply {\n                streams: host.stream_infos(),\n            })\n            .expect(\"NetStreamsReply serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(())\n    }\n\n    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A):\n    /// the dispatcher reports a serve loop that ran to completion, and the row\n    /// leaves the table so no future dispatcher generation can rediscover and\n    /// replay it (the KNOWN-HAZARDS 7.41 control-steal class).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        let removed = host.retire_stream(req.stream_id);\n        let frame = Envelope::new(\n            KIND_NET_STREAM_RETIRED,\n            serde_json::to_value(NetStreamRetired {\n                stream_id: req.stream_id,\n                removed,\n            })\n            .expect(\"NetStreamRetired serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(())\n    }\n\n    /// A stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact the dispatcher reads instead of peeking ring seq 0.\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    fn dispatch_net_stream_opener(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n        let req: NetStreamOpenerReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-stream-opener payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        let opener = host\n            .stream_opener(req.stream_id)\n            .ok_or_else(|| format!(\"no such stream {}\", req.stream_id))?;\n        let frame = Envelope::new(\n            KIND_NET_STREAM_OPENER_REPLY,\n            serde_json::to_value(NetStreamOpenerReply {\n                stream_id: req.stream_id,\n                opener_b64: opener.map(|line| crate::msg::encode_bytes(&line)),\n            })\n            .expect(\"NetStreamOpenerReply serializes\"),\n        );\n…\n    }\n\n[Showing lines 4349-4418 of 6298. Use :4419 to continue]"}],"details":{"truncation":{"content":"                let frame = Envelope::new(\n                    KIND_NET_SENT,\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        let frame = Envelope::new(\n            KIND_NET_STREAMS_REPLY,\n            serde_json::to_value(NetStreamsReply {\n                streams: host.stream_infos(),\n            })\n            .expect(\"NetStreamsReply serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(())\n    }\n\n    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A):\n    /// the dispatcher reports a serve loop that ran to completion, and the row\n    /// leaves the table so no future dispatcher generation can rediscover and\n    /// replay it (the KNOWN-HAZARDS 7.41 control-steal class).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        let removed = host.retire_stream(req.stream_id);\n        let frame = Envelope::new(\n            KIND_NET_STREAM_RETIRED,\n            serde_json::to_value(NetStreamRetired {\n                stream_id: req.stream_id,\n                removed,\n            })\n            .expect(\"NetStreamRetired serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(())\n    }\n\n    /// A stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact the dispatcher reads instead of peeking ring seq 0.\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    fn dispatch_net_stream_opener(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n        let req: NetStreamOpenerReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-stream-opener payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        let opener = host\n            .stream_opener(req.stream_id)\n            .ok_or_else(|| format!(\"no such stream {}\", req.stream_id))?;\n        let frame = Envelope::new(\n            KIND_NET_STREAM_OPENER_REPLY,\n            serde_json::to_value(NetStreamOpenerReply {\n                stream_id: req.stream_id,\n                opener_b64: opener.map(|line| crate::msg::encode_bytes(&line)),\n            })\n            .expect(\"NetStreamOpenerReply serializes\"),\n        );","truncated":true,"truncatedBy":"lines","totalLines":1950,"totalBytes":3066,"outputLines":70,"outputBytes":3066,"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                    KIND_NET_SENT,\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        let frame = Envelope::new(\n            KIND_NET_STREAMS_REPLY,\n            serde_json::to_value(NetStreamsReply {\n                streams: host.stream_infos(),\n            })\n            .expect(\"NetStreamsReply serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(())\n    }\n\n    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A):\n    /// the dispatcher reports a serve loop that ran to completion, and the row\n    /// leaves the table so no future dispatcher generation can rediscover and\n    /// replay it (the KNOWN-HAZARDS 7.41 control-steal class).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        let removed = host.retire_stream(req.stream_id);\n        let frame = Envelope::new(\n            KIND_NET_STREAM_RETIRED,\n            serde_json::to_value(NetStreamRetired {\n                stream_id: req.stream_id,\n                removed,\n            })\n            .expect(\"NetStreamRetired serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(())\n    }\n\n    /// A stream's pinned opener line (ADR-0038 B) — the restart-durable\n    /// classification fact the dispatcher reads instead of peeking ring seq 0.\n    // [impl->REQ-STREAM-OPENER-DURABLE]\n    fn dispatch_net_stream_opener(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n        let req: NetStreamOpenerReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-stream-opener payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        let opener = host\n            .stream_opener(req.stream_id)\n            .ok_or_else(|| format!(\"no such stream {}\", req.stream_id))?;\n        let frame = Envelope::new(\n            KIND_NET_STREAM_OPENER_REPLY,\n            serde_json::to_value(NetStreamOpenerReply {\n                stream_id: req.stream_id,\n                opener_b64: opener.map(|line| crate::msg::encode_bytes(&line)),\n            })\n            .expect(\"NetStreamOpenerReply serializes\"),\n        );\n…\n    }","startLine":4326,"lineNumbers":[4326,null,4332,null,4336,null,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,null,4421]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":3066,"outputLines":70,"outputBytes":3066,"shownRange":{"start":4349,"end":4418},"nextOffset":4419}}},"isError":false,"timestamp":1784272295295}}
{"type":"message","id":"dd2b8d7d","parentId":"9ef20918","timestamp":"2026-07-17T07:11:35.297Z","message":{"role":"toolResult","toolCallId":"call_jGuVTGc04WQlY5l32MRAj4Zr|fc_0365286983a6ba82016a59d5a5e5548194a738ba3f799aa780","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/\n\n## src/\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 428|/// stream).\n*429|pub fn run_dispatch_loop(\n 430|    broker_name: &str,\n 431|    paths: &DispatchPaths,\n 432|    registry: Arc<RegistryHost>,\n...\n 1204|        if let Err(e) =\n*1205|            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n 1206|        {\n 1207|            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n 1208|        }\n\n## tests/\n### dispatch.rs\n 108|    thread::spawn(move || {\n*109|        let _ = run_dispatch_loop(&name, &paths, registry, &flag, Duration::from_millis(25));\n 110|    });\n 111|    stop\n 112|}\n### mesh.rs\n 250|            thread::spawn(move || {\n*251|                let _ = run_dispatch_loop(&name, &disp, reg, &flag, Duration::from_millis(25));\n 252|            });\n 253|        }\n 254|        stop\n### mesh_recovery.rs\n 123|    thread::spawn(move || {\n*124|        let _ = run_dispatch_loop(&name, &paths, registry, &flag, Duration::from_millis(25));\n 125|    });\n 126|}\n 127|\n### pump.rs\n 239|        thread::spawn(move || {\n*240|            let _ = run_dispatch_loop(&name, &paths, reg, &flag, Duration::from_millis(25));\n 241|        });\n 242|    }\n 243|\n### twohost.rs\n 342|        thread::spawn(move || {\n*343|            let _ = run_dispatch_loop(&name, &paths, reg, &flag, Duration::from_millis(50));\n 344|        });\n 345|    }\n 346|    {\n\n### fixtures/\n#### dispatch_fixture.rs\n 26|    let stop = AtomicBool::new(false); // runs until killed — the test owns the lifetime\n*27|    if let Err(e) = spt_daemon::dispatch::run_dispatch_loop(\n 28|        &broker,\n 29|        &paths,\n 30|        registry,"}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt-daemon/tests","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":9,"fileCount":7,"files":["crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/tests/dispatch.rs","crates/spt-daemon/tests/fixtures/dispatch_fixture.rs","crates/spt-daemon/tests/mesh.rs","crates/spt-daemon/tests/mesh_recovery.rs","crates/spt-daemon/tests/pump.rs","crates/spt-daemon/tests/twohost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":3},{"path":"crates/spt-daemon/tests/dispatch.rs","count":1},{"path":"crates/spt-daemon/tests/fixtures/dispatch_fixture.rs","count":1},{"path":"crates/spt-daemon/tests/mesh.rs","count":1},{"path":"crates/spt-daemon/tests/mesh_recovery.rs","count":1},{"path":"crates/spt-daemon/tests/pump.rs","count":1},{"path":"crates/spt-daemon/tests/twohost.rs","count":1}],"truncated":false,"displayContent":"# crates/spt-daemon/\n\n## src/\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  428│/// stream).\n *429│pub fn run_dispatch_loop(\n  430│    broker_name: &str,\n  431│    paths: &DispatchPaths,\n  432│    registry: Arc<RegistryHost>,\n     │...\n 1204│        if let Err(e) =\n*1205│            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n 1206│        {\n 1207│            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n 1208│        }\n\n## tests/\n### dispatch.rs\n 108│    thread::spawn(move || {\n*109│        let _ = run_dispatch_loop(&name, &paths, registry, &flag, Duration::from_millis(25));\n 110│    });\n 111│    stop\n 112│}\n### mesh.rs\n 250│            thread::spawn(move || {\n*251│                let _ = run_dispatch_loop(&name, &disp, reg, &flag, Duration::from_millis(25));\n 252│            });\n 253│        }\n 254│        stop\n### mesh_recovery.rs\n 123│    thread::spawn(move || {\n*124│        let _ = run_dispatch_loop(&name, &paths, registry, &flag, Duration::from_millis(25));\n 125│    });\n 126│}\n 127│\n### pump.rs\n 239│        thread::spawn(move || {\n*240│            let _ = run_dispatch_loop(&name, &paths, reg, &flag, Duration::from_millis(25));\n 241│        });\n 242│    }\n 243│\n### twohost.rs\n 342│        thread::spawn(move || {\n*343│            let _ = run_dispatch_loop(&name, &paths, reg, &flag, Duration::from_millis(50));\n 344│        });\n 345│    }\n 346│    {\n\n### fixtures/\n#### dispatch_fixture.rs\n 26│    let stop = AtomicBool::new(false); // runs until killed — the test owns the lifetime\n*27│    if let Err(e) = spt_daemon::dispatch::run_dispatch_loop(\n 28│        &broker,\n 29│        &paths,\n 30│        registry,"},"isError":false,"timestamp":1784272295296}}
{"type":"message","id":"6464c5f4","parentId":"dd2b8d7d","timestamp":"2026-07-17T07:12:06.140Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing local stream filtering inefficiencies**\n\n**Tracing unbounded stream retention impact**"},{"type":"toolCall","id":"call_zB0c95UXayPqBfNRbI65k9y2|fc_0365286983a6ba82016a59d5b6549481949b354919ce840782","name":"irc","arguments":{"i":"Sending combined broker RCA","op":"send","to":"Main","message":"Broker RCA: one root explains thread count + broker writes. NetHost keeps every stream row until QUIC conn closes (`nethost.rs:954-967`); clean stream EOF only `StreamLog::finish` enqueues EOF and retains seat (`:476-488`). Long-lived pump Brain carrier conn137 repeatedly subscribes response streams; each creates a native `SubscriberSeat` writer (`:189-223`) that blocks forever on `rx.recv` after EOF because there is no stream-unsubscribe; handler detaches only when physical brain IPC conn EOFs (`broker.rs:3024-3286`). Logs: conn137 first stream50 at line500/mono72862, accretes many tags, still attaching stream6233 near line32300/mono~6129205, no transport-close. Dominant ~500 parked broker threads. Same stream-row retention causes broker hot loop: dispatcher asks NET_STREAMS every 100ms (`dispatch.rs:429-590`, DEFAULT line87); broker `dispatch_net_streams` serializes `host.stream_infos()` (`broker.rs:4365-4376`); `stream_infos` scans table and returns every non-retired row incl locally initiated (`nethost.rs:1809ff`). Thousands of completed local pump streams are never retired, so ~10 huge IPC replies/sec plausibly match broker CPU + 3.74MiB/s writes. Separate PTY leak risk: HostedSession has Drain but no Drop; session removal line3460ish doesn’t request_stop/join, while `reader.rs:1-18,94-146` says ConPTY no EOF while writer held and drain owns writer. Probe: over 70s compare Δ broker thread count with count of new `conn=137 ... event=stream-sub-attach`; simultaneously sample daemon log NET_STREAMS reply/client pipe writes. If 1:1 threads, seat leak; if writes scale with stream table size/10Hz, hot enumeration. No sessions stopped.","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":11936,"output":822,"cacheRead":128512,"cacheWrite":0,"totalTokens":141270,"reasoningTokens":362,"cost":{"input":0.059680000000000004,"output":0.02466,"cacheRead":0.064256,"cacheWrite":0,"total":0.148596}},"stopReason":"toolUse","timestamp":1784272295307,"responseId":"resp_0365286983a6ba82016a59d5a7a8f08194bf7f0a0fa5a9dd7a","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5aac3a88194a10c64fd9871d2fc","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdW23Zm3wbv4pAoamEzDHtLlw2xp2AVPzkHPaPWqS6lhIHkuJebFFD1IBPkShkEimzbwzypOHQw8CJL_FZw5gADZI7kruo2P_Fa0ryuFxAyOTphxu9lBdhukkkjaTk7-pC5jCzaAfZ4Cu4spY2aeGPy1T0Q5JoRuassukjvRizUcuIOlk-oR-hFg_N647V5bjauppEEO-yV27YYA540a3TwoNwLkdfLCpzrmDsh3LBJ-eKhf71PzcNjqkJgu7C3_UgAhCxYfZNwSZzvHMO02fakKdNvAuih_fanMOiBziFJimNatdhl0yCgjuh5sZoahovJEBue7uwMLsdY6hOmnIqeanlqoiuRFxaGTS5yJesHdudKpUDiglFJm5DOVOVwIC6W7ii0xc_k5gjVsl151B3pNTHRCQ1Qiv4RMfoIDQNea9owumj7SgCuZ9fMNVpOhcZpLCYD2vn53MF7W-qW4woPoZmaG1pPEgqphhLhk2W1_ZdLhkcjuXvLknaOn1wYMj4OjZm8fKKNaB16WYx8kCdB2CL38HYvWfo0h3uC6dxnmSXkNdWVgeNJRlQka_cq-suEEj5zNVlqRvuouAU5C0Ajj545KWSpsjC2HEnX-IeMHnt6Algtb7SJyVCRJj8mUnJ9LItvozX4YInfn1qXkXiL9SAJWGBpJqUutjVoC37lRdxyOY-PFKNejGYpn0A3ZQUbbN90_6OUfs_i4ILgWCSriLSO2acOn1-SG21tKX7LMhXIzOVAl0AS6Vd7_IvPVqXvUdfEvw2hvzp6aRUVgBSA_e_1L2J1WvImoKoZIwo54pp_nyuBxj0ihSnfzkYrSjkWWAOYX8MxgVXTaXIcosYYIafyefchAriAIhnRKnTn5pG0vukO3w3TLtPwEhqzSnuZEiIisePKDkon-aWawA-0O0T7NZv-EnbgooVx3CWw0O2CkXswQ5fdoP4NN3_X7QW_scfSqO8C514Jj5cB6WYtgGDNqD88F_3kSZQVCv1eIfaRzDTQLxU8WoANPa9epFDgI0JVAtH7zhZYXQg0DRlCnzxuhyOljStE0nqrAGAAzuoNxu7rMM0i_iiw-0eaFUdJjf_NH42IC4Eygq_oqgmE2VSiHxWjB1rMP27-OmnG3mfcbNRwhIcWnA4Tp945TmBJq8yOCylv-mZ8obNxUmmVcw38YqziWaaD7sY62LEXM8hrEUFiaEUAWQXB8p6QC5H6dPu6cFoU7joLAedtyNrEoR35LGBBdk6iJ8hu0BrJ6I9jBYqLt03dB7n9vhsjpvEzfgYxDAqkZlv8L5ea2-EjyjWKaT_fY6YZ8SGr_FE1NlHSAHMRTE_Hwr9lY5rwRbnyD7298qiLN164E-nf8d0_1rf2NQKHS07Z7O1WiKnB7KbKfcokLAHL4m4xVvO5l4jTdMWHHLapCvteLzfA8n0ogzliFQNazi-rPrT4UFg1w4wvzRfJpv9newDnHH_x38vqrta1ovU2A3ADPCuPGynOm626boHpl_OqNOfpGKKUTv04zro6DeqgC3S3soUXoyNbMEoXebmrpLDfW2BRtOCUJRuMlypY_knPYI0rxIgmcGCm9RfhaHrGDgQV6KBGlkoFs1ya1APm9SJFqTIfST7023UWnUIYo7Z8z8TTrK0sSFimlU5BVC5r72NLqGkHBxjFpjXO94HeKS1KZAAzZkve6LIzOF0MivvPb4mjZCnqadk6Oty7IOkXiczJ8RaSOBFom313o70JVh6kitMzLTToPbKgMNEZAqY0kEPcx2cP7AacBDerdpFdqYKs7-KoUYM62th-v_S5RzPg5TbRpVjhEnv3YfDpEwUy7AaRNB44IQiqC5XJOW_FFw1CSxnA-XKgCpdrYNbNpWH7-jG2qrtEa2cg4LEtwz6r5DJb4oHMVl-4ZT3daJPrkZdsUiHOs3MZ64ax6Ni-RO7Qs13fkX5D4nXYaPyjHezrGTdXunCw5blxzMVs3jj8n0m3DSBPlGZtpVnXVHnUWVESspP0vuOXB-40sR7O_O2872wqRFOoOX6SsM_jRhxolVwjYHkK6FPU8DVEtElloTJ4hUlJPmAG-oF-c9p7PJ9wiyTi6TLWHlSWxWKlLj5Rc34l3X3KXAKjAA6BM1dMUTWT8RKwTf5_HZSJeG-S7KdBGb3ncymPsFhFnQ7_sVKWV681_aOp5QZ3xGbRSVlv23Tg6C7RidpEoyRXWSUmOShWd0SefmAf0JHbmIRjDQiDUzGfb5aEp36F7p6tIG4u3Di6XVmn69gr8b000m3RduiyqWjySN8sfepLTZOIeRj4PX5qHvWF36WMO5xC1cq4cx6nWxh8-_n6nJm3PIQ3Q4c5nfEm4lrP-J62Va7FvhVKXR35Zkm6lpAcwGgrPrRKh8I0PIl2Z8RIpSgt2W6_yf6JNepsYO5uPIlysuvbbbOQbr3km2zmyD3nJxpXyL87hfMa6TtmZM7xzvpTdY-TWYWNOkZbInTmJc4dQnwCBYqm_UTdRoIDMwS0_RThba0VxwwMPhRV9idcuK58JG_yePZEoud5_HEKavG7x3lDIWfnkxmTJm52EkPRx_mn7fP0eehNTxLrirURB_culS75KSWKxN4-SQb-6P3O5KwJ-D4QUc0777iXLfu_ifdxQcrSD5NrZl0ppysq5XMJ6YTUOu_LTB1tY2cWjmR7SvcSSyeDyV33W_8B-ZU3A8mLB5PO5xDY0_xDEvnWObkqV87JL-Jw4-OqgeufD2W3meFFIM4ps9BAulY9vej4xrx0utfXP-yEyZ58h1HtOl-9lHMyAQTQi4gYnRrZqJc5_t6fBc8xtwh1VuKtV7en9ceAFKgyJDK_FMYrlvOODqLDMGDK-dquXELbHNFvX3ac8Rr-bastInVBi8jdW_04LYSxrBDRUtNZpjOIFHQDyCld0U6UneKneoy9yRszInrFK3DtKK6gYKpAHzuuUXfmmQv6q3WMUiooJqq_AvBamSXdtOds9-JXcn2QBXXAtzsiJ4q3JS0ckxz_20DDJ-fgVBsVa89y55NZiprpujaTrBvZbhZYSFke0suSqcwH4HJMScJ5PsZJRfWqik6SfbnM68uBZcwa0ObEVF6IYi7gy2jEqkHM_D9DMhdAhMVRtra6XrqmxO_2sCVz4hox42CLF","summary":[{"type":"summary_text","text":"**Analyzing local stream filtering inefficiencies**"},{"type":"summary_text","text":"**Tracing unbounded stream retention impact**"}]},{"id":"fc_0365286983a6ba82016a59d5b6549481949b354919ce840782","type":"function_call","status":"completed","arguments":"{\"i\":\"Sending combined broker RCA\",\"op\":\"send\",\"to\":\"Main\",\"message\":\"Broker RCA: one root explains thread count + broker writes. NetHost keeps every stream row until QUIC conn closes (`nethost.rs:954-967`); clean stream EOF only `StreamLog::finish` enqueues EOF and retains seat (`:476-488`). Long-lived pump Brain carrier conn137 repeatedly subscribes response streams; each creates a native `SubscriberSeat` writer (`:189-223`) that blocks forever on `rx.recv` after EOF because there is no stream-unsubscribe; handler detaches only when physical brain IPC conn EOFs (`broker.rs:3024-3286`). Logs: conn137 first stream50 at line500/mono72862, accretes many tags, still attaching stream6233 near line32300/mono~6129205, no transport-close. Dominant ~500 parked broker threads. Same stream-row retention causes broker hot loop: dispatcher asks NET_STREAMS every 100ms (`dispatch.rs:429-590`, DEFAULT line87); broker `dispatch_net_streams` serializes `host.stream_infos()` (`broker.rs:4365-4376`); `stream_infos` scans table and returns every non-retired row incl locally initiated (`nethost.rs:1809ff`). Thousands of completed local pump streams are never retired, so ~10 huge IPC replies/sec plausibly match broker CPU + 3.74MiB/s writes. Separate PTY leak risk: HostedSession has Drain but no Drop; session removal line3460ish doesn’t request_stop/join, while `reader.rs:1-18,94-146` says ConPTY no EOF while writer held and drain owns writer. Probe: over 70s compare Δ broker thread count with count of new `conn=137 ... event=stream-sub-attach`; simultaneously sample daemon log NET_STREAMS reply/client pipe writes. If 1:1 threads, seat leak; if writes scale with stream table size/10Hz, hot enumeration. No sessions stopped.\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_zB0c95UXayPqBfNRbI65k9y2","name":"irc"}]},"duration":30831.75110000372,"ttft":3469.4097000062466,"contextSnapshot":{"promptTokens":140448,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zB0c95UXayPqBfNRbI65k9y2|fc_0365286983a6ba82016a59d5b6549481949b354919ce840782","toolName":"irc","startedAt":"2026-07-17T07:12:06.141Z","intent":"Sending combined broker RCA"},"id":"e4a5fb4e","parentId":"6464c5f4","timestamp":"2026-07-17T07:12:06.141Z"}
{"type":"message","id":"7a2b7aac","parentId":"e4a5fb4e","timestamp":"2026-07-17T07:12:06.141Z","message":{"role":"toolResult","toolCallId":"call_zB0c95UXayPqBfNRbI65k9y2|fc_0365286983a6ba82016a59d5b6549481949b354919ce840782","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- Main: injected"}],"details":{"op":"send","from":"BrokerCpuRca","to":"Main","receipts":[{"to":"Main","outcome":"injected"}]},"isError":false,"timestamp":1784272326141}}
{"type":"message","id":"25ab3bc5","parentId":"7a2b7aac","timestamp":"2026-07-17T07:12:23.921Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Verifying stream_infos retrieval**"},{"type":"toolCall","id":"call_qIXCgOykdjglqKCqLMyFTMB4|fc_0365286983a6ba82016a59d5d7d8c48194a51f58ff75f3bc25","name":"read","arguments":{"i":"Reading exact stream enumeration","path":"crates/spt-daemon/src/nethost.rs","selector":"1780-1840"}},{"type":"toolCall","id":"call_fL7nCM4jHdeWHuMWza3BW9AZ|fc_0365286983a6ba82016a59d5d7d8d48194b47b3744d23ac8cf","name":"read","arguments":{"i":"Reading stream connection cleanup","path":"crates/spt-daemon/src/nethost.rs","selector":"940-990"}},{"type":"toolCall","id":"call_bVpfmkeUHy411FFYxYdwoKLR|fc_0365286983a6ba82016a59d5d7d8d881948c9017f89929724c","name":"read","arguments":{"i":"Reading dispatch completion retirement","path":"crates/spt-daemon/src/dispatch.rs","selector":"475-530"}},{"type":"toolCall","id":"call_7L6Y6QXC8HSEJT7zdim3iVeh|fc_0365286983a6ba82016a59d5d7d8e08194a04fa35cf630d627","name":"read","arguments":{"i":"Reading pump initial carriers","path":"crates/spt-daemon/src/pump/mod.rs","selector":"525-560"}},{"type":"toolCall","id":"call_lpktpf0WIxPUllWQ0HJ6TdF1|fc_0365286983a6ba82016a59d5d7d8e48194924bc668028dc303","name":"read","arguments":{"i":"Reading conn handler cleanup exact","path":"crates/spt-daemon/src/broker.rs","selector":"3240-3290"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8684,"output":223,"cacheRead":132608,"cacheWrite":0,"totalTokens":141515,"reasoningTokens":18,"cost":{"input":0.04342,"output":0.00669,"cacheRead":0.066304,"cacheWrite":0,"total":0.116414}},"stopReason":"toolUse","timestamp":1784272326184,"responseId":"resp_0365286983a6ba82016a59d5c6914881949507852c63a66685","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5c8186c8194bd3fba75bf0fc698","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdXXeNX_5YsitKXc1QZwgZhufrEmf0HS7FBuV0jcYvCnOs5JfZQMCxjsSVOr_srGnQIQnKeoN5M6BND0F_4hSH_AIZ7hI9Pkr-snuEBuea_2mPAQBVmCXt0I_Abk5WxeomiT9yYaaorsOu62aziwhxQwQ9ho5i4M_P1mbYmp-ggGtWELWYih45UrxRQarGUL-f9b1oSjRoRFoGpNgiIdhOKUpnkoD48hTtzeZzDOXSZq2pGxiBn-72WgVRGhhNl4WP34rKQqmpXlIiQj2Ji1VRRU5QO-jC7NqMqE-AX51bhsNi9b-73Ll4elKnKpgKn6j08mRuP3D2EOW1avi-muZimBJAE6GmsG3TPpqpSHhg0htfLIpbFVt88MIMalfp7cTUFcXlBKy04TTZxKsKQK9k0SxviWuge8qbXOhRosDe-03ZpXS-xXhb_qAkAye4kl2fXIvXeySvNs2ZB6popATo1oCNYY8_ikhDt4niQqjLlEzWNs2aRwW4joF0AJfdnZgLeO_iEm7Z8z_5w1KffUwQN3QG2iakOFr3rUUNd8NeXfszVtou1FAJ3S64usQJ6iG3MY_1akD7s9cEKpSKgt-GvW60C8ivJs3YYCYxe3OVTLWSzY8D0QWNBCKpLD5j_NqAv69JNZk_ajND-k0iwKqABjcGBCsHhHnC6Pl4MztwjUN7SfTDekSOXMxsyV2UwzXeX_Ia_q4ZzoepDjqxO10gEj5Au9j5VIod5EfVvE04wXZA46UfC7ONeKA49-z-NnL6_dFjY8k-jOkajY4V_CzIAoW5tF89km_F9_hkSKApDKyANiSYEp_ZP59foZhjTGxFOVUrO1deX2Z_g9BTUg1_zdjuj1TnZlc3CxtWpffiQeWgJctU2QgQ8qM0ZcP_N6lKnUKLLHWumga0qA9XGbYndTIY_8OUsWcqppwNfsHVbSsoYl3foseFpnB-6Bt5n0L6X_8iK-6R7NyYZZHtj-CH6mypTrwOfSVz5VD-qEObzkY0OddWrYfdlEoQk5eKfpTd7Q","summary":[{"type":"summary_text","text":"**Verifying stream_infos retrieval**"}]},{"id":"fc_0365286983a6ba82016a59d5d7d8c48194a51f58ff75f3bc25","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading exact stream enumeration\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1780-1840\"}","call_id":"call_qIXCgOykdjglqKCqLMyFTMB4","name":"read"},{"id":"fc_0365286983a6ba82016a59d5d7d8d48194b47b3744d23ac8cf","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream connection cleanup\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"940-990\"}","call_id":"call_fL7nCM4jHdeWHuMWza3BW9AZ","name":"read"},{"id":"fc_0365286983a6ba82016a59d5d7d8d881948c9017f89929724c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatch completion retirement\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"475-530\"}","call_id":"call_bVpfmkeUHy411FFYxYdwoKLR","name":"read"},{"id":"fc_0365286983a6ba82016a59d5d7d8e08194a04fa35cf630d627","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump initial carriers\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"525-560\"}","call_id":"call_7L6Y6QXC8HSEJT7zdim3iVeh","name":"read"},{"id":"fc_0365286983a6ba82016a59d5d7d8e48194924bc668028dc303","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading conn handler cleanup exact\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"3240-3290\"}","call_id":"call_lpktpf0WIxPUllWQ0HJ6TdF1","name":"read"}]},"duration":17735.93369999528,"ttft":1925.08599999547,"contextSnapshot":{"promptTokens":141292,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qIXCgOykdjglqKCqLMyFTMB4|fc_0365286983a6ba82016a59d5d7d8c48194a51f58ff75f3bc25","toolName":"read","startedAt":"2026-07-17T07:12:23.921Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading exact stream enumeration"},"id":"b9f4561b","parentId":"25ab3bc5","timestamp":"2026-07-17T07:12:23.921Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_fL7nCM4jHdeWHuMWza3BW9AZ|fc_0365286983a6ba82016a59d5d7d8d48194b47b3744d23ac8cf","toolName":"read","startedAt":"2026-07-17T07:12:23.921Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream connection cleanup"},"id":"2e64b690","parentId":"b9f4561b","timestamp":"2026-07-17T07:12:23.921Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_bVpfmkeUHy411FFYxYdwoKLR|fc_0365286983a6ba82016a59d5d7d8d881948c9017f89929724c","toolName":"read","startedAt":"2026-07-17T07:12:23.921Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatch completion retirement"},"id":"b3982ab5","parentId":"2e64b690","timestamp":"2026-07-17T07:12:23.921Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_7L6Y6QXC8HSEJT7zdim3iVeh|fc_0365286983a6ba82016a59d5d7d8e08194a04fa35cf630d627","toolName":"read","startedAt":"2026-07-17T07:12:23.921Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump initial carriers"},"id":"5470b8b6","parentId":"b3982ab5","timestamp":"2026-07-17T07:12:23.921Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_lpktpf0WIxPUllWQ0HJ6TdF1|fc_0365286983a6ba82016a59d5d7d8e48194924bc668028dc303","toolName":"read","startedAt":"2026-07-17T07:12:23.921Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading conn handler cleanup exact"},"id":"e2040a9d","parentId":"5470b8b6","timestamp":"2026-07-17T07:12:23.921Z"}
{"type":"message","id":"860f5855","parentId":"e2040a9d","timestamp":"2026-07-17T07:12:23.941Z","message":{"role":"toolResult","toolCallId":"call_bVpfmkeUHy411FFYxYdwoKLR|fc_0365286983a6ba82016a59d5d7d8d881948c9017f89929724c","toolName":"read","content":[{"type":"text","text":"            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…\n                        )\n                    );\n                }\n…\n            });\n\n[Showing lines 474-533 of 1558. Use :534 to continue]"}],"details":{"truncation":{"content":"                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,","truncated":true,"truncatedBy":"lines","totalLines":1085,"totalBytes":3205,"outputLines":60,"outputBytes":3205,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"            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…\n                        )\n                    );\n                }\n…\n            });","startLine":473,"lineNumbers":[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,null,542,543,544,null,575]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":3205,"outputLines":60,"outputBytes":3205,"shownRange":{"start":474,"end":533},"nextOffset":534}}},"isError":false,"timestamp":1784272343940}}
{"type":"message","id":"9e47e01d","parentId":"860f5855","timestamp":"2026-07-17T07:12:23.956Z","message":{"role":"toolResult","toolCallId":"call_7L6Y6QXC8HSEJT7zdim3iVeh|fc_0365286983a6ba82016a59d5d7d8e08194a04fa35cf630d627","toolName":"read","content":[{"type":"text","text":"pub fn run_peer_pump(\n…\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…\n}\n\n[Showing lines 524-563 of 1982. Use :564 to continue]"}],"details":{"truncation":{"content":"    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","truncated":true,"truncatedBy":"lines","totalLines":1459,"totalBytes":2513,"outputLines":40,"outputBytes":2513,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub fn run_peer_pump(\n…\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…\n}","startLine":519,"lineNumbers":[519,null,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,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":1982,"totalBytes":2513,"outputLines":40,"outputBytes":2513,"shownRange":{"start":524,"end":563},"nextOffset":564}}},"isError":false,"timestamp":1784272343956}}
{"type":"message","id":"8abc7a18","parentId":"9e47e01d","timestamp":"2026-07-17T07:12:23.974Z","message":{"role":"toolResult","toolCallId":"call_qIXCgOykdjglqKCqLMyFTMB4|fc_0365286983a6ba82016a59d5d7d8c48194a51f58ff75f3bc25","toolName":"read","content":[{"type":"text","text":"    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n…\n        self.bounded_block_on(async move {\n            let mut send = entry.send.lock().await;\n            if !bytes.is_empty() {\n                send.write_all(&bytes).await?;\n            }\n            if finish {\n                send.finish().await?;\n            }\n            Ok(())\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        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\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                }\n            })\n            .collect()\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    /// call newly retired the row (idempotent; absent row = false).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\n        let Some(entry) = self\n            .shared\n            .streams\n            .lock()\n            .unwrap()\n            .get(&stream_id)\n            .map(Arc::clone)\n…\n        };\n…\n    }\n\n[Showing lines 1779-1843 of 2865. Use :1844 to continue]"}],"details":{"truncation":{"content":"        self.bounded_block_on(async move {\r\n            let mut send = entry.send.lock().await;\r\n            if !bytes.is_empty() {\r\n                send.write_all(&bytes).await?;\r\n            }\r\n            if finish {\r\n                send.finish().await?;\r\n            }\r\n            Ok(())\r\n        })\r\n    }\r\n\r\n    /// A stream's serve lease (ADR-0038 Amendment fix 4) — the cancellation\r\n    /// handle the DAEMON-LIFECYCLE C2 work consumes. `None` = no such stream.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    pub fn stream_lease(&self, stream_id: u64) -> Option<Arc<StreamLease>> {\r\n        let streams = self.shared.streams.lock().unwrap();\r\n        streams\r\n            .get(&stream_id)\r\n            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\r\n    }\r\n\r\n    /// Every held stream's info — the query a re-attaching brain uses to find\r\n    /// streams (including peer-initiated ones that arrived while it was down).\r\n    /// Retired rows are hidden (ADR-0038 A): their exchange is over, and this\r\n    /// enumeration is exactly what a future dispatcher generation would replay.\r\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\r\n        let streams = self.shared.streams.lock().unwrap();\r\n        streams\r\n            .iter()\r\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\r\n            .map(|(id, e)| {\r\n                let log = e.log.lock().unwrap();\r\n                NetStreamInfo {\r\n                    stream_id: *id,\r\n                    conn_id: e.conn_id,\r\n                    remote_id_hex: e.remote_id_hex.clone(),\r\n                    next_seq: log.next_seq,\r\n                    finished: log.finished,\r\n                    initiated_locally: e.initiated_locally,\r\n                    floor_seq: log.floor_seq(),\r\n                }\r\n            })\r\n            .collect()\r\n    }\r\n\r\n    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\r\n    /// serve loop ran to completion — its exchange is over, so no future\r\n    /// dispatcher generation may rediscover and replay it (the control-steal\r\n    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\r\n    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\r\n    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\r\n    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\r\n    /// reply sends when it removed the entry (see the `retired` field note).\r\n    /// Physical teardown stays with the conn-close sweep. Returns whether this\r\n    /// call newly retired the row (idempotent; absent row = false).\r\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\r\n        let Some(entry) = self\r\n            .shared\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .get(&stream_id)\r\n            .map(Arc::clone)\r","truncated":true,"truncatedBy":"lines","totalLines":1087,"totalBytes":2947,"outputLines":65,"outputBytes":2947,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n…\n        self.bounded_block_on(async move {\r\n            let mut send = entry.send.lock().await;\r\n            if !bytes.is_empty() {\r\n                send.write_all(&bytes).await?;\r\n            }\r\n            if finish {\r\n                send.finish().await?;\r\n            }\r\n            Ok(())\r\n        })\r\n    }\r\n\r\n    /// A stream's serve lease (ADR-0038 Amendment fix 4) — the cancellation\r\n    /// handle the DAEMON-LIFECYCLE C2 work consumes. `None` = no such stream.\r\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n    pub fn stream_lease(&self, stream_id: u64) -> Option<Arc<StreamLease>> {\r\n        let streams = self.shared.streams.lock().unwrap();\r\n        streams\r\n            .get(&stream_id)\r\n            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\r\n    }\r\n\r\n    /// Every held stream's info — the query a re-attaching brain uses to find\r\n    /// streams (including peer-initiated ones that arrived while it was down).\r\n    /// Retired rows are hidden (ADR-0038 A): their exchange is over, and this\r\n    /// enumeration is exactly what a future dispatcher generation would replay.\r\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\r\n        let streams = self.shared.streams.lock().unwrap();\r\n        streams\r\n            .iter()\r\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\r\n            .map(|(id, e)| {\r\n                let log = e.log.lock().unwrap();\r\n                NetStreamInfo {\r\n                    stream_id: *id,\r\n                    conn_id: e.conn_id,\r\n                    remote_id_hex: e.remote_id_hex.clone(),\r\n                    next_seq: log.next_seq,\r\n                    finished: log.finished,\r\n                    initiated_locally: e.initiated_locally,\r\n                    floor_seq: log.floor_seq(),\r\n                }\r\n            })\r\n            .collect()\r\n    }\r\n\r\n    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\r\n    /// serve loop ran to completion — its exchange is over, so no future\r\n    /// dispatcher generation may rediscover and replay it (the control-steal\r\n    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\r\n    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\r\n    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\r\n    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\r\n    /// reply sends when it removed the entry (see the `retired` field note).\r\n    /// Physical teardown stays with the conn-close sweep. Returns whether this\r\n    /// call newly retired the row (idempotent; absent row = false).\r\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n    pub fn retire_stream(&self, stream_id: u64) -> bool {\r\n        let Some(entry) = self\r\n            .shared\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .get(&stream_id)\r\n            .map(Arc::clone)\r\n…\n        };\n…\n    }","startLine":1755,"lineNumbers":[1755,null,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,null,1846,null,1856]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":2947,"outputLines":65,"outputBytes":2947,"shownRange":{"start":1779,"end":1843},"nextOffset":1844}}},"isError":false,"timestamp":1784272343974}}
{"type":"message","id":"bb090c4d","parentId":"8abc7a18","timestamp":"2026-07-17T07:12:23.997Z","message":{"role":"toolResult","toolCallId":"call_fL7nCM4jHdeWHuMWza3BW9AZ|fc_0365286983a6ba82016a59d5d7d8d48194b47b3744d23ac8cf","toolName":"read","content":[{"type":"text","text":"    let observed = observed_addr_json(&conn);\n    shared\n        .presence\n        .lock()\n        .unwrap()\n        .append_connected(id, &remote_id_hex, observed);\n\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\n    // close, conn loss, or our own endpoint close), removes the row — conns\n    // finally LEAVE the table — then appends the `disconnected` event (row\n    // gone before the event is observable).\n    // [impl->REQ-EP-4]\n    let sh_close = Arc::clone(shared);\n    let conn_close = conn.clone();\n    let hex_close = remote_id_hex.clone();\n    tokio::spawn(async move {\n        conn_close.closed().await;\n        sh_close.conns.lock().unwrap().remove(&id);\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\n        // — nothing can ever be served on them again, and leaving them makes\n        // every future dispatcher generation replay them (the control-steal\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\n        // else reads a dead conn's stream ring.\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n        sh_close\n            .streams\n            .lock()\n            .unwrap()\n            .retain(|_, e| e.conn_id != id);\n        sh_close\n            .presence\n            .lock()\n            .unwrap()\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\n    });\n\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\n    // visible here on its first write.) Ends when the connection does.\n    let sh = Arc::clone(shared);\n    let hex = remote_id_hex.clone();\n    tokio::spawn(async move {\n        while let Ok((send, recv)) = conn.accept_bi().await {\n            register_stream(\n                &sh,\n                id,\n                &hex,\n                SendHalf::Quic(send),\n                RecvHalf::Quic(recv),\n                false,\n            );\n        }\n    });\n\n    (id, remote_id_hex)\n\n[Showing lines 939-993 of 2865. Use :994 to continue]"}],"details":{"truncation":{"content":"    let observed = observed_addr_json(&conn);\r\n    shared\r\n        .presence\r\n        .lock()\r\n        .unwrap()\r\n        .append_connected(id, &remote_id_hex, observed);\r\n\r\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\r\n    // close, conn loss, or our own endpoint close), removes the row — conns\r\n    // finally LEAVE the table — then appends the `disconnected` event (row\r\n    // gone before the event is observable).\r\n    // [impl->REQ-EP-4]\r\n    let sh_close = Arc::clone(shared);\r\n    let conn_close = conn.clone();\r\n    let hex_close = remote_id_hex.clone();\r\n    tokio::spawn(async move {\r\n        conn_close.closed().await;\r\n        sh_close.conns.lock().unwrap().remove(&id);\r\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\r\n        // — nothing can ever be served on them again, and leaving them makes\r\n        // every future dispatcher generation replay them (the control-steal\r\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\r\n        // else reads a dead conn's stream ring.\r\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n        sh_close\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .retain(|_, e| e.conn_id != id);\r\n        sh_close\r\n            .presence\r\n            .lock()\r\n            .unwrap()\r\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\r\n    });\r\n\r\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\r\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\r\n    // visible here on its first write.) Ends when the connection does.\r\n    let sh = Arc::clone(shared);\r\n    let hex = remote_id_hex.clone();\r\n    tokio::spawn(async move {\r\n        while let Ok((send, recv)) = conn.accept_bi().await {\r\n            register_stream(\r\n                &sh,\r\n                id,\r\n                &hex,\r\n                SendHalf::Quic(send),\r\n                RecvHalf::Quic(recv),\r\n                false,\r\n            );\r\n        }\r\n    });\r\n\r\n    (id, remote_id_hex)\r","truncated":true,"truncatedBy":"lines","totalLines":1927,"totalBytes":2089,"outputLines":55,"outputBytes":2089,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    let observed = observed_addr_json(&conn);\r\n    shared\r\n        .presence\r\n        .lock()\r\n        .unwrap()\r\n        .append_connected(id, &remote_id_hex, observed);\r\n\r\n    // Closed-watcher: the row's exit path. Awaits the connection's end (clean\r\n    // close, conn loss, or our own endpoint close), removes the row — conns\r\n    // finally LEAVE the table — then appends the `disconnected` event (row\r\n    // gone before the event is observable).\r\n    // [impl->REQ-EP-4]\r\n    let sh_close = Arc::clone(shared);\r\n    let conn_close = conn.clone();\r\n    let hex_close = remote_id_hex.clone();\r\n    tokio::spawn(async move {\r\n        conn_close.closed().await;\r\n        sh_close.conns.lock().unwrap().remove(&id);\r\n        // Retirement (ADR-0038 A): a dead conn's stream rows are transport-dead\r\n        // — nothing can ever be served on them again, and leaving them makes\r\n        // every future dispatcher generation replay them (the control-steal\r\n        // hazard, KNOWN-HAZARDS 7.41). Presence keeps its own log; nothing\r\n        // else reads a dead conn's stream ring.\r\n        // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n        sh_close\r\n            .streams\r\n            .lock()\r\n            .unwrap()\r\n            .retain(|_, e| e.conn_id != id);\r\n        sh_close\r\n            .presence\r\n            .lock()\r\n            .unwrap()\r\n            .append(PRESENCE_DISCONNECTED, id, &hex_close);\r\n    });\r\n\r\n    // Inbound-stream acceptor: every peer-opened bidi stream joins the table\r\n    // and gets a read pump. (QUIC streams are lazy — the peer's open becomes\r\n    // visible here on its first write.) Ends when the connection does.\r\n    let sh = Arc::clone(shared);\r\n    let hex = remote_id_hex.clone();\r\n    tokio::spawn(async move {\r\n        while let Ok((send, recv)) = conn.accept_bi().await {\r\n            register_stream(\r\n                &sh,\r\n                id,\r\n                &hex,\r\n                SendHalf::Quic(send),\r\n                RecvHalf::Quic(recv),\r\n                false,\r\n            );\r\n        }\r\n    });\r\n\r\n    (id, remote_id_hex)\r","startLine":939,"lineNumbers":[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]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":2089,"outputLines":55,"outputBytes":2089,"shownRange":{"start":939,"end":993},"nextOffset":994}}},"isError":false,"timestamp":1784272343997}}
{"type":"message","id":"5af3343c","parentId":"bb090c4d","timestamp":"2026-07-17T07:12:24.034Z","message":{"role":"toolResult","toolCallId":"call_lpktpf0WIxPUllWQ0HJ6TdF1|fc_0365286983a6ba82016a59d5d7d8e48194924bc668028dc303","toolName":"read","content":[{"type":"text","text":"    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n…\n        loop {\n…\n            match env.kind.as_str() {\n…\n                KIND_SESSIONS => {\n…\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH\n\n[Showing lines 3239-3293 of 6298. Use :3294 to continue]"}],"details":{"truncation":{"content":"                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH","truncated":true,"truncatedBy":"lines","totalLines":3060,"totalBytes":2541,"outputLines":55,"outputBytes":2541,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn handle_conn(self: &Arc<Self>, conn: Stream) -> io::Result<()> {\n…\n        loop {\n…\n            match env.kind.as_str() {\n…\n                KIND_SESSIONS => {\n…\n                }\n                KIND_ENDPOINT_INPUT => {\n                    if let Err(msg) = self.dispatch_endpoint_input(env, &send) {\n                        send_error(&send, &msg);\n                    }\n                }\n                KIND_NET_STREAM_SUBSCRIBE => match self.dispatch_net_stream_subscribe(env, &send) {\n                    Ok(id) => my_stream_subs.push(id),\n                    Err(msg) => send_error(&send, &msg),\n                },\n                KIND_NET_PRESENCE_SUBSCRIBE => {\n                    match self.dispatch_net_presence_subscribe(env, &send) {\n                        Ok(()) => my_presence_sub = true,\n                        Err(msg) => send_error(&send, &msg),\n                    }\n                }\n                KIND_BRAIN_RESTART => self.dispatch_brain_restart(&send),\n                // An unknown kind is tolerated (forward-compat): report, don't die.\n                other => send_error(&send, &format!(\"unknown command kind {other:?}\")),\n            }\n        }\n\n        // Brain gone: detach as subscriber but leave the sessions running.\n        // Clone the log Arcs out from under the sessions lock FIRST (ADR-0038\n        // Amendment fix 8, KH 7.12 kin): `detach_if` re-stamps info.json\n        // (`viewer_count`/`driven_by`) and emits a lifecycle record — file +\n        // conn I/O that must never run under the shared sessions table lock,\n        // or one slow perch write stalls every spawn/attach/kill dispatch.\n        // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n        let logs: Vec<Arc<Mutex<OutputLog>>> = {\n            let sessions = recover(&self.sessions);\n            my_subs\n                .iter()\n                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n                .collect()\n        };\n        for log in &logs {\n            recover_log(log).detach_if(&send);\n        }\n        // Same for net streams: the streams + their rings persist (D4b).\n        if let Some(host) = self.net.get() {\n            for id in &my_stream_subs {\n                host.detach_stream_sub(*id, &send);\n            }\n            // And presence: the liveness log + its ring persist (D4c).\n            if my_presence_sub {\n                host.detach_presence_sub(&send);\n            }\n        }\n        Ok(())\n    }\n\n    /// Spawn a child under a fresh PTY, register it, auto-subscribe the spawning\n    /// connection, start its output drain and exit waiter, and reply `spawned`.\n    /// Every hosted session gets its **own** drain + exit-waiter threads (KH","startLine":3025,"lineNumbers":[3025,null,3055,null,3061,null,3165,null,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6298,"totalBytes":2541,"outputLines":55,"outputBytes":2541,"shownRange":{"start":3239,"end":3293},"nextOffset":3294}}},"isError":false,"timestamp":1784272344034}}
{"type":"message","id":"167e3163","parentId":"5af3343c","timestamp":"2026-07-17T07:12:29.458Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Refining loop filter range near 460**"},{"type":"toolCall","id":"call_GFkjhzryidknK4WxxTBUxxZZ|fc_0365286983a6ba82016a59d5dc47b081949096cb76e28a050d","name":"read","arguments":{"i":"Reading dispatcher local filter","path":"crates/spt-daemon/src/dispatch.rs","selector":"445-480"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":11090,"output":60,"cacheRead":133632,"cacheWrite":0,"totalTokens":144782,"reasoningTokens":19,"cost":{"input":0.055450000000000006,"output":0.0018,"cacheRead":0.066816,"cacheWrite":0,"total":0.12406600000000001}},"stopReason":"toolUse","timestamp":1784272344054,"responseId":"resp_0365286983a6ba82016a59d5d861bc8194a71167f6c9a65961","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5daf5648194884394b21943b907","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdXcl3qqS4pOAMTOE_vantg08SYOgV6_IKfbJEd-cBJvy79I-P1nhr-5lIxS9CStmhkMdZ3eruGAn1c45Gxe38AFiJBdt2kFflpt6tk3Cqv-Vmu8tXThuzI0_4FfTO5A21OLhkJyOTE1h_Tdx2FeExR9vR_cuo97J2mQr5-AERVj5vGWSxVbhm9TJ7pwJptxFBEtoz3k13JOoIeB7kGTG_VAahnd-xPuo2_qZN9PiuPAYzcHiZfuYC72eFu-ZOOyQmEeLmR0zLZAqUpftZZfuINMuFla0SXUdmjytBAl6h96t7EXtr4rCO0uFqLygzGMRzONsD-NL-xFRXQZdQBdpcy-7nQ9x40cM8hix2kXYC9rg-vBik2kkTF28GBxDPKRYoU_YURUi0znCwEv7qmvLKlzUQCf6HR8-oHiJWqHNxpm80nguJ5VuSGqKv1xbmZ_Z4RTW7EG2OzeG7hq3XtXpawnUS6rj3UAdqfdl2_xwDt0pQJhzk_jzuZqL1c9XG4kmHLLS3fcqu_rXj2K1TTZR02FkQMajglgLYd6aT_FOQ4_-WGbz-4lLqNijxjOj69YA16G0wabWS3jFSQnBu4eCWjPojEm59Vp9wnYHjyxPVAoHUvbkt_8j1_76YdrNcCiETzf-kKpOlrEBm1Lrs24NAPwYEY9JhxIPfp5onOHoZ3jVwB04ID2swZ6RwUHO-6c9guupqHeCf4ivF1dXDwjWakRCA4CVAYA6Q1fP83O6XYpQAHH5Hwp6s_9E5oQXrBllMkF96R4dhFZ2UAvbS0qTZKlkxeVNlh2LGQH7XwMZMLtb4cqgBcVmHzR4sUqhYYP1Vqp7yoW3n8LSpOXsl_dETi1pfTj8IlYqjoZbygVe39Gb1AMr2stIMBJO03SYhUL-B-L9R_dxJl914-5x-9I_Vg-pzjRXhSCAW97_pyU3S2RX0qA0e2kn_1bt0eXynxdtzg2ehDe1z4AT7hO75Za1TLY-io_SLCChVk0ozoZzNJ193xfrVlLxmIrye56GjqvCYTC","summary":[{"type":"summary_text","text":"**Refining loop filter range near 460**"}]},{"id":"fc_0365286983a6ba82016a59d5dc47b081949096cb76e28a050d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatcher local filter\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"445-480\"}","call_id":"call_GFkjhzryidknK4WxxTBUxxZZ","name":"read"}]},"duration":5402.1875,"ttft":2929.8791999965906,"contextSnapshot":{"promptTokens":144722,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GFkjhzryidknK4WxxTBUxxZZ|fc_0365286983a6ba82016a59d5dc47b081949096cb76e28a050d","toolName":"read","startedAt":"2026-07-17T07:12:29.458Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatcher local filter"},"id":"993ca4e2","parentId":"167e3163","timestamp":"2026-07-17T07:12:29.458Z"}
{"type":"message","id":"b3408645","parentId":"993ca4e2","timestamp":"2026-07-17T07:12:29.471Z","message":{"role":"toolResult","toolCallId":"call_GFkjhzryidknK4WxxTBUxxZZ|fc_0365286983a6ba82016a59d5dc47b081949096cb76e28a050d","toolName":"read","content":[{"type":"text","text":"    // 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…\n        }\n…\n    }\n\n[Showing lines 444-483 of 1558. Use :484 to continue]"}],"details":{"truncation":{"content":"    // 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,","truncated":true,"truncatedBy":"lines","totalLines":1115,"totalBytes":2195,"outputLines":40,"outputBytes":2195,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    // 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…\n        }\n…\n    }","startLine":444,"lineNumbers":[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,null,576,null,578]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1558,"totalBytes":2195,"outputLines":40,"outputBytes":2195,"shownRange":{"start":444,"end":483},"nextOffset":484}}},"isError":false,"timestamp":1784272349470}}
{"type":"message","id":"425faf6d","parentId":"b3408645","timestamp":"2026-07-17T07:12:38.293Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Refining subscriber counting logic**\n\n**Implementing regex for unique stream IDs**"},{"type":"toolCall","id":"call_vMHiQv8QHb89Ijxol0WcJHs8|fc_0365286983a6ba82016a59d5e51bc481948f620a16330752ea","name":"read","arguments":{"i":"Reading subscriber seat fields","path":"crates/spt-daemon/src/nethost.rs","selector":"110-168"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":7588,"output":234,"cacheRead":137728,"cacheWrite":0,"totalTokens":145550,"reasoningTokens":192,"cost":{"input":0.03794,"output":0.00702,"cacheRead":0.068864,"cacheWrite":0,"total":0.113824}},"stopReason":"toolUse","timestamp":1784272349662,"responseId":"resp_0365286983a6ba82016a59d5dde2dc8194a7bd004823c990df","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5df68088194ae0f5a41cbc36bb3","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdXlgNBG6XLHpdgVBcl42xNeVW1uEXv-EU8j1w0WeMR_NrJuTIfZfJegszhfNy7PDPglNfAYZKKyb68PT1lPCK1YVpk_EkrBxFIH7slxhAvNFK-uLcfF5SWrdo1qHKZ26MxH_DtY0ocl8lXbv37VPFGB_qQQqalMOmuDShFr8HsVGsLnioG8nw7KtyaVU8WmmFr7EAfgPI7KeVGAuanem5AT9wFasimg7ayxk-ClD0Ce0PymkVjnH9-7yst3GH511wY0ArxogyTPjsssNlLoWFFIOgHOT5sbOMQ6jKTZUi7DWd0qmRB5UZLR7XnNPN34J6N3wgbpG52YVLa7MamFhLaOiVtVfPaIXLNRwkaCqErGrBUhvh_MXDaJES6TXzPT6yhHdRmrMR4pKhOHiJliq3ID6pzX-RMQUM409aqOzRsoSm_CQ4VFjVVDlfUKon0Bpvb8bnLTAukZ_pkf5YGDL0ZrQxPdbqfVs3CDmfe5A9eXxg5CigQGRsvnnJhk-g0Vdc1qN57jl-NvD4PUzbyaKlAuy18sN4-xcccLGn9c36UQb-T-OWFSAtCCqZ3s0YDIjzuRcmhizGfjEAaJNZO2xKc657_ax1tvhfcu1K5FeWAO4zG5x--Z1KnmO3lJ-HJfeVwv2fK80OScVd5nYQkSWX16WF0SZ31nlElD9aFOIvRhoaRZO4WBOFsQhUxIE6hmFBgAUGlJixRTZLKP2WuY7HadHoVi-grZDqzbr5KIZPO5IRWp7VHvufkE9Gfw6p-2t834T_vqY0PVrUqwGH_aGweZJtEfuNYJIf1QheUTceRYkGLoiGtO0yn8qt7YYoOyQbvsiUtuXKo5dLzPZFi0rdVutfvVndXD13hQzTOeVKhqhjexv61S6pg5zecc0neXU6XN0vIWNrjyCD7zSht5S3qTN6OEM1jX_oCCTMKG-DFRAD2Ccn12VccUqN0yEoqj_l5bsQjy7EpFUgfdxs6ywDJusByrpkbtxAfZ_Pb9K2mkJW954t2IvdFF8sn-fS_zU3CLmk7JYCn3633WCuTm8ePSk4-1Whs1prRnY93j3cREYNb2_eHOj74eFurgGGgOr40_zeM4ZH2Xg2v83Uk4t55DjiQT8qeyOBhyUJf6Donn_Vz-Na9YH1R2ejr0KvwfihysOw-uTf_9Ul7hczsR9H9KZV69Z_rja8mn4OdocN5cB1OEyLztA4ue_q4l0R6Ol7b0UDCA8Ah_Lz_Yxs7SpBJa7u2xSW8ezq6t0iOE-0czKOdDUTH0rxLAQvCIN5heoPLBdEoLHFQHgnKpiRDwKmjGUHxrSRIt2gpkrSPWk3gnJUgknwWeps3A32hJIHs8vA4G7gceiRz65UUCchQgPf-oa7OsaxLwDlxchHQMePcXJ-IFDjiVehztdVu98VvyXZmxF-wWkiEhjbMdfAZfd16L65uFK7ck2HoaBsdpzXW-2IcpuOWONoZk_ftkolczEXTch4hU00XXoE1SqOX2mjPLahP9XeIC4uFGZr_BX137OIToPNUaT1CyhUfxQNsFlMGM6rwCY8eQ2lCpeAkPDBXowT62LuusvF0fhbDJlFcogY9Ma1VYA3sUX1i69IjFLi1mTZb21eQDYrYcESV4u_sl3dH-ycK9Uiw-lH4uTD9Y_WlQspQ30ZY1-pmcTUte8Ku5mqYbUPTEqLqblNYYVyyK9rgiXoWiUfcNRPjXelhzQ6l6-MtWEK_RWsFzJFlxgjt5JkRF4F1B7AMsBFa6rW0F7dZoi0UaCHTWNgbV4o1xApnznOhEOMFcXOWzDaLSfeR1taDIVER4dP51Yb2FENfZNcaTvf1xURdAi9sW9uIQ0yWLg6MffL9f_u9XvTOLtXWhuNvTTn8FMVErBDC7cSEoyKyoxTROUqds0b7Eu1yZfsdSJVuiQvAii_TmqVQbTezU8sS74JWMvlQaB0CvR5NmzGPDTNVkdL6y31y2TAxwV1iDb38kXTR7YEPEcm9m2FzxuJikDDyZflnvGiBXx2111CcUMdrNLTcwrBh_yjfvi3rNy0P-7cQ6-gmTPRFI8OiF","summary":[{"type":"summary_text","text":"**Refining subscriber counting logic**"},{"type":"summary_text","text":"**Implementing regex for unique stream IDs**"}]},{"id":"fc_0365286983a6ba82016a59d5e51bc481948f620a16330752ea","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading subscriber seat fields\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"110-168\"}","call_id":"call_vMHiQv8QHb89Ijxol0WcJHs8","name":"read"}]},"duration":8631.16210000217,"ttft":1755.867300003767,"contextSnapshot":{"promptTokens":145316,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_vMHiQv8QHb89Ijxol0WcJHs8|fc_0365286983a6ba82016a59d5e51bc481948f620a16330752ea","toolName":"read","startedAt":"2026-07-17T07:12:38.293Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading subscriber seat fields"},"id":"e2ea376f","parentId":"425faf6d","timestamp":"2026-07-17T07:12:38.293Z"}
{"type":"message","id":"1c8a6c36","parentId":"e2ea376f","timestamp":"2026-07-17T07:12:38.314Z","message":{"role":"toolResult","toolCallId":"call_vMHiQv8QHb89Ijxol0WcJHs8|fc_0365286983a6ba82016a59d5e51bc481948f620a16330752ea","toolName":"read","content":[{"type":"text","text":"/// the PTY `OutputLog`: large enough that a brain-restart window never evicts\n/// unreplayed chunks in practice; bounded so an unsubscribed stream can't\n/// buffer without limit.\nconst DEFAULT_STREAM_RING_CHUNKS: usize = 4096;\n\n/// Max bytes pulled per stream read (one ring chunk).\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\n\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\n/// no newline is not speaking an NDJSON protocol — capture gives up\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\nconst OPENER_PIN_MAX: usize = 64 * 1024;\n\n/// How many frames a subscriber's writer queue holds before the subscriber is\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\n/// is a subscriber problem, never a producer stall — the detached brain\n/// resumes from its cursor (the existing gapless-resume contract).\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\n\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\n/// either, but only a POISON (real write failure on the conn) cancels the\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum SeatFail {\n    /// The writer thread died on a failed conn write (the 15s bounded-write\n    /// poison class) — halt-at-first-failure already happened writer-side.\n    Poisoned,\n    /// The bounded queue is full — the subscriber cannot keep up.\n    Overflow,\n}\n\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\n///\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\n/// sender — the writer drains what it holds and exits.\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\nstruct SubscriberSeat {\n    sub: SharedSend,\n    tx: std::sync::mpsc::SyncSender<Envelope>,\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\n    /// and a replacement may install (the no-reinstall-until-gone rule,\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\n    done: Arc<std::sync::atomic::AtomicBool>,\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\n}\n\nimpl SubscriberSeat {\n    /// Install a seat: spawn its writer thread and hand back the handle.\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\n    /// touching the live queue, so replay-then-live seq order holds by\n    /// construction even while producers enqueue concurrently. (Gate follow-\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\n…\n}\n\n[Showing lines 109-171 of 2865. Use :172 to continue]"}],"details":{"truncation":{"content":"/// the PTY `OutputLog`: large enough that a brain-restart window never evicts\r\n/// unreplayed chunks in practice; bounded so an unsubscribed stream can't\r\n/// buffer without limit.\r\nconst DEFAULT_STREAM_RING_CHUNKS: usize = 4096;\r\n\r\n/// Max bytes pulled per stream read (one ring chunk).\r\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\r\n\r\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\r\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\r\n/// no newline is not speaking an NDJSON protocol — capture gives up\r\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\r\nconst OPENER_PIN_MAX: usize = 64 * 1024;\r\n\r\n/// How many frames a subscriber's writer queue holds before the subscriber is\r\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\r\n/// is a subscriber problem, never a producer stall — the detached brain\r\n/// resumes from its cursor (the existing gapless-resume contract).\r\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\r\n\r\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\r\n/// either, but only a POISON (real write failure on the conn) cancels the\r\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum SeatFail {\r\n    /// The writer thread died on a failed conn write (the 15s bounded-write\r\n    /// poison class) — halt-at-first-failure already happened writer-side.\r\n    Poisoned,\r\n    /// The bounded queue is full — the subscriber cannot keep up.\r\n    Overflow,\r\n}\r\n\r\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\r\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\r\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\r\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\r\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\r\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\r\n///\r\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\r\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\r\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\r\n/// sender — the writer drains what it holds and exits.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\nstruct SubscriberSeat {\r\n    sub: SharedSend,\r\n    tx: std::sync::mpsc::SyncSender<Envelope>,\r\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\r\n    /// and a replacement may install (the no-reinstall-until-gone rule,\r\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\r\n    done: Arc<std::sync::atomic::AtomicBool>,\r\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\r\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\r\n}\r\n\r\nimpl SubscriberSeat {\r\n    /// Install a seat: spawn its writer thread and hand back the handle.\r\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\r\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\r\n    /// touching the live queue, so replay-then-live seq order holds by\r\n    /// construction even while producers enqueue concurrently. (Gate follow-\r\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\r","truncated":true,"truncatedBy":"lines","totalLines":2757,"totalBytes":3401,"outputLines":63,"outputBytes":3401,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// the PTY `OutputLog`: large enough that a brain-restart window never evicts\r\n/// unreplayed chunks in practice; bounded so an unsubscribed stream can't\r\n/// buffer without limit.\r\nconst DEFAULT_STREAM_RING_CHUNKS: usize = 4096;\r\n\r\n/// Max bytes pulled per stream read (one ring chunk).\r\nconst STREAM_READ_CHUNK: usize = 64 * 1024;\r\n\r\n/// Max bytes buffered while hunting the opener's first newline (ADR-0038 B).\r\n/// A protocol opener is one small NDJSON line; a stream whose first 64KiB has\r\n/// no newline is not speaking an NDJSON protocol — capture gives up\r\n/// (`Oversize`) and classification treats it as unclassifiable, bounded.\r\nconst OPENER_PIN_MAX: usize = 64 * 1024;\r\n\r\n/// How many frames a subscriber's writer queue holds before the subscriber is\r\n/// judged hopelessly behind and DETACHED (ADR-0038 Amendment fix 3): overflow\r\n/// is a subscriber problem, never a producer stall — the detached brain\r\n/// resumes from its cursor (the existing gapless-resume contract).\r\nconst SUBSCRIBER_QUEUE_CAP: usize = 1024;\r\n\r\n/// Why a subscriber seat rejected a frame — the caller removes the seat on\r\n/// either, but only a POISON (real write failure on the conn) cancels the\r\n/// stream's lease; an overflow is a slow-but-healthy brain being detached.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum SeatFail {\r\n    /// The writer thread died on a failed conn write (the 15s bounded-write\r\n    /// poison class) — halt-at-first-failure already happened writer-side.\r\n    Poisoned,\r\n    /// The bounded queue is full — the subscriber cannot keep up.\r\n    Overflow,\r\n}\r\n\r\n/// One installed subscriber behind a bounded writer queue (ADR-0038 Amendment\r\n/// fixes 2+3, REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE): frames ENQUEUE under the\r\n/// log mutex; the conn I/O — the deadline-bounded `SharedSend::write` that can\r\n/// take 15s against a wedged conn — runs on this seat's OWN writer thread,\r\n/// OUTSIDE every lock. The field stall was exactly the old shape's serial\r\n/// replay-under-mutex against a poisoned conn (33 windows, all ~15s).\r\n///\r\n/// Writer discipline: the thread HALTS at the FIRST failed write (no\r\n/// discarded-errors iteration) and marks the seat poisoned; the next enqueue\r\n/// sees it and the caller removes the seat. Dropping the seat drops the queue\r\n/// sender — the writer drains what it holds and exits.\r\n// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\r\nstruct SubscriberSeat {\r\n    sub: SharedSend,\r\n    tx: std::sync::mpsc::SyncSender<Envelope>,\r\n    /// Writer thread exited (failure or clean drain) — the seat is fully gone\r\n    /// and a replacement may install (the no-reinstall-until-gone rule,\r\n    /// REQ-DISPATCH-FALLBACK-CIRCUIT).\r\n    done: Arc<std::sync::atomic::AtomicBool>,\r\n    /// The writer died on a WRITE FAILURE (poison), not a clean close.\r\n    poisoned: Arc<std::sync::atomic::AtomicBool>,\r\n}\r\n\r\nimpl SubscriberSeat {\r\n    /// Install a seat: spawn its writer thread and hand back the handle.\r\n    /// `replay` is the attach snapshot, moved in UNDER the log mutex (a\r\n    /// memory move, never conn I/O): the writer drains it COMPLETELY before\r\n    /// touching the live queue, so replay-then-live seq order holds by\r\n    /// construction even while producers enqueue concurrently. (Gate follow-\r\n    /// up: the first fix-3 shape enqueued the replay from the caller OUTSIDE\r\n…\n}","startLine":109,"lineNumbers":[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,null,252]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2865,"totalBytes":3401,"outputLines":63,"outputBytes":3401,"shownRange":{"start":109,"end":171},"nextOffset":172}}},"isError":false,"timestamp":1784272358313}}
{"type":"message","id":"65c852d6","parentId":"1c8a6c36","timestamp":"2026-07-17T07:12:45.823Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Inspecting Brain read_event EOF handling**"},{"type":"toolCall","id":"call_Hh3lULu6q56cPZdjvjT1jMgm|fc_0365286983a6ba82016a59d5ebd55081949abc059ec1967450","name":"grep","arguments":{"i":"Checking cursor removal at EOF","pattern":"net_cursors\\.remove|NetStreamEof","path":"crates/spt-daemon/src/brain.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8664,"output":119,"cacheRead":137728,"cacheWrite":0,"totalTokens":146511,"reasoningTokens":52,"cost":{"input":0.043320000000000004,"output":0.0035700000000000003,"cacheRead":0.068864,"cacheWrite":0,"total":0.115754}},"stopReason":"toolUse","timestamp":1784272358353,"responseId":"resp_0365286983a6ba82016a59d5e6bdd8819496835bca66ca48cd","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5ea13d88194b0e81b8d62b004b1","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdXrGUPZ50FPQvMGnf3Sq25YrFft--2yG7y7HVwLHgQ8VCCurZf4b3meqArLvV18O-hRycpKHZ0ox2I7INzFzWvZ44Dfcw66OCxlyos7xZ49zZAZK7Ge5zOvoQMJDpsk26ZnFJWeVBy0-HT2yr6Lp-21kWh1b75KPX_9OV7EN2pAvMJfFY1Gz1eDTGvdyX6bTQqUYArJxp_41vjN0JaaIvJlXy2GcfC6dqhMs_84OdolO84DTbcD33qwZqECeo2Nn_uXFnkDjKUK91mFFRW6vl4mUilzD900FBxtQIBpNB6g0kP-oJ0eP2Cad1z-pXCEVX7aF4RQXHMwooZ92nW3C976OtTCDQvxWiADhlEBSUK8p_cPeoaG7Q59BethDvDgLZq2AykCHZNlmtJA1cBOwxSv9yaK2xFJtAF96hRQbXvRn-nilI-39lyVcQBuGMsUGq1HsV-pj8hC5rQw8jDX0f8lTlDY8OdXVcvn-rqE2oxAOPRymVgHxFE0g-P-J0KwZRi61Q3Bac1lTwSDuTYMom38XQRX2HIcj8aDfGTAzFZYXnMOthDeyqlxpLc-pgsueyxoQ-caVlAx7tRZA6KCUq2R-Hzc8wiImUsUKTf-qU_lPvY0J0Bt49vII0IdFkC35VoI8OMTFE9thDfco-hOYun31AYmhOac7Xz6kChbHH1oDTfkZZ3YScO2DHKU52Vkh72sA3LgRtUyyFYfGONUgT8lHn1hIHVXoStDzvyeLUlPaadHBgDSoLME4Dwjaqb9ZwVnZocAvg6znQHLVkcJsYt_OKpbnCp8-1NERPzASiZupjflhJAQGXaedzI6tFrOX6RY0zmd88rXrorQcZPTexC1IrVvIClV5Hy46yAolUx9EFjwpAbFQoRYy8I-1BYclgIx121ltAgVzlVn1bRKD02m-0eRBRclWvfk7x9h1c5a86wtx8twEAXkAH_fA5RkmsLdNFJHuXYgjh5-N33jGR1EzC-L3RvoEyor_Zp6eJkpSA-d1HTY5-7u2G9spSizYOCqO27FyuKw8W8uybVq4clpnj9yYWyHmiY-Z1aofKwapQw5cWvYxKWuww30RBs5f1F2LkZisbUig78FloBtLt5dOOF5Z5BGYklzs7slg6W5W0mD0uHxHHcHlQbO7ZER3xh4ejD1GCH3Jl3yayd1BtLSixcp482_pWLzAE7iTTknOCkPojPxDzE9E1HJMfxmYhOT65WgMNFamG0BSOLQm-bC2A==","summary":[{"type":"summary_text","text":"**Inspecting Brain read_event EOF handling**"}]},{"id":"fc_0365286983a6ba82016a59d5ebd55081949abc059ec1967450","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking cursor removal at EOF\",\"pattern\":\"net_cursors\\\\.remove|NetStreamEof\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_Hh3lULu6q56cPZdjvjT1jMgm","name":"grep"}]},"duration":7467.549199998379,"ttft":3736.210299998522,"contextSnapshot":{"promptTokens":146392,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Hh3lULu6q56cPZdjvjT1jMgm|fc_0365286983a6ba82016a59d5ebd55081949abc059ec1967450","toolName":"grep","startedAt":"2026-07-17T07:12:45.823Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Checking cursor removal at EOF"},"id":"74cd8626","parentId":"65c852d6","timestamp":"2026-07-17T07:12:45.823Z"}
{"type":"message","id":"f62f0399","parentId":"74cd8626","timestamp":"2026-07-17T07:12:45.829Z","message":{"role":"toolResult","toolCallId":"call_Hh3lULu6q56cPZdjvjT1jMgm|fc_0365286983a6ba82016a59d5ebd55081949abc059ec1967450","toolName":"grep","content":[{"type":"text","text":" 41|    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n*42|    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n 43|    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n 44|    SessionsReply, SizeEvent, SpawnReq, Spawned, SubscribeOutcome, SubscribeReq, SubscribedReply,\n 45|    ViewerEvictedEvent,\n...\n 167|    /// check (the subscriber's cursor must equal it to have missed nothing).\n*168|    NetStreamEof { stream_id: u64, next_seq: u64 },\n 169|    /// A contiguous conn-liveness event (the presence cursor has advanced past\n 170|    /// it) — connected/disconnected on the broker's conn table (D4c).\n 171|    NetPresence(NetPresenceEvent),\n...\n 836|                KIND_NET_STREAM_EOF => {\n*837|                    let ev: NetStreamEof = serde_json::from_value(env.payload)\n 838|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n*839|                    return Ok(BrokerEvent::NetStreamEof {\n 840|                        stream_id: ev.stream_id,\n 841|                        next_seq: ev.next_seq,\n 842|                    });"}],"details":{"scopePath":"crates/spt-daemon/src/brain.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":4,"fileCount":1,"files":["crates/spt-daemon/src/brain.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brain.rs","count":4}],"truncated":false,"displayContent":"  41│    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n *42│    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n  43│    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n  44│    SessionsReply, SizeEvent, SpawnReq, Spawned, SubscribeOutcome, SubscribeReq, SubscribedReply,\n  45│    ViewerEvictedEvent,\n    │...\n 167│    /// check (the subscriber's cursor must equal it to have missed nothing).\n*168│    NetStreamEof { stream_id: u64, next_seq: u64 },\n 169│    /// A contiguous conn-liveness event (the presence cursor has advanced past\n 170│    /// it) — connected/disconnected on the broker's conn table (D4c).\n 171│    NetPresence(NetPresenceEvent),\n    │...\n 836│                KIND_NET_STREAM_EOF => {\n*837│                    let ev: NetStreamEof = serde_json::from_value(env.payload)\n 838│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n*839│                    return Ok(BrokerEvent::NetStreamEof {\n 840│                        stream_id: ev.stream_id,\n 841│                        next_seq: ev.next_seq,\n 842│                    });"},"isError":false,"timestamp":1784272365828}}
{"type":"message","id":"26febf95","parentId":"f62f0399","timestamp":"2026-07-17T07:15:50.011Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Assessing v0.36 data flow discrepancies**\n\n**Formulating detailed analysis summary structure**"},{"type":"thinking","thinking":"**Identifying long-lived broker threads**\n\n**Calculating thread lifetime estimates per session**\n\n**Identifying missing thread cancellation points**"},{"type":"thinking","thinking":"**Tracing CPU usage by thread**\n\n**Assessing thread leak patterns and safe probing**\n\n**Identifying subscriber exit timing issue**"},{"type":"thinking","thinking":"**Designing safe stream unsubscription fix**\n\n**Proposing stream attach and cleanup protocols**"},{"type":"toolCall","id":"call_dFynY6XNQ5IKKpWHsma0zMNq|fc_0365286983a6ba82016a59d625a3d48194b4681210e023ceee","name":"yield","arguments":{"type":null,"result":{"data":{"summary":"## Conclusion\n\nThe broker's ~532–541 threads are **not legitimate session scaling for 4–6 hosted PTYs**. The dominant mechanism is an unbounded, broker-resident **one-native-thread-per-net-stream-subscriber** lifetime leak. A long-lived peer-pump IPC connection repeatedly subscribes to completed response streams; each subscription creates a `SubscriberSeat` writer thread, but stream EOF only queues an EOF envelope and leaves the seat/channel open. Those threads remain blocked in `rx.recv()` until the entire pump IPC connection closes. The same completed stream rows remain in `NetHost.streams` until their long-lived QUIC connection closes, and the dispatcher asks the broker to enumerate/serialize that growing table every 100 ms. This cleanly separates the observations:\n\n- **Thread count:** hundreds of mostly parked `SubscriberSeat` writers; only a few CPU-active threads is expected for this leak.\n- **Broker CPU and writes:** the active broker connection handler repeatedly executes `dispatch_net_streams` → `stream_infos` → JSON/frame write over an ever-growing stream table.\n- **Brain reads:** the corresponding brain dispatcher repeatedly receives those oversized `NET_STREAMS_REPLY` frames. Brain-internal routing is outside this assignment, but it is the consumer that makes the broker path hot.\n\n### Ranked mechanisms\n\n#### 1. Primary — permanent per-stream `SubscriberSeat` writer threads on a long-lived pump carrier\n\n**Creation and blocking semantics**\n\n- `crates/spt-daemon/src/nethost.rs:142-163` defines `SubscriberSeat`. It stores `sub`, `tx`, `done`, and `poisoned`, but **does not store a `JoinHandle` or cancellation token**.\n- `crates/spt-daemon/src/nethost.rs:174-224` (`SubscriberSeat::install`) creates a bounded channel and calls `std::thread::spawn` at line 196. After replay, the native thread executes `while let Ok(frame) = rx.recv()` at lines 211-217. With no new data and a live sender, it parks indefinitely.\n- `crates/spt-daemon/src/nethost.rs:518-559` (`StreamLog::begin_attach`) installs exactly one such seat per current stream subscriber. Replacing a seat sets the prior `subscriber` to `None`, which drops its sender and lets the old thread drain/exit; unique streams do not get this replacement.\n\n**Why stream EOF does not end the writer**\n\n- `crates/spt-daemon/src/nethost.rs:476-488` (`StreamLog::finish`) marks `finished = true` and enqueues `NetStreamEof`, but deliberately leaves `self.subscriber` populated. After writing the queued EOF, its writer returns to `rx.recv()` forever.\n- `crates/spt-daemon/src/nethost.rs:443-461` removes a seat only after a producer detects `Poisoned` or queue `Overflow`. A successfully completed, traffic-quiet stream produces neither condition.\n- The 15-second write bound is irrelevant to these permanent seats: it only bounds a write that fails or wedges. Once the EOF write succeeds, there is no subsequent write to time out.\n- `crates/spt-daemon/src/nethost.rs:1825-1860` explicitly defines `retire_stream` as visibility retirement, **not teardown**: the entry, send half, subscriber, and pump remain alive. It only sets `retired` and clears the ring.\n- `crates/spt-daemon/src/nethost.rs:1969-1991` has a detach operation, but it is only invoked by broker-IPC connection cleanup.\n- `crates/spt-daemon/src/broker.rs:3037-3062` accumulates every successful subscription in `my_stream_subs: Vec<u64>`; `crates/spt-daemon/src/broker.rs:3239-3286` detaches those seats only after the physical brain IPC read loop reaches EOF. There is no `KIND_NET_STREAM_UNSUBSCRIBE` / per-stream unsubscribe command.\n- `crates/spt-daemon/src/brain.rs:1584-1602` adds every subscription to `Brain.net_cursors`, with no EOF removal path. A search for `net_cursors.remove`, `net_stream_unsubscribe`, or `NET_STREAM_UNSUBSCRIBE` found none.\n\n**Why one connection owns hundreds of subscriptions**\n\n- `crates/spt-daemon/src/pump/mod.rs:524-553` creates two long-lived pump-mode `Brain` connections: one reused for all peer operations and another for presence.\n- The main `brain` is retained across the entire `run_peer_pump` loop (`crates/spt-daemon/src/pump/mod.rs:564-758`). Pull-style worker operations open and subscribe response streams through this same carrier. Fire-and-forget `push_feed` streams are also opened repeatedly at `crates/spt-daemon/src/pump/mod.rs:1117-1123`, although those do not themselves install subscriber threads.\n- The daemon log identifies the carrier. `C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log:404-407` shows the dispatcher/pump generation creating two `pump-ipc-reader`s plus the presence carrier. At line 500, broker connection 137 subscribes stream 50 at monotonic 72,862 ms. Lines 516-520 immediately show the same physical conn 137 accumulating streams 53, 56, 57, 60, and 61. Much later, lines 20230-20290, 21801-21840, and 23724-23728 show the same conn 137 continuing to accumulate new unique subscriptions, through streams 4564–4568 at monotonic ~4,646,279 ms. No `conn=137 ... event=transport-close` was found in the searched live-log range. Conversely, line 377 shows an older pump carrier, conn 12, closing with eight accumulated stream-subscriber labels; that physical close is the event that finally releases its seats.\n\n**Scale**\n\nLet $S$ be unique completed streams still subscribed by the live pump carrier. This mechanism contributes approximately $S$ native threads. The observed log pattern supports hundreds of unique streams on conn 137. [INFERENCE] A value near $S\\approx500$, plus normal session and fixed broker threads, explains the measured 532–541 total extremely closely.\n\nThis count is “expected under the current implementation,” but it is not legitimate bounded behavior. It scales with **completed stream history during the pump connection lifetime**, not with active sessions, active streams, or live peers.\n\n#### 2. Primary CPU/I/O amplifier — full stream-table serialization at 10 Hz\n\nThis is the active counterpart to the parked-thread leak.\n\n- `crates/spt-daemon/src/dispatch.rs:87` sets `DEFAULT_DISPATCH_POLL = 100 ms`.\n- `crates/spt-daemon/src/dispatch.rs:429-471` retains one dispatcher `Brain` and calls `brain.net_streams()` each loop. Only **after receiving the complete reply** does it skip locally initiated rows at lines 464-466.\n- `crates/spt-daemon/src/broker.rs:4365-4377` handles every request by constructing `NetStreamsReply { streams: host.stream_infos() }`, JSON-serializing it, and writing the frame.\n- `crates/spt-daemon/src/nethost.rs:1794-1824` locks the entire stream map, iterates every entry, locks every non-retired entry log, clones `remote_id_hex`, builds a `Vec<NetStreamInfo>`, and includes locally initiated rows. The receiver's later `initiated_locally` filter does not save broker enumeration, allocation, serialization, or IPC traffic.\n- `crates/spt-daemon/src/nethost.rs:954-967` removes stream rows only when the **physical QUIC connection** closes. A clean per-stream finish does not remove its row. A live peer connection therefore accumulates completed local pump streams indefinitely.\n- Dispatcher retirement at `crates/spt-daemon/src/dispatch.rs:506-514` applies only after a dispatcher worker serves a peer-initiated row. Locally initiated pump rows are skipped before worker creation, so this path does not retire them.\n- Even retired inbound rows remain in the backing map and are scanned by the `retired` filter; retirement only keeps them out of the serialized result.\n\n[INFERENCE] Thousands of retained `NetStreamInfo` records serialized about ten times per second are the strongest broker-side explanation for the measured small number of CPU-active threads and 3.74 MiB/s broker writes. The parked seat threads themselves do not continuously consume CPU or write bytes.\n\n#### 3. Normal per-session PTY/thread budget — far too small to explain ~537\n\nFor a live hosted session, broker production paths create:\n\n1. **PTY input writer:** `crates/spt-daemon/src/broker.rs:1788-1794`; blocks on the input channel or PTY write. It exits when the final sender drops (`input_writer`, lines 1840-1846).\n2. **PTY output drain:** `crates/spt-term/src/reader.rs:114-153`; blocks in `reader.read`, exits on EOF/error or after a returned read observes the stop flag.\n3. **Child exit waiter:** `crates/spt-daemon/src/broker.rs:3430-3464`; blocks in `PtySession::wait`, sends `Exit`, stamps reaped, then removes the session.\n4. **Current controller writer:** spawned at `crates/spt-daemon/src/broker.rs:947-950`; blocks on its bounded channel or a bounded broker-IPC write. Dropping/replacing/detaching the controller drops its sender; its loop exits at `crates/spt-daemon/src/broker.rs:1608-1623`.\n5. **One thread per viewer:** spawned at `crates/spt-daemon/src/broker.rs:1137-1139`; exits on channel close or write failure (`crates/spt-daemon/src/broker.rs:1410-1468`). `MAX_VIEWERS = 32` per session at `broker.rs:100-103`, so this class is explicitly bounded and would be visible as high viewer counts.\n6. **Optional translation pair:** one stdout reader at `crates/spt-daemon/src/translation.rs:273-291`, plus one supervised inject worker at `crates/spt-daemon/src/broker.rs:1991-2004`. The worker exits when `event_tx` closes and terminates/reaps the child (`broker.rs:2484-2486`); `TranslationChild::terminate` is bounded and `Drop` calls it (`translation.rs:327-367`).\n\nThus, with no viewers, $N$ live sessions contribute roughly $4N+2T$ threads, where $T\\le N$ is the number with translation binaries. Six fully translated sessions are approximately 36 threads. Even pathological viewer use is capped at $32N$ and requires actual viewer attachments. PTY/session threads cannot naturally produce ~537 from 4–6 ordinary hosted sessions.\n\n#### 4. Secondary real leak risk — PTY `Drain` teardown contract is not wired into `HostedSession`\n\nThis is not needed to explain the current count, but it is a concrete missing cancellation/reap path.\n\n- `crates/spt-term/src/reader.rs:11-18` states that ConPTY does not EOF while its writer is held and says deterministic teardown is the broker's responsibility.\n- `Drain::request_stop` at `reader.rs:87-93` is cooperative only; it does not interrupt a blocked read. `Drain::join` at lines 95-103 waits for the read to unblock.\n- The drain thread itself owns a `SharedWriter` clone (`reader.rs:114-150`).\n- `HostedSession` holds `drain: Drain` at `crates/spt-daemon/src/broker.rs:1696-1701`, with a comment saying it is kept for teardown, but there is no `Drop for HostedSession` and no `Drop for Drain`. Searches for both implementations returned no matches.\n- The exit waiter removes the `HostedSession` from the map at `broker.rs:3463`, but does not call `request_stop` or `join`. Dropping the `JoinHandle` merely detaches the thread.\n\n[INFERENCE] On Windows, a naturally exited historical session can therefore leave one output-drain thread blocked in `ReadFile` if the remaining writer clone prevents EOF. A blocked input writer is a related risk: channel closure cannot interrupt it mid-`write_input`, although killing/tearing down the child should normally make that write return. This mechanism scales with historical session exits, not current session count; the conn-137 one-thread-per-subscription evidence is a much tighter match to the current field count.\n\n#### 5. Normal per-connection threads — two per live broker IPC connection, not hundreds\n\n- `crates/spt-daemon/src/broker.rs:2786-2799` spawns one unnamed handler thread per accepted local broker IPC connection.\n- `crates/spt-daemon/src/conn.rs:429-453` creates one explicitly named `conn-watchdog` thread inside every `BrokerConn`.\n- The handler blocks in `read_frame`; EOF runs the detach loop and returns (`broker.rs:3037-3286`).\n- `BrokerConn::drop` sets watchdog shutdown, notifies it, joins it, and only then drops raw transport handles (`crates/spt-daemon/src/conn.rs:639-660`). This is a complete normal reap path.\n\nA long-lived client contributes one handler plus one watchdog regardless of whether it owns 1 or 500 subscriber seats. Fresh short-lived command/worker connections cause transient pairs, but the log repeatedly shows their `transport-close` events. Hundreds of watchdogs/handlers would require hundreds of simultaneously open physical IPC connections; that is falsified if `conn_handler_count` remains small. The source exposes `Broker::conn_handler_count` at `broker.rs:2922-2924` for tests/introspection.\n\n#### 6. Network stream pumps are Tokio tasks, not one OS thread per stream\n\n- `crates/spt-daemon/src/nethost.rs:980-991` spawns an async inbound-stream accept task.\n- `nethost.rs:1000-1064` registers each stream and spawns one async read-pump task.\n- `nethost.rs:1184-1190` creates a fixed two-worker runtime named `spt-broker-net`.\n\nThousands of stream tasks can add map/task/memory overhead, but they do not directly explain ~500 OS threads. The native per-stream threads come from `SubscriberSeat::install`, not `tokio::spawn`.\n\n## Safe, falsifiable live probes\n\n### Probe A — correlate native thread growth with unique conn-137 subscriptions\n\nThis is passive: it reads process counters and the existing daemon log; it neither writes to the broker nor stops a hosted session. Use an interval long enough to cross a registry/pump cadence (for example 75 seconds):\n\n```powershell\n$brokerPid = 72488\n$log = \"$env:LOCALAPPDATA\\spt-core\\logs\\daemon.stderr.log\"\n\nfunction Snapshot {\n    $ids = foreach ($m in Select-String -Path $log -Pattern 'CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach stream=(\\d+)') {\n        if ($m.Line -match 'event=stream-sub-attach stream=(\\d+)') { [uint64]$Matches[1] }\n    }\n    $p = Get-Process -Id $brokerPid\n    [pscustomobject]@{\n        At                  = Get-Date\n        Threads             = $p.Threads.Count\n        CpuSeconds          = $p.CPU\n        UniqueConn137Seats  = @($ids | Sort-Object -Unique).Count\n        Conn137Closed       = @(Select-String -Path $log -Pattern 'CONN_LIFECYCLE: conn=137 .*event=transport-close').Count\n    }\n}\n\n$a = Snapshot\nStart-Sleep -Seconds 75\n$b = Snapshot\n$a\n$b\n[pscustomobject]@{\n    ThreadDelta = $b.Threads - $a.Threads\n    SeatDelta   = $b.UniqueConn137Seats - $a.UniqueConn137Seats\n    CpuDelta    = $b.CpuSeconds - $a.CpuSeconds\n}\n```\n\nPredictions:\n\n- **Subscriber-thread leak confirmed:** while conn 137 remains open, `ThreadDelta` tracks `SeatDelta` approximately 1:1. Small noise comes from transient connection handlers/watchdogs.\n- **Hypothesis falsified:** unique conn-137 subscriptions increase but total threads remain flat or fall promptly after each EOF.\n- **Connection leak instead:** thread count rises roughly two per new connection ID, with those IDs lacking `transport-close`, while `SeatDelta` stays flat.\n- **Normal steady state:** session/viewer/connection counts and total threads remain bounded across several pump rounds.\n\n### Probe B — identify the four CPU-active threads and hot broker stack without suspending the process\n\nA short WPR ETW sample is non-terminating and does not disconnect sessions:\n\n```powershell\nwpr -start GeneralProfile -filemode\nStart-Sleep -Seconds 15\nwpr -stop \"$env:TEMP\\spt-broker-72488.etl\"\n```\n\nIn Windows Performance Analyzer, filter **CPU Usage (Sampled)** and process/thread activity to PID 72488. The primary prediction is a hot handler stack containing the equivalents of:\n\n`Broker::dispatch_net_streams` → `NetHost::stream_infos` → `serde_json` / frame encoding → named-pipe write,\n\nrepeating at roughly the 100 ms dispatcher cadence. If the samples instead concentrate in PTY read/write loops or subscriber writers, the table-enumeration explanation is falsified. Also inspect context-switch/wait data: hundreds of subscriber threads should be parked in Rust `mpsc::Receiver::recv`, not accumulating CPU.\n\n### Probe C — distinguish the PTY drain leak without stopping a session\n\nWait for a session that exits naturally; sample `Get-Process -Id 72488` thread count and the broker session count immediately before and after. The expected healthy reduction is its input writer, drain, waiter, controller, and optional translation threads. If the session row disappears but one thread remains permanently blocked in the PTY/`ReadFile` path, the missing `Drain` teardown is confirmed. Do not kill an existing hosted session merely to run this probe.\n\n## Safe source-level remediation directions\n\n1. **End a seat at stream EOF:** after queuing the final EOF, drop/take the seat sender so the writer drains the EOF and exits. The already-finished attach case also needs a one-shot replay seat whose sender closes immediately after installation. This fixes the thread leak without closing the shared pump IPC carrier.\n2. **Add explicit stream completion ownership:** on the consumer's observed EOF, retire/remove the corresponding cursor and tell the broker it no longer needs the subscription. This also bounds `my_stream_subs` on a long-lived carrier.\n3. **Bound stream row lifetime:** remove a stream only after both transport halves are terminal and no in-flight reply send can race removal. Current `retire_stream` explicitly avoids teardown because of that race, so blindly changing it to immediate removal would be unsafe.\n4. **Do not send locally initiated history to the dispatcher:** at minimum, broker-side enumeration should exclude `initiated_locally` before allocation/serialization; better, completed rows should leave the map. Merely filtering in `dispatch.rs` is too late.\n5. **Implement deterministic `HostedSession`/`Drain` teardown:** terminate/reap the child, close input/writer ownership in the required order, request stop, then join the drain. A stop flag alone cannot interrupt ConPTY's blocked read.","files":[{"path":"crates/spt-daemon/src/nethost.rs","description":"Primary root. `SubscriberSeat::install` spawns one native writer per stream subscription (lines 174-224); `StreamLog::finish` queues EOF but retains the seat (476-488); `stream_infos` scans and clones every non-retired row (1794-1824); retirement explicitly retains subscriber/pump/entry (1825-1860); physical connection close is the stream-table removal path (954-967)."},{"path":"crates/spt-daemon/src/broker.rs","description":"Broker IPC ownership. Accept loop spawns one handler per connection (2786-2799); each handler accumulates `my_stream_subs` and detaches only at connection EOF (3037-3286). `dispatch_net_streams` serializes the entire `stream_infos` result (4365-4377). Session production threads are controller (947-950), viewer (1137-1139), input writer (1788-1794), inject worker (1991-2004), and exit waiter (3430-3464). `HostedSession` owns a Drain but has no teardown Drop (1675-1735)."},{"path":"crates/spt-daemon/src/dispatch.rs","description":"The dispatcher retains a broker client and polls `net_streams` every 100 ms (line 87; loop 429-471). It filters locally initiated streams only after the broker has enumerated, allocated, serialized, and written them (464-466). Worker completion retirement applies to served peer-initiated rows (506-514)."},{"path":"crates/spt-daemon/src/pump/mod.rs","description":"Shows the long-lived pump carrier ownership: two pump-mode Brain connections are created once and retained across all rounds (524-553, 564-758). Repeated stream operations therefore share one physical broker IPC carrier; `push_feed` opens additional one-purpose streams (1117-1123)."},{"path":"crates/spt-daemon/src/brain.rs","description":"`Brain::net_stream_subscribe` inserts stream cursors and sends subscribe requests (1584-1602), with no EOF cursor removal or unsubscribe operation. Pump mode creates one named `pump-ipc-reader` per pump carrier (230-252), which is brain-process—not broker-process—threading."},{"path":"crates/spt-daemon/src/conn.rs","description":"One `conn-watchdog` thread per physical broker IPC connection is created at 429-453. `BrokerConn::drop` shuts down and joins it at 639-660, so this class is bounded by live connections and has an explicit reap path."},{"path":"crates/spt-term/src/reader.rs","description":"PTY output Drain thread creation and teardown contract. ConPTY no-EOF-while-writer-held is documented at lines 11-18; request_stop is cooperative and join waits for read to unblock (87-103); the thread owns the writer and blocks in read (114-153). No Drop implementation exists."},{"path":"crates/spt-term/src/pty.rs","description":"PTY session owns child, master, reader, and shared writer. Child wait/kill semantics are at 195-225; these resources must be ordered correctly to unblock the Drain on Windows."},{"path":"crates/spt-daemon/src/translation.rs","description":"Optional per-session translation stdout reader is spawned at 273-291. `terminate` closes stdin, waits boundedly, kills, reaps, and is called from Drop (327-367), so this class has a concrete child reap path."},{"path":"crates/spt-daemon/src/daemon.rs","description":"Starts the single broker serve thread and fixed daemon-lifetime service loops (broker at 192-195; digest/drive/tunnel and conditional net retry/autostart in the surrounding 185-315 range). These are O(1), not per stream or per session."},{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","description":"Live field evidence. Conn 137 begins stream subscriptions at line 500 and accumulates multiple stream tags immediately at lines 516-520; the same physical conn continues subscribing at lines 20230-20290, 21801-21840, and 23724-23728. Conn 12 closes with accumulated subscriber tags at line 377, demonstrating physical-connection-scoped cleanup."}],"architecture":"```mermaid\nflowchart LR\n  Pump[Brain peer pump\\nlong-lived Brain carrier] -->|many NET_STREAM_SUBSCRIBE requests| Handler[Broker handle_conn\\n1 handler thread]\n  Handler -->|SharedSend + stream id| Log[StreamLog per NetHost StreamEntry]\n  Log -->|SubscriberSeat::install| Seat[1 native writer thread\\nreplay then rx.recv forever]\n  Peer[Long-lived QUIC peer conn] --> Entry[StreamEntry table]\n  Entry --> Log\n  Peer -->|per-stream EOF| Finish[StreamLog::finish]\n  Finish -->|queues EOF only| Seat\n  Finish -. no seat drop .-> Leak[parked seat retained]\n  Peer -. only physical conn close .-> Sweep[conn-close sweep]\n  Sweep -->|remove all conn rows| Entry\n  Pump -. only IPC carrier EOF .-> Detach[handle_conn detach loop]\n  Detach -->|drop seat sender| Seat\n\n  Dispatcher[Dispatcher Brain\\n100 ms poll] -->|NET_STREAMS| Handler\n  Handler --> Enumerate[stream_infos\\nscan map + clone rows]\n  Enumerate --> Serialize[JSON serialize + IPC write]\n  Serialize --> Dispatcher\n  Entry -->|completed local rows retained| Enumerate\n\n  Session[Hosted PTY session] --> Input[Input writer thread]\n  Session --> Drain[PTY Drain thread]\n  Session --> Waiter[Child waiter thread]\n  Session --> Controller[Controller writer thread]\n  Session --> Viewer[0..32 viewer writers]\n  Session --> Translation[optional reader + inject worker]\n  Waiter -->|child exit; remove map row| DropSession[HostedSession dropped]\n  DropSession -. missing request_stop/join .-> Drain\n```\n\nThread-count model for the broker process is approximately:\n\n$$T \\approx T_{fixed} + 2C_{ipc} + S_{stream\\ subscribers} + 4N_{sessions} + V_{viewers} + 2T_{translations} + T_{transient}$$\n\nwhere the pathological unbounded term is $S_{stream\\ subscribers}$. For 4–6 sessions, ordinary session terms are tens of threads; the observed hundreds require subscriber history, many leaked IPC connections, maximal viewers, historical PTY drains, or a combination. The conn-137 lifecycle evidence specifically selects the subscriber-history mechanism. The active hot path is separate: one/few handler/runtime threads repeatedly scan and serialize the retained stream table, explaining why only about four threads consume CPU while roughly 500 remain parked."}}}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8116,"output":7751,"cacheRead":138752,"cacheWrite":0,"totalTokens":154619,"reasoningTokens":1896,"cost":{"input":0.040580000000000005,"output":0.23253000000000001,"cacheRead":0.069376,"cacheWrite":0,"total":0.342486}},"stopReason":"toolUse","timestamp":1784272365840,"responseId":"resp_0365286983a6ba82016a59d5ee42108194aad0d2526c81fbf3","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0365286983a6ba82016a59d5efca008194bf05501dc6f83619","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdX-w6l39OCq8jZGq07L9LIHeJFC-IorxwbzM4ymEusxU_n1j6G7Us_ex4nnOezbwtuiw8A0M30IJw7BA8ZNYUGTGBhaFnmljGlbspBS7FQNzqnK2XfJVq-uKqLsTi2qCEug5LZUzWBpNeT_pYJ1qweZUIxF8WwGCRcDD6CDWUAuPE33bCTlXs2BArH2zqSXhx4xsf7xrFGUVJGUcBVs-BSN_uq7wnthaD5_-9gtA_CKXxrsfMlqU-vGQBD_OIHNDxa1Gjz9YkHPKuTj6Hd3uHO8LWBJyfJAswsQbPUxr7BET1c6vROEkZhBId7xHHxJxz8YOK_8SksG2p1wZ38B2P3RgI0UI5AfVcl6MThDjZvkmsiuQRqFOUg0L_tNw6d55BfmGDRpL_esgOToL6Z9YX7g9eSe-jRokcgtjbae6B_wzaSnIxZnWetVOrTIcJMcWlOqlumzpJ5jZdRBYNdUYXmvac0rS8fyJTCI-mrnx60P53xCuiS5o4Nns_fJ9_7SE6k1E-veo6J4xHtG3p178-1oVK2ldKS-W6_j8dMGjWMPwNd-hRCdkjTlexXgq715Temug_D_G1WwPQNQiJipg59UBZFMP7SAF8gV0pwGZVrwAvfOrcWCYnvP_Km74hWhqWW7xav0t0aVL4XaEVGZf3qyfSxnUGArz5VJQDnxz1d0cBbjw7uruhSFPoZz2sD_eV0a_SlBcpdb7Ki0FdBxgI7Q4rbhdGmNv5ziN9InGtSbC8O95MFD5M6W_zyzDEwFUYyeLEMON_ujlkw5iw4W7_E_jKepJfQgZv-T5BD9tJqGr_HEYNur6I-fY3dGj4PfnvjpnME6aqj4gfdFX3PhrIAL-c5X3fdUIblGltoHGgZWD6Z5-3BlGka2NmL94_tJHgq4rrkxK3lmN50nTiPZmJst-JRojyl9NrDNfu8OfSozoV0B1pv7UtOP7TRGDPsoE7zC3x4BqvUxjDElTqrim2JCZqDnxWGHG3YeqCJKNF9HCq0wY5s9Hw2LnbRvWkbX8oE42YwCpg9_FxayPPrcxJ9WqTtJrWlCIfwwRs-DTtkfH8RDfdtFGWRXcFIVLl2cIiQOf_bGcz5_1ODfQHOWAwYocLpgNcLhpLVIHObBlRFRZAa6yeQshAWC53x36yvDZxKCxOWjyhPltIABl_u3GB6RjT9PclLOZTp3nGCYYghO8CyNsdydSdOfCb_yljG1f1Z5omR-Q3LDZriHTpDqSbx_aspEKxLsWAVy9QmEGZmpV3EX1CvZ-lomxQI7szyGXFgz3QGKOcRKDiQ5wv-MTbrHdtX-2FQbsTrGqigZ5TWMVSqiNzbLNPktje5UJd3bzfL8H8e83or-mcRtlimR3eFIvxkM7wQ7xIlkA9nvp0PL_SMYsf6dJgsjqGPpGZkuseAHJxp5jhh93GgV4NA3BY1f_ODDb9nHQCZtgzKtwjQM2Svb-p0pjf-v_SZWtMnD6fLuByef0AtxWG6tCulXfi0enqVNXgUk3Vk6SjasEI6SO4HViuX1A4Cc1HU1Kkm5WbdUUPQFK1NpgDkoR75YTVXURArFHI4DsAtzDF80m-LvWd5me8xCooUlRjnab6r1ku5xN3sgTAodiamK773cKNiq1w61fZy7k0IO6KAxln5vB29c3PBu2p6EhuXC2kgBX4lGqr7FxOeTSN6OTH3AAunZlL4g3lX4ywxE5tz_eR1i366YTL_emi3sB55sqC_5oZtKTzCat5Angnu--xsHcaPlFdkOREbcYjnuKdp74IWDrzxoYco9wglUxSt4pWAQpaogjP4-1B4G9yc9pAuubaIVwWzDZ4ciUK9jGHvmBvPxZOoGDbrgaKghw_vm4beHwyuH5NLaqCtuygc7M2yP8HCZOOP1gIhDLwcvDaWqqaQzmegpXS7fULgkjnsXbeePyP9fJDBMVWq6lOssCMC3YzQTSH8PICPUSueAiD_pDrtFQUz7yu1MlT3OUQZjvwxL3TnfDkHUQwSN3XZyGDhXFydl-d6orMGWIJe0TPetxHhaKwkzv60zKOOabkBJ_IK43GeKqLd-7EpWv0t-FzKm5jl85321E2iznYmZeXrE9JGxWjDz434XYo00ydkE3bl6NSECKpDlQCfr2PgvttJuySrVQfeIdB6pushhEl4L0i8p_RbnqejAmgXV3e0-tddC8OwCbQGsP3WL-NL8U4rxb3YCQFtnmkuIf2MKnhcuC0PjWVQFFUNRUj5oAM169PeJK1PXY-ys3_YrMam8Lj1jyIMXK-Emzfqum_6G5Av893UXoAaFqGGkepo9FTPxnt0E2AocoZYfARgtNksuQr1BPt_O4HsTlH74rDB3G9k949wBvrSdKKuADWlVheETzV7l5lkaWqduXCFUfHnUZxW-M1rqbqz9WG4lg1k0UGJfUwCNxIT7suQovuEJ5UvucwpQW9JLkQAI0SJdRUi9b-PAfLZkMOj36Io9mduMP45JBCiUWbRaFwsCj8tHELpell651_cyh6zZcYYUFjFQTLPBPLEurhIrpx1YUzNbuDPot5F3DOM02jdBES0I5ct964u825_VBSnXnwJxlN0BP7T6XHFzMw8_VG8lLZ2cnIKxBcnUjYShwlgXDSlmDDd5nv4NdBl9rqWIdWv_4w8A9JnBgrIxyLlOCxYOoR2z9SLNsqFkDDzI6mgmn8j8JWyNgfbYmjRM7INfrfJP6nC26p4DVZ22yXel85GkFgEKKQfy9cUmsSMfhYegQ7lT8xSaKK6Yie_7p494WISUyOPctaOIVr48pK27AtcEaNDgARKT2yy2y2thlUWx8sIXkLkJJAqza0IyajHf0WCenBlr3CQf6-o1uBe-YLBSIDJrIgziKvDnstGyTOnlaHCjODB9r6YKf_iNZoKRr1_YzzWZhM9AonY5eTfdIBOFliZOmXTwAyb8UJapUVxNLaX_zOehowYSvUx49YU_QX3xEhB4X45ZEDTOVRRbWBTiTfb9mRuUDCg40zD84JB6EOZK9y-hh9LWHDTePk0a3yl-VWSiunHyF_iaE-Nzdf_HHjDwEfHEYwytRDZBYbL2Zj2_nIwrDuBXmG8cUT7FLP1DxmW3bsmQI_EOaqNdlZIaclfyWBefAoteEXW45URVAoLq2kj9QSmxLf39F1XNUT0nVMvt0pVjsD87RLZe2p_Fk9-q2C9owZ2FCxGA0N3RKks37d6RUddF_Ta7ucVxcEq7HDewd-r-1EGGVVIB-duiGabcu1zqkm0iFkO-rj6puGZHKcSn194TDvDAB0NHMcHSGQSrMc0HClLId2MWqWN5B8VwZaNPKY3Wm2RkQ0_nHBCNnM_8emT9bp4zANjNmUssJq2X3zXmGdR63CMwc8usGZNhOnCpePHz3AzkBya3mMw9VXtDajcAStoJfulpxufEJNE0gLMRj3zHdbSY2BGth_ruMX_aLLZwNSXATQ1Qicy6VhL5VAcTtTfHEejQNYO2JTkrA8JmWUrT8lM2SDsO_lep6nvIXoWS3VtPjyDS8S74behK2yPVaZRljk9kL1hTI_QPnezY7hZllQIWakZH05hRG3oPDssrpqzBRGkN1bPwcGPOGhw2KooXb-AzU3awHG6sD2cHtmO9XiHDAoMUHKUKCfQYavjOpOe_tMROCi-mJQBMV-fL-usowZiZTU4QBOJVEEocazb7pi3RtUdt6b2KaK1qZDH8O75kxcnG7Ygzeu1Fy004Yy0oHjPoNvGbBS55wodOqtha5qA6MNqYPZAV6dZan1fdV5qf-w6nxCQbqi2Y-9Q54iW9DgNSHTARdD_eLTy2iKS7wwLj790UsAm1hjguU1Cv2Pf722jqOLORDjUM7gE5N4vkP14z0t3ZyIUW1iq4OxiMKdq4SkkUADcJ7Uq2uG8ZQKjlmwR-b9XuHCqq5ljs_Se82YExBiH9PDr1w_aUXTQJZNO3aX2wWNStusRxTD6eC9WElx0y-n-dksXGabwX4s-dHW5LSXUv8jX7IhQ66dL9i8sxAE6GW4_mIJcA2rh7I6o=","summary":[{"type":"summary_text","text":"**Assessing v0.36 data flow discrepancies**"},{"type":"summary_text","text":"**Formulating detailed analysis summary structure**"}]},{"id":"rs_0365286983a6ba82016a59d5fe79f08194a212b64994d773ee","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdYNS9wbz_n2Il031CD7l8hOeMMF1Fu61MKOjqme7iOwl6bnTQV97BUSd6ZjBqLWeUAcaY1MYTGcwYeE9OtKsIEizAezd_LMA4T9lyGEzYsP_FozJVd7d0YzE6u6SpeA5EXwvkfWn4CL8DcVqhUh7PbDkfocjHfpcEzi9iirkBcUCRa40hMjtaDd-63_MuSJSC-pGUweMnBoOd2VutqVXowM508KLpNr-Qg1jw6G1K-H8NGWOmobKwa_4x2p4wqLgYArt-G8mhUqHtmecdZUmUgDT2ZRquhqgbw7-B8fl1jWy_3yAQoEoKZUM1eNlnOYCzlIvBmMrwgv_0sjWCjiTKIUaM1QzucQEPd3_lbsR771ef28cY_jUYneFe-KMusJ_iS0vhh8bZ7-kVENc4IYLUpk9qolQT1Pz8iC5WsGzbkBWcss2ScPd4bnIIBHo0QNh3hXWyE1XELW8cNmUcbvajDmfSlH0Y8MHgj9vhHlkC7J9SMrZ6ptB40IfnFnAeyS7-RXDXyXlSMtE-iVhZ-PXRTBR3mO3cIeN9Y_iLZER2bkIaBZXcJheMTTSviK_nsSahWRYPVAJoSlBKB74sZQHBHsEwWvIjTYgcbgKZm_E7GrN5hap6lWHFoXM0pn-02BbOQvPtkt-loue_jL3213fUP9ej0yDqmmKdNz3th4_3_6iy-mVEPgK_8qXHWvbmLMj30o4sXFu0TyqSb_C97bgMrVIBZdMi-eJ-OQ6myahH0m9jgwnE_jk04mXXd_thrT3r95TNKQNcFIoErvi0p4E-mhxww-nY9CwYZ7t0lH1KubVzV4pKktJFGeJEtkgX1bhvg4iwcCGIBBcRgrcppqE7IdjchJi5HHVfUxJO7zkhKJg8w1t2A1svHsyduJ6P0zCqWSeXO8pjlQgXRCPjnQz9SIxcSlkOiuqZh2E3A3KihpX55TUGOHxJJPrZrv2SIubuYIl0z2RyeY3qTZG9vkmqUGSym8QYFn4pdrb18n9kyv3uUVYCj3Qcw3QYSMdBeuEJYVbCrjPB9hLWvHeBxPpRbmsISz_DYX8RtUQvR2kwQ5_NjMikPR8Yu8F3eScwvxlz_p3AUi7N4DhFox2UlFBc_s0ciAjIDXIXK0NgABnJHmC6nO3artJey-HWJ2ZrotZRc7cPHMQ3HuerENQ-CQcDBgIuqwZ2iaIm5SiByWea--HeDRyFY2ImezdvhdhQK-Tqyx-S5Hs85BGPcqrK72B6Vq2IMA-QEIrj1rH87rpZVSsv80s7bVoKPtmk_5UmP2f3JHBLYhdt8h-SIzb73lih5nlALfpNKt6npOQ9AnonqMz5KuGgFad4T_NW1dT1u4SRuxpt9LIjKn5SgQ4U28Mm-8J8k06ziabWXuaWg0GeuWxrcY4xwhgwfjAuBmwkT1FialQcauKQO-o7rMbIvAJKC_AZSXfLvkhQV-tLsIBrEgginy9FME5ZRv6BIHuCPoVH9xT8dd1YDWk0Ry-ci4rLFTARxHgsZKRfYeGpy122zuHB8UVz81WHxX7u-4CeP-L3FZBwCP-Mu449rjpzrVkN4zwR1YLD2_pK6Q7v0UHRnbv8jP428rAeK6ahe-JFgR95dYuC_JN-Kgv7dRTOV4QHMO5Kl4jn9uZ4gM_UGYLpdrgVac-ZVBlw5APY-4uIUg5QqZsml_Jb_ybk8sW0g8Nfw5qfGBh7E-KiAP_cvK2opzK0Cm7vgstYYc-vffViUIfQqMJCBSbhuYRwsQ7Xbv22vEJ0zmqh3M_XSWApKW69I8YIpGfBrfYqAwKPEFA383SoOaHecH4pcp8yfIbAc93H6RvxKAL6fbxdHVuoMr3yJipshuKCg9isNk9G2xmy0F57TuCP_ZepiDAmeBAl3DNnUhdBGBz9R-Fk20ED4yIqfOcjaMGvjSiCTMYnqbzAjhPccdwRnPZKcvGo8N4QGklxXR3cOBMtKSGGumz4XCN6fm4VzSXunvxYwPlKtTuwfy5trBn9c1xSQO7NbFW5TO2hZUz_t_QIi851A74crUaAul5S760Yymva3Lzdf0posTxXsd0ZTuflO7iy1w6lIyvp29bFBvTG5Wal0kmmg3tbJoP8rSSpdRqaIOHoQGKZE3M8cVeMNYfSjFxWoxEg8fURgFM2IrE_6EC2sYjutl4pH3NBSPH8qCoRnW0PzWUhPKpamdcbU1qJYTpw6aquqw9AJUTVvcbg0Ed1n99hSCl6QGVYjFSyxmXRnC8DqOdov0KUmCZH0L4nRS8G-mnuOwCnCWwbCBiul7q1Yg3pfGtB3ScezvUQNNjGJMiJ72zpzBsDT3RJQGQdCIdQWVhcijRFuwhnl7nxfdoiAiUYHXoyyxtMQIaO-_y__2Yl5yqgq_YbfhJKfZ8TJzvAmYgl1sV3VNBsVXoG4cKexHQDcx5MegrEyAPdKAN2nRPZN_N9mICD2OKV7jSqfRFSvj2Yxn7JHxDSFCHqLpvBDkd3Pgli-xbHH_L98pxwBYlbe2vBsEHNLy52Ot-47_4b4MWreJcG0lraeJGioKyUHJd4k_hxHH1nVb6dRwiq-vpXqttsMf8OnKeU0bdlN590ODDjn0o3tz6UGM7sEpc20wCoM3JLpCYogx7r7JEYqN6Yx1C6fWSISaSuV9xS5TnFRWo7irhKrH_SFhbzObZ5bPZnKIZ7heduKQ7zXKL1qexD-dXkYovX26KfEZ4kE9tIkWS09JQcyV-7VDclcKqdS0Ge1H-qlxgkfZZeW3NeHeK_P_XRWyWRLEM7WTPiBkCtQf5Y7hwJ5M_poQLiagKK-EDaxG7aafHmpf9rTe2FP-NlHcHOrRjapP3AayWlOoEzrkKBsXRkflZTwwR9C1MTU3jm-Jndu_dlEn05nX6y6xuTyf8WmvZnXYlwtbZLXUPQ6GjfCwt9EMeftPr69JemmjgmVMnMirS6CgSPtmfIjfLWWKwD062WHcopNWDTdwArQANU71W1vLZy1EecSJcPp4lsHz1XmRl5eZtmsdBBNqJ-9pEKD--MzmzjA5ia-QqS-C0A7LqPxMkc0g8aAC8CYCworW84w1qjz7TYx2faImexn1JOzji9nmZSa4i76dfuDPAWNgxaJ3s-9-KRMsr9vCK0pue4B94lltwdp-zzLzTcPjjj0x8Z1P3WVJxhTsGu_M_FiWXIdoG_9IqV36id3rybCSGiX4BAro80vglVppG-6I4OsTJdrS9EhcsQLKgw9qh23ROy7HJ3mPablhFy3Ww7uIDg-gyf4yaH95CZvOtlLHI7Oy1OJe8hTVszvKKEYz2AUcV14pP_E0fPuWCXEWtiSCkNINLMP6XelghRM15ixnBX5rNODXhELkSaliZYxN_lzxfuEny2KlKMkGBNSoHwEkFkz9V9J-B0QJVsduUmnukzHn16cQTtQtSw0lkFWNEfL9CEndiH9zUEtdj7QyVHlLzRcXeeKGcmYrS6qpVzxDz1x7zlq26GFQhMuN32020RKcfZeEvAnMEUh6P7kTi8Vf--1tmsuQ04k0DF7MCEIgoG7LiqQeFh87b9YyJA6UEReaHvD3Y0BwKPjOyPhFSb2moOheHzvbR1sIbZO8nkHFErvk8cNXICJP4BfZOqCUVGiaBulEwMU9Ra9NcqqqEzH1MogM42IJAyuEzPHwHpf-7nzkanq4X2WA86zdyy4qqXF9v1SB8YCCDl0gc_G50fZhcemFAJF_gdL0O6u3xjd_M4R3d6K0C45B-YnwzBd0_AUwcvAFadiC2eDZRV6_-SABMzwZHtDgi3kan3aic9y6NM_72dyqiWIktS7wVRnHFvVdxZzL7TaH_Ibas6whDSiq4r4iuBqQZkYMdIQ28T924n9BC4dczrk19VRSV_mJ3pNIJKTu-QA1iks7aGDtU7ycY2KAQdPLKfSjZDscnpo3kLkHs3f9Tc813zBA-SAngIaLehs1VvhJnYA_NmphYicjzFihAHhiMpj9MLc6tc2C_TpNMvP-tXZLrdGUs8XQpRSNfu-bd4AYDf7nK9QZGI8QLMgCfxDJiVPGKSE2tU39bt48wqppvh0IzofOBuVPlNnnzFRDiw==","summary":[{"type":"summary_text","text":"**Identifying long-lived broker threads**"},{"type":"summary_text","text":"**Calculating thread lifetime estimates per session**"},{"type":"summary_text","text":"**Identifying missing thread cancellation points**"}]},{"id":"rs_0365286983a6ba82016a59d60dccf0819494af90032f18cdae","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdYcm_lrhZeGTvluSIBTJtxNhGh5egvEqrHfdbijAbGbsxwgnTq8IklS6Cijvl3BxBc8Fs3EbETOfhW08-tAS5kTHApp6w_JwP26C1rNloUZajd7mLFBKx6EEtSUIyf2IyW0yrLG7TtFvHpfzNuqWvPRXCGSwKj5U_LxMZ_4sb5p19zv8DdXwJqmWOsibblyw50qf4Dfx3ya4cozbV1E0UZulH0okLO2Z3h-mMaFwAZDjFElmpZ9STY5_46joIQznAk4jy3cIlgPao0KgwOcx0R39agv2739xacfLIvIQ83xFWDFIUUp9L28d-7R9ucFQO7F-wRZG30a7Ws8AbEbVvcVtw7QpJPjbvjnKKdeYaiSUMrRL9VhxYXCBHprMmY8rOVJjjllOvfAl86b6vz-4-sdN9eLATrlp5inQyFcSzsZo14WndVCdoBfyVyUH3P4PCZTj6Hl87CaZZeaEndneAzs-fsxxmPTgccdthiwjOMWmBpPVjuRw_VdnqFR1o9W3Lj3bJpSUeAob_QP5UdiVDNnBbNbyHletNnGMv-dEpZ-Km1qk48mngD05cevUPyvk6TmeH_50Bam1H8icqXcSxxsd5Rs9AVW7uF7dF7WUESfw_IhXWQq2MLuJ5vKHXyavQPggjcRlkat0AK_maGzxUd91AsiZ1LZzmgrrNNh5tQUn4izj9rYebuACmat2Uh7Vy7fkqaE8rPcm5qnC0b-Cabeoc47_Y5JsOsp0eBJ92NVuEjJIueZ1zvY3ds5a9zW6Z834MChcVaR4TMwOIl0DmPe8GmdfBdXGxMF7Yquq8irESoVvRucl5EISUFroTBjzW7mAPD-p3XkvDQkNsUlZkwNzWIevQ81WACwWsR78tV8I8jkXkhA1I6lydBZMckIrZ9MjPGpXaM2Twmqz_NURE-4UKlAd0FBDefchLlqfQapv1XELsLTIdvL3jdYNRDP3FkgxTMZZhrLHUeH07NQsSMBb3nC0BMQIMgINGTuI4rVf59FqCFvRv5onfkdo_o8_cXsBjZLqfdYahpL57FpjGK61HRIdcgoVAbB_heEIC2Ye2A85w1eA4FuuzkSg0kXObriOVrJTmYb0H6MxTFZw-ur6I3WUYRoMgLBi0FRtf54F6EacUyA0l2pijK85arAjOTtuSNH2zP-6V19c62-SsJt9eNJZLZ7tiDdsYBvoVBvEbaGLatumACvui8SG50nD2ADx3KHzwZFDUNFpBT3OVZHeA5KPrK2Wl4jBukTbmpvx8ovkiylvcXZ2DEgip42uymLDiUmVLXQUOD9_PpUZFI64cC6mcOfbSr78xGEdtwz3clXpRuX0LxMFqbZnJfawB_BQsKB6W_A_yqTZg_uXEwf-yjNn3MfKzq5uvj3ggyd23ih93BVl7HdJIJOKqFeHQbRi0gKf5WpJDyoBTCCEeT9QOjeCUjOhUZXB36qBEIixWS2UyOiPGY6vZpbn7kj9ZWS8e7nPSA0ks_JnDVjTOGXUNwBzntF4pZPDdVlar8QUTW6TKIW1YerH9W_GoOn9XV6JcGtzgrjn2E_6Td8AWRCBCj1fPGridYuoMMhiMC5t3d0UJUPOtaJyoxJN7DLyQbAhfcqgHyN-_6QBHohkBgy_ZWj8rN7PIWRytbUDY6mXjpDP-EwmF-s5fo8rd2aS0kN4izvDw-0YqG6tJ2oi7II3wyEJEajoXJqNMfqWXtDH39WpLmYIu_ZF6W8nrCLF8X2tattFfREYk-xefwBQmzahKLWPVF3FcUN1FN-xJL8wBzFuOvu7exH0N9KsbPB1crPHF646WcCRcaopVq8Wyir6mt4BrTV99GNl8Edh_jKtDrA3gi9qZmsQJUmiYW5AVdOpUrvLvT7aiwzeIBvu0bG6yIMh2w4lPTl0eM3UZ1KnP1BWl5mcBQJd-WBEbq5B3cdfuDfyybh9HmPa8ygOk7p8WS9m2IuPNbRcO8VCilro8UV0h5L1NblkmiRNl5nbqHPC-V5pNVGu47ERRc96WszqVOSnYgigk8JKVau8l0dwcsVKpAzF_E2C-tHeM9PDye3ge7MMq1wFpPDMP2FsMuhxW64-Q4V2h1jCwNdUcT3lPwvKMgM_2FXWPp_J6twGAKcyUX0MUqQPHb8IOOkGgJAw55S4fZnIzZF1e2KmBCyK-mzKoL9IZv2hmGILcOD7SnB0KNiK6eMh4ZYbp8RddT1QFOXXvbBlUTY8BupB7i2LHA_tTDf6Y5DjSOevmirDyTCgTcBPxiWNYC-0yG0pg7qQ4yZN3s64w-cxfgonSxsFeURwM4ZClpC-rKdkQd4Hp83bJt7UUMxv0t56JTPjcJqIYGL39-0700O1qzho6p8UnFCJCbu6UMXDgjwtk8yB_v-gIC9HafvL9sntgUFGgj4hGVJvhBSmYRv_mNT1et9NFDICa6UVD4j567Ml75zyK_q4JFtizR3RsoWC4obSOEg1AHMFRGArs1owWcFA6_NdKky6DNAKxKU8j5nWHaLGdYRXIXGlF6WWVRwpGJtZ1b0ls1NNLEHs_lfg_EnamhLKTTPUAT0bWA27z-g6_sd9s9RXG9rOdP4UDEKP0W-2RSHeJh6KcEFymieuyGTDaffHfR9bmX2r8tGFCZQALh8z_ROmlgm3JvS165etRebcCzSKrhGRgdwY4_nZzyPLlFsV9je4wcfZ2Iuhcyj6Po7A0ten1iM1F4_hFUD2zwoG9tvPBGO6LT0j3a2wF6sdvABamfDD835T74GQsII5kANe5YjTVr4QKEx-ZaeyVmrl6rVkajBa29mNdl4VNmYVtU5di7SqQtSFDEBMutGV7CXZbEgHPLI558iClw9RbpAAACJJQzofyOpYPzVQW0Ohc-3xhozCxv6xShT-2unWZO8Vv35MQqJ53tigwLbZu3jFUu8mjH5Xadu5JFxcMGW_yEDjzkjWB7l_0SX3NzM25K16DBuZtTEZEdfB3fFooilkvbhyCeFMegH99agqKH0Pymd9YfPOb_vKWjUb07PJNM1R-86AGlVQJH8iJMCsV8D2IzIR7XLqievZDk9Xvb95BR3uSyPCR-Xq6o_99Rjey6vBi89go5VmDbZ0Ub0uiMwuN7w07Kq0YWatD3of8vcCyGkk3B-5g6P-UdQG1jGpGBRrixU_YAgYUBVUIEJQQI1IUvDng-fHp-dwgAbjq5ZzedSpgkG0vCWC0zZklUW0yQd6Mq3P6G8bsbkDpdmbe3UZ2IHiXmKOvZG02QWRhQ_kXIIQu9ydM1H8uX6Gsens2GPOoJ8i8ZjIwdBi7AIUbKv_sDLz4K78lg8l7bDKmlX8xwmWhLSeRR70cTkcxPmd2lGgi8EjZozuY0bQZGqZKBWiXHcPzAEH1SBlg-VRnxsJiSqu2eyD2kd7M6zCIaq1bNFmXZULgUnO2q-CJ65t9qQsmrI0BrYRTv_6BH1fNCsNTuV37JfF9mEN6K_7Wy-b_mZ6FhMNyftG7Y7QUCaDtQ8LEX0SKvi_S9462YXvPddvE7CxKWiGR-5ew0a7ZQbcKZw6b9SdBRIYaKqiG4GL8rTW0sDjAo24h9k6kNV2OEE24r4MbxNoU6BwDEO7-Jq2Fg_4TVCMBh_c_fMefkBCYBLz5nAJrBETCXh-BW33PUO2b8yLkpStKJmJNoQQJyi_TIs5UOAa7tvo_VNYrMGL2p4JYyvZEd1BLtY91ljhH5LUQJmq8ibLdB8CDC3QIxLS1Bvb8oSAqJ2a-FGJ0KEJblx3iaGgcz4Ekxi-dBaaiq05lYvdvxTuxvAJuUSme5t6OTS7W6MAlRDs_zNyRisHVOFb4tRHDZyprBldkgZ0rGbmmMjPUGZ0uEFWNT85x83Wq4Qb0g5zd4LU8WA448CFAbMFJcHSt11IYPMSc-ieNknsevFjt1BGycZysG5C1qdPYPh5TgFGnylF76qPiaZRLM42gyasmDrn07Zc7f_NvdvdH-_O9VhAVjHiqsvxYVIwJHFBaahaqBg3voncX7JLVPE6VUriDd5f9BFnmfiCIsT2t-XOkU=","summary":[{"type":"summary_text","text":"**Tracing CPU usage by thread**"},{"type":"summary_text","text":"**Assessing thread leak patterns and safe probing**"},{"type":"summary_text","text":"**Identifying subscriber exit timing issue**"}]},{"id":"rs_0365286983a6ba82016a59d61c43248194a0479732eb2e9570","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWdYlWtaim-R8x99YAiIgLZCG6o5__9pnTis3qKKSm_1VSkW-3GvFqdDnYw0JfgHkzYW1zKd3Gmp2gKWN25WC8I-smj_Cobi2JUW0bc3_gnTNbx1S80ehWXrat8Nmn_dKo4ec62rk50KQ-TiLTFuGr6NL_0jLJRzW-LojVyar002a1JNCz8Iz-YrJIO6blKDZNOaylWKzNbHVxxZgxoKPieCoKUxUN3VJM2P6fgj1w8Jqugop8H8EnhXoQM3UEwY2erWHH8-WSn4T67bYMZ8jXVKtw-Xh4inM1Bef66GuuQxcLjID2Ux12c562pQx8pcJ5thfooCsFMxjU-SQQcEVpa-07oYWvYE-kRFYpH-Z0pQI_Q7w_0kgNhHLMiUmQxQycDK4C-Rt8ZSvYVJ_EbSw-R9upZkebFmKl7HQmu06SBc6oPKjwMShl7Yhtocpp1efFP8qhOkVZfiwGbYt-RLOItSUwT99AUrl5aBv6mKpsj9w3ZEgNYJENf0zN1m4BkgteNkKck--fbvmGIvKMmpaOSV-XzA-b1cHxws7SlUw5j6em88l8frq-B2USKZPuA7vBxcKIE97ZyQ7KY3yyzgsCC2r60XkhLdIedkOdEkYrkeWjDpK8B2qg3YAkIRYE61DsmKRadr7X2j4zZpufetg6BrpWGnIT6FBRm2qvAimHqr_Pt5ywulBRlaIZmgl5MFxGpaDbSXsF2vAQbtz6EAshuh0STt_T_zzcLovSuZr70xtbrrjbEF6QVFS4CbDQ0rm6qF1F10CkcpOAGn_PagYbqvAj_72kXbw1hZeh-YfRoWFdDssCu9d0Y20qCNhWnFt8iVfk82dIy8oZVIhc5rwngJl83xtZT-5yMCCFMlAYmlTPH70JPQov8E6FGfVEX_WR54LsCLwJulSRtNAHpAfpSzKX_o0Tz7cmR8znqmPoOYiQBUM5nfeZOlH1_pUDsWQUDcMc67gcQi4aCKd0QQfXtLbMIe30HIjJl5_giCA0i2_OeF3Tbuc1gRs-020-r-Knm9HtQtjNha0GL7s4LQwq2IeTNFCIx7w9iyUD_bIBoM4B3QNDW6SCvBcsR91cU1v3yqiSvw7QrlWgvTqmSIGQ48oqftB0cqvy4SVhNngW6VR0xdW0L9QF51K19zyc-QuhHUNx5k88ayjrdBJhtB--X3xE_Z6F0FSaAdfjlqIJJoBqTwiRhRjMHcSWvwnVmtcdsbHrZR0MVGw150_PxeB2W4LloxjIATgCNNcA73Dqn54Nb5M9G3A-eQitDCnFXZsHJs9_RalJABalQbtDKQWu6DyMWQ7sJ4BmqVIww1CHYRf8AVZrJqFpFhXxFceTuyBEznq7_0tHFK0y7x9Ja833dbp2HqVkxKnokL5mm9Ti3lD0ptoF_vZnK5TknGxuHSCfkZBqofZJBzziNtRm6FYiD2n4FD8yLare0xBCRRBQ_3ROXJzNAKTTuEfjvjVJ2udOemm5EdQWSa4svQvrSucGnNqrwua_1exnw67Hzh9oIjGva4pJORaz_ROc_k8aXRpjgu9PbMTNj42a79vKK3KMIPHTOadXUzBYpjmPdP5poee9qJrMY50M2mGo2j22QVNTrGwITxtSRLkqmx-AqPz0pfcXtDUhA6-X_Zihh_-w2XSYC36iu44X62V-mePXsU7DLeDobB5T0Hg-e3GVGojXQZ_WjxMbAF6466XHBGpRubsLPUnpbYRfOadGHb3adKTlnAs_8ctit_Zr89n4b6-tUXXtZrMGDAP08jcsKSOVGic9UBvZam-sOEr78MgjizK6C87A75K__Luaev4nAj9IFE_TCnPqQGhYLS_lsUeWaYLckQ8M97oVf-MyHLFllHsCB6KfoOrIxo3F1Upb15lLzAIXfo5h8Y8JBLDqXGxnIvkwD8c11zNhX0IUg31AfgOS6XEz2M0m9qvGPD9XbqLqDqHJHxhR0jvyAiViLE0Eu_6IetZzwDItCEa_YaHYUVRjaRdUpIKs-KHC_4TfC1HX9OXZ0JM7DfV_a8HlpujZ7pHSULiQ8Hbe8u4UuoEfRlCAFZrXQfS_gNCowyqi-Ztge8fuDiieV2Ik-6uBGkcKAgXD47ACPr1Eu-fTw6Y8UK-8Ul2goEnOrVhSRTsz3riHP8MShO4o4xksofYU79Z7YCk-bqCUfylSv5PmXXtzRnbcr8Y1WEQ6dBLVdhwfnVRDuJtYwstDavW1KRIQ8EAe8APmmZUsgC_akqO3LyGeFkguwWg4g6Uf0YjV2-ImMqbMuiBqOs81wK7fpOsEIb550XIVK876onjsJu7OiHJCmV1TIqtY_IU-rBoT29Z3cb5PROerisq_FxjFdyGXkWxTRj3KuVnKdcYb8MLZpqXyabVLQ-ZC5sdmYT9_HDYDNb6XjeZlm5OWFxn0QrOrSbfgb8bvl3IDVJuJ8lGiZcmhAuSf7_My42r3o7xsSjfTlvBG_j2RxxDjCR5gD3Z-9WnjZwFMjdejS0ldNa27FcSvXOqxqDDpeVXPLIJ9lK01DYjD-20F7-p_A1DHXeZ98A3Bf1j0MYXHOuf06m-XcB4G5dWkF-RBi8dN1S2csNGDZ9AAh5ZUVE6s3KWhOmTkXC6dOXKE-RTjHW8RWcjfg8St19B8inGId9EK-7P_hZTlFSrYquDpS9Nr9I2w_1fsLu4d-ioGXX7w_5Hjk7qJrCGk4_e4fu2ycLf2D8RofrmbLeLQeCh4g_gFcOmqi2t2L9pPQd12EWLabgOzclNoaQ3pwbnIzuwlpoQScpbaTqccrnWsGHPfXpfe_DNzFopL-HgUrcPbPjIKRAOIlTg0JYdQjmmk800MZobXkkIW_J9smzLD8qWpAd8Q3A0iEUxbrcpF6Zq4ijyjs_D1YlInu7GtF6ABTe1oub983nH2qKO__6TRvUTxe3XAr0k0jSSG2GXwL4UElfvaYtsnRQTOVBJepJSfUTZimLkA1boxYZ0NfRDNZ8tsvclxSYOccdNsd7zwSxntN9cpXK70LXJSN49GwTnGQ_qOxYKVkc0Wd-11U0X-pfBddX4NrSQ1R389YWx33vng6dvrpTCUfJ7SEjDaoOaavSHzeG3soM26pESrGVPWAc-POc2hBMczHNpg1LE1-Nf22IgU_ZB1Nh3sddAbJtgf8HCYDfBCJCHEFdJv13cpsy6oUvuVG6hj6gEyFptFgBE4OR30Tz4sDXxjmBdl3ReCmFAHqY0mB1rKLRP41aBqS-JJufjIab9eZP2lPMaWBTPSy4=","summary":[{"type":"summary_text","text":"**Designing safe stream unsubscription fix**"},{"type":"summary_text","text":"**Proposing stream attach and cleanup protocols**"}]},{"id":"fc_0365286983a6ba82016a59d625a3d48194b4681210e023ceee","type":"function_call","status":"completed","arguments":"{\"type\":null,\"result\":{\"data\":{\"summary\":\"## Conclusion\\n\\nThe broker's ~532–541 threads are **not legitimate session scaling for 4–6 hosted PTYs**. The dominant mechanism is an unbounded, broker-resident **one-native-thread-per-net-stream-subscriber** lifetime leak. A long-lived peer-pump IPC connection repeatedly subscribes to completed response streams; each subscription creates a `SubscriberSeat` writer thread, but stream EOF only queues an EOF envelope and leaves the seat/channel open. Those threads remain blocked in `rx.recv()` until the entire pump IPC connection closes. The same completed stream rows remain in `NetHost.streams` until their long-lived QUIC connection closes, and the dispatcher asks the broker to enumerate/serialize that growing table every 100 ms. This cleanly separates the observations:\\n\\n- **Thread count:** hundreds of mostly parked `SubscriberSeat` writers; only a few CPU-active threads is expected for this leak.\\n- **Broker CPU and writes:** the active broker connection handler repeatedly executes `dispatch_net_streams` → `stream_infos` → JSON/frame write over an ever-growing stream table.\\n- **Brain reads:** the corresponding brain dispatcher repeatedly receives those oversized `NET_STREAMS_REPLY` frames. Brain-internal routing is outside this assignment, but it is the consumer that makes the broker path hot.\\n\\n### Ranked mechanisms\\n\\n#### 1. Primary — permanent per-stream `SubscriberSeat` writer threads on a long-lived pump carrier\\n\\n**Creation and blocking semantics**\\n\\n- `crates/spt-daemon/src/nethost.rs:142-163` defines `SubscriberSeat`. It stores `sub`, `tx`, `done`, and `poisoned`, but **does not store a `JoinHandle` or cancellation token**.\\n- `crates/spt-daemon/src/nethost.rs:174-224` (`SubscriberSeat::install`) creates a bounded channel and calls `std::thread::spawn` at line 196. After replay, the native thread executes `while let Ok(frame) = rx.recv()` at lines 211-217. With no new data and a live sender, it parks indefinitely.\\n- `crates/spt-daemon/src/nethost.rs:518-559` (`StreamLog::begin_attach`) installs exactly one such seat per current stream subscriber. Replacing a seat sets the prior `subscriber` to `None`, which drops its sender and lets the old thread drain/exit; unique streams do not get this replacement.\\n\\n**Why stream EOF does not end the writer**\\n\\n- `crates/spt-daemon/src/nethost.rs:476-488` (`StreamLog::finish`) marks `finished = true` and enqueues `NetStreamEof`, but deliberately leaves `self.subscriber` populated. After writing the queued EOF, its writer returns to `rx.recv()` forever.\\n- `crates/spt-daemon/src/nethost.rs:443-461` removes a seat only after a producer detects `Poisoned` or queue `Overflow`. A successfully completed, traffic-quiet stream produces neither condition.\\n- The 15-second write bound is irrelevant to these permanent seats: it only bounds a write that fails or wedges. Once the EOF write succeeds, there is no subsequent write to time out.\\n- `crates/spt-daemon/src/nethost.rs:1825-1860` explicitly defines `retire_stream` as visibility retirement, **not teardown**: the entry, send half, subscriber, and pump remain alive. It only sets `retired` and clears the ring.\\n- `crates/spt-daemon/src/nethost.rs:1969-1991` has a detach operation, but it is only invoked by broker-IPC connection cleanup.\\n- `crates/spt-daemon/src/broker.rs:3037-3062` accumulates every successful subscription in `my_stream_subs: Vec<u64>`; `crates/spt-daemon/src/broker.rs:3239-3286` detaches those seats only after the physical brain IPC read loop reaches EOF. There is no `KIND_NET_STREAM_UNSUBSCRIBE` / per-stream unsubscribe command.\\n- `crates/spt-daemon/src/brain.rs:1584-1602` adds every subscription to `Brain.net_cursors`, with no EOF removal path. A search for `net_cursors.remove`, `net_stream_unsubscribe`, or `NET_STREAM_UNSUBSCRIBE` found none.\\n\\n**Why one connection owns hundreds of subscriptions**\\n\\n- `crates/spt-daemon/src/pump/mod.rs:524-553` creates two long-lived pump-mode `Brain` connections: one reused for all peer operations and another for presence.\\n- The main `brain` is retained across the entire `run_peer_pump` loop (`crates/spt-daemon/src/pump/mod.rs:564-758`). Pull-style worker operations open and subscribe response streams through this same carrier. Fire-and-forget `push_feed` streams are also opened repeatedly at `crates/spt-daemon/src/pump/mod.rs:1117-1123`, although those do not themselves install subscriber threads.\\n- The daemon log identifies the carrier. `C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log:404-407` shows the dispatcher/pump generation creating two `pump-ipc-reader`s plus the presence carrier. At line 500, broker connection 137 subscribes stream 50 at monotonic 72,862 ms. Lines 516-520 immediately show the same physical conn 137 accumulating streams 53, 56, 57, 60, and 61. Much later, lines 20230-20290, 21801-21840, and 23724-23728 show the same conn 137 continuing to accumulate new unique subscriptions, through streams 4564–4568 at monotonic ~4,646,279 ms. No `conn=137 ... event=transport-close` was found in the searched live-log range. Conversely, line 377 shows an older pump carrier, conn 12, closing with eight accumulated stream-subscriber labels; that physical close is the event that finally releases its seats.\\n\\n**Scale**\\n\\nLet $S$ be unique completed streams still subscribed by the live pump carrier. This mechanism contributes approximately $S$ native threads. The observed log pattern supports hundreds of unique streams on conn 137. [INFERENCE] A value near $S\\\\approx500$, plus normal session and fixed broker threads, explains the measured 532–541 total extremely closely.\\n\\nThis count is “expected under the current implementation,” but it is not legitimate bounded behavior. It scales with **completed stream history during the pump connection lifetime**, not with active sessions, active streams, or live peers.\\n\\n#### 2. Primary CPU/I/O amplifier — full stream-table serialization at 10 Hz\\n\\nThis is the active counterpart to the parked-thread leak.\\n\\n- `crates/spt-daemon/src/dispatch.rs:87` sets `DEFAULT_DISPATCH_POLL = 100 ms`.\\n- `crates/spt-daemon/src/dispatch.rs:429-471` retains one dispatcher `Brain` and calls `brain.net_streams()` each loop. Only **after receiving the complete reply** does it skip locally initiated rows at lines 464-466.\\n- `crates/spt-daemon/src/broker.rs:4365-4377` handles every request by constructing `NetStreamsReply { streams: host.stream_infos() }`, JSON-serializing it, and writing the frame.\\n- `crates/spt-daemon/src/nethost.rs:1794-1824` locks the entire stream map, iterates every entry, locks every non-retired entry log, clones `remote_id_hex`, builds a `Vec<NetStreamInfo>`, and includes locally initiated rows. The receiver's later `initiated_locally` filter does not save broker enumeration, allocation, serialization, or IPC traffic.\\n- `crates/spt-daemon/src/nethost.rs:954-967` removes stream rows only when the **physical QUIC connection** closes. A clean per-stream finish does not remove its row. A live peer connection therefore accumulates completed local pump streams indefinitely.\\n- Dispatcher retirement at `crates/spt-daemon/src/dispatch.rs:506-514` applies only after a dispatcher worker serves a peer-initiated row. Locally initiated pump rows are skipped before worker creation, so this path does not retire them.\\n- Even retired inbound rows remain in the backing map and are scanned by the `retired` filter; retirement only keeps them out of the serialized result.\\n\\n[INFERENCE] Thousands of retained `NetStreamInfo` records serialized about ten times per second are the strongest broker-side explanation for the measured small number of CPU-active threads and 3.74 MiB/s broker writes. The parked seat threads themselves do not continuously consume CPU or write bytes.\\n\\n#### 3. Normal per-session PTY/thread budget — far too small to explain ~537\\n\\nFor a live hosted session, broker production paths create:\\n\\n1. **PTY input writer:** `crates/spt-daemon/src/broker.rs:1788-1794`; blocks on the input channel or PTY write. It exits when the final sender drops (`input_writer`, lines 1840-1846).\\n2. **PTY output drain:** `crates/spt-term/src/reader.rs:114-153`; blocks in `reader.read`, exits on EOF/error or after a returned read observes the stop flag.\\n3. **Child exit waiter:** `crates/spt-daemon/src/broker.rs:3430-3464`; blocks in `PtySession::wait`, sends `Exit`, stamps reaped, then removes the session.\\n4. **Current controller writer:** spawned at `crates/spt-daemon/src/broker.rs:947-950`; blocks on its bounded channel or a bounded broker-IPC write. Dropping/replacing/detaching the controller drops its sender; its loop exits at `crates/spt-daemon/src/broker.rs:1608-1623`.\\n5. **One thread per viewer:** spawned at `crates/spt-daemon/src/broker.rs:1137-1139`; exits on channel close or write failure (`crates/spt-daemon/src/broker.rs:1410-1468`). `MAX_VIEWERS = 32` per session at `broker.rs:100-103`, so this class is explicitly bounded and would be visible as high viewer counts.\\n6. **Optional translation pair:** one stdout reader at `crates/spt-daemon/src/translation.rs:273-291`, plus one supervised inject worker at `crates/spt-daemon/src/broker.rs:1991-2004`. The worker exits when `event_tx` closes and terminates/reaps the child (`broker.rs:2484-2486`); `TranslationChild::terminate` is bounded and `Drop` calls it (`translation.rs:327-367`).\\n\\nThus, with no viewers, $N$ live sessions contribute roughly $4N+2T$ threads, where $T\\\\le N$ is the number with translation binaries. Six fully translated sessions are approximately 36 threads. Even pathological viewer use is capped at $32N$ and requires actual viewer attachments. PTY/session threads cannot naturally produce ~537 from 4–6 ordinary hosted sessions.\\n\\n#### 4. Secondary real leak risk — PTY `Drain` teardown contract is not wired into `HostedSession`\\n\\nThis is not needed to explain the current count, but it is a concrete missing cancellation/reap path.\\n\\n- `crates/spt-term/src/reader.rs:11-18` states that ConPTY does not EOF while its writer is held and says deterministic teardown is the broker's responsibility.\\n- `Drain::request_stop` at `reader.rs:87-93` is cooperative only; it does not interrupt a blocked read. `Drain::join` at lines 95-103 waits for the read to unblock.\\n- The drain thread itself owns a `SharedWriter` clone (`reader.rs:114-150`).\\n- `HostedSession` holds `drain: Drain` at `crates/spt-daemon/src/broker.rs:1696-1701`, with a comment saying it is kept for teardown, but there is no `Drop for HostedSession` and no `Drop for Drain`. Searches for both implementations returned no matches.\\n- The exit waiter removes the `HostedSession` from the map at `broker.rs:3463`, but does not call `request_stop` or `join`. Dropping the `JoinHandle` merely detaches the thread.\\n\\n[INFERENCE] On Windows, a naturally exited historical session can therefore leave one output-drain thread blocked in `ReadFile` if the remaining writer clone prevents EOF. A blocked input writer is a related risk: channel closure cannot interrupt it mid-`write_input`, although killing/tearing down the child should normally make that write return. This mechanism scales with historical session exits, not current session count; the conn-137 one-thread-per-subscription evidence is a much tighter match to the current field count.\\n\\n#### 5. Normal per-connection threads — two per live broker IPC connection, not hundreds\\n\\n- `crates/spt-daemon/src/broker.rs:2786-2799` spawns one unnamed handler thread per accepted local broker IPC connection.\\n- `crates/spt-daemon/src/conn.rs:429-453` creates one explicitly named `conn-watchdog` thread inside every `BrokerConn`.\\n- The handler blocks in `read_frame`; EOF runs the detach loop and returns (`broker.rs:3037-3286`).\\n- `BrokerConn::drop` sets watchdog shutdown, notifies it, joins it, and only then drops raw transport handles (`crates/spt-daemon/src/conn.rs:639-660`). This is a complete normal reap path.\\n\\nA long-lived client contributes one handler plus one watchdog regardless of whether it owns 1 or 500 subscriber seats. Fresh short-lived command/worker connections cause transient pairs, but the log repeatedly shows their `transport-close` events. Hundreds of watchdogs/handlers would require hundreds of simultaneously open physical IPC connections; that is falsified if `conn_handler_count` remains small. The source exposes `Broker::conn_handler_count` at `broker.rs:2922-2924` for tests/introspection.\\n\\n#### 6. Network stream pumps are Tokio tasks, not one OS thread per stream\\n\\n- `crates/spt-daemon/src/nethost.rs:980-991` spawns an async inbound-stream accept task.\\n- `nethost.rs:1000-1064` registers each stream and spawns one async read-pump task.\\n- `nethost.rs:1184-1190` creates a fixed two-worker runtime named `spt-broker-net`.\\n\\nThousands of stream tasks can add map/task/memory overhead, but they do not directly explain ~500 OS threads. The native per-stream threads come from `SubscriberSeat::install`, not `tokio::spawn`.\\n\\n## Safe, falsifiable live probes\\n\\n### Probe A — correlate native thread growth with unique conn-137 subscriptions\\n\\nThis is passive: it reads process counters and the existing daemon log; it neither writes to the broker nor stops a hosted session. Use an interval long enough to cross a registry/pump cadence (for example 75 seconds):\\n\\n```powershell\\n$brokerPid = 72488\\n$log = \\\"$env:LOCALAPPDATA\\\\spt-core\\\\logs\\\\daemon.stderr.log\\\"\\n\\nfunction Snapshot {\\n    $ids = foreach ($m in Select-String -Path $log -Pattern 'CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach stream=(\\\\d+)') {\\n        if ($m.Line -match 'event=stream-sub-attach stream=(\\\\d+)') { [uint64]$Matches[1] }\\n    }\\n    $p = Get-Process -Id $brokerPid\\n    [pscustomobject]@{\\n        At                  = Get-Date\\n        Threads             = $p.Threads.Count\\n        CpuSeconds          = $p.CPU\\n        UniqueConn137Seats  = @($ids | Sort-Object -Unique).Count\\n        Conn137Closed       = @(Select-String -Path $log -Pattern 'CONN_LIFECYCLE: conn=137 .*event=transport-close').Count\\n    }\\n}\\n\\n$a = Snapshot\\nStart-Sleep -Seconds 75\\n$b = Snapshot\\n$a\\n$b\\n[pscustomobject]@{\\n    ThreadDelta = $b.Threads - $a.Threads\\n    SeatDelta   = $b.UniqueConn137Seats - $a.UniqueConn137Seats\\n    CpuDelta    = $b.CpuSeconds - $a.CpuSeconds\\n}\\n```\\n\\nPredictions:\\n\\n- **Subscriber-thread leak confirmed:** while conn 137 remains open, `ThreadDelta` tracks `SeatDelta` approximately 1:1. Small noise comes from transient connection handlers/watchdogs.\\n- **Hypothesis falsified:** unique conn-137 subscriptions increase but total threads remain flat or fall promptly after each EOF.\\n- **Connection leak instead:** thread count rises roughly two per new connection ID, with those IDs lacking `transport-close`, while `SeatDelta` stays flat.\\n- **Normal steady state:** session/viewer/connection counts and total threads remain bounded across several pump rounds.\\n\\n### Probe B — identify the four CPU-active threads and hot broker stack without suspending the process\\n\\nA short WPR ETW sample is non-terminating and does not disconnect sessions:\\n\\n```powershell\\nwpr -start GeneralProfile -filemode\\nStart-Sleep -Seconds 15\\nwpr -stop \\\"$env:TEMP\\\\spt-broker-72488.etl\\\"\\n```\\n\\nIn Windows Performance Analyzer, filter **CPU Usage (Sampled)** and process/thread activity to PID 72488. The primary prediction is a hot handler stack containing the equivalents of:\\n\\n`Broker::dispatch_net_streams` → `NetHost::stream_infos` → `serde_json` / frame encoding → named-pipe write,\\n\\nrepeating at roughly the 100 ms dispatcher cadence. If the samples instead concentrate in PTY read/write loops or subscriber writers, the table-enumeration explanation is falsified. Also inspect context-switch/wait data: hundreds of subscriber threads should be parked in Rust `mpsc::Receiver::recv`, not accumulating CPU.\\n\\n### Probe C — distinguish the PTY drain leak without stopping a session\\n\\nWait for a session that exits naturally; sample `Get-Process -Id 72488` thread count and the broker session count immediately before and after. The expected healthy reduction is its input writer, drain, waiter, controller, and optional translation threads. If the session row disappears but one thread remains permanently blocked in the PTY/`ReadFile` path, the missing `Drain` teardown is confirmed. Do not kill an existing hosted session merely to run this probe.\\n\\n## Safe source-level remediation directions\\n\\n1. **End a seat at stream EOF:** after queuing the final EOF, drop/take the seat sender so the writer drains the EOF and exits. The already-finished attach case also needs a one-shot replay seat whose sender closes immediately after installation. This fixes the thread leak without closing the shared pump IPC carrier.\\n2. **Add explicit stream completion ownership:** on the consumer's observed EOF, retire/remove the corresponding cursor and tell the broker it no longer needs the subscription. This also bounds `my_stream_subs` on a long-lived carrier.\\n3. **Bound stream row lifetime:** remove a stream only after both transport halves are terminal and no in-flight reply send can race removal. Current `retire_stream` explicitly avoids teardown because of that race, so blindly changing it to immediate removal would be unsafe.\\n4. **Do not send locally initiated history to the dispatcher:** at minimum, broker-side enumeration should exclude `initiated_locally` before allocation/serialization; better, completed rows should leave the map. Merely filtering in `dispatch.rs` is too late.\\n5. **Implement deterministic `HostedSession`/`Drain` teardown:** terminate/reap the child, close input/writer ownership in the required order, request stop, then join the drain. A stop flag alone cannot interrupt ConPTY's blocked read.\",\"files\":[{\"path\":\"crates/spt-daemon/src/nethost.rs\",\"description\":\"Primary root. `SubscriberSeat::install` spawns one native writer per stream subscription (lines 174-224); `StreamLog::finish` queues EOF but retains the seat (476-488); `stream_infos` scans and clones every non-retired row (1794-1824); retirement explicitly retains subscriber/pump/entry (1825-1860); physical connection close is the stream-table removal path (954-967).\"},{\"path\":\"crates/spt-daemon/src/broker.rs\",\"description\":\"Broker IPC ownership. Accept loop spawns one handler per connection (2786-2799); each handler accumulates `my_stream_subs` and detaches only at connection EOF (3037-3286). `dispatch_net_streams` serializes the entire `stream_infos` result (4365-4377). Session production threads are controller (947-950), viewer (1137-1139), input writer (1788-1794), inject worker (1991-2004), and exit waiter (3430-3464). `HostedSession` owns a Drain but has no teardown Drop (1675-1735).\"},{\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"description\":\"The dispatcher retains a broker client and polls `net_streams` every 100 ms (line 87; loop 429-471). It filters locally initiated streams only after the broker has enumerated, allocated, serialized, and written them (464-466). Worker completion retirement applies to served peer-initiated rows (506-514).\"},{\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"description\":\"Shows the long-lived pump carrier ownership: two pump-mode Brain connections are created once and retained across all rounds (524-553, 564-758). Repeated stream operations therefore share one physical broker IPC carrier; `push_feed` opens additional one-purpose streams (1117-1123).\"},{\"path\":\"crates/spt-daemon/src/brain.rs\",\"description\":\"`Brain::net_stream_subscribe` inserts stream cursors and sends subscribe requests (1584-1602), with no EOF cursor removal or unsubscribe operation. Pump mode creates one named `pump-ipc-reader` per pump carrier (230-252), which is brain-process—not broker-process—threading.\"},{\"path\":\"crates/spt-daemon/src/conn.rs\",\"description\":\"One `conn-watchdog` thread per physical broker IPC connection is created at 429-453. `BrokerConn::drop` shuts down and joins it at 639-660, so this class is bounded by live connections and has an explicit reap path.\"},{\"path\":\"crates/spt-term/src/reader.rs\",\"description\":\"PTY output Drain thread creation and teardown contract. ConPTY no-EOF-while-writer-held is documented at lines 11-18; request_stop is cooperative and join waits for read to unblock (87-103); the thread owns the writer and blocks in read (114-153). No Drop implementation exists.\"},{\"path\":\"crates/spt-term/src/pty.rs\",\"description\":\"PTY session owns child, master, reader, and shared writer. Child wait/kill semantics are at 195-225; these resources must be ordered correctly to unblock the Drain on Windows.\"},{\"path\":\"crates/spt-daemon/src/translation.rs\",\"description\":\"Optional per-session translation stdout reader is spawned at 273-291. `terminate` closes stdin, waits boundedly, kills, reaps, and is called from Drop (327-367), so this class has a concrete child reap path.\"},{\"path\":\"crates/spt-daemon/src/daemon.rs\",\"description\":\"Starts the single broker serve thread and fixed daemon-lifetime service loops (broker at 192-195; digest/drive/tunnel and conditional net retry/autostart in the surrounding 185-315 range). These are O(1), not per stream or per session.\"},{\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"description\":\"Live field evidence. Conn 137 begins stream subscriptions at line 500 and accumulates multiple stream tags immediately at lines 516-520; the same physical conn continues subscribing at lines 20230-20290, 21801-21840, and 23724-23728. Conn 12 closes with accumulated subscriber tags at line 377, demonstrating physical-connection-scoped cleanup.\"}],\"architecture\":\"```mermaid\\nflowchart LR\\n  Pump[Brain peer pump\\\\nlong-lived Brain carrier] -->|many NET_STREAM_SUBSCRIBE requests| Handler[Broker handle_conn\\\\n1 handler thread]\\n  Handler -->|SharedSend + stream id| Log[StreamLog per NetHost StreamEntry]\\n  Log -->|SubscriberSeat::install| Seat[1 native writer thread\\\\nreplay then rx.recv forever]\\n  Peer[Long-lived QUIC peer conn] --> Entry[StreamEntry table]\\n  Entry --> Log\\n  Peer -->|per-stream EOF| Finish[StreamLog::finish]\\n  Finish -->|queues EOF only| Seat\\n  Finish -. no seat drop .-> Leak[parked seat retained]\\n  Peer -. only physical conn close .-> Sweep[conn-close sweep]\\n  Sweep -->|remove all conn rows| Entry\\n  Pump -. only IPC carrier EOF .-> Detach[handle_conn detach loop]\\n  Detach -->|drop seat sender| Seat\\n\\n  Dispatcher[Dispatcher Brain\\\\n100 ms poll] -->|NET_STREAMS| Handler\\n  Handler --> Enumerate[stream_infos\\\\nscan map + clone rows]\\n  Enumerate --> Serialize[JSON serialize + IPC write]\\n  Serialize --> Dispatcher\\n  Entry -->|completed local rows retained| Enumerate\\n\\n  Session[Hosted PTY session] --> Input[Input writer thread]\\n  Session --> Drain[PTY Drain thread]\\n  Session --> Waiter[Child waiter thread]\\n  Session --> Controller[Controller writer thread]\\n  Session --> Viewer[0..32 viewer writers]\\n  Session --> Translation[optional reader + inject worker]\\n  Waiter -->|child exit; remove map row| DropSession[HostedSession dropped]\\n  DropSession -. missing request_stop/join .-> Drain\\n```\\n\\nThread-count model for the broker process is approximately:\\n\\n$$T \\\\approx T_{fixed} + 2C_{ipc} + S_{stream\\\\ subscribers} + 4N_{sessions} + V_{viewers} + 2T_{translations} + T_{transient}$$\\n\\nwhere the pathological unbounded term is $S_{stream\\\\ subscribers}$. For 4–6 sessions, ordinary session terms are tens of threads; the observed hundreds require subscriber history, many leaked IPC connections, maximal viewers, historical PTY drains, or a combination. The conn-137 lifecycle evidence specifically selects the subscriber-history mechanism. The active hot path is separate: one/few handler/runtime threads repeatedly scan and serialize the retained stream table, explaining why only about four threads consume CPU while roughly 500 remain parked.\"}}}","call_id":"call_dFynY6XNQ5IKKpWHsma0zMNq","name":"yield"}]},"duration":184168.79719999433,"ttft":1961.446799993515,"contextSnapshot":{"promptTokens":146868,"nonMessageTokens":15464}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_dFynY6XNQ5IKKpWHsma0zMNq|fc_0365286983a6ba82016a59d625a3d48194b4681210e023ceee","toolName":"yield","startedAt":"2026-07-17T07:15:50.012Z"},"id":"1863f588","parentId":"26febf95","timestamp":"2026-07-17T07:15:50.012Z"}
{"type":"message","id":"a04d396d","parentId":"1863f588","timestamp":"2026-07-17T07:15:50.013Z","message":{"role":"toolResult","toolCallId":"call_dFynY6XNQ5IKKpWHsma0zMNq|fc_0365286983a6ba82016a59d625a3d48194b4681210e023ceee","toolName":"yield","content":[{"type":"text","text":"Result submitted."}],"details":{"data":{"summary":"## Conclusion\n\nThe broker's ~532–541 threads are **not legitimate session scaling for 4–6 hosted PTYs**. The dominant mechanism is an unbounded, broker-resident **one-native-thread-per-net-stream-subscriber** lifetime leak. A long-lived peer-pump IPC connection repeatedly subscribes to completed response streams; each subscription creates a `SubscriberSeat` writer thread, but stream EOF only queues an EOF envelope and leaves the seat/channel open. Those threads remain blocked in `rx.recv()` until the entire pump IPC connection closes. The same completed stream rows remain in `NetHost.streams` until their long-lived QUIC connection closes, and the dispatcher asks the broker to enumerate/serialize that growing table every 100 ms. This cleanly separates the observations:\n\n- **Thread count:** hundreds of mostly parked `SubscriberSeat` writers; only a few CPU-active threads is expected for this leak.\n- **Broker CPU and writes:** the active broker connection handler repeatedly executes `dispatch_net_streams` → `stream_infos` → JSON/frame write over an ever-growing stream table.\n- **Brain reads:** the corresponding brain dispatcher repeatedly receives those oversized `NET_STREAMS_REPLY` frames. Brain-internal routing is outside this assignment, but it is the consumer that makes the broker path hot.\n\n### Ranked mechanisms\n\n#### 1. Primary — permanent per-stream `SubscriberSeat` writer threads on a long-lived pump carrier\n\n**Creation and blocking semantics**\n\n- `crates/spt-daemon/src/nethost.rs:142-163` defines `SubscriberSeat`. It stores `sub`, `tx`, `done`, and `poisoned`, but **does not store a `JoinHandle` or cancellation token**.\n- `crates/spt-daemon/src/nethost.rs:174-224` (`SubscriberSeat::install`) creates a bounded channel and calls `std::thread::spawn` at line 196. After replay, the native thread executes `while let Ok(frame) = rx.recv()` at lines 211-217. With no new data and a live sender, it parks indefinitely.\n- `crates/spt-daemon/src/nethost.rs:518-559` (`StreamLog::begin_attach`) installs exactly one such seat per current stream subscriber. Replacing a seat sets the prior `subscriber` to `None`, which drops its sender and lets the old thread drain/exit; unique streams do not get this replacement.\n\n**Why stream EOF does not end the writer**\n\n- `crates/spt-daemon/src/nethost.rs:476-488` (`StreamLog::finish`) marks `finished = true` and enqueues `NetStreamEof`, but deliberately leaves `self.subscriber` populated. After writing the queued EOF, its writer returns to `rx.recv()` forever.\n- `crates/spt-daemon/src/nethost.rs:443-461` removes a seat only after a producer detects `Poisoned` or queue `Overflow`. A successfully completed, traffic-quiet stream produces neither condition.\n- The 15-second write bound is irrelevant to these permanent seats: it only bounds a write that fails or wedges. Once the EOF write succeeds, there is no subsequent write to time out.\n- `crates/spt-daemon/src/nethost.rs:1825-1860` explicitly defines `retire_stream` as visibility retirement, **not teardown**: the entry, send half, subscriber, and pump remain alive. It only sets `retired` and clears the ring.\n- `crates/spt-daemon/src/nethost.rs:1969-1991` has a detach operation, but it is only invoked by broker-IPC connection cleanup.\n- `crates/spt-daemon/src/broker.rs:3037-3062` accumulates every successful subscription in `my_stream_subs: Vec<u64>`; `crates/spt-daemon/src/broker.rs:3239-3286` detaches those seats only after the physical brain IPC read loop reaches EOF. There is no `KIND_NET_STREAM_UNSUBSCRIBE` / per-stream unsubscribe command.\n- `crates/spt-daemon/src/brain.rs:1584-1602` adds every subscription to `Brain.net_cursors`, with no EOF removal path. A search for `net_cursors.remove`, `net_stream_unsubscribe`, or `NET_STREAM_UNSUBSCRIBE` found none.\n\n**Why one connection owns hundreds of subscriptions**\n\n- `crates/spt-daemon/src/pump/mod.rs:524-553` creates two long-lived pump-mode `Brain` connections: one reused for all peer operations and another for presence.\n- The main `brain` is retained across the entire `run_peer_pump` loop (`crates/spt-daemon/src/pump/mod.rs:564-758`). Pull-style worker operations open and subscribe response streams through this same carrier. Fire-and-forget `push_feed` streams are also opened repeatedly at `crates/spt-daemon/src/pump/mod.rs:1117-1123`, although those do not themselves install subscriber threads.\n- The daemon log identifies the carrier. `C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log:404-407` shows the dispatcher/pump generation creating two `pump-ipc-reader`s plus the presence carrier. At line 500, broker connection 137 subscribes stream 50 at monotonic 72,862 ms. Lines 516-520 immediately show the same physical conn 137 accumulating streams 53, 56, 57, 60, and 61. Much later, lines 20230-20290, 21801-21840, and 23724-23728 show the same conn 137 continuing to accumulate new unique subscriptions, through streams 4564–4568 at monotonic ~4,646,279 ms. No `conn=137 ... event=transport-close` was found in the searched live-log range. Conversely, line 377 shows an older pump carrier, conn 12, closing with eight accumulated stream-subscriber labels; that physical close is the event that finally releases its seats.\n\n**Scale**\n\nLet $S$ be unique completed streams still subscribed by the live pump carrier. This mechanism contributes approximately $S$ native threads. The observed log pattern supports hundreds of unique streams on conn 137. [INFERENCE] A value near $S\\approx500$, plus normal session and fixed broker threads, explains the measured 532–541 total extremely closely.\n\nThis count is “expected under the current implementation,” but it is not legitimate bounded behavior. It scales with **completed stream history during the pump connection lifetime**, not with active sessions, active streams, or live peers.\n\n#### 2. Primary CPU/I/O amplifier — full stream-table serialization at 10 Hz\n\nThis is the active counterpart to the parked-thread leak.\n\n- `crates/spt-daemon/src/dispatch.rs:87` sets `DEFAULT_DISPATCH_POLL = 100 ms`.\n- `crates/spt-daemon/src/dispatch.rs:429-471` retains one dispatcher `Brain` and calls `brain.net_streams()` each loop. Only **after receiving the complete reply** does it skip locally initiated rows at lines 464-466.\n- `crates/spt-daemon/src/broker.rs:4365-4377` handles every request by constructing `NetStreamsReply { streams: host.stream_infos() }`, JSON-serializing it, and writing the frame.\n- `crates/spt-daemon/src/nethost.rs:1794-1824` locks the entire stream map, iterates every entry, locks every non-retired entry log, clones `remote_id_hex`, builds a `Vec<NetStreamInfo>`, and includes locally initiated rows. The receiver's later `initiated_locally` filter does not save broker enumeration, allocation, serialization, or IPC traffic.\n- `crates/spt-daemon/src/nethost.rs:954-967` removes stream rows only when the **physical QUIC connection** closes. A clean per-stream finish does not remove its row. A live peer connection therefore accumulates completed local pump streams indefinitely.\n- Dispatcher retirement at `crates/spt-daemon/src/dispatch.rs:506-514` applies only after a dispatcher worker serves a peer-initiated row. Locally initiated pump rows are skipped before worker creation, so this path does not retire them.\n- Even retired inbound rows remain in the backing map and are scanned by the `retired` filter; retirement only keeps them out of the serialized result.\n\n[INFERENCE] Thousands of retained `NetStreamInfo` records serialized about ten times per second are the strongest broker-side explanation for the measured small number of CPU-active threads and 3.74 MiB/s broker writes. The parked seat threads themselves do not continuously consume CPU or write bytes.\n\n#### 3. Normal per-session PTY/thread budget — far too small to explain ~537\n\nFor a live hosted session, broker production paths create:\n\n1. **PTY input writer:** `crates/spt-daemon/src/broker.rs:1788-1794`; blocks on the input channel or PTY write. It exits when the final sender drops (`input_writer`, lines 1840-1846).\n2. **PTY output drain:** `crates/spt-term/src/reader.rs:114-153`; blocks in `reader.read`, exits on EOF/error or after a returned read observes the stop flag.\n3. **Child exit waiter:** `crates/spt-daemon/src/broker.rs:3430-3464`; blocks in `PtySession::wait`, sends `Exit`, stamps reaped, then removes the session.\n4. **Current controller writer:** spawned at `crates/spt-daemon/src/broker.rs:947-950`; blocks on its bounded channel or a bounded broker-IPC write. Dropping/replacing/detaching the controller drops its sender; its loop exits at `crates/spt-daemon/src/broker.rs:1608-1623`.\n5. **One thread per viewer:** spawned at `crates/spt-daemon/src/broker.rs:1137-1139`; exits on channel close or write failure (`crates/spt-daemon/src/broker.rs:1410-1468`). `MAX_VIEWERS = 32` per session at `broker.rs:100-103`, so this class is explicitly bounded and would be visible as high viewer counts.\n6. **Optional translation pair:** one stdout reader at `crates/spt-daemon/src/translation.rs:273-291`, plus one supervised inject worker at `crates/spt-daemon/src/broker.rs:1991-2004`. The worker exits when `event_tx` closes and terminates/reaps the child (`broker.rs:2484-2486`); `TranslationChild::terminate` is bounded and `Drop` calls it (`translation.rs:327-367`).\n\nThus, with no viewers, $N$ live sessions contribute roughly $4N+2T$ threads, where $T\\le N$ is the number with translation binaries. Six fully translated sessions are approximately 36 threads. Even pathological viewer use is capped at $32N$ and requires actual viewer attachments. PTY/session threads cannot naturally produce ~537 from 4–6 ordinary hosted sessions.\n\n#### 4. Secondary real leak risk — PTY `Drain` teardown contract is not wired into `HostedSession`\n\nThis is not needed to explain the current count, but it is a concrete missing cancellation/reap path.\n\n- `crates/spt-term/src/reader.rs:11-18` states that ConPTY does not EOF while its writer is held and says deterministic teardown is the broker's responsibility.\n- `Drain::request_stop` at `reader.rs:87-93` is cooperative only; it does not interrupt a blocked read. `Drain::join` at lines 95-103 waits for the read to unblock.\n- The drain thread itself owns a `SharedWriter` clone (`reader.rs:114-150`).\n- `HostedSession` holds `drain: Drain` at `crates/spt-daemon/src/broker.rs:1696-1701`, with a comment saying it is kept for teardown, but there is no `Drop for HostedSession` and no `Drop for Drain`. Searches for both implementations returned no matches.\n- The exit waiter removes the `HostedSession` from the map at `broker.rs:3463`, but does not call `request_stop` or `join`. Dropping the `JoinHandle` merely detaches the thread.\n\n[INFERENCE] On Windows, a naturally exited historical session can therefore leave one output-drain thread blocked in `ReadFile` if the remaining writer clone prevents EOF. A blocked input writer is a related risk: channel closure cannot interrupt it mid-`write_input`, although killing/tearing down the child should normally make that write return. This mechanism scales with historical session exits, not current session count; the conn-137 one-thread-per-subscription evidence is a much tighter match to the current field count.\n\n#### 5. Normal per-connection threads — two per live broker IPC connection, not hundreds\n\n- `crates/spt-daemon/src/broker.rs:2786-2799` spawns one unnamed handler thread per accepted local broker IPC connection.\n- `crates/spt-daemon/src/conn.rs:429-453` creates one explicitly named `conn-watchdog` thread inside every `BrokerConn`.\n- The handler blocks in `read_frame`; EOF runs the detach loop and returns (`broker.rs:3037-3286`).\n- `BrokerConn::drop` sets watchdog shutdown, notifies it, joins it, and only then drops raw transport handles (`crates/spt-daemon/src/conn.rs:639-660`). This is a complete normal reap path.\n\nA long-lived client contributes one handler plus one watchdog regardless of whether it owns 1 or 500 subscriber seats. Fresh short-lived command/worker connections cause transient pairs, but the log repeatedly shows their `transport-close` events. Hundreds of watchdogs/handlers would require hundreds of simultaneously open physical IPC connections; that is falsified if `conn_handler_count` remains small. The source exposes `Broker::conn_handler_count` at `broker.rs:2922-2924` for tests/introspection.\n\n#### 6. Network stream pumps are Tokio tasks, not one OS thread per stream\n\n- `crates/spt-daemon/src/nethost.rs:980-991` spawns an async inbound-stream accept task.\n- `nethost.rs:1000-1064` registers each stream and spawns one async read-pump task.\n- `nethost.rs:1184-1190` creates a fixed two-worker runtime named `spt-broker-net`.\n\nThousands of stream tasks can add map/task/memory overhead, but they do not directly explain ~500 OS threads. The native per-stream threads come from `SubscriberSeat::install`, not `tokio::spawn`.\n\n## Safe, falsifiable live probes\n\n### Probe A — correlate native thread growth with unique conn-137 subscriptions\n\nThis is passive: it reads process counters and the existing daemon log; it neither writes to the broker nor stops a hosted session. Use an interval long enough to cross a registry/pump cadence (for example 75 seconds):\n\n```powershell\n$brokerPid = 72488\n$log = \"$env:LOCALAPPDATA\\spt-core\\logs\\daemon.stderr.log\"\n\nfunction Snapshot {\n    $ids = foreach ($m in Select-String -Path $log -Pattern 'CONN_LIFECYCLE: conn=137 .*event=stream-sub-attach stream=(\\d+)') {\n        if ($m.Line -match 'event=stream-sub-attach stream=(\\d+)') { [uint64]$Matches[1] }\n    }\n    $p = Get-Process -Id $brokerPid\n    [pscustomobject]@{\n        At                  = Get-Date\n        Threads             = $p.Threads.Count\n        CpuSeconds          = $p.CPU\n        UniqueConn137Seats  = @($ids | Sort-Object -Unique).Count\n        Conn137Closed       = @(Select-String -Path $log -Pattern 'CONN_LIFECYCLE: conn=137 .*event=transport-close').Count\n    }\n}\n\n$a = Snapshot\nStart-Sleep -Seconds 75\n$b = Snapshot\n$a\n$b\n[pscustomobject]@{\n    ThreadDelta = $b.Threads - $a.Threads\n    SeatDelta   = $b.UniqueConn137Seats - $a.UniqueConn137Seats\n    CpuDelta    = $b.CpuSeconds - $a.CpuSeconds\n}\n```\n\nPredictions:\n\n- **Subscriber-thread leak confirmed:** while conn 137 remains open, `ThreadDelta` tracks `SeatDelta` approximately 1:1. Small noise comes from transient connection handlers/watchdogs.\n- **Hypothesis falsified:** unique conn-137 subscriptions increase but total threads remain flat or fall promptly after each EOF.\n- **Connection leak instead:** thread count rises roughly two per new connection ID, with those IDs lacking `transport-close`, while `SeatDelta` stays flat.\n- **Normal steady state:** session/viewer/connection counts and total threads remain bounded across several pump rounds.\n\n### Probe B — identify the four CPU-active threads and hot broker stack without suspending the process\n\nA short WPR ETW sample is non-terminating and does not disconnect sessions:\n\n```powershell\nwpr -start GeneralProfile -filemode\nStart-Sleep -Seconds 15\nwpr -stop \"$env:TEMP\\spt-broker-72488.etl\"\n```\n\nIn Windows Performance Analyzer, filter **CPU Usage (Sampled)** and process/thread activity to PID 72488. The primary prediction is a hot handler stack containing the equivalents of:\n\n`Broker::dispatch_net_streams` → `NetHost::stream_infos` → `serde_json` / frame encoding → named-pipe write,\n\nrepeating at roughly the 100 ms dispatcher cadence. If the samples instead concentrate in PTY read/write loops or subscriber writers, the table-enumeration explanation is falsified. Also inspect context-switch/wait data: hundreds of subscriber threads should be parked in Rust `mpsc::Receiver::recv`, not accumulating CPU.\n\n### Probe C — distinguish the PTY drain leak without stopping a session\n\nWait for a session that exits naturally; sample `Get-Process -Id 72488` thread count and the broker session count immediately before and after. The expected healthy reduction is its input writer, drain, waiter, controller, and optional translation threads. If the session row disappears but one thread remains permanently blocked in the PTY/`ReadFile` path, the missing `Drain` teardown is confirmed. Do not kill an existing hosted session merely to run this probe.\n\n## Safe source-level remediation directions\n\n1. **End a seat at stream EOF:** after queuing the final EOF, drop/take the seat sender so the writer drains the EOF and exits. The already-finished attach case also needs a one-shot replay seat whose sender closes immediately after installation. This fixes the thread leak without closing the shared pump IPC carrier.\n2. **Add explicit stream completion ownership:** on the consumer's observed EOF, retire/remove the corresponding cursor and tell the broker it no longer needs the subscription. This also bounds `my_stream_subs` on a long-lived carrier.\n3. **Bound stream row lifetime:** remove a stream only after both transport halves are terminal and no in-flight reply send can race removal. Current `retire_stream` explicitly avoids teardown because of that race, so blindly changing it to immediate removal would be unsafe.\n4. **Do not send locally initiated history to the dispatcher:** at minimum, broker-side enumeration should exclude `initiated_locally` before allocation/serialization; better, completed rows should leave the map. Merely filtering in `dispatch.rs` is too late.\n5. **Implement deterministic `HostedSession`/`Drain` teardown:** terminate/reap the child, close input/writer ownership in the required order, request stop, then join the drain. A stop flag alone cannot interrupt ConPTY's blocked read.","files":[{"path":"crates/spt-daemon/src/nethost.rs","description":"Primary root. `SubscriberSeat::install` spawns one native writer per stream subscription (lines 174-224); `StreamLog::finish` queues EOF but retains the seat (476-488); `stream_infos` scans and clones every non-retired row (1794-1824); retirement explicitly retains subscriber/pump/entry (1825-1860); physical connection close is the stream-table removal path (954-967)."},{"path":"crates/spt-daemon/src/broker.rs","description":"Broker IPC ownership. Accept loop spawns one handler per connection (2786-2799); each handler accumulates `my_stream_subs` and detaches only at connection EOF (3037-3286). `dispatch_net_streams` serializes the entire `stream_infos` result (4365-4377). Session production threads are controller (947-950), viewer (1137-1139), input writer (1788-1794), inject worker (1991-2004), and exit waiter (3430-3464). `HostedSession` owns a Drain but has no teardown Drop (1675-1735)."},{"path":"crates/spt-daemon/src/dispatch.rs","description":"The dispatcher retains a broker client and polls `net_streams` every 100 ms (line 87; loop 429-471). It filters locally initiated streams only after the broker has enumerated, allocated, serialized, and written them (464-466). Worker completion retirement applies to served peer-initiated rows (506-514)."},{"path":"crates/spt-daemon/src/pump/mod.rs","description":"Shows the long-lived pump carrier ownership: two pump-mode Brain connections are created once and retained across all rounds (524-553, 564-758). Repeated stream operations therefore share one physical broker IPC carrier; `push_feed` opens additional one-purpose streams (1117-1123)."},{"path":"crates/spt-daemon/src/brain.rs","description":"`Brain::net_stream_subscribe` inserts stream cursors and sends subscribe requests (1584-1602), with no EOF cursor removal or unsubscribe operation. Pump mode creates one named `pump-ipc-reader` per pump carrier (230-252), which is brain-process—not broker-process—threading."},{"path":"crates/spt-daemon/src/conn.rs","description":"One `conn-watchdog` thread per physical broker IPC connection is created at 429-453. `BrokerConn::drop` shuts down and joins it at 639-660, so this class is bounded by live connections and has an explicit reap path."},{"path":"crates/spt-term/src/reader.rs","description":"PTY output Drain thread creation and teardown contract. ConPTY no-EOF-while-writer-held is documented at lines 11-18; request_stop is cooperative and join waits for read to unblock (87-103); the thread owns the writer and blocks in read (114-153). No Drop implementation exists."},{"path":"crates/spt-term/src/pty.rs","description":"PTY session owns child, master, reader, and shared writer. Child wait/kill semantics are at 195-225; these resources must be ordered correctly to unblock the Drain on Windows."},{"path":"crates/spt-daemon/src/translation.rs","description":"Optional per-session translation stdout reader is spawned at 273-291. `terminate` closes stdin, waits boundedly, kills, reaps, and is called from Drop (327-367), so this class has a concrete child reap path."},{"path":"crates/spt-daemon/src/daemon.rs","description":"Starts the single broker serve thread and fixed daemon-lifetime service loops (broker at 192-195; digest/drive/tunnel and conditional net retry/autostart in the surrounding 185-315 range). These are O(1), not per stream or per session."},{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","description":"Live field evidence. Conn 137 begins stream subscriptions at line 500 and accumulates multiple stream tags immediately at lines 516-520; the same physical conn continues subscribing at lines 20230-20290, 21801-21840, and 23724-23728. Conn 12 closes with accumulated subscriber tags at line 377, demonstrating physical-connection-scoped cleanup."}],"architecture":"```mermaid\nflowchart LR\n  Pump[Brain peer pump\\nlong-lived Brain carrier] -->|many NET_STREAM_SUBSCRIBE requests| Handler[Broker handle_conn\\n1 handler thread]\n  Handler -->|SharedSend + stream id| Log[StreamLog per NetHost StreamEntry]\n  Log -->|SubscriberSeat::install| Seat[1 native writer thread\\nreplay then rx.recv forever]\n  Peer[Long-lived QUIC peer conn] --> Entry[StreamEntry table]\n  Entry --> Log\n  Peer -->|per-stream EOF| Finish[StreamLog::finish]\n  Finish -->|queues EOF only| Seat\n  Finish -. no seat drop .-> Leak[parked seat retained]\n  Peer -. only physical conn close .-> Sweep[conn-close sweep]\n  Sweep -->|remove all conn rows| Entry\n  Pump -. only IPC carrier EOF .-> Detach[handle_conn detach loop]\n  Detach -->|drop seat sender| Seat\n\n  Dispatcher[Dispatcher Brain\\n100 ms poll] -->|NET_STREAMS| Handler\n  Handler --> Enumerate[stream_infos\\nscan map + clone rows]\n  Enumerate --> Serialize[JSON serialize + IPC write]\n  Serialize --> Dispatcher\n  Entry -->|completed local rows retained| Enumerate\n\n  Session[Hosted PTY session] --> Input[Input writer thread]\n  Session --> Drain[PTY Drain thread]\n  Session --> Waiter[Child waiter thread]\n  Session --> Controller[Controller writer thread]\n  Session --> Viewer[0..32 viewer writers]\n  Session --> Translation[optional reader + inject worker]\n  Waiter -->|child exit; remove map row| DropSession[HostedSession dropped]\n  DropSession -. missing request_stop/join .-> Drain\n```\n\nThread-count model for the broker process is approximately:\n\n$$T \\approx T_{fixed} + 2C_{ipc} + S_{stream\\ subscribers} + 4N_{sessions} + V_{viewers} + 2T_{translations} + T_{transient}$$\n\nwhere the pathological unbounded term is $S_{stream\\ subscribers}$. For 4–6 sessions, ordinary session terms are tens of threads; the observed hundreds require subscriber history, many leaked IPC connections, maximal viewers, historical PTY drains, or a combination. The conn-137 lifecycle evidence specifically selects the subscriber-history mechanism. The active hot path is separate: one/few handler/runtime threads repeatedly scan and serialize the retained stream table, explaining why only about four threads consume CPU while roughly 500 remain parked."},"status":"success"},"isError":false,"timestamp":1784272550012}}
{"type":"message","id":"445b28e3","parentId":"a04d396d","timestamp":"2026-07-17T07:15:50.025Z","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":1784272550017}}
{"type":"custom","customType":"session_exit","data":{"reason":"dispose","kind":"normal","recordedAt":"2026-07-17T07:22:50.032Z"},"id":"79c9ff7c","parentId":"445b28e3","timestamp":"2026-07-17T07:22:50.032Z"}
