Repository navigation
The roadmap plan authority becomes a parameter so a caller can supply its own plan - #10987
Conversation
Every roadmap surface read its plan from one nullary, gunbc.roadmap_authority roadmap_authority_projection, so the plan a process serves was not a fact anyone could supply -- it was wired into each fold that consumed it. This makes the PLAN AUTHORITY a parameter and leaves the nullary as one binding of it, following the seam gunbc.roadmap_belt_actuate already half-built: belt_dispatch_node_staged_over took the launch graph as a parameter with belt_dispatch_node_staged binding the public one. The same shape now reaches the serve entry, the served pages, the two text bodies, the forecast, the site-surface bundle and the tick-rendered observation surface. No second mechanism was coined, and where an _over variant already existed it is what the new callers reach. WHAT IS PASSED IS THE PROJECTED PLAN, not a path or a source root, so a plan that failed to project arrives as RoadmapAuthorityProjectionRefused and refuses in the caller's own vocabulary at every surface rather than rendering as an empty roadmap. IT IS NOT A REGISTRY. Nothing here enumerates plans and no table is filled in from elsewhere; a caller supplies its plan by CALLING the parameterized fold from its own entry function. That is sound because instance selection is already by serve entry function -- `gunbc serve` binds --entry/--function once for the process's life and carries no per-request argument (verified against gunbc.cli_dispatch_surface: the serve row's options are source-root, entry, function, host, port, release-revision). Behaviour for the public entries is unchanged: roadmap_serve_handle and the five host entries bind roadmap_authority_projection() and reach the same folds they did before. Two nullaries lost their last consumer when their callers moved to the projection-taking form and are deleted rather than left dangling: roadmap_page_for_authority_launch and roadmap_daily_workspace_page_for_authority_observed. gunbc.roadmap_forecast live_roadmap_schedule_forecast additionally stops re-reading accepted_roadmap_node_ids_projection and takes the accepted set from the projection it was handed -- the same value, since roadmap_authority_projection fills that field from exactly that call, and the arm that re-read it could not have disagreed. Evidence: three witnesses in test.claim.roadmap_serve_witness hand roadmap_serve_respond_over a caller-supplied plan and assert the response answers from IT -- the discriminating direction being the NEGATIVE, that the public roadmap's own section title is absent, which reds the moment any surface under the responder reaches past its parameter. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GPjYNDmV8FK6wYLXj4de1S
|
Verified all three findings in review 63317. All three stand, and all three are fixed. Thank you — the first one is the defect this PR exists to prevent, found inside the PR that claims to prevent it. 1. The daily surface leaked — confirmed, fixed.
Two corrections to the finding's scope, both in the direction of more removal, not less:
The two remaining 2. Rung inflation in the evidence — confirmed, and it was worse than stated. The witnesses did not merely fail to cover the daily surface; they covered nothing. They asked The fix is not a corrected string. New:
3.
|
Three defects from review 63317, all confirmed against the code. THE SEAM LEAKED AT THE REFUSED ARM. roadmap_daily_workspace_page_for_projection_observed threaded the plan into its projected arm but its REFUSED arm called roadmap_daily_workspace_page_impl, which re-reads accepted_roadmap_node_ids_projection() -- so a caller-supplied plan that failed to project rendered its refusal banner beside the PUBLIC accepted set, the exact mixing this PR's own note forbids. That arm now calls roadmap_daily_workspace_page_impl_for_accepted with accepted_ids: [], which is what a refused plan means and is byte-identical for the public path: a refused public projection already implies a refused accepted-ids projection, whose arm passed []. daily_workspace_view_of and v1_exit_program_progress_view are deleted. The review cited the first as part of the leak; it is not on the path (_impl_for_accepted reaches daily_workspace_view_of_for_accepted directly) -- but both have ZERO consumers tree-wide, and dead code that reads the public carrier is how this fork gets re-established later. THE WITNESSES ASKED PATHS THAT ARE NOT ROUTES. They spelled "/roadmap.md" and "/dispatch.json"; the declared paths are "/ROADMAP.md" and "/target/roadmap-dispatch.json", so all three asserted status == 200 against a 404. The responder is not fail-open -- serve_select_route answers NoRouteMatched with 404 -- so they were red, not falsely green, and witness_an_unrouted_path_is_refused_not_answered now makes that reading executable instead of asserted. The fix is not a corrected string. roadmap_serve_route_specs carried its own spelling of paths gunbc.roadmap_site_surface_render already declares as data and that the static site, the surface bundle and the deploy witnesses all cite. Those rows now consume the declaration, and the witnesses cite the same constants, so a renamed route moves the routing table, the static artifact and every witness together. witness_daily_page_answers_from_the_supplied_plan probes the leaking fold directly on both arms. It asserts the v1-exit progress COUNT rather than the section title used elsewhere: the daily page renders work rows and bands, never section headings, so that negative would be true for a clean render too -- decoration. The count is cited from v1_finish_lines_accepted_count and v1_exit_finish_lines rather than transcribed, and the witness states the condition under which it discriminates: it separates a leaking render from a clean one exactly where the public acceptance carrier is readable and names at least one accepted finish line. It is the regression control for this fix, not the instrument that would have discovered it. materialize_roadmap_site_surface_bundle_over was a body-identical alias over render_roadmap_site_surface_bundle_for_projection, which already took the projection -- a second name for one fold. Deleted. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GPjYNDmV8FK6wYLXj4de1S
Review 63341, all three confirmed by grep against the current tree. belt_launch_host_standing_for_page and served_observation_snapshot_observe_for_instance each lost their last consumer in this PR -- both callers of the first moved to the _over form, and the second's only caller now routes through served_observation_observe_and_write_over. A surviving nullary that reads the public carrier is how this fork gets re-established later, which is this PR's own argument for deleting roadmap_page_for_authority_launch. Deleted for the same reason. THE DAILY HANDLER WAS FILED UNDER THE WRONG HEADING, and that is a rung honesty defect (DESIGN 4b(1)) rather than a code one. The note grouped RoadmapDailyPageHandler with "the disk-read observation surfaces" that ignore the plan. It is not one of those: it IS a roadmap render, and its plan is bound EARLIER, at the tick that wrote the body, through served_observation_observe_and_write_over -- which this PR parameterized. So the daily page is parameterized, on the other entry. The note now states the consequence a caller actually has to know instead of burying it: a process serving its own plan must supply it at BOTH entries, serve and tick. Supply it at only the serve entry and `/` answers from whatever plan the tick was given, with no refusal, because a pre-rendered body carries no record of the plan it came from. Nothing in the responder can detect that mismatch, so the note says so rather than implying a coverage it does not have. Evidence: the five plan-parameter witnesses PASS by execution under claim_batch on this branch, including witness_daily_page_answers_from_the_supplied_plan. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GPjYNDmV8FK6wYLXj4de1S
A MUTATION CONTROL PROVED MY OWN WITNESS WAS DECORATION, and that is the finding here. With the leak review 63317 found deliberately restored in an isolated worktree -- the refusal arm of roadmap_daily_workspace_page_for_projection_observed routed back through the fold that read accepted_roadmap_node_ids_projection() -- witness_daily_page_answers_from_the_supplied_plan still PASSED. The reason is structural, not a weak assertion. Under the hermetic witness route the carrier read REFUSES, so the ambient fold takes its own refused arm and produces the same empty accepted set a clean render produces. No input reachable from a witness distinguishes the two. The RED is not authorable, and no stronger assertion could have made it so. DESIGN 4b: a check whose RED cannot be authored is not a weak wall but a decoration, and worse than absent because it gets cited as coverage -- which is exactly what the previous commit did, calling this probe "the regression control for this fix". DESIGN 5 says prefer construction over validation when the class is decidable, and this one is: the invalid state exists only because a fold below the parameterized route could name the public accepted set at all. So roadmap_daily_workspace_page_impl is DELETED rather than watched. Its two remaining consumers -- roadmap_daily_workspace_page and roadmap_daily_workspace_page_launch, both static doc-fixture renders -- now supply accepted_ids: [] explicitly. That is what their own standing reason, "static render: the event carrier is not consulted", already claimed and did not deliver: the fold consulted it. After this no fold reachable from roadmap_serve_respond_over, or from a static render, can name the public accepted set. The one ambient read left in gunbc.roadmap_page is finish_line_progress_markup, reachable only from roadmap_page_for_doc -- the full-page doc fixture, which is not plan-parameterized and whose witness asserts on that count deliberately. The probe stays, with its claim corrected to what it earns: both arms render, a refused plan carries the CALLER's detail rather than an empty public roadmap, and the v1-exit progress count is the one the supplied plan implies, cited from v1_finish_lines_accepted_count and v1_exit_finish_lines rather than transcribed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GPjYNDmV8FK6wYLXj4de1S
|
Review 63341: all three verified against the tree and fixed in I claimed a control I did not haveIn It is decoration, and the reason is structural rather than a weak assertion: under the hermetic witness route the carrier read REFUSES, so the ambient fold takes its own refused arm and produces the same empty accepted set a clean render produces. No input reachable from a witness separates the two. The RED is not authorable, and no stronger assertion could have made it so. DESIGN §4b is explicit that such a check is worse than absent, because it gets cited as coverage — which is exactly what I did with it. So the fix is no longer a probe. After that, no fold reachable from The probe stays with its claim cut down to what it earns: both arms render, a refused plan carries the caller's detail rather than an empty public roadmap, and the v1-exit progress count is the one the supplied plan implies — cited from The three findings1 & 2 — two nullaries stranded by this PR. Both confirmed by grep: 3 — the daily handler was mis-filed, and this is the sharpest of the three. Grouping What the note was hiding is now what it says: a process serving its own plan must supply it at both entries, serve and tick. Supply it at only the serve entry and EvidenceAll five plan-parameter witnesses PASS by execution under |
Review 63358, and it is right: the note on roadmap_serve_invoke_over describes a NEWLY DISCOVERED ERROR CLASS -- a process that supplies its own plan at the serve entry but not at the tick entry serves / from the tick's plan with no refusal and no record on the bytes -- and DESIGN 4b says a discovered class files a row under dag/gunbc/recurring_failure_mode, not a comment. DESIGN 4c says the same thing from the other side: no Accepted program can read an annotation, so prose is never evidence that a machine claim holds. a_prerendered_body_carries_no_identity_of_its_source. The row is deliberately not a restatement of the note. It carries the DISTINGUISHING FACTS that make it discriminate: a value parameterized at an entry, a consumer materialized ahead of time by a DIFFERENT entry, and a stored artifact whose schema omits the parameter it was derived under. All three are required. A cache keyed by its inputs is explicitly NOT this class -- the key is exactly the identity this class lacks -- and a surface that recomputes per request is not either. RUNG: below the ladder, because the serving process cannot form the comparison, so there is nothing to mitigate against. CEILING 3, not 4, with the reason: the mismatch is a relation between two independently launched processes, so it cannot be made unconstructible. What can be derived is the refusal. NEXT-RUNG TRIGGER names a capability, not an artifact: a materialized-surface identity binding a stored body to the authority it was derived under, SUFFICIENT FOR a read-back to decide agreement and refuse on disagreement. The row says in so many words that stamping a field into the snapshot type is not the trigger unless the read-back is obligated to consult it -- an identity nothing compares is the 4b decoration this PR already shipped once and had to retract. No roster edit: dag/gunbc/recurring_failure_mode/roster.dag is gitignored and written by the host fold that lists sibling files on the required parse path, so a new row file IS the append. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GPjYNDmV8FK6wYLXj4de1S
…t the floor blockers name The four v2.test.native_decl_selection witnesses were blocking this PR's floor with interrupted_before_verdict -- they fail on the merge base and on main alike, and #10992 is the fix that makes them fit the floor. Merge rather than rebase per the branch's squash policy.
|
Review 63358 is right and the row is filed: The row is deliberately not a restatement of the note:
No roster edit: On the CI red — it was not this change, and the fix is merged
Attribution, measured rather than assumed — the same three
They are also absent from CI's blocker set, so they are pre-existing, unenrolled in the floor, and not this PR's to fix. The four that do block are fixed on main by #10992 ("Share the native_decl_selection fixture at the resolved seam so its four witnesses fit the floor"), so I merged Evidence standing, all by execution
|
… rung
Review 63390, and it is the most important finding on this PR.
My own failure-mode row said "RUNG: found BELOW the ladder". DESIGN 4b
says silent wrongness "is not a rung: it is outside the ladder and
forbidden outright". So filing the row at a low rung was not an
admission, it was shipping a forbidden state with paperwork -- and the
review's sharpest point is that THIS DIFF CREATES THE CONSTRUCTOR:
before the plan parameter existed, no caller could diverge at all.
THE ARM AVAILABLE TODAY IS REFUSAL, which is what DESIGN 5 says to do
when the precise answer cannot be computed: refuse, never widen.
ServedDailyBodyAuthority = DailyBodyRenderedUnderThisPlan
| DailyBodyAuthorityUnknown
threaded through the four serve _over folds. Route / serves on the first
and answers 503 with a located cause on the second -- naming the class,
the tick entry to bind (served_observation_observe_and_write_over), and
how to declare agreement. The coproduct has no third variant, so no
Accepted program serves / from an undeclared authority.
The agreement is a DECLARED fact of the call rather than something
inferred, because the serving process genuinely cannot observe it: a
stored body carries no identity of the authority that rendered it. That
is 4b's "outside the modeled guarantee" column handled at a declared
boundary -- observed, refused or mitigated, never fabricated -- and
deliberately not a fifth rung. The nine public bindings declare
DailyBodyRenderedUnderThisPlan, which they can: public serve and public
tick bind the same projection.
THE ROW MOVED WITH THE CODE, or it would have inflated in the other
direction. Rung is now 1, mitigatable, NOT 3 -- because 4b(1) puts a
class at the MINIMUM across its paths. The undeclared case is refused and
unreachable; the DECLARED-BUT-FALSE case, a caller asserting agreement
its own tick does not honour, is contained rather than prevented, and
that residual is exactly what the ceiling-3 trigger converts from a
trusted declaration into a checked one. The review tell now says so:
documenting the seam and filing it at a low rung are both wrong answers,
because both leave the forbidden state reachable.
Evidence, by execution: seven witnesses PASS, including
witness_undeclared_daily_body_refuses_rather_than_answering and its
positive control witness_undeclared_daily_body_costs_no_other_route --
without which "refuse everything" would satisfy the first. A caller that
cannot vouch for the daily body still gets every other route answered
from its own plan.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GPjYNDmV8FK6wYLXj4de1S
|
Review 63390 is right, and it is the most important finding on this PR. Fixed in The finding in DESIGN's own termsMy row said "RUNG: found BELOW the ladder." §4b says silent wrongness "is not a rung: it is outside the ladder and forbidden outright." So filing it at a low rung was not an admission — it was shipping a forbidden state with paperwork. And the sharpest half of the finding is the one I had not drawn: this diff creates the constructor. Before the plan parameter existed no caller could supply a divergent plan, so the PR that introduces the parameter is the PR that owes the wall. What landed
The coproduct has no third variant, so no On the suggested shape: I did not implement it as "refuse when the supplied plan is not the one the tick is bound to", because the serving process cannot decide that — it is the whole content of the class. Comparing the supplied plan against The row moved with the codeOtherwise it would have inflated in the other direction. Rung is now 1, mitigatable — not 3, because §4b(1) puts a class at the minimum across its paths:
That residual is precisely what the ceiling-3 trigger converts from a trusted declaration into a checked one, which is now stated as the distance between rung 1 and the ceiling. The review tell says outright that documenting the seam and filing it at a low rung are both wrong answers, because both leave the forbidden state reachable — which is the mistake this review caught me making. Evidence, by executionSeven witnesses PASS under
Also merged |
|
The Every blocker is
Main's own floor fails with the same identity set. I pulled main's floor job log (run
Nothing in this diff touches v2 parse — it is roadmap folds plus one coproduct — and it has no path to slowing those witnesses. Escalated to bright-boar-435 as a fleet-wide blocker: while a required lane is red on main, no PR can reach a green floor, which also stalls #10994 and #11014. I am deliberately not fixing it here — it belongs to the D1 parse lane, it is a budget-versus-witness-cost question I have no profile scope for, and patching my own share of a systemic failure would hide it. Holding this PR at its current head rather than pushing churn: a re-push would only re-queue a run that cannot pass. One caveat that cuts against my own reading: floor budget refusal is load-sensitive, so the exact refusal set varies run to run. What is not sample-variable is main being red with this same class across three consecutive runs when the run before them was green. — sent from proud-wren-726 |
…or red this branch inherited The floor red on 45bb5a7 was main's D1 witness budget defect, verified by comparing identity sets against main's own floor job. #11032 fixed it and main's floor is green with 0 budget-refused. Merging so this branch can produce an honest verdict about ITSELF rather than re-reporting a defect that no longer exists.
What was hardwired
Every roadmap surface read its plan from one nullary —
gunbc.roadmap_authorityroadmap_authority_projection— so which plan a process serves was not a fact anyone could supply. It was wired into each fold that consumed it, at 18 call sites across six modules.The seam
The plan authority becomes a parameter, and the nullary stays as one binding of it. This is not a new mechanism:
gunbc.roadmap_belt_actuatealready half-built it —belt_dispatch_node_staged_overtook the launch graph as a parameter withbelt_dispatch_node_stagedbinding the public one. The same_overshape now reaches:_overfoldgunbc.roadmap_serveroadmap_serve_handle_over,roadmap_serve_respond_over,roadmap_serve_selection_response_over,roadmap_serve_invoke_over,serve_dispatch_handler_response_overroadmap_serve_handle+ the five host entriesgunbc.roadmap_static_siteroadmap_site_roadmap_md_body_over,roadmap_site_dispatch_json_body_overgunbc.roadmap_belt_actuatebelt_launch_host_standing_for_page_over,belt_dispatch_node_for_instance_overgunbc.roadmap_served_observationserved_observation_daily_surface_over,served_observation_snapshot_observe_over,served_observation_observe_and_write_over..._for_instancegunbc.roadmap_forecastroadmap_schedule_forecast_overlive_roadmap_schedule_forecastgunbc.roadmap_site_surface_observematerialize_roadmap_site_surface_bundle_overmaterialize_live_...gunbc.roadmap_pageneeded nothing new — its_for_projectionfamily already was the parameterized form; its callers now reach it directly.What is passed is the projected plan,
RoadmapAuthorityProjection, not a path or a source root. A plan that failed to project arrives asRoadmapAuthorityProjectionRefusedand refuses in the caller's own vocabulary at every surface, rather than rendering as a silently empty roadmap.It is not a registry. Nothing here enumerates plans and no table is filled in from elsewhere. A caller supplies its plan by CALLING the parameterized fold from its own entry function, so this module stays unaware of who calls it and needs no edit when another one does. Nothing in this diff names any repository, module or plan other than the public ones.
Why an entry function is the whole integration
Instance selection is already by serve entry function, because
gunbc servebinds--entry/--functiononce for the process's life and carries no per-request argument. Re-verified againstgunbc.cli_dispatch_surfacerather than assumed: theserverow's options are exactly--source-root(repeated),--entry,--function,--host,--port,--release-revision. The plan a process serves is the same kind of fact — fixed at launch, constant for every request — so it arrives the same way.Behaviour
Unchanged for the public entries.
roadmap_serve_handleand the five host entries bindroadmap_authority_projection()and reach the same folds they reached before; srv1-live observes nothing new.One deliberate simplification inside
live_roadmap_schedule_forecast: it no longer re-readsaccepted_roadmap_node_ids_projection()and takes the accepted set from the projection it was handed. Same value —roadmap_authority_projectionfills that field from exactly that call — and itsAcceptedRoadmapNodeIdsProjectionRefusedarm was unreachable, because a refused accepted-ids projection already makes the enclosing projectionRefused. With a caller-supplied plan the second read would have answered about the public roadmap while the nodes came from the caller's, which is the fork this parameterization exists to prevent.Two nullaries lost their last consumer when their callers moved to the projection-taking form, and are deleted rather than left dangling (DESIGN §3c):
roadmap_page_for_authority_launchandroadmap_daily_workspace_page_for_authority_observed.Evidence
Three witnesses in
test.claim.roadmap_serve_witnesshandroadmap_serve_respond_overa caller-supplied plan and assert the response answers from IT:witness_roadmap_md_answers_from_the_supplied_planwitness_dispatch_json_answers_from_the_supplied_planwitness_supplied_plan_refusal_travels_to_the_wireThe discriminating direction is the negative. Asserting that the caller's section title appears would stay green if a surface under the route also read the public carrier and concatenated both; asserting that the public roadmap's own section title —
Active deliverables— is absent is what goes red the moment any consumer belowroadmap_serve_respond_overreaches past its parameter. The refusal witness additionally proves the caller's own detail string reaches the wire on both/roadmap.mdand/dispatch.json.Compile control: the closure was compiled with a deliberately misspelled reference at the new seam and the compiler refused with
undefined variable; with the real diff the entry compiles to the same 3 pre-existing blocking errors (extdeps.gunbcshell transport emission, untouched here) thatHEADproduces for the same entry — measured on a detached worktree atHEAD, not asserted.Not done here, deliberately
The belt tick and the post-spawn attempt path still read the public plan:
belt_tick_for_instance,belt_run_once_in, andbelt_lookup_nodewith its seven consumers across the commit / verify / review / audit / publish folds. Parameterizing those means threading the plan through that whole family, which is a separate restructuring in fileseager-gull-33is actively changing. The dispatch ROUTE is fully parameterized (belt_dispatch_node_staged_overresolves the node from the supplied graph, so no public read survives on that path); the TICK is not.🤖 Generated with Claude Code
https://claude.ai/code/session_01GPjYNDmV8FK6wYLXj4de1S
What changed after review (this section post-dates the description above)
Four rounds of review found real defects. The design above is the starting shape; these are the corrections, kept here because a PR body describing a superseded design is its own small fork.
The seam leaked, and the fix is by construction rather than a check.
roadmap_daily_workspace_page_for_projection_observed's refused arm re-read the public accepted set. Routing that arm to the plan-supplied form closed the route — but the ambient-reading fold was still reachable, and no witness could guard it: under the hermetic route the carrier read refuses and yields the same empty set a clean render yields, so mutated and unmutated agree on every input a witness can construct. Measured, not assumed — the leak restored in an isolated worktree still PASSED. Per §4b that check would be a decoration, soroadmap_daily_workspace_page_implis deleted and every caller supplies its accepted set.daily_workspace_view_ofandv1_exit_program_progress_viewwent with it (zero consumers tree-wide).Route
/now refuses instead of answering from an unnamed authority. The plan parameter created a constructor for a forbidden state: a caller supplying its own plan to the serve entry, while/is served from a body the belt tick wrote under its plan. Filing that at a low rung was wrong — §4b puts silent wrongness outside the ladder and forbids it outright.ServedDailyBodyAuthority = DailyBodyRenderedUnderThisPlan | DailyBodyAuthorityUnknownmakes the agreement a declared fact of the call; the unknown arm gets a located 503 naming the class and the tick entry to bind. The coproduct has no third variant, so noAcceptedprogram serves/from an undeclared authority. The nine public bindings declare agreement, which they legitimately can — public serve and public tick bind the same projection.The residual is filed, not documented.
gunbc.recurring_failure_mode.a_prerendered_body_carries_no_identity_of_its_source: rung 1 (not 3 — §4b(1) puts a class at the minimum across its paths; the undeclared case is refused, the declared-but-false case is contained, not prevented), ceiling 3, trigger naming a capability — a materialized-surface identity sufficient for a read-back to decide agreement. The row states outright that stamping a field into the snapshot type is not the trigger unless the read-back is obligated to consult it.Routes are cited, not spelled. Three witnesses originally asked
/roadmap.mdand/dispatch.json— neither is a route, so all three assertedstatus == 200against a 404. Rather than correcting the strings,roadmap_serve_route_specsnow consumes the declarationsgunbc.roadmap_site_surface_renderalready owns, and the witnesses cite the same ones, so a renamed route moves the table, the static artifact and every witness together.Evidence, by execution: 7/7 plan-parameter witnesses, 13/13 frontier witnesses, 36/39 long page witnesses (the 3 shown inherited by controls at the merge base and current
origin/main), plus the mutation control above.Known and accepted:
DailyBodyRenderedUnderThisPlanis a caller assertion nothing on the serving side can check — that is the declared-but-false case the row carries at rung 1, and converting it from trusted to checked is exactly the ceiling-3 trigger.