piker/ai/prompt-io/opencode/20260908T215045Z_1a2d4893_p...

227 lines
10 KiB
Markdown
Raw Normal View History

---
model: openai/gpt-6-astra
service: opencode
timestamp: 2026-09-08T21:50:45Z
git_ref: 1a2d4893
diff_cmd: git diff HEAD
---
## Generated Changes
> `git diff HEAD -- piker/ui/_exec.py`
`start_qtractor()` copies global runtime defaults first and explicit
caller kwargs last. `run_qtractor()` uses PyQt6's `exec()` API.
Existing comments and exception logging are preserved.
> `git diff HEAD -- tests/ui/test_qtractor.py`
The existing repeated-session regression now seeds stale global
registry and runtime overrides before each startup. Its real guest
asserts the requested address is bound and the caller's runtime
overrides are active before publishing readiness.
A parametrized child-process regression exercises the real blocking
adapter with normal guest completion and a sentinel exception. It
checks exception identity, window cleanup, and actor teardown. Each
child uses offscreen Qt and test-owned config and registry addresses.
No public provider, paper mode, or chart readiness work is included.
## Verification
The existing worktree-local interpreter resolves Piker from this
worktree: Python 3.13.14, pytest-qt 4.5.0. The authorized Nix wrapper
ran its normal uv check; no environment provisioning was requested.
```xsh
nix develop --command timeout -k 5 300 py313/bin/python -m pytest --headless -q -x --tb=short --no-header tests/ui/test_qtractor.py
nix develop --command timeout -k 5 300 py313/bin/python -m pytest --headless -q -x --tb=short --no-header tests/ui/test_harness.py tests/ui/test_qtractor.py
```
The focused run passed 3 tests in 2.44s. The combined targeted run
passed 5 tests in 2.36s. Each reported two existing Tractor
`Registrar.uid` deprecation warnings. `git diff --check` passed.
Live Kraken charts, the full suite, paper mode, and readiness changes
were not run or implemented. The deployed harness still contains a
stale SIGINT warning for `MainWindow`; current source uses structured
shutdown. The reference was left untouched.
## Continuation: 2026-09-08T21:56:56Z
Model: openai/gpt-6-astra. The original generation above is preserved.
> `git diff HEAD -- piker/ui/_app.py`
`_async_main()` accepts `exec_mode: str = 'live'`, rejects values other
than 'live' and 'paper' before touching the widget, and stores the
selection on `GodWidget`. `load_provider_search()` publishes Trio task
startup after entering provider search registration and symcache.
The application awaits `nursery.start()` before publishing readiness.
> `git diff HEAD -- piker/ui/_widget.py`
> `git diff HEAD -- piker/ui/_display.py`
> `git diff HEAD -- piker/ui/order_mode.py`
`GodWidget.load_symbols()` forwards its session execution mode to
`display_symbol_data()`, which passes it to `open_order_mode()` and
then `open_ems(mode=exec_mode)`. Defaults remain live, matching the
existing CLI call. Keeping selection on the widget also covers later
search-driven symbol loads. No EMS, broker, or CLI implementation was
changed. Existing EMS code checks paper before acquiring brokerd;
paper relay cache keys are already distinct from live keys.
> `git diff HEAD -- tests/ui/test_chart_startup.py`
Added narrow direct tests for invalid-mode rejection before widget
access, existing CLI argument binding, explicit paper binding, and
entrypoint defaults. There are no interlayer mocks. These assertions
do not prove full chart forwarding or provider readiness at runtime.
### Verification
The authorized Nix wrapper and existing py313 interpreter resolve
Piker inside this worktree, with Python 3.13.14 and pytest-qt 4.5.0.
VIRTUAL_ENV is the worktree's py313 directory. Nix ran its normal uv
check; no separate environment provisioning was performed.
```xsh
nix develop --command timeout -k 5 300 py313/bin/python -m pytest --headless -q -x --tb=short --no-header tests/ui/test_chart_startup.py tests/ui/test_harness.py tests/ui/test_qtractor.py
nix develop --command timeout -k 5 300 py313/bin/python -m pytest --headless -q -x --tb=short --no-header tests/test_gap_overlays.py
git diff --check
```
First run: 9 passed in 2.67s, two existing `Registrar.uid` deprecation
warnings. Second run: 9 passed in 2.00s, one upstream `trio.Event`
boolean-use deprecation warning. Diff whitespace check passed.
No live provider, compositor, or full-suite execution was performed.
Full chart readiness and zero-brokerd behavior need a separately
authorized live-feed test using explicit paper mode, isolated registry
and config, real search registration assertions, symbol switching,
and structured close/restart checks. Paper mode still accesses market
data and may write paper accounting state. It is not a process-wide
ban on other clients' live execution.
## Live Qualification Continuation: 2026-09-08
Active model: gpt-6-astra (`openai/gpt-6-astra`). Earlier content
above is historical and is preserved. The human now explicitly
authorizes public Kraken market data, headless Qt, and paper EMS in
this same worktree. No credentials, real orders, ownership takeover,
staging, commits, ai.skillz edits, or unrelated state changes are
authorized. The human requires an opt-in production chart test,
isolated registry/config, bounded guest teardown before widget
destruction, original errors, and stopping rather than broad repairs.
> `git diff HEAD -- tests/conftest.py`
> `git diff --no-index -- /dev/null tests/ui/test_live_chart.py`
> `git diff HEAD -- piker/brokers/kraken/api.py`
Added `--live-provider=kraken` and a production GodWidget/_async_main
journey through start_qtractor. The test supplies explicit paper mode,
the Tractor fixture's unique registry, owned root config paths, an
empty brokers.toml, and inherited piker_test_dir. Existing process XDG
isolation protects Qt settings and is inherited by children. There
are no interlayer mocks, submitted orders, or symbol interactions.
Qt polling races application readiness against guest completion.
Finally requests shutdown and pumps Qt with a 60-second bound before
normal pytest-qt widget destruction. Guest errors are unwrapped;
multiple body/teardown failures are grouped. Exact registry identities
and chart SHM names are recorded as pytest properties. Detached known
startup widgets are registered with QtBot after guest completion.
The test checks paper actors/no observed brokerd, title, markets,
nonempty history/realtime arrays, and a subsequent close-price change.
The first selected run reproduced a public-client constructor typo:
`get_client()` passed `conf={}` to `Client(config, httpx_client, ...)`.
Changed only that keyword to `config={}`. The next selected run got
past this defect and consumed public Kraken history with paper EMS.
### Exact Commands And Results
The existing authorized Nix wrapper resolves Python 3.13.14, Piker in
this worktree, pytest-qt 4.5.0, and VIRTUAL_ENV pointing at py313.
Its normal uv check ran; no separate provisioning was requested.
```xsh
nix develop --command timeout -k 5 300 py313/bin/python -m pytest --headless -q -x --tb=short --no-header tests/ui/test_live_chart.py tests/ui/test_chart_startup.py tests/ui/test_qtractor.py tests/ui/test_harness.py
nix develop --command timeout -k 5 300 py313/bin/python -m pytest --headless --live-provider=kraken -q -x --tb=short --no-header tests/ui/test_live_chart.py
git diff --check
```
Offline command: initially 9 passed, 1 skipped in 2.66s; final rerun
9 passed, 1 skipped in 2.65s, with two Tractor deprecation warnings.
Diff whitespace check passed.
Live command was run twice with a targeted fix between runs, not as
a blanket provider retry. First: 1 failed, 1 teardown error, 4 warnings
in 2.66s. Original guest error was retained:
```text
piker/brokers/kraken/api.py:764 in get_client
Client(conf={}, httpx_client=trio_client)
TypeError: Client.__init__() got an unexpected keyword argument
'conf'. Did you mean 'config'?
```
Second: 1 failed, 1 teardown error, 13 warnings in 12.44s.
Readiness and observed paper actor/config checks passed, then:
```text
assert set(godw.rt_linked.mode.trackers) == {'paper'}
AttributeError: 'LinkedSplits' object has no attribute 'mode'.
Did you mean: 'move'?
```
`open_order_mode()` sets its started event at order_mode.py:1024,
before `_display.py:1693` assigns rt_linked.mode after entering chart
input handlers. `_async_main()` waits for the earlier event before
publishing session readiness. Minimal proposed follow-up: publish a
display-complete readiness event after these scopes and assignment,
rather than weakening this assertion or adding a timing sleep.
Qt also reported twice, without a Python item-identifying traceback:
```text
NotImplementedError: QGraphicsObject.paint() is abstract and must
be overridden
```
The UI isolation fixture reported remaining QFrame, QLabel, QMenu,
and ViewBoxMenu objects. Rendering and widget-ownership fixes were
not attempted. Identify the offending graphics item and give detached
chart resources explicit ownership in a separate bounded follow-up.
Guest completion was observed before widgets were destroyed, but it
did NOT prove clean actor teardown. Tractor logs show its own forced
SIGKILL escalation for datad, samplerd, emsd and both FSP actors.
A non-mutating `ps` check found the exact paper child still alive:
```text
PID 752893, PPID 1, paperboi.kraken
UID e8317c39-ebbb-4526-85f0-3440a2e6e39c
parent_addr ('127.0.0.1', 34915)
```
Checked known PIDs 738066, 738721, 749265, 749778, 750704, 751382,
751383, 752409 and 752893; only 752893 remained. No agent-issued
signals, manual SHM unlinking, broad cleanup, or subsequent live runs
were performed. The runtime's descendant teardown cause is not yet
established; it must be diagnosed before claiming clean shutdown.
After that failure, the test was tightened to collect chart SHM during
startup polling and check exact SHM/endpoints even after a body error.
The final version was checked offline only, since the paper survivor
remains. The reached run did not execute market/title/array/live-price
assertions or the original success-only SHM/endpoint checks. Those
are implemented expectations, not passing qualification evidence.
Further gaps: polling can miss transient actors; chart tokens omit
unpublished and non-chart child SHM; closed endpoints do not prove
PID exit; hard guest-timeout safety before widget destruction is not
qualified. No full suite, compositor, symbol switching, order journey,
or test-exclude changes were made. Existing prerequisite changes and
unrelated .gitignore/.ai state were preserved.