feat(guardrails): steering channel + shell-in-file rule + capability-gap detector
Bundles three operator-reliability guardrails (Vikunja #28/#29/#30) plus the in-flight branch WIP they were built on top of (reasoning_content capture, operator/project profile editor, write-jail workspaceRoot fix) — the tree is interdependent (SessionOrchestrator references reasoningArtifactId from the WIP) and does not compile as separable subsets, so it lands as one commit. Guardrails: - #28 mid-stage steering: ClientMessage.SteerSession -> GlobalStreamHandler -> orchestrator.submitSteering, reusing SteeringNoteAddedEvent + existing context fold (advisory, non-authoritative; invariants #3/#7). Closes the gap where steering typed off an approval gate was silently dropped. - #29 shell-in-file guardrail: ShellInFileContentRule (core:toolintent) blocks a file_write whose content is a bare shell command (e.g. "mkdir -p ..."); FileWriteTool description now advertises auto-mkdir of parent dirs. Basename-allowlist so the extensionless case is caught; scripts/Makefiles/multiline exempt. - #30 pt1 capability-gap detector: deterministic CapabilityGapDetector maps stage intent -> implied ToolCapability, compares to granted tools, emits advisory CapabilityGapDetectedEvent in FreestyleDriver.lockAndRun. Recorded, never fails the gate and never auto-grants (invariants #3/#4/#5). Reflection rung is pt2. Verified: ./gradlew check green (whole tree).
This commit is contained in:
@@ -79,6 +79,12 @@ Emit a JSON object that validates against the `execution_plan` schema:
|
||||
decompose tasks here — task creation is out of scope for the plan.
|
||||
- Keep stages small and single-responsibility. Prefer more stages over large monolithic
|
||||
prompts.
|
||||
- **Scaffolding uses `file_write`, never a network installer.** A stage that sets up a project
|
||||
writes `package.json`, config files, and sources directly with `file_write` — it does not
|
||||
shell out to `npm create vite`, `create-react-app`, `npx`, or any `create`/`init` scaffolder.
|
||||
Those fetch remote code and prompt on stdin; the run is unattended (no TTY) so they hang, and
|
||||
`shell` rejects them outright. `shell` in a scaffold stage is for `npm install` / `npm run
|
||||
build` on files that already exist, not for generating the project.
|
||||
|
||||
**edges** — describe every transition between stages. Rules:
|
||||
- `from` and `to` must each be a declared stage `id` or the literal string `"done"`.
|
||||
|
||||
Reference in New Issue
Block a user