You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CLAUDE.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -124,6 +124,7 @@ Four workflow files form the pipeline; each owns one responsibility.
124
124
- Defense-in-depth on workflow injection: every dynamic input flowing into a `run:` block is passed via `env:` first.
125
125
-**GitHub Actions are SHA-pinned.** Every third-party `uses:` reference is pinned to a full 40-char commit SHA (with a `# vX.Y.Z` comment), not a mutable tag, so a force-moved upstream tag cannot change the bytes a runner executes. Renovate keeps the SHAs current via the `helpers:pinGitHubActionDigests` preset behind the existing 7-day `minimumReleaseAge` soak. `ci.yml` runs `bun run check:action-pins` (`scripts/check-action-pins.ts`), which fails the build if any third-party `uses:` is on a tag. Local reusable-workflow calls (`uses: ./...`) are exempt.
126
126
-**Test-glob + destructive-action guards run in CI.**`ci.yml` also runs `bun run check:test-globs` (`scripts/check-test-globs.ts`, fails if any `*.test.ts` is unreachable by the runner glob set, issue #201) and `bun run check:no-destructive` (`scripts/check-no-destructive-actions.ts`, FR-009: fails if `src/workflows/ship/` or a `src/daemon/scoped-*-executor.ts` contains a force-push / `reset --hard` / `gh pr merge` / merge-mutation call outside comments; the scoped-executor set is derived from the filesystem so it cannot go stale, issue #203). Its `FORBIDDEN` pattern set is shared with the paired runtime layer, the `PreToolUse` destructive-Bash hook (`src/core/hooks/forbidden-bash.ts`, security invariant #5), via `src/utils/forbidden-bash.ts` so the static and runtime gates stay in lockstep (issue #222).
127
+
-**Env-contract guard runs in CI.**`ci.yml` runs `bun run check:env-contract` (`scripts/env-contract.ts --check`), which extracts every env var read by `loadConfig()` in `src/config.ts` and fails if the committed `env-contract.json` is stale, if any var is undocumented in `docs/operate/configuration.md`, or if a credential-shaped name (KEY/TOKEN/SECRET/PASSWORD/CREDENTIAL/BEARER segment, or a URL/DSN suffix that is not allowlisted) is missing from `SECRET_ENV_VARS` (`src/config-secret-env.ts`, the single source of secret-vs-config classification). After changing the env schema, rerun `bun run env-contract` and commit the regenerated `env-contract.json`. That file is the contract the `chrisleekr/helm-charts``github-app` chart consumes (at `v<appVersion>`) to gate its ConfigMap/Secret parity.
|`TRIAGE_ENABLED`|`true`| Kill-switch. When `false`, triage returns `heavy=false` and the job routes to `persistent-daemon`. |
119
+
|`TRIAGE_TOOLS_ENABLED`|`true`| Kill-switch for the tool-driven triage classifier. When `false`, triage runs without the on-demand state-fetch tools. |
120
+
|`TRIAGE_MODEL`|`sonnet-4-6`| Alias resolved at runtime. |
121
+
|`TRIAGE_CONFIDENCE_THRESHOLD`|`1.0`| Below this, triage is treated as sub-threshold and the job routes to `persistent-daemon`. |
122
+
|`TRIAGE_MAX_TOKENS`|`256`| Cap on the JSON response. Above ~100 is wasted budget. |
|`CHAT_THREAD_EXECUTE_THRESHOLD`|`0.8`| Range `[0, 1]`. Minimum classifier confidence before a chat-thread proposal is auto-executed rather than left pending. |
145
+
|`CHAT_THREAD_PROPOSAL_TTL_HOURS`|`24`| Hours a pending chat-thread proposal stays valid before it expires. |
146
+
|`CHAT_THREAD_MAX_TURNS`|`8`| Cap on conversational turns within a single chat-thread session. |
147
+
|`CHAT_THREAD_TOOLS_ENABLED`|`true`| Kill-switch for the chat-thread agent's on-demand state-fetch tools. |
148
+
137
149
## Ship
138
150
139
151
| Variable | Default | Notes |
@@ -145,6 +157,7 @@ cap, so there is nothing else to tune.
145
157
|`REVIEW_BARRIER_SAFETY_MARGIN_MS`|`1200000` (20 min) | Minimum elapsed time since the last bot push before the bot may declare `ready` without a non-bot review on the current head SHA. |
146
158
|`FIX_ATTEMPTS_PER_SIGNATURE_CAP`|`3`| Max attempts per failure signature within a single intent. Cap firing terminates with `terminal_blocker_category='flake-cap'`. |
147
159
|`SHIP_FORBIDDEN_TARGET_BRANCHES`| empty | Comma-separated branches the bot refuses to shepherd PRs against. |
160
+
|`REVIEW_RESOLVE_MAX_ITERATIONS`|`2`| Range `[1, 5]`. Max review/resolve loop iterations in the composite ship flow before the intent yields. |
0 commit comments