Skip to content

docs(status): record the v1.0.0 release and the rejected graceful-shutdown fix - #14

Merged
adbarc92 merged 1 commit into
mainfrom
docs/record-shutdown-finding
Jul 25, 2026
Merged

docs(status): record the v1.0.0 release and the rejected graceful-shutdown fix#14
adbarc92 merged 1 commit into
mainfrom
docs/record-shutdown-finding

Conversation

@adbarc92

Copy link
Copy Markdown
Owner

Documentation only — no code changes.

1. The release is recorded

v1.0.0 is tagged at d24ccab (all five CI jobs green) and released. Verified before publishing by cloning the tag fresh: uv sync && uv run appforge run "…" drove all six phases to complete, exit 0.

The State summary now reads released / no known functional defects instead of one open defect blocking the release.

2. The negative result — the more useful half

The CancelledError teardown traceback was picked up as the agreed post-release follow-up. The obvious fix is to replace stop_run's outright cancel() with uvicorn's graceful should_exit — the pattern already proven in tests/engine/server_harness.py.

It was built, it worked, and it was rejected. It cleaned up the CLI teardown (0 tracebacks, exit 0) and passed in isolation — then hung the test suite. With two in-loop servers in one process the second stop_run never returns: uvicorn's graceful path waits on FastMCP's streamable-HTTP session manager, which is not torn down between tests — the exact hazard server_harness.py's own docstring describes. A 10s timeout plus a cancel fallback did not rescue it; the task is stuck where cancellation is swallowed.

A/B on test_budget_downgrade_live.py + test_concurrency_no_collision.py:

teardown result
cancel-based (current main) completes
graceful should_exit hangs (timeout exit 124)

Reverted in full; suite back to 156 passed.

Recorded in Known gaps rather than silently dropped, because the conclusion is counter-intuitive and expensive to re-discover: the cancel() in stop_run is load-bearing, not sloppy. Trading a cosmetic traceback for a teardown hang is strictly worse, so the gap stays open with a warning attached.

v1.0.0 is tagged at d24ccab (all five CI jobs green) and released, verified
from a fresh clone of the tag before publishing.

The more useful half of this entry is the negative result. Replacing
stop_run's cancel() with uvicorn's graceful should_exit -- the obvious fix for
the CancelledError teardown traceback, and the pattern already used in
tests/engine/server_harness.py -- cleans up the CLI output and passes in
isolation, then hangs the suite: with two in-loop servers in one process the
second stop_run never returns, because uvicorn's graceful path waits on
FastMCP's streamable-HTTP session manager, which is not torn down between
tests. A 10s timeout plus a cancel fallback does not rescue it.

A/B on test_budget_downgrade_live.py + test_concurrency_no_collision.py:
cancel-based teardown completes, graceful teardown hangs (timeout exit 124).

Recorded in Known gaps because the conclusion is counter-intuitive and the
trap is expensive to re-discover: the cancel() in stop_run is load-bearing.
@adbarc92
adbarc92 merged commit 95fc195 into main Jul 25, 2026
5 checks passed
@adbarc92
adbarc92 deleted the docs/record-shutdown-finding branch July 25, 2026 20:21
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