Skip to content

Require explicit new-agent channels and collect required fields before construction - #3595

Open
trissim wants to merge 37 commits into
mainfrom
work/commander-layout--P927
Open

trissim wants to merge 37 commits into
mainfrom
work/commander-layout--P927

Conversation

@trissim

@trissim trissim commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

P927 — explicit New membership, actual-parent Fork inheritance

10 commits;17 files;+824/−223 against the fetched main used for this source checkpoint. Core head 85a31ac9872b949efa02f48a48b29ced057d8ee5. Core delivery claim is recorded. Companion PRs remain ToAD#1322 and ObjectState#65 under the same P927.

Source checkpoint, not application acceptance. No author tests, type checker, ratchet, product imports, application/provider execution or installation for this correction. Root owns the matched qualification.

1. Creation: two sibling contracts, no imaginary parent

Before: New inherited Fork's InheritedTags default; TagChoice.for_new supplied an imaginary empty parent. Opening Fork could freeze its parent's current tags as GivenTags.

After:

ThreadCreationSpec (common launch fields and native Thread construction)
├── NewThreadSpec(tags: GivenTags, required)
└── ForkSpec(tags: TagChoice = InheritedTags)

ThreadLaunchSettings(CommandContext): acquired task/project/model/thinking, no name
└── ThreadCreationCliCommand(NameArgument, ...): required child name
    ├── NewThreadCliCommand: required GivenTags
    └── ForkCliCommand + ForkContext: captured TargetBound parent

New explicitly chooses membership; deliberate empty/private membership remains valid. Fork resolves its original default against the actual parent's tags when applied. Locked registration, backend selection and session-copy behavior remain. Deleted for_new, empty-parent inheritance, premature parent-tag snapshot and required name='' placeholders. No forced channel roster or live registry migration.

2. Binding: native context, one completion and authorization owner

CommandBinding: field offering, authorization, preparation, completion
├── CliCommand: existing complete command directly implements binding
└── CatalogBinding: actual CatalogSelection only
    └── PendingCommandBinding(command declaration, acquired native context)

A required answer may be absent while the form opens. Pending New/Fork retain only acquired native context and cannot apply. CommandBinding uses actual FieldPlans and existing FieldCodec construction to complete; no context encode/decode loop, hand argument roster or complete-command adapter. CommandContext is declaration-only, so it cannot shadow complete-command edit authorization through the MRO.

Deleted copied completion bodies, the leaked context mutation method and identity tag normalizers. Target-bound parent and unoffered-field ValueErrors remain programming/authorization refusals, not invalid-data feedback.

3. Presence: the field subtype owns it

TargetField
├── SuppliedTargetField(value): editor_default exists here only
│   └── ChoiceTargetField / CatalogTargetField
└── UnsuppliedTargetField: no value/default; unset argument is omitted

Missing, supplied None, explicit empty and unchosen remain distinct. Required unsupplied inputs stay omitted until deliberate input. FieldPlan still owns requiredness/defaults/codec. The base and unsupplied editor_default -> None declarations are deleted; absence is no longer encoded twice. _ExactScalarDecoder.accepts_value calls accepts instead of restating its type test.

4. Native member editor: original identity, metadata outside values

UnionDecoder.editor_members derives alternatives. MemberSelection has nominal scalar/record/null members plus UnchosenMember; the latter has its own label and no-input draft, not a fake null selection. A committed union's actual native value remains its sole member identity.

EditorMember metadata retains decoder/FieldPlans outside ObjectState values. Scalar drafts derive their actual represented input; record drafts derive fields; null needs none. editor_wire owns represented editor operations. Public JSON schema/defaults remain JSON-safe, distinct from native in-process editor state. Finite/catalog choices retain their prior contracts.

Deleted EditsAsText, _TextEditedUnionDecoder, first-member preference, editor wrapper forwarders and FieldPlan editor forwarding. No type-name/tag switch, JSON-prefix guessing, copied committed selector or decoder stored as a draft value.

5. Data boundary and actual form consumer

DecoderPlan.parse_editor translates malformed JSON into MalformedRecord with cause. Native text is not forcibly JSON-quoted. ToAD's dialog catches only MalformedRecord, allowing ordinary authorization/programming ValueErrors to escape.

ToAD#1322 supplies one generic UnionEditor/member transaction through existing ObjectState/InlineFormView. It retains MemberSelection objects through Select; Apply constructs one valid native member and commits once; Cancel leaves the original untouched. Old forms/subscriptions retire on replacement. Generic forms retain TYPE_CHECKING-only Core selection imports. Ancestor/descendant notifications use DottedFieldPath.intersects_path.

Provider#65 fixes actual subtree admission and saved/history topology; Core itself does not require it to merge. Transient command drafts remain unregistered: no invented registry undo/redo for those dialogs. Real provider registry undo/redo controls remain.

Source evidence and deletion claims

Retained AST source maps cover Core production/tests/tools, ToAD, ObjectState, python-introspect and formbridge. Reused Package/ParsedModule/FunctionFacts; no copied scanner. Coverage and omissions are retained in p927-*-source*/binding/codec/provider maps. Dynamic metadata/MRO/lazy resolution remain semantic reads, not AST behavioral proof.

  • IDEN-3: fact creation policy; old for_new/shared default → sibling New/Fork declarations.
  • IMPL-12: fact completion → CommandBinding.edited; duplicate bodies deleted.
  • IMPL-4: fact whether an editor default exists → SuppliedTargetField only; base/unsupplied copies deleted.
  • BOUND-1: fact scalar acceptance → _ExactScalarDecoder.accepts; second type test deleted.

Authored controls — UNRUN

Root's narrowed existing selection:

tests/test_thread_creation.py
tests/test_editor_defaults.py
tests/test_cli_selection.py
tests/test_end_to_end.py::TestEndToEndLifecycle::test_new_and_fork_require_a_declared_checkout
tests/test_checkout_submodules.py::test_empty_project_does_not_become_the_callers_checkout
tests/test_cli.py::test_result_kind_decides_exit_code_and_navigation_targets

Controls cover missing/chosen/explicit-empty membership, actual-parent Fork, absent required child name, pending completion and no execution during preparation; native/wire member roundtrips including overlapping scalar forms; malformed data versus authorization refusal. Companion PRs list provider topology/history and actual form controls separately.

Integration and remaining proof

Merge Core#3595 first, then corrected ObjectState#65 and matching ToAD#1322. Install Core with the matching ToAD: main ToAD alone cannot supply the newly required input. Provider source must match the actual ToAD pin/lock. Preserve all unrelated pins. Root owns the combined qualification and private New/Fork application journey, including a real channel message/reply and actual inheritance. Passing source publication or earlier live tag repair does not establish future creation.

Assumed: no tested/installed/working claim. P916 remains separately open for its installed physical acceptance; P930 remains commander-screen's work. Original sessions and UNKNOWN inputs remain untouched.

New used to inherit membership from nobody
nobody was an extremely reliable supplier of zero channels

Send-back fix: a pending binding no longer restates its command (2072c0d, c194d56)

  • PendingCommandBinding held command: type[CliCommand] beside context, plus a __post_init__ that refused a command not inheriting the context (IMPL-10, cli_command.py:154-162). The context's class already declares which command inherits it.
  • After: the binding holds only context; CommandContext.command() returns the one CliCommand family member inheriting that context ((command,) = CliCommand.members_with(cls)), and declaration reads it. Deleted: the field, the runtime check, and the cls argument at both construction sites.
  • new gets NewThreadContext(ThreadLaunchSettings) so each context has exactly one declared command (fork already had ForkContext).
  • tests/test_thread_creation.py:55 asserted tags.editor_default is None on an UnsuppliedTargetField, which declares no default; it failed at ce33201 before this change. It now asserts the field's type.
  • Still open: channel_targets.py:26 imports CommandBinding under TYPE_CHECKING. A runtime import would create a cycle, because CommandBinding needs config_options, which imports threads and bus, which import channel_targets. Removing it means moving the bindings dispatch out of CommandTarget, which this PR does not do.
  • Targeted runs: test_thread_creation, test_cli_selection, test_editor_defaults give 39 passed and 1 failed. The failure, test_overlapping_scalar_wire_does_not_change_selected_native_member ("DID NOT RAISE MalformedRecord"), also fails at ce33201.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XbFMSoWgC3ZwKzjT4SwMDu

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

debt-src at d83a57c, every finding:

+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-hjzjjcsu --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/agent-comms
= 17.294s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-hjzjjcsu --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/agent-comms (17.294s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-c1b64q04 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/formbridge
= 1.196s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-c1b64q04 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/formbridge (1.196s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-wza4kyj7 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/metaclass-registry
= 1.218s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-wza4kyj7 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/metaclass-registry (1.218s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-togyf93p --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/textual
= 2.112s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-togyf93p --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/textual (2.112s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-g8wc2z6f --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/toad
= 1.143s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-g8wc2z6f --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/toad (1.143s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-fhi07zj4 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/ui-theme
= 0.918s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-fhi07zj4 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/ui-theme (0.918s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-71vk1bhg --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/agent-comms
= 18.581s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-71vk1bhg --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/agent-comms (18.581s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-gbclxd2y --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/formbridge
= 1.063s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-gbclxd2y --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/formbridge (1.063s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-egshinfa --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/metaclass-registry
= 1.009s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-egshinfa --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/metaclass-registry (1.009s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-os8sdgpx --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/textual
= 1.806s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-os8sdgpx --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/textual (1.806s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-dgqonnpv --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/toad
= 1.386s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-dgqonnpv --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/toad (1.386s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-a15hfqna --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/ui-theme
= 0.920s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-a15hfqna --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/ui-theme (0.920s elapsed)
grew ClientTypeErrors:batrachian-toad/src/toad/widgets/comms_command_dialog.py +1: this change removes or changes an agent_comms name that client file uses; run mypy on it to see which
::warning file=src/agent_comms/cli_commands.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/cli_support/thread_creation.py::LintFindings +3 (warns, never blocks)
::warning file=src/agent_comms/cli_support/thread_creation.py::Unformatted +1 (warns, never blocks)
found ClientTypeErrors:batrachian-toad/src/toad/widgets/comms_command_dialog.py at batrachian-toad/src/toad/widgets/comms_command_dialog.py:169 ("TargetField" has no attribute "editor_default"  [attr-defined])
found LintFindings:src/agent_comms/cli_commands.py at src/agent_comms/cli_commands.py:28 (F401 [*] `.nominal.field_codec.boundary_decoder` imported but unused)
found LintFindings:src/agent_comms/cli_support/thread_creation.py at src/agent_comms/cli_support/thread_creation.py:2 (I001 [*] Import block is un-sorted or un-formatted) src/agent_comms/cli_support/thread_creation.py:31 (E501 Line too long (102 > 100)) src/agent_comms/cli_support/thread_creation.py:41 (E501 Line too long (108 > 100))
found Unformatted:src/agent_comms/cli_support/thread_creation.py at src/agent_comms/cli_support/thread_creation.py:1 (Black would reformat this file)

@trissim
trissim force-pushed the work/commander-layout--P927 branch from 9c4f518 to fbc676a Compare October 29, 2026 07:16
@trissim
trissim marked this pull request as ready for review October 29, 2026 18:24
Copilot AI balanced review requested due to automatic review settings October 29, 2026 18:24

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.

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.

@trissim
trissim force-pushed the work/commander-layout--P927 branch from ebab03c to 9a56828 Compare October 29, 2026 21:45
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

debt-tools at d83a57c, every finding:

+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-glw2ay26 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/agent-comms
= 6.841s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-glw2ay26 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/agent-comms (6.841s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-t_1nwfm8 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/formbridge
= 0.308s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-t_1nwfm8 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/formbridge (0.308s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ld9vwfyp --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/metaclass-registry
= 0.252s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ld9vwfyp --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/metaclass-registry (0.252s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-3lw425sb --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/textual
= 0.576s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-3lw425sb --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/textual (0.576s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ieuu0x6k --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/toad
= 0.367s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ieuu0x6k --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/toad (0.367s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-i1y7l2fb --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/ui-theme
= 0.239s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-i1y7l2fb --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/base/openhcsdev/ui-theme (0.239s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-a5ylqitk --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/agent-comms
= 5.335s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-a5ylqitk --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/agent-comms (5.335s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-i1mlraru --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/formbridge
= 0.254s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-i1mlraru --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/formbridge (0.254s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-w40g7f_m --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/metaclass-registry
= 0.236s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-w40g7f_m --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/metaclass-registry (0.236s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ics78qfb --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/textual
= 0.505s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ics78qfb --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/textual (0.505s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-pznkb3t2 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/toad
= 0.351s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-pznkb3t2 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/toad (0.351s elapsed)
+ CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ogtjkm65 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/ui-theme
= 0.230s CommandPhase: /home/runner/work/_temp/checker-venv/bin/uv build --wheel --out-dir /home/runner/work/_temp/paired-sources/metadata/metadata-ogtjkm65 --python /home/runner/work/_temp/checker-venv/bin/python /home/runner/work/_temp/paired-sources/head/openhcsdev/ui-theme (0.230s elapsed)
grew ClientTypeErrors:batrachian-toad/src/toad/widgets/comms_command_dialog.py +1: this change removes or changes an agent_comms name that client file uses; run mypy on it to see which
found ClientTypeErrors:batrachian-toad/src/toad/widgets/comms_command_dialog.py at batrachian-toad/src/toad/widgets/comms_command_dialog.py:169 ("TargetField" has no attribute "editor_default"  [attr-defined])

@trissim
trissim force-pushed the work/commander-layout--P927 branch from e35149a to 4a5e8b2 Compare October 29, 2026 23:04
@trissim
trissim force-pushed the work/commander-layout--P927 branch from 4a5e8b2 to 85a31ac Compare October 30, 2026 01:18
trissim and others added 5 commits October 30, 2026 13:49
…--P927

# Conflicts:
#	src/agent_comms/field_codec.py
PendingCommandBinding carried a command field and a __post_init__ that refused a
command not inheriting the context (IMPL-10): the context's own class already
declares which command inherits it. The binding now holds only the context, and
CommandContext.command() reads the one CliCommand family member inheriting it.
new gets NewThreadContext so each context has exactly one declared command.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSoWgC3ZwKzjT4SwMDu
test_pending_new_binding_offers_missing_tags_without_constructing_the_command read
tags.editor_default, which UnsuppliedTargetField does not declare (only
SuppliedTargetField owns a default); it failed on ce33201 before this branch's
binding change. The field's type is the fact; json_schema still omits the default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSoWgC3ZwKzjT4SwMDu
@trissim
trissim enabled auto-merge October 30, 2026 20:35
contexts() spelled type[CliCommand[CliResult]] twice (channel_targets.py:180, :396);
Answer already declares default=CliResult (cli_command.py:64), and the restated
default was the only reason channel_targets imported CliResult under TYPE_CHECKING.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSoWgC3ZwKzjT4SwMDu
trissim and others added 3 commits October 30, 2026 17:02
CommandTarget.bindings and its three overrides (thread, channel, project) existed only to
pick thread_bindings/channel_bindings/project_bindings by the resolved value, and forced
channel_targets to import CommandBinding under TYPE_CHECKING. CliCommand.bindings is now
a singledispatchmethod classmethod keyed on ResolvedThread, ResolvedChannel and Checkout;
the four target methods and both TYPE_CHECKING names (CommandBinding, CatalogAccess) are gone.

test_fork_cli_default_inherits_audience_but_not_commander_role called the deleted
TagChoice.for_new on a binding's tags; it now reads the child ForkSpec.child declares.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSoWgC3ZwKzjT4SwMDu
test_fork_cli_default_inherits_audience_but_not_commander_role called the deleted
TagChoice.for_new and its notification_bus parent has no forkable runtime. The
declared-parent test in test_thread_creation now tags that parent commander and reads
ForkSpec.child: the default fork drops the role, GivenTags(parent.tags) keeps it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSoWgC3ZwKzjT4SwMDu
@trissim
trissim enabled auto-merge October 30, 2026 21:14
…--P927

# Conflicts:
#	src/agent_comms/channel_targets.py
#	src/agent_comms/cli_commands.py
#	src/agent_comms/cli_verbs/fork.py
#	src/agent_comms/cli_verbs/new.py
#	src/agent_comms/cli_verbs/thread_tags.py
#	src/agent_comms/target_fields.py
#	tests/test_commander_notifications.py
#	tests/test_editor_defaults.py
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.

2 participants