Repository navigation
ci(ci): apply scripts/deno.json permission grants in the repo scripts tests - #338
Merged
Merged
Conversation
… tests The Repo scripts tests step ran deno test with --config=scripts/deno.json but without -P, so a permissions block in that config would never reach the tests: a script test needing a grant would fail with NotCapable in CI while the config said it was allowed. With -P the step applies the config's default permission set. scripts/deno.json grants nothing today, so the ten existing tests run the same either way.
ryanleecode
approved these changes
Oct 13, 2026
ryanleecode
left a comment
Contributor
There was a problem hiding this comment.
Root verdict: one-line -P at ci.yml:137, CI green on d2bc3e0 incl. the Repo scripts tests log, full-path receipt (DeepSeek v4.1 flash + MiniMax M3.1 peer), 0 threads. Pre-existing finding 1 (scripts step has no id/reason code) is routed as a follow-up.
systemfsoftware-maker
added a commit
that referenced
this pull request
Oct 13, 2026
The root ruled that the pin moves into the Turbo graph. turbo.json gains //#test:scripts, whose inputs are what the suite reads and runs (scripts/**, the lockfile and pnpm-workspace.yaml for the turbo it drives, bin/deno and the flake for the deno that runs it), and gate:tasks runs test:scripts beside lint, typecheck and test. The plan records that main's #338 already added -P to Repo scripts tests, repoints the reader table at the fixture tsconfig include that replaced the deleted fixture-project.js, and the changeset separates the cached and the never-cached package.
This was referenced Oct 13, 2026
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.
Summary
Root owns this change. The
checkjob's verdict steps in.github/workflows/ci.ymlare a judgment surface, and its owner is root.CONST-E7: the gate owner (root) differs from the graded pin owners G and K. Root ordered and owns the gate change; nobody's graded work is shaped to pass by changing it.
The change is one line, at
.github/workflows/ci.yml:137, in the existingRepo scripts testsstep:Nothing else in ci.yml changes, and no other file changes. Without
-P, Deno ignores anypermissionsset inscripts/deno.json, so a script test that needs a granted permission would fail withNotCapablein CI even though the config allows it. With-P, the step loads the config'sdefaultpermission set.This PR is separate from #332 and does not touch
release.jsonc,turbo.json, dependency files, or other CI. The owed docs/solutions entry (the release intent gate keys ontypecheck, notbuild, because build inputs omit shippedcontract/andlib/files) is a different concern from this flag, so it stays separate rather than folded in here.Does
scripts/deno.jsongrant anything on main?No. It grants no permissions today:
git show origin/main:scripts/deno.json | jq -c '{permissions, test}'returns{"permissions":null,"test":null}. The file holds onlycompilerOptions,minimumDependencyAgeandimports. The step therefore has no grants to apply yet. Root ruled that this PR enables the grant path, so grants added later take effect, and adds no grant.Scripts-step evidence (deno 2.9.7, head
d2bc3e0198f266c61da51cf01c3e370a3babe627)./bin/deno test -P --config=scripts/deno.json scripts/ok | 10 passed | 0 failed, exit 0:scripts/change-lane.test.ts(6) andscripts/turbo-summary.test.ts(4); printsWarning Permissions in the config file is an experimental feature and may change in the future.-P(main's command)ok | 10 passed | 0 failed, exit 0{"permissions":{"default":{"env":["PROBE_VAR"]}}}plus a test that readsPROBE_VAR, no-PNotCapable: Requires env access to "PROBE_VAR", FAILED-Pok | 1 passedThe last two rows prove that
-Papplies grants from the config.The step's log in CI on this head (CI run 38383735483, job
check115250611957, stepRepo scripts tests):CI on
d2bc3e01: all 5 workflow runs passedcheck,checker-parityshards 1-6 and the parity report passed;cache-sweepwas skippedVerification
git diff --stat origin/main...HEAD:.github/workflows/ci.yml, 1 insertion and 1 deletionpnpm format:checkpnpm check:ciond2bc3e01a578c704a48db36b697d21359c7c09b73eee0ecegh stack view: trunkmainlistsci/scripts-tests-permissionsstryker/mutant-drop-audit-ci, ci.yml hunk at line 699) and #286 (stryker/tsgo-checker-shortcut, hunk at line 688). Neither touches line 137.git merge-treewith #288 is clean; #286's only conflict is in its ownCheckerRuntime.service.ts. The branch is based on current main as root ordered.No mutation testing was run locally.
Review (ce-code-review, full path, report-only, head
d2bc3e0198f266c61da51cf01c3e370a3babe627, base3797debd60e55f45498dcc08403774457c06c25e= origin/main)Served models, read from each reviewer's transcript (none on Grok):
openrouter/deepseek/deepseek-v4.1-flash.omp -p --model minimax-code/MiniMax-M3.1-Flash-Preview --thinking high --no-tools): served byminimax-code/MiniMax-M3.1-Flash-Previewwith no fallback, session01a134a6-9d52-76a8-9f40-95ab128269d5.Pack rules (project-standards lens): all 57 rule files of the 7 enrolled packs
7 comply, 1 violate (pre-existing; see finding 1), 49 not-applicable.
cell-architecture/callable-vs-resource-syntax.md.github/workflows/ci.yml:Nonecell-architecture/decode-never-cast.md.github/workflows/ci.yml:Nonecell-architecture/four-channel-contracts.md.github/workflows/ci.yml:Nonecell-architecture/handle-state-privacy.md.github/workflows/ci.yml:Nonecell-architecture/pipeable-dual-parity.md.github/workflows/ci.yml:Nonecell-architecture/pipeline-composition.md.github/workflows/ci.yml:Nonecell-architecture/pure-decision-workflows.md.github/workflows/ci.yml:Nonecell-architecture/resource-vs-handle-duality.md.github/workflows/ci.yml:Nonecell-architecture/sandwich-phase-order.md.github/workflows/ci.yml:Nonecell-architecture/scoped-lifecycle-boundaries.md.github/workflows/ci.yml:Nonecell-architecture/service-and-layer-boundaries.md.github/workflows/ci.yml:Nonecell-architecture/single-namespace-barrel.md.github/workflows/ci.yml:Nonecell-architecture/staged-lawful-builders.md.github/workflows/ci.yml:Nonecell-architecture/store-serializable-unit-of-work.md.github/workflows/ci.yml:Nonecell-architecture/store-unit-of-work-handle.md.github/workflows/ci.yml:Noneboundary-testing/expected-values-never-come-from-the-subjects-output.md.github/workflows/ci.yml:Noneboundary-testing/fake-and-real-store-laws.md.github/workflows/ci.yml:Noneboundary-testing/no-mocks-on-internal-glue.md.github/workflows/ci.yml:Noneboundary-testing/pin-dependency-semantics.md.github/workflows/ci.yml:Noneboundary-testing/port-fakes-pass-the-port-contract.md.github/workflows/ci.yml:Noneboundary-testing/real-system-oracles.md.github/workflows/ci.yml:Noneboundary-testing/staged-protocol-evidence.md.github/workflows/ci.yml:Noneschema-laws/arbitrary-filter-floors.md.github/workflows/ci.yml:Noneschema-laws/cross-field-invariants-as-struct-checks.md.github/workflows/ci.yml:Noneschema-laws/data-only-schema-classes.md.github/workflows/ci.yml:Noneschema-laws/invariants-as-refinements.md.github/workflows/ci.yml:Noneschema-laws/law-failure-is-a-codec-defect.md.github/workflows/ci.yml:Noneschema-laws/recursive-schema-suspend.md.github/workflows/ci.yml:Noneschema-laws/refusals-beside-generated-laws.md.github/workflows/ci.yml:Noneschema-laws/rich-type-over-foreign-encoded.md.github/workflows/ci.yml:Noneschema-laws/tagged-unions-over-state-by-presence.md.github/workflows/ci.yml:Noneschema-laws/tests-own-no-schemas.md.github/workflows/ci.yml:Nonepackage-topology/condition-branch-agreement.md.github/workflows/ci.yml:Nonepackage-topology/declared-entry-points.md.github/workflows/ci.yml:Nonepackage-topology/enumerated-entry-modules.md.github/workflows/ci.yml:Nonepackage-topology/import-time-inertness.md.github/workflows/ci.yml:Nonepackage-topology/one-access-path.md.github/workflows/ci.yml:Nonepackage-topology/public-signature-types.md.github/workflows/ci.yml:Nonepackage-topology/surface-changes-are-versioned.md.github/workflows/ci.yml:Nonemutation-discipline/kill-survivors-with-contract-properties.md.github/workflows/ci.yml:Nonemutation-discipline/suppress-by-shape-in-an-ignorer.md.github/workflows/ci.yml:Nonemutation-discipline/unkillable-survivors-are-dead-code.md.github/workflows/ci.yml:Noneci-wall-clock/failures-name-the-gate-and-location.md.github/workflows/ci.yml:137ci-wall-clock/flake-outputs-build-once-on-main.md.github/workflows/ci.yml:Noneci-wall-clock/gates-share-one-job.md.github/workflows/ci.yml:137ci-wall-clock/heavy-lanes-state-their-daily-minutes.md.github/workflows/ci.yml:Noneci-wall-clock/heavy-suites-judge-every-main-commit.md.github/workflows/ci.yml:Noneci-wall-clock/light-checks-run-the-pinned-tool.md.github/workflows/ci.yml:Noneci-wall-clock/local-gate-equals-pr-gate.md.github/workflows/ci.yml:137ci-wall-clock/no-dev-shell-on-verdict-lanes.md.github/workflows/ci.yml:137ci-wall-clock/no-lane-grades-the-repos-own-docs.md.github/workflows/ci.yml:137ci-wall-clock/one-stuck-job-backstop.md.github/workflows/ci.yml:137ci-wall-clock/pr-gate-runs-only-what-the-diff-affects.md.github/workflows/ci.yml:137ci-wall-clock/red-main-reverts-its-culprit-same-day.md.github/workflows/ci.yml:Noneci-wall-clock/release-promotes-the-staging-proven-build.md.github/workflows/ci.yml:Noneci-wall-clock/setup-under-a-minute.md.github/workflows/ci.yml:137turbo-task-graph/selection-and-caching-go-through-turbo.md.github/workflows/ci.yml:NoneRepo rules: CONST-E7 and CONST-E9 (root owns the gate), CONST-W1 (one line, as ordered), AGENTS.md:7 (
.github/workflows/is read-only for agents; this edit is root-ordered), GATE1 (no new gate; an existing step gains a flag), and OP13b (stacked onmain) all comply.Findings: every one is closed
- name: Repo scripts testscarries noid:, and the verdict env at ci.yml:196-215 has no SCRIPTS entry, so its failure falls through to the finalelsegiving reason=CHECK_SETUP_FAILED with a log pointer), but the diff changes only therun:text at ci.yml:137 and the missing id / absent table row predate and are unaffected by that one-line change, so the pre-existing ground for rejection applies. (pack ruleci-wall-clock/failures-name-the-gate-and-location.md, pre-existing since ee2c4cf)./bin/deno test -P --config=scripts/deno.json scripts/emitted onlyWarning Permissions in the config file is an experimental feature and may change in the future.beforeok / 10 passed / 0 failed(exit 0), i.e. -P at ci.yml:137 loads no permission set and the step's sole new effect is that warning; the commit subjectci(ci): apply scripts/deno.json permission grants in the repo scripts teststherefore names an effect the tree cannot produce (its own ). Root ruled it out of scope: this PR enables the grant path so that future grants inscripts/deno.jsonapply, and adds no grant. No commit.check:ciruns format:check, lint:conventions, gate:tasks and gate:dist, andgate:tasksruns gate:repo plusturbo lint lint:tsgo typecheck test— none invokes a deno test of scripts/ — while grep shows the repo's onlydeno test ... scripts/invocation is ci.yml:137, so no test-versus-gate permission divergence exists to introduce.permissionskey (grep forpermissionsunder scripts/ returns nothing) — so it introduces no privilege-boundary change and cannot widen what the step may do; the alleged unreviewed-grant harm requires a future commit and describes no defect in the reviewed diff.check:ci/gate:taskscontain nodeno test; the onlydeno test ... scripts/occurrence in the repo is ci.yml:137), and the hand-written invocation at ci.yml:136-137 predates this diff (only therun:text changed), so no local/CI permission divergence is created by this change.Correctness and adversarial raised no findings.