{
  "schema": "https://falsegreen.com/schemas/mcp-catalog/v1",
  "schema_version": 1,
  "provider": "FalseGreen",
  "protocol": "MCP",
  "documentation": "https://falsegreen.com/docs/mcp",
  "authority": {
    "repository": "truemagic-coder/falsegreen",
    "pull_request": 20,
    "commit_sha": "6f47ea32bbad9443134b1e1efd7394af7b724797",
    "export": "runtime MCP tools/list from rebuilt Rust client"
  },
  "runtime_tools_list_is_ultimate_authority": true,
  "tools": [
    {
      "name": "falsegreen_create_task",
      "category": "task",
      "description": "Register one bounded software task in an approved workspace.",
      "registered_description": "Register a new task.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "branch": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "commit_sha": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "goal": {
            "type": "string"
          },
          "pr_identifier": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "pr_number": {
            "default": null,
            "minimum": 1,
            "type": [
              "integer",
              "null"
            ]
          },
          "pr_url": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "repository": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "workspace": {
            "type": "string"
          }
        },
        "required": [
          "workspace",
          "goal"
        ],
        "type": "object"
      },
      "returns": "task_id, draft status, and the next planning-or-contract action.",
      "lifecycle": {
        "use_when": "No FalseGreen task is active and the work needs a new bounded acceptance scope.",
        "do_not_use_when": "A failed, unresolved, terminal, or Job-bound Task already represents the work.",
        "possible_next_tools": [
          "falsegreen_get_plan_schema",
          "falsegreen_get_contract_schema"
        ]
      },
      "idempotency_retry": "No public idempotency guarantee; list existing Tasks before retrying after an uncertain response.",
      "failure_behavior": "Rejects missing state, unapproved workspaces, malformed repository metadata, or task-capacity violations."
    },
    {
      "name": "falsegreen_get_plan_schema",
      "category": "planning",
      "description": "Return the live structured task-plan input schema.",
      "registered_description": "Get the structured task-plan schema used before contract drafting.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {},
        "type": "object"
      },
      "returns": "The current task-plan JSON Schema with server-owned fields identified.",
      "lifecycle": {
        "use_when": "A substantial Task needs an explicit outcome-oriented plan before contract drafting.",
        "do_not_use_when": "Do not invent plan fields from examples instead of using this live schema.",
        "possible_next_tools": [
          "falsegreen_save_plan_draft"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error if the schema cannot be produced."
    },
    {
      "name": "falsegreen_save_plan_draft",
      "category": "planning",
      "description": "Save an outcome-oriented plan revision for a Task.",
      "registered_description": "Save an explicit outcome-oriented task-plan revision.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "plan": {
            "type": "object"
          },
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id",
          "plan"
        ],
        "type": "object"
      },
      "returns": "task_id, plan_draft status, revision, work-item count, acceptance-condition count, and next action.",
      "lifecycle": {
        "use_when": "The agent has populated the live plan schema with dependencies, acceptance conditions, evidence, and omission risks.",
        "do_not_use_when": "The plan is frozen or contract drafting has made plan mutation invalid.",
        "possible_next_tools": [
          "falsegreen_validate_plan",
          "falsegreen_get_plan"
        ]
      },
      "idempotency_retry": "Saving creates a revision; inspect the current plan before retrying an uncertain write.",
      "failure_behavior": "Rejects invalid plan structure, Task identity, lifecycle state, or dependency relationships."
    },
    {
      "name": "falsegreen_validate_plan",
      "category": "planning",
      "description": "Validate the current plan draft and dependency graph.",
      "registered_description": "Validate the current task-plan draft and dependency graph.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id"
        ],
        "type": "object"
      },
      "returns": "Validation status and actionable plan errors.",
      "lifecycle": {
        "use_when": "A plan draft is ready to check before freezing.",
        "do_not_use_when": "There is no plan draft for the supplied Task.",
        "possible_next_tools": [
          "falsegreen_save_plan_draft",
          "falsegreen_freeze_plan"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry against the same draft.",
      "failure_behavior": "Returns validation errors or a tool error for a missing or inaccessible draft."
    },
    {
      "name": "falsegreen_freeze_plan",
      "category": "planning",
      "description": "Freeze the proposed plan so later mutation is rejected.",
      "registered_description": "Freeze the agent's proposed task plan before contract drafting.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id"
        ],
        "type": "object"
      },
      "returns": "task_id, plan_frozen status, revision, canonical digest, and next action.",
      "lifecycle": {
        "use_when": "The current plan validates and should become the immutable planning input to contract drafting.",
        "do_not_use_when": "The plan still has validation errors or requires revision.",
        "possible_next_tools": [
          "falsegreen_get_contract_schema",
          "falsegreen_save_contract_draft"
        ]
      },
      "idempotency_retry": "Freeze is a state transition; inspect the frozen plan before retrying an uncertain response.",
      "failure_behavior": "Rejects invalid, missing, or already-incompatible plan state."
    },
    {
      "name": "falsegreen_get_plan",
      "category": "planning",
      "description": "Return the current draft or frozen plan.",
      "registered_description": "Get the current draft or frozen task plan.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "frozen": {
            "default": true,
            "type": "boolean"
          },
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id"
        ],
        "type": "object"
      },
      "returns": "The requested structured plan, including its current revision and frozen digest when applicable.",
      "lifecycle": {
        "use_when": "The agent needs the authoritative plan revision and acceptance/evidence mapping.",
        "do_not_use_when": "Do not treat a draft plan as human-approved acceptance authority.",
        "possible_next_tools": [
          "falsegreen_save_plan_draft",
          "falsegreen_save_contract_draft"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error if the requested draft or frozen plan does not exist."
    },
    {
      "name": "falsegreen_save_contract_draft",
      "category": "acceptance",
      "description": "Save the draft definition of done and executable acceptance criteria.",
      "registered_description": "Draft acceptance criteria for a task.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "contract": {
            "type": "object"
          },
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id",
          "contract"
        ],
        "type": "object"
      },
      "returns": "task_id, contract_draft status, and criterion count.",
      "lifecycle": {
        "use_when": "The contract follows the live schema and maps required plan acceptance and evidence IDs.",
        "do_not_use_when": "The contract is frozen, or proposed metadata is inferred rather than supplied or observed.",
        "possible_next_tools": [
          "falsegreen_validate_contract",
          "falsegreen_get_contract"
        ]
      },
      "idempotency_retry": "Saving changes the draft; inspect the current contract before retrying an uncertain write.",
      "failure_behavior": "Rejects malformed criteria, invalid commands, plan-mapping gaps, or incompatible Task state."
    },
    {
      "name": "falsegreen_validate_contract",
      "category": "acceptance",
      "description": "Validate the current contract draft against source-independent policy and plan coverage.",
      "registered_description": "Validate the current contract draft.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "valid flag plus actionable contract and planning errors.",
      "lifecycle": {
        "use_when": "A contract draft is ready to check before freezing.",
        "do_not_use_when": "Do not interpret validation as acceptance or verification of the implementation.",
        "possible_next_tools": [
          "falsegreen_save_contract_draft",
          "falsegreen_freeze_contract"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry against the same draft.",
      "failure_behavior": "Returns validation errors or a tool error when Task, workspace, or draft state is unavailable."
    },
    {
      "name": "falsegreen_freeze_contract",
      "category": "acceptance",
      "description": "Freeze the definition of done and bind the Verification Job boundary.",
      "registered_description": "Freeze the contract (locks criteria + verifier).",
      "mutates_state": true,
      "entitlement_effect": "May bind or create Job state but does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "Frozen status, Verification Job identity, canonical contract/scope digests, criterion count, and next action.",
      "lifecycle": {
        "use_when": "The exact contract validates and the required human approval path has been satisfied.",
        "do_not_use_when": "The definition of done is unsettled; enforced authority requires the documented human CLI approval instead of agent self-approval.",
        "possible_next_tools": [
          "falsegreen_get_assignment"
        ]
      },
      "idempotency_retry": "Freeze is immutable; inspect current contract/assignment state before retrying an uncertain response.",
      "failure_behavior": "Rejects invalid drafts, lifecycle conflicts, missing authority, or agent freeze attempts when signed human approval is required."
    },
    {
      "name": "falsegreen_get_assignment",
      "category": "assignment",
      "description": "Return compact immutable requirements for the active frozen Task.",
      "registered_description": "Get compact immutable requirements for the active task.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "Goal, constraints, criteria, repair limit, optional frozen plan, assigned status, and session binding.",
      "lifecycle": {
        "use_when": "The coding agent is ready to implement against the frozen definition of done.",
        "do_not_use_when": "No contract is frozen, or the agent intends to reinterpret or replace the acceptance target.",
        "possible_next_tools": [
          "falsegreen_check_completion",
          "falsegreen_begin_implementation"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Rejects missing/ambiguous active Tasks or Tasks without a frozen contract."
    },
    {
      "name": "falsegreen_check_completion",
      "category": "verification",
      "description": "Run the compact independent completion workflow and return the controller decision.",
      "registered_description": "Run the independent verifier and get a completion decision.",
      "mutates_state": true,
      "entitlement_effect": "The first durable substantive verification may consume the bound Job entitlement; same-Job authorized repair and reverification never consume a second entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "Task status, run identity, repair authorization/budget, failures, authoritative report fields when ready, and next action.",
      "lifecycle": {
        "use_when": "Implementation or authorized repair is ready for full independent verification.",
        "do_not_use_when": "Do not call after an unrepairable infrastructure error, without an available paid Job, or to change the frozen target.",
        "possible_next_tools": [
          "falsegreen_get_verification_artifacts",
          "falsegreen_get_repair_feedback",
          "falsegreen_check_completion"
        ]
      },
      "idempotency_retry": "No explicit idempotency key; inspect status and artifacts before retrying after an uncertain response.",
      "failure_behavior": "May return job_required, queue/report infrastructure states, accepted, incomplete, unsafe, invalid, or error. Only repair when repair_authorized is true."
    },
    {
      "name": "falsegreen_get_status",
      "category": "status",
      "description": "Poll one durable run or return compact Task status.",
      "registered_description": "Poll a durable verification run by run_id, or get current task status.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "run_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "Run state when run_id is supplied; otherwise Task status, latest run, authority readiness, and repair budget.",
      "lifecycle": {
        "use_when": "A started run is queued/running, or the agent needs current Task and repair state.",
        "do_not_use_when": "Do not infer a final report from status alone when artifacts are available.",
        "possible_next_tools": [
          "falsegreen_get_status",
          "falsegreen_get_verification_artifacts",
          "falsegreen_get_repair_feedback"
        ]
      },
      "idempotency_retry": "Read-only and safe to poll; use the exact durable run_id.",
      "failure_behavior": "Rejects unknown or mismatched Task/run identities; queued/running is not a terminal verdict."
    },
    {
      "name": "falsegreen_get_verification_artifacts",
      "category": "evidence",
      "description": "Retrieve the source-bound attestation and immutable canonical report for a completed run.",
      "registered_description": "Retrieve the source-bound attestation and immutable server report. Return report_id, report_url, and verified_source_identity as issued; use server_generated_pr_summary verbatim and never create or alter a verdict representation.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "run_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "report_id, report_url, verified_source_identity, attestation/evidence, and server_generated_pr_summary to relay verbatim.",
      "lifecycle": {
        "use_when": "Every verification run with a run_id has completed, regardless of whether it was accepted.",
        "do_not_use_when": "Do not fabricate, rewrite, or summarize a FalseGreen verdict in place of server-issued fields.",
        "possible_next_tools": [
          "falsegreen_get_repair_feedback",
          "falsegreen_check_completion",
          "falsegreen_continue_verification_job"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry for the same completed run.",
      "failure_behavior": "Returns a tool error while the result/report is unavailable or when Task/run identity conflicts."
    },
    {
      "name": "falsegreen_get_terraform_result",
      "category": "terraform",
      "description": "Read the retained Terraform plan, provenance, apply authority, and deployed-outcome state.",
      "registered_description": "Read the controller-recorded Terraform plan, process provenance, apply-authorization state, and deployed outcome. An accepted plan never implies apply authorization.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume another Job entitlement.",
      "input_schema": {
        "properties": {
          "command_index": {
            "default": null,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "run_id": {
            "type": "string"
          },
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id",
          "run_id"
        ],
        "type": "object"
      },
      "returns": "Bounded Terraform plan evidence, provenance, authorization state, and deployment evidence for the selected command.",
      "lifecycle": {
        "use_when": "An opt-in Terraform criterion has completed and the agent needs to distinguish plan acceptance, apply authorization, and deployed outcome.",
        "do_not_use_when": "Do not treat an accepted plan as authority to apply or as proof of deployed behavior.",
        "possible_next_tools": [
          "falsegreen_get_terraform_apply_authorization_payload",
          "falsegreen_get_verification_artifacts"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry for the same run.",
      "failure_behavior": "Rejects runs without retained Terraform evidence or mismatched Task/run/command identity."
    },
    {
      "name": "falsegreen_get_terraform_apply_authorization_payload",
      "category": "terraform",
      "description": "Return the exact bounded Terraform apply payload a human must approve in enforced mode.",
      "registered_description": "Return the exact bounded apply-authorization payload for human signing in enforced mode. This does not authorize or start apply.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume another Job entitlement.",
      "input_schema": {
        "properties": {
          "command_index": {
            "default": null,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "run_id": {
            "type": "string"
          },
          "task_id": {
            "type": "string"
          },
          "valid_for_seconds": {
            "default": null,
            "maximum": 3600,
            "minimum": 60,
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "required": [
          "task_id",
          "run_id"
        ],
        "type": "object"
      },
      "returns": "The exact bounded approval payload and validity information; it does not authorize or start apply.",
      "lifecycle": {
        "use_when": "An accepted retained plan needs separate human apply authorization.",
        "do_not_use_when": "The plan is not accepted, evidence is incomplete, or the agent intends to self-authorize apply.",
        "possible_next_tools": [
          "falsegreen_authorize_terraform_apply"
        ]
      },
      "idempotency_retry": "Read-only; regenerate only when a fresh validity window is intentionally needed.",
      "failure_behavior": "Rejects non-accepted/mismatched plan evidence or invalid command/validity parameters."
    },
    {
      "name": "falsegreen_authorize_terraform_apply",
      "category": "terraform",
      "description": "Record one human authorization for the exact retained accepted Terraform plan.",
      "registered_description": "Explicitly authorize one use of the exact accepted plan. Requires actor=human and confirmed=true; records authority but does not start apply.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume another Job entitlement.",
      "input_schema": {
        "properties": {
          "actor": {
            "const": "human",
            "type": "string"
          },
          "approval": {
            "default": null,
            "type": [
              "object",
              "null"
            ]
          },
          "command_index": {
            "default": null,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "confirmed": {
            "const": true,
            "type": "boolean"
          },
          "run_id": {
            "type": "string"
          },
          "task_id": {
            "type": "string"
          },
          "valid_for_seconds": {
            "default": null,
            "maximum": 3600,
            "minimum": 60,
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "required": [
          "task_id",
          "run_id",
          "actor",
          "confirmed"
        ],
        "type": "object"
      },
      "returns": "Terraform status including the recorded authorization and next apply action.",
      "lifecycle": {
        "use_when": "A human has explicitly confirmed the exact bounded plan and supplied required approval material.",
        "do_not_use_when": "A coding agent must not impersonate the human actor or infer approval from plan acceptance.",
        "possible_next_tools": [
          "falsegreen_apply_authorized_terraform_plan"
        ]
      },
      "idempotency_retry": "Authorization is bounded and stateful; inspect Terraform status before retrying.",
      "failure_behavior": "Rejects actor other than human, missing confirmation, invalid approval, expired/mismatched plan, or duplicate authority use."
    },
    {
      "name": "falsegreen_apply_authorized_terraform_plan",
      "category": "terraform",
      "description": "Consume one authorization and apply only its exact retained Terraform plan.",
      "registered_description": "Consume one backend authorization and apply only its digest-bound retained plan binary; no arbitrary apply arguments are accepted.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume another Job entitlement; it consumes the separate one-use apply authorization.",
      "input_schema": {
        "properties": {
          "authorization_id": {
            "pattern": "^tfapply_[0-9a-f]{32}$",
            "type": "string"
          },
          "command_index": {
            "default": null,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "run_id": {
            "type": "string"
          },
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id",
          "run_id",
          "authorization_id"
        ],
        "type": "object"
      },
      "returns": "Updated Terraform state and verify_terraform_deployment as the next action.",
      "lifecycle": {
        "use_when": "A valid one-use authorization exists for the retained plan identity.",
        "do_not_use_when": "No authorization exists, it was already consumed, or arbitrary apply arguments/source changes are desired.",
        "possible_next_tools": [
          "falsegreen_verify_terraform_deployment",
          "falsegreen_get_terraform_result"
        ]
      },
      "idempotency_retry": "Not safe to retry blindly; inspect Terraform result because authorization is one-use.",
      "failure_behavior": "Rejects missing, expired, consumed, or identity-mismatched authorization and any plan/source drift."
    },
    {
      "name": "falsegreen_verify_terraform_deployment",
      "category": "terraform",
      "description": "Independently observe the outcome of an already applied Terraform plan.",
      "registered_description": "Independently refresh Terraform and observe the already applied LocalStack outcome, then return complete deployment evidence.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume another Job entitlement.",
      "input_schema": {
        "properties": {
          "command_index": {
            "default": null,
            "minimum": 0,
            "type": [
              "integer",
              "null"
            ]
          },
          "run_id": {
            "type": "string"
          },
          "task_id": {
            "type": "string"
          }
        },
        "required": [
          "task_id",
          "run_id"
        ],
        "type": "object"
      },
      "returns": "Updated deployed-outcome evidence and get_verification_artifacts as the next action.",
      "lifecycle": {
        "use_when": "The authorized apply completed and deployed behavior needs independent evidence.",
        "do_not_use_when": "Apply did not occur, plan evidence is incomplete, or deployment identity differs.",
        "possible_next_tools": [
          "falsegreen_get_terraform_result",
          "falsegreen_get_verification_artifacts"
        ]
      },
      "idempotency_retry": "Observation is stateful; inspect current Terraform result before retrying.",
      "failure_behavior": "Returns incomplete/error evidence when provider observation, provenance, or deployment preconditions cannot be established."
    },
    {
      "name": "falsegreen_get_attestation_verification_key",
      "category": "evidence",
      "description": "Return public verification material for independently checking issued attestations.",
      "registered_description": "Get public Ed25519 material for independent artifact verification.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {},
        "type": "object"
      },
      "returns": "Public Ed25519 verification material and its public identity metadata.",
      "lifecycle": {
        "use_when": "A customer or reviewer needs to validate a retained FalseGreen artifact.",
        "do_not_use_when": "Do not expect private signing material or use the public key to manufacture attestations.",
        "possible_next_tools": [
          "falsegreen_get_verification_artifacts"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error if public verification material is unavailable."
    },
    {
      "name": "falsegreen_get_repair_feedback",
      "category": "repair",
      "description": "Return compact demonstrated failures from the latest verification run.",
      "registered_description": "Get detailed failure feedback from the last verification run.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "Task/run status, bounded failure summaries, and repair instructions.",
      "lifecycle": {
        "use_when": "falsegreen_check_completion returned repair_authorized=true and more detail is needed.",
        "do_not_use_when": "Infrastructure/controller errors are not source repair targets; this tool does not grant repair authority.",
        "possible_next_tools": [
          "falsegreen_check_completion"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error if there is no applicable retained verification feedback."
    },
    {
      "name": "falsegreen_get_contract_schema",
      "category": "acceptance",
      "description": "Return the live acceptance-contract schema and verifier command policy.",
      "registered_description": "Get the live contract schema and verifier command policy. Ruby/Rails commands and binstubs are supported; Git is intentionally not an acceptance oracle.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {},
        "type": "object"
      },
      "returns": "The current contract JSON Schema plus public command-policy constraints.",
      "lifecycle": {
        "use_when": "The agent is preparing executable acceptance criteria for a Task.",
        "do_not_use_when": "Do not hardcode a stale contract schema or infer verifier authority from the repository.",
        "possible_next_tools": [
          "falsegreen_save_contract_draft"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error if the live schema cannot be produced."
    },
    {
      "name": "falsegreen_get_contract",
      "category": "acceptance",
      "description": "Return the full draft or frozen contract for debugging.",
      "registered_description": "Get the frozen contract for a task.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "frozen": {
            "default": true,
            "type": "boolean"
          },
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "The requested contract document and its criteria.",
      "lifecycle": {
        "use_when": "A developer or agent needs full contract details not present in the compact assignment.",
        "do_not_use_when": "Prefer falsegreen_get_assignment for normal implementation work; do not mutate frozen material.",
        "possible_next_tools": [
          "falsegreen_get_assignment",
          "falsegreen_validate_contract"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error if the requested contract state is missing or inaccessible."
    },
    {
      "name": "falsegreen_begin_implementation",
      "category": "lifecycle",
      "description": "Explicitly transition a frozen Task into implementation state.",
      "registered_description": "Transition task to implementing state.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "task_id and implementing status.",
      "lifecycle": {
        "use_when": "A lower-level integration needs the lifecycle transition before implementation.",
        "do_not_use_when": "Normal agents should prefer falsegreen_check_completion, which begins when needed.",
        "possible_next_tools": [
          "falsegreen_check_completion",
          "falsegreen_verify"
        ]
      },
      "idempotency_retry": "State transition; inspect current status before retrying.",
      "failure_behavior": "Rejects Tasks whose lifecycle state cannot enter implementation."
    },
    {
      "name": "falsegreen_continue_verification_job",
      "category": "paid_job_continuation",
      "description": "Prepare an exact-DoD successor Job after a terminal non-Accepted paid Job.",
      "registered_description": "After a terminal non-Accepted paid Job, create one new paid Job against the exact unchanged frozen definition of done and preserve its acceptance lineage.",
      "mutates_state": true,
      "entitlement_effect": "Prepares a successor without consuming it; the first durable verification requires and consumes a distinct available paid entitlement.",
      "input_schema": {
        "properties": {
          "predecessor_job_id": {
            "type": "string"
          }
        },
        "required": [
          "predecessor_job_id"
        ],
        "type": "object"
      },
      "returns": "continuation_ready status, successor Job/lineage identities, predecessor link, frozen digests, available Job count, entitlement_consumed=false, and next action.",
      "lifecycle": {
        "use_when": "The predecessor is terminal non-Accepted and work must continue against its exact unchanged frozen definition of done.",
        "do_not_use_when": "The predecessor remains repairable, the DoD changed materially, or the agent is trying to create an unlinked replacement Task.",
        "possible_next_tools": [
          "falsegreen_verify",
          "falsegreen_check_completion"
        ]
      },
      "idempotency_retry": "Do not retry blindly; inspect the lineage/status after an uncertain response.",
      "failure_behavior": "Rejects non-terminal predecessors, changed DoD, conflicting lineage identity, invalid ownership, missing retained history, or malformed predecessor identity."
    },
    {
      "name": "falsegreen_verify",
      "category": "verification",
      "description": "Durably start full verification or a focused diagnostic criterion run and return immediately.",
      "registered_description": "Durably start full verification, or diagnostic verification of selected frozen criteria, and return immediately.",
      "mutates_state": true,
      "entitlement_effect": "The first durable substantive full verification may consume the bound Job entitlement; focused diagnostics cannot accept, and same-Job reverification never consumes a second entitlement.",
      "input_schema": {
        "properties": {
          "criterion_ids": {
            "default": null,
            "items": {
              "type": "string"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "idempotency_key": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "Durable run identity, queued/running state, next polling action, and may_claim_complete=false.",
      "lifecycle": {
        "use_when": "A lower-level integration needs a durable run_id and explicit polling; criterion_ids are diagnostic only.",
        "do_not_use_when": "Do not treat a focused run as acceptance or retry an invalid/error run as source repair.",
        "possible_next_tools": [
          "falsegreen_get_status",
          "falsegreen_get_verification_artifacts"
        ]
      },
      "idempotency_retry": "Reuse the same idempotency_key when retrying a start whose response may have been lost; the durable run is reused.",
      "failure_behavior": "May fail closed with job_required/job_refused, queue capacity, report delivery, authority mismatch, or invalid lifecycle/source state before substantive verification."
    },
    {
      "name": "falsegreen_consume_repair_cycle",
      "category": "repair",
      "description": "Consume one low-level repair-cycle authorization boundary.",
      "registered_description": "Consume a repair cycle.",
      "mutates_state": true,
      "entitlement_effect": "Consumes repair budget only; it never consumes a second Job entitlement during same-Job repair.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "The remaining repair-cycle count.",
      "lifecycle": {
        "use_when": "A specialized integration is explicitly instructed to consume a cycle outside the compact completion workflow.",
        "do_not_use_when": "falsegreen_check_completion already handled authorization, or the failure is invalid, infrastructure-related, or not repair-authorized.",
        "possible_next_tools": [
          "falsegreen_get_repair_feedback",
          "falsegreen_check_completion"
        ]
      },
      "idempotency_retry": "Not idempotent; never retry blindly because each successful call consumes a cycle.",
      "failure_behavior": "Rejects exhausted budgets, invalid lifecycle state, or a failure that is not eligible for repair."
    },
    {
      "name": "falsegreen_mark_unresolved",
      "category": "lifecycle",
      "description": "Record that the Task cannot currently be resolved, with an explicit reason.",
      "registered_description": "Mark the task as unresolved with a reason.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "reason": {
            "type": "string"
          },
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "returns": "task_id and unresolved status.",
      "lifecycle": {
        "use_when": "Required evidence, access, or environment prevents completion and source repair is not justified.",
        "do_not_use_when": "Do not use it to disguise a demonstrated failure, claim acceptance, or escape Job history.",
        "possible_next_tools": [
          "falsegreen_get_status",
          "falsegreen_get_verification_artifacts"
        ]
      },
      "idempotency_retry": "State mutation; inspect status before retrying.",
      "failure_behavior": "Rejects empty/oversized reasons or incompatible Task state."
    },
    {
      "name": "falsegreen_close_task",
      "category": "lifecycle",
      "description": "Close only a stale non-Accepted Task that never entered Verification Job authority.",
      "registered_description": "Close a stale unbound task that never entered Verification Job authority; Job-bound tasks must be preserved.",
      "mutates_state": true,
      "entitlement_effect": "Does not consume or restore a Job entitlement; Job-bound Tasks cannot be closed by the agent.",
      "input_schema": {
        "properties": {
          "reason": {
            "type": "string"
          },
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "returns": "task_id, previous status, abandoned status, and create_task as the next action.",
      "lifecycle": {
        "use_when": "falsegreen_list_tasks reports can_close=true for an obsolete unbound Task.",
        "do_not_use_when": "A Task is Job-bound, verifying, accepted, or being replaced to escape paid Job or acceptance history.",
        "possible_next_tools": [
          "falsegreen_list_tasks",
          "falsegreen_create_task"
        ]
      },
      "idempotency_retry": "State transition; list Tasks before retrying.",
      "failure_behavior": "Rejects Job-bound, active-verification, accepted, unknown, or otherwise non-closeable Tasks."
    },
    {
      "name": "falsegreen_list_tasks",
      "category": "task",
      "description": "List compact Task lifecycle state and closeability.",
      "registered_description": "List compact task lifecycle state and which stale unbound tasks can be closed.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {},
        "type": "object"
      },
      "returns": "Task entries with task_id, status, can_close, goal, and latest_run_id.",
      "lifecycle": {
        "use_when": "The agent needs to discover existing Tasks before creating, closing, or recovering work.",
        "do_not_use_when": "Do not infer acceptance from list state; retrieve status and artifacts for authoritative results.",
        "possible_next_tools": [
          "falsegreen_get_status",
          "falsegreen_close_task",
          "falsegreen_get_assignment"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error if protected Task state is unavailable."
    },
    {
      "name": "falsegreen_get_audit_summary",
      "category": "evidence",
      "description": "Return the Task audit-chain validity and public event summary.",
      "registered_description": "Get audit summary for a task.",
      "mutates_state": false,
      "entitlement_effect": "Does not consume a Job entitlement.",
      "input_schema": {
        "properties": {
          "task_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "returns": "task_id, audit validity, and ordered event sequence/type/hash entries.",
      "lifecycle": {
        "use_when": "A developer is debugging lifecycle history or checking retained event-chain integrity.",
        "do_not_use_when": "Do not use audit events as a substitute for the canonical verification report.",
        "possible_next_tools": [
          "falsegreen_get_status",
          "falsegreen_get_verification_artifacts"
        ]
      },
      "idempotency_retry": "Read-only and safe to retry.",
      "failure_behavior": "Returns a tool error for an unavailable Task or protected audit state."
    }
  ]
}
