Repository navigation
Add a preflight that checks a matrix before it is dispatched - #132
Merged
Merged
Conversation
`pnpm preflight` runs the fourteen checks #131 lists, plus its canary requirement, and exits non-zero when an assertion fails. Decisions (CLI pins, skills pin, model IDs, base prompt) print the pin, the latest and "decision required: record in the release notes", and never fail. It is read-only against Hookdeck, Outpost, GitHub and both providers, apart from one real completion per provider. Those requests, the secret and variable names, and the refusal pattern are parsed out of eval-refresh.yml rather than copied, and the spend estimate reads the measured cost table out of AGENTS.md. basePromptFor moves to lib/base-prompt.ts so the preflight can import it without running the runner; the prompt string is unchanged, so no harness fingerprint moves. core exports registeredAgentPins() and hookdeck exports its trigger matcher and Outpost baseline, read-only. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Review of the preflight found the canary read every agent's image and pins from the newest published run, even when that run had no cells for the agent. The newest run today is Claude-only, so a Dockerfile change or Codex pin bump followed by a Claude-only publish read "not required" with no Codex cell ever run on the new image: #114 again. Each agent is now compared against the newest run that has rows for one of its experiments. - The skills CLI pin, a build arg of the same image, is in the canary comparison and is a decision against npm latest (check 16). - Main-green from a pull request's Checks run fails when main's first parent was committed after the run started, since the merged tree was then never tested. - Hookdeck and Outpost reads go through Deps, the entry point is guarded, and the checks are tested against fakes: canary run selection, the main-green fallback, the secrets filter and the projects-pristine evaluation. - The operator event destination URL is printed with its path masked, attempts that cannot be read say so, and every result string is redacted before the report is laid out. - A docs link that redirects to 200 warns with its final URL (a trailing-slash redirect is not counted), and a 429 backs off once before failing. - Prerelease versions compare as semver does; the skills-pin decision notes the compare API's caps and a diverged pin; the Outpost gateway check compares ids against its baseline. - `pnpm -s preflight --json` is documented for clean JSON. Co-Authored-By: Claude Opus 5.5 <[email protected]>
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 this is for
#131: every defect v0.5.0 found could have been caught before the run that found it. That list is the Codex PATH miss (#114), a skills pin behind main (#26), a Hookdeck CLI pin behind (#125), leftovers in the Outpost project (#111) and overlapping dispatches (#127). A matrix costs about $100 and six hours. This is a script that takes minutes, run before the dispatch.
What changed
pnpm preflight:apps/framework/scripts/preflight.ts. It is wired in the frameworkpackage.jsonliketriage/report-results, plus a root alias. It prints a report, takes--json(usepnpm -s preflight --jsonfor clean JSON), and exits 1 on a failed assertion (2 on bad arguments).registeredAgentPins().hookdeck/agent-skillsmain, listing which skills changed. It notes the compare API's caps and a diverged pin./v1/models.decision required: record in the release notes. None of them fails the script.results/latest.jsonwithkbracketed at 1–3 (Review and merge or drop the Codex cost-reporting branch #6). It never claims to read a balance, and needs--confirm-balance(oryon a TTY).gh secret listagainst everysecrets.*the workflow reads. The key of an agent no experiment uses is reported but does not fail.eval-refreshrun.EVALS_PUBLISHandEVALS_MAX_MISSING_FRACTIONmust match--hold-publishand--max-missing-fraction.evals-ciholds exactlyDEFAULT_ISSUE_TRIGGERS, using the reset's own matcher, and no other resources.OUTPOST_GATEWAY_PRISTINE, compared by id.hookdeck.com/docsURL in the pinned skills returns 200. A redirect warns with the final URL, and a 429 backs off once before failing.harnessissue must be named in--accept-harness.gh workflow runcommand withEVALS_PUBLISH=false.--canary-run <id>then verifies the finished run:sandbox self-check failedPINNED CLI NOT ON PATH--skip <id>prints a banner and the skipped ids in the result line.redactArtifactDeepbefore the report is laid out.basePromptFormoves toapps/framework/lib/base-prompt.ts. The string is unchanged, so no harness fingerprint moves.@hookdeck-evals/coreexportsregisteredAgentPins().@hookdeck-evals/hookdeckexportsissueTriggerMatchesDeclared,OUTPOST_GATEWAY_PRISTINE, theOperatorEventDestinationtype,redactArtifactDeepandredactSecretsForArtifact.Verified
pnpm install: okpnpm format:check: exit 0pnpm typecheck: exit 0pnpm -r build: exit 0pnpm check: exit 0, framework 215 testspnpm -r test: exit 0. core 115, sandbox 49, hookdeck 70, web 71, framework 215.test/preflight.test.tscovers the pure logic.test/preflight-checks.test.tsruns the real checks against fakeDeps: canary run selection after a Claude-only publish, the main-green fallback, the secrets filter and the projects-pristine evaluation.I did not run actionlint, because no workflow changed.
A real run against a full benchmark matrix exits 1 on three assertions:
It found five decisions: the Hookdeck CLI pin is one major behind, the skills CLI is two minors behind, the agent CLIs are behind, the skills pin is 4 commits behind main, and
claude-sonnet-5-5exists.Not done, and why
--canary-run: no canary run exists yet.y/Nprompt.cliVersionwould not be seen. No experiment does today.Observations, not in this diff
AI_GATEWAY_API_KEY: the workflow reads it, but it is not a repository secret. Only opencode uses it, and no experiment uses opencode.gpt-5.6: it is not in OpenAI's/v1/models, which lists onlygpt-5.6-sol,-lunaand-terra. That matches AGENTS.md's "resolves togpt-5.6-sol".pull_requestonly, so main commits carry no check runs. That is why check 9 reads the PR's run./docs/outpost,/docs/outpost/destinationsand/docs/projects.Closes #131
🤖 Generated with Claude Code