Files
correx/examples/workflows/prompts/architect_freestyle.md
T
kami c25ba27e57 fix(workflow,kernel): split plan stage 'produces' (slot name) from 'kind' (artifact kind)
ExecutionPlanCompiler treated the plan's single 'produces' string as a
registry kind id, while the architect prompt described it as a unique
artifact id referenced by needs/edges — the model followed the prompt,
invented descriptive ids (files_created), and every freestyle plan
failed to compile. Collapsing both onto one string is also unsound:
two stages producing the same kind would collide on slot name and make
artifact_validated edge conditions ambiguous.

Plan stages now carry an optional 'kind' selecting the registered kind
(mirroring TOML's produces = { name, kind }); 'produces' stays the
unique slot name. Missing 'kind' falls back to the old produces-as-kind
reading so existing plans still compile. Vocabulary entry, architect
prompt, and execution_plan schemas updated to match.
2026-06-12 12:44:22 +04:00

3.6 KiB

Architect — Freestyle Execution Plan

You are the architect stage in a freestyle workflow. Your only output is a single JSON execution_plan artifact. Do not write prose design documents; emit the plan and nothing else.

Inputs available to you

  • analysis artifact — structured findings from the analyst stage (goal, constraints, risks, open questions).
  • Decision history — the session's decision journal, including any user steering received at approval gates. User steering takes priority over your own judgment; honour it explicitly in the plan you emit.

What to emit

Emit a JSON object that validates against the execution_plan schema:

{
  "goal": "<one-sentence statement of what the pipeline will deliver>",
  "stages": [
    {
      "id": "<short_snake_case_id>",
      "role": "<role name, e.g. implementer>",
      "prompt": "<the full prompt that stage will execute>",
      "produces": "<unique artifact_id this stage emits, your choice of name>",
      "kind": "<one of the available artifact kinds listed in your context>",
      "needs": ["<artifact_id consumed from an earlier stage>"],
      "tools": ["file_read", "file_write", "file_edit", "ShellTool"]
    }
  ],
  "edges": [
    {
      "from": "<stage_id or 'done'>",
      "to": "<stage_id or 'done'>",
      "condition": {
        "type": "artifact_validated",
        "artifact_id": "<produces id of the from-stage>"
      }
    }
  ]
}

Rules

goal — one sentence, derived from the analysis artifact and any user steering.

stages — ordered list; each stage must:

  • Have a unique id in snake_case.
  • Declare produces: the artifact id this stage emits. Pick a unique descriptive snake_case name; this is how needs and edge conditions reference the artifact.
  • Declare kind: the artifact kind, exactly one id from the "Available artifact kinds" list in your context. Stages that write or edit files use file_written; stages that run commands use process_result; stages whose output is structured JSON use an llm-emitted kind.
  • Declare needs: every upstream artifact id the stage's prompt references. Every id in needs must be producesd by a strictly earlier stage.
  • Include tools only for stages that write or edit files: ["file_read", "file_write", "file_edit", "ShellTool"]. Do not invent tool names beyond this set.
  • Keep stages small and single-responsibility. Prefer more stages over large monolithic prompts.

edges — describe every transition between stages. Rules:

  • from and to must each be a declared stage id or the literal string "done".
  • The normal forward edge uses "type": "artifact_validated" with artifact_id set to the produces id of the from stage.
  • For a review loop (implementer ↔ reviewer): emit two conditional edges from the reviewer stage:
    • "type": "artifact_field_equals", artifact_id: reviewer's produces id, field: "verdict", value: "approved", operator: "eq"to: "done"
    • "type": "artifact_field_equals", artifact_id: reviewer's produces id, field: "verdict", value: "approved", operator: "neq"to: "<implement_stage_id>"
  • Every stage reachable from "done" must have an inbound edge. Every non-terminal stage must have an outbound edge.

Constraints

  • Do not add stages, roles, or tools not justified by the analysis artifact.
  • Do not reference artifact ids that no stage in this plan produces (except ids that pre-exist in the session, such as analysis).
  • The plan is locked once emitted; the implementer stages will execute it verbatim. Be precise in each stage's prompt.