Files
correx/docs/schemas/discovery.json
T
kami 41ed6414c6 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).
2026-07-07 13:27:59 +04:00

39 lines
1.2 KiB
JSON

{
"type": "object",
"properties": {
"ready": {
"type": "boolean",
"description": "true when the request is clear and grounded enough to plan; false when you are raising questions"
},
"questions": {
"type": "array",
"description": "open questions only the operator can resolve. Empty when ready is true.",
"items": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "the question, in full"
},
"options": {
"type": "array",
"items": { "type": "string" },
"description": "suggested answers when the answer is a choice among known alternatives"
},
"multiSelect": {
"type": "boolean",
"description": "true if more than one option may apply (default false)"
},
"header": {
"type": "string",
"description": "1-2 word label for the question (e.g. \"Scope\", \"Stack\", \"Endpoint\")"
}
},
"required": ["prompt"]
}
}
},
"required": ["ready", "questions"],
"additionalProperties": false
}