v0.1.0 release readiness: first-run availability + Z.ai endpoint path + TLS healthcheck fixes, PyPI-last publication ordering, candidate preflight, program closeout #109
No reviewers
Labels
No labels
accessibility
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
P1
P2
P3
question
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Creatidy/scarcity-router!109
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "release/v0.1.0-readiness"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
v0.1.0 release-readiness program on top of
develop@9d6192e(PROGRAM_BASE_SHA). Three parts: (1) release blockers found by the readiness audit, (2) closeout reconciliation of docs and tracker, (3) release-gate hardening — publication ordering, a non-publishing candidate preflight, and programmatic verification of the external publication configuration.Release blockers fixed
1. Server-direct execution resources could never become available (
81cd2a2, decision D-050)503 target_unavailable(resource_never_observed).refresh_due") was never wired: no production code called it, nothing ever constructed aResourceStateSnapshotfor a server-direct resource, and the M10 e2e masked the gap by injecting healthy observations through the test seam (apply_resource_observation). The diagnostics remediation ("wait for its collection cadence or trigger a health check") referenced actions that could not change the state.ok; 401/403 →auth_required; 404/410 →schema_changed; transport failure →unavailable); the connection test records its probe result so the remediation is a real action.FirstRunAvailabilityTestsscenarios 17–18) fail on the pre-fix HEAD with exactly the reported 503.2. Z.ai Coding Plan preset composed the wrong URL (
81cd2a2)https://api.z.ai/api/coding/paas/v4/chat/completions; administrators configure a bare origin, so the preset endpoint path must carry the base path — the OpenRouter preset already did this, the Z.ai preset did not, so composed Z.ai resources could never reach the documented endpoint. Path corrected and pinned by tests.3. Documented TLS container deployment reported permanently unhealthy (
3e041e0)unhealthyforever (verified live). The probe now optionally speaks verified TLS viaSR_HEALTHCHECK_URL/SR_HEALTHCHECK_CA(never weakens verification); compose example documents it. Re-verified live:healthy.Release-gate hardening (
23fb618+079b7fa)publish-pypipreviously depended only on the Python build, so the irreversible PyPI publication of 0.1.0 could complete while the Windows worker build (never yet executed on a real Windows runner) failed later — a partial public release that cannot be replaced. The graph is nowverify → build → build-windows-worker → finalize-release-bundle → publish-github-release → publish-pypi: the Windows ZIP, the verified finalSHA256SUMSand the GitHub Release must all exist before anything reaches PyPI. Both publishing jobs are gated to the SemVer tag push event.workflow_dispatch): the same workflow builds and verifies every public artifact from the exact selected ref — including the Windows worker ZIP on a real Windows runner — records the candidate identity (ref, SHA, package version), refuses a tag ref, and can never publish. The first real execution of the Windows build no longer has to be the v0.1.0 release run.tests/test_release_workflow.py, 17 tests;pyyamladded as dev-only dependency): dispatch exists and reaches the Windows build but cannot reach any publishing job; no PR event triggers; SemVer/version/main-ancestry invariants enforced; PyPI strictly downstream of the final bundle AND the GitHub Release; no long-lived publishing token; OIDC Trusted Publishing only.docs/release-engineering.mdchecklist updated): GitHub Actions enablement on the mirror is MISSING (workflow index empty, dispatch API 404 — one-time interactive enablement required); the GitHubpypienvironment does NOT exist (zero environments — must be pre-created with reviewers); the PyPI project is unpublished (Trusted Publisher not yet registrable/verifiable); Forgejodevelopbranch protection requires owner-level credentials to verify (kilo token is not an admin).Closeout reconciliation (docs,
8c375b1+fe2cb89)docs/roadmap.mdrecords per-module completion with preserved external gates; README no longer claims "M10 still in progress";docs/m10-acceptance.mdaligned with issue #106's resolution.Validation
uv sync --only-dev,make check(1895 tests),uv run basedpyright(0 findings),git diff --check,make package-check,make guardrails(40 tests) — all green. Forgejo CI green on the branch.9d6192e: green (pre-fix baseline).git archive: 13/13 (build, non-root uid 10001, version banner, verified-TLS 200 / wrong CA refused / plaintext refused, healthcheck healthy, bootstrap replay 409, restart persistence, 0600 store, no socket)./home/adrian/.local/share/scarcity-router/worker/codex/codex-home(0700, generated config, "Not logged in"); official login flows confirmed against the installedcodex-cli 0.154.0-alpha.6.2(loginbrowser flow,login --device-auth).External gates (verified 2026-09-21; recorded in
docs/release-engineering.md)developbranch protection requiringcheck— unverifiable with current credentials; owner action.pypienvironment — MISSING (pre-create with reviewers before tag).Tag blockers for v0.1.0
LIVE_WINDOWS_ACCEPTANCE(no Windows host; candidate artifact namescarcity-worker-0.1.0-windows-x64.zipfrom the candidate HEAD once Actions is enabled),LIVE_CODEX_SUBSCRIPTION(owner login gate prepared above), GitHub Actions enablement (1), PyPI Trusted Publisher (4),pypienvironment (5).WINDOWS_CODE_SIGNINGdoes NOT block the portable-ZIP release (D-046). None blocks MERGING this PR todevelop.Do not merge without human review; release happens only after the owner reviews the release-readiness result.
Release-readiness audit finding (Phase 4 first-run acceptance): the composed server never observed server_direct_http resources, so every freshly configured resource was permanently resource_never_observed and each pinned execution failed 503 target_unavailable with a remediation no action could satisfy; the M10 e2e masked the gap by injecting healthy observations through the test seam. Complete the designed-but-unwired M01 refresh contract (decision D-050): - the execution ingress asks the registry which resources are due (refresh_due) and probes each due server_direct_http resource through the M04 adapter's quota-free readiness probe, recording the outcome as its observation via apply_resource_observation; - server-direct registrations default to a 300 s polling cadence (server-side policy is authoritative); an explicit value wins; - presets without an evidenced native health endpoint are probed with a GET on their DOCUMENTED endpoint path: any well-formed answer records health ok with the exact status in the note, 401/403 records auth_required, 404/410 records schema_changed, transport failures record unavailable — no undocumented provider endpoint, no quota; - the control connection test records its probe result, making the diagnostics remediation ('run the connection test to probe now') a real action, and the ladder remediation text describes reality; - correct the Z.ai Coding Plan preset endpoint path to the documented base URL path (/api/coding/paas/v4/chat/completions): administrators configure a bare origin, so the preset carries the base path exactly like the OpenRouter preset already did; Pinned by no-injection first-run e2e tests (scenario 17/18), adapter probe-mapping tests, the documented-path pins, and the configuration default tests. No routing-core, coordinator or serialized-contract change; frozen recommendation-only surfaces untouched.The release graph let publish-pypi run from the Python build alone, so an irreversible PyPI publication of 0.1.0 could complete while the Windows worker build (never yet executed on a real Windows runner) failed later — leaving a partial public release that cannot be replaced. Reorder the pipeline so every public artifact exists and is finalized before anything is published: verify-release-contract -> build -> build-windows-worker -> finalize-release-bundle -> publish-github-release -> publish-pypi Both publishing jobs are gated to the SemVer tag push event; PyPI is additionally needs-downstream of the GitHub Release, so the Windows ZIP, the verified final SHA256SUMS and the public release all exist before any irreversible publication. The verify job keeps every fail-closed tag invariant (strict SemVer, package-version equality from the single __version__ literal, stable-main ancestry, exact-commit builds) unchanged. Add the manual release-candidate preflight (workflow_dispatch): the same workflow builds and verifies all artifacts from the exact selected ref — including the Windows worker ZIP — records the candidate identity (ref, SHA, package version) in the step summary, refuses a tag ref, and can never publish: the first real execution of the Windows build no longer has to be the v0.1.0 release run. Attestations still cover final bytes; no tag/main/version check is weakened for the real release path. Pin the whole contract with tests/test_release_workflow.py (17 structural tests: dispatch exists and reaches the Windows build but cannot reach any publishing job; no PR event triggers; SemVer/version/main-ancestry enforced; PyPI downstream of the final bundle AND the GitHub Release; no long-lived publishing token; OIDC Trusted Publishing only). pyyaml is added as a dev-only dependency for the structural parser.v0.1.0 release readiness: first-run availability fix, Z.ai endpoint path fix, TLS healthcheck fix, program closeoutto v0.1.0 release readiness: first-run availability + Z.ai endpoint path + TLS healthcheck fixes, PyPI-last publication ordering, candidate preflight, program closeout