1{2 "$schema": "http://json-schema.org/draft-07/schema#",3 "$id": "urn:awslabs:startups:migration-to-aws:state:phase-status",4 "$comment": "The $id URN uses 'migration-to-aws' as a stable schema namespace identity — it is NOT a plugin name or skill invocation prefix. Do not rename it when the schema moves between plugins.",5 "title": ".phase-status.json",6 "description": "Canonical schema for the shared migration state file (.phase-status.json) that DSL-driven migration skills read and advance. The valid phase NAMES are NOT enumerated here — they are whatever phases the skill declares (its phase files). This schema is skill-agnostic: adding a phase to a skill requires no change to this file.",7 "type": "object",
13 "description": "Matches the $MIGRATION_DIR folder name (e.g. 0226-1430). Set at creation; never changes."
14 },
15 "last_updated": {
16 "type": "string",
17 "format": "date-time",
18 "description": "ISO 8601 timestamp; updated after each phase-status change."
19 },
20 "current_phase": {
21 "type": "string",
22 "description": "The phase to run next: a declared phase name, or the 'complete' terminal. Optional but recommended; when present it is authoritative for phase selection."
23 },
24 "run_mode": {
25 "type": "string",
26 "enum": ["decide", "decide_and_execute"],
27 "description": "Optional. Generate-consent flow state, not a design constraint (never appears in preferences.json). 'decide' = user stopped at the Decision gate; Generate is available on request but never auto-loaded. 'decide_and_execute' = user opted into execution artifacts; Generate may load. Absent = the gate has not been reached yet. Set only by a skill's post-Estimate Decision gate (see e.g. heroku-to-aws SKILL.md) or an equivalent resume-offer acceptance."
32 "description": "Random UUID minted once at _init and never changed. Stable across pause/resume and, unlike migration_id, carries no timestamp. The run's identifier for telemetry events and for the plugin-to-web handoff."
33 },
34 "owning_skill": {
35 "type": "string",
36 "pattern": "^[A-Z][A-Z0-9_]*$",
37 "description": "Telemetry identifier of the skill that owns this run (the skill directory name in upper case with hyphens as underscores, e.g. GCP_TO_AWS), written at _init. Telemetry attributes events to this key; a run without it emits nothing."
38 },
39 "initiated_by": {
40 "type": "string",
41 "pattern": "^[A-Z][A-Z0-9_]*$",
42 "description": "Identifier of the skill that invoked this run, when another skill did (e.g. LLM_TO_BEDROCK delegating to GCP_TO_AWS). Optional; sent as initiatingSkill when it names a migration skill."
43 },
44 "phases": {
45 "type": "object",
46 "description": "One entry per phase the skill declares (backbone and sidebar). Keys are the skill's phase names — this schema does not enumerate them.",
51 "description": "Phase status. Progresses pending -> in_progress -> completed and never goes backward, except a confirmed re-entry reset (see INTERPRETER.md § _re_entry_guard). At most one backbone phase is in_progress at a time."