Skip to main content
Glama

tascan_create_cycle

Start an unattended build-review-decide cycle (protocol v0.2). Queues T1 CODE: (or SHELL:) with your build_brief on the AI Inbox and T2 REVIEW: with your review_brief, born blocked on T1. T1 (2026-09-24 throughput): kind=review_only mints T1 as CAPTURE: instead — the executor stores the bundle from the repo at HEAD without a model call and the review runs on that; dry_run=true runs the dispatch PREFLIGHT only (nothing queued) and prints every problem at once (codes title_too_long, brief_rule, brief_names_unbundled_path, artifact_over_cap, migration_as_context (tascan repo only), idempotency_replay, kind_invalid — bad kind, bad revisable_by, review_only + task_type SHELL/RESEARCH, review_only + max_questions 0), then what the API could NOT check (unchecked[]: artifact_missing_at_head always — only the executor sees the repo, and a CAPTURE naming a missing path fails with "[artifact_missing_at_head]" in its error; artifact_over_cap for any path without a byte count — pass artifact_bytes; idempotency_replay only if its lookup failed) and warnings[] (a build_brief naming a context file outside the bundle); a real create that the API refuses prints the same problems[] list (when the transport hands the tool only the first problem's text, the tool re-runs the preflight and prints the whole list). The local executor builds, stores the exact bytes of artifact_paths as a bundle (build_ref = sha256 over the manifest), the independent reviewer reviews THAT bundle, an approve verdict mints a Decision task for the human authority (one SMS), Approve mints an Integrate task for the deploy id. Revise verdicts spawn revisions (cap max_revisions, default 3); reject, human Reject, scope violations or exhausted revisions PARK the cycle (a Parked task with Resume with notes / Close). REQUIRES agent:dispatch:code. Duplicate protection: the same idempotency_key, or (keyless) the same briefs + paths on a live root, within 24 h is refused by the preflight as idempotency_replay (400, nothing queued, the existing root_id in the problem) and printed as DUPLICATE with that root_id; only a replay the preflight could not see (a race) comes back from the RPC as 200 created=false, printed the same way. Optional reviews[] attaches a multi-lens review panel (design item 14a) in place of the single OpenAI review — one review task mints per lens and every blocking lens must approve before the Decision task mints. Track with tascan_get_cycle_report (root_id). Nothing spawns a cycle on its own.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
kindNoCycle kind (default build). review_only = no model builds anything: T1 is "CAPTURE: <title>", a local-executor task that stores artifact_paths from the repo at HEAD as the bundle (same build_ref, size cap and scope check as a CODE build) and completes in seconds; T2 REVIEW then reviews that bundle. Use it to get an independent review of documents or of code already committed by hand. Stored as coord.kind_of_cycle on the root.
repoNoWhich codebase on the executor the build runs in — an alias from the executor's allowlist (tascan-agent/repos.json), e.g. "tascan" (default), "merchskipper", "inkskipper", "rangerlizzy", "cardvault", "take1", "fitcheck", "safegrid", "eternity", "maniacs". artifact_paths are relative to that repo. An unknown alias is refused by the executor (repo_unknown) and the cycle parks.
titleYesShort human title (1-200 chars). T1 becomes "CODE: <title>" ("CAPTURE: <title>" when kind=review_only), T2 "REVIEW: <title>".
dry_runNotrue = PREFLIGHT only: the API validates the whole dispatch and returns every problem at once (code, path, detail) plus the unchecked[] list (what only the executor / the RPC can decide) and warnings[] — nothing is queued, no idempotency key is consumed. Recommended before every real create. Default false.
reviewsNoOptional multi-lens review panel (design item 14a) instead of today's single OpenAI review_brief lens — 1-8 entries, each: {lens: slug matching ^[a-z][a-z0-9-]{0,39}$ unique per array (e.g. "code-correctness", "security", "ui-ux"), brief: 1-8000 chars of cycle-specific context for that lens, provider: "openai"|"anthropic"|"gemini", model?: 1-100 chars, blocking?: boolean (default true — at least one entry must be blocking or the whole array is refused), max_tool_calls?: integer (openai only)}. One REVIEW: task mints per lens, all blocked on T1; the Decision task mints only once every blocking lens has approved the same build. Omit for today's single OpenAI code review.
task_typeNoT1 prefix (default CODE). CAPTURE is never caller-settable: kind=review_only makes T1 "CAPTURE:" itself. With kind=review_only the value is sent as given — CODE is accepted (T1 is still CAPTURE), SHELL / RESEARCH are refused by the API as kind_invalid.
project_idYesWorking project (UUID). Its Decisions and Agent Questions lists are created on the first cycle (coord_ensure_lists). Requires the org human authority to be configured (coord_set_authority) — otherwise 403.
build_briefYesThe executor prompt (1-40000 chars). Executed verbatim by the local Claude Code runner as a CODE:/SHELL: task — write it as a complete instruction, name the files, forbid nothing the runner already forbids (deploy/commit/push are refused by its context).
preview_urlNoOptional https preview link shown on the Decision task.
review_briefYesThe reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref. Still required even when `reviews[]` is given (kept as T2's legacy description text).
revisable_byNoreview_only cycles only — who fixes a revise verdict. dispatcher (default): the cycle parks on revise as today and you re-dispatch. executor: a revise spawns a revision CAPTURE task (up to max_revisions) that is born blocked on a question task "Revise the documents, then answer to release" addressed to you — fix the files in the repo, answer that question (tascan_post_message kind=answer), and the capture re-runs on the fixed HEAD. Build cycles always revise through the executor regardless of this field.
max_questionsNoQuestions a runner may ask per task before the attempt fails (default 3).
max_revisionsNoRevision cap (default 3): at most max_revisions + 1 builds and reviews.
artifact_bytesNoOptional {path: bytes} for artifact_paths — the byte length of each file in your checkout. The API cannot read the repo, so artifact_over_cap (262144-byte reviewable cap per file) is only checked for paths you give a byte count; every other path is reported under unchecked (artifact_over_cap, unchecked_at_api) — never guessed from an earlier stored bundle. Same on dry_run and the real create.
artifact_pathsYesRepo-relative paths the build binds (1-64). Exactly these files are stored as the bundle and hashed into build_ref; files the executor touches OUTSIDE them fail the scope check and park the cycle. No .., not absolute, no drive letter, no backslash.
idempotency_keyNoOptional caller key (≤ 200 chars). The same key within 24 h is refused as idempotency_replay (nothing queued) and printed as DUPLICATE with the existing root_id — safe to retry after a lost answer.
integrate_titleNoOptional title template for the Integrate task (default "Integrate: <title>").
checkpoint_titleNoOptional title template for the Decision task (default "Decision: <title>").
max_cost_micro_usdNoPer-cycle spend cap summed over every attempt, in micro-USD (default 5000000 = USD 5). A claim that could overrun it is refused (budget_exhausted).
integrate_descriptionNoOptional description template for the Integrate task.
checkpoint_descriptionNoOptional description template for the Decision task; the build_ref, preview and findings summary are appended.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • addedInput schema / properties / artifact_bytes
      Added value: +{
      +  "additionalProperties": {
      +    "type": "integer"
      +  },
      +  "description": "Optional {path: bytes} for artifact_paths — the byte length of each file in your checkout. The API cannot read the repo, so artifact_over_cap (262144-byte reviewable cap per file) is only checked for paths you give a byte count; every other path is reported under unchecked (artifact_over_cap, unchecked_at_api) — never guessed from an earlier stored bundle. Same on dry_run and the real create.",
      +  "type": "object"
      +}
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "description": "true = PREFLIGHT only: the API validates the whole dispatch and returns every problem at once (code, path, detail) plus the unchecked[] list (what only the executor / the RPC can decide) and warnings[] — nothing is queued, no idempotency key is consumed. Recommended before every real create. Default false.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional caller key (≤ 200 chars). The same key within 24 h returns the existing cycle (created=false) instead of a duplicate dispatch."New value: +"Optional caller key (≤ 200 chars). The same key within 24 h is refused as idempotency_replay (nothing queued) and printed as DUPLICATE with the existing root_id — safe to retry after a lost answer."
    • addedInput schema / properties / kind
      Added value: +{
      +  "description": "Cycle kind (default build). review_only = no model builds anything: T1 is \"CAPTURE: <title>\", a local-executor task that stores artifact_paths from the repo at HEAD as the bundle (same build_ref, size cap and scope check as a CODE build) and completes in seconds; T2 REVIEW then reviews that bundle. Use it to get an independent review of documents or of code already committed by hand. Stored as coord.kind_of_cycle on the root.",
      +  "enum": [
      +    "build",
      +    "review_only"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / revisable_by
      Added value: +{
      +  "description": "review_only cycles only — who fixes a revise verdict. dispatcher (default): the cycle parks on revise as today and you re-dispatch. executor: a revise spawns a revision CAPTURE task (up to max_revisions) that is born blocked on a question task \"Revise the documents, then answer to release\" addressed to you — fix the files in the repo, answer that question (tascan_post_message kind=answer), and the capture re-runs on the fixed HEAD. Build cycles always revise through the executor regardless of this field.",
      +  "enum": [
      +    "dispatcher",
      +    "executor"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / task_type / description
      Previous value: -"T1 prefix (default CODE)."New value: +"T1 prefix (default CODE). CAPTURE is never caller-settable: kind=review_only makes T1 \"CAPTURE:\" itself. With kind=review_only the value is sent as given — CODE is accepted (T1 is still CAPTURE), SHELL / RESEARCH are refused by the API as kind_invalid."
    • changedInput schema / properties / task_type / enum
      Previous value: -[
      -  "CODE",
      -  "SHELL"
      -]New value: +[
      +  "CODE",
      +  "SHELL",
      +  "RESEARCH"
      +]
    • changedInput schema / properties / title / description
      Previous value: -"Short human title (1-200 chars). T1 becomes \"CODE: <title>\", T2 \"REVIEW: <title>\"."New value: +"Short human title (1-200 chars). T1 becomes \"CODE: <title>\" (\"CAPTURE: <title>\" when kind=review_only), T2 \"REVIEW: <title>\"."
  2. Changed2 schema fields changed
    • changedInput schema / properties / review_brief / description
      Previous value: -"The reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref."New value: +"The reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref. Still required even when `reviews[]` is given (kept as T2's legacy description text)."
    • addedInput schema / properties / reviews
      Added value: +{
      +  "description": "Optional multi-lens review panel (design item 14a) instead of today's single OpenAI review_brief lens — 1-8 entries, each: {lens: slug matching ^[a-z][a-z0-9-]{0,39}$ unique per array (e.g. \"code-correctness\", \"security\", \"ui-ux\"), brief: 1-8000 chars of cycle-specific context for that lens, provider: \"openai\"|\"anthropic\"|\"gemini\", model?: 1-100 chars, blocking?: boolean (default true — at least one entry must be blocking or the whole array is refused), max_tool_calls?: integer (openai only)}. One REVIEW: task mints per lens, all blocked on T1; the Decision task mints only once every blocking lens has approved the same build. Omit for today's single OpenAI code review.",
      +  "items": {
      +    "properties": {
      +      "blocking": {
      +        "description": "Default true. At least one entry in the array must be blocking.",
      +        "type": "boolean"
      +      },
      +      "brief": {
      +        "description": "Cycle-specific context for this lens (1-8000 chars).",
      +        "type": "string"
      +      },
      +      "lens": {
      +        "description": "Slug, ^[a-z][a-z0-9-]{0,39}$, unique in the array.",
      +        "type": "string"
      +      },
      +      "max_tool_calls": {
      +        "description": "Optional, provider openai only.",
      +        "type": "integer"
      +      },
      +      "model": {
      +        "description": "Optional, 1-100 chars.",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "enum": [
      +          "openai",
      +          "anthropic",
      +          "gemini"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "lens",
      +      "brief",
      +      "provider"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / review_brief / description
      Previous value: -"The reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref. Still required even when `reviews[]` is given (kept as T2's legacy description text)."New value: +"The reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref."
    • removedInput schema / properties / reviews
      Removed value: -{
      -  "description": "Optional multi-lens review panel (design item 14a) instead of today's single OpenAI review_brief lens — 1-8 entries, each: {lens: slug matching ^[a-z][a-z0-9-]{0,39}$ unique per array (e.g. \"code-correctness\", \"security\", \"ui-ux\"), brief: 1-8000 chars of cycle-specific context for that lens, provider: \"openai\"|\"anthropic\"|\"gemini\", model?: 1-100 chars, blocking?: boolean (default true — at least one entry must be blocking or the whole array is refused), max_tool_calls?: integer (openai only)}. One REVIEW: task mints per lens, all blocked on T1; the Decision task mints only once every blocking lens has approved the same build. Omit for today's single OpenAI code review.",
      -  "items": {
      -    "properties": {
      -      "blocking": {
      -        "description": "Default true. At least one entry in the array must be blocking.",
      -        "type": "boolean"
      -      },
      -      "brief": {
      -        "description": "Cycle-specific context for this lens (1-8000 chars).",
      -        "type": "string"
      -      },
      -      "lens": {
      -        "description": "Slug, ^[a-z][a-z0-9-]{0,39}$, unique in the array.",
      -        "type": "string"
      -      },
      -      "max_tool_calls": {
      -        "description": "Optional, provider openai only.",
      -        "type": "integer"
      -      },
      -      "model": {
      -        "description": "Optional, 1-100 chars.",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "enum": [
      -          "openai",
      -          "anthropic",
      -          "gemini"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "lens",
      -      "brief",
      -      "provider"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
  4. Changed2 schema fields changed
    • changedInput schema / properties / review_brief / description
      Previous value: -"The reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref."New value: +"The reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref. Still required even when `reviews[]` is given (kept as T2's legacy description text)."
    • addedInput schema / properties / reviews
      Added value: +{
      +  "description": "Optional multi-lens review panel (design item 14a) instead of today's single OpenAI review_brief lens — 1-8 entries, each: {lens: slug matching ^[a-z][a-z0-9-]{0,39}$ unique per array (e.g. \"code-correctness\", \"security\", \"ui-ux\"), brief: 1-8000 chars of cycle-specific context for that lens, provider: \"openai\"|\"anthropic\"|\"gemini\", model?: 1-100 chars, blocking?: boolean (default true — at least one entry must be blocking or the whole array is refused), max_tool_calls?: integer (openai only)}. One REVIEW: task mints per lens, all blocked on T1; the Decision task mints only once every blocking lens has approved the same build. Omit for today's single OpenAI code review.",
      +  "items": {
      +    "properties": {
      +      "blocking": {
      +        "description": "Default true. At least one entry in the array must be blocking.",
      +        "type": "boolean"
      +      },
      +      "brief": {
      +        "description": "Cycle-specific context for this lens (1-8000 chars).",
      +        "type": "string"
      +      },
      +      "lens": {
      +        "description": "Slug, ^[a-z][a-z0-9-]{0,39}$, unique in the array.",
      +        "type": "string"
      +      },
      +      "max_tool_calls": {
      +        "description": "Optional, provider openai only.",
      +        "type": "integer"
      +      },
      +      "model": {
      +        "description": "Optional, 1-100 chars.",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "enum": [
      +          "openai",
      +          "anthropic",
      +          "gemini"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "lens",
      +      "brief",
      +      "provider"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / repo
      Added value: +{
      +  "description": "Which codebase on the executor the build runs in — an alias from the executor's allowlist (tascan-agent/repos.json), e.g. \"tascan\" (default), \"merchskipper\", \"inkskipper\", \"rangerlizzy\", \"cardvault\", \"take1\", \"fitcheck\", \"safegrid\", \"eternity\", \"maniacs\". artifact_paths are relative to that repo. An unknown alias is refused by the executor (repo_unknown) and the cycle parks.",
      +  "type": "string"
      +}
  6. Added

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark read/write/idempotent/destructive hints; the description far exceeds that by disclosing side effects (minting tasks, parking cycles, revision limits), duplicate-prevention behavior, preflight limitations (unchecked[]), and error codes. No statement contradicts annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, but it is a single extremely dense paragraph with long parenthetical enumerations of validation codes and edge cases. It earns its place content-wise, yet poor visual structure makes it harder for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description covers side effects, preflight validation, failure modes, duplicate handling, revision/review behavior, optional panels, permissions, and tracking. A caller has the information needed to decide on dry_run versus a real create and to interpret the cycle afterward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies; the description largely repeats semantics already present in the schema (kind=review_only, dry_run, artifact_bytes, idempotency_key). It adds protocol-level context like build_ref sha256 and DUPLICATE root_id, but not enough new per-parameter meaning to rise above the high-coverage baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opening sentence names a specific verb and resource: 'Start an unattended build-review-decide cycle' and immediately spells out concrete behavior (queues T1 CODE:/T2 REVIEW:). This clearly distinguishes it from the many create_* and list_* siblings; it is unmistakably the cycle-creation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation context: dry_run performs a PREFLIGHT-only validation, a real run queues multiple tasks, and tracking is routed to tascan_get_cycle_report(root_id). It also states the required permission (REQUIRES agent:dispatch:code), though it does not explicitly enumerate when-not-to-use alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.