Skip to content

Release v0.9.0 - #99

Merged
addisdev merged 41 commits into
mainfrom
develop
Oct 16, 2026
Merged

addisdev merged 41 commits into
mainfrom
develop

Conversation

@addisdev

Copy link
Copy Markdown
Owner

Release 0.9.0: develop → main. See CHANGELOG.md [0.9.0]: skipped as a job status and stale-skip alerts, failure reasons, findings in /api/v1 + fleetr + MCP with regression tests from fixed findings, adaptive explore nights, scope checks on the older routes, PR builds never move latest, the dashboard on the v1 client, and CI for launchd, the Windows task, the arm64 image and the desktop app.

🤖 Generated with Claude Code

addisdev and others added 30 commits October 15, 2026 20:16
bug-garden/tools/check-bench.mjs ignored the `absent_text` the harness
enforces, so bench-delete-plant passed without checking Aloe Vera was gone,
and it matched case-sensitively where the harness does not. It now does both
as the harness does.

The skill's exit-4 line said a skip meant "no build, no matching device".
Both of those are refused at enqueue (exit 2 or 5) and never run; exit 4 is a
job that was claimed and reported `skipped:`. Regenerated SKILL.md.

seed-schedules: the comment counted three explore schedules (there are four)
and still expected the TV one to wait for a Fire TV test; Fire TV is parked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 0.8.0 changelog left out everything merged before the cut that was not
the control API: exploratory QA (#70, #73, #74, #77, #78), the device art
(#69) and the two runner-android fixes (#75, #76). They get an "Also in this
release" section with their not-verified items.

A read of every page against the code found ~60 stale spots. The main ones:

- Explore: card counts, Holo4's measured status, tool_choice and json_schema
  requirements, the real gateway-key lookup order and env vars, Fire TV
  parked for tvOS, the night-queue jobs and priorities, budgets, auth on
  POST /findings.
- Front door: Explore in the README, index and getting-started; 34
  workloads, not 28; "no authentication, by design" now says by default and
  links the opt-in tokens; the Roku driver; strict validation is /api/v1
  only; CI-verified items in platforms; ultra and the S8+ in the lab runbook;
  #45's caveat removed (fixed in 0.6.1).
- API and integration: undocumented routes and /metrics, the guards under
  FLEET_AUTH, CLI flags and env vars, the /api/v1-only owner and shell checks
  stated plainly. Guides lead with fleetr instead of the deprecated routes,
  say what ci-enqueue gets wrong (a skip exits 0; no token), add the
  required app.build to examples, and split an array "enqueue" no endpoint
  accepts into three specs.
- A tvloop section in workloads/host.md, which the catalog already linked.
- mkdocs nav listed the ultra runbook twice; it stays under Exploratory QA
  and the Deploy overview links it.

Not done here: the three mermaid diagrams in the explore pages, the 28-
workload figure and the pre-device-art dashboard screenshots. They need
figures rendered, not text edits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Docs catch up with 0.8.0 and the explore work
The explore docs' night flowchart, one mission's sequence and the code map
were the only mermaid left. They are now figures in docs/figures/
(explore-night, explore-step, explore-code) on brand.css and symbols.js,
rendered by `npm run assets` to PNG at 2x, every label checked against the
code (replay_attempts 2, PRECISION_FLOOR 0.3 with ten judged, the pilot and
vision gateway defaults, fileable() filing crash logs unreplayed).

The docs workflow now fails on a mermaid fence under docs/, and mkdocs.yml
drops the mermaid custom fence.

workloads.html shows all 34 shipped catalog entries (adds enrol, explore,
upgrade-test, size-report, tvloop, llm-eval), so the README loses its
"the figure predates six of them" aside.

devices.png (the PR #69 device drawings) and a new findings.png come from
the lab's running brain via a new read-only `npm run shoot:live`, filtered
to online devices and the bug-garden fixture app; brand.md records why a
throwaway collector cannot honestly make either.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…elease checks

Four GitHub-hosted jobs for the never-run list: fleet / launchd smoke,
fleet / windows task smoke, fleet / container smoke (arm64) and
desktop / launch smoke. A changelog coverage check for release PRs and a
check that marked workload counts in the docs match the catalog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The task stored backslash-escaped quotes in its command and failed with
file-not-found every time it ran; uninstall deleted the task without
stopping it. The desktop app refused programmatic exits (so Quit could not
quit) and died on SIGTERM leaving its sidecar running.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…PR builds off latest

- Legacy cancel/retry make the owner check and legacy enqueue the shell/admin
  check, through one shared module (collector/src/api/policy.ts) that /api/v1
  also uses.
- ci-enqueue moves to /api/v1 with fleetr's exit codes (4 on skipped);
  ci-enqueue and ci-upload send FLEET_RUNNER_TOKEN/FLEET_TOKEN as a bearer.
- x-artifact-channel: pr; "latest" never resolves to a pr build. Both CI
  scripts set it on pull_request events or --channel pr.
- fleet/package.json bin points at dist/bin/fleet.mjs and packs dist/.
- version.mjs writes the desktop app's Cargo.toml and tauri.conf.json (0.8.0).
- check-examples runs the API's strict schema and params manifests
  (spec-check.ts, shared with routes.ts); CHECK_NAMES drops names nothing raises.
- FLEET_PEER_TOKENS for the peers proxy; explore mirror frames send FLEET_TOKEN;
  timer intervals validated (>= 1000 ms); stale discovery comments fixed.
- Schedule templates: an empty job_id is dropped with a warnings entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
launchd, the Windows task, the arm64 image and the desktop app's launch
move out of the not-verified lists, each saying what CI checks and what it
does not. Count markers inside code spans are examples, not counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ter checks

explore-night.ts now checks the cheap things before it warms the model or
boots a device. With --fresh-build, a spec on "latest" needs a build the
brain shows as published tonight; without one the job is posted as a skip
(ok: true, "skipped: no <app> build for tonight (...)") and the command
exits 0, since ultra's night queue has no skip code. It knows when the
night ends (--until, default 07:30, or the job's max_minutes read from the
night queue's manifest) and cuts each spec's minutes to fit, the workload
saying "short night: ran N of M cards: X minutes left of the Y asked". The
shelf warm-up moved from the manifests into --warm, run after the checks,
with a refusal for memory retried and then posted as a skip: that refusal
(64% free, needs 65%) was fleet-explore-apple's exit 1 on 10-14.
nightly-builds.sh republishes an unchanged build so a quiet day is not a
missed build. --dry-run runs the checks against the live brain and posts
nothing.

Also fixes tvOS simulators describing themselves as os "ios", which made
every fleet-explore-tv job skip with "no device matches".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: hand-placed figures replace the last mermaid diagrams
…ry hygiene

LOOP-PLAN Phase 1, all four items.

- The queue closes a job that ran nothing as `skipped` (one rule, skip.ts,
  shared with a one-time backfill that re-labels historical `done` skips in
  the migration that widens the status constraint). Status filters, facets,
  /metrics, the Overview, the dashboard chip and the morning digest know it.
  Waiters on a skipped dependency skip with "dependency X skipped".
- A `schedule-skipping` alert after FLEET_ALERT_SKIP_STREAK (3) skipped runs.
- ui-test reads the failing flow and step out of Maestro's JUnit report;
  every host row with ok:false gets a reason (fleet-client wrapper); a failed
  job's last_error carries it. GET /api/artifacts/:sha now 308s to the v1
  content route instead of "no such endpoint".
- Rokus register as platform roku; a serial-named Roku retires its IP-named
  duplicate; the sweep forgets declared simulators offline past
  FLEET_SIMULATOR_TTL_DAYS (7).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he bash warm-up case on Windows

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Close 0.8.0's loose ends (LOOP-PLAN Phase 3, items 1-8)
# Conflicts:
#	CHANGELOG.md
#	collector/src/api/v1/routes.ts
# Conflicts:
#	CHANGELOG.md
#	CONTRIBUTING.md
Explore nights adapt: short nights, skips for missing builds, warm after checks
…hecks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Honest green: skipped is a job status, every failure says why, registry hygiene
CI proof for the never-run list, and two release checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 10-15 garden night skipped after ten minutes of "not loading
holo4-35b-a3b: 56% free, needs 65%": ultra's resident models alone hold it
near 56% free, so an explore night could never load its driver. Holo4 is
about 25 GB; at 45% (~43 GB free) it leaves room. The owner chose this over
unloading the shelf (which would take explore's own judge with it).

Only explore's warm-up changes: the manifests pass WARM_MIN_FREE_PCT=45 to
shelf.sh, whose default for everything else stays 65%, and it still refuses
under memory pressure. ultra's ~/explore/env.sh exports the same, which is
what covers the night already queued with the old commands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
addisdev and others added 11 commits October 15, 2026 22:43
…ings become nightly regression tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…essions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… client

The dashboard called the deprecated GET /api/devices, /api/devices/:id,
/api/jobs, /api/jobs/:id and POST /api/jobs with hand-written response
types. It now uses the generated client (dash/src/client.ts) for every read
and change /api/v1 offers, so its types are the client's and a field the
server drops fails check-api-v1 instead of blanking a column.

- /api/v1 schemas state every field the dashboard reads (Beacon, Device,
  DeviceDetail, Job, JobDetail, Schedule), required where the handler always
  sends it.
- listDevices and listJobs return the facets their filter menus are built
  from; listJobs takes has_error.
- forward() carries X-Fleet-Token, so /api/v1 cancel and retry work on a
  collector with FLEET_DASH_TOKEN set (they were always 401 there).
- scripts/check-dash-requests.ts fails the suite if dash/src calls a route
  deprecations.ts marks.

Findings and every route /api/v1 does not offer stay on /api/*.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dashboard: read devices, jobs, templates and schedules through the v1 client
… findings list facets; deprecate the older findings routes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Findings reach the code: /api/v1, fleetr and MCP, and fixed findings become nightly regression tests
Version 0.9.0 everywhere (scripts/version.mjs) and the OpenAPI document
regenerated. CHANGELOG: [Unreleased] becomes [0.9.0] with an intro and a
not-verified list; bullets from #92, #93 and #94 gain their PR links, and
five bullets the changelog merges had duplicated are folded back into one
each. docs/lab.md no longer says the brain is on 0.7.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@addisdev
addisdev merged commit 5ebbc13 into main Oct 16, 2026
81 of 83 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant