Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: GSA-TTS/agentic-coding-patterns
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.17.0
Choose a base ref
...
head repository: GSA-TTS/agentic-coding-patterns
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.18.0
Choose a head ref
  • 8 commits
  • 45 files changed
  • 5 contributors

Commits on Oct 23, 2026

  1. fix(opencode): allow five-minute stream idle gaps (#533)

    ## Summary
    Raise the OpenCode kit OpenAI-compatible adapter SSE idle timeout from
    120000 to 300000 ms, retaining the separate 600000 ms total request
    limit. Add fresh-install, renderer-owned upgrade, historical legacy
    migration, and repeated-render regression coverage. Document the
    distinction and longer stalled-stream detection time.
    
    ## Motivation and live evidence
    Repeated Astra report-generation attempts under OpenCode 1.18.32 failed
    with `SSE read timed out` approximately 120.5–120.7 seconds after stream
    start. After applying 300000 ms and refreshing/reloading the runtime,
    the previously stalled agent completed its report without another
    observed SSE timeout. One separate upstream connection-termination error
    before headers was observed.
    
    This is supporting live evidence, not a controlled causal proof or a
    live OpenCode v2 test. Independent source review confirmed that the
    kit-pinned v2.0.30 supports the same settings (SSE event idle timeout
    versus total deadline).
    
    ## Plan and related work
    Based on current main including #530.
    That epic increment moved config ownership into the OpenCode kit
    renderer, so the change belongs there rather than in the retired USAi
    config template.
    
    Refs: #357. Checked open
    #495: its catalog/default-emitter work
    does not touch these files. Historical production fixture and legacy
    ownership fingerprint remain unchanged.
    
    ## Eligibility & Accountability
    Human author of record to confirm before marking ready:
    - [ ] Federal employee or contractor eligibility attested.
    - [ ] Understands and accepts accountability for the change.
    - [ ] Attests right to release under CC0-1.0.
    
    ## AI Assistance Disclosure
    - [x] AI-assisted: OpenCode (gpt-6-astra) implemented and verified the
    change; separate OpenCode (gpt-5.6-terra) adversarial review returned no
    blockers, including a final delta review.
    - [ ] Independent human review completed.
    
    ## Type of Change
    - [x] Bug fix
    - [x] Documentation update
    
    ## Testing / verification transcript
    Observed in the development sandbox on 2026-10-23 UTC:
    
    | Check | Result |
    | --- | --- |
    | Targeted regression before implementation | Failed as expected: old
    120000 value |
    | `make validate` | PASS: 47/47; existing advisory
    documentation/allowlist warnings |
    | `make validate-kits` | PASS: 11 kits + 2 templates |
    | `make validate-provider-input-contract` | PASS: 3 bundles |
    | `make test-kits` | PASS: 57 OpenCode + 14 USAi kit + 20 Paseo + 103
    catalog/emitter tests |
    | `make test` | PASS: 667 tests, 140.53 seconds; initial 120-second tool
    deadline was insufficient |
    | `node --check` on changed JavaScript files | PASS |
    | Direct Markdown library lint of README | PASS: 1 file, 0 errors
    (default rules with MD013 disabled); normal CLI selection excludes kit
    README |
    | `git diff --check` | PASS |
    | Full diff review for secrets | PASS; no secret values added |
    | `pre-commit run --files ...` | BLOCKED during hook environment setup:
    pip CA bundle raised X509 NO_CERTIFICATE_OR_CRL_FOUND |
    
    Initial new test incorrectly required byte-identical repeated output;
    existing renderer changes key ordering, so the final test checks parsed
    semantic equality while asserting both timeout values. Full kit suite
    then passed. No hook or CI bypass was used. No dependency changes; no
    separate compilation step applies. CI lint/security checks remain
    required before readiness/merge.
    
    ## Safety Checklist
    - [x] No secret values, PII, CUI, customer data, or internal endpoints
    added.
    - [x] No auth, permission, credential, egress, or ownership-policy
    changes.
    - [x] Neutral provider input contract unchanged.
    - [x] Existing tests retain fail-closed ownership protections.
    
    ## Security impact and rollback
    Availability tradeoff: genuinely silent streams can take three
    additional minutes to fail; the ten-minute total request bound remains.
    Revert this commit to restore the two-minute idle limit, rerender
    config, and reload the runtime.
    
    ## Reviewer notes
    Draft pending CI and human review. Existing renderer/test files exceed
    the file-size guideline (812/870 lines); the production behavior change
    is one value plus explanatory comments, with no architectural refactor.
    New test is under 50 lines. Confirm timeout behavior on the kit-pinned
    runtime when performing live deployment verification.
    mogul authored Oct 23, 2026
    Configuration menu
    Copy the full SHA
    9fe6440 View commit details
    Browse the repository at this point in the history
  2. fix(paseo-kit): improve startup readiness and CLI discovery (#535)

    ## Summary
    
    Improve Paseo kit startup diagnostics, UI artifact lookup, guest CLI
    discovery, and cold-start root initialization while preserving exact UI
    readiness checks and genuine restart recovery.
    
    ### Approved plan / changes
    - Opt-in `PASEO_KIT_TIMING=1` fixed-label, numeric guest-uptime records;
    an environment-only diagnostic overlay enables startup and attach
    together. Normal kit consumers remain uninstrumented. A dedicated timing
    log avoids collecting daemon output.
    - Resolve the installed CLI/server package for the exact Brotli artifact
    before the compatibility filesystem search. Prefer the per-user
    installation even when absent from inherited PATH; preserve exact byte
    comparison.
    - Publish a managed `~/.local/bin/paseo` symlink on startup/resume.
    Preserve foreign destinations; repair only links matching the kit's
    target receipt.
    - Before npm work, optionally seed an absent config from physical guest
    `ACQ_WORKSPACE` through the existing config lock. Initialize-only never
    overwrites an existing config entry. Existing attach/root-change restart
    behavior remains; cold initialization is opportunistic, with no
    launch-ownership claim.
    - Run the existing health stage on both root-result paths, followed by
    unchanged UI validation: 30 health attempts, initial UI probe plus 60
    retries, existing sleeps/predicates. Detached exit zero remains distinct
    from readiness success.
    
    Lifecycle rationale:
    `integrations/isolation/acq-kits/paseo/docs/decisions/supervisor-owns-daemon-wrapper-pins-worktrees.md`.
    
    ## Eligibility & Accountability
    
    Human attestations remain for the author of record:
    - [ ] I am a federal employee or contractor.
    - [ ] I understand this change and can explain it in my own words.
    - [ ] I attest I have the right to release this work under CC0-1.0.
    
    ## AI Assistance Disclosure
    
    - [x] OpenCode AI assisted investigation, implementation, tests,
    documentation, and PR preparation. The human approved each lifecycle
    scope and performed real host validation.
    - [x] A separate adversarial AI review covered the entire accumulated PR
    and the upstream integration; reported blockers were resolved and
    re-reviewed clean before push.
    - [ ] Independent human code review completed. Required before merge;
    not claimed here.
    
    ## Type of Change
    
    - [x] Bug fix
    - [x] Enhancement to existing integration
    - [x] Documentation update
    
    ## Motivation and observed host evidence
    
    User-run MSB measurements used the local kit and sanitized fixed-format
    timing collection. Quickstart probe changes and ignored local artifacts
    are not included in this PR.
    
    | Observation | Evidence / limitation |
    |---|---|
    | Artifact lookup | 4.850s before the fast path; 0.010s in the isolated
    artifact-only comparison, later below the 0.01s clock resolution. Exact
    UI checks passed. This supports a lookup-stage improvement, not a
    total-startup claim. |
    | CLI availability | Bare nonlogin exec, login Bash, and interactive
    Bash resolved the public link to the kit CLI and reported 0.12.0.
    Visibility persisted after warm restart. Warm daemon readiness and
    skipped Paseo installation were not proven by those commands. |
    | Failed intermediate seed-only run | Root was unchanged and no restart
    occurred, but installation took 67.70s. Skipping the old restart branch
    also skipped its health allowance: UI polling exhausted before daemon
    launch. Exit zero was **not** a readiness pass. |
    | Corrected final run, 2026-10-23 19:05 UTC | `root_unchanged`; no
    restart/fallback markers; health wait 6.03–33.40s succeeded; every UI
    check succeeded, `ui_wait_end rc=0` at 33.54s. Install 26.96s, config
    2.27s, launch-to-health 2.66s, full UI stage 0.14s. |
    
    The corrected run verifies the two-stage control flow; it does not
    replay the earlier 67-second install workload. Its total was 96.496s,
    including 38.901s pre-create activity with prompts, so it is not a
    comparable total-speed result. Installation variability remains
    unexplained. A separate earlier run that still showed fallback is not
    conflated with the final verified run.
    
    **Revision boundary:** these live observations cover the completed
    59-test implementation before incorporating latest main. This branch now
    builds on `a1206c5`, preserving upstream pre-boot lock reconciliation
    from #488. Its isolated test entry
    remains before timing/seed initialization. The combined tree passed
    local tests and fresh adversarial review; it has not had another real
    MSB host run. Narrow quoting/JS-output adjustments make the upstream
    section ShellCheck-clean without changing its output.
    
    Paseo remains pinned to 0.12.0. Initial comparisons confirmed the old
    pinned kit source and initial worktree base matched before
    instrumentation.
    
    ## Testing / verification transcript
    
    - [x] `make test` — **667 passed** on the upstream-integrated tree.
    - [x] `TMPDIR=/tmp/opencode node --test
    'integrations/isolation/acq-kits/paseo/tests/*.test.mjs'` — **63
    passed**, including 59 implementation tests and 4 upstream
    reconciliation tests; rerun after final lint adjustments.
    - [x] `make validate validate-kits scan-shell generate-check` — all
    validators passed; 11 kits + 2 templates valid; unsafe-shell scan 0
    errors/0 warnings; INDEX.yaml and CATALOG.md current. Existing unrelated
    documentation/network advisory warnings remain.
    - [x] `shellcheck -x -P integrations/isolation/acq-kits/paseo/files/home
    -s sh` on startup, shim, and timing helper — clean after final
    adjustments.
    - [x] `sh -n` on startup/shim; `node --check` on root helper; `git diff
    --cached --check` — passed.
    - [x] Explicit Python `jsonschema.validate` of the nested timing overlay
    against `schemas/kit-hybrid-v1.schema.json` — passed. The standard kit
    scanner does not discover the nested overlay.
    - [x] Sensitive-term validation plus staged-diff
    secret/token/password/private-key pattern review — no credentials found
    in added content. Gitleaks and shfmt were unavailable; no independent
    Gitleaks scan or formatter pass claimed.
    - [x] Real host scenarios above, performed by the human; no MSB service
    was run in the coding sandbox.
    
    Tests cover opt-in gating/labels, phase ordering/status, nested/hoisted
    and off-PATH package layouts, large truncated bundles, link ownership
    and failure handling, version-match startup, locked initialization
    orderings, invalid homes/config entries, and exhausted readiness budgets
    versus exit status.
    
    ## Safety and security impact
    
    - [x] No secrets, real PII/CUI, customer data, internal endpoints, or
    host project paths added.
    - [x] No new dependencies, version changes, listener/port/egress policy
    changes, or authentication changes.
    - [x] Timing contains fixed labels and numeric fields only; collection
    still must allowlist complete records. No raw environment, command
    arguments, or daemon output is retained by instrumentation.
    - [x] Exact UI checks and real failure fallback are preserved.
    Cooperative config locking is retained; no claim of exclusive control
    over manual launchers.
    
    ## Rollback
    
    Revert this PR and reapply/recreate the sandbox with the previous kit.
    Omit the diagnostic overlay to disable timing immediately. Existing
    guest logs, seeded config, and a managed CLI symlink are persistent
    guest state; reverting source does not erase them. Recreating a
    disposable guest restores the prior lifecycle without deleting user
    project data. Do not remove unrelated CLI links or reset existing
    worktree settings automatically.
    
    ## Reviewer notes
    
    - Code-owner review and CI remain required; neither human approval nor
    completed CI is claimed.
    - Startup is now about 507 lines after integration of upstream
    reconciliation (already a large inline function); `ui_ready` slightly
    exceeds the 50-line guideline. Kept the lifecycle in its existing file
    and exact predicate together to avoid an unrelated refactor during this
    measured change.
    - INDEX covers patterns; no pattern inventory change was needed.
    - No related issue is claimed closed.
    #488 is an already-integrated
    prerequisite, not work implemented here.
    mogul authored Oct 23, 2026
    Configuration menu
    Copy the full SHA
    3fcab2d View commit details
    Browse the repository at this point in the history

Commits on Oct 25, 2026

  1. fix(paseo): bump pinned CLI to 0.13.0 (#536)

    ## Context
    
    Updates the opt-in Paseo acq kit to install and match `@getpaseo/cli`
    version `0.13.0`. Paseo 0.13 changed `paseo daemon status --json` to
    report a direct `"localDaemon": "running"` value, so the kit verifier
    now accepts that format.
    
    ## Plan
    
    - Update both runtime version pins.
    - Align warm-resume fixture versions with the new pin.
    - Extend the live verifier for the Paseo 0.13 daemon-status response.
    - Add regression coverage for accepted and rejected status shapes.
    
    ## Verification
    
    | Command | Result |
    | --- | --- |
    | `node --test 'tests/**/*.test.mjs'` in
    `integrations/isolation/acq-kits/paseo` | Passed: 65 tests |\n| `bash -n
    scripts/verify` | Passed |\n| `python3
    integrations/isolation/acq-kits/validate-kits.py --strict` | Passed: 11
    kits and 2 templates |\n| `make validate` | Passed; existing advisory
    sensitive-term and allowlist warnings only |\n| `make test` | Passed:
    667 tests |\n| `git diff --check` | Passed |\n| Independent adversarial
    review | No blockers found |\n| `RUN_ACQ=1 ./scripts/verify` | Passed
    end-to-end against Paseo 0.13: all checks passed, including step 5a
    local CLI discovery, host-port delivery, daemon self-healing, and
    project registration. The local offline schema subcheck skipped because
    the host Python environment lacks `jsonschema` and `pyyaml`. |\n\n##
    Rollback\n\nRevert commits `6f45a12` and `2513386` to restore the prior
    `0.12.0` pin and status parser.\n\n## Security Impact\n\nNo
    authentication, authorization, data-handling, or attack-surface change.
    This updates the pinned upstream CLI package and its verifier
    compatibility only.\n\n## AI Assistance\n\nOpenCode, an AI coding agent,
    prepared this change. A human reviewer must review and approve before
    merge.
    
    ---------
    
    Co-authored-by: OpenCode Agent <[email protected]>
    mogul and OpenCode Agent authored Oct 25, 2026
    Configuration menu
    Copy the full SHA
    a290d5d View commit details
    Browse the repository at this point in the history

Commits on Oct 26, 2026

  1. feat(opencode): carry reasoning and input-modality metadata in the ne…

    …utral catalog (#542)
    
    ## Summary
    
    Carries `reasoning` and input-modality metadata through the USAi
    catalog, the neutral model catalog (`acq-neutral-model-catalog/v1`,
    additive optional fields), and the OpenCode kit's rendered provider
    config. Unknown stays absent; `false` and text-only are preserved;
    nothing is inferred from model names. Builder emission from models.dev
    is opt-in (`--include-capabilities`) and **no capability values are
    committed** until a live verification is recorded. Prime Agent work is
    out of scope.
    
    Refs #366 (follow-ups
    #539,
    #540,
    #541).
    
    ## Context
    
    OpenCode 1.x (v1.18.35): a config-defined model with no `modalities`
    resolves to image=false. The kit's old fallback (`npm install -g
    opencode-ai`) resolved to 1.x. OpenCode 2.0.30 defaults an unlisted
    model to text+image. Explicit modalities make behavior
    version-independent. A live run (OpenCode 2.0.30, 24 USAi models, no
    modality metadata) found 20 of 24 read a synthetic image (9 exact, 11
    with misread characters), 1 refused on policy grounds, 3 unavailable or
    unusable; an explicit `["text"]` override made the two retested models
    refuse images. Single samples: these are not a root-cause claim for the
    reported failure, and no values are committed from them. See ADR 0006.
    
    ## Changes
    
    - Builder (`integrations/providers/usai/scripts/build-catalog.mjs`):
    opt-in capability enrichment; malformed upstream entries warn and are
    treated as unknown.
    - Schemas: additive optional model fields in the USAi and neutral
    schemas (no version bump; old renderers ignore unknown model keys, old
    validators reject them, which is documented as a rollout requirement).
    - Normalizer and OpenCode renderer: validated, fail-closed translation;
    renderer emits no effort or variants.
    - ADR 0006 (proposed), synthetic-image validation procedure, README
    updates.
    - Tests: source-to-render fixtures, allowlist-equality, guard against
    committed unverified capabilities in the catalog, shipped snapshot and
    schema fixtures.
    
    ## Verification
    
    - `node --test`: providers/usai 120+, opencode kit 62, usai-provider kit
    18 (all pass).
    - `pytest scripts/tests/test_provider_input_contract.py`: 204 passed.
    - `make validate`, `make generate-check`: pass.
    - Independent adversarial review: no blockers; 3 majors and minors fixed
    and re-reviewed.
    
    ## Rollback
    
    Revert this PR; the committed catalog and snapshots carry no capability
    fields, so nothing else depends on it.
    
    ## Security impact
    
    No auth, credential, or network changes. The renderer fails closed on
    out-of-allowlist modalities or non-boolean `reasoning`. AI-assisted
    (OpenCode); human review required. ADR 0006 needs CODEOWNERS review per
    ADR 0004.
    
    Co-authored-by: OpenCode Agent <[email protected]>
    mogul authored Oct 26, 2026
    Configuration menu
    Copy the full SHA
    918e46d View commit details
    Browse the repository at this point in the history
  2. feat(kits): run oci-engine root startup scripts from the read-only ho…

    …st mount (#543)
    
    ## Summary
    
    Lets a Quickstart MSB consumer run the oci-engine kit's root startup
    scripts from a host-authoritative read-only mount instead of
    agent-writable copies (the Patterns side of audit finding G3 under
    GSA-TTS/agentic-coding-quickstart#503). The oci-engine grant script and
    storage-driver helper are marked `readonly: true` and passed to the root
    startup command as whole argv tokens.
    
    ## Context
    
    A sudo guest can edit the guest-resident files that root re-runs on
    every MSB heal. Quickstart's read-only mount mechanism
    (`_acq_msb_stage_readonly_file`, present from v4.0.2) rewrites exact
    argv tokens to `/var/lib/acq/host/kit-files/...` for kits that opt in,
    but no shipped kit did. Pairs with the MSB host-recorded `:ro` decision
    in [Quickstart PR
    #637](GSA-TTS/agentic-coding-quickstart#637),
    which removes the guest probe from that decision. If the host fails to
    stage one of the two files, the pair is mixed and is refused for that
    boot.
    
    ## Changes
    
    - `oci-engine`: `readonly: true` on the grant script and storage helper.
    The root startup command classifies its two tokens together. **Both
    under `/var/lib/acq/host/kit-files/`** (no `..`): run those files, or
    refuse (stderr error, exit 1) if either is missing; it never falls back
    to the root-owned copy. **Both `/home/agent/*`:** the legacy case for a
    consumer that ignores the flag; it uses the root-owned copy published at
    create time, as before. **Anything else, including a mixed pair:**
    refuse. The grant script re-validates the helper it sources as root and
    refuses a missing selected mount helper. A refusal costs only that
    boot's device grant and storage re-evaluation; Quickstart reports a
    failing startup command as a warning and continues.
    - `readonly` registered in `schemas/kit-hybrid-v1.schema.json`;
    `validate-kits.py` rejects any value but the literal `true`/`false` and
    flow-style `command:` lists (the consumer's line-based reader ignores or
    drops them).
    - `zscaler-ca-certificate` and `opendesign` are intentionally not marked
    (reasons in their READMEs): the zscaler cert is staged at start with no
    create-time root-owned copy to fall back to, and opendesign's only root
    command is an inline `mkdir`/`chown`.
    - Loud warnings and `scripts/verify` cover "neither the mount copy nor a
    published copy exists"; the install phase's trust in `/home/agent` at
    create time is documented.
    
    ## Verification
    
    - Full `scripts/tests` (715 passed), `validate-kits --strict`, `make
    validate`, `make generate-check`, markdownlint on the changed docs.
    - Offline tests run the real startup body, grant script and install
    script against a temp tree: missing mount grant, missing mount helper,
    legacy fallback, mixed and traversal cases. Mutation checks (falling
    back on a missing mount file, allowing a mixed pair, removing the `..`
    check, a refusal that exits 0, the grant script accepting `/home/agent`)
    each fail a test.
    - Two independent adversarial reviews, then a third round after an
    external review. Not run: `make ci`, shellcheck, any live msb/sbx
    sandbox.
    
    ## Rollout
    
    Needs a Patterns release and a `PATTERNS_KIT_REF` pin bump in
    Quickstart. Older Quickstart releases (v4.0.0 to v4.0.2) and sbx ignore
    the flag and use the root-owned fallback, so nothing regresses there.
    Live MSB check after the bump: argv carries
    `/var/lib/acq/host/kit-files/...`, no scripts remain in `/home/agent`,
    device grants and storage driver still apply, a write to the mount fails
    (EROFS), and an older sandbox with no `:ro` mount takes the fallback
    with the warning. Also confirm storage is configured before first use
    now that install no longer seeds `storage.conf` when the flag is
    honored.
    
    ## Rollback
    
    Revert this PR.
    
    ## Security impact
    
    Removes a path where root could execute a guest-writable or create-time
    copy after the backend had selected the read-only mount. Residual: the
    install step still trusts `/home/agent` at create time, the root-owned
    legacy copies are guest-tamperable under `sudo` (so the legacy path is
    not tamper-resistant, unchanged from before), and the read-only property
    depends on the backend's mount enforcement. AI-assisted (OpenCode);
    human review required.
    
    Co-authored-by: OpenCode Agent <[email protected]>
    mogul authored Oct 26, 2026
    Configuration menu
    Copy the full SHA
    94f807a View commit details
    Browse the repository at this point in the history
  3. chore(ci): Bump zizmorcore/zizmor-action from 0.6.4 to 0.7.1 (#544)

    Bumps
    [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action)
    from 0.6.4 to 0.7.1.
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a
    href="https://github.com/zizmorcore/zizmor-action/releases">zizmorcore/zizmor-action's
    releases</a>.</em></p>
    <blockquote>
    <h2>v0.7.1</h2>
    <h1>zizmor changes</h1>
    <h2>Bug Fixes 🐛🔗</h2>
    <ul>
    <li>Fixed a regression in 1.31.0 where some ignore
    comments/configurations would no longer apply to the dangerous-triggers
    audit</li>
    </ul>
    <h1>action changes</h1>
    <p>The default version of zizmor is now 1.31.1.</p>
    <h2>What's Changed</h2>
    <ul>
    <li>Sync zizmor versions by <a
    href="https://github.com/github-actions"><code>@​github-actions</code></a>[bot]
    in <a
    href="https://redirect.github.com/zizmorcore/zizmor-action/pull/178">zizmorcore/zizmor-action#178</a></li>
    </ul>
    <p><strong>Full Changelog</strong>: <a
    href="https://github.com/zizmorcore/zizmor-action/compare/v0.7.0...v0.7.1">https://github.com/zizmorcore/zizmor-action/compare/v0.7.0...v0.7.1</a></p>
    <h2>v0.7.0</h2>
    <p><a href="https://github.com/sponsors/woodruffw/">Sponsorship is
    appreciated!</a></p>
    <h1>zizmor notes</h1>
    <h2>Enhancements 🌱<a
    href="https://docs.zizmor.sh/release-notes/#enhancements">🔗</a></h2>
    <ul>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#typosquat-uses">typosquat-uses</a>
    audit now supports pre-commit config inputs (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2437">#2437</a>)</p>
    </li>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#self-hosted-runner">self-hosted-runner</a>
    audit is now significantly more precise (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2350">#2350</a>)</p>
    <p>Many thanks to <a
    href="https://github.com/ubiratansoares"><code>@​ubiratansoares</code></a>
    for proposing and implementing this enhancement!</p>
    </li>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#dangerous-triggers">dangerous-triggers</a>
    audit now considers the issue_comment trigger fundamentally dangerous
    (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2396">#2396</a>)</p>
    </li>
    <li>
    <p>zizmor is now aware of the image_version workflow trigger (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2397">#2397</a>)</p>
    </li>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#dangerous-triggers">dangerous-triggers</a>
    audit now produces more precise finding/diagnostic spans (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2402">#2402</a>)</p>
    </li>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#cache-poisoning">cache-poisoning</a>
    audit is now aware of <a
    href="https://github.com/pnpm/setup">pnpm/setup</a> (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2409">#2409</a>)</p>
    </li>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#unpinned-images">unpinned-images</a>
    audit now produces more precise findings when the user's workflow
    contains an indirect matrix (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2395">#2395</a>)</p>
    <p>Many thanks to <a
    href="https://github.com/ubiratansoares"><code>@​ubiratansoares</code></a>
    for proposing and implementing this enhancement!</p>
    </li>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#cache-poisoning">cache-poisoning</a>
    audit is now aware of GitHub's new cache-mode: setting, and will skip
    any findings that would occur when a job has an effective cache-mode:
    none (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2418">#2418</a>)</p>
    </li>
    <li>
    <p>The <a
    href="https://docs.zizmor.sh/audits/#cache-poisoning">cache-poisoning</a>
    audit now flags usages of cache-mode: write and cache-mode: write-only
    with dangerous triggers, i.e. triggers that give an attacker privileged
    code execution (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2426">#2426</a>)</p>
    </li>
    <li>
    <p>zizmor now uses a tree-sitter grammar for PowerShell that's more
    precise/capable of capturing more non-trivial PowerShell expressions (<a
    href="https://redirect.github.com/zizmorcore/zizmor/issues/2444">#2444</a>)</p>
    </li>
    </ul>
    <h2>Bug Fixes 🐛<a
    href="https://docs.zizmor.sh/release-notes/#bug-fixes">🔗</a></h2>
    <!-- raw HTML omitted -->
    </blockquote>
    <p>... (truncated)</p>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/85b2b9fb8e3325e7a23d7d0a9d7ba5ae0f999e3e"><code>85b2b9f</code></a>
    Sync zizmor versions (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/178">#178</a>)</li>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/38c745a43764dcc8bcfd364e8295870e252e957c"><code>38c745a</code></a>
    README: bump pins (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/177">#177</a>)</li>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/f9597c869b2e67095f9b527070297a13a6efe928"><code>f9597c8</code></a>
    Sync zizmor versions (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/175">#175</a>)</li>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/2181e51ed8d58b9304e4a561374bb36d5599af3a"><code>2181e51</code></a>
    Bump sync-zizmor-versions.py to Python 3.11 for locking (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/174">#174</a>)</li>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/27d989be9329e6cff7f80baf450ca83bf4c94898"><code>27d989b</code></a>
    chore(deps): bump the github-actions group with 2 updates (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/173">#173</a>)</li>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/a91218c45134530ecc7aefc3eec3f997a279ad37"><code>a91218c</code></a>
    Bootstrap zizmor without Docker (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/169">#169</a>)</li>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/ee3f1bf153a9caa7d162d7324ef8314ec3f91862"><code>ee3f1bf</code></a>
    chore(deps): bump the github-actions group with 2 updates (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/170">#170</a>)</li>
    <li><a
    href="https://github.com/zizmorcore/zizmor-action/commit/8eacaa5f3f72b6638f4f87c3f66113bbc0f363dd"><code>8eacaa5</code></a>
    README: bump pins (<a
    href="https://redirect.github.com/zizmorcore/zizmor-action/issues/167">#167</a>)</li>
    <li>See full diff in <a
    href="https://github.com/zizmorcore/zizmor-action/compare/cc914d7f3750a2d13d75c7f184a1060aa0e9d482...85b2b9fb8e3325e7a23d7d0a9d7ba5ae0f999e3e">compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=zizmorcore/zizmor-action&package-manager=github_actions&previous-version=0.6.4&new-version=0.7.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
    
    Dependabot will resolve any conflicts with this PR as long as you don't
    alter it yourself. You can also trigger a rebase manually by commenting
    `@dependabot rebase`.
    
    [//]: # (dependabot-automerge-start)
    [//]: # (dependabot-automerge-end)
    
    ---
    
    <details>
    <summary>Dependabot commands and options</summary>
    <br />
    
    You can trigger Dependabot actions by commenting on this PR:
    - `@dependabot rebase` will rebase this PR
    - `@dependabot recreate` will recreate this PR, overwriting any edits
    that have been made to it
    - `@dependabot show <dependency name> ignore conditions` will show all
    of the ignore conditions of the specified dependency
    - `@dependabot ignore this major version` will close this PR and stop
    Dependabot creating any more for this major version (unless you reopen
    the PR or upgrade to it yourself)
    - `@dependabot ignore this minor version` will close this PR and stop
    Dependabot creating any more for this minor version (unless you reopen
    the PR or upgrade to it yourself)
    - `@dependabot ignore this dependency` will close this PR and stop
    Dependabot creating any more for this dependency (unless you reopen the
    PR or upgrade to it yourself)
    
    
    </details>
    
    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Oct 26, 2026
    Configuration menu
    Copy the full SHA
    78154ec View commit details
    Browse the repository at this point in the history

Commits on Oct 28, 2026

  1. fix(devenv-image): take devenv 2.4.0 from a pinned nixos-unstable rev (…

    …#550)
    
    ## Summary
    
    The devenv image now installs devenv 2.4.0 from a pinned
    `nixos-unstable` rev (`DEVENV_NIXPKGS_REV`), while direnv stays on the
    existing nixos-26.05 pin (`NIXPKGS_REV`). This fixes devenv 2.1.2
    ignoring the signing keys of a repo's `cachix.pull` caches, which forces
    source builds that sandbox egress blocks. `VERSION` goes to `2.1.0`.
    
    ## Eligibility & Accountability
    
    - [x] I am a **federal employee or contractor** (PRs merge with
    `@GSA-TTS/agentic-coding-team` code-owner approval; eligibility is
    attested here, not authenticated). *Anyone may open issues without
    this.*
    - [x] **I understand this change and can explain it in my own words** —
    I am the author of record and accountable for it.
    - [x] By opening this PR, I **attest I have the right to release this
    work** under the repository's [CC0-1.0](../LICENSE) dedication.
    
    ## AI Assistance Disclosure
    
    - [x] AI tools were used in this contribution
    - [x] I verified all AI-generated content: no fabricated/hallucinated
    APIs, dependencies, citations, or placeholder content; any AI-suggested
    dependency was confirmed to exist.
    - [x] Any inherited/reused third-party material retains its original
    license and is identified (not represented as public domain).
    
    ## Type of Change
    
    - [x] Bug fix
    - [x] Infrastructure/tooling change
    
    ## Motivation
    
    `devenv-shell:2.0.0` and `devenv-opencode:2.0.0` ship devenv 2.1.2,
    which has
    [cachix/devenv#3176](cachix/devenv#3176): it
    passes an empty `extra-trusted-public-keys`, so Nix ignores every
    substitute from `devenv.cachix.org` (the `devenv-nixpkgs/rolling`
    default) and other cachix caches. In a sandbox the resulting source
    builds fail with `403` from source mirrors that aren't on the egress
    allowlist; 3 of 5 login.gov repos failed this way on `2.0.0` and all
    build on `1.0.0`.
    [cachix/devenv#3178](cachix/devenv#3178) fixed
    it in devenv 2.3.1, but `release-26.05` still packages 2.1.2.
    
    ## Changes
    
    - `Dockerfile`: new `ARG
    DEVENV_NIXPKGS_REV=31ecbaca1bdefa45dffc409f0250bd8039ea0010`, used only
    for `#devenv`; direnv keeps `NIXPKGS_REV`. The comment records why, that
    both revs are signed by the `cache.nixos.org` key the image already
    trusts, and to drop the second pin once the stable branch packages
    devenv ≥ 2.3.1.
    - `VERSION`: `2.0.0` → `2.1.0` (devenv stays 2.x, so this is a minor
    bump under the image contract).
    - `README.md`: documents the second pin, advises against `2.0.0`, and
    lists `DEVENV_NIXPKGS_REV` among the toolchain changes that need a
    `VERSION` bump.
    
    Kits that pin tools to `NIXPKGS_REV` to share the image's closures are
    unaffected; only devenv's closure comes from the second rev.
    
    ## Testing
    
    - [x] Ran `make validate` locally (all checks pass)
    - [ ] Ran `make test` (if applicable)
    - [x] Tested with at least one real scenario
    - [x] Commit messages follow [Conventional
    Commits](https://www.conventionalcommits.org/) format
    
    Acceptance criteria from the issue, checked against a
    `workflow_dispatch` build of this branch ([run
    40781422183](https://github.com/GSA-TTS/agentic-coding-patterns/actions/runs/40781422183),
    which built all four variant/arch images by digest without publishing
    tags) and an msb sandbox on the arm64 `devenv-shell` digest:
    
    - [x] `devenv version` in the image reports ≥ 2.3.1 on amd64 and arm64.
    arm64: `devenv 2.4.0 (aarch64-linux)` in the sandbox. amd64: the build
    log installs `/nix/store/yqm4mhvx…-devenv-2.4.0`; `devenv version`
    itself was not run on amd64.
    - [x] devenv is substituted from `cache.nixos.org` on both architectures
    (no source build in the CI log). All four jobs log `copying path
    '…-devenv-2.4.0' from 'https://cache.nixos.org'` and no `building`
    lines.
    - [x] In a sandbox on the new image, a repo that pulls from
    `devenv.cachix.org` builds its shell with no "ignoring substitute"
    warnings. identity-idp (which downloads many `devenv.cachix.org` NARs)
    and data-transformation (which uses `nixpkgs-python.cachix.org`) both
    build; neither of them, nor identity-devops, logs an "ignoring
    substitute" warning.
    
    Also verified:
    
    - `pkgs/by-name/de/devenv/package.nix` at `31ecbaca` declares `version =
    "2.4.0"`.
    - `31ecbaca` was the `nixos-unstable` branch head when this PR was
    opened, so it passed the Hydra channel gate.
    
    Known remaining failure, separate from this fix and not a regression:
    identity-devops fails on arm64 on both this image and
    `devenv-shell:1.0.0` (devenv 1.11.2), at the same `bash53-001` source
    fetch. Its lock pins `devenv` and `devenv-nixpkgs` commits from December
    2025, and `devenv-tasks-2.0.0` and `python3-3.12.12` for aarch64-linux
    at those revs are in none of `cache.nixos.org`, `devenv.cachix.org` or
    `nixpkgs-python.cachix.org`. Building them pulls in source fetches from
    `ftpmirror.gnu.org`, which egress blocks. The image trusts and
    substitutes every path that is cached; a `devenv update` in that repo is
    the likely fix.
    
    ## Safety Checklist
    
    - [x] No secrets, API keys, tokens, or passwords included
    - [x] No PII (names, emails, SSNs, addresses)
    - [x] No CUI (Controlled Unclassified Information)
    - [x] No internal URLs, hostnames, or system paths
    - [x] No customer data or proprietary information
    
    ## Validation Results
    
    ```
    make validate
    ✓ All validators passed
    ```
    
    ## Related Issues
    
    Closes #549
    
    ## Additional Context
    
    Alternatives considered in the issue: backporting devenv ≥ 2.3.1 to
    `release-26.05` (fixes it at the source, but the timing is outside this
    repo's control; worth requesting in parallel), baking cachix keys into
    `nix.conf` (hard-codes keys for caches that individual repos choose),
    and kit-side workarounds (fixes one consumer at a time).
    basiliskus authored Oct 28, 2026
    Configuration menu
    Copy the full SHA
    ae0a921 View commit details
    Browse the repository at this point in the history

Commits on Oct 29, 2026

  1. chore(main): release 1.18.0 (#534)

    🤖 I have created a release *beep* *boop*
    ---
    
    
    ##
    [1.18.0](v1.17.0...v1.18.0)
    (2026-10-28)
    
    
    ### Features
    
    * **kits:** run oci-engine root startup scripts from the read-only host
    mount
    ([#543](#543))
    ([94f807a](94f807a))
    * **opencode:** carry reasoning and input-modality metadata in the
    neutral catalog
    ([#542](#542))
    ([918e46d](918e46d))
    
    
    ### Bug Fixes
    
    * **devenv-image:** take devenv 2.4.0 from a pinned nixos-unstable rev
    ([#550](#550))
    ([ae0a921](ae0a921))
    * **opencode:** allow five-minute stream idle gaps
    ([#533](#533))
    ([9fe6440](9fe6440))
    * **paseo-kit:** improve startup readiness and CLI discovery
    ([#535](#535))
    ([3fcab2d](3fcab2d))
    * **paseo:** bump pinned CLI to 0.13.0
    ([#536](#536))
    ([a290d5d](a290d5d))
    
    ---
    This PR was generated with [Release
    Please](https://github.com/googleapis/release-please). See
    [documentation](https://github.com/googleapis/release-please#release-please).
    
    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
    github-actions[bot] authored Oct 29, 2026
    Configuration menu
    Copy the full SHA
    7dd2ddc View commit details
    Browse the repository at this point in the history
Loading