fix(skeleton): declare the door back from a trial, and require a decision for every provider - #143
Merged
Conversation
…sion for every provider A governed session running make scaffolds into a trial workspace and answers «apply it with sandbox:promote». TrialOperations offers that operation, and this skeleton never declared it — so the scaffolder named a command every newly created app lacked. It was found three times in the greenhouse (decisions/0227, 0331, evidence/0994) and each time patched in the lab mount where it surfaced. The last time, a local model had removed every other obstacle and stopped on exactly this, naming it as a house debt. Measured in an app created from this skeleton WITHOUT milpa/agent, which is how every app is born: it boots, offers sandbox:list/discard/promote/undo, and sandbox:list answers ok with no trials. The guard checks the shape of the defect rather than the name. It enumerates, by reflection, every concrete CommandProvider milpa/app-runtime ships under its Operations namespace and requires each to be declared in config/operations.php or listed in EXCUSED with a written reason, so «left out» and «forgotten» stop looking the same. Enumerating surfaced one more provider outside the list, and it is correctly outside: PresentationOverrideOperations takes a store and is wired by LivePlugin, like ScreenOperations. It is excused in writing. 181 tests (+3), 412 assertions, the same 66 skipped as main, phpstan and style clean. Verified by mutation: dropping the TrialOperations line fails twice — the enumeration names it and sandbox:promote goes missing — and dropping the excuse fails naming PresentationOverrideOperations. Greenhouse: decisions/0461.
…heir bytes This asserted the exact string <style data-milpa-assets="components">, with the closing > right after the attribute. milpa/live-web 0.30 added data-milpa-components="brand-mark@1 code-block@1" before it. The page kept emitting each tag exactly once — measured on a served app and on the bare controller — and the assertion saw 0. So every app this skeleton creates shipped a red test suite, and every pull request to this repository failed Boot proof. Main's last green was 2026-09-12, before that live-web release; CI resolves fresh because composer.lock is not tracked, so the break arrived with the dependency, not with a commit here. The test now counts the tag's opening, and also asserts which components the page emitted for, so a bare opening from somewhere else cannot satisfy it. Verified the other direction by mutation: emitting the stylesheet twice fails with 2 against 1. Greenhouse: evidence/0995.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What was wrong
A governed session running
makescaffolds into a trial workspace and answers «apply it withsandbox:promote».TrialOperationsis what offers that operation — and this skeleton never declared it. Every newly created app got a scaffolder that named a command the app did not have.It had been found three times in the greenhouse and patched each time where it surfaced, never here:
decisions/0227decisions/0331evidence/0994house_debtWhat changed
TrialOperationsis declared inconfig/operations.php.Measured in an app created from this skeleton without
milpa/agent— which is how every app is born:The guard checks the shape, not the name
A guard that checks
TrialOperationsby name certifies that one instance and waves the next through. This one enumerates, by reflection, every concreteCommandProviderthatmilpa/app-runtimeships underOperations, and requires each to be declared or listed inEXCUSEDwith a written reason — so left out and forgotten stop looking the same.Enumerating surfaced one more provider outside the list, and it is correctly outside:
PresentationOverrideOperationstakes aPresentationOverrideStorein its constructor and is wired byLivePlugin, likeScreenOperations. It is excused in writing rather than flagged.sandbox:promoteandsandbox:list, directlyHow it was verified
By mutation: dropping the
TrialOperationsline fails twice (the enumeration names it, andsandbox:promotegoes missing); dropping the excuse fails namingPresentationOverrideOperations. The enumeration also asserts it seesAgentOperations, so an empty result cannot pass everything silently.Greenhouse:
decisions/0461.