wip(freestyle/acr): grounding & edit-tool fixes + ACR-compiler experiment
This branch's uncommitted WIP, committed together (entangled at file level). Distinct pieces of work: Freestyle QA fixes (this session): - FileEditTool: pre-validate replace anchor in validateRequest — reject a missing/ambiguous target BEFORE the approval gate, mirroring read/write's file-not-found / read-before-write pre-checks. Shared not-found/ambiguous messages between validate and execute so they can't drift. - PlanGrounder: add `scanned` flag; when no RepoMapComputedEvent was recorded, repoMapPaths is "unknown" not "empty workspace" — skip scope grounding (which proves a path ABSENT) so real paths (apps/server/**) aren't falsely rejected. Build-manifest check still runs. - FreestyleDriver: wire scanned=(repoMap!=null); on plan rejection emit a session-terminal WorkflowFailedEvent so a rejected run reads FAILED, not the COMPLETED-lie (last verdict was the planning-phase WorkflowCompleted). - ServerModule: resolve project-memory workspace root from the session's bound workspace (sessionWorkspaceRoot) instead of boot-static pm.repoRoot(), fixing the workspace-binding divergence (correx vs empty scratch dir). Retire tracked in Vikunja #266. - LaunchRegistrationRaceTest: join registered jobs before asserting launchCount — computeIfAbsent returns the Job immediately but the fire-and-forget launch body lagged awaitAll (the 49-vs-50 flake). ACR concept-compiler experiment (pre-existing WIP on this branch): - ExecutionPlanCompiler/Model/PlanLinter, #264 needs-seam (sessionArtifacts), LSP diagnostics subsystem (LspDiagnosticEvents/Runner/Lsp4j), BootWorkspace, config surface, workflow prompts/schemas, orchestrator advance-don't-rerun. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -22,24 +22,47 @@ Two checks, both grounded in what you actually read:
|
||||
endpoint.
|
||||
|
||||
Emit the `discovery` artifact by calling **`emit_artifact`** with:
|
||||
- `brief`: the complete comprehension brief. Populate `what`, `why`, `who`, `scope`,
|
||||
`non_goals`, `constraints`, and `assumptions` even when questions remain. Use assumptions for
|
||||
reasonable, visible defaults instead of parking on micro-decisions.
|
||||
- `ready`: `true` when the request is clear and grounded enough to hand to the analyst; `false`
|
||||
when you are raising questions.
|
||||
- `questions`: the open questions (empty when `ready` is true). Batch **all** of them into this
|
||||
one list — do not ask one at a time. Each entry is an object:
|
||||
- `prompt` (required): the question, in full.
|
||||
- `options` (optional): suggested answers as strings, whenever the answer is a choice among
|
||||
known alternatives.
|
||||
- `options` (**required whenever the answer is a choice among known alternatives** — and it
|
||||
almost always is: stack, library, endpoint, layout, priority are all choices among things you
|
||||
can name). Provide 2–4 concrete prefilled answers as strings. An open-ended question with no
|
||||
`options` is only acceptable when no candidate set exists at all. Empty `options` on a
|
||||
choice-question is a defect — enumerate the real candidates you found in the repo.
|
||||
- `multiSelect` (optional, default false): true if more than one option may apply.
|
||||
- `header` (optional): a 1–2 word label (e.g. "Scope", "Stack", "Endpoint").
|
||||
|
||||
**Default to proceeding.** For a clear, well-grounded request this stage is pure overhead —
|
||||
emit `{"ready": true, "questions": []}` and let the analyst take over. Only ask when a genuine
|
||||
**Default to proceeding.** First inspect enough of the repository to enumerate the whole question
|
||||
surface, then ask every genuine operator-only question in one batch. For a clear, well-grounded
|
||||
request, proceed with visible assumptions. Do not raise one question, re-enter, and discover
|
||||
another question that the same initial inspection could have exposed.
|
||||
|
||||
**Converge once answered.** If the decision history above already contains the operator's answers
|
||||
to your questions, you are done vetting — emit the brief with `ready: true` and empty `questions`.
|
||||
Do NOT re-explore the repo hunting for new questions after the operator has answered; fold their
|
||||
answers into the brief and hand off. You get **one** clarification round: ask everything up front,
|
||||
then commit. Endless re-inspection is a failure, not diligence.
|
||||
fork or contradiction blocks planning. Do not nag, and do not re-ask what the operator has
|
||||
already answered in the decision history above.
|
||||
|
||||
Example (needs input):
|
||||
```json
|
||||
{
|
||||
"brief": {
|
||||
"what": "Build a browser client for the existing session API.",
|
||||
"why": "Operators need a visual session surface.",
|
||||
"who": ["operators"],
|
||||
"scope": ["browser session client"],
|
||||
"non_goals": ["server protocol redesign"],
|
||||
"constraints": ["reuse the existing endpoint"],
|
||||
"assumptions": []
|
||||
},
|
||||
"ready": false,
|
||||
"questions": [
|
||||
{"prompt": "Which frontend stack should the UI target?",
|
||||
@@ -52,5 +75,17 @@ Example (needs input):
|
||||
|
||||
Example (clear — the common case):
|
||||
```json
|
||||
{ "ready": true, "questions": [] }
|
||||
{
|
||||
"brief": {
|
||||
"what": "Add the requested deterministic validation gate.",
|
||||
"why": "Prevent invalid output from reaching review.",
|
||||
"who": ["workflow authors", "operators"],
|
||||
"scope": ["gate execution and recorded verdict"],
|
||||
"non_goals": ["workflow topology redesign"],
|
||||
"constraints": ["replay uses recorded observations"],
|
||||
"assumptions": ["existing event-store contracts remain authoritative"]
|
||||
},
|
||||
"ready": true,
|
||||
"questions": []
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user