Skip to content

Integrate authored Pi question and five-rule batch patch - #3820

Merged
trissim merged 14 commits into
mainfrom
pi-pr-salvage-pi-meant
Nov 1, 2026
Merged

trissim merged 14 commits into
mainfrom
pi-pr-salvage-pi-meant

Conversation

@trissim

@trissim trissim commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Audit-owned answers — merged; running-turn and idle/new-wake accepted; installation open

Merged as 71773f612c671dc0f8e5e311b1cd73d727129048 on2026-11-01, exact head7c343 verified through the forge and Git ancestry. Commander independently accepted the running-turn scope in53555 after reading the original SDK/audit/input artifacts. Fresh prepared-main05 demonstrates pending-question recovery across actual Core idle and one distinct new full wake; commander independently accepted this exact scope in53661 after reading the original sources/journal/state and checking the audit digest. Neither result establishes production installation.

Current checkpoint: 14 commits, 65 files, +805/-636 against main38ecc; pushed head 7c3437e. The audit-owner correction itself removed 279 net lines (16 files, +166/-445). This stays on the original #3820, retaining the original claude-ai work, salvage commits and published preservation tags. Rebases preserved all code patches and dropped only the obsolete Toad-lock refresh already superseded by main. The final follow-through updates tracked-main resolution and deletes obsolete tuple/transcript-answer assertions; no old API was restored.

One answer owner instead of transcript proof

Before: PiRoundGate recovered assistant text from the current native request, required the matching arrival/committed context and settled MeantRecord from transcript lines. Claude also scanned transcript text for settlement. The explanatory answer therefore depended on a second channel and request-identity plumbing.

After: PiThreadGate(Speaking) still publishes a real typed MeantNotice. A MeantAnswer carries its exact MessageId and written explanation in SessionAudit. RuleDeal.audit_written handles successful decoded audit completion; MeantRecord keeps the original yes/no + 12-word policy. There is no sincerity classifier, transcript settlement or second retained answer list.

The refusal shows the current exact question ID, audit path and declaration-derived answer schema. Short written answers escalate on successful audit completion; repeating an unrelated refused tool does not manufacture another dodge. Later escalation quotes the audit's statement, not recovered assistant text. Malformed/foreign-ID/failed-write cases cannot manufacture settlement.

Deleted request/transcript machinery

  • Removed PiRoundGate and its producer/arrival checks, Claude words_end/said_after scans, require_current_request, and model_contexts_for helpers.
  • Removed proof-only manifest/context projections and the emitted agentCommsRequestId field. Native request observation still owns real progress, original context and callback timing; emitted SDK events are no longer cloned to brand assistant answers.
  • Removed obsolete request-inclusion tests rather than preserving the superseded requirement.
  • Retained the shared reader, selected/queued framing, actual typed delivery and native comms_send communication exemption. The configured native exemption is demonstrated below by the original SDK call/result; a Bash spelling is not that proof.

Retired questions — no migration layer

Owner decisions 53298/53299, confirmed by the commander in 53307, explicitly retire exactly six inactive Claude question records. Those six .meant files were validated with the existing decoder and deleted; corresponding transcript metadata remained unchanged. Transcripts, audits, other sessions and UNKNOWN-input evidence were not deleted or replayed.

The proposed question carry, external-resource inventory, new shared-lock capabilities and Claude-path helper are deleted/reverted, not shipped. Existing SQL, LockedFile and installer code is unchanged by this correction. No question carry, backup or private-copy rehearsal ever ran. File existence had been mistaken for a live-reader requirement; that was a scoping error, not a reason to retain compatibility machinery.

Evidence and limits

  • Retained before-edit NRA AST/source maps: initial 15 modules/278 classes/536 sites, transport closure 4 modules/19 classes, manifest and native Acorn source evidence; syntax omissions were zero in those bounded maps. Dynamic resolution remains a stated limit. These are source maps, not NRA-applied codemod or behavior proof.
  • After removing the abandoned carry layer: 13 changed Python files compile and all changed production Python modules import (CHECKPOINT_SOURCE_COMPILE_IMPORT_OK). No replacement pytest has run.
  • Real supported stack/native/prepare-pi-native --update-pins completed rc0, under the existing host TestLease, against the actual native sources. The checked-in native pin came from that build. A second supported build after main38ecc also passed; its regenerated pin stayed byte-identical, so no pin change is falsely attributed to the final commit.
  • Exact7c343 runtime preparation passed: RuntimeStack.build resolved current tracked mains and synced noneditable packages; its own installed native/package/import completion passed, followed by an isolated interpreter query proving rule_deal is inside that prefix, MeantAnswer has the declared schema and PiRoundGate is absent. Prefix: core-7c3437e1d-lock-a8da49b317793777. This is preparation, not a provider journey or production install.
  • Authored audit-write controls cover exact/foreign IDs, malformed/short explanations, repeated refusals, file-content-only versus successful completion, replayed completion and the policy boundary. The integration owner's current-main selection actually collected163,159passed/4fixture-setup failures,rc1; five prompt-delivery cases passed. The native-session audit case failed before its assertions on the omitted real prompt artifact. Its assigned correction is Prepare the real native prompt for the audit settlement fixture #3845/a00e2c850f, mergedac83d609e666c136243faea9314a03035a9467ee: existing native_runtime_package preparation, obsolete manual-read loop deleted, all16original asserts/6with-controls unchanged. Its exact changed case PASSED in the integration owner's necessary75-case selection at f7213b2:75collected/75passed,19.51s,rc0 (complete log and rc independently read in pi-commander/service-main-correction-01/pytest.log/pytest.rc). That proof predates P859's declaration moves and is not a post-P859 pass. The other three native-package fixture corrections belong to claude-ai and remain unqualified; this selection did not silently include or waive them.
  • Earlier b944 runtime preparation and historical tests remain superseded evidence, never acceptance of the new answer channel. Intermediate inheritance/source-check failures are retained as failures; that entire unused capability experiment is now absent.

Configured running-turn application result

Demonstrated on exact7c343: original saved SDK metadata records openai-codex-responses / openai-codex / gpt-6.1-sol, using preserved real native discovery, not ControlledProvider. The model's actual native comms_send returned f8c61a0d2c5d. After actual paper/spine reads and a model-authored partial audit, Core published typed private MeantNotice question f59910609e12. InputDispositions records it as ContextConsumedInput; its actual SDK user entry174 is before the model's explanatory audit edit177 and fresh final179. The exact-ID answer is107 words, passes the existing MeantRecord policy, and leaves asked=[spine], open=[]. Other rule answers remain visibly unfinished. Evidence: running-turn-result.md, original03 native session, typed bus/input rows and native03-readonly.log (rc0), under the named persistent evidence directory.

The observer03 program itself timed out, rc1: it used PiRedeal.typed_by, which intentionally excludes Core notices because it owns human words. That failed controller result is retained, not relabelled green. The independent original SDK/bus/audit artifacts establish the narrower working application path. Private owner and host were retired; no failed input/root was reused. The distinct idle-wake path is not established by this result.

Prepared-main idle/new-wake result

On commander's genuinely prepared core-fd0386c55-lock-b9821a662b3d916e, fresh05 returnedrc0 and its final owner-correct read-only extraction returnedrc0. Actual configured SDK209 carries initial input53609; model write210/result211 publishes typed question79314a8b047f, following user213. Readiness finals212/214 leave it open. The observer reads actual Core idle/generation1 with that unchanged open question, THEN sends one unique NEW FullWake53614 /0f9fcb223e5b. SDK215 and its committed NativeRuntimeInput record prove stage=full, a distinct execution, requestGeneration4. Model edit218/result219 writes its own126-word exact-ID explanation; final220 precedes Core idle/generation2 with open=[]. Original assistant metadata names openai-codex-responses/openai-codex/gpt-6.1-sol. Twenty-two other audits remain visibly unanswered. There are zero redundant rule-file reads; the only read is a refused question-store read. This was startup and idle recovery, not actual compaction or production installation.

The question FIRST arrived during turn1; the new case proves recovery of that still-open question after genuine idle, not first delivery of the question while idle. Source/chronology/exact IDs are in idle-wake-main-result.md, native-idle-main-05.log and native05-readonly-native-owner.log under the same evidence directory. Earlier extraction01 queried the wrong BUS keys for full selected inputs and included copied historical user-shaped records;02rc1 kept that wrong owner assertion. They are superseded read-only inspections, not new model attempts. Full selected evidence belongs to NativeRuntimeInput; InputDispositions still owns the genuine following-question row. StoredTurnRecord.read follows the registry current reference, so no historical generation is reconstructed from it. Private owner16292 and host retired, lease released to UI; original input/session evidence remains frozen. Commander independently accepted this scope in53661; its actual source receipt pi-commander/heartbeat-publication/native-3820-idle05-review.md has now been read. It confirms the successful audit result was3488bytes and its retained SHA256db33ee0e2de0dea5ed436f6e658e753cb7ac3fd9556688423c59d5cf3a3bdaec matches.

Remaining follow-through

The one corrected3845 case has passed and05's independent review is accepted at its stated pre-P859 epochs. The separate native-package fixture correction still belongs to claude-ai. Exercise installed start/actual compaction/audit/no-redundant-rule-read behavior once commander's rebased3833 recovery and combined installation succeed. Supported install9f947 failed before activation; production remains ceeed. No second stack, fabricated audit/native record, ACK or replay counts. ContextManifest.for_request remains because runtime_requests.py:420 genuinely consumes it outside question settlement.

The first native controller stopped before root creation/send/model on the correct foreign-runtime refusal: a7c343 caller cannot attach to the ceeed-owned production root.02 used the existing source-owned fresh CheckRoot.create → public RootRuntime.publish NEW stopped same-schema-copy boundary → target-owned interpreter, then failed on my wrong observer owner; its retained diagnostic also rejected an inherited old-runtime launcher.03 validated the actual store and declared target launcher before fresh input and produced the running-turn result above. No production root is retagged, no carry/backup is added, and the live source reader closes before model work. Fresh04 returned rc0 and retired its owner/host: original SDK final203 (READY_FOR_IDLE_04) precedes actual question user entry204 and model answer edit207. Core remained busy and the question used the same TrackedTurn following-input path. It is supplemental successful settlement evidence, NOT idle-wake acceptance. Source distinction: OwnerFollowingInputs.open and FollowingPrompt retain the active turn even across this SDK final. No controller wake input was sent. That missing case is now demonstrated by fresh05 above; independent review is accepted and installed qualification remains owned here.

Assumed: the explicit six-question retirement is the current required domain; unrelated retained session/input state is not disposable. No whole #3824/#3825/retention/board prerequisite is imposed.

Copilot AI balanced review requested due to automatic review settings November 1, 2026 00:45

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

debt-src at eb53cc1, every finding:

+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-y0ymnxfu --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/agent-comms
= 17.419s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-y0ymnxfu --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/agent-comms (17.419s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-sybzj9v1 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/formbridge
= 0.847s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-sybzj9v1 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/formbridge (0.847s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-88v_bk_v --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/metaclass-registry
= 0.974s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-88v_bk_v --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/metaclass-registry (0.974s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-qcd46_fq --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/textual
= 1.679s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-qcd46_fq --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/textual (1.679s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-4b10ntjl --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/toad
= 1.019s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-4b10ntjl --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/toad (1.019s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-22huej1e --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/ui-theme
= 0.646s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-22huej1e --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/ui-theme (0.646s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-yqsmn3i5 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/agent-comms
= 18.218s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-yqsmn3i5 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/agent-comms (18.218s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-l9gcncsh --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/formbridge
= 1.392s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-l9gcncsh --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/formbridge (1.392s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-svxwfb7m --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/metaclass-registry
= 1.311s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-svxwfb7m --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/metaclass-registry (1.311s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-l69hiygn --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/textual
= 1.687s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-l69hiygn --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/textual (1.687s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-4yx919lk --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/toad
= 1.260s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-4yx919lk --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/toad (1.260s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-qjs18n4j --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/ui-theme
= 0.922s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-qjs18n4j --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/ui-theme (0.922s elapsed)
grew BannedVocabulary:src/agent_comms/cli_bridges/hook_read_gate.py +1
grew BannedVocabulary:src/agent_comms/native_tool_transport.py +1
grew BannedVocabulary:src/agent_comms/native_transcript.py +12
grew BannedVocabulary:src/agent_comms/pi_payloads.py +11
grew BannedVocabulary:src/agent_comms/pi_rule_gate.py +4
grew BannedVocabulary:src/agent_comms/transcript_sources.py +3
grew BannedVocabulary:src/agent_comms_hooks/skill.py +1
::warning file=src/agent_comms/context_segments/wake.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/native_transcript.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/pi_payloads.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/pi_rule_gate.py::LintFindings +2 (warns, never blocks)
::warning file=src/agent_comms/task_attachments/owner_notices.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/turn_context.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms_hooks/skill.py::LintFindings +3 (warns, never blocks)
grew TypeCheckingImport:src/agent_comms/native_transcript.py +2
grew TypeCheckingImport:src/agent_comms/pi_payloads.py +1
grew TypeCheckingImport:src/agent_comms/pi_rule_gate.py +2
grew TypeCheckingImport:src/agent_comms/task_attachments/owner_notices.py +2
grew TypeCheckingImport:src/agent_comms/task_sources.py +2
grew TypeErrors:src/agent_comms/context_segments/wake.py +3
found BannedVocabulary:src/agent_comms/cli_bridges/hook_read_gate.py at src/agent_comms/cli_bridges/hook_read_gate.py:128 src/agent_comms/cli_bridges/hook_read_gate.py:130 src/agent_comms/cli_bridges/hook_read_gate.py:130 src/agent_comms/cli_bridges/hook_read_gate.py:132
found BannedVocabulary:src/agent_comms/native_tool_transport.py at src/agent_comms/native_tool_transport.py:92
found BannedVocabulary:src/agent_comms/native_transcript.py at src/agent_comms/native_transcript.py:236 src/agent_comms/native_transcript.py:236 src/agent_comms/native_transcript.py:237 src/agent_comms/native_transcript.py:479 src/agent_comms/native_transcript.py:487 src/agent_comms/native_transcript.py:487 src/agent_comms/native_transcript.py:489 src/agent_comms/native_transcript.py:489 src/agent_comms/native_transcript.py:490 src/agent_comms/native_transcript.py:494 src/agent_comms/native_transcript.py:495 src/agent_comms/native_transcript.py:496
found BannedVocabulary:src/agent_comms/pi_payloads.py at src/agent_comms/pi_payloads.py:836 src/agent_comms/pi_payloads.py:836 src/agent_comms/pi_payloads.py:837 src/agent_comms/pi_payloads.py:933 src/agent_comms/pi_payloads.py:933 src/agent_comms/pi_payloads.py:935 src/agent_comms/pi_payloads.py:937 src/agent_comms/pi_payloads.py:939 src/agent_comms/pi_payloads.py:1047 src/agent_comms/pi_payloads.py:1047 src/agent_comms/pi_payloads.py:1048 src/agent_comms/pi_payloads.py:1703 src/agent_comms/pi_payloads.py:1728
found BannedVocabulary:src/agent_comms/pi_rule_gate.py at src/agent_comms/pi_rule_gate.py:72 src/agent_comms/pi_rule_gate.py:97 src/agent_comms/pi_rule_gate.py:97 src/agent_comms/pi_rule_gate.py:98
found BannedVocabulary:src/agent_comms/transcript_sources.py at src/agent_comms/transcript_sources.py:171 src/agent_comms/transcript_sources.py:177 src/agent_comms/transcript_sources.py:255 src/agent_comms/transcript_sources.py:288 src/agent_comms/transcript_sources.py:289 src/agent_comms/transcript_sources.py:294 src/agent_comms/transcript_sources.py:326 src/agent_comms/transcript_sources.py:327 src/agent_comms/transcript_sources.py:332 src/agent_comms/transcript_sources.py:412 src/agent_comms/transcript_sources.py:412 src/agent_comms/transcript_sources.py:414
found BannedVocabulary:src/agent_comms_hooks/skill.py at src/agent_comms_hooks/skill.py:285
found LintFindings:src/agent_comms/context_segments/wake.py at src/agent_comms/context_segments/wake.py:9 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/agent_comms/native_transcript.py at src/agent_comms/native_transcript.py:25 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/agent_comms/pi_payloads.py at src/agent_comms/pi_payloads.py:226 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/agent_comms/pi_rule_gate.py at src/agent_comms/pi_rule_gate.py:14 (I001 [*] Import block is un-sorted or un-formatted) src/agent_comms/pi_rule_gate.py:34 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/agent_comms/task_attachments/owner_notices.py at src/agent_comms/task_attachments/owner_notices.py:24 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/agent_comms/turn_context.py at src/agent_comms/turn_context.py:270 (E501 Line too long (102 > 100))
found LintFindings:src/agent_comms_hooks/skill.py at src/agent_comms_hooks/skill.py:51 (N805 First argument of a method should be named `self`) src/agent_comms_hooks/skill.py:308 (E501 Line too long (182 > 100)) src/agent_comms_hooks/skill.py:311 (E501 Line too long (110 > 100)) src/agent_comms_hooks/skill.py:383 (E501 Line too long (106 > 100))
found TypeCheckingImport:src/agent_comms/native_transcript.py at src/agent_comms/native_transcript.py:20 src/agent_comms/native_transcript.py:21 src/agent_comms/native_transcript.py:21 src/agent_comms/native_transcript.py:22 src/agent_comms/native_transcript.py:23
found TypeCheckingImport:src/agent_comms/pi_payloads.py at src/agent_comms/pi_payloads.py:226 src/agent_comms/pi_payloads.py:227 src/agent_comms/pi_payloads.py:227 src/agent_comms/pi_payloads.py:228 src/agent_comms/pi_payloads.py:229 src/agent_comms/pi_payloads.py:229 src/agent_comms/pi_payloads.py:230 src/agent_comms/pi_payloads.py:231 src/agent_comms/pi_payloads.py:231 src/agent_comms/pi_payloads.py:232 src/agent_comms/pi_payloads.py:233 src/agent_comms/pi_payloads.py:234 src/agent_comms/pi_payloads.py:235 src/agent_comms/pi_payloads.py:236
found TypeCheckingImport:src/agent_comms/pi_rule_gate.py at src/agent_comms/pi_rule_gate.py:34 src/agent_comms/pi_rule_gate.py:35 src/agent_comms/pi_rule_gate.py:36 src/agent_comms/pi_rule_gate.py:37 src/agent_comms/pi_rule_gate.py:38
found TypeCheckingImport:src/agent_comms/task_attachments/owner_notices.py at src/agent_comms/task_attachments/owner_notices.py:24 src/agent_comms/task_attachments/owner_notices.py:25 src/agent_comms/task_attachments/owner_notices.py:26 src/agent_comms/task_attachments/owner_notices.py:27 src/agent_comms/task_attachments/owner_notices.py:28 src/agent_comms/task_attachments/owner_notices.py:29 src/agent_comms/task_attachments/owner_notices.py:30
found TypeCheckingImport:src/agent_comms/task_sources.py at src/agent_comms/task_sources.py:29 src/agent_comms/task_sources.py:30 src/agent_comms/task_sources.py:32 src/agent_comms/task_sources.py:33 src/agent_comms/task_sources.py:34 src/agent_comms/task_sources.py:35 src/agent_comms/task_sources.py:36 src/agent_comms/task_sources.py:37 src/agent_comms/task_sources.py:38 src/agent_comms/task_sources.py:39 src/agent_comms/task_sources.py:40 src/agent_comms/task_sources.py:41 src/agent_comms/task_sources.py:42 src/agent_comms/task_sources.py:43 src/agent_comms/task_sources.py:44 src/agent_comms/task_sources.py:45 src/agent_comms/task_sources.py:46
found TypeErrors:src/agent_comms/context_segments/wake.py at src/agent_comms/context_segments/wake.py:34 (Definition of "disclosure_policy" in base class "PublicInstructionAnnotations" is incompatible with definition in base class "WithheldAnnotations"  [misc]) src/agent_comms/context_segments/wake.py:126 (Definition of "disclosure_policy" in base class "PublicInstructionAnnotations" is incompatible with definition in base class "WithheldAnnotations"  [misc]) src/agent_comms/context_segments/wake.py:132 (Signature of "capture" incompatible with supertype "agent_comms.turn_context.InstructionSegment"  [override]) src/agent_comms/context_segments/wake.py:135 (Function is missing a return type annotation  [no-untyped-def]) src/agent_comms/context_segments/wake.py:170 (Returning Any from function declared to return "DeliveredMessageSegment"  [no-any-return])
introduced BannedVocabulary:src/agent_comms/cli_bridges/hook_read_gate.py at lines [128]
introduced BannedVocabulary:src/agent_comms/native_tool_transport.py at lines [92]
introduced BannedVocabulary:src/agent_comms/native_transcript.py at lines [236, 236, 237, 479, 487, 487, 489, 489, 490, 494, 495, 496]
introduced BannedVocabulary:src/agent_comms/pi_payloads.py at lines [836, 836, 837, 933, 933, 935, 937, 939, 1047, 1047, 1048]
introduced BannedVocabulary:src/agent_comms/pi_rule_gate.py at lines [72, 97, 97, 98]
introduced BannedVocabulary:src/agent_comms/transcript_sources.py at lines [412, 412, 414]
introduced BannedVocabulary:src/agent_comms_hooks/skill.py at lines [285]

@trissim
trissim force-pushed the pi-pr-salvage-pi-meant branch 2 times, most recently from 0cc8966 to add9b1c Compare November 1, 2026 02:44
@trissim
trissim force-pushed the pi-pr-salvage-pi-meant branch 3 times, most recently from d3c1bc9 to 9dd6da7 Compare November 1, 2026 06:53
@trissim
trissim force-pushed the pi-pr-salvage-pi-meant branch 2 times, most recently from 03e03b3 to 8607bcc Compare November 1, 2026 11:18
@trissim
trissim force-pushed the pi-pr-salvage-pi-meant branch 2 times, most recently from dbd71d0 to b944955 Compare November 1, 2026 17:49
trissim added a commit that referenced this pull request Nov 1, 2026
Preserving sessions, inputs and originals had become a reflex that built
a carry, backup, locks and a dry run for six dead Claude sessions' open
questions (#3820). Preservation protects what a live reader needs; dead
state is deleted, and the check is 'who would notice?'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016gZLdttfQjtizEYZGek9Gh
@trissim
trissim force-pushed the pi-pr-salvage-pi-meant branch from b525133 to ed8e84a Compare November 1, 2026 20:02
trissim added a commit that referenced this pull request Nov 1, 2026
…ND_SYSTEM is gone

AGENTS.md and .pi/APPEND_SYSTEM.md restated the commander rules, and the
copies had drifted from them: merge-vs-rebase, draft-vs-ready PRs, a dead
resource-check helper, and an unconditional "preserve UNKNOWN inputs" that
outvoted unnecessary.md's named-live-caller test (#3820). Every native Pi
unit carried APPEND_SYSTEM ahead of the verbatim rules in its own system
prompt, so the rules reached it three times.

- AGENTS.md now holds only host facts (paths, checkout commands, limits,
  permissions, authorization) and opens by pointing at commander/rules and
  the papers. A behaviour correction goes into its rule, never here.
- APPEND_SYSTEM.md is deleted. UnitInstructions renders AGENTS.md as the
  owner section instead (native_package.OWNER_INSTRUCTIONS; wheel
  force-include and sdist list updated; stack/AGENTS.md symlink).
- Behaviour no rule stated moved into its owner: preservation needs a live
  reader (storage-and-cleanup), own it through delivery with no hierarchy
  (no-blocking), answer in a channel what you own (plain-reporting), a
  correction lands in its rule (owner-authority).
- fork-orders, per Tristan 2026-11-01: rebase your own branch instead of
  merging main; open the PR at the first real commit and mark it ready
  when the work is ready.
- Rule examples (FieldCodec's one owner), project goals (Toad scroll,
  OpenHCS blind-analysis, P269) and the defunct Codex-cleanup line are
  dropped. OPENHCS-HISTORY.md keeps only its PR history; nothing points
  at it.

Checked: UnitInstructions.render() reads stack/AGENTS.md and contains the
new rule text (22 rule files parse); hatchling wheel ships
agent_comms/_native/AGENTS.md and the sdist ships AGENTS.md and
stack/AGENTS.md. No pytest run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016gZLdttfQjtizEYZGek9Gh
trissim and others added 10 commits November 1, 2026 15:08
…open in named batches of 5

The Pi deal was mute: PiRuleGate inherited RuleDeal.voice() -> Mute(), and no Pi tool ever
called audit_written, so no Pi thread was ever asked. Now:

- PiThreadGate (the gate PiRuleGate.of seats on the bus) speaks: its line is a MeantNotice to the
  thread, and its answer is heard in the thread's own session file. The transcript source decides
  whether a deal can ask, so a backend that cannot read back the session's words stays mute
  instead of locking it behind an unanswerable question.
- Pi's write and edit tools call audit_written when they write the audit.
- PiMessage owns said()/tally(), the same fold Claude records feed SessionReceipts.
- A running turn reads the delivered message in the segment its task names: MeantNotice is a
  user follow-up, every other message the untrusted bus delivery it was.
- Unengaged.batch is 5, declared once; every Unread refusal names the batch size and the batch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AwNvwu1MXjcvCLCcNXLmAc
@trissim
trissim force-pushed the pi-pr-salvage-pi-meant branch from ed8e84a to 7acf1ed Compare November 1, 2026 20:08
@trissim
trissim merged commit 71773f6 into main Nov 1, 2026
7 of 8 checks passed
trissim added a commit that referenced this pull request Nov 1, 2026
…owes the witness, not reads

A native Pi unit carried every rule in its system prompt and was then dealt the
same files again as tool reads after every start and compaction. Its runtime
already owns its launch, so it now owns how the deal reaches the session:

- rule_deal: DealDelivery is the family. The default delivers nothing (the
  session reads each file); SystemPromptDelivery seeds the read log at deal
  time from the prompt's manifest, one DealtRead per file at the exact digest
  the prompt carries. A file changed after preparation stops matching and is
  owed as an ordinary read. Unengaged, Unaudited and Unmeant are unchanged:
  the audit and "did you mean it?" still come before the first tool call.
- deal_prompt.DealPrompt replaces unit_instructions: AGENTS.md, a short
  preamble, then DeckReader.sources() verbatim in deal order (papers first),
  with its manifest rendered from the same bytes. SYSTEM_PROMPT replaces
  UNIT_INSTRUCTIONS; RuleFile.render_packaged lost its last consumer.
- RuntimeLocation.deal_delivery() defaults to reading; PiSessionFile returns
  the system prompt it always launches with. PiThreadGate asks its thread's
  runtime.
- Claude Code: Core now owns its command line through claude-comms
  (cli_bridges/claude_launch), which execs the real claude, never itself,
  with --append-system-prompt-file (system role, after Claude Code's own
  prompt) and names the prompt in AGENT_COMMS_SYSTEM_PROMPT. Every session hook
  record carries it (LaunchedPrompt), so DeckStart deals a launched session by
  system prompt and tells it to answer, not read. A plain `claude` still reads.

Checked here: every changed module imports in a fresh interpreter; the prompt
renders all 36 dealt files verbatim in deal order (~114k tokens) and its
manifest round-trips current; a prompted deal opens on Unengaged with all 36
reads counted, a plain one on Unread; a manifest digest that no longer matches
leaves exactly that file owed as a read; claude-comms skips a `claude` on PATH
that resolves to itself and execs the real one with the flag; Claude Code
2.1.316 accepts --append-system-prompt-file and reads it eagerly. No pytest
run: tests/test_deal_prompt.py and the touched conftest/test_native_package
lines are compiled, not executed.

Built on #3820 (7c3437e), which reshapes the same gate files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016gZLdttfQjtizEYZGek9Gh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants