Skip to content

plan(v1.139): the two dark gates, the horizontal hold, and v1.138.0's release notes - #406

Merged
avrabe merged 1 commit into
mainfrom
plan/v1139-dark-gates-and-hold
Sep 16, 2026
Merged

avrabe merged 1 commit into
mainfrom
plan/v1139-dark-gates-and-hold

Conversation

@avrabe

@avrabe avrabe commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Verify-Filter: (or (has-tag "verification-gate") (has-tag "hold") (has-tag "wasm"))

Refs #397, #398, #403, #405.

Scope added to falcon-v1.139.0 (both proposed)

SWREQ-RELAY-VGATE-P04 — a track that cannot run must block the release

At v1.138.0 two verification tracks were dark and the release went out anyway:

track state since
Verus all 19 targets fail in 0.1 s — can't find crate for core/std 6 consecutive main commits (#405)
Bazel //:falcon-cascade has not built, so witness MC/DC coverage produces nothing #393 (#397)

Neither is a required context, so neither blocked a merge. And the
release-execution traceability gate did not catch them either — it audits
artifact status and trace links, and both tracks' artifacts were already
verified from when the tracks last ran.

VGATE-P01 (no orphaned proofs), P02 (no untraced proofs) and P03 (a cited
enforcer must be observed to pass) all assume the track executes. This is
the fourth case: wired correctly, cited correctly, cannot run. From the
evidence's point of view that is indistinguishable from never having had the
proofs — the exact state #364 was created to end.

Being blunt about the lesson: both gates were red, visibly, for days. Redness
that blocks nothing decays into background noise. v1.138.0 recorded the darkness
in its release notes by hand; this requirement exists so that stops depending on
the operator remembering.

SWREQ-FALCON-HOLD-P01 — a hold must stay bounded for 60 s, horizontally too

v1.138.0 fixed the altitude half of the swing and uncovered a horizontal
divergence underneath it (#403). The excursion comes first; the altitude loss
follows as tilt steals the vertical thrust component.

The requirement carries the measurement gap rather than deferring it: the
flightcore scenario's final_dist is the altitude error alone, so every
native gz verdict to date has reported horizontal drift as zero by
construction
.

It also records what not to do — the altitude anti-windup condition was tried
here and reverted (no horizontal transient to wind up from; it breaks three
verified wind-rejection tests) — and names the first diagnostic job: separate
"the controller is unstable" from "the estimate has gone bad", since the traced
excursions imply ~12 m/s at a tilt that can only produce 0.34 m/s².

Also: .github/release-notes/v1.138.0.md

The body release.yml looks for. It answers the two questions from the embedded
track:

  • Floats DO lower on synth 0.66.0 — verified vmul.f32/vadd.f32/
    vdiv.f32/vsqrt.f32, hard-float ABI. #369/#708 are closed; those notes
    were stale. The real blocker is GI-FPU-002 register pressure on the one large
    tick — 21 of 22 cascade functions lower on cortex-m7dp (synth#1267).
  • --relocatable emits ET_REL, so the PX4-module route is not gated on
    output format.
  • Plus the warning that cost the most to find: a stale synth silently emits
    wrong code with exit 0
    — ours returned an argument instead of computing
    anything, and we nearly reported "floats don't lower" on the strength of it.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG

…0's notes

SCOPE ADDED TO falcon-v1.139.0 (both `proposed`):

SWREQ-RELAY-VGATE-P04 — a verification track that CANNOT RUN shall block the
release, not merely go red. At v1.138.0 two tracks were dark and the release
went out anyway: Verus failed all 19 targets in 0.1 s each with "can't find
crate for core/std" (#405, red on six consecutive main commits), and
//:falcon-cascade has not built since #393 so the witness MC/DC coverage it
feeds has produced nothing (#397).

Neither is a required context, so neither blocked a merge — and the
release-execution traceability gate did not catch them either, because it
audits artifact status and trace links, and both tracks' artifacts were already
`verified` from when the tracks last ran. VGATE-P01/P02/P03 all assume the
track EXECUTES; this is the fourth case, where it is wired correctly, cited
correctly, and cannot run at all. From the evidence's point of view that is
indistinguishable from never having had the proofs.

Worth being blunt about: both gates WERE red, visibly, for days. Redness that
blocks nothing decays into background noise. v1.138.0 recorded the darkness in
its release notes by hand; the requirement exists so that stops depending on
the operator remembering.

SWREQ-FALCON-HOLD-P01 — a stationary hold shall stay bounded for 60 s,
HORIZONTALLY as well as vertically (#403). v1.138.0 fixed the altitude half and
uncovered a horizontal divergence underneath it; the excursion comes first and
the altitude loss follows as tilt steals vertical thrust.

It carries the measurement gap as part of the requirement rather than as a
follow-up: the flightcore scenario's `final_dist` is the ALTITUDE error alone,
so every native gz verdict to date has reported horizontal drift as zero by
construction. It also records what NOT to do — the altitude anti-windup
condition was tried here and reverted, because there is no horizontal transient
to wind up from and it breaks three verified wind-rejection tests — and names
the first diagnostic job: separate "the controller is unstable" from "the
estimate has gone bad", since the traced excursions imply ~12 m/s at a tilt
that can only produce 0.34 m/s^2.

ALSO: .github/release-notes/v1.138.0.md, the body release.yml looks for. It
answers the two synth questions the embedded track asked — floats DO lower on
synth 0.66.0 (verified vmul/vadd/vdiv/vsqrt, hard-float ABI), the real blocker
is GI-FPU-002 register pressure on the one big tick (synth#1267), and
`--relocatable` does emit ET_REL for the PX4-module route. It also carries the
warning that cost the most to find: a STALE synth silently emits wrong code
with exit 0 — ours returned an argument instead of computing anything, and we
nearly reported "floats don't lower" on the strength of it.

Refs #397, #398, #403, #405.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG
@avrabe
avrabe merged commit 131cd6f into main Sep 16, 2026
11 checks passed
@avrabe
avrabe deleted the plan/v1139-dark-gates-and-hold branch September 16, 2026 03:55
avrabe added a commit that referenced this pull request Sep 16, 2026
…#425) (#426)

The required `Kani gate` went red on main and blocked every merge in the repo.
45 engine legs failing at once.

ROOT CAUSE, with the timeline:

  kani-0.68.0 released   2026-09-16T03:43:14Z
  first failing CI run   2026-09-16T03:55:44Z   <- 12 minutes later
  last passing CI run    2026-09-15T19:49       <- the v1.138.0 tag commit

`model-checking/kani-github-action@v1` has a `kani-version` input that defaults
to `latest`. We never set it, so every run installed whatever Kani had most
recently published. Upstream shipped 0.68.0 and our required gate fell over
twelve minutes later.

IT IS NOT THE PROOFS, established rather than assumed. Every failing leg
completed in about 11 s, which is far too fast for model checking, and the only
change to the tree between the last green run and the first red one was PR #406
— artifacts and release notes, no Rust. Running the same thing locally on 0.67.0
settles it:

  crates/relay-lc $ cargo kani
  ** 0 of 75 failed
  VERIFICATION:- SUCCESSFUL
  Complete - 9 successfully verified harnesses, 0 failures, 9 total.

0.67.0 is exactly what `latest` resolved to for the whole period the gate was
green (it was released 2026-01-16), so this pins the known-good state rather
than picking a new one. Moving to 0.68.0 is a deliberate change with its own
validation — not something an upstream release gets to do to us at 03:43 on a
required gate.

THE GENERAL LESSON, which this repo has now paid for twice. An unpinned tool in
a REQUIRED gate is an unreviewed dependency on someone else's release schedule.
The same class already bit us on the other side: a stale, four-month-old local
synth binary silently emitted wrong float code with exit 0. Floating means
"whatever, whenever", in both directions.

Also worth recording: this was visible for hours as "the Kani gate is red" and
read as a proof problem. The 11-second job duration was the tell, and duration
is not something anyone looks at when a verification gate goes red.

Closes #425.


Claude-Session: https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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