Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions evidence/tree-cursor-projection-20261004/FILEWHEEL.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"buildhead": "d0c11d918f59fbf9e71d1fb0fdb67975421479a2",
"wheel": "/home/ts/wt/textual-native-subtree-strips-20261002/.artifacts/text58-tree-cursor-filewheel-20261004/textual-8.2.8-py3-none-any.whl",
"wheel_sha256": "0ffc78c3a7d56212479e016e13683e5d921a0b3fc9fbecfd1f5151994ac2862f",
"wheel_bytes": 768032,
"source_files": 266,
"source_byte_equal": true,
"source_inventory": "/home/ts/wt/textual-native-subtree-strips-20261002/.artifacts/text58-tree-cursor-filewheel-20261004/source-inventory.json",
"source_inventory_sha256": "05036e0b2119604a98c7833e7321b89b17e4a7a7adb3f450c33c13411717d077",
"requires_dist": [
"Requires-Python: >=3.9,<4.0",
"Requires-Dist: markdown-it-py[linkify] (>=2.1.0)",
"Requires-Dist: mdit-py-plugins",
"Requires-Dist: platformdirs (>=3.6.0,<5)",
"Requires-Dist: pygments (>=2.19.2,<3.0.0)",
"Requires-Dist: rich (>=14.2.0)",
"Requires-Dist: tree-sitter (>=0.25.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-bash (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-css (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-go (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-html (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-java (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-javascript (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-json (>=0.24.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-markdown (>=0.3.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-python (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-regex (>=0.24.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-rust (>=0.23.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-sql (>=0.3.11) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-toml (>=0.6.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-xml (>=0.7.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: tree-sitter-yaml (>=0.6.0) ; (python_version >= \"3.10\") and (extra == \"syntax\")",
"Requires-Dist: typing-extensions (>=4.4.0,<5.0.0)"
],
"dependencies_unchanged_vs_native55": true,
"backend": "poetry.core.masonry.api",
"backend_readonly_path": "/home/ts/.cache/uv/archive-v0/rA45km4nFPRmVeSg",
"installed_writes": false,
"new_environment": false,
"native_copy": false,
"qualification": "native App cursor family only; Einstein installed F3 gate pending"
}
24 changes: 24 additions & 0 deletions evidence/tree-cursor-projection-20261004/NATIVE-APP-QUALIFIED.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"original_batch": {
"log": "/home/ts/wt/textual-native-subtree-strips-20261002/.artifacts/native58-final-app-batch.log",
"sha256": "5768f4d4374c9726d467778293e9676b8ad894b0f346c55bff5a904e94dcc76a",
"result": "28 passed; 1 test-assumption failure",
"seconds": 3.26
},
"contract_followup": {
"log": "/home/ts/wt/textual-native-subtree-strips-20261002/.artifacts/native58-contract-correction.log",
"sha256": "964ca6b97369074902f81b50f7fcdd26ee2b9f5faca63de9e08fb47476e4254c",
"result": "..... [100%]\n5 passed in 0.45s"
},
"concrete_risks": [
"unbuilt offscreen node selection and scroll",
"restoring same selected data into native replacement Tree",
"line navigation after source mutation rebases cursor",
"selection/reset events and original hidden/foreign contracts",
"DirectoryTree reload and path restoration"
],
"installed_f3": "pending sole Einstein owner gate",
"physical_performance": "unqualified",
"new_environment": false,
"installed_writes": false
}
25 changes: 25 additions & 0 deletions evidence/tree-cursor-projection-20261004/SCOPE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Tree cursor projection

Tree owns the lazy `_tree_lines` projection and assigns node lines in `_build`. Cursor validation builds that projection after its argument has already been evaluated. An unbuilt node therefore contributes -1 even when the build makes it visible, and validation selects line zero.

Acquire the original projection before reading node or current cursor lines. Close move/select, scroll-to-node, line-relative navigation and DirectoryTree restoration through the existing Tree methods. Preserve original None/reset clamping, collapsed/foreign-node behavior, selection events, animation and public node line storage; no expansion, copied selection or callback retry.

Source AST uses the existing refactor-audit Package parser over all native and Toad production modules. Dynamic receiver resolution is not proven by attribute syntax. Source reasoning precedes implementation; one affected native mounted-App batch follows the complete change. Einstein owns the changed installed F3 journey and its original reader11 failure. No installed holder access is granted here.

Native55/CI57 and their original qualifications remain unchanged. Full performance and physical motion are outside this narrow fix.

## Implemented closure

Tree now acquires `_tree_lines` before move-cursor reads either the requested node ordinal or the prior cursor ordinal. Scroll-to-node does likewise. Line navigation resolves the projection before its equality shortcut; up/down/page arithmetic follows lazy cursor rebasing. Single-step branches are reduced to the same original assignments, preserving notifications and clamps. TreeNode.line acquires its original Tree projection, so public restoration can retain separate selection and viewport intent. DirectoryTree reload reads its existing selected node instead of decoding an old numeric cursor through a newly built projection.

No new owner, cache, flag, timer, retry or expansion policy. Existing select-node, sibling navigation and ContextTree restoration reuse move-cursor. DirectoryTree's existing final line-acquisition restoration remains correct. None resets continue through the original validator (root for nonempty Trees); unselect keeps its bypassed -1 and intentionally does not run cursor-node watchers; hidden/unrelated nodes retain their original raw-line contract.

Two production files: 16 additions, 16 deletions. Before/after AST: native249 modules and Toad288 modules, zero omissions. Syntactic names from non-Tree APIs are listed, not counted as dynamic Tree resolution. BOUND-2 applies: callers previously read cached external projection before invoking its owner; now that owner supplies projection before the decision.

Validation follows the coherent source: existing selection-message/reset controls plus mounted unbuilt/offscreen movement, public line restoration, actual Tree replacement with same selected data, lazy-rebased up/down/pages and line equality, hidden/foreign behavior, DirectoryTree reload/path lifecycle. Einstein's original reader11 negative and next installed F3 journey remain separate acceptance.

## Native App qualification

One affected batch: 28 passed / 1 assertion failed in 3.26 seconds. The failing assertion assumed `unselect()` clears cursor_node immediately; existing DOM.set_reactive explicitly skips validation and watchers. Product code was not changed to satisfy it. The corrected original-contract case and four line-rebase cases passed in the bounded follow-up. Original negative log retained. Formatting of the one navigation expression adds a local scalar; it does not retain state or change its assignment.

No installed access, provider, UI recorder, new environment or native copy. These are actual native App cases, not installed F3 acceptance. Einstein owns that remaining boundary. Full performance remains open.
Loading
Loading