changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "additionalProperties": false,
+ "properties": {
+ "answers": {
+ "additionalProperties": false,
+ "description": "Every answer as the server now understands it, including defaults and seeded values. Send this back on the next call.",
+ "properties": {
+ "accessControl": {
+ "description": "The access control model. Drives the security spec auth/authorization section and the permission model.",
+ "type": "string"
+ },
+ "accessibilityNotes": {
+ "description": "Anything further on accessibility or constraints, in free text.",
+ "type": "string"
+ },
+ "activeUsers": {
+ "description": "Roughly how many active users are expected, as a range.",
+ "type": "string"
+ },
+ "apiResponseTime": {
+ "description": "Target API response time.",
+ "type": "string"
+ },
+ "apiStyle": {
+ "description": "API style - REST, GraphQL, gRPC or tRPC. Shapes how the architecture spec documents client-server communication.",
+ "type": "string"
+ },
+ "authStrategy": {
+ "description": "Auth approach - a protocol built in-house (JWT/OAuth/SAML) or a managed service (Clerk, Auth0, Firebase). Feeds the security spec.",
+ "type": "string"
+ },
+ "availability": {
+ "description": "Availability SLA target as a fraction of uptime; higher percentages allow far less downtime per year.",
+ "type": "string"
+ },
+ "buildTimeline": {
+ "description": "How long the build is expected to take.",
+ "type": "string"
+ },
+ "cicd": {
+ "description": "CI/CD practices - automatically running tests and deploying on every change.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "compliance": {
+ "description": "Compliance regimes that apply - GDPR, HIPAA, SOC 2. Pick by the actual situation (EU users, health data, payments), since getting it wrong has legal consequences.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "constraintDescription": {
+ "description": "More detail on whatever was named in technicalConstraints.",
+ "type": "string"
+ },
+ "customUserType": {
+ "description": "A user type in free text, when none of the userTypes options fit.",
+ "type": "string"
+ },
+ "dataSyncStrategy": {
+ "description": "How conflicting local and server state gets reconciled once the device is back online.",
+ "type": "string"
+ },
+ "databases": {
+ "description": "Database kinds in use - SQL, NoSQL, cache/key-value, vector. As many as apply.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "deploymentTargets": {
+ "description": "Where this ships - cloud hosting, a package registry, a browser store. The option list depends on the project type.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "handle": {
+ "description": "The developer GitHub handle. Optional; it namespaces generated task IDs (e.g. CD-jsmith-001). Infer from git config or the origin remote.",
+ "type": "string"
+ },
+ "ideAgent": {
+ "description": "The editor or AI IDE in use - claudecode, cursor, copilot, codex, windsurf. You are the IDE, so set this yourself; it decides which rules and config files are generated.",
+ "type": "string"
+ },
+ "integrations": {
+ "additionalProperties": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "description": "Third-party integrations keyed by category, e.g. { payments: [\"stripe\"] }. Only categories relevant to the project type apply.",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "isNewBuild": {
+ "description": "True for a greenfield project, false when adding onto an existing codebase. Decides which onboarding analysis is generated at the end.",
+ "type": "boolean"
+ },
+ "languageOverride": {
+ "description": "Primary language, when it should override what SpecPilot infers from the repo.",
+ "type": "string"
+ },
+ "localDatabases": {
+ "description": "On-device stores backing offline support. Leave empty when offline is not needed.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "nonGoals": {
+ "description": "What this project explicitly will NOT do. Becomes the non-goals section of the specs.",
+ "type": "string"
+ },
+ "offlineSupport": {
+ "description": "Whether this has to work offline. Set automatically when localDatabases is non-empty.",
+ "type": "boolean"
+ },
+ "otherApis": {
+ "description": "External APIs or services not covered by integrations.",
+ "type": "string"
+ },
+ "platforms": {
+ "description": "Platforms this should run on, e.g. web, ios, android, desktop. Infer from the dependency manifests and repo layout.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "projectCategory": {
+ "anyOf": [
+ {
+ "enum": [
+ "saas",
+ "api",
+ "mobile",
+ "cli",
+ "pipeline",
+ "ml",
+ "static",
+ "docs",
+ "extension",
+ "library",
+ "other"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Project archetype. Normally inferred from projectDescription when it exactly matches a returned chip label - send it only if you already know it."
+ },
+ "projectDescription": {
+ "description": "One line saying what the project is. Required by specpilot_generate_specs. Sending one of the chip labels returned by specpilot_next_questions verbatim is what infers projectCategory and gates every later question; free prose infers nothing.",
+ "type": "string"
+ },
+ "projectName": {
+ "description": "Short name for the project. Required by specpilot_generate_specs. Infer from the package manifest or the folder name.",
+ "type": "string"
+ },
+ "realtimeEnabled": {
+ "description": "Whether anything updates live without a refresh. Set automatically when realtimeTypes is non-empty.",
+ "type": "boolean"
+ },
+ "realtimeTypes": {
+ "description": "Realtime transports - WebSockets, SSE, polling. Leave empty when nothing needs to update live.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "scaleTier": {
+ "description": "Expected scale of the system. Drives infrastructure and architecture choices.",
+ "type": "string"
+ },
+ "securityConcerns": {
+ "description": "Security measures to plan for - encryption, rate limiting, audit logging.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "specialConsiderations": {
+ "description": "Cross-cutting concerns that apply, such as accessibility, internationalisation or offline support.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "systemPattern": {
+ "description": "Architecture pattern - monolith, modular monolith, or microservices.",
+ "type": "string"
+ },
+ "teamSize": {
+ "description": "How many people are building this.",
+ "type": "string"
+ },
+ "technicalConstraints": {
+ "description": "Hard constraints - budget, existing infrastructure, legacy systems, a fixed deadline.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "testingStrategy": {
+ "description": "Testing approaches this project will use.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "userTypes": {
+ "description": "Who is going to use this system, e.g. end users, admins, internal staff.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "done": {
+ "description": "True when every applicable question is answered and specpilot_generate_specs can be called.",
+ "type": "boolean"
+ },
+ "questions": {
+ "description": "The still-unanswered questions of the next incomplete step. Empty when done.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "allowCustom": {
+ "description": "True when a value outside the listed options is accepted.",
+ "type": "boolean"
+ },
+ "field": {
+ "description": "The answers field this question fills - send the reply under this key.",
+ "type": "string"
+ },
+ "groups": {
+ "description": "Choices arranged into groups, for grouped questions.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "group": {
+ "description": "Group heading.",
+ "type": "string"
+ },
+ "items": {
+ "description": "Options within this group.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "badge": {
+ "description": "recommended marks a suggested choice; flagged marks one that needs care.",
+ "enum": [
+ "recommended",
+ "flagged"
+ ],
+ "type": "string"
+ },
+ "description": {
+ "description": "Longer explanation of what choosing this means.",
+ "type": "string"
+ },
+ "group": {
+ "description": "Group this option belongs to.",
+ "type": "string"
+ },
+ "id": {
+ "description": "Value to send back for this option.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable label shown to the developer.",
+ "type": "string"
+ },
+ "warning": {
+ "description": "Caveat to surface to the developer before they pick this.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "label"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "group",
+ "items"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "id": {
+ "description": "Stable question id.",
+ "type": "string"
+ },
+ "optional": {
+ "description": "True when the question may be answered with an empty value to decline it.",
+ "type": "boolean"
+ },
+ "options": {
+ "description": "Choices for a select-style question.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "badge": {
+ "description": "recommended marks a suggested choice; flagged marks one that needs care.",
+ "enum": [
+ "recommended",
+ "flagged"
+ ],
+ "type": "string"
+ },
+ "description": {
+ "description": "Longer explanation of what choosing this means.",
+ "type": "string"
+ },
+ "group": {
+ "description": "Group this option belongs to.",
+ "type": "string"
+ },
+ "id": {
+ "description": "Value to send back for this option.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable label shown to the developer.",
+ "type": "string"
+ },
+ "warning": {
+ "description": "Caveat to surface to the developer before they pick this.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "label"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "prompt": {
+ "description": "The question text, rendered against the answers so far.",
+ "type": "string"
+ },
+ "required": {
+ "description": "True when a non-empty answer is needed to move on.",
+ "type": "boolean"
+ },
+ "todoSentinel": {
+ "description": "Send this exact value when the developer does not know yet.",
+ "type": "string"
+ },
+ "type": {
+ "description": "Shape of the expected answer, e.g. text, single-select, multi-select.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "field",
+ "type",
+ "prompt"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "step": {
+ "description": "Number of the step these questions belong to.",
+ "type": "number"
+ },
+ "stepLabel": {
+ "description": "Human-readable name of that step, e.g. \"Scale & deploy\".",
+ "type": "string"
+ }
+ },
+ "required": [
+ "done",
+ "questions",
+ "answers"
+ ],
+ "type": "object"
+}