carthagent 1.0.7 → 1.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -83
- package/bin/ctg.mjs +14 -732
- package/docs/beta-rewards-e2e-plan.md +48 -0
- package/docs/beta-rewards-e2e-results.md +84 -0
- package/docs/glyph-review/host-chrome-glyph-compatibility-v4.md +83 -0
- package/docs/glyph-review/test-isolation-v1.md +26 -0
- package/docs/glyph-review/typecheck-base.log +1 -0
- package/docs/glyph-review/typecheck-v4.log +1 -0
- package/docs/glyph-review/unicode-inventory-v4.csv +402 -0
- package/docs/help-dispatch-review.md +69 -0
- package/docs/launch-readiness-live-results.md +65 -0
- package/docs/legacy-cli.md +150 -0
- package/docs/live-theme-plugin-api.md +18 -0
- package/docs/native-cli.md +102 -0
- package/docs/native-compatibility.md +16 -0
- package/docs/native-daily-quests.md +132 -0
- package/docs/native-glyph-pty.md +59 -0
- package/docs/native-manual-testing.md +336 -0
- package/docs/native-slash-acceptance-handoff.md +49 -0
- package/docs/native-terminal-paired-failure-2026-10-17.md +40 -0
- package/docs/native-terminal-performance.md +310 -0
- package/docs/native-terminal-semantics-evidence/README.md +25 -0
- package/docs/native-terminal-semantics-evidence/controlled-host-model-selftest.json +16 -0
- package/docs/native-terminal-semantics-evidence/current-acceptance-status.json +59 -0
- package/docs/native-terminal-semantics-evidence/final-binary-focused-85bb44a.json +154 -0
- package/docs/native-terminal-semantics-evidence/final-binary-full-incomplete-85bb44a.json +160 -0
- package/docs/native-terminal-semantics-evidence/final-binary-layout-85bb44a.json +149 -0
- package/docs/native-terminal-semantics-evidence/final-binary-layout-interactive-85bb44a.json +159 -0
- package/docs/native-terminal-semantics-evidence/final-binary-model-picker-escape-unchanged-85bb44a.json +44 -0
- package/docs/native-terminal-semantics-evidence/final-binary-model-picker-exact-identity-85bb44a.json +47 -0
- package/docs/native-terminal-semantics-evidence/final-binary-model-picker-unchanged-model-incomplete-85bb44a.json +58 -0
- package/docs/native-terminal-semantics-evidence/final-binary-model-selftest.json +16 -0
- package/docs/native-terminal-semantics-evidence/final-binary-picker-cancel-incomplete-85bb44a.json +62 -0
- package/docs/native-terminal-semantics-evidence/focused-clipboard-title-stale-binary.json +161 -0
- package/docs/native-terminal-semantics-evidence/layout-stale-binary-observation-not-accepted.json +153 -0
- package/docs/native-terminal-semantics-evidence/picker-latest-incomplete-attempt.json +62 -0
- package/docs/native-terminal-semantics-evidence/picker-previous-probe-pass.json +61 -0
- package/docs/native-terminal-semantics.md +89 -0
- package/docs/native-upgrade.md +175 -0
- package/docs/opencode-composed-source-review.md +89 -0
- package/docs/opencode-migration.md +225 -9
- package/docs/opencode-owned-runtime.md +241 -0
- package/docs/opencode-runtime.md +12 -0
- package/docs/opencode-theme-provider-proof/README.md +55 -0
- package/docs/opencode-theme-provider-proof/live-theme-api-base.patch +122 -0
- package/docs/opencode-theme-provider-proof/plugin-theme-provider.patch +107 -0
- package/docs/opencode-theme-provider-proof/session-ui-base.patch +1217 -0
- package/docs/owned-host-controls-proof.md +39 -0
- package/docs/owned-runtime-release-manifest.md +42 -0
- package/docs/owned-visual-clear-proof.md +40 -0
- package/docs/patches/opencode-v2.0.32-glyph-spinner-test-isolation-v1.patch +50 -0
- package/docs/patches/opencode-v2.0.32-glyphs.patch +3670 -0
- package/docs/patches/opencode-v2.0.32-help-dispatch.patch +156 -0
- package/docs/patches/opencode-v2.0.32-live-theme-api.patch +122 -0
- package/docs/patches/opencode-v2.0.32-session-ui-combined-v1.patch +5272 -0
- package/docs/patches/opencode-v2.0.32-session-ui-combined-v2.patch +6052 -0
- package/docs/patches/opencode-v2.0.32-session-ui-combined-v3.patch +8657 -0
- package/docs/patches/opencode-v2.0.32-session-ui-combined-v4.patch +9928 -0
- package/docs/patches/opencode-v2.0.32-session-ui-combined-v5.patch +13965 -0
- package/docs/patches/opencode-v2.0.32-session-ui.patch +5137 -0
- package/docs/release-notes-beta.1.md +60 -0
- package/docs/release-notes-native-draft.md +73 -0
- package/docs/release-notes-preview.10.md +121 -0
- package/docs/release-notes-preview.11.md +76 -0
- package/docs/release-notes-preview.12.md +55 -0
- package/docs/release-notes-preview.13.md +68 -0
- package/docs/release-notes-preview.9.md +130 -0
- package/docs/source-preview.md +120 -0
- package/evaluate.mjs +28 -1
- package/lib/budget.mjs +1 -1
- package/lib/codegraph.mjs +1 -1
- package/lib/delivery-review.mjs +19 -6
- package/lib/delivery.mjs +3 -2
- package/lib/environment.mjs +8 -0
- package/lib/guidance.mjs +1 -1
- package/lib/opencode/cli-runtime.mjs +1171 -0
- package/lib/opencode/cli.mjs +252 -0
- package/lib/opencode/credentials.mjs +63 -8
- package/lib/opencode/demo.mjs +53 -0
- package/lib/opencode/evaluation-budget-plugin/index.ts +3 -0
- package/lib/opencode/evaluation.mjs +32 -12
- package/lib/opencode/headless.mjs +22 -5
- package/lib/opencode/provider-policy.mjs +23 -0
- package/lib/opencode/review.mjs +37 -16
- package/lib/opencode/runtime-artifact.mjs +335 -0
- package/lib/opencode/runtime-github-transport.mjs +121 -0
- package/lib/opencode/runtime-release.json +36 -0
- package/lib/opencode/runtime.mjs +299 -20
- package/lib/opencode/service.mjs +77 -35
- package/lib/opencode/session-options.mjs +6 -2
- package/lib/opencode/update.mjs +222 -0
- package/lib/opencode/workspace.mjs +1 -1
- package/lib/planning-advice.mjs +2 -2
- package/lib/providers/experiential.mjs +2 -2
- package/lib/tui/framing.mjs +1 -80
- package/lib/update.mjs +10 -1
- package/package.json +33 -7
- package/plugins/carthagent/README.md +23 -0
- package/plugins/carthagent/src/bootstrap.ts +1 -1
- package/plugins/carthagent/src/daily-evidence.mjs +57 -0
- package/plugins/carthagent/src/daily-quests-rpc.ts +50 -0
- package/plugins/carthagent/src/daily-source-rpc.ts +52 -0
- package/plugins/carthagent/src/index.ts +71 -24
- package/plugins/carthagent/src/rpc.ts +51 -6
- package/plugins/carthagent/src/server/codegraph.ts +12 -5
- package/plugins/carthagent/src/server/daily-quests-rpc.ts +277 -0
- package/plugins/carthagent/src/server/daily-source-rpc.ts +243 -0
- package/plugins/carthagent/src/server/delivery.ts +227 -112
- package/plugins/carthagent/src/server/framing.mjs +80 -0
- package/plugins/carthagent/src/server/policy.ts +1 -1
- package/plugins/carthagent/src/server/providers.ts +59 -31
- package/plugins/carthagent/src/server/session-controls.ts +3 -1
- package/plugins/carthagent/src/server/ship-agents.ts +77 -0
- package/plugins/carthagent/src/server/ship-context.mjs +60 -0
- package/plugins/carthagent/src/server/ship-guidance.ts +41 -0
- package/plugins/carthagent/src/server/ship-rpc.ts +69 -0
- package/plugins/carthagent/src/server/voyages-rpc.ts +280 -0
- package/plugins/carthagent/src/testing.ts +5 -0
- package/plugins/carthagent/src/tui.tsx +496 -0
- package/plugins/carthagent/src/ui/client.ts +127 -0
- package/plugins/carthagent/src/ui/commands.ts +70 -0
- package/plugins/carthagent/src/ui/daily-editor-focus.mjs +52 -0
- package/plugins/carthagent/src/ui/daily-editor.mjs +4 -0
- package/plugins/carthagent/src/ui/daily-quests-events.mjs +18 -0
- package/plugins/carthagent/src/ui/daily-quests-state.mjs +218 -0
- package/plugins/carthagent/src/ui/daily-quests.tsx +235 -0
- package/plugins/carthagent/src/ui/host-state.ts +42 -0
- package/plugins/carthagent/src/ui/model-command.ts +32 -0
- package/plugins/carthagent/src/ui/native-navigation.ts +23 -0
- package/plugins/carthagent/src/ui/native-review.d.mts +33 -0
- package/plugins/carthagent/src/ui/native-review.mjs +159 -0
- package/plugins/carthagent/src/ui/resume-session.mjs +34 -0
- package/plugins/carthagent/src/ui/select-mouse.ts +17 -0
- package/plugins/carthagent/src/ui/session-preferences.d.mts +7 -0
- package/plugins/carthagent/src/ui/session-preferences.mjs +14 -0
- package/plugins/carthagent/src/ui/theme-provision.d.mts +3 -0
- package/plugins/carthagent/src/ui/theme-provision.mjs +134 -0
- package/plugins/carthagent/src/ui/voyages-navigation-state.mjs +56 -0
- package/plugins/carthagent/src/ui/voyages-navigation.tsx +131 -0
- package/plugins/carthagent/src/ui/voyages-state.mjs +165 -0
- package/plugins/carthagent/src/ui/voyages.tsx +131 -0
- package/plugins/carthagent/src/ui/workspace-live.ts +61 -0
- package/plugins/carthagent/src/ui/workspace.tsx +379 -0
- package/plugins/carthagent/src/voyages-rpc.ts +64 -0
- package/plugins/carthagent/src/workspace-rpc.ts +36 -0
- package/plugins/carthagent/tests/commands.test.ts +107 -0
- package/plugins/carthagent/tests/session-preferences.test.mjs +41 -0
- package/plugins/carthagent/tests/voyages-navigation.test.tsx +269 -0
- package/plugins/carthagent/themes/carthage.json +67 -0
- package/plugins/carthagent/tui.ts +26 -1
- package/script/ctg/build-owned-runtime.sh +166 -0
- package/tests/budget-engine.test.mjs +4 -3
- package/tests/cli.test.mjs +52 -96
- package/tests/daily-evidence.test.mjs +62 -0
- package/tests/delivery-review.test.mjs +57 -2
- package/tests/delivery.test.mjs +22 -1
- package/tests/fixtures/native-discovery-plugin/server.ts +15 -0
- package/tests/generate-owned-runtime-release.test.mjs +354 -0
- package/tests/installed-runtime-contract.test.mjs +43 -0
- package/tests/native-cli-host-smoke.mjs +457 -0
- package/tests/native-daily-editor-focus.test.mjs +213 -0
- package/tests/native-daily-editor.test.mjs +43 -0
- package/tests/native-daily-quests-layout.test.mjs +55 -0
- package/tests/native-daily-quests-rpc.test.mjs +456 -0
- package/tests/native-daily-quests-ui.test.mjs +778 -0
- package/tests/native-daily-source.test.mjs +525 -0
- package/tests/native-demo-ui.test.mjs +48 -0
- package/tests/native-evaluation-admission.test.mjs +24 -0
- package/tests/native-fixture-browser-cleanup.test.mjs +65 -0
- package/tests/native-fixture-runtime.test.mjs +111 -0
- package/tests/native-fixture-stop-diagnostics.test.mjs +67 -0
- package/tests/native-glyph-pty.test.mjs +107 -0
- package/tests/native-manual-projects.test.mjs +170 -0
- package/tests/native-model-command.test.mjs +67 -0
- package/tests/native-owned-runtime-env.test.mjs +140 -0
- package/tests/native-paired-guards.test.mjs +464 -0
- package/tests/native-provider-policy.test.mjs +31 -0
- package/tests/native-pty-invocation.test.mjs +114 -0
- package/tests/native-pty-runtime.test.mjs +45 -0
- package/tests/native-resume-session.test.mjs +46 -0
- package/tests/native-review-consumer.test.mjs +286 -0
- package/tests/native-runtime-identity.test.mjs +214 -0
- package/tests/native-select-mouse.test.mjs +23 -0
- package/tests/native-ship-guidance.test.mjs +16 -0
- package/tests/native-ship-parity.test.mjs +526 -0
- package/tests/native-ship-plan.test.mjs +85 -0
- package/tests/native-ship-rpc.test.mjs +71 -0
- package/tests/native-ui-commands.test.mjs +6 -0
- package/tests/native-voyages-layout.test.mjs +28 -0
- package/tests/native-voyages-navigation.test.mjs +169 -0
- package/tests/native-voyages-rpc.test.mjs +397 -0
- package/tests/native-voyages-ui.test.mjs +307 -0
- package/tests/opencode-atomic-write.test.mjs +55 -0
- package/tests/opencode-cli.test.mjs +1312 -0
- package/tests/opencode-codegraph-plugin.test.mjs +47 -0
- package/tests/opencode-delivery.test.mjs +16 -0
- package/tests/opencode-providers.test.mjs +245 -18
- package/tests/opencode-runtime.test.mjs +597 -8
- package/tests/opencode-session-controls.test.mjs +15 -0
- package/tests/opencode-ship-rpc.test.mjs +71 -0
- package/tests/opencode-update.test.mjs +475 -0
- package/tests/opencode-workspace.test.mjs +51 -2
- package/tests/owned-runtime-publish-workflow.test.mjs +477 -0
- package/tests/release-workflow.test.mjs +46 -0
- package/tests/runtime-artifact.test.mjs +269 -0
- package/tests/runtime-development-trust.test.mjs +231 -0
- package/tests/runtime-github-transport.test.mjs +132 -0
- package/tests/runtime-token-env.test.mjs +23 -0
- package/tests/server.test.mjs +3 -1
- package/tests/ship-telemetry.test.mjs +1 -1
- package/tests/source-preview.test.mjs +253 -0
- package/tests/test_native_terminal_probe.py +76 -0
- package/tests/test_native_terminal_semantics.py +232 -0
- package/tests/update.test.mjs +42 -5
- package/tests/verify-draft-runtime-gate.test.mjs +280 -0
- package/tests/verify-owned-runtime-release.test.mjs +371 -0
- package/tests/workspace-live.test.mjs +127 -0
- package/tools/benchmark/diagnose-request.mjs +59 -36
- package/tools/benchmark/eval-common.mjs +3 -3
- package/tools/benchmark/evaluators.test.mjs +4 -4
- package/tools/benchmark/guard.test.mjs +35 -2
- package/tools/benchmark/guard.ts +20 -7
- package/tools/benchmark/planning-startup.test.mjs +30 -34
- package/tools/benchmark/runner.mjs +12 -7
- package/tools/benchmark/runner.test.mjs +23 -7
- package/tools/benchmark/upstream-error.test.mjs +16 -2
- package/tools/generate-owned-runtime-release.mjs +217 -0
- package/tools/installed-runtime-contract.mjs +16 -0
- package/tools/manual-runtime-manifest.mjs +39 -0
- package/tools/native-fixture-browser-cleanup.mjs +59 -0
- package/tools/native-fixture-stop-diagnostics.mjs +43 -0
- package/tools/native-fixture.mjs +199 -40
- package/tools/native-glyph-helpers.py +127 -0
- package/tools/native-glyph-pty.py +144 -0
- package/tools/native-manual-projects.mjs +259 -0
- package/tools/native-manual.mjs +338 -0
- package/tools/native-model-picker-acceptance.py +306 -0
- package/tools/native-owned-runtime-env.sh +47 -0
- package/tools/native-paired-guards.mjs +282 -0
- package/tools/native-paired-manifest.mjs +72 -0
- package/tools/native-paired-orchestration.sh +51 -0
- package/tools/native-plugin-readiness.mjs +33 -0
- package/tools/native-plugin-readiness.test.mjs +53 -0
- package/tools/native-pty-invocation.mjs +26 -0
- package/tools/native-pty-runtime.mjs +83 -0
- package/tools/native-pty-smoke.py +147 -24
- package/tools/native-public-repo-shell-result.mjs +13 -0
- package/tools/native-public-repo-shell-result.test.mjs +28 -0
- package/tools/native-runtime-identity.mjs +201 -0
- package/tools/native-slash-acceptance-env.py +38 -0
- package/tools/native-terminal-semantics.py +876 -0
- package/tools/owned-shell-observer/index.ts +16 -0
- package/tools/owned-shell-observer/package.json +1 -0
- package/tools/owned-visual-clear-env.py +48 -0
- package/tools/owned-visual-clear-model.py +21 -0
- package/tools/pinned-owned-runtime-inputs.mjs +46 -0
- package/tools/prepare-native-manual.mjs +122 -0
- package/tools/run-native-terminal-paired.sh +403 -0
- package/tools/runtime-token-env.mjs +8 -0
- package/tools/seed-native-switch-fixture.mjs +79 -0
- package/tools/test-native-controls.mjs +3 -1
- package/tools/test-native-daily-quests.mjs +65 -0
- package/tools/test-native-default-cli.mjs +106 -0
- package/tools/test-native-delivery-host.mjs +102 -20
- package/tools/test-native-evaluation.mjs +7 -3
- package/tools/test-native-glyph-pty.mjs +94 -0
- package/tools/test-native-host.mjs +87 -63
- package/tools/test-native-outcomes.mjs +3 -1
- package/tools/test-native-package.mjs +206 -38
- package/tools/test-native-performance.mjs +26 -0
- package/tools/test-native-product.mjs +90 -0
- package/tools/test-native-pty.mjs +34 -9
- package/tools/test-native-public-repo.mjs +224 -0
- package/tools/test-native-refresh-reentry.mjs +106 -0
- package/tools/test-native-report.mjs +27 -20
- package/tools/test-native-review.mjs +75 -0
- package/tools/test-native-runtime.mjs +120 -0
- package/tools/test-native-ship-models.mjs +176 -0
- package/tools/test-native-ship-walkthrough.mjs +96 -0
- package/tools/test-native-slash-commands.mjs +125 -0
- package/tools/test-native-slash-commands.py +242 -0
- package/tools/test-native-swe-host.mjs +224 -55
- package/tools/test-native-tasks.mjs +77 -0
- package/tools/test-native-terminal-performance.py +887 -0
- package/tools/test-native-terminal-readiness.sh +85 -0
- package/tools/test-native-terminal-semantics-installed.mjs +38 -0
- package/tools/test-native-visual-clear-installed.mjs +48 -0
- package/tools/test-owned-host-controls.mjs +238 -0
- package/tools/test-owned-opencode-runtime.mjs +35 -0
- package/tools/test-owned-visual-clear-env.py +120 -0
- package/tools/test-owned-visual-clear.py +373 -0
- package/tools/verify-draft-runtime-gate.mjs +138 -0
- package/tools/verify-owned-runtime-release.mjs +114 -0
- package/tools/verify-release-version.mjs +21 -1
package/docs/native-terminal-semantics-evidence/final-binary-picker-cancel-incomplete-85bb44a.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"startedAtUtc": "2026-10-17T18:52:04.371097+00:00",
|
|
3
|
+
"case": "picker-regression",
|
|
4
|
+
"binary": "/tmp/opencode/ctg-final-runtime-build/resume-build/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
5
|
+
"binaryResolvedPath": "/tmp/opencode/ctg-final-runtime-build/resume-build/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
6
|
+
"binarySha256": "85bb44a65e8c185f4f33d41507d29acc77f2db0cdcb0103a14476021c8e43794",
|
|
7
|
+
"buildHash": "85bb44a65e8c185f4f33d41507d29acc77f2db0cdcb0103a14476021c8e43794",
|
|
8
|
+
"binaryVersion": "opencode v0.0.0-ctg.2.0.32",
|
|
9
|
+
"probeSha256": "f35acbcd8e506a32c0ee5240b3cd53be34fe551c7166e3327017c69ab2a57809",
|
|
10
|
+
"pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
|
|
11
|
+
"sourceCommit": "1a79b489ba9f287efc03cf2c580ade546d0c9140",
|
|
12
|
+
"workingTreeDirty": true,
|
|
13
|
+
"sourceStatus": "M tools/native-terminal-semantics.py",
|
|
14
|
+
"sourceTreeSha256": "117be09476e05d5b2714a2d2cdbe299074b95c272d76b045246ee1bde67259ee",
|
|
15
|
+
"sourceDiffDirty": true,
|
|
16
|
+
"provider": "loopback offline fixture",
|
|
17
|
+
"terminal": {
|
|
18
|
+
"initialRows": 32,
|
|
19
|
+
"initialColumns": 100,
|
|
20
|
+
"resizeRows": null,
|
|
21
|
+
"resizeColumns": null,
|
|
22
|
+
"TERM": "xterm-256color"
|
|
23
|
+
},
|
|
24
|
+
"controlledHostClipboardModel": true,
|
|
25
|
+
"physicalOSClipboardVerified": false,
|
|
26
|
+
"checks": {
|
|
27
|
+
"pickerEscapeCancel": {
|
|
28
|
+
"status": "UNVERIFIED",
|
|
29
|
+
"reason": "picker case did not complete observable Escape dismissal"
|
|
30
|
+
},
|
|
31
|
+
"promptSubmission": {
|
|
32
|
+
"status": "FAIL",
|
|
33
|
+
"providerRequests": 0,
|
|
34
|
+
"noPromptSentDuringPickerAcceptance": true
|
|
35
|
+
},
|
|
36
|
+
"narrowLayout": {
|
|
37
|
+
"status": "NOT_RUN",
|
|
38
|
+
"reason": "picker-only case does not resize terminal"
|
|
39
|
+
},
|
|
40
|
+
"focusedPromptTransport": {
|
|
41
|
+
"status": "NOT_RUN",
|
|
42
|
+
"reason": "picker-only case intentionally submits no prompt"
|
|
43
|
+
},
|
|
44
|
+
"terminalTitleRestoration": {
|
|
45
|
+
"status": "NOT_RUN",
|
|
46
|
+
"reason": "picker-only case exits without title acceptance"
|
|
47
|
+
},
|
|
48
|
+
"selectionClipboard": {
|
|
49
|
+
"status": "NOT_RUN",
|
|
50
|
+
"reason": "picker-only case does not exercise selection"
|
|
51
|
+
},
|
|
52
|
+
"clipboardOSC52": {
|
|
53
|
+
"status": "NOT_RUN",
|
|
54
|
+
"reason": "picker-only case does not exercise /copy"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"status": "INCOMPLETE",
|
|
58
|
+
"incompleteChecks": [
|
|
59
|
+
"pickerEscapeCancel",
|
|
60
|
+
"promptSubmission"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
{
|
|
2
|
+
"startedAtUtc": "2026-10-17T14:40:43.661545+00:00",
|
|
3
|
+
"case": "focused-host-roundtrip",
|
|
4
|
+
"binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
5
|
+
"binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
6
|
+
"binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
7
|
+
"buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
8
|
+
"binaryVersion": "opencode v0.0.0-ctg.2.0.32",
|
|
9
|
+
"probeSha256": "32d68e5996fc84c8874afda4beeacf88a4b6f57f2d219b9cf81be3011cd87246",
|
|
10
|
+
"pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
|
|
11
|
+
"sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
|
|
12
|
+
"workingTreeDirty": true,
|
|
13
|
+
"sourceStatus": "M docs/native-terminal-semantics.md\n M tools/native-terminal-semantics.py",
|
|
14
|
+
"sourceTreeSha256": "37826cbf469a5de797050c8bb63256018622f20de82009c9b3737d134bf50dc8",
|
|
15
|
+
"sourceDiffDirty": true,
|
|
16
|
+
"provider": "loopback offline fixture",
|
|
17
|
+
"terminal": {
|
|
18
|
+
"initialRows": 32,
|
|
19
|
+
"initialColumns": 100,
|
|
20
|
+
"resizeRows": null,
|
|
21
|
+
"resizeColumns": null,
|
|
22
|
+
"TERM": "xterm-256color"
|
|
23
|
+
},
|
|
24
|
+
"controlledHostClipboardModel": true,
|
|
25
|
+
"physicalOSClipboardVerified": false,
|
|
26
|
+
"checks": {
|
|
27
|
+
"focusedPromptTransport": {
|
|
28
|
+
"status": "PASS",
|
|
29
|
+
"exactProviderUserMessage": true,
|
|
30
|
+
"providerRequests": 2
|
|
31
|
+
},
|
|
32
|
+
"pickerEscapeCancel": {
|
|
33
|
+
"status": "NOT_RUN",
|
|
34
|
+
"reason": "focused terminal-host case intentionally skips picker scenario"
|
|
35
|
+
},
|
|
36
|
+
"narrowLayout": {
|
|
37
|
+
"status": "NOT_RUN",
|
|
38
|
+
"reason": "focused terminal-host case intentionally skips resize scenario"
|
|
39
|
+
},
|
|
40
|
+
"terminalTitleRestoration": {
|
|
41
|
+
"status": "UNVERIFIED",
|
|
42
|
+
"reason": "Controlled terminal host restored the seeded original title after normal TUI exit",
|
|
43
|
+
"controlledHostModel": true,
|
|
44
|
+
"normalExitCode": 0,
|
|
45
|
+
"exitActions": [
|
|
46
|
+
"ctrl-u+quit+enter",
|
|
47
|
+
"enter",
|
|
48
|
+
"ctrl-c"
|
|
49
|
+
],
|
|
50
|
+
"forcedTerminationAfterExitRequestTimeout": false,
|
|
51
|
+
"ptyDrainedToEof": true,
|
|
52
|
+
"titleSaveControls": 1,
|
|
53
|
+
"titleRestoreControls": 1,
|
|
54
|
+
"titleControlOrder": [
|
|
55
|
+
"save",
|
|
56
|
+
"restore"
|
|
57
|
+
],
|
|
58
|
+
"modeledTitleStackDepth": 0,
|
|
59
|
+
"titleControlsObserved": [
|
|
60
|
+
"save",
|
|
61
|
+
"restore"
|
|
62
|
+
],
|
|
63
|
+
"titleControlSequences": [
|
|
64
|
+
"22;0",
|
|
65
|
+
"23;0"
|
|
66
|
+
],
|
|
67
|
+
"initialTitle": "CTG-ORIGINAL-TITLE",
|
|
68
|
+
"finalTitle": "CTG-ORIGINAL-TITLE",
|
|
69
|
+
"titleSequenceObserved": [
|
|
70
|
+
"OpenCode",
|
|
71
|
+
"OpenCode",
|
|
72
|
+
"OpenCode",
|
|
73
|
+
"OC | FINAL[SNIP]END",
|
|
74
|
+
"OC | FINAL[SNIP]END",
|
|
75
|
+
"",
|
|
76
|
+
"",
|
|
77
|
+
"CTG-ORIGINAL-TITLE"
|
|
78
|
+
],
|
|
79
|
+
"oscTitleUpdates": [
|
|
80
|
+
{
|
|
81
|
+
"kind": "0",
|
|
82
|
+
"title": "OpenCode"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"kind": "0",
|
|
86
|
+
"title": "OpenCode"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"kind": "0",
|
|
90
|
+
"title": "OpenCode"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"kind": "0",
|
|
94
|
+
"title": "OC | FINAL[SNIP]END"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"kind": "0",
|
|
98
|
+
"title": "OC | FINAL[SNIP]END"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"kind": "0",
|
|
102
|
+
"title": ""
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"kind": "0",
|
|
106
|
+
"title": ""
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"recordedRunStatus": "PASS",
|
|
110
|
+
"acceptanceReason": "The captured PASS is from binary 30a3bb65…, which predates the final title patch; not acceptance evidence."
|
|
111
|
+
},
|
|
112
|
+
"selectionClipboard": {
|
|
113
|
+
"status": "UNVERIFIED",
|
|
114
|
+
"reason": "Controlled host model accepted and queried OSC 52 containing only the exact selected substring; this is not physical OS clipboard proof",
|
|
115
|
+
"mouseReporting": true,
|
|
116
|
+
"mouseDragSent": true,
|
|
117
|
+
"fixtureResponseInCapturedPty": true,
|
|
118
|
+
"fixtureResponseInScreenModel": true,
|
|
119
|
+
"screenExcerpt": "┃ ┃\n ┃\n\n FINALSNIPEND\n\n Build · Offline fixture · 153ms\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ┃\n ┃ ▄\n █▀▀█ █▀▀█ █▀▀█ █▀▀▄ █▀▀▀ █▀▀█ █▀▀█ █▀▀█\n █ █ █ █ █▀▀▀ █ █ █ █ █ █ █ █▀▀▀ure\n ▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n /tmp/ctg-terminal-semantics-0aht3pya/project shift+tab agents ctrl+p commands\n Continue opencode -s ses_eb5b11600ffe2KAMma5YXgti4i",
|
|
120
|
+
"selectedSubstring": "SNIP",
|
|
121
|
+
"mouseCoordinates": {
|
|
122
|
+
"startColumn": 11,
|
|
123
|
+
"endColumn": 14,
|
|
124
|
+
"row": 7,
|
|
125
|
+
"screenLine": " FINALSNIPEND",
|
|
126
|
+
"coordinateBasis": "1-based displayed terminal cells"
|
|
127
|
+
},
|
|
128
|
+
"controlledHostClipboardUpdates": [
|
|
129
|
+
"SNIP"
|
|
130
|
+
],
|
|
131
|
+
"clipboardUpdateDeltaBeforeCopy": [
|
|
132
|
+
"SNIP"
|
|
133
|
+
],
|
|
134
|
+
"controlledHostClipboardReadback": "SNIP",
|
|
135
|
+
"physicalOSClipboardVerified": false,
|
|
136
|
+
"recordedRunStatus": "PASS",
|
|
137
|
+
"acceptanceReason": "Recorded controlled-model readback used a stale binary and is not accepted for the pending final-binary native-selection lane."
|
|
138
|
+
},
|
|
139
|
+
"clipboardOSC52": {
|
|
140
|
+
"status": "UNVERIFIED",
|
|
141
|
+
"reason": "Controlled host model accepted and queried OSC 52 with the exact distinct latest fixture response; this is not physical OS clipboard proof",
|
|
142
|
+
"copyActionSent": true,
|
|
143
|
+
"controlledHostClipboardUpdates": [
|
|
144
|
+
"FINAL[SNIP]END"
|
|
145
|
+
],
|
|
146
|
+
"clipboardUpdateDeltaAfterSelection": [
|
|
147
|
+
"FINAL[SNIP]END"
|
|
148
|
+
],
|
|
149
|
+
"controlledHostClipboardReadback": "FINAL[SNIP]END",
|
|
150
|
+
"physicalOSClipboardVerified": false,
|
|
151
|
+
"recordedRunStatus": "PASS",
|
|
152
|
+
"acceptanceReason": "Recorded controlled-model readback used a stale binary and is not accepted for the pending final-binary /copy lane."
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"status": "INCOMPLETE",
|
|
156
|
+
"incompleteChecks": [
|
|
157
|
+
"terminalTitleRestoration",
|
|
158
|
+
"selectionClipboard",
|
|
159
|
+
"clipboardOSC52"
|
|
160
|
+
]
|
|
161
|
+
}
|
package/docs/native-terminal-semantics-evidence/layout-stale-binary-observation-not-accepted.json
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
{
|
|
2
|
+
"startedAtUtc": "2026-10-17T14:42:46.883521+00:00",
|
|
3
|
+
"case": "layout-regression",
|
|
4
|
+
"binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
5
|
+
"binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
6
|
+
"binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
7
|
+
"buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
8
|
+
"binaryVersion": "opencode v0.0.0-ctg.2.0.32",
|
|
9
|
+
"probeSha256": "4b9ec52b5a0962fc129daff5fd3f249bae104efee34632f53526fa8a6ab472b1",
|
|
10
|
+
"pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
|
|
11
|
+
"sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
|
|
12
|
+
"workingTreeDirty": true,
|
|
13
|
+
"sourceStatus": "M docs/native-terminal-semantics.md\n M tools/native-terminal-semantics.py",
|
|
14
|
+
"sourceTreeSha256": "809c23db2d339947e325b2b53854397a3597995a03f387ad270e55df1eb44258",
|
|
15
|
+
"sourceDiffDirty": true,
|
|
16
|
+
"provider": "loopback offline fixture",
|
|
17
|
+
"terminal": {
|
|
18
|
+
"initialRows": 32,
|
|
19
|
+
"initialColumns": 100,
|
|
20
|
+
"resizeRows": 12,
|
|
21
|
+
"resizeColumns": 40,
|
|
22
|
+
"TERM": "xterm-256color"
|
|
23
|
+
},
|
|
24
|
+
"controlledHostClipboardModel": true,
|
|
25
|
+
"physicalOSClipboardVerified": false,
|
|
26
|
+
"checks": {
|
|
27
|
+
"focusedPromptTransport": {
|
|
28
|
+
"status": "PASS",
|
|
29
|
+
"exactProviderUserMessage": true,
|
|
30
|
+
"providerRequests": 2
|
|
31
|
+
},
|
|
32
|
+
"pickerEscapeCancel": {
|
|
33
|
+
"status": "NOT_RUN",
|
|
34
|
+
"reason": "focused layout regression case does not open picker"
|
|
35
|
+
},
|
|
36
|
+
"narrowLayout": {
|
|
37
|
+
"status": "UNVERIFIED",
|
|
38
|
+
"rows": 12,
|
|
39
|
+
"columns": 40,
|
|
40
|
+
"resizeRequested": true,
|
|
41
|
+
"hostAlive": true,
|
|
42
|
+
"fixtureResponseVisible": true,
|
|
43
|
+
"composerVisible": true,
|
|
44
|
+
"pickerAbsent": true,
|
|
45
|
+
"visibleRowsWithinWidth": true,
|
|
46
|
+
"visibleScreenExcerpt": " • FINAL[SNIP]END +\n FINALSNIPEND\n\n Build · Offline fixture · 233ms\n\n ┃\n ┃\n ┃\n ┃ Offline fixture\n ╹▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n /…/ctg-terminal-semantics-hdz…/project\n",
|
|
47
|
+
"recordedRunStatus": "PASS",
|
|
48
|
+
"acceptanceReason": "Recorded 40x12 observation is from the superseded binary and is not current narrow-layout acceptance evidence."
|
|
49
|
+
},
|
|
50
|
+
"terminalTitleRestoration": {
|
|
51
|
+
"status": "UNVERIFIED",
|
|
52
|
+
"reason": "Controlled terminal host restored the seeded original title after normal TUI exit",
|
|
53
|
+
"controlledHostModel": true,
|
|
54
|
+
"normalExitCode": 0,
|
|
55
|
+
"exitActions": [
|
|
56
|
+
"ctrl-u+quit+enter",
|
|
57
|
+
"enter",
|
|
58
|
+
"ctrl-c"
|
|
59
|
+
],
|
|
60
|
+
"forcedTerminationAfterExitRequestTimeout": false,
|
|
61
|
+
"ptyDrainedToEof": true,
|
|
62
|
+
"titleSaveControls": 1,
|
|
63
|
+
"titleRestoreControls": 1,
|
|
64
|
+
"titleControlOrder": [
|
|
65
|
+
"save",
|
|
66
|
+
"restore"
|
|
67
|
+
],
|
|
68
|
+
"modeledTitleStackDepth": 0,
|
|
69
|
+
"titleControlsObserved": [
|
|
70
|
+
"save",
|
|
71
|
+
"restore"
|
|
72
|
+
],
|
|
73
|
+
"titleControlSequences": [
|
|
74
|
+
"22;0",
|
|
75
|
+
"23;0"
|
|
76
|
+
],
|
|
77
|
+
"initialTitle": "CTG-ORIGINAL-TITLE",
|
|
78
|
+
"finalTitle": "CTG-ORIGINAL-TITLE",
|
|
79
|
+
"titleSequenceObserved": [
|
|
80
|
+
"OpenCode",
|
|
81
|
+
"OpenCode",
|
|
82
|
+
"OpenCode",
|
|
83
|
+
"OC | FINAL[SNIP]END",
|
|
84
|
+
"",
|
|
85
|
+
"",
|
|
86
|
+
"CTG-ORIGINAL-TITLE"
|
|
87
|
+
],
|
|
88
|
+
"oscTitleUpdates": [
|
|
89
|
+
{
|
|
90
|
+
"kind": "0",
|
|
91
|
+
"title": "OpenCode"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"kind": "0",
|
|
95
|
+
"title": "OpenCode"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"kind": "0",
|
|
99
|
+
"title": "OpenCode"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"kind": "0",
|
|
103
|
+
"title": "OC | FINAL[SNIP]END"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"kind": "0",
|
|
107
|
+
"title": ""
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"kind": "0",
|
|
111
|
+
"title": ""
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"recordedRunStatus": "PASS",
|
|
115
|
+
"acceptanceReason": "The captured PASS is from binary 30a3bb65…, which predates the final title patch; not acceptance evidence."
|
|
116
|
+
},
|
|
117
|
+
"selectionClipboard": {
|
|
118
|
+
"status": "UNVERIFIED",
|
|
119
|
+
"reason": "Native selection gesture did not yield an exact selection OSC 52 update and modeled readback",
|
|
120
|
+
"mouseReporting": true,
|
|
121
|
+
"mouseDragSent": false,
|
|
122
|
+
"fixtureResponseInCapturedPty": true,
|
|
123
|
+
"fixtureResponseInScreenModel": true,
|
|
124
|
+
"screenExcerpt": " • FINAL[SNIP]END +\n FINALSNIPEND\n\n Build · Offline fixture · 233ms\n ┃ /quit Exit the app ┃\n ┃\n ┃ /quit^C\n ▄\n █▀▀█ █▀▀█ █▀▀█ █▀▀▄ █▀▀▀ █▀▀█ █▀▀█ █▀▀\n█╹▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n █ █ █ █ █▀▀▀ █ █ █ █ █ █ █ █▀▀\nj7QX6uUwoFTWAhencode -s ses_eb5af33c0ffe",
|
|
125
|
+
"selectedSubstring": null,
|
|
126
|
+
"mouseCoordinates": null,
|
|
127
|
+
"controlledHostClipboardUpdates": [],
|
|
128
|
+
"clipboardUpdateDeltaBeforeCopy": [],
|
|
129
|
+
"controlledHostClipboardReadback": null,
|
|
130
|
+
"physicalOSClipboardVerified": false,
|
|
131
|
+
"recordedRunStatus": "UNVERIFIED",
|
|
132
|
+
"acceptanceReason": "No accepted exact native-selection result on the final binary."
|
|
133
|
+
},
|
|
134
|
+
"clipboardOSC52": {
|
|
135
|
+
"status": "UNVERIFIED",
|
|
136
|
+
"reason": "No exact new OSC 52 clipboard value and readback observed after /copy",
|
|
137
|
+
"copyActionSent": false,
|
|
138
|
+
"controlledHostClipboardUpdates": [],
|
|
139
|
+
"clipboardUpdateDeltaAfterSelection": [],
|
|
140
|
+
"controlledHostClipboardReadback": null,
|
|
141
|
+
"physicalOSClipboardVerified": false,
|
|
142
|
+
"recordedRunStatus": "UNVERIFIED",
|
|
143
|
+
"acceptanceReason": "No accepted /copy result on the final binary."
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"status": "INCOMPLETE",
|
|
147
|
+
"incompleteChecks": [
|
|
148
|
+
"narrowLayout",
|
|
149
|
+
"terminalTitleRestoration",
|
|
150
|
+
"selectionClipboard",
|
|
151
|
+
"clipboardOSC52"
|
|
152
|
+
]
|
|
153
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"startedAtUtc": "2026-10-17T14:43:53.197554+00:00",
|
|
3
|
+
"case": "picker-regression",
|
|
4
|
+
"binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
5
|
+
"binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
6
|
+
"binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
7
|
+
"buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
8
|
+
"binaryVersion": "opencode v0.0.0-ctg.2.0.32",
|
|
9
|
+
"probeSha256": "4b9ec52b5a0962fc129daff5fd3f249bae104efee34632f53526fa8a6ab472b1",
|
|
10
|
+
"pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
|
|
11
|
+
"sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
|
|
12
|
+
"workingTreeDirty": true,
|
|
13
|
+
"sourceStatus": "M docs/native-terminal-semantics.md\n M tools/native-terminal-semantics.py",
|
|
14
|
+
"sourceTreeSha256": "809c23db2d339947e325b2b53854397a3597995a03f387ad270e55df1eb44258",
|
|
15
|
+
"sourceDiffDirty": true,
|
|
16
|
+
"provider": "loopback offline fixture",
|
|
17
|
+
"terminal": {
|
|
18
|
+
"initialRows": 32,
|
|
19
|
+
"initialColumns": 100,
|
|
20
|
+
"resizeRows": null,
|
|
21
|
+
"resizeColumns": null,
|
|
22
|
+
"TERM": "xterm-256color"
|
|
23
|
+
},
|
|
24
|
+
"controlledHostClipboardModel": true,
|
|
25
|
+
"physicalOSClipboardVerified": false,
|
|
26
|
+
"checks": {
|
|
27
|
+
"pickerEscapeCancel": {
|
|
28
|
+
"status": "UNVERIFIED",
|
|
29
|
+
"reason": "picker case did not complete observable Escape dismissal"
|
|
30
|
+
},
|
|
31
|
+
"promptSubmission": {
|
|
32
|
+
"status": "FAIL",
|
|
33
|
+
"providerRequests": 0,
|
|
34
|
+
"noPromptSentDuringPickerAcceptance": true
|
|
35
|
+
},
|
|
36
|
+
"narrowLayout": {
|
|
37
|
+
"status": "NOT_RUN",
|
|
38
|
+
"reason": "picker-only case does not resize terminal"
|
|
39
|
+
},
|
|
40
|
+
"focusedPromptTransport": {
|
|
41
|
+
"status": "NOT_RUN",
|
|
42
|
+
"reason": "picker-only case intentionally submits no prompt"
|
|
43
|
+
},
|
|
44
|
+
"terminalTitleRestoration": {
|
|
45
|
+
"status": "NOT_RUN",
|
|
46
|
+
"reason": "picker-only case exits without title acceptance"
|
|
47
|
+
},
|
|
48
|
+
"selectionClipboard": {
|
|
49
|
+
"status": "NOT_RUN",
|
|
50
|
+
"reason": "picker-only case does not exercise selection"
|
|
51
|
+
},
|
|
52
|
+
"clipboardOSC52": {
|
|
53
|
+
"status": "NOT_RUN",
|
|
54
|
+
"reason": "picker-only case does not exercise /copy"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"status": "INCOMPLETE",
|
|
58
|
+
"incompleteChecks": [
|
|
59
|
+
"pickerEscapeCancel",
|
|
60
|
+
"promptSubmission"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"startedAtUtc": "2026-10-17T14:34:42.707210+00:00",
|
|
3
|
+
"binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
4
|
+
"binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
|
|
5
|
+
"binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
6
|
+
"buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
|
|
7
|
+
"binaryVersion": "opencode v0.0.0-ctg.2.0.32",
|
|
8
|
+
"probeSha256": "61bf1116d951b41a94b5d1fbf97ee89c45cde225aa07f45153ebcb350a75bfcf",
|
|
9
|
+
"pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
|
|
10
|
+
"sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
|
|
11
|
+
"workingTreeDirty": true,
|
|
12
|
+
"sourceDiffDirty": true,
|
|
13
|
+
"provider": "loopback offline fixture",
|
|
14
|
+
"terminal": {
|
|
15
|
+
"initialRows": 32,
|
|
16
|
+
"initialColumns": 100,
|
|
17
|
+
"resizeRows": 12,
|
|
18
|
+
"resizeColumns": 40,
|
|
19
|
+
"TERM": "xterm-256color"
|
|
20
|
+
},
|
|
21
|
+
"controlledHostClipboardModel": true,
|
|
22
|
+
"physicalOSClipboardVerified": false,
|
|
23
|
+
"checks": {
|
|
24
|
+
"pickerEscapeCancel": {
|
|
25
|
+
"status": "PASS",
|
|
26
|
+
"pickerObserved": true,
|
|
27
|
+
"cancelKey": "Escape",
|
|
28
|
+
"dismissed": true,
|
|
29
|
+
"composerRestored": true,
|
|
30
|
+
"providerRequestsBeforePrompt": 0,
|
|
31
|
+
"noPromptProviderRequestBeforeAcceptance": true
|
|
32
|
+
},
|
|
33
|
+
"promptSubmission": {
|
|
34
|
+
"status": "PASS",
|
|
35
|
+
"providerRequests": 0,
|
|
36
|
+
"noPromptSentDuringPickerAcceptance": true
|
|
37
|
+
},
|
|
38
|
+
"narrowLayout": {
|
|
39
|
+
"status": "NOT_RUN",
|
|
40
|
+
"reason": "picker-only case does not resize terminal"
|
|
41
|
+
},
|
|
42
|
+
"focusedPromptTransport": {
|
|
43
|
+
"status": "NOT_RUN",
|
|
44
|
+
"reason": "picker-only case intentionally submits no prompt"
|
|
45
|
+
},
|
|
46
|
+
"terminalTitleRestoration": {
|
|
47
|
+
"status": "NOT_RUN",
|
|
48
|
+
"reason": "picker-only case exits without title acceptance"
|
|
49
|
+
},
|
|
50
|
+
"selectionClipboard": {
|
|
51
|
+
"status": "NOT_RUN",
|
|
52
|
+
"reason": "picker-only case does not exercise selection"
|
|
53
|
+
},
|
|
54
|
+
"clipboardOSC52": {
|
|
55
|
+
"status": "NOT_RUN",
|
|
56
|
+
"reason": "picker-only case does not exercise /copy"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"status": "PASS",
|
|
60
|
+
"incompleteChecks": []
|
|
61
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Native terminal semantics probe
|
|
2
|
+
|
|
3
|
+
`npm run test:native-terminal-semantics` is a real-PTY probe for the native
|
|
4
|
+
OpenCode TUI. It requires an explicitly owned 2.0.32 executable:
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
CTG_OPENCODE_BIN=/absolute/path/to/opencode.exe npm run test:native-terminal-semantics
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
The executable runs with a fresh temporary project, config, database, and XDG
|
|
11
|
+
profile. Its only model endpoint is a loopback offline HTTP fixture; no paid
|
|
12
|
+
provider is contacted. The full probe checks an exact Unicode/large bracketed
|
|
13
|
+
paste, picker cancellation, and the rendered state after resizing the PTY to
|
|
14
|
+
40x12. Focused switches are available for corrected semantics:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
CTG_OPENCODE_BIN=/absolute/path/to/opencode \
|
|
18
|
+
python3 tools/native-terminal-semantics.py --focused-host-roundtrip \
|
|
19
|
+
--artifact /tmp/focused.json
|
|
20
|
+
CTG_OPENCODE_BIN=/absolute/path/to/opencode \
|
|
21
|
+
python3 tools/native-terminal-semantics.py --assertion-regression-only \
|
|
22
|
+
--artifact /tmp/layout.json
|
|
23
|
+
CTG_OPENCODE_BIN=/absolute/path/to/opencode \
|
|
24
|
+
python3 tools/native-terminal-semantics.py --picker-regression-only \
|
|
25
|
+
--artifact /tmp/picker.json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The picker-only case opens the picker, sends Escape, and requires dismissal,
|
|
29
|
+
restoration of the home composer, and zero provider requests before acceptance.
|
|
30
|
+
The layout check requires the actual 40x12 PTY geometry, a visible fixture
|
|
31
|
+
response and composer, no visible picker, a live host, and rendered rows that
|
|
32
|
+
fit the viewport.
|
|
33
|
+
|
|
34
|
+
The focused clipboard case seeds modeled clipboard state, drags across exactly
|
|
35
|
+
`SNIP` in the displayed `FINAL[SNIP]END` response, queries the modeled host,
|
|
36
|
+
then invokes `/copy` and checks the new clipboard-update delta and exact
|
|
37
|
+
readback against the distinct full response. Selection and `/copy` statuses
|
|
38
|
+
are labeled as controlled-host-model acceptance. They are not physical OS
|
|
39
|
+
clipboard verification. The `--host-model-only` mode is a parser/state-model
|
|
40
|
+
self-test only; it does not launch OpenCode and is not native acceptance.
|
|
41
|
+
|
|
42
|
+
Title acceptance requires the title-stack save and restore controls in order,
|
|
43
|
+
the seeded title as final modeled host state, a drained PTY, and normal exit
|
|
44
|
+
code zero. Results identify the exact executable path, `--version`, binary
|
|
45
|
+
SHA-256/build hash, probe and plugin hashes, source commit/dirty state, and
|
|
46
|
+
terminal geometry. A non-passing or unrun lane keeps the overall artifact
|
|
47
|
+
incomplete; captured OSC bytes alone never prove physical clipboard behavior.
|
|
48
|
+
|
|
49
|
+
## Evidence status (PR #162)
|
|
50
|
+
|
|
51
|
+
The evidence directory contains the previous picker/model passes and the latest
|
|
52
|
+
attempted focused/layout artifacts with their original metadata. Treat these as
|
|
53
|
+
provenance, not one all-green suite. The focused and layout PTY runs used binary
|
|
54
|
+
SHA-256 `30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484`.
|
|
55
|
+
That build predates the author's final title-restoration patch and is therefore
|
|
56
|
+
not acceptance evidence for title restoration; its recorded title `PASS` is
|
|
57
|
+
explicitly superseded. Its controlled-host OSC 52 observations do not prove
|
|
58
|
+
physical OS clipboard behavior. The latest picker attempt is incomplete and
|
|
59
|
+
does not supersede the earlier recorded picker pass.
|
|
60
|
+
|
|
61
|
+
The supplied binary was identified as `opencode v0.0.0-ctg.2.0.32`, package
|
|
62
|
+
manifest `@opencode/cli-linux-x64` `0.0.0-ctg.2.0.32`, SHA-256
|
|
63
|
+
`85bb44a65e8c185f4f33d41507d29acc77f2db0cdcb0103a14476021c8e43794`. A
|
|
64
|
+
corrected full run passed picker Escape, actual 40x12 layout, exact Unicode
|
|
65
|
+
large-paste transport (18,047 UTF-8 bytes), `/copy`, and ordered title
|
|
66
|
+
restoration. Its selection gesture was incomplete; a focused rerun on the same
|
|
67
|
+
binary passed exact `SNIP` selection/readback, exact distinct `FINAL[SNIP]END`
|
|
68
|
+
copy/readback, and title restoration. These clipboard results are controlled
|
|
69
|
+
OSC 52 host-model results, not physical OS clipboard verification. Results are
|
|
70
|
+
bounded across runs and the full suite remains incomplete as one invocation;
|
|
71
|
+
see `docs/native-terminal-semantics-evidence/` for exact harness hashes and
|
|
72
|
+
per-run caveats. An additional 40x12 interactive run typed unique input,
|
|
73
|
+
backspaced one character, opened and navigated the recent-sessions menu, then
|
|
74
|
+
cancelled with Escape and verified the edited composer returned. This does not
|
|
75
|
+
replace the separate model-picker check. Model-picker behavior has since been
|
|
76
|
+
tested separately using two offline models:
|
|
77
|
+
the native picker showed current A and alternate B, ArrowDown changed rendered
|
|
78
|
+
selection styling to B, Escape cleared the search filter and a second Escape
|
|
79
|
+
dismissed the picker, no provider request occurred during cancellation, active
|
|
80
|
+
the rendered active-session model label remained A, and a unique post-cancel
|
|
81
|
+
prompt reached the fixture with model A. A later probe rerun also required exact
|
|
82
|
+
expected version and independently supplied binary SHA-256 checks before
|
|
83
|
+
execution, and verified that ArrowDown moved the captured selected styling from
|
|
84
|
+
A to B. The prior failed attempt remains retained as superseded evidence.
|
|
85
|
+
Recent-sessions cancellation and model-picker cancellation are separate checks.
|
|
86
|
+
No physical clipboard claim is made.
|
|
87
|
+
|
|
88
|
+
The existing `tests/tui-copy-paste.test.mjs` covers parser logic and selection
|
|
89
|
+
string calculation only; it is not a substitute for this native probe.
|