Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
62e3e3f
refactor(sandbox): remove Shields from core
ericksoa Aug 31, 2026
3e8795a
fix(sandbox): finish atomic Shields removal
ericksoa Sep 1, 2026
551c2f6
fix(sandbox): repair removal regression gates
ericksoa Sep 1, 2026
c63b18c
chore: merge current main into Shields removal
ericksoa Sep 1, 2026
dfa8c61
chore: merge latest main into Shields removal
ericksoa Sep 1, 2026
6842407
fix(rebuild): verify Hermes mutable migration posture
ericksoa Sep 1, 2026
923dd15
test(rebuild): execute Hermes migration probe
ericksoa Sep 1, 2026
77c5894
fix(rebuild): bind Hermes probe to managed paths
ericksoa Sep 1, 2026
9bbabaf
fix(rebuild): retire terminal legacy state safely
ericksoa Sep 1, 2026
57e381c
chore: merge E2E reporting update into removal
ericksoa Sep 1, 2026
bd5f1f9
test(rebuild): remove redundant probe shape test
ericksoa Sep 1, 2026
8194c7e
test(security): pin stale descriptor reads
ericksoa Sep 1, 2026
844ae78
fix(hermes): isolate gateway extension code
ericksoa Sep 1, 2026
e378e44
chore: merge current main into Shields removal
ericksoa Sep 1, 2026
7f117ae
fix(ci): stabilize Shields retirement verification
ericksoa Sep 1, 2026
ea438f6
test(hermes): exercise private lazy install target
ericksoa Sep 1, 2026
951bb90
fix(snapshot): require restored config permission proof
ericksoa Sep 1, 2026
67d432a
fix(upgrade): block ambiguous retired authority
ericksoa Sep 1, 2026
5e5c7ed
test(hermes): execute the unmodified gateway wrapper
ericksoa Sep 1, 2026
a3d0140
test(ci): isolate MCP provider ownership status
ericksoa Sep 1, 2026
6c97754
fix: close Shields retirement safety gaps
ericksoa Sep 1, 2026
a8f9245
fix(ci): retry transient anonymous GHCR denial
ericksoa Sep 1, 2026
1d687c0
fix: complete Shields retirement recovery
ericksoa Sep 1, 2026
dc51d71
docs: mark retained Shields reviews historical
ericksoa Sep 1, 2026
7dbf9ae
test: align rebuild fixtures with manifest config
ericksoa Sep 1, 2026
b060b02
fix: expose nonblocking retirement evidence
ericksoa Sep 1, 2026
3c8e40f
fix(ci): bound anonymous GHCR unavailability
ericksoa Sep 1, 2026
72f5c27
fix(ci): extend anonymous GHCR visibility window
ericksoa Sep 1, 2026
44d1826
test: bound rollback under shard load
ericksoa Sep 1, 2026
f51645e
fix(ci): bound GHCR visibility by elapsed time
ericksoa Sep 1, 2026
5f068c7
fix: reject unsafe retired state records
ericksoa Sep 1, 2026
e2c8e85
fix(ci): tolerate delayed GHCR public visibility
ericksoa Sep 1, 2026
b316655
fix(ci): allow complete GHCR visibility convergence
ericksoa Sep 1, 2026
6db77d6
fix(e2e): preserve full removal qualification
ericksoa Sep 1, 2026
acb162d
chore: forward-port current main conflict fixes
ericksoa Sep 1, 2026
7174d02
Merge origin/main into remove-shields core
ericksoa Sep 1, 2026
00a49ec
fix(e2e): close remaining removal regressions
ericksoa Sep 1, 2026
72df5e8
Merge current origin/main into remove-shields core
ericksoa Sep 1, 2026
d1983db
Merge latest origin/main into remove-shields core
ericksoa Sep 1, 2026
1f7a986
fix(hermes): preserve rootless SQLite handoffs
ericksoa Sep 1, 2026
8de2047
fix(hermes): clear build probe state before validation
ericksoa Sep 1, 2026
8a10171
fix(hermes): clean plugin probe session state
ericksoa Sep 1, 2026
5570fcb
fix(e2e): isolate CodeQL-sensitive test inputs
ericksoa Sep 1, 2026
d9f9269
Merge current origin/main into remove-shields core
ericksoa Sep 1, 2026
bfc2f5d
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
29e9535
merge: integrate main with Shields retirement upgrade coverage
ericksoa Sep 2, 2026
22fe42b
Merge remote-tracking branch 'origin/refactor/remove-shields-core-106…
ericksoa Sep 2, 2026
c7c5322
ci(e2e): qualify Shields retirement on copied PR head
ericksoa Sep 2, 2026
d61a7d3
fix(e2e): bind Shields retirement correlation identity
ericksoa Sep 2, 2026
bd3a093
fix(e2e): assert immutable release build receipt
ericksoa Sep 2, 2026
046cb29
test(ci): forbid deprecated Dockerfile setup growth
ericksoa Sep 2, 2026
263ebd9
Revert "test(ci): forbid deprecated Dockerfile setup growth"
ericksoa Sep 2, 2026
3f02af4
fix(e2e): qualify managed Shields retirement upgrade
ericksoa Sep 2, 2026
75c998e
Merge remote-tracking branch 'origin/refactor/remove-shields-core-106…
ericksoa Sep 2, 2026
b616bb8
fix(e2e): read legacy Shields state by descriptor
ericksoa Sep 2, 2026
89788d2
fix(e2e): keep Shields state reads descriptor-bound
ericksoa Sep 2, 2026
7dc726f
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
6e3f201
Merge branch 'main' into refactor/remove-shields-core-10696
cv Sep 2, 2026
68a707b
fix(e2e): recover Shields-up sandbox from released backup
ericksoa Sep 2, 2026
f60acd2
Merge remote-tracking branch 'origin/refactor/remove-shields-core-106…
ericksoa Sep 2, 2026
1a9180f
Merge branch 'main' into refactor/remove-shields-core-10696
cv Sep 2, 2026
bd86f4c
fix(ci): repair merged Shields branch checks
ericksoa Sep 2, 2026
2f5a867
Merge remote-tracking branch 'origin/refactor/remove-shields-core-106…
ericksoa Sep 2, 2026
657775d
test(e2e): bound Shields plan contract
ericksoa Sep 2, 2026
74b7764
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
4f0ae9b
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
b9311b6
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
2acb7f3
merge: resolve Shields removal with native Podman
ericksoa Sep 2, 2026
fe20d4e
merge: resolve Shields removal with typed policy boundaries
ericksoa Sep 2, 2026
20a61c5
fix(hermes): refresh validator integrity pin
ericksoa Sep 2, 2026
f4c032b
fix(ci): reconcile Shields retirement after main merges
ericksoa Sep 2, 2026
445d318
fix(e2e): invoke exact Shields retirement candidate
ericksoa Sep 2, 2026
4e2a184
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
45ece60
fix(e2e): authenticate owned PR revalidation
ericksoa Sep 2, 2026
d7576a2
Merge remote-tracking branch 'origin/refactor/remove-shields-core-106…
ericksoa Sep 2, 2026
51642a7
fix(security): refresh fast-uri remediation
ericksoa Sep 2, 2026
a36450c
fix(ci): authorize reviewed PR lock transitions
ericksoa Sep 2, 2026
3ba9d61
fix(e2e): reuse immutable base with PR images
ericksoa Sep 2, 2026
3109928
fix(ci): authorize reviewed locks in PR audit
ericksoa Sep 2, 2026
aaf80ba
Merge remote-tracking branch 'origin/main' into integrate/remove-shie…
ericksoa Sep 2, 2026
19768a1
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
2c1fec6
feat(e2e): allow immutable PR image reuse
ericksoa Sep 2, 2026
3421987
feat(e2e): accept an immutable image catalog
ericksoa Sep 2, 2026
d19f102
fix(ci): read GitHub artifact data descriptors
ericksoa Sep 2, 2026
c85ca8d
fix(e2e): accept Git describe SHA width
ericksoa Sep 2, 2026
c5de6b1
merge: resolve conflicts with main
github-actions[bot] Sep 2, 2026
61f8b94
test(e2e): keep Shields retirement black box
ericksoa Sep 2, 2026
72ddbba
Merge remote-tracking branch 'origin/refactor/remove-shields-core-106…
ericksoa Sep 2, 2026
fac4df9
fix(upgrade): carry Shields recovery authority
ericksoa Sep 2, 2026
e34af95
fix(upgrade): keep backup restore in outer rebuild
ericksoa Sep 2, 2026
03eb0a0
chore: align refreshed Pi qualification receipts
ericksoa Sep 3, 2026
b0627e0
Merge branch 'main' into refactor/remove-shields-core-10696
ericksoa Sep 3, 2026
2499c22
fix(ci): clear exact-head merge blockers
ericksoa Sep 3, 2026
74c0f0f
refactor(onboard): preserve orchestration fanout
ericksoa Sep 3, 2026
49b70f0
fix(onboard): preserve sandbox create call shape
ericksoa Sep 3, 2026
5cc8bdd
ci: record Pi qualification and keep image reuse generic
ericksoa Sep 3, 2026
187e360
fix(ci): check Pi receipts against PR head
ericksoa Sep 3, 2026
7580a67
test(ci): isolate Pi receipt checker environment
ericksoa Sep 3, 2026
fff3bca
test(ci): harden loaded shard deadlines
ericksoa Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 0 additions & 5 deletions .agents/skills/_shared/controlled-words.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,6 @@ other literal identifiers.
| `OpenShell gateway` | Technical noun | The host service that owns credentials, coordinates sandbox lifecycle, and proxies approved traffic. | agent gateway, gateway when the type is unclear |
| `port forward` | Technical noun or verb | A connection that maps a host port to a service inside a sandbox, or the act of creating that connection. | tunnel when no general tunnel exists |
| `provider profile` | Technical noun | An OpenShell declaration of one service provider's credentials, endpoints, allowed binaries, and access policy. | inference profile, provider settings |
| `runtime provider state mutation` | Technical noun | A bounded, provider-mediated protection transition or restore operation whose selected state, projection digest, active fence, and recovery contract are explicit. | state mutation without the runtime provider modifier, lifecycle mutation |
| `runtime setting` | Technical noun | A value applied when a process or sandbox runs. | build-time setting, runtime config |
| `sandbox image` | Technical noun | The built image used to create an agent sandbox. | base image, container |
| `sandbox registry` | Technical noun | NemoClaw state that records managed sandboxes and their selected agent types. | image registry, container registry |
Expand Down Expand Up @@ -229,7 +228,6 @@ other literal identifiers.
| `filesystem policy` | Technical noun | Rules that control sandbox access to filesystem paths. | file permissions when the complete policy is intended |
| `least privilege` | Technical noun | Grant only the access required for the stated operation. | minimal permissions, locked down |
| `link-local address` | Technical noun | An IP address valid only on the directly connected network segment. | local address, private IP address |
| `lockdown` | Technical noun | The protected filesystem, process, and restrictive network-policy posture restored by Shields up. | hardening, shields when the resulting posture is intended |
| `loopback address` | Technical noun | An IP address that refers to the same network host. | localhost when an address is intended, local address |
| `network namespace` | Technical noun | The operating-system isolation boundary for network devices, routes, and sockets. | network sandbox, container network |
| `policy` | Technical noun | Enforceable rules that allow, deny, or constrain an operation. Name the policy type at first use. | configuration, settings |
Expand All @@ -245,9 +243,6 @@ other literal identifiers.
| `sandbox boundary` | Technical noun | The isolation boundary between sandbox processes and host or external resources. | container boundary, security boundary without naming the sandbox |
| `seccomp` | Technical noun or adjective | Linux system-call filtering enforced for sandbox processes. | syscall sandbox, seccomp-BPF in general prose |
| `secret` | Technical noun or adjective | Sensitive authentication or cryptographic material that must not be exposed. | credential when the value is not used for authentication |
| `Shields down` | Product state or command name | The temporary state that relaxes selected NemoClaw lockdown controls. | permissive state, unlocked mode |
| `shields-down window` | Technical noun | The bounded time during which Shields down remains active before automatic restoration. | maintenance window, unlock period |
| `Shields up` | Product state or command name | The state that enforces NemoClaw lockdown controls. | secure mode, locked state |
| `trust boundary` | Technical noun | A boundary across which data or control changes its trust assumptions. | security boundary without naming the trust change |
| `trusted` | Adjective | Explicitly accepted as an input, identity, or component within a named trust boundary. | safe, secure |
| `untrusted` | Adjective | Not accepted as authoritative or safe without validation at a named trust boundary. | unsafe, external |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ Fingerprint JSON shape:
```json
{
"pr": 2851,
"files": ["src/lib/shields.ts", "Dockerfile.base"],
"symbols": ["normalize_mutable_config_perms", "applyStateDirLockMode"],
"files": ["src/lib/sandbox/mutable-config-perms.ts", "Dockerfile.base"],
"symbols": ["normalize_mutable_config_perms", "repairMutableConfigPerms"],
"error_strings": ["EACCES on .openclaw"],
"primary_issue": 2681
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ The PR resolves the issue or enables follow-up work on the changed code.

### Example A — incidental closure (direct evidence)

PR description: "fix EACCES when shields-down user writes config"
PR description: "fix EACCES when a sandbox user writes config"
PR diff: adds `chmod g+w` to `.openclaw` directory at startup
Candidate issue #2810: "Telegram preset writes fail intermittently after sandbox rebuild"
Issue body cites: "EPERM on `.openclaw/credentials/telegram.json`"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,16 @@ sequence. Re-read the exported constants before authoring the declaration.

## Complete Activated Bundle

Activation requires all 14 surfaces to report `supported: true`. It also requires:
Activation requires all 13 surfaces to report `supported: true`. It also requires:

- host-local inference, direct lifecycle, and workload cleanup capabilities;
- exact-digest managed images for Linux AMD64 and ARM64;
- `require-managed` selection and no legacy Dockerfile builds;
- accepted current managed-image startup and capability contract versions;
- Ollama, NVIDIA NIM, and vLLM services in canonical order;
- the complete canonical mutation-operation sequence;
- state mutation contract version 2;
- backup, restore, and managed-profile restore;
- operation-scoped identities for all six engine scopes; and
- operation-scoped identities for all five engine scopes; and
- release-installer qualification with Docker unavailable.

If a provider cannot truthfully meet this profile, keep it as a candidate. When a real provider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ source of truth.

## Registration Unit

`RuntimeProviderBundle` is the sole registration unit. It contains one identity and these 14
`RuntimeProviderBundle` is the sole registration unit. It contains one identity and these 13
surfaces:

| Surface | Candidate registration contract |
Expand All @@ -22,7 +22,6 @@ surfaces:
| `hostLocalInference` | Optional for a candidate. Lists services and creates a provider-owned operation. |
| `lifecycle` | Optional for a candidate. Implements start, started-state verification, stop hooks, and channel-stop transport. |
| `mutationAuthority` | Optional for a candidate. Lists the state-changing operations that the provider authorizes. |
| `stateMutation` | Optional for a candidate. Implements the versioned fenced state-mutation transaction. |
| `bootstrap` | Optional for a candidate. Binds provider-owned create, readiness, and create-recovery operations for its workload type. |
| `snapshot` | Optional for a candidate. Implements versioned preflight, capture, restore validation, and restore. |
| `recovery` | Optional for a candidate. Reconciles one persisted sandbox with its runtime. |
Expand Down Expand Up @@ -95,24 +94,11 @@ evidence must use the handle for provider-owned, idempotent recovery. Creation e
not match the plan cannot authorize plan-only recovery or removal and must report that the resource
may remain. Separated measurement and creation do not satisfy this contract.

### Mutation authority and state mutation
### Mutation authority

Mutation authority lists only operations that the provider implements. The current operation set
is defined by `RuntimeProviderMutationOperation`.

State mutation contract version 2 is a bounded transaction:

1. `acquire()` validates a frozen, digested plan and returns a fence.
2. `assertFenced()` revalidates the active fence before publication.
3. `publish()` records publication under the fence.
4. `rollback()` restores the declared rollback posture after failure.
5. `activate()` returns fresh service evidence for the lifecycle generation.
6. `release()` retires the fence after activation and ledger verification.
7. `recover()` returns a durable active fence after controller restart, or `null`.

The serialized plan is bounded JSON for a fixed provider helper. Do not accept arbitrary commands,
scripts, or callbacks through the state-mutation surface.

### Snapshot, recovery, and cleanup

Snapshot contract version 1 binds preflight, runtime receipt, lifecycle state, lifecycle
Expand Down Expand Up @@ -140,7 +126,6 @@ A supported `containerEngine` surface declares one identity for each implemented
- `gateway-inspection`
- `host-local-inference`
- `sandbox-lifecycle`
- `state-mutation`
- `workload-cleanup`

Each identity contains an operation, engine ID, and display name. Provider-specific command
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ portable profile are different product paths.
5. Implement immutable workload receipt acceptance.
6. Implement bootstrap, start, started-state verification, stop, and privileged control.
7. Implement inference service authority and credential redaction where applicable.
8. Implement fenced state mutation, snapshot, restore, and restart recovery.
8. Implement snapshot, restore, and restart recovery.
9. Implement side-effect-free cleanup planning, authority revalidation, removal, and absence
confirmation.
10. Persist the provider identity and prove each later operation resolves the same bundle.
Expand Down Expand Up @@ -73,7 +73,6 @@ Test at least these provider-bound failures when applicable:
- endpoint or socket authority drift between operation scopes;
- runtime handle, lifecycle generation, or ownership mismatch;
- timeout, nonzero status, partial publication, and controller restart;
- state-mutation rollback and active-fence recovery;
- snapshot source and target provider mismatch;
- cleanup with missing, shared, ambiguous, or changed ownership;
- credential redaction from logs, receipts, and artifacts; and
Expand All @@ -94,7 +93,7 @@ A provider PR is not approval-ready until the review can answer each question:
- Do unsupported candidate surfaces state reasons?
- Does activation enter through the qualification-backed composition seam?
- Does protected evidence bind the candidate, base, workflow, job, attempt, and artifact?
- Do state mutation, recovery, and cleanup fail closed on authority drift?
- Do recovery and cleanup fail closed on authority drift?
- Do focused checks pass for the commit under review?
- Does the complete supported E2E matrix pass for that same commit?
- Are ownership, compatibility, security, and upgrade obligations documented?
Expand Down
2 changes: 1 addition & 1 deletion .coderabbit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ reviews:
state/backup invariants, and cover failure, recovery, rebuild, and resume
behavior without bypassing the public action boundary.

- path: "src/lib/{security,credentials,shields}/**"
- path: "src/lib/{security,credentials}/**"
instructions: &security-boundary |
Treat this as a security boundary.

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ jobs:
fi
larger_runner="${LARGER_RUNNER_LABEL}"
fi
runner_routing="$(jq -cn --arg standard "ubuntu-latest" --arg larger "${larger_runner}" '{"channels-stop-start-hermes":$larger,"common-egress-agent":$larger,"hermes-discord":$larger,"hermes-e2e":$larger,"hermes-inference-switch":$larger,"hermes-shields-config":$larger,"mcp-bridge-deepagents":$larger,"mcp-bridge-hermes":$larger,"mcp-bridge-openclaw":$standard,"rebuild-hermes":$larger,"rebuild-hermes-stale-base":$larger,"security-posture-hermes":$larger}')"
runner_routing="$(jq -cn --arg standard "ubuntu-latest" --arg larger "${larger_runner}" '{"channels-stop-start-hermes":$larger,"common-egress-agent":$larger,"hermes-discord":$larger,"hermes-e2e":$larger,"hermes-inference-switch":$larger,"mcp-bridge-deepagents":$larger,"mcp-bridge-hermes":$larger,"mcp-bridge-openclaw":$standard,"rebuild-hermes":$larger,"rebuild-hermes-stale-base":$larger,"security-posture-hermes":$larger}')"
printf 'runner_routing=%s\n' "${runner_routing}" >> "${GITHUB_OUTPUT}"

- id: candidate_authorization
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/podman-cpu-proof.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ on:
- "src/commands/internal/uninstall/run-plan.ts"
- "src/lib/state/portable-uninstall-retirement.ts"
- "src/lib/state/registry/lock.ts"
- "src/lib/onboard/runtime-provider/container-state-mutation.ts"
- "src/lib/onboard/runtime-provider/docker-state-mutation.ts"
- "src/lib/onboard/experimental/portable-host-preparation*.ts"
- "src/lib/onboard/experimental/portable-profile.ts"
- "src/lib/onboard/runtime-provider/podman*.ts"
Expand Down
54 changes: 0 additions & 54 deletions .github/workflows/sandbox-images-and-e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -417,60 +417,6 @@ jobs:
if: always()
shell: bash
run: bash .github/scripts/docker-auth-cleanup.sh
state-dir-guard-metadata:
runs-on: ubuntu-latest
timeout-minutes: 30
needs: [build-sandbox-images, build-hermes-sandbox-image]
env:
E2E_ARTIFACT_DIR: ${{ github.workspace }}/e2e-artifacts/live/state-dir-guard-metadata
E2E_TARGET_ID: state-dir-guard-metadata
NEMOCLAW_RUN_LIVE_E2E: "1"
NEMOCLAW_OPENCLAW_TEST_IMAGE: nemoclaw-production
NEMOCLAW_HERMES_TEST_IMAGE: nemoclaw-hermes-production
steps:
- *checkout

- *setup-node

- *install-root-dependencies

- name: Download OpenClaw production image
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: isolation-image
path: /tmp

- name: Download Hermes production image
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: hermes-isolation-image
path: /tmp

- name: Load production images
run: |
set -euo pipefail
gunzip -c /tmp/isolation-image.tar.gz | docker load
gunzip -c /tmp/hermes-isolation-image.tar.gz | docker load
docker image inspect nemoclaw-production >/dev/null
docker image inspect nemoclaw-hermes-production >/dev/null

- name: Install filesystem metadata tools
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install --yes --no-install-recommends acl attr
command -v setfacl getfacl setfattr getfattr >/dev/null

- name: Run installed state-dir guard metadata test
timeout-minutes: 15
run: |
npx vitest run --project e2e-live \
test/e2e/live/state-dir-guard-metadata.test.ts \
--silent=false --reporter=default

- name: Upload state-dir guard metadata artifacts
if: always()
uses: ./.github/actions/upload-e2e-artifacts
build-sandbox-images-arm64:
if: inputs.run_arm64
runs-on: ubuntu-24.04-arm
Expand Down
5 changes: 4 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,10 @@ repos:
pass_filenames: false
files: ^(agents/hermes|bin|scripts|src|test|tools|nemoclaw-blueprint/scripts)/.*\.(ts|tsx|mts|cts|json)$|^\.agents/skills/nemoclaw-maintainer-day/scripts/(check-gates|shared)\.ts$|^nemoclaw/src/(lib/subprocess-env|blueprint/private-networks)\.ts$|^(package(-lock)?\.json|tsconfig\.cli\.json|vitest\.config\.ts)$
stages: [pre-push]
priority: 10
# build:cli now removes all stale dist output. When package or script
# inputs select both hooks, run this reader after tsc-js finishes its
# clean rebuild instead of racing the deleted output tree.
priority: 20

# ── post-merge / post-checkout: warn about stale compiled dist/ ───────────
# See #1958 — dist/ is gitignored, so git pull / checkout can leave stale
Expand Down
Loading
Loading