application · active

Topolo Forecast

Cash-flow and P&L forecasting product.

Documentation map

  • Topolo Forecast — Public overview of the forecasting product for cash-flow, P&L, KPI, and multi-scenario planning workflows.

Authority and runtime

System ID
topolo-forecast
App IDs
app_topolo_forecast
Owners
finance-platform
Repositories
apps/TopoloForecast
Hosts
https://forecast.topolo.app, https://forecast-api.stg.topolo.us, https://forecast.stg.topolo.us
Dependencies
topolo-auth, topolo-one, applications-packages

Security and data ownership

Risk tier
standard
Tenant isolation
organization_scoped
Privacy classification
restricted
Storage
d1, external_provider, kv
Export and deletion
planned
Enterprise ready
no

Source-derived capability inventory

Source revisions: apps/TopoloForecast@e1e2cb0fb630c8da1d3fc157c568b6ec072ccc7a

Declared actions: 52 · API routes: 62 · UI routes: 18

{
  "id": "topolo-forecast",
  "name": "Topolo Forecast",
  "slug": "topolo-forecast",
  "kind": "application",
  "visibility": "public",
  "repo_paths": [
    "apps/TopoloForecast"
  ],
  "source_revisions": [
    {
      "source_path": "apps/TopoloForecast",
      "repository": "apps/TopoloForecast",
      "revision": "e1e2cb0fb630c8da1d3fc157c568b6ec072ccc7a",
      "ref": "origin/staging"
    }
  ],
  "source_counts": {
    "source_files": 188,
    "test_files": 91,
    "test_cases": 0,
    "migration_files": 0,
    "database_tables": 0,
    "manifests": 1,
    "deploy_targets": 2,
    "actions": 52,
    "mobile_contracts": 1,
    "notifications": 6,
    "package_manifests": 6,
    "deployment_configs": 0
  },
  "manifests": [
    {
      "source_path": "apps/TopoloForecast/topolo.app.json",
      "service_slug": "topolo-forecast",
      "name": "topolo-forecast",
      "app_id": "app_topolo_forecast",
      "compatibility_date": "2026-04-10",
      "primary_target": null,
      "environments": [
        "development",
        "production",
        "staging"
      ],
      "targets": [
        {
          "name": "web",
          "kind": "worker",
          "directory": "apps/web",
          "main": "src/worker.ts",
          "worker_name": "topolo-forecast",
          "subdomain": "forecast",
          "healthcheck_path": null,
          "variable_names": [
            "AUTH_API_URL",
            "INSIGHTS_SITE_KEY"
          ],
          "secret_names": [],
          "bindings": [
            {
              "kind": "services",
              "binding": "API",
              "target": null
            }
          ]
        },
        {
          "name": "api",
          "kind": "worker",
          "directory": "apps/api",
          "main": "src/index.ts",
          "worker_name": "topolo-forecast-api",
          "subdomain": null,
          "healthcheck_path": "/health",
          "variable_names": [
            "APP_ID",
            "AUTH_BASE_URL",
            "ENVIRONMENT",
            "FORECAST_PUBLIC_BASE_URL",
            "NEXUS_GATEWAY_URL",
            "SERVICE_NAME",
            "SERVICE_SLUG",
            "TOPOLO_NOTIFY_URL",
            "TOPOLO_SEED_APP_ID"
          ],
          "secret_names": [],
          "bindings": [
            {
              "kind": "d1",
              "binding": "FORECAST_CONTROL_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "FORECAST_PLAN_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "FORECAST_CASH_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "FORECAST_ACCESS_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "FORECAST_AUDIT_DB",
              "target": null
            },
            {
              "kind": "kv",
              "binding": "FS_CACHE",
              "target": null
            },
            {
              "kind": "durableObjects",
              "binding": "CACHE_STORE",
              "target": null
            }
          ]
        }
      ],
      "notifications": [
        "forecast.cash_threshold_breached",
        "forecast.import.completed",
        "forecast.import.failed",
        "forecast.scenario.ready",
        "forecast.schedule_rule.due",
        "forecast.share.invited"
      ],
      "notification_contract": {
        "source_path": "topolo.notification-contracts.json",
        "role": "producer",
        "schema_version": 1,
        "owner_app_id": "app_topolo_forecast",
        "events": [
          {
            "type": "forecast.cash_threshold_breached",
            "version": 1,
            "description": "Forecast durably recorded a transition below a configured cash threshold.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "balance_cents",
                "threshold_cents",
                "severity",
                "occurred_at",
                "cta_url"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "balance_cents": {
                  "type": "integer"
                },
                "threshold_cents": {
                  "type": "integer"
                },
                "severity": {
                  "type": "string",
                  "enum": [
                    "low",
                    "critical"
                  ]
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Critical cash threshold breached",
                "body": "Available cash is $500.00 against the $1,000.00 threshold.",
                "object_id": "workspace_1",
                "balance_cents": 50000,
                "threshold_cents": 100000,
                "severity": "critical",
                "occurred_at": "2026-07-20T00:00:00.000Z",
                "cta_url": "https://forecast.topolo.app/cash"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "balance_cents",
              "threshold_cents"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^forecast:cash-threshold:"
            }
          },
          {
            "type": "forecast.import.completed",
            "version": 1,
            "description": "A bounded forecast import and its terminal completed job were committed atomically.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "import_id",
                "scenario_id",
                "status",
                "row_count",
                "occurred_at",
                "cta_url"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "import_id": {
                  "type": "string",
                  "minLength": 1
                },
                "scenario_id": {
                  "type": "string",
                  "minLength": 1
                },
                "status": {
                  "type": "string",
                  "const": "completed"
                },
                "row_count": {
                  "type": "integer",
                  "minimum": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Forecast import completed",
                "body": "24 forecast rows were imported.",
                "object_id": "forecast_import_1",
                "import_id": "forecast_import_1",
                "scenario_id": "scenario_1",
                "status": "completed",
                "row_count": 24,
                "occurred_at": "2026-07-20T00:00:00.000Z",
                "cta_url": "https://forecast.topolo.app/imports/forecast_import_1"
              }
            ],
            "dataClassification": "internal",
            "sensitiveFields": [],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^forecast:import-completed:"
            }
          },
          {
            "type": "forecast.import.failed",
            "version": 1,
            "description": "A rejected forecast import was persisted as a terminal failed job.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "import_id",
                "scenario_id",
                "status",
                "row_count",
                "error",
                "occurred_at",
                "cta_url"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "import_id": {
                  "type": "string",
                  "minLength": 1
                },
                "scenario_id": {
                  "type": "string",
                  "minLength": 1
                },
                "status": {
                  "type": "string",
                  "const": "failed"
                },
                "row_count": {
                  "type": "integer",
                  "const": 0
                },
                "error": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Forecast import failed",
                "body": "Import must contain between 1 and 500 entries.",
                "object_id": "forecast_import_2",
                "import_id": "forecast_import_2",
                "scenario_id": "scenario_1",
                "status": "failed",
                "row_count": 0,
                "error": "Import must contain between 1 and 500 entries.",
                "occurred_at": "2026-07-20T00:00:00.000Z",
                "cta_url": "https://forecast.topolo.app/imports/forecast_import_2"
              }
            ],
            "dataClassification": "internal",
            "sensitiveFields": [
              "error"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^forecast:import-failed:"
            }
          },
          {
            "type": "forecast.scenario.ready",
            "version": 1,
            "description": "A new forecast scenario and its ready notification were committed atomically.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "scenario_id",
                "scenario_name",
                "base_scenario_id",
                "status",
                "occurred_at",
                "cta_url"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "scenario_id": {
                  "type": "string",
                  "minLength": 1
                },
                "scenario_name": {
                  "type": "string",
                  "minLength": 1
                },
                "base_scenario_id": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "status": {
                  "type": "string",
                  "const": "ready"
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Forecast scenario is ready",
                "body": "FY27 plan is ready for planning.",
                "object_id": "scenario_1",
                "scenario_id": "scenario_1",
                "scenario_name": "FY27 plan",
                "base_scenario_id": null,
                "status": "ready",
                "occurred_at": "2026-07-20T00:00:00.000Z",
                "cta_url": "https://forecast.topolo.app/scenarios/scenario_1"
              }
            ],
            "dataClassification": "internal",
            "sensitiveFields": [],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^forecast:scenario-ready:"
            }
          },
          {
            "type": "forecast.schedule_rule.due",
            "version": 1,
            "description": "A due schedule-rule delivery was claimed once and persisted with its notification.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "rule_id",
                "rule_name",
                "scenario_id",
                "coa_id",
                "amount_cents",
                "due_date",
                "occurred_at",
                "cta_url"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "rule_id": {
                  "type": "string",
                  "minLength": 1
                },
                "rule_name": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "scenario_id": {
                  "type": "string",
                  "minLength": 1
                },
                "coa_id": {
                  "type": "string",
                  "minLength": 1
                },
                "amount_cents": {
                  "type": "integer"
                },
                "due_date": {
                  "type": "string",
                  "format": "date"
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Forecast schedule rule is due",
                "body": "Monthly payroll is due today.",
                "object_id": "rule_1",
                "rule_id": "rule_1",
                "rule_name": "Monthly payroll",
                "scenario_id": "scenario_1",
                "coa_id": "coa_payroll",
                "amount_cents": -2500000,
                "due_date": "2026-07-20",
                "occurred_at": "2026-07-20T00:00:00.000Z",
                "cta_url": "https://forecast.topolo.app/schedule-rules"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "amount_cents"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^forecast:schedule-rule-due:"
            }
          },
          {
            "type": "forecast.share.invited",
            "version": 1,
            "description": "A workspace member was durably attached to a newly created Forecast share.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "share_id",
                "share_name",
                "invited_by_user_id",
                "permission_level",
                "occurred_at",
                "cta_url"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "share_id": {
                  "type": "string",
                  "minLength": 1
                },
                "share_name": {
                  "type": "string",
                  "minLength": 1
                },
                "invited_by_user_id": {
                  "type": "string",
                  "minLength": 1
                },
                "permission_level": {
                  "type": "string",
                  "enum": [
                    "read",
                    "collaborate"
                  ]
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Forecast share invitation",
                "body": "Alex invited you to Board pack.",
                "object_id": "share_1",
                "share_id": "share_1",
                "share_name": "Board pack",
                "invited_by_user_id": "user_alex",
                "permission_level": "read",
                "occurred_at": "2026-07-20T00:00:00.000Z",
                "cta_url": "https://forecast.topolo.app/shared/token"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "cta_url"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^forecast:share-invited:"
            }
          }
        ]
      },
      "actions": [
        {
          "name": "widget.get",
          "title": "Get widget summary",
          "description": "Get the TopoloOne widget summary for this service.",
          "method": "GET",
          "path": "/api/widget",
          "permission": "dashboard:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/widget",
              "body": null
            },
            "effects": "Reads state through GET /api/widget without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/widget",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "coa.get",
          "title": "Get chart of accounts",
          "description": "Get Forecast chart of accounts.",
          "method": "GET",
          "path": "/api/v1/{workspace}/coa",
          "permission": "forecasts:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get chart of accounts.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/coa",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/coa without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/coa",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspaces.set_active_scenario",
          "title": "Set active scenario",
          "description": "Set the active Forecast workspace scenario.",
          "method": "PATCH",
          "path": "/api/v1/workspaces/{id}/active-scenario",
          "permission": "workspace:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "scenarioId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id",
              "scenarioId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Set active scenario.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "id": "00000000-0000-4000-8000-000000000000",
              "scenarioId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/workspaces/00000000-0000-4000-8000-000000000000/active-scenario",
              "body": {
                "id": "00000000-0000-4000-8000-000000000000",
                "scenarioId": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/workspaces/{id}/active-scenario. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/workspaces/*/active-scenario",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspaces.delete",
          "title": "Delete workspace",
          "description": "Delete a Forecast workspace.",
          "method": "DELETE",
          "path": "/api/v1/workspaces/{id}",
          "permission": "workspace:delete",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Delete workspace.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "id": "00000000-0000-4000-8000-000000000000"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/workspaces/00000000-0000-4000-8000-000000000000",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/workspaces/{id}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/workspaces/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspace_shares.list",
          "title": "List workspace shares",
          "description": "List Forecast workspace shares.",
          "method": "GET",
          "path": "/api/v1/workspaces/{workspaceId}/shares",
          "permission": "forecasts:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspaceId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List workspace shares.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/workspaces/example/shares",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/workspaces/{workspaceId}/shares without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/workspaces/*/shares",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspace_shares.create",
          "title": "Create workspace share",
          "description": "Create a Forecast workspace share.",
          "method": "POST",
          "path": "/api/v1/workspaces/{workspaceId}/shares",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "permission_level": {
                "type": "string",
                "enum": [
                  "read",
                  "collaborate"
                ]
              },
              "expires_at": {
                "type": "string",
                "minLength": 1
              },
              "max_accesses": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "recipient_user_id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspaceId",
              "name"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create workspace share.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "name": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/workspaces/example/shares",
              "body": {
                "workspaceId": "example",
                "name": "example"
              }
            },
            "effects": "May change state through POST /api/v1/workspaces/{workspaceId}/shares. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/workspaces/*/shares",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspace_shares.update",
          "title": "Update workspace share",
          "description": "Update a Forecast workspace share.",
          "method": "PATCH",
          "path": "/api/v1/workspaces/{workspaceId}/shares/{shareId}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "shareId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "permission_level": {
                "type": "string",
                "enum": [
                  "read",
                  "collaborate"
                ]
              },
              "is_active": {
                "type": "boolean"
              },
              "expires_at": {
                "type": "string",
                "minLength": 1
              },
              "max_accesses": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "workspaceId",
              "shareId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update workspace share.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "shareId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/workspaces/example/shares/example",
              "body": {
                "workspaceId": "example",
                "shareId": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/workspaces/{workspaceId}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/workspaces/*/shares/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspace_shares.delete",
          "title": "Delete workspace share",
          "description": "Delete a Forecast workspace share.",
          "method": "DELETE",
          "path": "/api/v1/workspaces/{workspaceId}/shares/{shareId}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "shareId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspaceId",
              "shareId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Delete workspace share.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "shareId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/workspaces/example/shares/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/workspaces/{workspaceId}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/workspaces/*/shares/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "share_settings.get",
          "title": "Get share settings",
          "description": "Get Forecast workspace share settings.",
          "method": "GET",
          "path": "/api/v1/workspaces/{workspaceId}/share-settings",
          "permission": "settings:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspaceId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get share settings.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/workspaces/example/share-settings",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/workspaces/{workspaceId}/share-settings without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/workspaces/*/share-settings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "share_settings.update",
          "title": "Update share settings",
          "description": "Update Forecast workspace share settings.",
          "method": "PATCH",
          "path": "/api/v1/workspaces/{workspaceId}/share-settings",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "sharing_enabled": {
                "type": "boolean"
              },
              "default_permission_level": {
                "type": "string",
                "enum": [
                  "read",
                  "collaborate"
                ]
              },
              "default_expiry_days": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_active_shares": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "require_password": {
                "type": "boolean"
              },
              "allowed_domains": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "custom_branding_enabled": {
                "type": "boolean"
              },
              "custom_logo_url": {
                "type": "string",
                "minLength": 1
              },
              "custom_title": {
                "type": "string",
                "minLength": 1
              },
              "custom_description": {
                "type": "string",
                "minLength": 1
              },
              "analytics_enabled": {
                "type": "boolean"
              }
            },
            "required": [
              "workspaceId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update share settings.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/workspaces/example/share-settings",
              "body": {
                "workspaceId": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/workspaces/{workspaceId}/share-settings. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/workspaces/*/share-settings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "scenarios.list",
          "title": "List scenarios",
          "description": "List Forecast scenarios.",
          "method": "GET",
          "path": "/api/v1/{workspace}/scenarios",
          "permission": "forecasts:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List scenarios.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/scenarios",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/scenarios without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/scenarios",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "scenarios.create",
          "title": "Create scenario",
          "description": "Create a Forecast scenario in a platform-authorized workspace, including the first scenario for a newly created workspace.",
          "method": "POST",
          "path": "/api/v1/{workspace}/scenarios",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "base_scenario_id": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "workspace",
              "name"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Created Forecast scenario.",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "minLength": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1
                  },
                  "workspace_id": {
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "id",
                  "name",
                  "workspace_id"
                ],
                "additionalProperties": true
              },
              "message": {
                "type": "string"
              }
            },
            "required": [
              "success",
              "data"
            ],
            "additionalProperties": true
          },
          "agentContract": {
            "docsUrl": "https://docs.topolo.app/applications/forecast",
            "resource": {
              "kind": "scenario",
              "idPath": "$.data.id"
            },
            "effects": [
              "Creates a planning scenario in the selected platform-authorized Forecast workspace. This is the bootstrap action for a newly created workspace."
            ],
            "errors": [
              {
                "status": 403,
                "code": "action_permission_required",
                "recovery": "Use a credential with forecasts:write access to the selected Forecast workspace."
              }
            ],
            "verify": [
              "Call scenarios.list with the same workspace and confirm the returned list contains $.data.id and the requested name."
            ],
            "nextActionIds": [
              "app_topolo_forecast.scenarios.list",
              "app_topolo_forecast.coa.create",
              "app_topolo_forecast.cash_accounts.create"
            ],
            "examples": [
              {
                "title": "Create the base operating plan",
                "input": {
                  "workspace": "ws_forecast_northstar",
                  "name": "Northstar FY27 Base Plan"
                }
              }
            ],
            "recovery": {
              "mode": "compensating_action",
              "actionId": "app_topolo_forecast.scenarios.delete",
              "requiresSnapshot": false,
              "instructions": "Archive the created scenario only after confirming no dependent planning data should be retained."
            }
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "ws_forecast_northstar",
              "name": "Northstar FY27 Base Plan"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/ws_forecast_northstar/scenarios",
              "body": {
                "workspace": "ws_forecast_northstar",
                "name": "Northstar FY27 Base Plan"
              }
            },
            "effects": "Creates a planning scenario in the selected platform-authorized Forecast workspace. This is the bootstrap action for a newly created workspace.",
            "verification": [
              "Call scenarios.list with the same workspace and confirm the returned list contains $.data.id and the requested name."
            ],
            "recovery": [
              {
                "mode": "compensating_action",
                "actionId": "app_topolo_forecast.scenarios.delete",
                "requiresSnapshot": false,
                "instructions": "Archive the created scenario only after confirming no dependent planning data should be retained."
              },
              "403 action_permission_required: Use a credential with forecasts:write access to the selected Forecast workspace."
            ],
            "docs_url": "https://docs.topolo.app/applications/forecast",
            "resource": {
              "kind": "scenario",
              "idPath": "$.data.id"
            },
            "next_action_ids": [
              "app_topolo_forecast.scenarios.list",
              "app_topolo_forecast.coa.create",
              "app_topolo_forecast.cash_accounts.create"
            ],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/scenarios",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "scenarios.update",
          "title": "Update scenario",
          "description": "Update a Forecast scenario.",
          "method": "PATCH",
          "path": "/api/v1/{workspace}/scenarios/{scenarioId}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "scenarioId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "archived": {
                "type": "boolean"
              }
            },
            "required": [
              "workspace",
              "scenarioId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update scenario.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "scenarioId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/example/scenarios/example",
              "body": {
                "workspace": "example",
                "scenarioId": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/{workspace}/scenarios/{scenarioId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/*/scenarios/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "scenarios.duplicate",
          "title": "Duplicate scenario",
          "description": "Duplicate a Forecast scenario.",
          "method": "POST",
          "path": "/api/v1/{workspace}/scenarios/{scenarioId}/duplicate",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "scenarioId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "scenarioId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Duplicate scenario.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "scenarioId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/scenarios/example/duplicate",
              "body": {
                "workspace": "example",
                "scenarioId": "example"
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/scenarios/{scenarioId}/duplicate. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/scenarios/*/duplicate",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "scenarios.delete",
          "title": "Delete scenario",
          "description": "Delete a Forecast scenario.",
          "method": "DELETE",
          "path": "/api/v1/{workspace}/scenarios/{scenarioId}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "scenarioId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "scenarioId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Delete scenario.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "scenarioId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/example/scenarios/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/{workspace}/scenarios/{scenarioId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/*/scenarios/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "coa.create",
          "title": "Create chart account",
          "description": "Create a Forecast chart of accounts entry.",
          "method": "POST",
          "path": "/api/v1/{workspace}/coa",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "type": {
                "type": "string",
                "enum": [
                  "income",
                  "cos",
                  "opex",
                  "calc"
                ]
              },
              "trend_factor": {
                "type": "number"
              },
              "parentId": {
                "type": "string",
                "minLength": 1
              },
              "order_index": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "workspace",
              "name",
              "type"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create chart account.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "name": "example",
              "type": "income"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/coa",
              "body": {
                "workspace": "example",
                "name": "example",
                "type": "income"
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/coa. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/coa",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "coa.update",
          "title": "Update chart account",
          "description": "Update a Forecast chart of accounts entry.",
          "method": "PATCH",
          "path": "/api/v1/{workspace}/coa/{id}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "id": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "type": {
                "type": "string",
                "enum": [
                  "income",
                  "cos",
                  "opex",
                  "calc"
                ]
              },
              "trend_factor": {
                "type": "number",
                "minimum": -10,
                "maximum": 10
              },
              "parentId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "id"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update chart account.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "id": "00000000-0000-4000-8000-000000000000"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/example/coa/00000000-0000-4000-8000-000000000000",
              "body": {
                "workspace": "example",
                "id": "00000000-0000-4000-8000-000000000000"
              }
            },
            "effects": "May change state through PATCH /api/v1/{workspace}/coa/{id}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/*/coa/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "coa.delete",
          "title": "Delete chart account",
          "description": "Delete a Forecast chart of accounts entry.",
          "method": "DELETE",
          "path": "/api/v1/{workspace}/coa/{id}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "id": {
                "type": "string",
                "minLength": 1
              },
              "force": {
                "type": "boolean"
              }
            },
            "required": [
              "workspace",
              "id"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Delete chart account.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "id": "00000000-0000-4000-8000-000000000000"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/example/coa/00000000-0000-4000-8000-000000000000",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/{workspace}/coa/{id}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/*/coa/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "daily.get",
          "title": "Get daily entries",
          "description": "Get Forecast daily entries for a period.",
          "method": "GET",
          "path": "/api/v1/{workspace}/daily/{period}",
          "permission": "transactions:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}$"
              }
            },
            "required": [
              "workspace",
              "period"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get daily entries.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "period": "2026-01"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/daily/2026-01",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/daily/{period} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/daily/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "daily.annual.get",
          "title": "Get annual daily entries",
          "description": "Get Forecast daily entries for a year.",
          "method": "GET",
          "path": "/api/v1/{workspace}/daily/annual/{year}",
          "permission": "transactions:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "year": {
                "type": "string",
                "pattern": "^\\d{4}$"
              }
            },
            "required": [
              "workspace",
              "year"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get annual daily entries.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "year": "2026"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/daily/annual/2026",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/daily/annual/{year} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/daily/annual/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "daily.upsert",
          "title": "Upsert daily entry",
          "description": "Upsert a Forecast daily entry.",
          "method": "PUT",
          "path": "/api/v1/{workspace}/daily",
          "permission": "transactions:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "coaId": {
                "type": "string",
                "minLength": 1
              },
              "date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "amountCents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "isActual": {
                "type": "boolean"
              },
              "note": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "coaId",
              "date",
              "amountCents"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Upsert daily entry.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "coaId": "example",
              "date": "2026-01-01",
              "amountCents": 1
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PUT",
              "path": "/api/v1/example/daily",
              "body": {
                "workspace": "example",
                "coaId": "example",
                "date": "2026-01-01",
                "amountCents": 1
              }
            },
            "effects": "May change state through PUT /api/v1/{workspace}/daily. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PUT /api/v1/*/daily",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "daily.bulk_upsert",
          "title": "Bulk upsert daily entries",
          "description": "Bulk upsert Forecast daily entries.",
          "method": "PUT",
          "path": "/api/v1/{workspace}/daily/bulk",
          "permission": "transactions:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "entries": {
                "minItems": 1,
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "coaId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "date": {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                    },
                    "amountCents": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "isActual": {
                      "type": "boolean"
                    },
                    "note": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "coaId",
                    "date",
                    "amountCents"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "workspace",
              "entries"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Bulk upsert daily entries.",
            "additionalProperties": true
          },
          "agentContract": {
            "docsUrl": "https://docs.topolo.app/applications/forecast",
            "resource": {
              "kind": "daily_entry_batch",
              "idPath": "data"
            },
            "effects": [
              "Creates or replaces up to 100 Forecast daily entries in the workspace's active scenario, keyed by chart-of-account id and date."
            ],
            "errors": [
              {
                "status": 500,
                "code": "BULK_DAILY_ENTRY_SAVE_ERROR",
                "recovery": "Preserve the submitted entries and request id, then retry only after the Forecast service reports healthy; entries already written remain upsert-safe by workspace, scenario, chart-of-account id, and date."
              }
            ],
            "verify": [
              "Call daily.annual.get for every affected year in the same workspace and compare each submitted chart-of-account id, date, amountCents, isActual, and note."
            ],
            "nextActionIds": [
              "app_topolo_forecast.daily.annual.get"
            ],
            "examples": [
              {
                "title": "Upsert one monthly planning entry",
                "input": {
                  "workspace": "operating-plan",
                  "entries": [
                    {
                      "coaId": "account-revenue",
                      "date": "2026-10-01",
                      "amountCents": 6500000,
                      "isActual": false,
                      "note": "Base-case monthly forecast"
                    }
                  ]
                }
              }
            ]
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "operating-plan",
              "entries": [
                {
                  "coaId": "account-revenue",
                  "date": "2026-10-01",
                  "amountCents": 6500000,
                  "isActual": false,
                  "note": "Base-case monthly forecast"
                }
              ]
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PUT",
              "path": "/api/v1/operating-plan/daily/bulk",
              "body": {
                "workspace": "operating-plan",
                "entries": [
                  {
                    "coaId": "account-revenue",
                    "date": "2026-10-01",
                    "amountCents": 6500000,
                    "isActual": false,
                    "note": "Base-case monthly forecast"
                  }
                ]
              }
            },
            "effects": "Creates or replaces up to 100 Forecast daily entries in the workspace's active scenario, keyed by chart-of-account id and date.",
            "verification": [
              "Call daily.annual.get for every affected year in the same workspace and compare each submitted chart-of-account id, date, amountCents, isActual, and note."
            ],
            "recovery": [
              "500 BULK_DAILY_ENTRY_SAVE_ERROR: Preserve the submitted entries and request id, then retry only after the Forecast service reports healthy; entries already written remain upsert-safe by workspace, scenario, chart-of-account id, and date."
            ],
            "docs_url": "https://docs.topolo.app/applications/forecast",
            "resource": {
              "kind": "daily_entry_batch",
              "idPath": "data"
            },
            "next_action_ids": [
              "app_topolo_forecast.daily.annual.get"
            ],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PUT /api/v1/*/daily/bulk",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "imports.run",
          "title": "Import forecast entries",
          "description": "Persist a bounded batch of Forecast entries and its terminal import result.",
          "method": "POST",
          "path": "/api/v1/{workspace}/imports",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "entries": {
                "minItems": 1,
                "maxItems": 500,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "coaId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "date": {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                    },
                    "amountCents": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "isActual": {
                      "type": "boolean"
                    },
                    "note": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "coaId",
                    "date",
                    "amountCents"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "workspace",
              "entries"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Import forecast entries.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "entries": [
                {
                  "coaId": "example",
                  "date": "2026-01-01",
                  "amountCents": 1
                }
              ]
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/imports",
              "body": {
                "workspace": "example",
                "entries": [
                  {
                    "coaId": "example",
                    "date": "2026-01-01",
                    "amountCents": 1
                  }
                ]
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/imports. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/imports",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "summary.month.get",
          "title": "Get monthly summary",
          "description": "Get Forecast monthly summary.",
          "method": "GET",
          "path": "/api/v1/{workspace}/summary/month/{period}",
          "permission": "reports:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}$"
              }
            },
            "required": [
              "workspace",
              "period"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get monthly summary.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "period": "2026-01"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/summary/month/2026-01",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/summary/month/{period} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/summary/month/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "summary.year.get",
          "title": "Get yearly summary",
          "description": "Get Forecast yearly summary.",
          "method": "GET",
          "path": "/api/v1/{workspace}/summary/year/{period}",
          "permission": "reports:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "pattern": "^\\d{4}$"
              }
            },
            "required": [
              "workspace",
              "period"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get yearly summary.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "period": "2026"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/summary/year/2026",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/summary/year/{period} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/summary/year/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "forecast.get",
          "title": "Get forecast",
          "description": "Get Forecast projection for a period.",
          "method": "GET",
          "path": "/api/v1/{workspace}/forecast/{period}",
          "permission": "forecasts:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}$"
              },
              "depth": {
                "type": "integer",
                "minimum": 1,
                "maximum": 36
              }
            },
            "required": [
              "workspace",
              "period"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get forecast.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "period": "2026-01"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/forecast/2026-01",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/forecast/{period} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/forecast/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "openclaw.events.list",
          "title": "List OpenClaw events",
          "description": "List Forecast OpenClaw events.",
          "method": "GET",
          "path": "/api/v1/{workspace}/openclaw/events",
          "permission": "reports:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "category": {
                "type": "string",
                "minLength": 1
              },
              "since": {
                "type": "string",
                "minLength": 1
              },
              "scenarioId": {
                "type": "string",
                "minLength": 1
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 200
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List OpenClaw events.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/openclaw/events",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/openclaw/events without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/openclaw/events",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "openclaw.forecast_health.get",
          "title": "Get forecast health",
          "description": "Get Forecast OpenClaw health.",
          "method": "GET",
          "path": "/api/v1/{workspace}/openclaw/forecast-health",
          "permission": "reports:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}$"
              },
              "depth": {
                "type": "integer",
                "minimum": 1,
                "maximum": 36
              },
              "stale_after_hours": {
                "type": "integer",
                "minimum": 1,
                "maximum": 720
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get forecast health.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/openclaw/forecast-health",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/openclaw/forecast-health without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/openclaw/forecast-health",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "openclaw.report_status.create",
          "title": "Create report status",
          "description": "Create Forecast OpenClaw report status.",
          "method": "POST",
          "path": "/api/v1/{workspace}/openclaw/report-status",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "status": {
                "type": "string",
                "enum": [
                  "queued",
                  "running",
                  "succeeded",
                  "failed",
                  "stale"
                ]
              },
              "runId": {
                "type": "string",
                "minLength": 1
              },
              "scenarioId": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "minLength": 1
              },
              "format": {
                "type": "string",
                "minLength": 1
              },
              "scheduledFor": {
                "type": "string",
                "minLength": 1
              },
              "startedAt": {
                "type": "string",
                "minLength": 1
              },
              "completedAt": {
                "type": "string",
                "minLength": 1
              },
              "artifactUrl": {
                "type": "string",
                "minLength": 1
              },
              "error": {
                "type": "string",
                "minLength": 1
              },
              "metadata": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              }
            },
            "required": [
              "workspace",
              "name",
              "status"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create report status.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "name": "example",
              "status": "queued"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/openclaw/report-status",
              "body": {
                "workspace": "example",
                "name": "example",
                "status": "queued"
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/openclaw/report-status. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/openclaw/report-status",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "openclaw.export_status.create",
          "title": "Create export status",
          "description": "Create Forecast OpenClaw export status.",
          "method": "POST",
          "path": "/api/v1/{workspace}/openclaw/export-status",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "status": {
                "type": "string",
                "enum": [
                  "queued",
                  "running",
                  "succeeded",
                  "failed",
                  "stale"
                ]
              },
              "runId": {
                "type": "string",
                "minLength": 1
              },
              "scenarioId": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "minLength": 1
              },
              "format": {
                "type": "string",
                "minLength": 1
              },
              "scheduledFor": {
                "type": "string",
                "minLength": 1
              },
              "startedAt": {
                "type": "string",
                "minLength": 1
              },
              "completedAt": {
                "type": "string",
                "minLength": 1
              },
              "artifactUrl": {
                "type": "string",
                "minLength": 1
              },
              "error": {
                "type": "string",
                "minLength": 1
              },
              "metadata": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              }
            },
            "required": [
              "workspace",
              "name",
              "status"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create export status.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "name": "example",
              "status": "queued"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/openclaw/export-status",
              "body": {
                "workspace": "example",
                "name": "example",
                "status": "queued"
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/openclaw/export-status. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/openclaw/export-status",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_accounts.list",
          "title": "List cash accounts",
          "description": "List Forecast cash accounts.",
          "method": "GET",
          "path": "/api/v1/{workspace}/cash-accounts",
          "permission": "settings:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List cash accounts.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/cash-accounts",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/cash-accounts without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/cash-accounts",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_accounts.create",
          "title": "Create cash account",
          "description": "Create a workspace-level Forecast cash account. A scenario is not required.",
          "method": "POST",
          "path": "/api/v1/{workspace}/cash-accounts",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "account_name": {
                "type": "string",
                "minLength": 1
              },
              "account_type": {
                "type": "string",
                "enum": [
                  "checking",
                  "savings",
                  "investment",
                  "cash",
                  "credit_card",
                  "other"
                ]
              },
              "starting_balance_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "display_order": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "workspace",
              "account_name",
              "account_type"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Created Forecast cash account.",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "minLength": 1
                  },
                  "workspace_id": {
                    "type": "string",
                    "minLength": 1
                  },
                  "account_name": {
                    "type": "string",
                    "minLength": 1
                  },
                  "account_type": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "workspace_id",
                  "account_name",
                  "account_type"
                ],
                "additionalProperties": true
              }
            },
            "required": [
              "success",
              "data"
            ],
            "additionalProperties": true
          },
          "agentContract": {
            "docsUrl": "https://docs.topolo.app/applications/forecast",
            "resource": {
              "kind": "cash_account",
              "idPath": "$.data.id"
            },
            "effects": [
              "Creates a workspace-level cash account and initializes its current balance from starting_balance_cents."
            ],
            "errors": [
              {
                "status": 403,
                "code": "action_permission_required",
                "recovery": "Use a credential with settings:write access to the selected Forecast workspace."
              }
            ],
            "verify": [
              "Call cash_accounts.list with the same workspace and confirm the returned list contains $.data.id, account_name, account_type, and starting balance."
            ],
            "nextActionIds": [
              "app_topolo_forecast.cash_accounts.list"
            ],
            "examples": [
              {
                "title": "Create an operating account",
                "input": {
                  "workspace": "ws_forecast_northstar",
                  "account_name": "Northstar Operating Account",
                  "account_type": "checking",
                  "starting_balance_cents": 1850000,
                  "display_order": 1
                }
              }
            ],
            "recovery": {
              "mode": "compensating_action",
              "actionId": "app_topolo_forecast.cash_accounts.delete",
              "requiresSnapshot": false,
              "instructions": "Delete the created account only after confirming it has no cash-flow entries that must be retained."
            }
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "ws_forecast_northstar",
              "account_name": "Northstar Operating Account",
              "account_type": "checking",
              "starting_balance_cents": 1850000,
              "display_order": 1
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/ws_forecast_northstar/cash-accounts",
              "body": {
                "workspace": "ws_forecast_northstar",
                "account_name": "Northstar Operating Account",
                "account_type": "checking",
                "starting_balance_cents": 1850000,
                "display_order": 1
              }
            },
            "effects": "Creates a workspace-level cash account and initializes its current balance from starting_balance_cents.",
            "verification": [
              "Call cash_accounts.list with the same workspace and confirm the returned list contains $.data.id, account_name, account_type, and starting balance."
            ],
            "recovery": [
              {
                "mode": "compensating_action",
                "actionId": "app_topolo_forecast.cash_accounts.delete",
                "requiresSnapshot": false,
                "instructions": "Delete the created account only after confirming it has no cash-flow entries that must be retained."
              },
              "403 action_permission_required: Use a credential with settings:write access to the selected Forecast workspace."
            ],
            "docs_url": "https://docs.topolo.app/applications/forecast",
            "resource": {
              "kind": "cash_account",
              "idPath": "$.data.id"
            },
            "next_action_ids": [
              "app_topolo_forecast.cash_accounts.list"
            ],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/cash-accounts",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_accounts.update",
          "title": "Update cash account",
          "description": "Update a Forecast cash account.",
          "method": "PATCH",
          "path": "/api/v1/{workspace}/cash-accounts/{accountId}",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "accountId": {
                "type": "string",
                "minLength": 1
              },
              "account_name": {
                "type": "string",
                "minLength": 1
              },
              "account_type": {
                "type": "string",
                "enum": [
                  "checking",
                  "savings",
                  "investment",
                  "cash",
                  "credit_card",
                  "other"
                ]
              },
              "starting_balance_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "current_balance_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "is_active": {
                "type": "boolean"
              },
              "display_order": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "workspace",
              "accountId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update cash account.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "accountId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/example/cash-accounts/example",
              "body": {
                "workspace": "example",
                "accountId": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/{workspace}/cash-accounts/{accountId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/*/cash-accounts/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_accounts.delete",
          "title": "Delete cash account",
          "description": "Delete a Forecast cash account.",
          "method": "DELETE",
          "path": "/api/v1/{workspace}/cash-accounts/{accountId}",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "accountId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "accountId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Delete cash account.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "accountId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/example/cash-accounts/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/{workspace}/cash-accounts/{accountId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/*/cash-accounts/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_flow.get",
          "title": "Get cash flow",
          "description": "Get Forecast cash flow for a period.",
          "method": "GET",
          "path": "/api/v1/{workspace}/cash-flow/{period}",
          "permission": "transactions:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "period": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}$"
              }
            },
            "required": [
              "workspace",
              "period"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get cash flow.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "period": "2026-01"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/cash-flow/2026-01",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/cash-flow/{period} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/cash-flow/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_flow.create",
          "title": "Create cash flow entry",
          "description": "Create a Forecast cash flow entry.",
          "method": "POST",
          "path": "/api/v1/{workspace}/cash-flow",
          "permission": "transactions:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "cash_account_id": {
                "type": "string",
                "minLength": 1
              },
              "entry_date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "category": {
                "type": "string",
                "enum": [
                  "revenue",
                  "expense",
                  "transfer",
                  "adjustment",
                  "starting_balance"
                ]
              },
              "p_and_l_account_id": {
                "type": "string",
                "minLength": 1
              },
              "transfer_account_id": {
                "type": "string",
                "minLength": 1
              },
              "transfer_group_id": {
                "type": "string",
                "minLength": 1
              },
              "is_actual": {
                "type": "boolean"
              }
            },
            "required": [
              "workspace",
              "cash_account_id",
              "entry_date",
              "amount_cents",
              "category"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create cash flow entry.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "cash_account_id": "00000000-0000-4000-8000-000000000000",
              "entry_date": "2026-01-01",
              "amount_cents": 1,
              "category": "revenue"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/cash-flow",
              "body": {
                "workspace": "example",
                "cash_account_id": "00000000-0000-4000-8000-000000000000",
                "entry_date": "2026-01-01",
                "amount_cents": 1,
                "category": "revenue"
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/cash-flow. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/cash-flow",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_flow.update",
          "title": "Update cash flow entry",
          "description": "Update a Forecast cash flow entry.",
          "method": "PATCH",
          "path": "/api/v1/{workspace}/cash-flow/{entryId}",
          "permission": "transactions:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "entryId": {
                "type": "string",
                "minLength": 1
              },
              "entry_date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "amount_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "category": {
                "type": "string",
                "enum": [
                  "revenue",
                  "expense",
                  "transfer",
                  "adjustment",
                  "starting_balance"
                ]
              },
              "p_and_l_account_id": {
                "type": "string",
                "minLength": 1
              },
              "transfer_account_id": {
                "type": "string",
                "minLength": 1
              },
              "transfer_group_id": {
                "type": "string",
                "minLength": 1
              },
              "is_actual": {
                "type": "boolean"
              }
            },
            "required": [
              "workspace",
              "entryId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update cash flow entry.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "entryId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/example/cash-flow/example",
              "body": {
                "workspace": "example",
                "entryId": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/{workspace}/cash-flow/{entryId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/*/cash-flow/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_flow.delete",
          "title": "Delete cash flow entry",
          "description": "Delete a Forecast cash flow entry.",
          "method": "DELETE",
          "path": "/api/v1/{workspace}/cash-flow/{entryId}",
          "permission": "transactions:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "entryId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "entryId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Delete cash flow entry.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "entryId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/example/cash-flow/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/{workspace}/cash-flow/{entryId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/*/cash-flow/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_settings.get",
          "title": "Get cash settings",
          "description": "Get Forecast cash settings.",
          "method": "GET",
          "path": "/api/v1/{workspace}/cash-settings",
          "permission": "settings:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get cash settings.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/cash-settings",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/cash-settings without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/cash-settings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "cash_settings.update",
          "title": "Update cash settings",
          "description": "Update Forecast cash settings.",
          "method": "PATCH",
          "path": "/api/v1/{workspace}/cash-settings",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "low_cash_warning_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "critical_cash_warning_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "auto_generate_forecasts": {
                "type": "boolean"
              },
              "workspace_profile": {
                "type": "string",
                "enum": [
                  "business",
                  "personal"
                ]
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update cash settings.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/example/cash-settings",
              "body": {
                "workspace": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/{workspace}/cash-settings. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/*/cash-settings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "schedule_rules.list",
          "title": "List schedule rules",
          "description": "List Forecast schedule rules.",
          "method": "GET",
          "path": "/api/v1/{workspace}/schedule-rules",
          "permission": "settings:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "scenario_id": {
                "type": "string",
                "minLength": 1
              },
              "status": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List schedule rules.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/schedule-rules",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/schedule-rules without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/schedule-rules",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "schedule_rules.create",
          "title": "Create schedule rule",
          "description": "Create a Forecast schedule rule.",
          "method": "POST",
          "path": "/api/v1/{workspace}/schedule-rules",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "scenario_id": {
                "type": "string",
                "minLength": 1
              },
              "coa_id": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "amount_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "pattern_type": {
                "type": "string",
                "minLength": 1
              },
              "pattern_config": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              "start_date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "end_date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "is_active": {
                "type": "boolean"
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create schedule rule.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/schedule-rules",
              "body": {
                "workspace": "example"
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/schedule-rules. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/schedule-rules",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "schedule_rules.update",
          "title": "Update schedule rule",
          "description": "Update a Forecast schedule rule.",
          "method": "PUT",
          "path": "/api/v1/{workspace}/schedule-rules/{ruleId}",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "ruleId": {
                "type": "string",
                "minLength": 1
              },
              "scenario_id": {
                "type": "string",
                "minLength": 1
              },
              "coa_id": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "amount_cents": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "pattern_type": {
                "type": "string",
                "minLength": 1
              },
              "pattern_config": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              "start_date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "end_date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "is_active": {
                "type": "boolean"
              }
            },
            "required": [
              "workspace",
              "ruleId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update schedule rule.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "ruleId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PUT",
              "path": "/api/v1/example/schedule-rules/example",
              "body": {
                "workspace": "example",
                "ruleId": "example"
              }
            },
            "effects": "May change state through PUT /api/v1/{workspace}/schedule-rules/{ruleId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PUT /api/v1/*/schedule-rules/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "schedule_rules.delete",
          "title": "Delete schedule rule",
          "description": "Delete a Forecast schedule rule.",
          "method": "DELETE",
          "path": "/api/v1/{workspace}/schedule-rules/{ruleId}",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "ruleId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "ruleId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Delete schedule rule.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "ruleId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/example/schedule-rules/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/{workspace}/schedule-rules/{ruleId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/*/schedule-rules/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "shares.list",
          "title": "Shares List",
          "description": "Call GET /api/v1/{workspace}/shares.",
          "method": "GET",
          "path": "/api/v1/{workspace}/shares",
          "permission": "forecasts:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Shares List.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/shares",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/shares without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/shares",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "shares.create",
          "title": "Shares Create",
          "description": "Call POST /api/v1/{workspace}/shares.",
          "method": "POST",
          "path": "/api/v1/{workspace}/shares",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "permission_level": {
                "type": "string",
                "enum": [
                  "read",
                  "collaborate"
                ]
              },
              "expires_at": {
                "type": "string",
                "minLength": 1
              },
              "max_accesses": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "recipient_user_id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "name"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Shares Create.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "name": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/v1/example/shares",
              "body": {
                "workspace": "example",
                "name": "example"
              }
            },
            "effects": "May change state through POST /api/v1/{workspace}/shares. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/v1/*/shares",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "shares.update",
          "title": "Shares Update",
          "description": "Call PATCH /api/v1/{workspace}/shares/{shareId}.",
          "method": "PATCH",
          "path": "/api/v1/{workspace}/shares/{shareId}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "shareId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "permission_level": {
                "type": "string",
                "enum": [
                  "read",
                  "collaborate"
                ]
              },
              "is_active": {
                "type": "boolean"
              },
              "expires_at": {
                "type": "string",
                "minLength": 1
              },
              "max_accesses": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "workspace",
              "shareId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Shares Update.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "shareId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/example/shares/example",
              "body": {
                "workspace": "example",
                "shareId": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/{workspace}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/*/shares/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "shares.delete",
          "title": "Shares Delete",
          "description": "Call DELETE /api/v1/{workspace}/shares/{shareId}.",
          "method": "DELETE",
          "path": "/api/v1/{workspace}/shares/{shareId}",
          "permission": "forecasts:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "destructive": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "shareId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace",
              "shareId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Shares Delete.",
            "additionalProperties": true
          },
          "readOnly": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example",
              "shareId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/v1/example/shares/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/v1/{workspace}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/v1/*/shares/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "shares.settings.get",
          "title": "Shares Settings Get",
          "description": "Call GET /api/v1/{workspace}/share-settings.",
          "method": "GET",
          "path": "/api/v1/{workspace}/share-settings",
          "permission": "settings:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Shares Settings Get.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/v1/example/share-settings",
              "body": null
            },
            "effects": "Reads state through GET /api/v1/{workspace}/share-settings without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/v1/*/share-settings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "shares.settings.update",
          "title": "Shares Settings Update",
          "description": "Call PATCH /api/v1/{workspace}/share-settings.",
          "method": "PATCH",
          "path": "/api/v1/{workspace}/share-settings",
          "permission": "settings:write",
          "authorizationMode": "static",
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspace": {
                "type": "string",
                "minLength": 1
              },
              "sharing_enabled": {
                "type": "boolean"
              },
              "default_permission_level": {
                "type": "string",
                "enum": [
                  "read",
                  "collaborate"
                ]
              },
              "default_expiry_days": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_active_shares": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "require_password": {
                "type": "boolean"
              },
              "allowed_domains": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "custom_branding_enabled": {
                "type": "boolean"
              },
              "custom_logo_url": {
                "type": "string",
                "minLength": 1
              },
              "custom_title": {
                "type": "string",
                "minLength": 1
              },
              "custom_description": {
                "type": "string",
                "minLength": 1
              },
              "analytics_enabled": {
                "type": "boolean"
              }
            },
            "required": [
              "workspace"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Shares Settings Update.",
            "additionalProperties": true
          },
          "readOnly": false,
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspace": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/v1/example/share-settings",
              "body": {
                "workspace": "example"
              }
            },
            "effects": "May change state through PATCH /api/v1/{workspace}/share-settings. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/v1/*/share-settings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "organizations.data.export",
          "title": "Export organization data",
          "description": "Export all Forecast data owned by the authenticated organization without share credential material.",
          "method": "GET",
          "path": "/api/organizations/data/export",
          "permission": "privacy:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/organizations/data/export",
              "body": null
            },
            "effects": "Reads state through GET /api/organizations/data/export without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/organizations/data/export",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "organizations.data.erase",
          "title": "Erase organization data",
          "description": "Permanently erase all Forecast data and workspace-scoped caches owned by the authenticated organization while retaining backups under policy.",
          "method": "DELETE",
          "path": "/api/organizations/data/erase",
          "permission": "privacy:write",
          "authorizationMode": "static",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "confirmation": {
                "type": "string",
                "const": "ERASE"
              }
            },
            "required": [
              "confirmation"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "confirmation": "ERASE"
            },
            "cli_example": [
              "topolo actions --service topolo-forecast --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/organizations/data/erase",
              "body": null
            },
            "effects": "May change state through DELETE /api/organizations/data/erase. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/organizations/data/erase",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        }
      ],
      "action_coverage": {
        "status": "ok",
        "served_routes": 63,
        "matched_actions": 52,
        "declared_unserved_actions": [],
        "coverage_excluded_actions": [],
        "uncatalogued_routes": [],
        "ignored_routes": 11,
        "configured_exclusions": 9,
        "configuration_findings": [],
        "notes": []
      },
      "runtime_contract_audit": {
        "status": "verified",
        "actions": 52,
        "contracts": 52,
        "contract_module": "topolo.action-contracts.mjs",
        "validator_sources": [
          "apps/api/src/index.ts"
        ],
        "authorization_sources": [
          "apps/api/src/index.ts"
        ],
        "findings": []
      }
    }
  ],
  "mobile_contracts": [
    {
      "source_path": "apps/TopoloForecast/topolo.mobile-experience.json",
      "contract": {
        "version": "2026-07-24",
        "status": "approved",
        "mode": "native_capability",
        "appId": "app_topolo_forecast",
        "localizationNamespace": "forecast",
        "permissions": [
          "settings:read",
          "settings:write",
          "forecasts:read",
          "forecasts:write",
          "workspace:read",
          "workspace:write",
          "workspace:delete"
        ],
        "offlinePolicy": "read_through_cache",
        "fallbackPath": "/dashboard/workspace",
        "auth": {
          "audience": "topolo-forecast",
          "scopes": [
            "settings:read",
            "settings:write",
            "forecasts:read",
            "forecasts:write",
            "workspace:read",
            "workspace:write",
            "workspace:delete"
          ]
        },
        "routes": [
          {
            "path": "/dashboard/workspace",
            "apiPath": "/api/widget",
            "title": "Forecast",
            "titleKey": "forecast.mobile.routes.workspace.title",
            "template": "record.detail",
            "dataSource": "forecast.widget.get"
          },
          {
            "path": "/chart-of-accounts",
            "apiPath": "/api/v1/:workspace/coa",
            "title": "Chart of accounts",
            "titleKey": "forecast.mobile.routes.chartOfAccounts.title",
            "template": "record.list",
            "dataSource": "coa.get",
            "detailRoute": "/chart-of-accounts/:id",
            "actions": [
              {
                "id": "forecast.coa.create",
                "title": "Create account",
                "titleKey": "forecast.mobile.actions.accountCreate.title",
                "type": "record.create",
                "permission": "forecasts:write",
                "method": "POST",
                "path": "/api/v1/:workspace/coa",
                "fields": [
                  {
                    "key": "name",
                    "label": "Name",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "type",
                    "label": "Account type",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "trend_factor",
                    "label": "Trend factor",
                    "type": "number"
                  },
                  {
                    "key": "parentId",
                    "label": "Parent account",
                    "type": "text"
                  },
                  {
                    "key": "order_index",
                    "label": "Order",
                    "type": "number"
                  }
                ]
              },
              {
                "id": "forecast.coa.update",
                "title": "Update account",
                "titleKey": "forecast.mobile.actions.accountUpdate.title",
                "type": "record.update",
                "permission": "forecasts:write",
                "method": "PATCH",
                "path": "/api/v1/:workspace/coa/:id",
                "fields": [
                  {
                    "key": "name",
                    "label": "Name",
                    "type": "text"
                  },
                  {
                    "key": "type",
                    "label": "Account type",
                    "type": "text"
                  },
                  {
                    "key": "trend_factor",
                    "label": "Trend factor",
                    "type": "number"
                  },
                  {
                    "key": "parentId",
                    "label": "Parent account",
                    "type": "text"
                  }
                ]
              },
              {
                "id": "forecast.coa.delete",
                "title": "Delete account",
                "titleKey": "forecast.mobile.actions.accountDelete.title",
                "type": "record.delete",
                "permission": "forecasts:write",
                "method": "DELETE",
                "path": "/api/v1/:workspace/coa/:id"
              }
            ]
          }
        ],
        "notes": "The native shell owns canonical workspace selection and Topolo Auth owns list/create/rename/default. Forecast exposes the selected workspace summary and app-local domain actions only."
      }
    }
  ],
  "package_manifests": [],
  "deployment_configs": [],
  "source_signals": {
    "api_routes": [
      {
        "method": "LITERAL",
        "path": "/clear",
        "source_path": "apps/TopoloForecast/apps/api/src/durable-objects/cache-store.ts"
      },
      {
        "method": "GET",
        "path": "/health",
        "source_path": "apps/TopoloForecast/apps/api/src/index.ts"
      },
      {
        "method": "GET",
        "path": "/widget",
        "source_path": "apps/TopoloForecast/apps/api/src/index.ts"
      },
      {
        "method": "GET",
        "path": "/organizations/data/export",
        "source_path": "apps/TopoloForecast/apps/api/src/index.ts"
      },
      {
        "method": "DELETE",
        "path": "/organizations/data/erase",
        "source_path": "apps/TopoloForecast/apps/api/src/index.ts"
      },
      {
        "method": "GET",
        "path": "/v1/:workspace/health",
        "source_path": "apps/TopoloForecast/apps/api/src/index.ts"
      },
      {
        "method": "GET",
        "path": "/test",
        "source_path": "apps/TopoloForecast/apps/api/src/router.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/cash-accounts",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/cash-accounts",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "PATCH",
        "path": "/:workspace/cash-accounts/:accountId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "DELETE",
        "path": "/:workspace/cash-accounts/:accountId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/cash-flow/:period",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/cash-flow",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "PATCH",
        "path": "/:workspace/cash-flow/:entryId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "DELETE",
        "path": "/:workspace/cash-flow/:entryId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/cash-settings",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "PATCH",
        "path": "/:workspace/cash-settings",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/schedule-rules",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/schedule-rules",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "PUT",
        "path": "/:workspace/schedule-rules/:ruleId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "DELETE",
        "path": "/:workspace/schedule-rules/:ruleId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/coa",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/coa",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
      },
      {
        "method": "PATCH",
        "path": "/:workspace/coa/:id",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
      },
      {
        "method": "DELETE",
        "path": "/:workspace/coa/:id",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/daily/:period",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/daily/annual/:year",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
      },
      {
        "method": "PUT",
        "path": "/:workspace/daily",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
      },
      {
        "method": "PUT",
        "path": "/:workspace/daily/bulk",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/imports",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/imports.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/shares",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/shares",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
      },
      {
        "method": "PATCH",
        "path": "/:workspace/shares/:shareId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
      },
      {
        "method": "DELETE",
        "path": "/:workspace/shares/:shareId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/share-settings",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
      },
      {
        "method": "PATCH",
        "path": "/:workspace/share-settings",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/openclaw/events",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/openclaw/forecast-health",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/openclaw/report-status",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
      },
      {
        "method": "POST",
        "path": "/:workspace/openclaw/export-status",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
      },
      {
        "method": "GET",
        "path": "/v1/:workspace/scenarios",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
      },
      {
        "method": "POST",
        "path": "/v1/:workspace/scenarios",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
      },
      {
        "method": "PATCH",
        "path": "/v1/:workspace/scenarios/:scenarioId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
      },
      {
        "method": "POST",
        "path": "/v1/:workspace/scenarios/:scenarioId/duplicate",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
      },
      {
        "method": "DELETE",
        "path": "/v1/:workspace/scenarios/:scenarioId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
      },
      {
        "method": "GET",
        "path": "/shared/:shareToken",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
      },
      {
        "method": "GET",
        "path": "/shared/:shareToken/coa",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
      },
      {
        "method": "GET",
        "path": "/shared/:shareToken/daily/:period",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
      },
      {
        "method": "GET",
        "path": "/shared/:shareToken/daily/annual/:year",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
      },
      {
        "method": "PUT",
        "path": "/shared/:shareToken/daily",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
      },
      {
        "method": "GET",
        "path": "/shared/:shareToken/schedule-rules",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/summary/month/:period",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/summary-forecast.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/summary/year/:period",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/summary-forecast.ts"
      },
      {
        "method": "GET",
        "path": "/:workspace/forecast/:period",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/summary-forecast.ts"
      },
      {
        "method": "GET",
        "path": "/v1/workspaces/:workspaceId/shares",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
      },
      {
        "method": "POST",
        "path": "/v1/workspaces/:workspaceId/shares",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
      },
      {
        "method": "PATCH",
        "path": "/v1/workspaces/:workspaceId/shares/:shareId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
      },
      {
        "method": "DELETE",
        "path": "/v1/workspaces/:workspaceId/shares/:shareId",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
      },
      {
        "method": "GET",
        "path": "/v1/workspaces/:workspaceId/share-settings",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
      },
      {
        "method": "PATCH",
        "path": "/v1/workspaces/:workspaceId/share-settings",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
      },
      {
        "method": "PATCH",
        "path": "/v1/workspaces/:id/active-scenario",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspaces.ts"
      },
      {
        "method": "DELETE",
        "path": "/v1/workspaces/:id",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspaces.ts"
      }
    ],
    "ui_routes": [
      {
        "path": "/cash",
        "source_path": "apps/TopoloForecast/apps/api/src/forecast-notifications.ts"
      },
      {
        "path": "/schedule-rules",
        "source_path": "apps/TopoloForecast/apps/api/src/forecast-notifications.ts"
      },
      {
        "path": "/imports/${encodeURIComponent(importId)}",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/imports.ts"
      },
      {
        "path": "/scenarios/${encodeURIComponent(scenarioId)}",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
      },
      {
        "path": "/shared/${encodeURIComponent(token)}",
        "source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
      },
      {
        "path": "/month/:yearMonth",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/annual/:year",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/dashboard",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/dashboard/:year",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/scenarios",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/settings",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/settings/:section",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/getting-started",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/error/:code?",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/shared/:shareToken",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/shared/:shareToken/month/:yearMonth",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/shared/:shareToken/annual/:year",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      },
      {
        "path": "/shared/:shareToken/dashboard/:year",
        "source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
      }
    ],
    "test_cases": [],
    "database_tables": []
  },
  "documentation": {
    "declared_paths": [
      "internal/apps/forecast",
      "applications/forecast"
    ],
    "present_paths": [
      "internal/apps/forecast",
      "applications/forecast"
    ],
    "missing_paths": [],
    "human_reference": "/systems/topolo-forecast",
    "machine_reference": "/machine/systems/topolo-forecast.json",
    "action_examples": 52,
    "action_schemas": 52
  },
  "source_findings": []
}