Skip to content

fix: 0.6.0 follow-ups (audit wire, honest PE build, DELETE 409, dispatcher orphan runs, assist gaps) - #333

Merged
davidamacey merged 11 commits into
mainfrom
feat/0.6.0-followups
Oct 16, 2026
Merged

davidamacey merged 11 commits into
mainfrom
feat/0.6.0-followups

Conversation

@davidamacey

Copy link
Copy Markdown
Owner

0.6.0 follow-ups found by the issue verification and the live S3/MinIO check.

Closes #166
Closes #277
Closes #249
Closes #287
Closes #289

Tests written first and seen failing for the fixes (exceptions are noted in the commit messages). Full suite runs once here in CI.

audit_sample, audit_batch_id, audit_sampled_at, audit_label_name,
audit_label_source, audit_outcome and audit_human_name go through
serialize_item, ItemDoc and the contracts; the audit queue shows the machine
label a crop was drawn with.
…277)

The verification report was half right: build_pe_trt.sh already adds the
uint8 input (PE_NORMALIZE matches the installer). What was real is the silent
FP32 fallback when the FP16 bake or FP16 trtexec build failed. It now exits 4
with the cause; ALLOW_FP32=1 is the explicit opt-in. A failed uint8 step also
stops with a clear message. Tests stub python and trtexec.
… lands (#249)

Diagnosis: the busy inventory itself is correct, but the detection worker's
liveness file (inflight count) was only rewritten every 15 s, so a DELETE
right after an ingest finished read the last non-zero count and answered 409
project_busy for up to a full interval. liveness_loop now polls each second
and rewrites a project as soon as its count changes. The 409 message also
names each running job and hints at a retry (it already listed them in
jobs).
…han run

run_tick ran run_project_tick via to_thread, so spawn and the poll called
asyncio.create_task from a worker thread ('no running event loop') and no
poll, cron or webhook run ever started. Because claim_run had already written
the run, every tick re-claimed the interrupted run (refreshing its heartbeat)
and it stayed live: later /run calls and DELETE of the project answered 409.
The tick now runs on the loop, spawn marks a claimed run failed when it
cannot start, and cancel finalizes an orphan with no task.
…_agreement control

GET /clusters cards carry subcluster_ids (sorted, capped at 200), and the
cluster page's sub-cluster tabs use them instead of the ids seen on the loaded
page. The assist dialog gets an Agreement needed field for a cluster classify
run: empty uses the server default (echoed on the dry run), range pinned to
the served schema by a contract test.
… item attributes

brand (free text), colour and material (closed lists) on the generic item
prompts, validated by the pack validation in a test and mentioned in the
selective-assist and use-your-own-domain guides.
)

New envnames check: a non-OP_ variable written in a code span on a line about
env or variables must be read by compose, a script or code (case-insensitive,
as pydantic settings are). #289 re-verified: the docs-site tsc passes (no
TS5101), the openprocessor start comment no longer exists, and
slow_request_threshold_ms is read (factory.py), so nothing to fix there.
…runs by microsecond ids

The tick does blocking I/O and stays off the event loop (existing test); only
the run and poll task creation is handed to the loop captured in run_tick.
Assist run ids carry microseconds so two runs in one second sort newest first.
…ead its header

simplejpeg raised 'Could not determine subsampling level' on 2 of 100k public
JPEGs that Pillow decodes; only that header error now falls back to the
Pillow path (same orientation and RGB handling). Other fast-decoder errors
(damaged files) still fail. The GPU path already falls back to this CPU
decode on any non-ok status, so no device accounting changes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment