Skip to content

Share viewed-object configuration through lazy ObjectState inheritance - #1750

Merged
trissim merged 4 commits into
mainfrom
work/codex-live--P192--toad
Nov 12, 2026
Merged

trissim merged 4 commits into
mainfrom
work/codex-live--P192--toad

Conversation

@trissim

@trissim trissim commented Nov 12, 2026 •

Copy link
Copy Markdown

P192 — viewed-object properties

Toad PR: #1750
ObjectState PR: OpenHCSDev/ObjectState#66
ObjectState merged: 226fcd8918e16f6d1b594cac0bdcf8057aab832a

The same ObjectConfiguration edits the properties sidebar and context form.
The settings declarations own field scope; ordinary files inherit view settings,
conversations inherit those and their composer/agent display fields. The actual
TabIdentity is saved beside raw explicit overrides. None means inherit; choosing
Override here pins even an equal value, and Use global default resumes inheritance.
The original global ObjectState supplies values and source information. A duplicate
open identity or a forbidden override refuses rather than introducing another answer.
Local display configuration stays local; remote agent and rule writes remain Core's.

ObjectState previously stopped at direct dataclass children. The shared extraction
now traverses each declared stored object once, retains shared instances and refuses
conflicting instances of one nominal configuration type. No parallel resolver.

Closed property sidebars inherit LazyThreadSidebar; the native session sidebar uses
that same lifecycle instead of a copy. Editors paint after native mount. Global and
object field-view families remain separate through their declared family owner.
All contextual action menus carry actual operations; the mirrored string/action
maps and show_target_menu are removed. Link menus keep their original admission.

Evidence:

  • p192-object-control.txt: passed live nested defaults, explicit-equal override,
    same-state sidebar/context edits, reset, source, persistence, and scope filtering.
  • p192-objectstate-controls.txt: 14 passed, exit 0, including nested/shared identity
    and collision controls.
  • p192-view-lifecycle.txt: original thread/channel/file navigation and close case,
    1 passed, exit 0. Initial launch failed before behavior because the inherited
    descriptor limit was 1024 while the existing helper requests descriptors >=1024;
    the successful launch used soft limit 8192, below hard limit 524288.
  • App, MainScreen, FilePreviewScreen and the shared forms import on the new sources.

The source check is exactly class ObjectConfiguration(, not the dialog's name.
The original order's created-owner citation named the new file's first line; the
actual state class is in object_configuration.py. The eliminated file-menu identity
copy is now owned by the selected ActionMenu row, not by a second callable map.

No paid provider command or profile was run. No install or physical desktop trial
is claimed by this source report. Auth recovery is independently held by codex-parallel.

@github-actions

github-actions Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

debt-src at aeeca92 blocks on 50 lines:

grew BannedVocabulary:src/toad/forms/form_view.py +2
grew BannedVocabulary:src/toad/forms/object_configuration.py +1
grew BannedVocabulary:src/toad/object_configuration.py +3
grew BannedVocabulary:src/toad/setting_declarations.py +4
grew NoneAbsence:src/toad/forms/object_configuration.py +2
grew NoneAbsence:src/toad/object_configuration.py +3
grew OwnTypeTest:src/toad/object_configuration.py +1
grew OwnTypeTest:src/toad/settings_scope.py +1
grew StringIdentity:.verification/p192-viewed-object-configuration/p192-author-action-menus.py +1
grew StringIdentity:.verification/p192-viewed-object-configuration/p192-author-assembly.py +10
grew StringIdentity:.verification/p192-viewed-object-configuration/p192-author-lazy-panels.py +13
grew StringIdentity:.verification/p192-viewed-object-configuration/p192-author-scopes.py +16
grew StringIdentity:.verification/p192-viewed-object-configuration/p192-author-state.py +13
grew StringIdentity:.verification/p192-viewed-object-configuration/p192-author-ui.py +16
grew StringIdentity:.verification/p192-viewed-object-configuration/p192-objectstate-author.py +1
grew TypeErrors:src/toad/configured_view.py +3
grew TypeErrors:src/toad/object_configuration.py +2
grew TypeErrors:src/toad/settings_scope.py +1
grew TypeErrors:src/toad/widgets/comms_menu.py +1
grew UnannotatedParameter:src/toad/app.py +1
grew UnannotatedParameter:src/toad/configured_view.py +3
grew UnannotatedParameter:src/toad/forms/object_configuration.py +4
grew UnannotatedParameter:src/toad/setting_declarations.py +1
grew UnannotatedParameter:src/toad/settings_scope.py +1
grew UnannotatedParameter:src/toad/widgets/comms_menu.py +2
grew UnannotatedParameter:src/toad/widgets/side_bar.py +2
found BannedVocabulary:src/toad/forms/form_view.py at src/toad/forms/form_view.py:80 src/toad/forms/form_view.py:92
found BannedVocabulary:src/toad/forms/object_configuration.py at src/toad/forms/object_configuration.py:18
found BannedVocabulary:src/toad/object_configuration.py at src/toad/object_configuration.py:69 src/toad/object_configuration.py:71 src/toad/object_configuration.py:75
found BannedVocabulary:src/toad/setting_declarations.py at src/toad/setting_declarations.py:22 src/toad/setting_declarations.py:36 src/toad/setting_declarations.py:37 src/toad/setting_declarations.py:38
found NoneAbsence:src/toad/forms/object_configuration.py at src/toad/forms/object_configuration.py:47 src/toad/forms/object_configuration.py:28
found NoneAbsence:src/toad/object_configuration.py at src/toad/object_configuration.py:96 src/toad/object_configuration.py:88 src/toad/object_configuration.py:45
found TypeErrors:src/toad/configured_view.py at src/toad/configured_view.py:54 ("App[Any]" has no attribute "session_navigation"  [attr-defined]) src/toad/configured_view.py:55 ("App[Any]" has no attribute "saved_settings"  [attr-defined]) src/toad/configured_view.py:56 ("App[Any]" has no attribute "saved_settings"  [attr-defined])
found TypeErrors:src/toad/object_configuration.py at src/toad/object_configuration.py:57 (Argument 1 to "decode" of "FieldCodec" has incompatible type "object"; expected "TypeForm[Never]"  [arg-type]) src/toad/object_configuration.py:89 (Argument 1 has incompatible type "SettingsScope"; expected "ToadApp"  [arg-type])
found TypeErrors:src/toad/settings_scope.py at src/toad/settings_scope.py:11 (Incompatible return value type (got "SettingsScope | App[Any]", expected "SettingsScope")  [return-value])
found TypeErrors:src/toad/widgets/comms_menu.py at src/toad/widgets/comms_menu.py:104 (Signature of "show" incompatible with supertype "ContextMenu"  [override])
found UnannotatedParameter:src/toad/app.py at src/toad/app.py:339 src/toad/app.py:570 src/toad/app.py:570 src/toad/app.py:570 src/toad/app.py:577 src/toad/app.py:577
found UnannotatedParameter:src/toad/configured_view.py at src/toad/configured_view.py:24 src/toad/configured_view.py:37 src/toad/configured_view.py:74
found UnannotatedParameter:src/toad/forms/object_configuration.py at src/toad/forms/object_configuration.py:18 src/toad/forms/object_configuration.py:23 src/toad/forms/object_configuration.py:35 src/toad/forms/object_configuration.py:46
found UnannotatedParameter:src/toad/setting_declarations.py at src/toad/setting_declarations.py:26 src/toad/setting_declarations.py:59 src/toad/setting_declarations.py:59
found UnannotatedParameter:src/toad/settings_scope.py at src/toad/settings_scope.py:28
found UnannotatedParameter:src/toad/widgets/comms_menu.py at src/toad/widgets/comms_menu.py:41 src/toad/widgets/comms_menu.py:70 src/toad/widgets/comms_menu.py:79 src/toad/widgets/comms_menu.py:79 src/toad/widgets/comms_menu.py:79 src/toad/widgets/comms_menu.py:85 src/toad/widgets/comms_menu.py:85 src/toad/widgets/comms_menu.py:104 src/toad/widgets/comms_menu.py:104 src/toad/widgets/comms_menu.py:108
found UnannotatedParameter:src/toad/widgets/side_bar.py at src/toad/widgets/side_bar.py:191 src/toad/widgets/side_bar.py:226 src/toad/widgets/side_bar.py:551 src/toad/widgets/side_bar.py:551 src/toad/widgets/side_bar.py:1256 src/toad/widgets/side_bar.py:1256 src/toad/widgets/side_bar.py:1275 src/toad/widgets/side_bar.py:1275
introduced BannedVocabulary:src/toad/forms/form_view.py at lines [80, 92]
introduced BannedVocabulary:src/toad/forms/object_configuration.py at lines [18]
introduced BannedVocabulary:src/toad/object_configuration.py at lines [69, 71, 75]
introduced BannedVocabulary:src/toad/setting_declarations.py at lines [22, 36, 37, 38]
introduced NoneAbsence:src/toad/forms/object_configuration.py at lines [28, 47]
introduced NoneAbsence:src/toad/object_configuration.py at lines [45, 88, 96]
introduced NoneAbsence:src/toad/widgets/comms_menu.py at lines [109]
Warn-only, never blocks (36)
src/toad/column_layout.py: LintFindings +1
src/toad/configured_view.py: LintFindings +1
src/toad/forms/object_configuration.py: LintFindings +1
src/toad/patch.py: LintFindings +1
src/toad/preferences.py: LintFindings +1
src/toad/screens/file_preview.py: LintFindings +2
src/toad/screens/main.py: LintFindings +1
src/toad/setting_declarations.py: LintFindings +1
src/toad/settings_scope.py: LintFindings +1
src/toad/textual_colours.py: LintFindings +1
src/toad/widgets/conversation.py: LintFindings +1
src/toad/widgets/history_anchor.py: LintFindings +1
src/toad/column_layout.py: Unformatted +1
src/toad/configured_view.py: Unformatted +1
src/toad/forms/object_configuration.py: Unformatted +1
src/toad/object_configuration.py: Unformatted +1
src/toad/setting_declarations.py: Unformatted +1
src/toad/settings_scope.py: Unformatted +1
found LintFindings:src/toad/column_layout.py at src/toad/column_layout.py:2 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/toad/configured_view.py at src/toad/configured_view.py:2 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/toad/forms/object_configuration.py at src/toad/forms/object_configuration.py:2 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/toad/patch.py at src/toad/patch.py:11 (F401 [*] `python_introspect.AnnotatedDataclassValidationMixin` imported but unused)
found LintFindings:src/toad/preferences.py at src/toad/preferences.py:26 (F401 [*] `python_introspect.AnnotatedDataclassValidationMixin` imported but unused)
found LintFindings:src/toad/screens/file_preview.py at src/toad/screens/file_preview.py:10 (F401 [*] `textual.containers.Vertical` imported but unused) src/toad/screens/file_preview.py:38 (SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements)
found LintFindings:src/toad/screens/main.py at src/toad/screens/main.py:57 (F401 [*] `toad.settings_scope.SettingsReader` imported but unused)
found LintFindings:src/toad/setting_declarations.py at src/toad/setting_declarations.py:3 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/toad/settings_scope.py at src/toad/settings_scope.py:2 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/toad/textual_colours.py at src/toad/textual_colours.py:11 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/toad/widgets/conversation.py at src/toad/widgets/conversation.py:1 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/toad/widgets/history_anchor.py at src/toad/widgets/history_anchor.py:17 (F401 [*] `toad.settings_scope.SettingsReader` imported but unused)
found Unformatted:src/toad/column_layout.py at src/toad/column_layout.py:1 (Black would reformat this file)
found Unformatted:src/toad/configured_view.py at src/toad/configured_view.py:1 (Black would reformat this file)
found Unformatted:src/toad/forms/object_configuration.py at src/toad/forms/object_configuration.py:1 (Black would reformat this file)
found Unformatted:src/toad/object_configuration.py at src/toad/object_configuration.py:1 (Black would reformat this file)
found Unformatted:src/toad/setting_declarations.py at src/toad/setting_declarations.py:1 (Black would reformat this file)
found Unformatted:src/toad/settings_scope.py at src/toad/settings_scope.py:1 (Black would reformat this file)

@trissim
trissim marked this pull request as ready for review November 12, 2026 23:09
Copilot AI balanced review requested due to automatic review settings November 12, 2026 23:09

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.

@trissim
trissim merged commit 5bc90cc into main Nov 12, 2026
1 of 2 checks passed
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