[security-audit] FAIL on 2026-09-25
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- À clarifier
- Activité
- Active
- Stack technique
- github-actions, node.js, typescript
Piste de recherche
Start with the failing audit-application.md section and the linked GitHub Actions run and transcript. Read the cited install-macos.sh, install-linux.sh, burrow-runtime.ts, relay/src/app.ts, and the relevant security specifications to understand the warnings. Done means rerunning the security audit and confirming audit-application.md no longer reports a failing verdict.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Audit failed at 2026-09-25T10:02Z. Run · Transcript
- A domain returned
FAIL. audit-application.md opened withVERDICT: FAIL— read that domain's section first. A domain's own verdict outranks the merged one.
Lines that decided this verdict
Lifted out of the fragments so truncation cannot cut them. Each domain's full section follows for as far as the body reaches.
audit-supply-chain.md: VERDICT: PASSaudit-ci-secrets.md: VERDICT: PASSaudit-application.md: VERDICT: FAILaudit-hosted.md: VERDICT: PASSaudit-application.md: - WARNING (see qualitative findings) —tsip="$(ts ip -4 2>/dev/null | head -1 || true)"is a literal instance of the banned shape on Tailscale CLI output [macos] install-macos.sh:902; [linux] install-linux.sh:1131audit-application.md: - WARNING —burrowTokentravels in a URL query string on every Burrow relay connection:?${WS_TOKEN_PARAM}=${encodeURIComponent(this.#enrollment.burrowToken)}(/home/runner/work/dormouse/dormouse/lib/src/remote/burrow/burrow-runtime.ts:771), validated fromc.req.query(WS_TOKEN_PARAM)(/home/runner/work/dormouse/dormouse/relay/src/app.ts:1296).docs/specs/relay.md:327justifies query-param WS auth with "browsers cannot set WebSocket headers" — true for/ws/client, but the `/ws/baudit-application.md: - WARNING —head -1on Tailscale CLI output, at a site the rationale's own scoping says the rule binds.tsip="$(ts ip -4 2>/dev/null | head -1 || true)"at /home/runner/work/dormouse/dormouse/deploy/local/install-macos.sh:902 and /home/runner/work/dormouse/dormouse/deploy/local/install-linux.sh:1131 is an inline command substitution whose value drives amanage verifydecision, which is exactly the shapedocs/specs/security-remote.md:197names and `docs/specs/security-remote.rationaaudit-application.md: #### WARNINGs (7, none a boundary crossing)
Security audit
Supply chain
VERDICT: PASS
FAIL IF results
-
FAIL IF
node website/scripts/generate-deps.jschanges the three disclosure JSON files afterpnpm install --frozen-lockfile. PASS. Ranpnpm install --frozen-lockfile(lockfile up to date, no changes), thennode website/scripts/generate-deps.js(wrote 66 npm deps, 12 direct + 478 transitive cargo deps, 1 bundled runtime).git status --porcelain website/src/data/andgit diff website/src/data/are both empty — no diff produced. -
FAIL IF
.github/workflows/ci.ymlstops running the generator under the--frozen-lockfileprecondition or stops failing on a diff. PASS.ci.ymllines 24-25 runpnpm install --frozen-lockfile; the "Dependency disclosure is current" step (lines 39-46) runsnode website/scripts/generate-deps.jsthengit diff --quiet -- website/src/data/,exit 1on a diff. -
FAIL IF the disclosure omits a shipped workspace's graph or excludes a shipped package. PASS. Derived independently from
pnpm-workspace.yaml's 11 packages against each package.json's declaredname:productDependencyFilters= dor, dormouse (vscode-ext), dormouse-standalone, dormouse-lib (lib), dormouse-sidecar (standalone/sidecar), relay (6 roots);excludedWorkspacePackages= canopy, dormouse-website (website), dormouse-hosted (hosted) (3 exclusions, each installs no artifact — canopy is Storybook-only, website runs in a visitor's browser, hosted runs on Workers/browser only). The remaining 2 packages, dor-lib-common and remote-lib-common, are workspace edges reached via runtimedependencies(notdevDependencies) from roots:dor-lib-commonfromdorandlib's package.jsondependencies;remote-lib-commonfromlibandrelay'sdependencies. All 11 workspace packages accounted for by root, exclusion, or reachable edge — matches whatassertWorkspaceCoverageinwebsite/scripts/dependency-workspaces.jsenforces at generation time (verified it throws on unclassified/duplicate/stale names and on a reachable exclusion;website/scripts/dependency-workspaces.test.jscovers these cases). -
FAIL IF root
package.jsonis missingdevEngines.runtime.version, or its value is not an exactMAJOR.MINOR.PATCH. PASS.package.json->devEngines.runtime.version="24.18.0", matches^\d+\.\d+\.\d+$. -
FAIL IF
standalone/src-tauri/build.rsno longer runs--versionon the bundled binary and fails the build on mismatch, or the check is skipped for a release-matrix configuration other than the permitted host!=target skip. PASS.verify_node_version(build.rs:191-227) runsnode_source --version, compares trimmed output againstread_pinned_node_version's parse ofdevEngines.runtime.version, and returnsErr(failing the build via.expect(...)inbundle_node_runtime) on mismatch. The only skip ishost != target(build.rs:197-205), which only warns and returnsOk..github/workflows/release.yml'sbuild-standalonematrix (lines 26-36) has exactly three entries —ubuntu-22.04/x86_64-unknown-linux-gnu,macos-latest/aarch64-apple-darwin,windows-latest/x86_64-pc-windows-msvc— each platform runner native to its own target, sohost == targetfor every entry the release matrix builds and the skip path is never exercised in CI today. -
FAIL IF the
build-standalonejob does not install the pinned runtime vianode-version-file: package.json, or rootpackage.jsongains avolta.nodeorengines.nodefield. PASS.release.ymllines 46-48 useactions/setup-nodewithnode-version-file: package.json.package.jsonhas novoltakey and noengineskey (grepped both; onlydevEngines.runtimepresent). -
FAIL IF
pnpm-workspace.yamlis missingminimumReleaseAge: 1440. PASS.pnpm-workspace.yaml:44setsminimumReleaseAge: 1440(1440 minutes = 24 hours). -
FAIL IF
.github/renovate.jsonis missingnpmorcargofromenabledManagers, or is missingminimumReleaseAgepackage rules for those managers. PASS.enabledManagers=["github-actions", "npm", "cargo"].packageRulesincludes three rules matchingmatchManagers: ["npm", "cargo"]withmatchUpdateTypespatch/minor/major set tominimumReleaseAge"1 day"/"3 days"/"14 days" respectively. -
FAIL IF
.github/renovate.jsonhas novulnerabilityAlertsblock, or that block does not explicitly setminimumReleaseAge. PASS.vulnerabilityAlertsblock present with"minimumReleaseAge": "1 day"set explicitly (and a comment explaining why omitting it would silently drop the cooldown to null). -
FAIL IF secret scanning or push protection is disabled, or Dependabot alerts are off. PASS, all three clauses.
GH_TOKEN=$AUDIT_PAT gh api repos/diffplug/dormouse --jq .security_and_analysis(200) ->secret_scanning.status: "enabled";secret_scanning_push_protection.status: "enabled".GH_TOKEN=$AUDIT_PAT gh api repos/diffplug/dormouse/vulnerability-alerts -i->HTTP/2.0 204 No Content(Dependabot alerts on). Note (not part of this FAIL IF):dependabot_security_updates.statusis"disabled"— automatic Dependabot PRs are off, but the spec does not require them; Renovate'svulnerabilityAlertsblock (checked above) is the path this repo uses instead.
Qualitative findings
Scope worked: lib/package.json added ws (^8.21.3) to its runtime dependencies (plus @types/ws, playwright-core to devDependencies) since the last successful audit (comparing head commit 8836c754 from the 2026-09-24 09:19 UTC PASS run against current main, via gh api repos/diffplug/dormouse/compare/...). This is a genuine new production dependency on a disclosed root (dormouse-lib). Verified it is legitimately used (lib/src/host/agent-browser-host.ts, lib/src/host/browser-viewer.ts, lib/src/host/browser-host.ts — Node-side host modules bundled into both hosts) and is already correctly disclosed: the FAIL-IF-1 regeneration above produced no diff, confirming dependencies-npm.json already reflects it. No lockfile change was needed since ws was already resolved elsewhere in the graph. This is exactly the class of change the CI regeneration gate (FAIL IF 2) exists to catch per the rationale's ws/hono history, and it passed cleanly this time. INFO, not a finding.
Non-registry lockfile resolutions: grepped pnpm-lock.yaml for tarball:/http(s):// resolutions outside the npm registry. Found three kinds: (1) @diffplug/xterm-addon-webgl-sdf, a GitHub-release tarball, is canopy's dependency only — canopy is in excludedWorkspacePackages (Storybook-only lab, docs/specs/webgl-text.md documents the fork pipeline) and is not reachable from any product root (confirmed under check 3), so it correctly never reaches the disclosure or a user's machine. (2) pgstencil / @pgstencil/auth, resolved via file:vendor/*.tgz per pnpm-workspace.yaml's overrides, belong to hosted/dormouse-hosted, which is also excluded — pgstencil provenance is the hosted domain's scope (docs/specs/security-hosted.md), not this one. (3) nodejs.org/unofficial-builds.nodejs.org tarball URLs under the root node: runtime:24.18.0 devEngines entry are pnpm's own runtime-provisioning URLs for the pinned Node version already covered by the Bundled Runtime checks above. None of the three represent an undisclosed package reaching a user's machine. INFO.
Install scripts in production dependencies: pnpm-workspace.yaml's allowBuilds map permits native builds for workerd, @swc/core, esbuild, node-pty, and sharp, and blocks them for cpu-features, protobufjs, ssh2, @vscode/vsce-sign, and keytar. Traced each allowed package with pnpm why against the six product roots' direct dependencies (not devDependencies): only node-pty is a direct runtime dependency of a shipped root (dormouse / vscode-ext and dormouse-sidecar), which is expected (native PTY addon) and already disclosed. esbuild, @swc/core, and workerd only reach dormouse-hosted / build tooling (wrangler, storybook, argos-ci), which is excluded from the shipped graph. sharp is pulled in as a dependencies-declared transitive of ascii-splash under dormouse-website (excluded — browser-only, and sharp's native binary cannot run in a browser regardless, so it is a build-time-only artifact) and otherwise only as devDependencies of dormouse-hosted/dormouse-lib tooling. No allowed-build package reaches a shipped root through an undisclosed path. INFO.
Any package reachable but undisclosed: none found. The root-completeness derivation (check 3) accounts for all 11 workspace packages, and the clean generate-deps.js diff (check 1) confirms the generated disclosure matches what the roots currently resolve to.
CI and secrets
VERDICT: PASS
FAIL IF results
- FAIL IF
pull_request_targetappears outsidetend-*.yaml(security-ci.md "GitHub Actions Policies"): PASS. Grep of.github/workflows/**showspull_request_targetonly as anon:trigger intend-review.yaml(agent-managed, exempt) and as a code comment inhosted-preview.yml:75("Never expose deployment credentials to fork code or pull_request_target"), which is not a trigger. - FAIL IF a non-agent-managed workflow has effective write permissions other than
id-token: write/attestations: writeor thesecurity-auditjob'sactions: write(security-ci.md "GitHub Actions Policies"): PASS.argos.yml,ci.yml,hosted-preview.yml,hosted-production.ymldeclare only workflow-levelcontents: read(jobchangesin hosted-preview.yml additionally scopespull-requests: read, a read permission).release.ymlis workflow-levelcontents: read; itsbuild-standalone/build-vscodejobs addid-token: write+attestations: write(the documented exception, gated on therelease-attestenvironment admitting only admin-gatedv*tags), itssecurity-auditjob adds onlyactions: write(the documented exception), andpublish-vscodehas no job-level permissions block, so it inherits workflow-levelcontents: read. - FAIL IF every
uses:ref in a non-tend-*.yamlworkflow is not pinned by commit SHA: PASS. Scanned everyuses:line inargos.yml,ci.yml,hosted-preview.yml,hosted-production.yml,release.yml,security-audit.yaml,workflow-audit.yaml— every ref is a 40-hex-character commit SHA with a version comment.tend-*.yamlfiles use tag pins (max-sixty/tend/[email protected],actions/checkout@v7,astral-sh/[email protected]), consistent with the documented exemption. - FAIL IF an agent-managed workflow job's effective
GITHUB_TOKENpermissions exceedcontents: write,pull-requests: write,issues: write,id-token: write,actions: read, or any read scope: PASS. Checked everypermissions:block (workflow- and job-level) in alltend-*.yaml,workflow-audit.yaml, andsecurity-audit.yaml— every declared scope is within the allowed set (contents: write,pull-requests: write/read,issues: write,actions: read,id-token: write). - FAIL IF
default_workflow_permissionsis notreadorcan_approve_pull_request_reviewsis notfalse: PASS.GET repos/diffplug/dormouse/actions/permissions/workflowreturns{"default_workflow_permissions":"read","can_approve_pull_request_reviews":false}. - FAIL IF private vulnerability reporting is disabled: PASS.
GET repos/diffplug/dormouse/private-vulnerability-reportingreturns{"enabled":true}. - FAIL IF either admin-gating ruleset is missing or weakened (security-ci.md "Automated Maintainer (tend)"): PASS, both clauses.
GET .../rulesets/16757376("Merge access"):target: branch,conditions.ref_name.include: ["~DEFAULT_BRANCH"],rules: [update, deletion, creation],bypass_actors: [{actor_id:5, actor_type:RepositoryRole, bypass_mode:exempt}]— matches spec exactly (target, all three blocked operations, sole admin bypass actor).GET .../rulesets/16757382("Tag operations"):target: tag,conditions.ref_name.include: ["~ALL"],rules: [creation, update], same sole admin bypass actor — matches spec exactly. - FAIL IF
dormouse-botholdsmaintainoradmin: PASS.GET repos/diffplug/dormouse/collaborators/dormouse-bot/permissionreturnspermission: "write",role_name: "write"— neithermaintainnoradmin. - FAIL IF any GitHub environment except
hosted-previewadmits a ref not admin-gated byTag operations/Merge access: PASS for every non-hosted-previewenvironment. Enumerated all 7 environments (GET .../environments) and each one'sdeployment-branch-policies:hosted-productionadmits onlymain(branch, covered by "Merge access" which blocks all non-adminupdate/creation/deletionon~DEFAULT_BRANCH);hosted-release-tagadmits onlymain(same);release-attestadmits only tag patternv*(covered by "Tag operations",~ALLtags, admin-onlycreation/update);security-auditadmitsmainand tagv*(both covered);tendadmits onlymain(covered);vscode-extension-publishadmits only tagv*(covered).hosted-preview(the named exception) admitsmainandrefs/pull/*/merge— checked instead against "Hosted Deployments" below. - FAIL IF a Hosted environment lacks branch restrictions, required reviewers, or disabled administrator bypass (security-ci.md "Hosted Deployments"): PASS, all three environments.
hosted-preview: admitsmain+refs/pull/*/merge,required_reviewers= [nedtwigg, edgartwigg],prevent_self_review: false(self-review is explicitly allowed by spec),can_admins_bypass: false.hosted-production: admits onlymain, same two reviewers,can_admins_bypass: false.hosted-release-tag: admits onlymain, same two reviewers,can_admins_bypass: false. - FAIL IF Hosted credentials appear at repository/org scope, or production credentials appear in
hosted-preview: PASS. Repo-level secrets are exactlyARGOS_TOKEN,CHROMATIC_PROJECT_TOKEN(0 Hosted-related names); org-level secrets: 0 entries.hosted-preview's environment secrets (CLOUDFLARE_API_TOKEN,NEON_API_KEY,PREVIEW_AUTH_SECRET) are distinct, environment-scoped GitHub secret objects fromhosted-production's ownCLOUDFLARE_API_TOKEN— GitHub environment secrets are never shared across environments by name, so no production secret value can be present inhosted-previewthrough GitHub's placement mechanism; this is the limit of what "inspect GitHub secret placement" can determine (the underlying token's actual Cloudflare/Neon privilege scope is not GitHub-readable). - FAIL IF
HOSTED_TAG_TOKENappears outsidehosted-release-tag, or that environment is used by a job other thantaginhosted-production.yml: PASS.HOSTED_TAG_TOKENdoes not appear in any repo secret, org secret, or any other environment's secret listing (in facthosted-release-tag's own secret listing is currently empty — 0 entries — a provisioning gap, not a placement violation).grepof.github/workflows/**showshosted-release-tagreferenced only once, as theenvironment:of thetagjob inhosted-production.yml, andHOSTED_TAG_TOKENreferenced only in that same job. - FAIL IF a Hosted preview deploy accepts a fork or a failing verification, preview cleanup checks out a PR ref rather than
main, or a Hosted production tag can run before live verification succeeds: PASS.hosted-preview.yml'sdeployjob requiresneeds: verifyand itsif:excludes forks (github.event.pull_request.head.repo.full_name == github.repository);cleanupchecks outrefs/heads/mainexplicitly, not the PR ref.hosted-production.yml'stagjob hasneeds: deploy, anddeployitself runs the live smoke check (production.mjs smoke) as its last step before finishing, sotagcannot start until that verification succeeds. - FAIL IF
.config/tend.yamldoes not setmerge: restricted, or anytend-*.yamlpasses anothermerge:: PASS..config/tend.yamlsetsmerge: restricted; everytend-*.yamlthat embeds amerge:key (tend-ci-fix.yaml,tend-mention.yaml,tend-nightly.yaml,tend-notifications.yaml,tend-review-runs.yaml,tend-review.yaml,tend-triage.yaml,tend-weekly.yaml) passesmerge: restricted, none other. - FAIL IF
CHROMATIC_PROJECT_TOKENorARGOS_TOKENis missing fromsecrets.allowedin.config/tend.yaml: PASS..config/tend.yaml'ssecrets.allowedlists exactlyCHROMATIC_PROJECT_TOKENandARGOS_TOKEN. - FAIL IF Renovate's
github-actionsmanager can update.github/workflows/tend-*.yaml: PASS..github/renovate.jsonpackageRuleshas a rule withmatchManagers: ["github-actions"],matchFileNames: [".github/workflows/tend-*.yaml"],enabled: false. - FAIL IF any
tend-*.yamlpinsmax-sixty/tendbelow0.1.19: PASS. Everytend-*.yaml'smax-sixty/tend/[email protected](>= 0.1.19). - FAIL IF any
tend-*.yamlworkflow uses an unpinned action reference: PASS. Alluses:refs intend-*.yamlare tag pins with an explicit version (actions/checkout@v7,astral-sh/[email protected],max-sixty/tend/[email protected]) — none is@mainor bare/unversioned. - FAIL IF
.github/workflows/workflow-audit.yamlstarts deriving its lower bound from anything the pusher controls: PASS.SINCEis read fromgh api .../actions/workflows/workflow-audit.yaml/runs?status=success&per_page=1 --jq '.workflow_runs[0].created_at'(server-set), falling back to25 hours agoonly when no prior successful run exists; no pusher-controlled timestamp (e.g. committer date,--since) is used. - FAIL IF
.github/audit/or.vscode/is outside any consumer ofworkflow-audit.yaml's diff window: PASS.WINDOW=(.github/workflows/ .config/tend.yaml .github/audit/ .vscode/)is the single definition;WINDOW_NON_WORKFLOW=("${WINDOW[@]:1}")is derived from it (not hand-duplicated);COMMITS(git log … -- "${WINDOW[@]}"),own_changes(),is_clean_merge(),is_renovate_pin_bump()'s refusal, andis_tend_regen()'s refusal all referenceWINDOW/WINDOW_NON_WORKFLOWrather than a separately hand-maintained list. - FAIL IF
.github/workflows/workflow-audit.yamlis missing, disabled, or has not produced a successful run in the last 48 hours: PASS.GET .../actions/workflows/workflow-audit.yamlshowsstate: active; the 5 most recent runs are allconclusion: success, most recently2026-09-24T12:41:20Z(within 48h of the audit's run time, 2026-09-25). - FAIL IF
vscode-extension-publishlacks nonempty required reviewers,prevent_self_review: true, orcan_admins_bypass: false: PASS. Environment API showsrequired_reviewers= [nedtwigg, edgartwigg] (nonempty),prevent_self_review: true,can_admins_bypass: false. - FAIL IF
release.ymlis missing thevscode-extension-publishenvironment on the VS Code publish job, orVSCE_PAT/OVSX_PATare referenced from a job not bound to that environment: PASS.publish-vscodejob declaresenvironment: {name: vscode-extension-publish}. Repo-wide grep showsVSCE_PAT/OVSX_PATreferenced only atrelease.yml:347and:359, both inside that same job. - FAIL IF
release.ymluses production desktop signing secrets in CI, or stops generating an ephemeral Tauri updater key for unsigned CI artifacts: PASS.build-standaloneruns "Generate ephemeral Tauri updater key" (tauri signer generate --ci --write-keys … --force) and exports it asTAURI_SIGNING_PRIVATE_KEY; repo-wide grep of.github/workflows/finds no reference toAPPLE_SIGN_PASS,EV_SIGN_PIN, or a non-ephemeralTAURI_SIGNING_PRIVATE_KEY. - FAIL IF
scripts/sign-and-deploy.shstops verifying GitHub artifact attestations, stops verifying SHA-256 manifests, or stops using PIV-backed Windows signing: PASS.verify_downloaded_artifact()callsgh attestation verifywith--cert-identity/--cert-oidc-issuer/--source-ref/--source-digest, andcheck_sha256_manifest()runssha256sum -c/shasum -a 256 -c;sign_windows()callsjsign --storetype PIV. - FAIL IF
TAURI_SIGNING_PRIVATE_KEYis passed on a command line, orEV_SIGN_PINis passed literally tojsign --storepass: PASS.TAURI_SIGNING_PRIVATE_KEYis exported as an env var beforetauri signer sign "$bundle"(never appears as a flag value);jsign --storepass env:EV_SIGN_PINpasses the literal stringenv:EV_SIGN_PIN(an indirection token jsign itself resolves from its environment), not the PIN value.APPLE_SIGN_PASSis passed asxcrun notarytool --password "$APPLE_SIGN_PASS"(argv) — this is the documented, accepted "Known gap" in security-ci.md, not a FAIL IF violation. - FAIL IF
.github/workflows/security-audit.yamlis missing/disabled, or thegh workflow rundispatch /gh run watch --exit-status/publish-vscode'sneeds:edge is gone (security-audit.md release-gate check): PASS.GET .../actions/workflows/security-audit.yamlshowsstate: active.release.yml'ssecurity-auditjob runsgh workflow run "$workflow" … --ref "$tag"thengh run watch "$run_id" … --exit-status;publish-vscodedeclaresneeds: [build-standalone, build-vscode, security-audit]. - FAIL IF a
docs/specs/security*.mdspec is in no domain's scope, in two, or a scope names a nonexistent file (security-audit.md "Domains"): PASS. Manually cross-checked each domain file's**Scope**bullet list against the 7 non-rationaledocs/specs/security*.mdfiles:ci-and-secretsclaimssecurity.md,security-ci.md,security-audit.md;application-securityclaimssecurity-local.md,security-remote.md;hostedclaimssecurity-hosted.md;supply-chainclaimssecurity-supply-chain.md— exactly one claimant each, no orphan, no dangling path.node scripts/spec-lint.mjs(which mechanically enforces this as "check 16") independently confirms:spec-lint: OK (35 specs, 71 files checked). - FAIL IF the audit stops fanning out to dedicated
application-security/hostedsubagents, or either scope is merged into a context also carrying another domain: PASS..github/audit/orchestrator.md§1 spawns exactlysupply-chain,ci-and-secrets,application-security,hostedas four separatesubagent_typeTask calls in one message; each domain file (.github/audit/*.md) has its own single-domain**Scope**block, none combined. - FAIL IF
application-security/hosteddoes not run on a stronger model than the mechanical domains, in bothsecurity-audit.yaml'sclaude_argsandscripts/security-audit-local.sh: PASS.security-audit.yaml'sclaude_argssets--model sonnetas the session default and the--agentsJSON overrides"model":"opus"for exactlyapplication-securityandhosted.scripts/security-audit-local.sh'srun_domain()setsmodel_args="--model sonnet"by default and overrides to--model opusforapplication-security|hostedvia the same case statement. - FAIL IF
.github/audit/is missing a prompt file the workflow names, orsecurity-audit-local.shstops running from those same files: PASS. All six files (_preamble.md,orchestrator.md,supply-chain.md,ci-and-secrets.md,application-security.md,hosted.md) exist;security-audit-local.shloops over exactly this set at startup (for f in _preamble orchestrator supply-chain ci-and-secrets application-security hosted) and errors out if any is missing, thenrun_domain()reads_preamble.md+$domain.mdviacat, matching the workflow's--agentsprompt pointers. - FAIL IF tend regeneration materializes anything except regular
.config/tend.yamland workflow YAML blobs from the audited commit: PASS.is_tend_regen()inworkflow-audit.yaml(lines 268-273) walksgit ls-tree -r "$sha" -- .config/tend.yaml .github/workflows/and returns failure (1) unless every entry's mode is100644or100755(rejecting symlinks/submodules) and every path is exactly.config/tend.yamlor matches.github/workflows/[^/]+\.ya?ml$. - FAIL IF the orchestrator prompt stops requiring a non-turn-ending wait — a Bash
untilloop over the fragments' sentinels, breaking on its own sub-cap, re-issued under a bounded 32-minute deadline persisted to a file: PASS..github/audit/orchestrator.md§2 definesDEADLINE_FILE="$RUNNER_TEMP/audit-deadline"seeded tonow + 1920(32 min) only if absent, anuntil … finished …loop over all four fragment sentinels withCALL_ENDbreaking at 540s so the call always prints an answer, and explicit instructions to re-issue the block verbatim (reading back the sameDEADLINE_FILE) onSTILL WAITING.security-audit.yaml'sBASH_DEFAULT_TIMEOUT_MS: "600000"sets the cap this loop assumes, andtimeout-minutes: 40on the job exceeds the 32-minute wait deadline plus setup overhead. - FAIL IF the prompt permits ending the turn without
audit-report.md: PASS..github/audit/orchestrator.md§4 states verbatim: "Never end your turn whileaudit-report.mddoes not exist... If you have nothing left to wait on, merge §3 with whatever fragments exist and let its markers say the rest." - FAIL IF a domain prompt lets findings be held for a write-up at the end, lets a domain that delegates end its turn or background its wait loop, or the wait/merge/verdict treats existence rather than the sentinel as reported: PASS.
.github/audit/_preamble.mdrequires fragments to be opened before the first check and appended to "as you determine them — never buffered... for one write-up at the end", and requires any delegating domain to "block for your delegates — never end your turn to wait", explicitly forbiddingrun_in_background. Both the orchestrator's wait loop (finished()) and merge step (emit()) test for the literal<!-- END OF REPORT -->sentinel via[ -s "$1" ] && [ "$(... | tail -n1)" = "<!-- END OF REPORT -->" ], not mere file existence. - FAIL IF the orchestrator can report
PASSwhile a subagent left no report fragment, norFAILunless some domain actually returned one: PASS..github/audit/orchestrator.md§4: "write no status file at all" whenever any domain is missing/empty/unreadable/unsentineled, and "PASS requires all four domains to pass";FAILrequires "any subagent returned FAIL" — a real domain verdict.security-audit.yaml's reporting step independently re-derives this from the fragments themselves (MISSING_FRAGMENTS,UNFINISHED,UNREADABLE_VERDICTS,INCONCLUSIVE_DOMAINSloops, none gated on$STATUS) rather than trusting the orchestrator's ownaudit-status.txt, so a prompt failure alone cannot produce a falsePASS. - FAIL IF the
Redact secrets from agent outputstep is removed, stops covering any sink that is later published, or stops failing closed: PASS. The step isif: always(), runs before the artifact-upload and reporting steps, redactsAUDIT_PATandCLAUDE_CODE_OAUTH_TOKENfrom$TRANSCRIPT,audit-report.md, and every file in$AUDIT_FRAGMENTS(all four domain fragments — the identical set named in the job-levelenv:and consumed by the reporting step's guard loops and the artifact upload'spath:), and on any Node error runsrm -f "$TRANSCRIPT" audit-report.md $AUDIT_FRAGMENTS; exit 1— deleting rather than shipping an unredacted sink. - FAIL IF the reporting step writes issue prose per combination of conditions rather than one note per condition that holds: PASS. The
NOTESblock in the "Surface result" step is five independentif [ -n "${VAR:-}" ]blocks (DISSENTING,MISSING_FRAGMENTS,UNREADABLE_VERDICTS,UNFINISHED,INCONCLUSIVE_DOMAINS) plus one forFILE_STATUS = MISSING, each appending its own line independently — no combinatorial branching. - FAIL IF either fragment guard is gated on the status at all: PASS. Both
for f in $AUDIT_FRAGMENTSloops (the missing-fragment check and the sentinel/verdict-line check) run unconditionally, before theSTATUSescalation block; the code comments explicitly note "Both loops now run UNCONDITIONALLY." - FAIL IF the reporting step accepts any domain verdict other than exact
VERDICT: PASSas passing, fails to recognize aVERDICT: FAILprefix as dissent, ignores an inconclusive domain, accepts a fragment with no completion sentinel as finished, or accepts status text other than literalPASS/FAIL: PASS. The verdictcasematches'VERDICT: FAIL'*(prefix, so "FAIL" plus explanation still dissents) intoDISSENTING, only the exact string'VERDICT: PASS'as passing,'VERDICT: INCONCLUSIVE'intoINCONCLUSIVE_DOMAINS, and everything else intoUNREADABLE_VERDICTS; the sentinel test (tail -n1after stripping blank lines) is a separate, unconditional check that flagsUNFINISHEDregardless of the verdict line.FILE_STATUSis parsed withcase "${FILE_STATUS:-}" in PASS|FAIL) ;; *) FILE_STATUS=MISSING ;; esac— only the literal strings pass through. - FAIL IF the step that verifies
AUDIT_PATis provisioned before the audit runs is removed or bypassed: PASS.security-audit.yaml's "Verify AUDIT_PAT is provisioned" step runs after checkout/setup-node/install and before the "Audit against the security specs" step, checks[ -n "$AUDIT_PAT" ], and on failure writesaudit-report.md/audit-status.txtandexit 1(job fails, no audit step runs).
Qualitative findings
Truncated to fit: the full body is 336081 characters. The untruncated audit-report.md is in this run's audit-transcript artifact (download).
- Langage dominant
- TypeScript
- Étoiles
- 5
- Forks
- 1
- Merge moyen
- 16 h 9 min
- PR mergées (30 j)
- 269
Préparer son environnement
Nous n'avons pas encore vérifié les fichiers d'installation de ce projet. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de diffplug/dormouse
-
Bot temporarily unavailableOuvertetend-outage
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
diffplug/dormouse#799 · 16 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
diffplug/dormouse#794 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 40/100
diffplug/dormouse#756 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
diffplug/dormouse#663 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
diffplug/dormouse#651 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de diffplug/dormouse
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
melgarafael/DeskcommCRM#1812 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
prisma/prisma-cli#309 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
gregwebs/pi-quota-dispatcher#26 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
openwatersio/slackwater.xyz#124 ·
Les mainteneurs répondent en général sous 1 jour
-
agent-reported area/browser area/docs documentation good first issue hacktoberfest help wanted P2
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
Les mainteneurs répondent en général sous 2 jours