Skip to content

fix(ci): refuse a committed .claude/settings.local.json in sandbox-lint - #1692

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:fix/sandbox-lint-refuse-committed-local
Oct 17, 2026
Merged

potiuk merged 1 commit into
apache:mainfrom
potiuk:fix/sandbox-lint-refuse-committed-local

Conversation

@potiuk

@potiuk potiuk commented Oct 17, 2026

Copy link
Copy Markdown
Member

Summary

  • Why. Since feat(setup): commit only the shared agent-settings floor #1684, the committed .claude/settings.json is the shared floor and .claude/settings.local.json is each contributor's own layer, reconciled from tools/agent-isolation/claude-settings.local.template.json.
    • The local file is gitignored but can be force-added.
    • A committed copy would be loaded by Claude Code for everyone who checks the repository out, and its scalars override the floor's: sandbox.enabled: false switches the sandbox off.
    • CI lints only the floor and the template, never that file.
    • feat(setup): commit only the shared agent-settings floor #1684 removed the step that refused committed agent settings (it targeted .claude/settings.json, which is now tracked by design), and with it the only guard against this.
  • What.
    • .claude/settings.local.json is added to the workflow's pull_request and push path filters.
    • A new step, Refuse a committed .claude/settings.local.json, fails while the file is tracked and points the author at the floor or the local template.
    • The .asf.yaml note listing the workflow's paths includes it.

Type of change

  • Skill change
  • Tool / bridge contract
  • Python package
  • Groovy reference impl
  • Cross-cutting
  • Documentation
  • Project template
  • CI / dev loop (sandbox-lint workflow, .asf.yaml comment)

Test plan

  • prek run --all-files passes
  • The step's condition in a throwaway repository: passes with the file untracked, refuses once it is force-added

Notes for reviewers


Gen-AI disclosure: prepared with the assistance of Claude Code (Claude Opus 5); reviewed by the author.

🤖 Generated with Claude Code

Since apache#1684 the committed .claude/settings.json is the shared floor and
.claude/settings.local.json is each contributor's own layer, reconciled
from the local template. The local file is gitignored but can be
force-added, and a committed copy would be loaded for everyone who checks
the repository out: its scalars override the floor's
(`sandbox.enabled: false`), and CI lints only the floor and the template.

apache#1684 dropped the step that refused committed agent settings. The
workflow now runs when .claude/settings.local.json changes and fails
while it is tracked, pointing the author at the floor or the template.

Generated-by: Claude Opus 5
@github-actions github-actions Bot added the family:ci .github workflows, prek, validators label Oct 17, 2026
@potiuk
potiuk merged commit 51a610b into apache:main Oct 17, 2026
12 checks passed
potiuk added a commit that referenced this pull request Oct 19, 2026
Hand-sync of tools/spec-loop/specs/ with the functionality that landed
between 43e4c6e and ccb53a3.

Specs changed:
- adapters: Gmail drafting through the gmail-plaintext MCP tools, not the
  CLI (93051d5, #1681); the Jira CLI's explicit --deployment and the
  tracker backends shipped as generated plugin copies (1cf5cee, #1683);
  local-tracker report files and folders created 0600 / 0700 (68ec4a3,
  #1700).
- agent-isolation-sandbox: agent-guard unwrapping env / command and
  refusing env -S (b00d4b5, #1691; 4aea234, #1694); the macOS touch
  overlay shown whether or not activation is granted (0d9c168, #1697);
  the sandbox-lint workflow refusing a tracked .claude/settings.local.json
  (51a610b, #1692) and sandbox-lint refusing the Gmail token path in
  allowRead (93051d5, #1681).
- vetted-command-surface: the spelling guard refusing a quoted ~, the right
  spelling behind env / command, and other spellings of the eval wrapper
  (b00d4b5, #1691).
- adoption-and-setup: the tracker-backend question on every first setup
  and the Jira label mapping and doctor gate (1cf5cee, #1683).
- .last-sync bumped to ccb53a3.

No spec change needed (specs already updated in the commit itself):
ccb53a3, 9a8ec5f, 9955d7d, c9f34cc, 76cc6e8, 1d773a8,
16014a2.

No functional change for the specs: d4b7dc3 (review-body wording),
77e8145 (test timing), 8d606d6 (eval fixtures), a04891f (the
previous sync).

Generated-by: Claude Opus 5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

family:ci .github workflows, prek, validators

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant