{
  "implemented": true,
  "files": [
    "crates/spt-daemon/src/inputreceipt.rs",
    "crates/spt-daemon/src/broker.rs",
    "crates/spt-daemon/src/msg.rs",
    "crates/spt-daemon/src/brain.rs",
    "crates/spt/src/api/nowsignal.rs"
  ],
  "mechanism": "ReceiptBook indexes endpoint-owned receipts by session/path, excluding only already-fenced paths from new owner requests. Duplicate pending reports subscribe to the original receipt(s). Completion is a bounded sync_channel notification sent only after broker helper publication; at most 64 prompt workers per hosted endpoint, with slot custody held through their bounded socket writes. No wait/socket write under ReceiptBook lock and no waiting on rc/dispatch paths. Existing ten-second owner timers/custody validation remain. Prompt timeout does not cancel owner work.",
  "api": "report_user_input signature unchanged; api/mod.rs needs no edits. UserInputReported adds serde-default pending bool; KIND_USER_INPUT_COMPLETED signals publication. Brain accepts completion-before-ACK and shares the report's original expiry across ACK/completion. Outer now-signal worker uses one Instant deadline including worker setup/connect/handshake. No-path returns before allocation/thread/IPC/wait.",
  "dedupe": "Actual USER_INPUT helper msg_id now uses documented user-input:<receipt-id> prefix. Gather keys those records by endpoint/path within session; changed prose/receipt identity cannot repeat helper, new session/endpoint can surface same URL. MSG_OUT helper and attachment keys unchanged. Existing trimmed-resubmission/first-custody/first-deadline safety preserved; obsolete interior/non-ASCII prose-distinction test replaced.",
  "regression_tests": [
    "brain: report_ack_and_silent_owner_share_the_original_deadline (300ms ACK plus unanswered owner must stop at original deadline)",
    "brain: report_completion_may_arrive_before_ack_without_losing_prompt_delivery",
    "inputreceipt: duplicate_pending_reports_wait_for_publication_of_the_same_receipt",
    "inputreceipt: prompt_worker_slots_remain_bounded_through_notification_delivery",
    "inputreceipt: changed_prose_reuses_paths_but_new_paths_and_sessions_are_independent",
    "broker: existing custody test now expires first prompt, joins original receipt again, accepts late bound-owner reply and wakes duplicate after publication",
    "nowsignal: a_never_answering_report_spends_only_one_prompt_budget",
    "nowsignal: a_late_user_input_helper_is_next_poll_only_and_path_scoped (actual outer prompt cutoff, delayed publication, next poll, changed receipt, new session/endpoint)",
    "nowsignal: no-path test now requires synchronous closure drop/no transport invocation"
  ],
  "traceability": "REQ-HELPER-PROMPT-SHARED-BUDGET and REQ-HELPER-SESSION-PATH-DEDUPE tagged at implementation and regression evidence; existing valid evidence retained. Main notified old TRIMMED-DEDUPE registry/docs must remove interior/non-ASCII prose significance.",
  "validation": "Not run, explicitly assigned to Main after concurrent slices settle. No builds/tests/linters/formatters/commits/push executed.",
  "risks": [
    "Timing regression tests use generous real-clock bounds but can fail on severely stalled hosts.",
    "Closed/expired subscription entries are lazily pruned at subsequent subscription/publication; live workers remain strictly capped.",
    "Existing CLI worker still bounds caller waiting rather than forcibly interrupting an OS-stalled connection/handshake, as before.",
    "Two-node field acceptance remains Hertz's separate obligation."
  ]
}