From ec312f9f9949c40e50f1a3623d9b1d151f7ba392 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Mon, 5 Oct 2026 02:46:22 -0400 Subject: [PATCH 1/4] docs: claim declaration-owned native measurement reuse --- .../SCOPE.md | 41 + .../before.json | 1334 +++++++++++++++++ 2 files changed, 1375 insertions(+) create mode 100644 evidence/native-height-declaration-admission-20261005/SCOPE.md create mode 100644 evidence/native-height-declaration-admission-20261005/before.json diff --git a/evidence/native-height-declaration-admission-20261005/SCOPE.md b/evidence/native-height-declaration-admission-20261005/SCOPE.md new file mode 100644 index 0000000000..881b3da9fd --- /dev/null +++ b/evidence/native-height-declaration-admission-20261005/SCOPE.md @@ -0,0 +1,41 @@ +# Height reuse from the original measurement declaration + +Base: merged66/main9ea7a109b648be526ce5d000b2c94799b57f3c23. +Frozen66/0945 and65/e253 source/control/artifacts remain immutable. + +Existing HeightDependency, Widget class binding and Layout class binding already +own the selected measurement/arrangement's available-height dependency. Widget +arrange and box resolution ask those same owners but only after a separate +CACHE_HEIGHT_INDEPENDENT_BOX/ARRANGEMENT class flag grants reuse. That repeats +an independently supplied decision across native and Toad subclasses and leaves +ordinary declared-independent containers remeasuring unchanged width/source. + +Remove both flags, their native subclass declarations and every native gate/test +reader. Existing proof/resource invalidation becomes load bearing by default. +No new class, mapping, cache, state flag, threshold or alternate algorithm. +Unknown/custom method/layout/scalar/relative-height proofs remain conservative; +original viewport, width, parent source/auto-size inputs and native revisions +remain. Dynamic instance method replacement has no class-declared proof: this +change does not manufacture a proof for arbitrary monkeypatches. + +Claims: Widget.arrange/_get_box_model class-flag gate family, native containers +and existing affected source controls. Heis owns all15 Toad declaration removals +in the future paired successor; current455 purpose/source stays untouched. +Einstein456 preparation completion is disjoint; no Toad writes by this contributor. + +Original436 Down78.432014329 observed nested native reflow/arrange/content-height +calls. Its profile observes execution, not redundancy, per-call duration or CPU +share. Source identifies the separate flag bypass of existing proof authority. +Current scroll measurement epochs already exclude mere scroll placement; do not +remove them or genuine custom/relative-height dependencies for this change. + +Complete before AST from original Package loader covers native production/tests +and Toad production/tests/tools with no parse omissions (before.json). AST alone +cannot prove dynamic dispatch or arbitrary external aliases. Read original owner, +class initialization, proof family and all flag consumers before implementation. +Pattern IMPL-5: duplicate authorization of one declared measurement relation. + +Source only/Draft/untested. Tests/App/runtime/wheel/prefix/provider/SDK/recording +are not authorized here; final coherent affected checks/installed pairing remain +separate. Existing oracle controls will compare warmed results against original +fresh calculation after cache clear, not retain a second opt-in switch. diff --git a/evidence/native-height-declaration-admission-20261005/before.json b/evidence/native-height-declaration-admission-20261005/before.json new file mode 100644 index 0000000000..481d6a41cb --- /dev/null +++ b/evidence/native-height-declaration-admission-20261005/before.json @@ -0,0 +1,1334 @@ +{ + "roots": [ + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "head": "9ea7a109b648be526ce5d000b2c94799b57f3c23", + "root": "src/textual", + "parsed": 249, + "omitted": [] + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "head": "9ea7a109b648be526ce5d000b2c94799b57f3c23", + "root": "tests", + "parsed": 460, + "omitted": [] + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "head": "bc611f6e4060943aacd77a1dee9afc7e04fc07d3", + "root": "src/toad", + "parsed": 288, + "omitted": [] + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "head": "bc611f6e4060943aacd77a1dee9afc7e04fc07d3", + "root": "tests", + "parsed": 397, + "omitted": [] + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "head": "bc611f6e4060943aacd77a1dee9afc7e04fc07d3", + "root": "tools", + "parsed": 41, + "omitted": [] + } + ], + "sites": [ + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 202, + "name": "height_dependency", + "node": "FunctionDef", + "context": "declaration", + "source": "def height_dependency(policy: HeightDependency) -> Callable[[Function], Function]:\n \"\"\"Declare a method's dependency; unknown overrides remain context-dependent.\n\n This does not cache a method's result or retain a widget. A declaration must\n describe the whole implementation, including additional work around super().\n \"\"\"\n def decorate(function: Function) -> Function:\n function._height_dependency = policy # type: ignore[attr-defined]\n return function\n return decorate" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 248, + "name": "box_depends_on_available_height", + "node": "FunctionDef", + "context": "declaration", + "source": "def box_depends_on_available_height(widget: Widget) -> bool:\n \"\"\"Conservative proof for the native box resolver, including its extrema.\"\"\"\n if not widget._native_box_measurement:\n return True\n depends, content_width, content_height = _local_box_inputs(widget)\n if depends:\n return True\n if content_width and widget._content_width_dependency.depends(widget):\n return True\n if content_height:\n return widget._content_height_dependency.box_depends(widget)\n return False" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 262, + "name": "_arrangement_wrapper_uses_height", + "node": "FunctionDef", + "context": "declaration", + "source": "def _arrangement_wrapper_uses_height(widget: Widget) -> bool:\n styles = widget.styles\n if (not widget._native_measurement_layout_hooks\n or styles.align_horizontal != \"left\" or styles.align_vertical != \"top\"):\n return True\n return any(child.styles.is_docked or child.styles.is_split\n or child.styles.overlay == \"screen\" for child in widget.displayed_children)" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 71, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "widget.layout._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 76, + "name": "_content_width_dependency", + "node": "Attribute", + "context": "Load", + "source": "widget.layout._content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 250, + "name": "_native_box_measurement", + "node": "Attribute", + "context": "Load", + "source": "widget._native_box_measurement" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 50, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "widget._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 57, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "widget._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 64, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "widget._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 79, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "widget._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 93, + "name": "_arrangement_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "widget._arrangement_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 96, + "name": "_arrangement_wrapper_uses_height", + "node": "Name", + "context": "Load", + "source": "_arrangement_wrapper_uses_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 101, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "widget._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 264, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "widget._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 98, + "name": "_arrangement_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "widget.layout._arrangement_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 103, + "name": "_arrangement_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "widget.layout._arrangement_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 123, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "widget._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 134, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "child._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 255, + "name": "_content_width_dependency", + "node": "Attribute", + "context": "Load", + "source": "widget._content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 258, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "widget._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 178, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "child._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 180, + "name": "_content_width_dependency", + "node": "Attribute", + "context": "Load", + "source": "child._content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/_measurement.py", + "line": 152, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "child._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/containers.py", + "line": 137, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/containers.py", + "line": 138, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/containers.py", + "line": 178, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/containers.py", + "line": 179, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 237, + "name": "_content_width_dependency", + "node": "Name", + "context": "Store", + "source": "_content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 238, + "name": "_content_height_dependency", + "node": "Name", + "context": "Store", + "source": "_content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 239, + "name": "_arrangement_height_dependency", + "node": "Name", + "context": "Store", + "source": "_arrangement_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 245, + "name": "_content_width_dependency", + "node": "Attribute", + "context": "Store", + "source": "cls._content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 246, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Store", + "source": "cls._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 247, + "name": "_arrangement_height_dependency", + "node": "Attribute", + "context": "Store", + "source": "cls._arrangement_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 279, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 301, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 250, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Store", + "source": "cls._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 253, + "name": "_content_width_dependency", + "node": "Attribute", + "context": "Store", + "source": "cls._content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 249, + "name": "_arrangement_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "cls._arrangement_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layout.py", + "line": 252, + "name": "_arrangement_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "cls._arrangement_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layouts/grid.py", + "line": 49, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layouts/horizontal.py", + "line": 23, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layouts/stream.py", + "line": 44, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layouts/stream.py", + "line": 137, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/layouts/vertical.py", + "line": 21, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1891, + "name": "_arrangement_depends_on_available_height", + "node": "FunctionDef", + "context": "declaration", + "source": "def _arrangement_depends_on_available_height(self) -> bool:\n \"\"\"Own the same complete dependency for arrangement and measurement.\n\n A native auto-size query may ask before arranging. Both questions read\n this original resource, invalidated by the same child/style/layout\n inputs, rather than walking the dependency subtree twice.\n \"\"\"\n epoch = (self._nodes._updates, self._layout_updates)\n proof = self.__dict__.get(\"_height_arrangement_cache\")\n if proof is None or proof[0] != epoch:\n self._arrangement_cache.clear()\n dep" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1910, + "name": "_box_depends_on_available_height", + "node": "FunctionDef", + "context": "declaration", + "source": "def _box_depends_on_available_height(self) -> bool:\n nodes = self.__dict__.get(\"_nodes\")\n epoch = (nodes._updates if nodes is not None else 0, self._layout_updates)\n cached = self.__dict__.get(\"_height_dependency_cache\")\n if cached is not None and cached[0] == epoch:\n return cached[1]\n dependent = box_depends_on_available_height(self)\n self._height_dependency_cache = (epoch, dependent)\n return dependent" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 313, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 320, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 326, + "name": "_content_height_dependency", + "node": "Name", + "context": "Store", + "source": "_content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 327, + "name": "_content_width_dependency", + "node": "Name", + "context": "Store", + "source": "_content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 328, + "name": "_native_box_measurement", + "node": "Name", + "context": "Store", + "source": "_native_box_measurement" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 329, + "name": "_native_measurement_layout_hooks", + "node": "Name", + "context": "Store", + "source": "_native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 859, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1432, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Attribute", + "context": "Load", + "source": "self.CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 2092, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 2124, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 3055, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 4114, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Store", + "source": "cls._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 4115, + "name": "_content_width_dependency", + "node": "Attribute", + "context": "Store", + "source": "cls._content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 4116, + "name": "_native_box_measurement", + "node": "Attribute", + "context": "Store", + "source": "cls._native_box_measurement" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 4124, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Store", + "source": "cls._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1916, + "name": "box_depends_on_available_height", + "node": "Name", + "context": "Load", + "source": "box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1945, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Load", + "source": "self.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1433, + "name": "_arrangement_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "self._arrangement_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1903, + "name": "_arrangement_wrapper_uses_height", + "node": "Name", + "context": "Load", + "source": "_arrangement_wrapper_uses_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1945, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "self._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 337, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "self._content_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 338, + "name": "_content_width_dependency", + "node": "Attribute", + "context": "Load", + "source": "self._content_width_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "src/textual", + "path": "src/textual/widget.py", + "line": 1904, + "name": "_arrangement_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "self.layout._arrangement_height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 18, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 19, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 24, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 25, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 108, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 371, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 200, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Attribute", + "context": "Store", + "source": "parent.CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 203, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Attribute", + "context": "Store", + "source": "parent.CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_arrangement.py", + "line": 395, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 19, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 58, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Store", + "source": "column.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 61, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Store", + "source": "column.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 167, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 205, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Store", + "source": "column.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 208, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Store", + "source": "column.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 57, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 78, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 144, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 156, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Store", + "source": "column.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 159, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Store", + "source": "column.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 162, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Attribute", + "context": "Load", + "source": "Widget.CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 185, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "width._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 186, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "stream._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 229, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "fill._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 230, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "custom._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 247, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 266, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 33, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 74, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 81, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 129, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "widget._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 142, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/textual-native-subtree-strips-20261002", + "root": "tests", + "path": "tests/test_height_independent_measurement.py", + "line": 155, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "column._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/conversation_markdown.py", + "line": 222, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/conversation.py", + "line": 273, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/conversation.py", + "line": 285, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/conversation.py", + "line": 276, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/conversation.py", + "line": 287, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/message_divider.py", + "line": 87, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/prepared_markdown.py", + "line": 191, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/side_bar.py", + "line": 54, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/side_bar.py", + "line": 57, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/sidebar_tree.py", + "line": 16, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/sidebar_tree.py", + "line": 20, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/sidebar_tree.py", + "line": 39, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/sidebar_tree.py", + "line": 202, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/sidebar_viewport.py", + "line": 9, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/tool_call.py", + "line": 85, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/transcript_history.py", + "line": 267, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/transcript_history.py", + "line": 268, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/transcript_history.py", + "line": 432, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/transcript_history.py", + "line": 433, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/viewport_body.py", + "line": 488, + "name": "CACHE_HEIGHT_INDEPENDENT_BOX", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_BOX" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/viewport_body.py", + "line": 489, + "name": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT", + "node": "Name", + "context": "Store", + "source": "CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "src/toad", + "path": "src/toad/widgets/viewport_body.py", + "line": 694, + "name": "height_dependency", + "node": "Name", + "context": "Load", + "source": "height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "tests", + "path": "tests/prepared_height_contract_pilot.py", + "line": 56, + "name": "_native_measurement_layout_hooks", + "node": "Attribute", + "context": "Load", + "source": "node._native_measurement_layout_hooks" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "tests", + "path": "tests/prepared_height_contract_pilot.py", + "line": 55, + "name": "_box_depends_on_available_height", + "node": "Attribute", + "context": "Load", + "source": "node._box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "tests", + "path": "tests/prepared_height_contract_pilot.py", + "line": 59, + "name": "box_depends_on_available_height", + "node": "Name", + "context": "Load", + "source": "box_depends_on_available_height" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "tests", + "path": "tests/prepared_height_contract_pilot.py", + "line": 54, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "node._content_height_dependency" + }, + { + "repository": "/home/ts/wt/toad-viewport-raster-cpu-continuation-20261001", + "root": "tests", + "path": "tests/prepared_height_contract_pilot.py", + "line": 60, + "name": "_content_height_dependency", + "node": "Attribute", + "context": "Load", + "source": "node._content_height_dependency" + } + ], + "limits": [ + "AST name/attribute matching does not establish arbitrary dynamic alias targets. Source contracts bind class-declared hooks; unknown measurements stay context-dependent." + ] +} From 455d8ec2d0339e1f0ddba2634361c7aebf86386e Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Mon, 5 Oct 2026 02:49:45 -0400 Subject: [PATCH 2/4] refactor: derive layout reuse from declared height dependencies --- .../SCOPE.md | 31 +++++++++ src/textual/_measurement.py | 2 +- src/textual/containers.py | 6 -- src/textual/widget.py | 25 ++------ tests/test_height_independent_arrangement.py | 64 ++++++++----------- tests/test_height_independent_measurement.py | 57 +++++++---------- 6 files changed, 89 insertions(+), 96 deletions(-) diff --git a/evidence/native-height-declaration-admission-20261005/SCOPE.md b/evidence/native-height-declaration-admission-20261005/SCOPE.md index 881b3da9fd..febe91c32e 100644 --- a/evidence/native-height-declaration-admission-20261005/SCOPE.md +++ b/evidence/native-height-declaration-admission-20261005/SCOPE.md @@ -39,3 +39,34 @@ Source only/Draft/untested. Tests/App/runtime/wheel/prefix/provider/SDK/recordin are not authorized here; final coherent affected checks/installed pairing remain separate. Existing oracle controls will compare warmed results against original fresh calculation after cache clear, not retain a second opt-in switch. + + +## Coherent implementation checkpoint + +Widget.arrange always borrows its existing source-epoch height-dependency proof; +its original resource key retains width, viewport, NodeList/layout source, +optimal mode and dependency result. The actual calculation receives the original +size, never the normalized cache key. Widget._get_box_model similarly borrows +its existing selected proof; only proven-unused incoming-height key inputs are +normalized. Original parent revision/auto-size inputs and all source invalidation +remain unchanged. No measurement or style proof algorithm is relaxed. + +Deleted both Widget opt-in declarations and both decisions plus all four native +VerticalGroup/HorizontalGroup labels. Existing controls now instantiate original +native classes rather than four empty opt-in wrapper classes. Reference results +come from original fresh calculation after cache clear for each input; warmed +results compare against those exact originals. Custom measurement/layout/extent/ +scalar/hook, stream/grid/docking, viewport/relative-height, raw mutation, parent +auto-sizing and scroll/retirement controls stay in the affected source family. +No alternate raw measurement algorithm, new test toggle or proof mirror. + +All original native source/test flag consumers are gone. Heis owns deletion of +15 remaining Toad class labels in the future paired successor; they are explicitly +unfinished consumer cleanup, not current455 edits. Native dependencies remain +class-declared through original subclass initialization: arbitrary later runtime +monkeypatch rebinding is an unresolved external dynamic boundary, not a proven +native reuse contract. No public input or installed runtime was changed. + +Source syntax/diff checked only. No controls executed, App, wheel, dependency +operation, prefix import/write, SDK/provider or recording. Draft/source unqualified; +changed native controls and actual paired application acceptance remain required. diff --git a/src/textual/_measurement.py b/src/textual/_measurement.py index b5db43f3a0..51eef97118 100644 --- a/src/textual/_measurement.py +++ b/src/textual/_measurement.py @@ -1,4 +1,4 @@ -"""Declaration-owned available-height dependencies for optional layout reuse.""" +"""Declaration-owned available-height dependencies for native layout reuse.""" from __future__ import annotations diff --git a/src/textual/containers.py b/src/textual/containers.py index 6aa27302a8..f60929b660 100644 --- a/src/textual/containers.py +++ b/src/textual/containers.py @@ -134,9 +134,6 @@ class Vertical(Widget): class VerticalGroup(Widget): """A non-expanding container with vertical layout and no scrollbars.""" - CACHE_HEIGHT_INDEPENDENT_BOX = True - CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT = True - DEFAULT_CSS = """ VerticalGroup { width: 1fr; @@ -175,9 +172,6 @@ class Horizontal(Widget): class HorizontalGroup(Widget): """A non-expanding container with horizontal layout and no scrollbars.""" - CACHE_HEIGHT_INDEPENDENT_BOX = True - CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT = True - DEFAULT_CSS = """ HorizontalGroup { width: 1fr; diff --git a/src/textual/widget.py b/src/textual/widget.py index 6858b57bf4..80760804c6 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -310,19 +310,6 @@ class Widget(DOMNode): CACHE_SUBTREE_GEOMETRY: ClassVar[bool] = False """Reuse an unchanged contained scene during unrelated sibling reflows.""" - CACHE_HEIGHT_INDEPENDENT_BOX: ClassVar[bool] = False - """Opt in to sharing box measurements when declarations prove height independence. - - Unknown measurement/layout overrides remain context-dependent. Dynamic method - replacement requires disabling this opt-in or declaring the replacement on a - class so its measurement contract is bound normally. - """ - CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT: ClassVar[bool] = False - """Reuse complete arrangements only when declarations prove height independence. - - Unknown layout/hooks retain full-context keys. As with box reuse, dynamic - method replacement requires disabling reuse or rebinding the class contract. - """ _content_height_dependency: ClassVar[HeightDependency] = NATIVE_WIDGET_HEIGHT _content_width_dependency: ClassVar[HeightDependency] = NATIVE_WIDGET_WIDTH _native_box_measurement: ClassVar[bool] = True @@ -1428,10 +1415,12 @@ def arrange(self, size: Size, optimal: bool = False) -> DockArrangeResult: Widget locations. """ viewport = self.screen.size - cache_key: tuple[object, ...] = (size, viewport, self._nodes._updates, self._layout_updates, optimal) - if self.CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT: - independent = not self._arrangement_depends_on_available_height() - cache_key = ((size.with_height(0) if independent else size), *cache_key[1:], independent) + independent = not self._arrangement_depends_on_available_height() + cache_key: tuple[object, ...] = ( + size.with_height(0) if independent else size, + viewport, self._nodes._updates, self._layout_updates, optimal, + independent, + ) cached_result = self._arrangement_cache.get(cache_key) if cached_result is not None: return cached_result @@ -1942,7 +1931,7 @@ def _get_box_model( revision = (self._layout_updates, nodes._updates if nodes is not None else 0) cache_container, cache_height_fraction = container, height_fraction - if self.CACHE_HEIGHT_INDEPENDENT_BOX and not self._box_depends_on_available_height(): + if not self._box_depends_on_available_height(): # The class/method/layout declarations proved these two inputs unused. # Include the immediate parent's actual auto-size inputs before idle, # and retire prior epochs rather than accumulating stale aliases. diff --git a/tests/test_height_independent_arrangement.py b/tests/test_height_independent_arrangement.py index c58fa604e1..90e907777b 100644 --- a/tests/test_height_independent_arrangement.py +++ b/tests/test_height_independent_arrangement.py @@ -14,21 +14,12 @@ from textual.widgets import Static -class CachedArrangement(VerticalGroup): - CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT = True - CACHE_HEIGHT_INDEPENDENT_BOX = True - - async def test_scroll_preserves_measurements_and_source_changes_retire_before_idle(): - class CachedScrollable(ScrollableContainer): - CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT = True - CACHE_HEIGHT_INDEPENDENT_BOX = True - app = App() async with app.run_test(size=(60, 20)) as pilot: child = Static("content") child.styles.height = 20 - parent = CachedScrollable(child) + parent = ScrollableContainer(child) parent.styles.width, parent.styles.height = 40, 4 await app.mount(parent) await pilot.pause() @@ -76,7 +67,7 @@ class CachedScrollable(ScrollableContainer): async def test_unrelated_style_and_topology_changes_preserve_subtree_reuse(): app = App() async with app.run_test() as pilot: - parent = CachedArrangement(Static("one")) + parent = VerticalGroup(Static("one")) sibling = VerticalGroup(Static("unrelated")) await app.mount(parent, sibling) await pilot.pause() @@ -93,7 +84,7 @@ async def test_raw_descendant_style_write_invalidates_without_refresh(): app = App() async with app.run_test() as pilot: child = Static("one") - parent = CachedArrangement(child) + parent = VerticalGroup(child) await app.mount(parent) await pilot.pause() first = parent.arrange(Size(40, 0)) @@ -104,12 +95,9 @@ async def test_raw_descendant_style_write_invalidates_without_refresh(): async def test_box_reuse_observes_immediate_parent_width_exception(): - class CachedLeaf(Static): - CACHE_HEIGHT_INDEPENDENT_BOX = True - app = App() async with app.run_test() as pilot: - leaf = CachedLeaf("intrinsic width") + leaf = Static("intrinsic width") leaf.styles.width = "auto" leaf.styles.max_width = "50%" leaf.styles.height = 1 @@ -133,7 +121,7 @@ async def test_grid_auto_track_extrema_keep_outer_height_dependency(field, value app = App() async with app.run_test() as pilot: child = Static("wrapped text " * 10) - parent = CachedArrangement(child) + parent = VerticalGroup(child) parent.styles.layout = "grid" parent.styles.grid_columns = "auto" setattr(child.styles, field, value) @@ -148,8 +136,8 @@ async def test_local_style_projection_covers_all_raw_mutation_boundaries(): app = App() async with app.run_test() as pilot: child = Static("one") - parent = CachedArrangement(child) - sibling = CachedArrangement(Static("unrelated")) + parent = VerticalGroup(child) + sibling = VerticalGroup(Static("unrelated")) await app.mount(parent, sibling) await pilot.pause() style = child.styles.base @@ -170,7 +158,7 @@ async def test_local_style_projection_covers_all_raw_mutation_boundaries(): async def test_reuse_skips_a_complete_intrinsic_arrangement(layout): app = App() async with app.run_test() as pilot: - parent = CachedArrangement(Static("one"), Static("wrapped " * 15)) + parent = VerticalGroup(Static("one"), Static("wrapped " * 15)) parent.styles.layout = layout await app.mount(parent) await pilot.pause() @@ -187,7 +175,7 @@ async def test_reuse_matches_native_placements_and_invalidates_before_idle(layou app = App() async with app.run_test() as pilot: inner = VerticalGroup(Static("nested " * 10)) - parent = CachedArrangement(inner, Static("second")) + parent = VerticalGroup(inner, Static("second")) parent.styles.layout = layout parent.styles.padding = (1, 2) inner.styles.margin = (1, 2, 3, 4) @@ -197,10 +185,12 @@ async def test_reuse_matches_native_placements_and_invalidates_before_idle(layou def check(): sizes = [Size(width, height) for width in (20, 40) for height in (0, 10, 100)] - parent.CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT = False - parent._clear_arrangement_cache() - expected = [parent.arrange(size).placements[:] for size in sizes] - parent.CACHE_HEIGHT_INDEPENDENT_ARRANGEMENT = True + # Each original fresh calculation is the reference for reuse; + # no second class-level authorization controls the same proof. + expected = [] + for size in sizes: + parent._clear_arrangement_cache() + expected.append(parent.arrange(size).placements[:]) parent._clear_arrangement_cache() assert [parent.arrange(size).placements for size in sizes] == expected @@ -229,7 +219,7 @@ async def test_context_sensitive_flow_keeps_native_height_inputs(field, value): app = App() async with app.run_test() as pilot: child = Static("text") - parent = CachedArrangement(child) + parent = VerticalGroup(child) await app.mount(parent) setattr(child.styles, field, value) await pilot.pause() @@ -248,7 +238,7 @@ def get_content_height(self, container, viewport, width): async with app.run_test() as pilot: child = ContextContent("text") child.styles.height = 2 # Box is constant; direct content measurement is not. - parent = CachedArrangement(child) + parent = VerticalGroup(child) parent.styles.layout = layout await app.mount(parent) await pilot.pause() @@ -264,7 +254,7 @@ def get_content_height(self, container, viewport, width): async def test_grid_context_rules_retain_native_arrangements(field, value): app = App() async with app.run_test() as pilot: - parent = CachedArrangement(Static("text")) + parent = VerticalGroup(Static("text")) parent.styles.layout = "grid" setattr(parent.styles, field, value) await app.mount(parent) @@ -279,7 +269,7 @@ class UnknownLayout(VerticalLayout): def arrange(self, parent, children, size, greedy=True): return super().arrange(parent, children, size, greedy) - class UnknownHook(CachedArrangement): + class UnknownHook(VerticalGroup): def pre_layout(self, layout): super().pre_layout(layout) @@ -289,10 +279,10 @@ def resolve(self, size, viewport, fraction_unit=Fraction(1)): app = App() async with app.run_test() as pilot: - layout = CachedArrangement(Static("text")) + layout = VerticalGroup(Static("text")) layout.styles.set_rule("layout", UnknownLayout()) hook = UnknownHook(Static("text")) - scalar = CachedArrangement(Static("text")) + scalar = VerticalGroup(Static("text")) scalar.styles.layout = "grid" scalar.styles.set_rule("grid_rows", (UnknownScalar(1, Unit.CELLS, Unit.HEIGHT),)) await app.mount(layout, hook, scalar) @@ -307,7 +297,7 @@ async def test_paint_rules_preserve_native_content_geometry_across_raw_writes(): app = App() async with app.run_test() as pilot: child = Static("unchanged wrapped content " * 6) - parent = CachedArrangement(child) + parent = VerticalGroup(child) await app.mount(parent) await pilot.pause() style = child.styles.inline @@ -336,7 +326,7 @@ def render(self): async with app.run_test() as pilot: child = StyleMeasuredContent() child.styles.color = "red" - parent = CachedArrangement(child) + parent = VerticalGroup(child) await app.mount(parent) await pilot.pause() size = Size(40, 100) @@ -353,7 +343,7 @@ async def test_raw_display_rule_publishes_original_native_child_selection(): async with app.run_test() as pilot: first, second = Static("first"), Static("second") first.styles.height, second.styles.height = 3, 4 - parent = CachedArrangement(first, second) + parent = VerticalGroup(first, second) await app.mount(parent) await pilot.pause() size = Size(40, 100) @@ -368,8 +358,6 @@ async def test_raw_display_rule_publishes_original_native_child_selection(): async def test_inherited_paint_mutation_retires_opaque_descendant_measurements(): class InheritedStyleContent(Static): - CACHE_HEIGHT_INDEPENDENT_BOX = True - def render(self): color = self.rich_style.color.get_truecolor() return "one\ntwo\nthree" if color == (255, 0, 0) else "one" @@ -377,7 +365,7 @@ def render(self): app = App() async with app.run_test() as pilot: child = InheritedStyleContent() - parent = CachedArrangement(child) + parent = VerticalGroup(child) parent.styles.color = "red" await app.mount(parent) await pilot.pause() @@ -391,7 +379,7 @@ def render(self): async def test_height_independent_custom_layout_hook_remains_style_sensitive(): - class StyledPlacement(CachedArrangement): + class StyledPlacement(VerticalGroup): @height_dependency(INDEPENDENT_HEIGHT) def process_layout(self, placements): offset = Offset(0, 2 if self.styles.color == Color.parse("red") else 0) diff --git a/tests/test_height_independent_measurement.py b/tests/test_height_independent_measurement.py index e7154be68b..267345e3ac 100644 --- a/tests/test_height_independent_measurement.py +++ b/tests/test_height_independent_measurement.py @@ -15,10 +15,6 @@ from textual.widgets import Static -class CachedColumn(VerticalGroup): - CACHE_HEIGHT_INDEPENDENT_BOX = True - - def box(widget, height, *, width=40, greedy=True): return widget._get_box_model(Size(width, height), widget.app.size, Fraction(width), Fraction(height), greedy=greedy) @@ -27,7 +23,7 @@ def box(widget, height, *, width=40, greedy=True): async def test_native_nested_flow_reuses_only_unused_height_inputs(): app = App() async with app.run_test() as pilot: - column = CachedColumn(HorizontalGroup(Static("first"), Static("second"))) + column = VerticalGroup(HorizontalGroup(Static("first"), Static("second"))) await app.mount(column) await pilot.pause() assert not column._box_depends_on_available_height() @@ -50,15 +46,15 @@ async def test_native_nested_flow_reuses_only_unused_height_inputs(): async def test_height_dependent_css_and_extrema_match_native_contexts(field, value): app = App() async with app.run_test() as pilot: - column = CachedColumn(Static("wrapped text " * 25)) + column = VerticalGroup(Static("wrapped text " * 25)) await app.mount(column) setattr(column.styles, field, value) await pilot.pause() assert column._box_depends_on_available_height() - column.CACHE_HEIGHT_INDEPENDENT_BOX = False - column._box_model_cache.clear() - expected = {height: box(column, height) for height in (0, 10, 30, 70)} - column.CACHE_HEIGHT_INDEPENDENT_BOX = True + expected = {} + for height in (0, 10, 30, 70): + column._box_model_cache.clear() + expected[height] = box(column, height) column._box_model_cache.clear() for height, measured in expected.items(): assert box(column, height) == measured @@ -68,7 +64,7 @@ async def test_descendant_style_change_invalidates_proof_before_idle(): app = App() async with app.run_test() as pilot: leaf = Static("one") - column = CachedColumn(VerticalGroup(leaf)) + column = VerticalGroup(VerticalGroup(leaf)) await app.mount(column) await pilot.pause() assert not column._box_depends_on_available_height() @@ -87,7 +83,7 @@ async def test_structural_admission_retires_normalized_boxes(): app = App() async with app.run_test() as pilot: inner = VerticalGroup(Static("first")) - column = CachedColumn(inner) + column = VerticalGroup(inner) await app.mount(column) await pilot.pause() before = box(column, 30) @@ -99,7 +95,7 @@ async def test_structural_admission_retires_normalized_boxes(): async def test_custom_measurement_and_layout_overrides_are_context_dependent(): - class CustomHeight(CachedColumn): + class CustomHeight(VerticalGroup): def get_content_height(self, container, viewport, width): return container.height + 3 @@ -107,18 +103,18 @@ class CustomLayout(VerticalLayout): def arrange(self, parent, children, size, greedy=True): return super().arrange(parent, children, size, greedy) - class CustomHook(CachedColumn): + class CustomHook(VerticalGroup): def pre_layout(self, layout): super().pre_layout(layout) - class CustomPlacement(CachedColumn): + class CustomPlacement(VerticalGroup): def process_layout(self, placements): return placements app = App() async with app.run_test() as pilot: custom = CustomHeight() - layout = CachedColumn(Static("auto height")) + layout = VerticalGroup(Static("auto height")) layout.styles.set_rule("layout", CustomLayout()) hook = CustomHook(Static("auto height")) placement = CustomPlacement(Static("auto height")) @@ -136,7 +132,7 @@ async def test_flow_rejects_context_sensitive_child_placement(field, value): app = App() async with app.run_test() as pilot: child = VerticalGroup(Static("text")) - column = CachedColumn(child) + column = VerticalGroup(child) await app.mount(column) await pilot.pause() assert not column._box_depends_on_available_height() @@ -147,25 +143,20 @@ async def test_flow_rejects_context_sensitive_child_placement(field, value): async def test_width_and_viewport_scalars_preserve_native_results(): app = App() async with app.run_test() as pilot: - column = CachedColumn(Static("text")) + column = VerticalGroup(Static("text")) await app.mount(column) await pilot.pause() for unit in (Unit.CELLS, Unit.WIDTH, Unit.VIEW_HEIGHT, Unit.VIEW_WIDTH): column.styles.height = Scalar(10, unit, Unit.HEIGHT) assert not column._box_depends_on_available_height() - column.CACHE_HEIGHT_INDEPENDENT_BOX = False column._box_model_cache.clear() expected = box(column, 70) - column.CACHE_HEIGHT_INDEPENDENT_BOX = True assert box(column, 0) == expected assert box(column, 70) == expected - assert Widget.CACHE_HEIGHT_INDEPENDENT_BOX is False async def test_unknown_width_and_stream_overrides_do_not_inherit_a_proof(): class HeightSizedWidth(Static): - CACHE_HEIGHT_INDEPENDENT_BOX = True - def get_content_width(self, container, viewport): return container.height @@ -178,7 +169,7 @@ def arrange(self, parent, children, size, greedy=True): width = HeightSizedWidth("text") width.styles.width = "auto" width.styles.height = 1 - stream = CachedColumn(Static("text")) + stream = VerticalGroup(Static("text")) stream.styles.set_rule("layout", UnknownStream()) await app.mount(width, stream) await pilot.pause() @@ -193,7 +184,7 @@ async def test_width_padding_margin_offset_and_viewport_parity(layout_name): app = App() async with app.run_test() as pilot: children = [Static("line one\nline two"), Static("wrapped " * 15)] - column = CachedColumn(*children) + column = VerticalGroup(*children) column.styles.layout = layout_name column.styles.padding = (1, 2) children[0].styles.margin = (1, 2, 3, 4) @@ -202,10 +193,10 @@ async def test_width_padding_margin_offset_and_viewport_parity(layout_name): await pilot.pause() inputs = [(width, height, greedy) for width in (20, 40) for height in (0, 10, 100) for greedy in (False, True)] - column.CACHE_HEIGHT_INDEPENDENT_BOX = False - column._box_model_cache.clear() - expected = [box(column, height, width=width, greedy=greedy) for width, height, greedy in inputs] - column.CACHE_HEIGHT_INDEPENDENT_BOX = True + expected = [] + for width, height, greedy in inputs: + column._box_model_cache.clear() + expected.append(box(column, height, width=width, greedy=greedy)) column._box_model_cache.clear() assert [box(column, height, width=width, greedy=greedy) for width, height, greedy in inputs] == expected @@ -213,13 +204,13 @@ async def test_width_padding_margin_offset_and_viewport_parity(layout_name): async def test_unset_height_and_custom_extrema_keep_the_full_context(): from textual._extrema import Extrema - class CustomExtrema(CachedColumn): + class CustomExtrema(VerticalGroup): def _resolve_extrema(self, container, viewport, width_fraction, height_fraction): return Extrema(min_height=Fraction(container.height)) app = App() async with app.run_test() as pilot: - fill = CachedColumn(Static("fill")) + fill = VerticalGroup(Static("fill")) custom = CustomExtrema(Static("extent")) await app.mount(fill, custom) await pilot.pause() @@ -240,7 +231,7 @@ def resolve(self, size, viewport, fraction_unit=Fraction(1)): app = App() async with app.run_test() as pilot: - column = CachedColumn(Static("text")) + column = VerticalGroup(Static("text")) await app.mount(column) await pilot.pause() column.styles.height = ContextScalar(1, Unit.CELLS, Unit.HEIGHT) @@ -256,7 +247,7 @@ async def test_raw_width_percentage_height_keeps_native_parent_stretch(): app = App() async with app.run_test() as pilot: child = Static("text") - column = CachedColumn(child) + column = VerticalGroup(child) await app.mount(column) await pilot.pause() child.styles.set_rule("height", Scalar(50, Unit.PERCENT, Unit.WIDTH)) From b158ca382f835db4351d920eef6c16f77490b2c6 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Mon, 5 Oct 2026 02:50:30 -0400 Subject: [PATCH 3/4] docs: bind sole native measurement proof consumers --- .../after.json | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 evidence/native-height-declaration-admission-20261005/after.json diff --git a/evidence/native-height-declaration-admission-20261005/after.json b/evidence/native-height-declaration-admission-20261005/after.json new file mode 100644 index 0000000000..a90f8142f5 --- /dev/null +++ b/evidence/native-height-declaration-admission-20261005/after.json @@ -0,0 +1,53 @@ +{ + "head": "455d8ec2d0339e1f0ddba2634361c7aebf86386e", + "roots": [ + { + "root": "src/textual", + "parsed": 249, + "omitted": [] + }, + { + "root": "tests", + "parsed": 460, + "omitted": [] + } + ], + "retired_flags": [], + "proof_declarations": [ + { + "path": "src/textual/widget.py", + "line": 1880, + "name": "_arrangement_depends_on_available_height" + }, + { + "path": "src/textual/widget.py", + "line": 1899, + "name": "_box_depends_on_available_height" + } + ], + "proof_calls": [ + { + "path": "src/textual/_measurement.py", + "line": 93, + "source": "widget._arrangement_depends_on_available_height()" + }, + { + "path": "src/textual/_measurement.py", + "line": 134, + "source": "child._box_depends_on_available_height()" + }, + { + "path": "src/textual/widget.py", + "line": 1418, + "source": "self._arrangement_depends_on_available_height()" + }, + { + "path": "src/textual/widget.py", + "line": 1934, + "source": "self._box_depends_on_available_height()" + } + ], + "limits": [ + "AST name matching is not arbitrary external/dynamic alias proof. Toad15 label deletions remain Heis-owned future paired work; current455 stays frozen. Class-contract binding and source invalidation remain original." + ] +} From 3aa29fc66d4214a5bf001fdf7d5889a5535995d6 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Mon, 5 Oct 2026 02:57:51 -0400 Subject: [PATCH 4/4] docs: qualify declared height reuse with existing native App controls --- .../SCOPE.md | 36 +++++++++++++++---- .../source-batch01.json | 21 +++++++++++ .../source-batch01.log | 2 ++ 3 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 evidence/native-height-declaration-admission-20261005/source-batch01.json create mode 100644 evidence/native-height-declaration-admission-20261005/source-batch01.log diff --git a/evidence/native-height-declaration-admission-20261005/SCOPE.md b/evidence/native-height-declaration-admission-20261005/SCOPE.md index febe91c32e..a2c481dc00 100644 --- a/evidence/native-height-declaration-admission-20261005/SCOPE.md +++ b/evidence/native-height-declaration-admission-20261005/SCOPE.md @@ -35,9 +35,9 @@ cannot prove dynamic dispatch or arbitrary external aliases. Read original owner class initialization, proof family and all flag consumers before implementation. Pattern IMPL-5: duplicate authorization of one declared measurement relation. -Source only/Draft/untested. Tests/App/runtime/wheel/prefix/provider/SDK/recording -are not authorized here; final coherent affected checks/installed pairing remain -separate. Existing oracle controls will compare warmed results against original +At the initial source checkpoint this was source-only/Draft/untested. Later +named source App authorization and qualification are recorded below; installed +pairing remains separate. Existing oracle controls will compare warmed results against original fresh calculation after cache clear, not retain a second opt-in switch. @@ -67,6 +67,30 @@ class-declared through original subclass initialization: arbitrary later runtime monkeypatch rebinding is an unresolved external dynamic boundary, not a proven native reuse contract. No public input or installed runtime was changed. -Source syntax/diff checked only. No controls executed, App, wheel, dependency -operation, prefix import/write, SDK/provider or recording. Draft/source unqualified; -changed native controls and actual paired application acceptance remain required. +At implementation checkpoint455d8ec2 only source syntax/diff was checked. No +controls/App/wheel/dependency/prefix/SDK/provider/recording had run. Subsequent +changed source App qualification is below; installed pairing remains unqualified. + + +## Changed native source App qualification + +Executed source/controlb158ca382f835db4351d920eef6c16f77490b2c6; production +455d8ec2d0339e1f0ddba2634361c7aebf86386e. ONE originally authorized source App +batch: **62PASS/4.51s pytest**,5.604s controller, exit0. Exact argv/interpreter/raw +output/hash are source-batch01.json and source-batch01.log. Existing system +/usr/bin/python and dependencies, PYTHONPATH=src; no new environment/installation. + +The two existing modules retain fresh original calculation versus warmed reuse, +width/viewport/optimal/parent inputs, full source mutation/inherited style/display/ +structural admission and scroll retirement. Custom measurement/layout/hooks, +scalar resolvers, relative/fractional/extrema, stream/grid/automatic sizing keep +conservative context. These 62 source App cases pass without either retired flag +or label-only wrapper class. No failed case or rerun; accepted66 compositor22 +and frozen65 controls not repeated. + +This confirms the changed native source family, not installed Toad/body/wheel, +Linux motion, frame cadence, cold traversal cost, CPU gain or full performance. +New proof acquisition has a real cold traversal; existing source-epoch reuse is +not a measured speedup. Heis owns remaining15Toad declaration deletions and the +future coherent affected paired application scope; current455 bytes/artifacts +stay frozen. No current holder, wheel, SDK/provider, film or package purpose. diff --git a/evidence/native-height-declaration-admission-20261005/source-batch01.json b/evidence/native-height-declaration-admission-20261005/source-batch01.json new file mode 100644 index 0000000000..2c9d2ed859 --- /dev/null +++ b/evidence/native-height-declaration-admission-20261005/source-batch01.json @@ -0,0 +1,21 @@ +{ + "source": "b158ca382f835db4351d920eef6c16f77490b2c6", + "production_source": "455d8ec2d0339e1f0ddba2634361c7aebf86386e", + "argv": [ + "/usr/bin/python", + "-m", + "pytest", + "-q", + "tests/test_height_independent_arrangement.py", + "tests/test_height_independent_measurement.py" + ], + "interpreter": "/usr/bin/python", + "seconds": 5.604074502014555, + "exit_code": 0, + "log": "/home/ts/wt/textual-native-subtree-strips-20261002/.artifacts/native-height-declaration-admission-20261005/source-batch01.log", + "scope": "ONE changed native source App batch: declaration-owned height reuse, fresh-cache result references, unknown/custom/layout/scalar/relative-height policy, width/viewport/parent/source mutation and scroll/resource retirement. No installed prefix, Toad, SDK/provider, wheel or recording.", + "retained_log": "evidence/native-height-declaration-admission-20261005/source-batch01.log", + "log_sha256": "8414a5f702610823af9ea97c2652d61fdf3efc1761bd54bc8dcf1ac2ed526450", + "result": "62 passed in 4.51s; controller5.604074502014555s; exit0", + "installed_qualified": false +} diff --git a/evidence/native-height-declaration-admission-20261005/source-batch01.log b/evidence/native-height-declaration-admission-20261005/source-batch01.log new file mode 100644 index 0000000000..e7ed961880 --- /dev/null +++ b/evidence/native-height-declaration-admission-20261005/source-batch01.log @@ -0,0 +1,2 @@ +.............................................................. [100%] +62 passed in 4.51s