[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-aws-labs-llm-to-bedrock":3,"mdc--4tbqo1-key":40,"related-org-aws-labs-llm-to-bedrock":5339,"related-repo-aws-labs-llm-to-bedrock":5517},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":35,"sourceUrl":38,"mdContent":39},"llm-to-bedrock","migrate LLM calls to Amazon Bedrock","Use when the user wants to migrate code that calls OpenAI, Gemini\u002FGoogle AI, or the Anthropic API to Amazon Bedrock — a pure model\u002FSDK rewrite. End-to-end: assesses the codebase, then rewrites SDK calls, evaluates output quality against Bedrock, and delivers a ready-to-merge git branch. Not for: agent runtime selection, agentic architecture decisions, or agent migration planning — use agent-advisor for those. Not for standalone Bedrock cost estimates or infrastructure-only migration. The Assess phase is handled by this plugin's own gcp-to-aws skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"aws-labs","AWS Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Faws-labs.png","awslabs",[13,17,20,23,26],{"name":14,"slug":15,"type":16},"LLM","llm","tag",{"name":18,"slug":19,"type":16},"Migration","migration",{"name":21,"slug":22,"type":16},"OpenAI","openai",{"name":24,"slug":25,"type":16},"Gemini","gemini",{"name":27,"slug":28,"type":16},"AWS","aws",14,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups","2026-08-14T04:51:58.393797",null,15,[],{"repoUrl":30,"stars":29,"forks":33,"topics":36,"description":37},[],"Official AWS Startups repository that hosts plugins, skills, tools and resources to support startup builders on AWS","https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups\u002Ftree\u002FHEAD\u002Fadvisor\u002Fplugins\u002Faws-startup-advisor\u002Fskills\u002Fllm-to-bedrock","---\nname: llm-to-bedrock\ndescription: \"Use when the user wants to migrate code that calls OpenAI, Gemini\u002FGoogle AI, or the Anthropic API to Amazon Bedrock — a pure model\u002FSDK rewrite. End-to-end: assesses the codebase, then rewrites SDK calls, evaluates output quality against Bedrock, and delivers a ready-to-merge git branch. Not for: agent runtime selection, agentic architecture decisions, or agent migration planning — use agent-advisor for those. Not for standalone Bedrock cost estimates or infrastructure-only migration. The Assess phase is handled by this plugin's own gcp-to-aws skill.\"\n---\n\n# Migrate to Bedrock (Assess + Execute)\n\nSingle-command AI migration: OpenAI \u002F Gemini \u002F Anthropic → Amazon Bedrock.\n\nThe skill base directory is given in the \"Base directory for this skill: X\" line the harness\nemits at load time. Call it `\u003CSKILL_BASE>`. Derived paths:\n\n- `$SCRIPTS` = `\u003CSKILL_BASE>\u002Fscripts`\n- `$HELPERS` = `\u003CSKILL_BASE>\u002Freferences\u002Fhelpers` (the former helper skills, now references)\n\n---\n\n## Step 0 — Check prerequisites\n\n### 0a. Check that `uv` is available\n\n```bash\nuv --version 2>\u002Fdev\u002Fnull || echo \"MISSING\"\n```\n\nIf missing: \"Install uv first — see the official install guide: https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fgetting-started\u002Finstallation\u002F (e.g. `brew install uv` or `pipx install uv`)\". Stop.\n\n---\n\n## Step 1 — Collect source code path\n\nIf `$ARGUMENTS` contains a path, use it as `$REPO`. Otherwise use **AskUserQuestion**:\n\"Where is your source code? Enter a local path or GitHub URL.\"\n\nIf a GitHub URL, `git clone` it to a temp dir; use that path as `$REPO`.\n\n**Checks on $REPO:**\n\n1. **Git-root check** (compare resolved paths — on macOS `\u002Ftmp` resolves to `\u002Fprivate\u002Ftmp`,\n   so a raw string comparison false-positives):\n\n   ```bash\n   [ \"$(git -C \u003CREPO> rev-parse --show-toplevel 2>\u002Fdev\u002Fnull)\" = \"$(cd \u003CREPO> && pwd -P)\" ] && echo GIT_ROOT_OK || echo GIT_ROOT_MISMATCH\n   ```\n\n   - `GIT_ROOT_OK` → proceed.\n   - `GIT_ROOT_MISMATCH` and the command errored (not a git repo at all) → tell the user the\n     path must be a git repository (the deliverable is a git branch); re-ask.\n   - `GIT_ROOT_MISMATCH` but inside a repo (user pointed at a subdirectory) → AskUserQuestion:\n     \"Use the repo root instead\" (recommended) \u002F \"Continue with this subdirectory\" \u002F \"Abort\".\n\n2. **Dirty-tree check:**\n\n   ```bash\n   git -C \u003CREPO> status --porcelain\n   ```\n\n   If uncommitted changes exist, show them and AskUserQuestion: \"Continue anyway\" or \"Let me clean up first\".\n\nRecord `$REPO` for all subsequent steps.\n\n---\n\n## Phase A — Assess (MANDATORY: delegate to the gcp-to-aws skill)\n\n**CRITICAL: You MUST use the Skill tool to invoke `aws-startup-advisor:gcp-to-aws` (a sibling skill\nin this same plugin). Do NOT perform the Assess phase yourself. Do NOT read source code, detect\nAI SDKs, or ask Clarify questions manually. The entire Assess phase is handled by the gcp-to-aws\nskill — you only invoke it and wait for completion.**\n\n### A1 — Invoke the Assess skill\n\nCall the **Skill** tool with skill name `aws-startup-advisor:gcp-to-aws`.\n\nBefore invoking, tell the user:\n\n> \"I'm now invoking the gcp-to-aws Assess skill to discover your AI workloads and design\n> the Bedrock migration. It will ask you some questions — please answer them. (Don't be\n> confused by the skill's `gcp-to-aws` name — it also covers pure AI\u002FLLM migrations with no\n> GCP or infrastructure component, which is how it's being used here.)\"\n\nAfter invoking the Skill tool, the `gcp-to-aws` skill instructions will load into context.\nFollow those instructions exactly — they will drive the Discover, Clarify, Design, Estimate,\nand Generate phases. The source code to scan is at `$REPO`.\n\n**Important context for the gcp-to-aws skill execution:**\n\n- Source code is at `$REPO` — when the skill asks for GCP sources or scans for files, point it there\n- This is an AI\u002FLLM workload migration — the AI path is the goal\n- Unless Terraform\u002FIaC files are actually present in `$REPO`, skip IaC discovery\n- Unless the user offers billing data, skip billing discovery\n\n### A2 — Wait for Assess completion\n\nThe `gcp-to-aws` skill is a state machine. After each phase completes, it may stop and wait\nfor the next invocation. Check progress against the LATEST run directory only (older\n`.migration\u002F` runs may contain a stale \"completed\" status):\n\n```bash\nMIGRATION_DIR=$(ls -td \"$REPO\u002F.migration\"\u002F*\u002F 2>\u002Fdev\u002Fnull | head -1)\n# Stdlib-only JSON read — no boto3, so bare python3 is fine here (no pinned env needed).\npython3 -c \"import json,sys; print(json.load(open('$MIGRATION_DIR\u002F.phase-status.json'))['phases'].get('generate','missing'))\" 2>\u002Fdev\u002Fnull || echo \"no-status-file\"\n```\n\n- `completed` → proceed to A3.\n- Anything else (including `no-status-file`) → the skill needs to run again. Re-invoke\n  `aws-startup-advisor:gcp-to-aws` via the Skill tool — it picks up where it left off.\n\n**Cap: at most 6 re-invocations.** If `generate` is still not `completed` after 6, stop and\nshow the user the last status output — the Assess skill is stuck and needs manual attention;\nlooping further just burns context.\n\n### A3 — Locate Assess output\n\nFind `$MIGRATION_DIR` (the `.migration\u002F\u003CMMDD-HHMM>\u002F` directory that was created):\n\n```bash\nls -td \"$REPO\u002F.migration\"\u002F*\u002F 2>\u002Fdev\u002Fnull | head -1\n```\n\nVerify these files exist in `$MIGRATION_DIR`:\n\n- `aws-design-ai.json` (model mapping + architecture)\n- `ai-workload-profile.json` (detected workloads)\n- `preferences.json` (user preferences from Clarify)\n\nIf `aws-design-ai.json` is missing, Assess did not complete the AI path correctly. Show the\nerror and stop.\n\n---\n\n## Phase B — Execute Prep\n\n### B1 — Read Assess outputs\n\nRead `$MIGRATION_DIR\u002Faws-design-ai.json` and extract:\n\n- `ai_architecture.bedrock_models[]` → array of `{source_model, aws_model_id, use_case}`\n- Collect all `aws_model_id` values into `$TARGET_MODELS` (array). Keep the `use_case` of each:\n  the preflight script probes each model by the right API automatically (Converse for chat,\n  InvokeModel for embeddings), but the evaluator's quality scoring only applies to chat models —\n  embedding targets get format\u002Fdimension validation only.\n\nRead `$MIGRATION_DIR\u002Fai-workload-profile.json` and extract:\n\n- `summary.ai_source` → source provider\n\nRead `$MIGRATION_DIR\u002Fpreferences.json` and extract:\n\n- `design_constraints.target_region` → `$REGION` (default `us-east-1` if absent)\n\n**Validation:** If `aws-design-ai.json` has no `ai_architecture.bedrock_models[]` array, or the\narray is empty, STOP: \"Assess output incomplete — model mapping missing.\"\n\n### B2 — AWS identity confirmation\n\n```bash\naws sts get-caller-identity 2>&1\n```\n\n**If the command fails** (no credentials, expired SSO token): show the error and tell the user\nto run `aws configure` or `aws sso login` (suggest typing `! aws sso login` to run it in this\nsession), then re-run B2. Do not proceed without a confirmed identity.\n\nOn success, show Account, Arn, UserId via **AskUserQuestion**:\n\"This AWS identity will be used for Bedrock calls. Is this correct?\"\n\nOptions:\n\n- **Yes, use this identity** → proceed\n- **Use a different AWS profile** → ask which profile, record it as `$AWS_PROFILE_CHOICE`,\n  re-run B2 as `aws sts get-caller-identity --profile $AWS_PROFILE_CHOICE`, and re-confirm.\n  **Do NOT rely on exporting `AWS_PROFILE`** — env vars do not persist across Bash tool calls\n  or into workflow subagents (see B3). Instead pass the choice explicitly everywhere:\n  `--profile` on every aws CLI call, and prepend `AWS_PROFILE=$AWS_PROFILE_CHOICE` inline on\n  the B4 preflight command and inside the workflow args (`awsProfile` field) so subagents can\n  do the same.\n\nAlso confirm region: \"Bedrock region will be `$REGION`. OK or override?\"\n\n### B3 — Source API key (optional)\n\nFirst, create the artifact directory and make it self-ignoring IMMEDIATELY — before any key\nexists, so the secret is never sitting in an unignored working tree (even if the user aborts\nbefore the rewriter runs):\n\n```bash\nmkdir -p \"$REPO\u002F.saws-migrate\" && printf '*\\n' > \"$REPO\u002F.saws-migrate\u002F.gitignore\"\n```\n\nDetermine `$KEY_ENV_VAR` from B1's source provider (this is the env-var name the baseline\nskill's parser expects — a bare key without the `NAME=` prefix will NOT be parsed):\n\n- `openai` → `OPENAI_API_KEY`\n- `anthropic` → `ANTHROPIC_API_KEY`\n- `google` \u002F `gemini` → `GEMINI_API_KEY`\n\n**The key must never enter this conversation (HARD RULE).** Do not ask the user to paste the\nkey in chat, and never echo, cat, or interpolate its VALUE into any command, question, or\noutput — the agent only ever handles the file path. If the user pastes a key into the chat\nunprompted, do not use it: tell them it is now part of the transcript, recommend rotating it,\nand continue with one of the paths below.\n\nFirst check whether the key is already present in the shell environment (each Bash call\ninitializes from the user's profile, so a profile-exported key is visible to every call).\nPOSIX-safe — `printenv` works in bash and zsh alike (`${!VAR}` indirection is bash-only and\nzsh errors on it). This prints presence only, never the value:\n\n```bash\n[ -n \"$(printenv \"$KEY_ENV_VAR\")\" ] && echo ENV_KEY_PRESENT || echo ENV_KEY_ABSENT\n```\n\n**AskUserQuestion:** \"Do you have an API key for the source model (e.g. OpenAI key for GPT-4o)?\nProviding it enables side-by-side quality comparison. Without it, evaluation uses absolute scoring only.\"\n\nOptions (offer the first only on `ENV_KEY_PRESENT`):\n\n- **Use the `$KEY_ENV_VAR` already in my environment** → materialize env var to file in one\n  command — the value never appears in the transcript:\n\n  ```bash\n  printf '%s=%s\\n' \"$KEY_ENV_VAR\" \"$(printenv \"$KEY_ENV_VAR\")\" > \"$REPO\u002F.saws-migrate\u002F.source-provider-env\" && chmod 600 \"$REPO\u002F.saws-migrate\u002F.source-provider-env\"\n  ```\n\n  Then run the format check below and set `sourceBaselineAvailable = true`,\n  `sourceKeyRef = \"$REPO\u002F.saws-migrate\u002F.source-provider-env\"`.\n- **I'll write it to a file myself** → give the user this command to run in THEIR OWN terminal\n  (not through the agent; in Claude Code an `!` prefix runs it in-session) — `read -rs` collects\n  the key without echoing it:\n\n  ```bash\n  read -rs k && printf '%s=%s\\n' \"\u003CKEY_ENV_VAR>\" \"$k\" > \"\u003CREPO>\u002F.saws-migrate\u002F.source-provider-env\" && chmod 600 \"\u003CREPO>\u002F.saws-migrate\u002F.source-provider-env\" && unset k\n  ```\n\n  Substitute the literal env-var name and repo path when presenting it (those are not secrets).\n  Then run the format check below and set the same flags as above.\n- **Skip** → `sourceBaselineAvailable = false`, `sourceKeyRef = \"\"`.\n\nWhichever path wrote the file, verify the format (never prints the key; catches a value\nwritten without the `NAME=` prefix, which the baseline parser would silently miss):\n\n```bash\ngrep -qE '^(OPENAI|ANTHROPIC|GEMINI)_API_KEY=.+' \"$REPO\u002F.saws-migrate\u002F.source-provider-env\" && echo KEY_FORMAT_OK || echo KEY_FORMAT_BAD\n```\n\nOn `KEY_FORMAT_BAD`, have the same path that wrote the file rewrite it (do not echo its\ncontents).\n\n(`.saws-migrate\u002F` is already self-ignoring from the first command above; the rewriter\nre-asserts this before any commit as a second layer.)\n\n**IMPORTANT:** The file is the handoff mechanism — do NOT rely on `export` to carry the key\ninto later steps. Shell state set in one Bash call does not persist into other calls or into\nworkflow subagents; only a profile-exported variable (the `ENV_KEY_PRESENT` path above) is\nreliably visible, and even that must be materialized to the file for the baseline runner.\n\n### B4 — Bedrock preflight\n\n```bash\nuv run --project $SCRIPTS python $SCRIPTS\u002Fpreflight_bedrock.py --region $REGION --models \u003Ccomma-separated $TARGET_MODELS> --dataset-size 200\n```\n\n(`--dataset-size 200` matches the golden-dataset cap, so the quota warning reflects the worst case. Prefix with `AWS_PROFILE=$AWS_PROFILE_CHOICE` if B2 chose a non-default profile.)\n\nParse the JSON output. On failure the TOP LEVEL carries `reason`\u002F`detail` (lifted from the\nfirst failing model) plus `failing_models` (all failing ids); per-model verdicts are in `models[]`:\n\n- `ok == false` + `reason: credentials` → show the detail (configure\u002Frefresh credentials), stop; user re-runs after fixing.\n- `ok == false` + `reason: model_access` → model access not enabled in the Bedrock console (NOT an IAM problem): point the user at the console Model access page for the failing models, stop; re-run B4 after they enable it.\n- `ok == false` + `reason: authz` → IAM denies `bedrock:InvokeModel`: tell user the IAM action to grant; stop.\n- `ok == false` + `reason: model_unavailable` → Read the `resolve-bedrock-model-id` reference at `$HELPERS\u002Fresolve-bedrock-model-id\u002Fresolve-bedrock-model-id.md` and follow its procedure with each ID from `failing_models` + region. AskUserQuestion with the candidates: \"Use `\u003Ccandidate>` (cross-region inference profile)\" \u002F \"Paste a different model ID\" \u002F \"Abort\". On a choice, replace the ID in `$TARGET_MODELS` and re-run B4.\n- `ok == false` + any other `reason` → show `detail` and stop.\n- `ok == true` → proceed. Surface any `quota_warning`, and any model whose `reason` is\n  `embedding_unprobed` (embedding family the preflight can't probe — remind the user to confirm\n  model access in the console).\n\n---\n\n## Phase C — Execute\n\nPhase C dispatches the five plugin agents sequentially via the **Agent tool** (subagent types\n`aws-startup-advisor:llm2bedrock-code-analyzer`, `aws-startup-advisor:llm2bedrock-log-ingestor`, `aws-startup-advisor:llm2bedrock-prompt-evaluator`,\n`aws-startup-advisor:llm2bedrock-code-rewriter`, `aws-startup-advisor:llm2bedrock-report-generator`). Each agent writes its result to\na file under `$PHASE_DIR = $REPO\u002F.saws-migrate\u002Fphase-results\u002F`; you validate every file with\nthe bundled validator before moving on. There is no workflow runtime — the files ARE the state.\n\n### The validator (used at every step)\n\n```bash\nuv run --project $SCRIPTS python $SCRIPTS\u002Fvalidate_result.py --schema \u003Canalysis|ingestion|eval|rewrite|delta-decisions> \u003Cfile>\n```\n\n- Exit 0 + `RESULT=valid CONTROL=ok` → phase completed; proceed.\n- Exit 0 + `CONTROL=blocked REASON=\u003Cr>` → blocked flow (below).\n- Exit 0 + `CONTROL=partial COMPLETED=\u003Cn> TOTAL=\u003Cm>` → partial flow (eval only).\n- Exit 1 (`RESULT=invalid` + error lines) or exit 2 (file missing) → **stateless fixer retry**:\n  dispatch a FRESH agent of the same type whose prompt is the original context block + the\n  file path + the validator's verbatim error output + the instruction \"fix ONLY the output\n  file at `\u003Cpath>` so it validates; do not redo the phase's work unless a required field is\n  genuinely missing from it\". Cap 2 retries per phase; then stop and show the errors.\n\n### The context block (instantiated at every dispatch)\n\nBuild this exact line format (agents parse the labels). Omit lines marked optional when empty:\n\n```\nRepository: \u003C$REPO>\nAWS region: \u003C$REGION>\nAWS profile (pass as --profile \u002F AWS_PROFILE= inline on every aws\u002Fboto3 invocation): \u003C$AWS_PROFILE_CHOICE — omit line if default>\nTarget Bedrock model(s): \u003Ccomma-joined $TARGET_MODELS, with any resolved overrides already applied>\nMigration plan dir: \u003C$MIGRATION_DIR>\nResolved target model id: \u003Coverride for the primary chat model — omit if none>\nScripts directory (pinned uv toolchain): \u003C$SCRIPTS>\nReport date suffix: \u003Csaved suffix from run-context — C5\u002FC6 dispatches only>\nSource baseline available: \u003Ctrue|false>\nSource provider env file: \u003Cpath — omit if none>\nUser-supplied log files: \u003Ccomma-joined — omit if none>\nGolden dataset cap (max cases the ingestor may emit): 200\nPhase results directory: \u003C$PHASE_DIR>\nPrior phase results (Read these files): \u003Cpaths of already-validated phase JSONs>\nConfirmed behavior-delta decisions file (Read it): \u003C$PHASE_DIR\u002Fdelta-decisions.json — C5 only>\n\u003Chelper-reference lines — inject ONLY the ones this agent needs, per the table below>\n```\n\nPrior-phase results are passed as FILE PATHS — never inline their JSON into the prompt.\n\n**Helper references (the former helper skills, now under `$HELPERS`).** Agents no longer\nload skills by name; instead the agent Reads a helper reference at an absolute path you\ninject. For each dispatch, add ONLY the helper lines that agent uses (per its `# 4` section):\n\n| Agent (dispatch)                                             | Helper-reference lines to add                                                                                                                                                                                                                                                                                        |\n| ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| C1 llm2bedrock-code-analyzer                                 | `behavior-delta-detection reference: $HELPERS\u002Fbehavior-delta-detection\u002Fbehavior-delta-detection.md`\u003Cbr>`resolve-bedrock-model-id reference: $HELPERS\u002Fresolve-bedrock-model-id\u002Fresolve-bedrock-model-id.md`                                                                                                           |\n| C5 llm2bedrock-code-rewriter                                 | `bedrock-known-fixes reference: $HELPERS\u002Fbedrock-known-fixes\u002Fbedrock-known-fixes.md`\u003Cbr>`behavior-delta-detection reference: $HELPERS\u002Fbehavior-delta-detection\u002Fbehavior-delta-detection.md`\u003Cbr>`dependency-conflict-resolution reference: $HELPERS\u002Fdependency-conflict-resolution\u002Fdependency-conflict-resolution.md` |\n| C3 llm2bedrock-prompt-evaluator                              | `bedrock-known-fixes reference: $HELPERS\u002Fbedrock-known-fixes\u002Fbedrock-known-fixes.md`\u003Cbr>`resolve-bedrock-model-id reference: $HELPERS\u002Fresolve-bedrock-model-id\u002Fresolve-bedrock-model-id.md`\u003Cbr>`run-source-model-baseline reference: $HELPERS\u002Frun-source-model-baseline\u002Frun-source-model-baseline.md`                |\n| C2 llm2bedrock-log-ingestor, C6 llm2bedrock-report-generator | (none — these agents load no helpers)                                                                                                                                                                                                                                                                                |\n\nExpand `$HELPERS` to its absolute path (you have `\u003CSKILL_BASE>`) so the subagent — where\n`${CLAUDE_PLUGIN_ROOT}` is empty — receives a resolvable absolute path.\n\n### C0 — Run-context gate (resume safety)\n\nThe Eval phase makes one paid Bedrock call per golden case (and, with a source key, one paid\nsource-provider call per case). Before any dispatch, tell the user evaluation will invoke\nBedrock at their expense, capped at 200 cases.\n\n1. `mkdir -p $PHASE_DIR`. Build `$PHASE_DIR\u002Fcurrent-context.json` with exactly these fields\n   (hashes via `shasum -a 256`; key hash is a fingerprint — never store the key value):\n\n```json\n{\n  \"repo_root\": \"\u003Ccd $REPO && pwd -P>\",\n  \"migration_dir\": \"\u003C$MIGRATION_DIR>\",\n  \"region\": \"\u003C$REGION>\",\n  \"aws_profile\": \"\u003C$AWS_PROFILE_CHOICE or \\\"\\\">\",\n  \"aws_account\": \"\u003CAccount from B2>\",\n  \"repo_head_sha\": \"\u003Cgit -C $REPO rev-parse HEAD>\",\n  \"repo_branch\": \"\u003Cgit -C $REPO rev-parse --abbrev-ref HEAD>\",\n  \"repo_dirty_sha256\": \"\u003Csha256 of: git status --porcelain + git diff + git diff --cached, EACH with pathspecs -- . ':(exclude).saws-migrate' ':(exclude).migration' ':(exclude)MIGRATION_REPORT_*.md'; \\\"\\\" when all three are empty>\",\n  \"target_models\": [{\"source_model\": \"...\", \"aws_model_id\": \"...\", \"use_case\": \"...\"}],\n  \"resolved_model_overrides\": {},\n  \"source_provider\": \"\u003Cfrom B1>\",\n  \"source_baseline_available\": \u003Ctrue|false from B3>,\n  \"source_key_sha256\": \"\u003Csha256 of .source-provider-env contents, \\\"\\\" when absent>\",\n  \"log_files\": [{\"path\": \"...\", \"sha256\": \"...\"}],\n  \"max_golden_cases\": 200,\n  \"assess_design_sha256\": \"\u003Csha256 of $MIGRATION_DIR\u002Faws-design-ai.json>\",\n  \"report_date_suffix\": \"\u003Cdate +%Y-%m-%d>\",\n  \"schema_version\": 1,\n  \"plugin_version\": \"\u003Cversion from \u003Cplugin>\u002F.claude-plugin\u002Fplugin.json>\"\n}\n```\n\n1. **Stage 0 (post-C5 normalization).** If `$PHASE_DIR\u002Frewrite.json` exists and validates as\n   a payload (`CONTROL=ok`), do NOT use live `repo_*` values. Run three integrity checks:\n   (1) `rewrite.baseline_parent_sha` equals the SAVED `repo_head_sha`; (2) `git rev-parse\n   \u003Crewrite.branch_name>` equals `rewrite.branch_tip_sha`; (3) `git status --porcelain` (with\n   the artifact exclusions) is empty. All pass → copy the saved `repo_*` values into\n   current-context verbatim, continue to step 3. Check 2 fails (tip moved) → STOP and\n   AskUserQuestion: \"Keep your commits (regenerate report only, with a mixed-authorship note)\"\n   \u002F \"Reset the branch to the rewriter's tip and regenerate from C6\" \u002F \"Abort\". Check 3 fails\n   (dirty tree) → STOP and ask: commit\u002Fstash (then re-check) or discard the edits. Check 1\n   fails → treat as a full `repo_*` mismatch in step 3.\n\n2. If `$PHASE_DIR\u002Frun-context.json` exists, compare:\n\n```bash\nuv run --project $SCRIPTS python $SCRIPTS\u002Fvalidate_result.py --check-run-context $PHASE_DIR\u002Frun-context.json --current $PHASE_DIR\u002Fcurrent-context.json\n```\n\n- `RUN_CONTEXT=match` → resume: walk C1→C2→C3→(C4: delta-decisions.json)→C5→(C6: report\n  file) in order; a phase counts completed iff its file validates with `CONTROL=ok` (C6:\n  iff `MIGRATION_REPORT_\u003Csaved suffix>.md` exists while rewrite.json is payload-valid).\n  STOP the walk at the first missing\u002Finvalid\u002Fcontrol-state file — blocked\u002Fpartial files\n  route to their flows below, NEVER count as completed. Offer the user \"skip completed\n  phases X..Y, resume at Z\". Files after an unexplained gap: archive them with the gap.\n- `RUN_CONTEXT=mismatch` → scoped invalidation. Map each MISMATCH line through this table,\n  archive the named units to `$REPO\u002F.saws-migrate\u002Fphase-results-archive\u002F\u003Csaved suffix>-$(date +%H%M%S)\u002F`\n  (a SIBLING of phase-results\u002F — never nest it inside), **then immediately overwrite\n  run-context.json with current-context.json** (carrying forward the saved\n  `report_date_suffix` unless REPORT itself is being invalidated), then re-run the\n  invalidated phases in order. Tell the user which fields differed and what re-runs.\n\n| Mismatched field(s)                                                                                                               | Archive (units)                 | Keep      |\n| --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | --------- |\n| repo_root, migration_dir, region, aws_profile, aws_account, source_provider, assess_design_sha256, schema_version, plugin_version | everything                      | —         |\n| repo_head_sha \u002F repo_branch \u002F repo_dirty_sha256                                                                                   | everything                      | —         |\n| target_models \u002F resolved_model_overrides                                                                                          | ANALYSIS, EVAL, REWRITE, REPORT | INGESTION |\n| log_files \u002F max_golden_cases                                                                                                      | everything                      | —         |\n| source_key_sha256 \u002F source_baseline_available                                                                                     | ANALYSIS, EVAL, REWRITE, REPORT | INGESTION |\n\nUnits: ANALYSIS = analysis.json · INGESTION = ingestion.json + `.saws-migrate\u002Fgolden-dataset\u002F`\n· EVAL = eval.json + `.saws-migrate\u002Feval-results\u002F` (minus cost_compare.py) · REWRITE =\nrewrite.json + delta-decisions.json · REPORT = `MIGRATION_REPORT_\u003Csaved suffix>.md`.\n\n**Post-C5 reruns of C1–C3 need the pre-migration tree.** If rewrite.json was payload-valid\nand the table invalidates ANALYSIS\u002FINGESTION\u002FEVAL: confirm with the user that the old\nmigration branch will be discarded (keep-or-reset flow first if the tip moved), then\n`git checkout \u003Csaved repo_branch>`, delete the old branch and the `saws-migrate-baseline`\ntag, and re-run from C1. If the user declines, stop — re-analyzing a tree that contains\nthe rewrite produces garbage.\n\n1. No saved run-context → fresh run: write current-context.json as run-context.json, dispatch C1.\n\n### C1 — Analyzer · C2 — Ingestor · C3 — Evaluator\n\nFor each phase in order, dispatch the agent with the context block (listing all\nprior-phase file paths), then validate its output file:\n\n| Step | agentType                                          | Output file                 | Schema    |\n| ---- | -------------------------------------------------- | --------------------------- | --------- |\n| C1   | `aws-startup-advisor:llm2bedrock-code-analyzer`    | `$PHASE_DIR\u002Fanalysis.json`  | analysis  |\n| C2   | `aws-startup-advisor:llm2bedrock-log-ingestor`     | `$PHASE_DIR\u002Fingestion.json` | ingestion |\n| C3   | `aws-startup-advisor:llm2bedrock-prompt-evaluator` | `$PHASE_DIR\u002Feval.json`      | eval      |\n\n**Blocked flow** (`CONTROL=blocked`): resolve with the user per REASON —\n\n- `model_access` → user enables the model in the Bedrock console (nothing fingerprinted\n  changes; re-dispatch the blocked phase only)\n- `model_unresolvable` → user picks\u002Fpastes an ID → record it in\n  `resolved_model_overrides`, fold it into the Target line\n- `source_key_auth` → user supplies a new key (re-run B3) or sets baseline unavailable\n- `assess_output_missing` → re-run Phase A, then restart Phase C at C0\n\nAfter ANY resolution, re-run the C0 recipe (rebuild current-context, apply the invalidation\ntable, overwrite run-context) and re-dispatch **from the earliest invalidated phase** — the\ntable, not the block location, decides where execution resumes.\n\n**Partial flow** (eval only, `CONTROL=partial`): AskUserQuestion —\n\n- **Continue remaining cases** → re-dispatch the evaluator with the extra context line:\n  `Resume: raw_results.jsonl already contains completed cases — evaluate only prompts whose\n  ids are not present in it, then re-score and overwrite eval.json`\n- **Proceed with partial pass rate** → re-dispatch the evaluator with: `Finalize partial: do\n  NOT call Bedrock again — score the cases already in raw_results.jsonl and emit the FULL\n  eval payload over only those cases, with total_cases = the number scored and a notes prefix\n  line 'partial_coverage: \u003Ccompleted>\u002F\u003Ctotal> cases (throttled)'`. Then C4 runs normally.\n- **Abort** → stop; the files stay on disk for a later C0 resume.\n\n### C4 — Sidebar (two gates) + persist decisions\n\n**Gate (a) — Quality go\u002Fno-go.** Read `$PHASE_DIR\u002Feval.json`. The threshold is\n**pass rate >= 0.9 AND `source_baseline_quality != 'poor'`** (with `no_golden_cases: true`\nin the notes there is no quality signal — always ask). At or above → proceed silently.\nBelow, AskUserQuestion:\n\n- **Proceed anyway** → gate (b)\n- **Change target model** → record in `resolved_model_overrides`, re-run C0 (the table\n  invalidates ANALYSIS\u002FEVAL and execution resumes at C1). Cap: 2 retries.\n- **Abort** → stop, no code touched.\n\n**Gate (a.5) — Rewrite strategy (from migration plan).** Read `migration_path` from\n`$MIGRATION_DIR\u002Faws-design-ai.json` → `ai_architecture.code_migration.migration_path`.\nIf the value is `\"mantle\"`, set `rewrite_strategy = \"mantle\"`. Otherwise (value is\n`\"converse\"`, `\"gpt-oss\"`, or the field is absent), set `rewrite_strategy = \"converse\"`.\nNo user question needed — the decision was already made during the Assess\u002FDesign phase.\n\n**Gate (b) — Behavior-delta resolution.** For each `analysis.behavior_deltas[]` with\n`user_visible == true`, AskUserQuestion with the options from the `behavior-delta-detection`\nreference (Read `$HELPERS\u002Fbehavior-delta-detection\u002Fbehavior-delta-detection.md`, and the\n`source_provider` sub-reference under its `references\u002F` dir).\n\n**Persist:** write the decisions array (entries `{delta_type, location, resolution_chosen,\nsource}`; `[]` when there were no user-visible deltas) to `$PHASE_DIR\u002Fdelta-decisions.json`\nand validate it (`--schema delta-decisions`). The file must exist before C5 — it is what\nmakes a C5 retry or a post-crash resume self-sufficient.\n\n### C5 — Rewriter · C6 — Report\n\n| Step | agentType                                          | Output                                            | Schema                                          |\n| ---- | -------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------- |\n| C5   | `aws-startup-advisor:llm2bedrock-code-rewriter`    | `$PHASE_DIR\u002Frewrite.json`                         | rewrite                                         |\n| C6   | `aws-startup-advisor:llm2bedrock-report-generator` | `MIGRATION_REPORT_\u003Csaved suffix>.md` in repo root | (none — file existence is the completion check) |\n\nC5's context block includes the `Confirmed behavior-delta decisions file` line and the\n`Report date suffix` line (from run-context, NOT today's date on a resume). C6's context\nblock lists all four phase-result file paths.\n\nWhen `rewrite_strategy == \"mantle\"`, C5's context block ALSO includes:\n\n- `Rewrite strategy: mantle` (omit this line entirely for Converse — its absence is the\n  signal for the default Converse path)\n- `Mantle model map: \u003Csource-model> -> \u003Cbedrock-model-id>` — sourced from the plan's\n  `ai_architecture.bedrock_models[]` entries (each `source_model` → `aws_model_id` pair).\n\n### C7 — Render summary\n\n```bash\nuv run --project $SCRIPTS python $SCRIPTS\u002Frender_report.py --phase-results $PHASE_DIR --repo $REPO --date-suffix \u003Csaved suffix>\n```\n\nPrint the summary. Point the user at `rewrite.branch_name` (usually `bedrock-migration`, but\na collision-suffixed variant like `bedrock-migration-2` when they already had that branch)\nand the report file. Tell them how to undo — substitute the ACTUAL branch name from\n`rewrite.branch_name`, never a hardcoded one (on a collision run, `bedrock-migration` is the\nuser's own pre-existing branch and deleting it would destroy their work):\n\n> To discard: `git checkout \u003Cyour original branch>`, `git branch -D \u003Crewrite.branch_name>`,\n> `git tag -d saws-migrate-baseline`, and `rm -rf .saws-migrate .migration` removes all\n> migration artifacts (including the API key file).\n\n---\n\n## Inline mode (platforms without an Agent\u002Fsubagent dispatch tool)\n\nIf this platform has no subagent dispatch tool, run phases inline ONE AT A TIME, with a\nmandatory stop between phases:\n\n1. `Read` exactly ONE agent definition (`\u003Cplugin>\u002Fagents\u002F\u003Cname>.md`) — never load more than\n   one phase's definition into context at once.\n2. Follow it start-to-finish; write and validate the same phase-result file.\n3. STOP. Report the phase outcome (validator CONTROL line + one-line summary) and ask the\n   user to confirm before loading the next phase's definition. This sidebar is mandatory:\n   it is the context-pressure release valve, and the phase-result file means nothing is lost\n   if the user continues in a fresh session instead.\n\nWarn the user up front that inline mode is slower and context-heavier than subagent dispatch,\nand that the rewriter phase performs git operations (branch, commits, worktree) directly in\nthis session.\n\n---\n\n## Failure handling\n\n- An agent dispatch dies (tool error, terminal failure) → the phase file is missing →\n  validator exit 2 → the stateless fixer-retry path (which, finding no file to fix, re-runs\n  the phase). Do not auto-retry more than the 2-retry cap.\n- User aborts at any gate → confirm no SOURCE CODE was modified (C5 never started if aborted\n  before then). Note that `.migration\u002F` and `.saws-migrate\u002F` artifacts do exist; show the\n  undo commands from C7 if the user wants them gone.\n- Assess skill fails → show the error and stop. User can re-run `\u002Faws-startup-advisor:llm-to-bedrock`.\n",{"data":41,"body":42},{"name":4,"description":6},{"type":43,"children":44},"root",[45,54,60,74,114,118,125,140,205,236,239,245,274,294,302,570,582,585,591,607,613,631,636,653,671,679,716,722,742,908,941,966,972,992,1059,1071,1107,1118,1121,1127,1133,1146,1195,1206,1220,1231,1261,1284,1290,1319,1352,1363,1368,1444,1456,1462,1467,1550,1571,1628,1638,1659,1729,1739,1752,2085,2097,2172,2185,2198,2223,2229,2316,2335,2370,2547,2550,2556,2612,2618,2732,2800,2806,2811,2821,2826,2851,2985,3012,3018,3023,3053,3954,4055,4122,4184,4295,4322,4348,4356,4362,4367,4486,4504,4558,4570,4588,4635,4641,4679,4718,4788,4845,4887,4893,4981,5002,5015,5060,5066,5153,5196,5234,5237,5243,5248,5280,5285,5288,5294,5333],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"migrate-to-bedrock-assess-execute",[51],{"type":52,"value":53},"text","Migrate to Bedrock (Assess + Execute)",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58],{"type":52,"value":59},"Single-command AI migration: OpenAI \u002F Gemini \u002F Anthropic → Amazon Bedrock.",{"type":46,"tag":55,"props":61,"children":62},{},[63,65,72],{"type":52,"value":64},"The skill base directory is given in the \"Base directory for this skill: X\" line the harness\nemits at load time. Call it ",{"type":46,"tag":66,"props":67,"children":69},"code",{"className":68},[],[70],{"type":52,"value":71},"\u003CSKILL_BASE>",{"type":52,"value":73},". Derived paths:",{"type":46,"tag":75,"props":76,"children":77},"ul",{},[78,96],{"type":46,"tag":79,"props":80,"children":81},"li",{},[82,88,90],{"type":46,"tag":66,"props":83,"children":85},{"className":84},[],[86],{"type":52,"value":87},"$SCRIPTS",{"type":52,"value":89}," = ",{"type":46,"tag":66,"props":91,"children":93},{"className":92},[],[94],{"type":52,"value":95},"\u003CSKILL_BASE>\u002Fscripts",{"type":46,"tag":79,"props":97,"children":98},{},[99,105,106,112],{"type":46,"tag":66,"props":100,"children":102},{"className":101},[],[103],{"type":52,"value":104},"$HELPERS",{"type":52,"value":89},{"type":46,"tag":66,"props":107,"children":109},{"className":108},[],[110],{"type":52,"value":111},"\u003CSKILL_BASE>\u002Freferences\u002Fhelpers",{"type":52,"value":113}," (the former helper skills, now references)",{"type":46,"tag":115,"props":116,"children":117},"hr",{},[],{"type":46,"tag":119,"props":120,"children":122},"h2",{"id":121},"step-0-check-prerequisites",[123],{"type":52,"value":124},"Step 0 — Check prerequisites",{"type":46,"tag":126,"props":127,"children":129},"h3",{"id":128},"_0a-check-that-uv-is-available",[130,132,138],{"type":52,"value":131},"0a. Check that ",{"type":46,"tag":66,"props":133,"children":135},{"className":134},[],[136],{"type":52,"value":137},"uv",{"type":52,"value":139}," is available",{"type":46,"tag":141,"props":142,"children":147},"pre",{"className":143,"code":144,"language":145,"meta":146,"style":146},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","uv --version 2>\u002Fdev\u002Fnull || echo \"MISSING\"\n","bash","",[148],{"type":46,"tag":66,"props":149,"children":150},{"__ignoreMap":146},[151],{"type":46,"tag":152,"props":153,"children":156},"span",{"class":154,"line":155},"line",1,[157,162,168,174,179,184,190,195,200],{"type":46,"tag":152,"props":158,"children":160},{"style":159},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[161],{"type":52,"value":137},{"type":46,"tag":152,"props":163,"children":165},{"style":164},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[166],{"type":52,"value":167}," --version",{"type":46,"tag":152,"props":169,"children":171},{"style":170},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[172],{"type":52,"value":173}," 2>",{"type":46,"tag":152,"props":175,"children":176},{"style":164},[177],{"type":52,"value":178},"\u002Fdev\u002Fnull",{"type":46,"tag":152,"props":180,"children":181},{"style":170},[182],{"type":52,"value":183}," ||",{"type":46,"tag":152,"props":185,"children":187},{"style":186},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[188],{"type":52,"value":189}," echo",{"type":46,"tag":152,"props":191,"children":192},{"style":170},[193],{"type":52,"value":194}," \"",{"type":46,"tag":152,"props":196,"children":197},{"style":164},[198],{"type":52,"value":199},"MISSING",{"type":46,"tag":152,"props":201,"children":202},{"style":170},[203],{"type":52,"value":204},"\"\n",{"type":46,"tag":55,"props":206,"children":207},{},[208,210,218,220,226,228,234],{"type":52,"value":209},"If missing: \"Install uv first — see the official install guide: ",{"type":46,"tag":211,"props":212,"children":216},"a",{"href":213,"rel":214},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fgetting-started\u002Finstallation\u002F",[215],"nofollow",[217],{"type":52,"value":213},{"type":52,"value":219}," (e.g. ",{"type":46,"tag":66,"props":221,"children":223},{"className":222},[],[224],{"type":52,"value":225},"brew install uv",{"type":52,"value":227}," or ",{"type":46,"tag":66,"props":229,"children":231},{"className":230},[],[232],{"type":52,"value":233},"pipx install uv",{"type":52,"value":235},")\". Stop.",{"type":46,"tag":115,"props":237,"children":238},{},[],{"type":46,"tag":119,"props":240,"children":242},{"id":241},"step-1-collect-source-code-path",[243],{"type":52,"value":244},"Step 1 — Collect source code path",{"type":46,"tag":55,"props":246,"children":247},{},[248,250,256,258,264,266,272],{"type":52,"value":249},"If ",{"type":46,"tag":66,"props":251,"children":253},{"className":252},[],[254],{"type":52,"value":255},"$ARGUMENTS",{"type":52,"value":257}," contains a path, use it as ",{"type":46,"tag":66,"props":259,"children":261},{"className":260},[],[262],{"type":52,"value":263},"$REPO",{"type":52,"value":265},". Otherwise use ",{"type":46,"tag":267,"props":268,"children":269},"strong",{},[270],{"type":52,"value":271},"AskUserQuestion",{"type":52,"value":273},":\n\"Where is your source code? Enter a local path or GitHub URL.\"",{"type":46,"tag":55,"props":275,"children":276},{},[277,279,285,287,292],{"type":52,"value":278},"If a GitHub URL, ",{"type":46,"tag":66,"props":280,"children":282},{"className":281},[],[283],{"type":52,"value":284},"git clone",{"type":52,"value":286}," it to a temp dir; use that path as ",{"type":46,"tag":66,"props":288,"children":290},{"className":289},[],[291],{"type":52,"value":263},{"type":52,"value":293},".",{"type":46,"tag":55,"props":295,"children":296},{},[297],{"type":46,"tag":267,"props":298,"children":299},{},[300],{"type":52,"value":301},"Checks on $REPO:",{"type":46,"tag":303,"props":304,"children":305},"ol",{},[306,508],{"type":46,"tag":79,"props":307,"children":308},{},[309,314,316,322,324,330,332,473],{"type":46,"tag":267,"props":310,"children":311},{},[312],{"type":52,"value":313},"Git-root check",{"type":52,"value":315}," (compare resolved paths — on macOS ",{"type":46,"tag":66,"props":317,"children":319},{"className":318},[],[320],{"type":52,"value":321},"\u002Ftmp",{"type":52,"value":323}," resolves to ",{"type":46,"tag":66,"props":325,"children":327},{"className":326},[],[328],{"type":52,"value":329},"\u002Fprivate\u002Ftmp",{"type":52,"value":331},",\nso a raw string comparison false-positives):",{"type":46,"tag":141,"props":333,"children":335},{"className":143,"code":334,"language":145,"meta":146,"style":146},"[ \"$(git -C \u003CREPO> rev-parse --show-toplevel 2>\u002Fdev\u002Fnull)\" = \"$(cd \u003CREPO> && pwd -P)\" ] && echo GIT_ROOT_OK || echo GIT_ROOT_MISMATCH\n",[336],{"type":46,"tag":66,"props":337,"children":338},{"__ignoreMap":146},[339],{"type":46,"tag":152,"props":340,"children":341},{"class":154,"line":155},[342,347,352,357,362,367,372,377,382,387,391,396,401,405,410,415,419,423,428,433,438,442,447,451,455,460,464,468],{"type":46,"tag":152,"props":343,"children":344},{"style":170},[345],{"type":52,"value":346},"[",{"type":46,"tag":152,"props":348,"children":349},{"style":170},[350],{"type":52,"value":351}," \"$(",{"type":46,"tag":152,"props":353,"children":354},{"style":159},[355],{"type":52,"value":356},"git",{"type":46,"tag":152,"props":358,"children":359},{"style":164},[360],{"type":52,"value":361}," -C ",{"type":46,"tag":152,"props":363,"children":364},{"style":170},[365],{"type":52,"value":366},"\u003C",{"type":46,"tag":152,"props":368,"children":369},{"style":164},[370],{"type":52,"value":371},"REPO",{"type":46,"tag":152,"props":373,"children":374},{"style":170},[375],{"type":52,"value":376},">",{"type":46,"tag":152,"props":378,"children":379},{"style":164},[380],{"type":52,"value":381}," rev-parse --show-toplevel ",{"type":46,"tag":152,"props":383,"children":384},{"style":170},[385],{"type":52,"value":386},"2>",{"type":46,"tag":152,"props":388,"children":389},{"style":164},[390],{"type":52,"value":178},{"type":46,"tag":152,"props":392,"children":393},{"style":170},[394],{"type":52,"value":395},")\"",{"type":46,"tag":152,"props":397,"children":398},{"style":170},[399],{"type":52,"value":400}," =",{"type":46,"tag":152,"props":402,"children":403},{"style":170},[404],{"type":52,"value":351},{"type":46,"tag":152,"props":406,"children":407},{"style":186},[408],{"type":52,"value":409},"cd",{"type":46,"tag":152,"props":411,"children":412},{"style":170},[413],{"type":52,"value":414}," \u003C",{"type":46,"tag":152,"props":416,"children":417},{"style":164},[418],{"type":52,"value":371},{"type":46,"tag":152,"props":420,"children":421},{"style":170},[422],{"type":52,"value":376},{"type":46,"tag":152,"props":424,"children":425},{"style":170},[426],{"type":52,"value":427}," &&",{"type":46,"tag":152,"props":429,"children":430},{"style":186},[431],{"type":52,"value":432}," pwd",{"type":46,"tag":152,"props":434,"children":435},{"style":164},[436],{"type":52,"value":437}," -P",{"type":46,"tag":152,"props":439,"children":440},{"style":170},[441],{"type":52,"value":395},{"type":46,"tag":152,"props":443,"children":444},{"style":170},[445],{"type":52,"value":446}," ]",{"type":46,"tag":152,"props":448,"children":449},{"style":170},[450],{"type":52,"value":427},{"type":46,"tag":152,"props":452,"children":453},{"style":186},[454],{"type":52,"value":189},{"type":46,"tag":152,"props":456,"children":457},{"style":164},[458],{"type":52,"value":459}," GIT_ROOT_OK",{"type":46,"tag":152,"props":461,"children":462},{"style":170},[463],{"type":52,"value":183},{"type":46,"tag":152,"props":465,"children":466},{"style":186},[467],{"type":52,"value":189},{"type":46,"tag":152,"props":469,"children":470},{"style":164},[471],{"type":52,"value":472}," GIT_ROOT_MISMATCH\n",{"type":46,"tag":75,"props":474,"children":475},{},[476,487,498],{"type":46,"tag":79,"props":477,"children":478},{},[479,485],{"type":46,"tag":66,"props":480,"children":482},{"className":481},[],[483],{"type":52,"value":484},"GIT_ROOT_OK",{"type":52,"value":486}," → proceed.",{"type":46,"tag":79,"props":488,"children":489},{},[490,496],{"type":46,"tag":66,"props":491,"children":493},{"className":492},[],[494],{"type":52,"value":495},"GIT_ROOT_MISMATCH",{"type":52,"value":497}," and the command errored (not a git repo at all) → tell the user the\npath must be a git repository (the deliverable is a git branch); re-ask.",{"type":46,"tag":79,"props":499,"children":500},{},[501,506],{"type":46,"tag":66,"props":502,"children":504},{"className":503},[],[505],{"type":52,"value":495},{"type":52,"value":507}," but inside a repo (user pointed at a subdirectory) → AskUserQuestion:\n\"Use the repo root instead\" (recommended) \u002F \"Continue with this subdirectory\" \u002F \"Abort\".",{"type":46,"tag":79,"props":509,"children":510},{},[511,516,564,568],{"type":46,"tag":267,"props":512,"children":513},{},[514],{"type":52,"value":515},"Dirty-tree check:",{"type":46,"tag":141,"props":517,"children":519},{"className":143,"code":518,"language":145,"meta":146,"style":146},"git -C \u003CREPO> status --porcelain\n",[520],{"type":46,"tag":66,"props":521,"children":522},{"__ignoreMap":146},[523],{"type":46,"tag":152,"props":524,"children":525},{"class":154,"line":155},[526,530,535,539,544,550,554,559],{"type":46,"tag":152,"props":527,"children":528},{"style":159},[529],{"type":52,"value":356},{"type":46,"tag":152,"props":531,"children":532},{"style":164},[533],{"type":52,"value":534}," -C",{"type":46,"tag":152,"props":536,"children":537},{"style":170},[538],{"type":52,"value":414},{"type":46,"tag":152,"props":540,"children":541},{"style":164},[542],{"type":52,"value":543},"REP",{"type":46,"tag":152,"props":545,"children":547},{"style":546},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[548],{"type":52,"value":549},"O",{"type":46,"tag":152,"props":551,"children":552},{"style":170},[553],{"type":52,"value":376},{"type":46,"tag":152,"props":555,"children":556},{"style":164},[557],{"type":52,"value":558}," status",{"type":46,"tag":152,"props":560,"children":561},{"style":164},[562],{"type":52,"value":563}," --porcelain\n",{"type":46,"tag":565,"props":566,"children":567},"br",{},[],{"type":52,"value":569},"If uncommitted changes exist, show them and AskUserQuestion: \"Continue anyway\" or \"Let me clean up first\".",{"type":46,"tag":55,"props":571,"children":572},{},[573,575,580],{"type":52,"value":574},"Record ",{"type":46,"tag":66,"props":576,"children":578},{"className":577},[],[579],{"type":52,"value":263},{"type":52,"value":581}," for all subsequent steps.",{"type":46,"tag":115,"props":583,"children":584},{},[],{"type":46,"tag":119,"props":586,"children":588},{"id":587},"phase-a-assess-mandatory-delegate-to-the-gcp-to-aws-skill",[589],{"type":52,"value":590},"Phase A — Assess (MANDATORY: delegate to the gcp-to-aws skill)",{"type":46,"tag":55,"props":592,"children":593},{},[594],{"type":46,"tag":267,"props":595,"children":596},{},[597,599,605],{"type":52,"value":598},"CRITICAL: You MUST use the Skill tool to invoke ",{"type":46,"tag":66,"props":600,"children":602},{"className":601},[],[603],{"type":52,"value":604},"aws-startup-advisor:gcp-to-aws",{"type":52,"value":606}," (a sibling skill\nin this same plugin). Do NOT perform the Assess phase yourself. Do NOT read source code, detect\nAI SDKs, or ask Clarify questions manually. The entire Assess phase is handled by the gcp-to-aws\nskill — you only invoke it and wait for completion.",{"type":46,"tag":126,"props":608,"children":610},{"id":609},"a1-invoke-the-assess-skill",[611],{"type":52,"value":612},"A1 — Invoke the Assess skill",{"type":46,"tag":55,"props":614,"children":615},{},[616,618,623,625,630],{"type":52,"value":617},"Call the ",{"type":46,"tag":267,"props":619,"children":620},{},[621],{"type":52,"value":622},"Skill",{"type":52,"value":624}," tool with skill name ",{"type":46,"tag":66,"props":626,"children":628},{"className":627},[],[629],{"type":52,"value":604},{"type":52,"value":293},{"type":46,"tag":55,"props":632,"children":633},{},[634],{"type":52,"value":635},"Before invoking, tell the user:",{"type":46,"tag":637,"props":638,"children":639},"blockquote",{},[640],{"type":46,"tag":55,"props":641,"children":642},{},[643,645,651],{"type":52,"value":644},"\"I'm now invoking the gcp-to-aws Assess skill to discover your AI workloads and design\nthe Bedrock migration. It will ask you some questions — please answer them. (Don't be\nconfused by the skill's ",{"type":46,"tag":66,"props":646,"children":648},{"className":647},[],[649],{"type":52,"value":650},"gcp-to-aws",{"type":52,"value":652}," name — it also covers pure AI\u002FLLM migrations with no\nGCP or infrastructure component, which is how it's being used here.)\"",{"type":46,"tag":55,"props":654,"children":655},{},[656,658,663,665,670],{"type":52,"value":657},"After invoking the Skill tool, the ",{"type":46,"tag":66,"props":659,"children":661},{"className":660},[],[662],{"type":52,"value":650},{"type":52,"value":664}," skill instructions will load into context.\nFollow those instructions exactly — they will drive the Discover, Clarify, Design, Estimate,\nand Generate phases. The source code to scan is at ",{"type":46,"tag":66,"props":666,"children":668},{"className":667},[],[669],{"type":52,"value":263},{"type":52,"value":293},{"type":46,"tag":55,"props":672,"children":673},{},[674],{"type":46,"tag":267,"props":675,"children":676},{},[677],{"type":52,"value":678},"Important context for the gcp-to-aws skill execution:",{"type":46,"tag":75,"props":680,"children":681},{},[682,694,699,711],{"type":46,"tag":79,"props":683,"children":684},{},[685,687,692],{"type":52,"value":686},"Source code is at ",{"type":46,"tag":66,"props":688,"children":690},{"className":689},[],[691],{"type":52,"value":263},{"type":52,"value":693}," — when the skill asks for GCP sources or scans for files, point it there",{"type":46,"tag":79,"props":695,"children":696},{},[697],{"type":52,"value":698},"This is an AI\u002FLLM workload migration — the AI path is the goal",{"type":46,"tag":79,"props":700,"children":701},{},[702,704,709],{"type":52,"value":703},"Unless Terraform\u002FIaC files are actually present in ",{"type":46,"tag":66,"props":705,"children":707},{"className":706},[],[708],{"type":52,"value":263},{"type":52,"value":710},", skip IaC discovery",{"type":46,"tag":79,"props":712,"children":713},{},[714],{"type":52,"value":715},"Unless the user offers billing data, skip billing discovery",{"type":46,"tag":126,"props":717,"children":719},{"id":718},"a2-wait-for-assess-completion",[720],{"type":52,"value":721},"A2 — Wait for Assess completion",{"type":46,"tag":55,"props":723,"children":724},{},[725,727,732,734,740],{"type":52,"value":726},"The ",{"type":46,"tag":66,"props":728,"children":730},{"className":729},[],[731],{"type":52,"value":650},{"type":52,"value":733}," skill is a state machine. After each phase completes, it may stop and wait\nfor the next invocation. Check progress against the LATEST run directory only (older\n",{"type":46,"tag":66,"props":735,"children":737},{"className":736},[],[738],{"type":52,"value":739},".migration\u002F",{"type":52,"value":741}," runs may contain a stale \"completed\" status):",{"type":46,"tag":141,"props":743,"children":745},{"className":143,"code":744,"language":145,"meta":146,"style":146},"MIGRATION_DIR=$(ls -td \"$REPO\u002F.migration\"\u002F*\u002F 2>\u002Fdev\u002Fnull | head -1)\n# Stdlib-only JSON read — no boto3, so bare python3 is fine here (no pinned env needed).\npython3 -c \"import json,sys; print(json.load(open('$MIGRATION_DIR\u002F.phase-status.json'))['phases'].get('generate','missing'))\" 2>\u002Fdev\u002Fnull || echo \"no-status-file\"\n",[746],{"type":46,"tag":66,"props":747,"children":748},{"__ignoreMap":146},[749,832,842],{"type":46,"tag":152,"props":750,"children":751},{"class":154,"line":155},[752,757,762,767,772,776,780,785,790,795,800,804,808,812,817,822,827],{"type":46,"tag":152,"props":753,"children":754},{"style":546},[755],{"type":52,"value":756},"MIGRATION_DIR",{"type":46,"tag":152,"props":758,"children":759},{"style":170},[760],{"type":52,"value":761},"=$(",{"type":46,"tag":152,"props":763,"children":764},{"style":159},[765],{"type":52,"value":766},"ls",{"type":46,"tag":152,"props":768,"children":769},{"style":164},[770],{"type":52,"value":771}," -td",{"type":46,"tag":152,"props":773,"children":774},{"style":170},[775],{"type":52,"value":194},{"type":46,"tag":152,"props":777,"children":778},{"style":546},[779],{"type":52,"value":263},{"type":46,"tag":152,"props":781,"children":782},{"style":164},[783],{"type":52,"value":784},"\u002F.migration",{"type":46,"tag":152,"props":786,"children":787},{"style":170},[788],{"type":52,"value":789},"\"",{"type":46,"tag":152,"props":791,"children":792},{"style":164},[793],{"type":52,"value":794},"\u002F",{"type":46,"tag":152,"props":796,"children":797},{"style":546},[798],{"type":52,"value":799},"*",{"type":46,"tag":152,"props":801,"children":802},{"style":164},[803],{"type":52,"value":794},{"type":46,"tag":152,"props":805,"children":806},{"style":170},[807],{"type":52,"value":173},{"type":46,"tag":152,"props":809,"children":810},{"style":164},[811],{"type":52,"value":178},{"type":46,"tag":152,"props":813,"children":814},{"style":170},[815],{"type":52,"value":816}," |",{"type":46,"tag":152,"props":818,"children":819},{"style":159},[820],{"type":52,"value":821}," head",{"type":46,"tag":152,"props":823,"children":824},{"style":164},[825],{"type":52,"value":826}," -1",{"type":46,"tag":152,"props":828,"children":829},{"style":170},[830],{"type":52,"value":831},")\n",{"type":46,"tag":152,"props":833,"children":835},{"class":154,"line":834},2,[836],{"type":46,"tag":152,"props":837,"children":839},{"style":838},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[840],{"type":52,"value":841},"# Stdlib-only JSON read — no boto3, so bare python3 is fine here (no pinned env needed).\n",{"type":46,"tag":152,"props":843,"children":845},{"class":154,"line":844},3,[846,851,856,860,865,870,875,879,883,887,891,895,899,904],{"type":46,"tag":152,"props":847,"children":848},{"style":159},[849],{"type":52,"value":850},"python3",{"type":46,"tag":152,"props":852,"children":853},{"style":164},[854],{"type":52,"value":855}," -c",{"type":46,"tag":152,"props":857,"children":858},{"style":170},[859],{"type":52,"value":194},{"type":46,"tag":152,"props":861,"children":862},{"style":164},[863],{"type":52,"value":864},"import json,sys; print(json.load(open('",{"type":46,"tag":152,"props":866,"children":867},{"style":546},[868],{"type":52,"value":869},"$MIGRATION_DIR",{"type":46,"tag":152,"props":871,"children":872},{"style":164},[873],{"type":52,"value":874},"\u002F.phase-status.json'))['phases'].get('generate','missing'))",{"type":46,"tag":152,"props":876,"children":877},{"style":170},[878],{"type":52,"value":789},{"type":46,"tag":152,"props":880,"children":881},{"style":170},[882],{"type":52,"value":173},{"type":46,"tag":152,"props":884,"children":885},{"style":164},[886],{"type":52,"value":178},{"type":46,"tag":152,"props":888,"children":889},{"style":170},[890],{"type":52,"value":183},{"type":46,"tag":152,"props":892,"children":893},{"style":186},[894],{"type":52,"value":189},{"type":46,"tag":152,"props":896,"children":897},{"style":170},[898],{"type":52,"value":194},{"type":46,"tag":152,"props":900,"children":901},{"style":164},[902],{"type":52,"value":903},"no-status-file",{"type":46,"tag":152,"props":905,"children":906},{"style":170},[907],{"type":52,"value":204},{"type":46,"tag":75,"props":909,"children":910},{},[911,922],{"type":46,"tag":79,"props":912,"children":913},{},[914,920],{"type":46,"tag":66,"props":915,"children":917},{"className":916},[],[918],{"type":52,"value":919},"completed",{"type":52,"value":921}," → proceed to A3.",{"type":46,"tag":79,"props":923,"children":924},{},[925,927,932,934,939],{"type":52,"value":926},"Anything else (including ",{"type":46,"tag":66,"props":928,"children":930},{"className":929},[],[931],{"type":52,"value":903},{"type":52,"value":933},") → the skill needs to run again. Re-invoke\n",{"type":46,"tag":66,"props":935,"children":937},{"className":936},[],[938],{"type":52,"value":604},{"type":52,"value":940}," via the Skill tool — it picks up where it left off.",{"type":46,"tag":55,"props":942,"children":943},{},[944,949,951,957,959,964],{"type":46,"tag":267,"props":945,"children":946},{},[947],{"type":52,"value":948},"Cap: at most 6 re-invocations.",{"type":52,"value":950}," If ",{"type":46,"tag":66,"props":952,"children":954},{"className":953},[],[955],{"type":52,"value":956},"generate",{"type":52,"value":958}," is still not ",{"type":46,"tag":66,"props":960,"children":962},{"className":961},[],[963],{"type":52,"value":919},{"type":52,"value":965}," after 6, stop and\nshow the user the last status output — the Assess skill is stuck and needs manual attention;\nlooping further just burns context.",{"type":46,"tag":126,"props":967,"children":969},{"id":968},"a3-locate-assess-output",[970],{"type":52,"value":971},"A3 — Locate Assess output",{"type":46,"tag":55,"props":973,"children":974},{},[975,977,982,984,990],{"type":52,"value":976},"Find ",{"type":46,"tag":66,"props":978,"children":980},{"className":979},[],[981],{"type":52,"value":869},{"type":52,"value":983}," (the ",{"type":46,"tag":66,"props":985,"children":987},{"className":986},[],[988],{"type":52,"value":989},".migration\u002F\u003CMMDD-HHMM>\u002F",{"type":52,"value":991}," directory that was created):",{"type":46,"tag":141,"props":993,"children":995},{"className":143,"code":994,"language":145,"meta":146,"style":146},"ls -td \"$REPO\u002F.migration\"\u002F*\u002F 2>\u002Fdev\u002Fnull | head -1\n",[996],{"type":46,"tag":66,"props":997,"children":998},{"__ignoreMap":146},[999],{"type":46,"tag":152,"props":1000,"children":1001},{"class":154,"line":155},[1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054],{"type":46,"tag":152,"props":1003,"children":1004},{"style":159},[1005],{"type":52,"value":766},{"type":46,"tag":152,"props":1007,"children":1008},{"style":164},[1009],{"type":52,"value":771},{"type":46,"tag":152,"props":1011,"children":1012},{"style":170},[1013],{"type":52,"value":194},{"type":46,"tag":152,"props":1015,"children":1016},{"style":546},[1017],{"type":52,"value":263},{"type":46,"tag":152,"props":1019,"children":1020},{"style":164},[1021],{"type":52,"value":784},{"type":46,"tag":152,"props":1023,"children":1024},{"style":170},[1025],{"type":52,"value":789},{"type":46,"tag":152,"props":1027,"children":1028},{"style":164},[1029],{"type":52,"value":794},{"type":46,"tag":152,"props":1031,"children":1032},{"style":546},[1033],{"type":52,"value":799},{"type":46,"tag":152,"props":1035,"children":1036},{"style":164},[1037],{"type":52,"value":794},{"type":46,"tag":152,"props":1039,"children":1040},{"style":170},[1041],{"type":52,"value":173},{"type":46,"tag":152,"props":1043,"children":1044},{"style":164},[1045],{"type":52,"value":178},{"type":46,"tag":152,"props":1047,"children":1048},{"style":170},[1049],{"type":52,"value":816},{"type":46,"tag":152,"props":1051,"children":1052},{"style":159},[1053],{"type":52,"value":821},{"type":46,"tag":152,"props":1055,"children":1056},{"style":164},[1057],{"type":52,"value":1058}," -1\n",{"type":46,"tag":55,"props":1060,"children":1061},{},[1062,1064,1069],{"type":52,"value":1063},"Verify these files exist in ",{"type":46,"tag":66,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":52,"value":869},{"type":52,"value":1070},":",{"type":46,"tag":75,"props":1072,"children":1073},{},[1074,1085,1096],{"type":46,"tag":79,"props":1075,"children":1076},{},[1077,1083],{"type":46,"tag":66,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":52,"value":1082},"aws-design-ai.json",{"type":52,"value":1084}," (model mapping + architecture)",{"type":46,"tag":79,"props":1086,"children":1087},{},[1088,1094],{"type":46,"tag":66,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":52,"value":1093},"ai-workload-profile.json",{"type":52,"value":1095}," (detected workloads)",{"type":46,"tag":79,"props":1097,"children":1098},{},[1099,1105],{"type":46,"tag":66,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":52,"value":1104},"preferences.json",{"type":52,"value":1106}," (user preferences from Clarify)",{"type":46,"tag":55,"props":1108,"children":1109},{},[1110,1111,1116],{"type":52,"value":249},{"type":46,"tag":66,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":52,"value":1082},{"type":52,"value":1117}," is missing, Assess did not complete the AI path correctly. Show the\nerror and stop.",{"type":46,"tag":115,"props":1119,"children":1120},{},[],{"type":46,"tag":119,"props":1122,"children":1124},{"id":1123},"phase-b-execute-prep",[1125],{"type":52,"value":1126},"Phase B — Execute Prep",{"type":46,"tag":126,"props":1128,"children":1130},{"id":1129},"b1-read-assess-outputs",[1131],{"type":52,"value":1132},"B1 — Read Assess outputs",{"type":46,"tag":55,"props":1134,"children":1135},{},[1136,1138,1144],{"type":52,"value":1137},"Read ",{"type":46,"tag":66,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":52,"value":1143},"$MIGRATION_DIR\u002Faws-design-ai.json",{"type":52,"value":1145}," and extract:",{"type":46,"tag":75,"props":1147,"children":1148},{},[1149,1166],{"type":46,"tag":79,"props":1150,"children":1151},{},[1152,1158,1160],{"type":46,"tag":66,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":52,"value":1157},"ai_architecture.bedrock_models[]",{"type":52,"value":1159}," → array of ",{"type":46,"tag":66,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":52,"value":1165},"{source_model, aws_model_id, use_case}",{"type":46,"tag":79,"props":1167,"children":1168},{},[1169,1171,1177,1179,1185,1187,1193],{"type":52,"value":1170},"Collect all ",{"type":46,"tag":66,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":52,"value":1176},"aws_model_id",{"type":52,"value":1178}," values into ",{"type":46,"tag":66,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":52,"value":1184},"$TARGET_MODELS",{"type":52,"value":1186}," (array). Keep the ",{"type":46,"tag":66,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":52,"value":1192},"use_case",{"type":52,"value":1194}," of each:\nthe preflight script probes each model by the right API automatically (Converse for chat,\nInvokeModel for embeddings), but the evaluator's quality scoring only applies to chat models —\nembedding targets get format\u002Fdimension validation only.",{"type":46,"tag":55,"props":1196,"children":1197},{},[1198,1199,1205],{"type":52,"value":1137},{"type":46,"tag":66,"props":1200,"children":1202},{"className":1201},[],[1203],{"type":52,"value":1204},"$MIGRATION_DIR\u002Fai-workload-profile.json",{"type":52,"value":1145},{"type":46,"tag":75,"props":1207,"children":1208},{},[1209],{"type":46,"tag":79,"props":1210,"children":1211},{},[1212,1218],{"type":46,"tag":66,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":52,"value":1217},"summary.ai_source",{"type":52,"value":1219}," → source provider",{"type":46,"tag":55,"props":1221,"children":1222},{},[1223,1224,1230],{"type":52,"value":1137},{"type":46,"tag":66,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":52,"value":1229},"$MIGRATION_DIR\u002Fpreferences.json",{"type":52,"value":1145},{"type":46,"tag":75,"props":1232,"children":1233},{},[1234],{"type":46,"tag":79,"props":1235,"children":1236},{},[1237,1243,1245,1251,1253,1259],{"type":46,"tag":66,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":52,"value":1242},"design_constraints.target_region",{"type":52,"value":1244}," → ",{"type":46,"tag":66,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":52,"value":1250},"$REGION",{"type":52,"value":1252}," (default ",{"type":46,"tag":66,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":52,"value":1258},"us-east-1",{"type":52,"value":1260}," if absent)",{"type":46,"tag":55,"props":1262,"children":1263},{},[1264,1269,1270,1275,1277,1282],{"type":46,"tag":267,"props":1265,"children":1266},{},[1267],{"type":52,"value":1268},"Validation:",{"type":52,"value":950},{"type":46,"tag":66,"props":1271,"children":1273},{"className":1272},[],[1274],{"type":52,"value":1082},{"type":52,"value":1276}," has no ",{"type":46,"tag":66,"props":1278,"children":1280},{"className":1279},[],[1281],{"type":52,"value":1157},{"type":52,"value":1283}," array, or the\narray is empty, STOP: \"Assess output incomplete — model mapping missing.\"",{"type":46,"tag":126,"props":1285,"children":1287},{"id":1286},"b2-aws-identity-confirmation",[1288],{"type":52,"value":1289},"B2 — AWS identity confirmation",{"type":46,"tag":141,"props":1291,"children":1293},{"className":143,"code":1292,"language":145,"meta":146,"style":146},"aws sts get-caller-identity 2>&1\n",[1294],{"type":46,"tag":66,"props":1295,"children":1296},{"__ignoreMap":146},[1297],{"type":46,"tag":152,"props":1298,"children":1299},{"class":154,"line":155},[1300,1304,1309,1314],{"type":46,"tag":152,"props":1301,"children":1302},{"style":159},[1303],{"type":52,"value":28},{"type":46,"tag":152,"props":1305,"children":1306},{"style":164},[1307],{"type":52,"value":1308}," sts",{"type":46,"tag":152,"props":1310,"children":1311},{"style":164},[1312],{"type":52,"value":1313}," get-caller-identity",{"type":46,"tag":152,"props":1315,"children":1316},{"style":170},[1317],{"type":52,"value":1318}," 2>&1\n",{"type":46,"tag":55,"props":1320,"children":1321},{},[1322,1327,1329,1335,1336,1342,1344,1350],{"type":46,"tag":267,"props":1323,"children":1324},{},[1325],{"type":52,"value":1326},"If the command fails",{"type":52,"value":1328}," (no credentials, expired SSO token): show the error and tell the user\nto run ",{"type":46,"tag":66,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":52,"value":1334},"aws configure",{"type":52,"value":227},{"type":46,"tag":66,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":52,"value":1341},"aws sso login",{"type":52,"value":1343}," (suggest typing ",{"type":46,"tag":66,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":52,"value":1349},"! aws sso login",{"type":52,"value":1351}," to run it in this\nsession), then re-run B2. Do not proceed without a confirmed identity.",{"type":46,"tag":55,"props":1353,"children":1354},{},[1355,1357,1361],{"type":52,"value":1356},"On success, show Account, Arn, UserId via ",{"type":46,"tag":267,"props":1358,"children":1359},{},[1360],{"type":52,"value":271},{"type":52,"value":1362},":\n\"This AWS identity will be used for Bedrock calls. Is this correct?\"",{"type":46,"tag":55,"props":1364,"children":1365},{},[1366],{"type":52,"value":1367},"Options:",{"type":46,"tag":75,"props":1369,"children":1370},{},[1371,1381],{"type":46,"tag":79,"props":1372,"children":1373},{},[1374,1379],{"type":46,"tag":267,"props":1375,"children":1376},{},[1377],{"type":52,"value":1378},"Yes, use this identity",{"type":52,"value":1380}," → proceed",{"type":46,"tag":79,"props":1382,"children":1383},{},[1384,1389,1391,1397,1399,1405,1407,1418,1420,1426,1428,1434,1436,1442],{"type":46,"tag":267,"props":1385,"children":1386},{},[1387],{"type":52,"value":1388},"Use a different AWS profile",{"type":52,"value":1390}," → ask which profile, record it as ",{"type":46,"tag":66,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":52,"value":1396},"$AWS_PROFILE_CHOICE",{"type":52,"value":1398},",\nre-run B2 as ",{"type":46,"tag":66,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":52,"value":1404},"aws sts get-caller-identity --profile $AWS_PROFILE_CHOICE",{"type":52,"value":1406},", and re-confirm.\n",{"type":46,"tag":267,"props":1408,"children":1409},{},[1410,1412],{"type":52,"value":1411},"Do NOT rely on exporting ",{"type":46,"tag":66,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":52,"value":1417},"AWS_PROFILE",{"type":52,"value":1419}," — env vars do not persist across Bash tool calls\nor into workflow subagents (see B3). Instead pass the choice explicitly everywhere:\n",{"type":46,"tag":66,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":52,"value":1425},"--profile",{"type":52,"value":1427}," on every aws CLI call, and prepend ",{"type":46,"tag":66,"props":1429,"children":1431},{"className":1430},[],[1432],{"type":52,"value":1433},"AWS_PROFILE=$AWS_PROFILE_CHOICE",{"type":52,"value":1435}," inline on\nthe B4 preflight command and inside the workflow args (",{"type":46,"tag":66,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":52,"value":1441},"awsProfile",{"type":52,"value":1443}," field) so subagents can\ndo the same.",{"type":46,"tag":55,"props":1445,"children":1446},{},[1447,1449,1454],{"type":52,"value":1448},"Also confirm region: \"Bedrock region will be ",{"type":46,"tag":66,"props":1450,"children":1452},{"className":1451},[],[1453],{"type":52,"value":1250},{"type":52,"value":1455},". OK or override?\"",{"type":46,"tag":126,"props":1457,"children":1459},{"id":1458},"b3-source-api-key-optional",[1460],{"type":52,"value":1461},"B3 — Source API key (optional)",{"type":46,"tag":55,"props":1463,"children":1464},{},[1465],{"type":52,"value":1466},"First, create the artifact directory and make it self-ignoring IMMEDIATELY — before any key\nexists, so the secret is never sitting in an unignored working tree (even if the user aborts\nbefore the rewriter runs):",{"type":46,"tag":141,"props":1468,"children":1470},{"className":143,"code":1469,"language":145,"meta":146,"style":146},"mkdir -p \"$REPO\u002F.saws-migrate\" && printf '*\\n' > \"$REPO\u002F.saws-migrate\u002F.gitignore\"\n",[1471],{"type":46,"tag":66,"props":1472,"children":1473},{"__ignoreMap":146},[1474],{"type":46,"tag":152,"props":1475,"children":1476},{"class":154,"line":155},[1477,1482,1487,1491,1495,1500,1504,1508,1513,1518,1523,1528,1533,1537,1541,1546],{"type":46,"tag":152,"props":1478,"children":1479},{"style":159},[1480],{"type":52,"value":1481},"mkdir",{"type":46,"tag":152,"props":1483,"children":1484},{"style":164},[1485],{"type":52,"value":1486}," -p",{"type":46,"tag":152,"props":1488,"children":1489},{"style":170},[1490],{"type":52,"value":194},{"type":46,"tag":152,"props":1492,"children":1493},{"style":546},[1494],{"type":52,"value":263},{"type":46,"tag":152,"props":1496,"children":1497},{"style":164},[1498],{"type":52,"value":1499},"\u002F.saws-migrate",{"type":46,"tag":152,"props":1501,"children":1502},{"style":170},[1503],{"type":52,"value":789},{"type":46,"tag":152,"props":1505,"children":1506},{"style":170},[1507],{"type":52,"value":427},{"type":46,"tag":152,"props":1509,"children":1510},{"style":186},[1511],{"type":52,"value":1512}," printf",{"type":46,"tag":152,"props":1514,"children":1515},{"style":170},[1516],{"type":52,"value":1517}," '",{"type":46,"tag":152,"props":1519,"children":1520},{"style":164},[1521],{"type":52,"value":1522},"*\\n",{"type":46,"tag":152,"props":1524,"children":1525},{"style":170},[1526],{"type":52,"value":1527},"'",{"type":46,"tag":152,"props":1529,"children":1530},{"style":170},[1531],{"type":52,"value":1532}," >",{"type":46,"tag":152,"props":1534,"children":1535},{"style":170},[1536],{"type":52,"value":194},{"type":46,"tag":152,"props":1538,"children":1539},{"style":546},[1540],{"type":52,"value":263},{"type":46,"tag":152,"props":1542,"children":1543},{"style":164},[1544],{"type":52,"value":1545},"\u002F.saws-migrate\u002F.gitignore",{"type":46,"tag":152,"props":1547,"children":1548},{"style":170},[1549],{"type":52,"value":204},{"type":46,"tag":55,"props":1551,"children":1552},{},[1553,1555,1561,1563,1569],{"type":52,"value":1554},"Determine ",{"type":46,"tag":66,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":52,"value":1560},"$KEY_ENV_VAR",{"type":52,"value":1562}," from B1's source provider (this is the env-var name the baseline\nskill's parser expects — a bare key without the ",{"type":46,"tag":66,"props":1564,"children":1566},{"className":1565},[],[1567],{"type":52,"value":1568},"NAME=",{"type":52,"value":1570}," prefix will NOT be parsed):",{"type":46,"tag":75,"props":1572,"children":1573},{},[1574,1589,1605],{"type":46,"tag":79,"props":1575,"children":1576},{},[1577,1582,1583],{"type":46,"tag":66,"props":1578,"children":1580},{"className":1579},[],[1581],{"type":52,"value":22},{"type":52,"value":1244},{"type":46,"tag":66,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":52,"value":1588},"OPENAI_API_KEY",{"type":46,"tag":79,"props":1590,"children":1591},{},[1592,1598,1599],{"type":46,"tag":66,"props":1593,"children":1595},{"className":1594},[],[1596],{"type":52,"value":1597},"anthropic",{"type":52,"value":1244},{"type":46,"tag":66,"props":1600,"children":1602},{"className":1601},[],[1603],{"type":52,"value":1604},"ANTHROPIC_API_KEY",{"type":46,"tag":79,"props":1606,"children":1607},{},[1608,1614,1616,1621,1622],{"type":46,"tag":66,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":52,"value":1613},"google",{"type":52,"value":1615}," \u002F ",{"type":46,"tag":66,"props":1617,"children":1619},{"className":1618},[],[1620],{"type":52,"value":25},{"type":52,"value":1244},{"type":46,"tag":66,"props":1623,"children":1625},{"className":1624},[],[1626],{"type":52,"value":1627},"GEMINI_API_KEY",{"type":46,"tag":55,"props":1629,"children":1630},{},[1631,1636],{"type":46,"tag":267,"props":1632,"children":1633},{},[1634],{"type":52,"value":1635},"The key must never enter this conversation (HARD RULE).",{"type":52,"value":1637}," Do not ask the user to paste the\nkey in chat, and never echo, cat, or interpolate its VALUE into any command, question, or\noutput — the agent only ever handles the file path. If the user pastes a key into the chat\nunprompted, do not use it: tell them it is now part of the transcript, recommend rotating it,\nand continue with one of the paths below.",{"type":46,"tag":55,"props":1639,"children":1640},{},[1641,1643,1649,1651,1657],{"type":52,"value":1642},"First check whether the key is already present in the shell environment (each Bash call\ninitializes from the user's profile, so a profile-exported key is visible to every call).\nPOSIX-safe — ",{"type":46,"tag":66,"props":1644,"children":1646},{"className":1645},[],[1647],{"type":52,"value":1648},"printenv",{"type":52,"value":1650}," works in bash and zsh alike (",{"type":46,"tag":66,"props":1652,"children":1654},{"className":1653},[],[1655],{"type":52,"value":1656},"${!VAR}",{"type":52,"value":1658}," indirection is bash-only and\nzsh errors on it). This prints presence only, never the value:",{"type":46,"tag":141,"props":1660,"children":1662},{"className":143,"code":1661,"language":145,"meta":146,"style":146},"[ -n \"$(printenv \"$KEY_ENV_VAR\")\" ] && echo ENV_KEY_PRESENT || echo ENV_KEY_ABSENT\n",[1663],{"type":46,"tag":66,"props":1664,"children":1665},{"__ignoreMap":146},[1666],{"type":46,"tag":152,"props":1667,"children":1668},{"class":154,"line":155},[1669,1673,1678,1682,1686,1690,1694,1699,1703,1707,1711,1716,1720,1724],{"type":46,"tag":152,"props":1670,"children":1671},{"style":170},[1672],{"type":52,"value":346},{"type":46,"tag":152,"props":1674,"children":1675},{"style":170},[1676],{"type":52,"value":1677}," -n",{"type":46,"tag":152,"props":1679,"children":1680},{"style":170},[1681],{"type":52,"value":351},{"type":46,"tag":152,"props":1683,"children":1684},{"style":159},[1685],{"type":52,"value":1648},{"type":46,"tag":152,"props":1687,"children":1688},{"style":170},[1689],{"type":52,"value":194},{"type":46,"tag":152,"props":1691,"children":1692},{"style":546},[1693],{"type":52,"value":1560},{"type":46,"tag":152,"props":1695,"children":1696},{"style":170},[1697],{"type":52,"value":1698},"\")\"",{"type":46,"tag":152,"props":1700,"children":1701},{"style":170},[1702],{"type":52,"value":446},{"type":46,"tag":152,"props":1704,"children":1705},{"style":170},[1706],{"type":52,"value":427},{"type":46,"tag":152,"props":1708,"children":1709},{"style":186},[1710],{"type":52,"value":189},{"type":46,"tag":152,"props":1712,"children":1713},{"style":164},[1714],{"type":52,"value":1715}," ENV_KEY_PRESENT",{"type":46,"tag":152,"props":1717,"children":1718},{"style":170},[1719],{"type":52,"value":183},{"type":46,"tag":152,"props":1721,"children":1722},{"style":186},[1723],{"type":52,"value":189},{"type":46,"tag":152,"props":1725,"children":1726},{"style":164},[1727],{"type":52,"value":1728}," ENV_KEY_ABSENT\n",{"type":46,"tag":55,"props":1730,"children":1731},{},[1732,1737],{"type":46,"tag":267,"props":1733,"children":1734},{},[1735],{"type":52,"value":1736},"AskUserQuestion:",{"type":52,"value":1738}," \"Do you have an API key for the source model (e.g. OpenAI key for GPT-4o)?\nProviding it enables side-by-side quality comparison. Without it, evaluation uses absolute scoring only.\"",{"type":46,"tag":55,"props":1740,"children":1741},{},[1742,1744,1750],{"type":52,"value":1743},"Options (offer the first only on ",{"type":46,"tag":66,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":52,"value":1749},"ENV_KEY_PRESENT",{"type":52,"value":1751},"):",{"type":46,"tag":75,"props":1753,"children":1754},{},[1755,1904,2061],{"type":46,"tag":79,"props":1756,"children":1757},{},[1758,1770,1772,1884,1887,1889,1895,1897,1903],{"type":46,"tag":267,"props":1759,"children":1760},{},[1761,1763,1768],{"type":52,"value":1762},"Use the ",{"type":46,"tag":66,"props":1764,"children":1766},{"className":1765},[],[1767],{"type":52,"value":1560},{"type":52,"value":1769}," already in my environment",{"type":52,"value":1771}," → materialize env var to file in one\ncommand — the value never appears in the transcript:",{"type":46,"tag":141,"props":1773,"children":1775},{"className":143,"code":1774,"language":145,"meta":146,"style":146},"printf '%s=%s\\n' \"$KEY_ENV_VAR\" \"$(printenv \"$KEY_ENV_VAR\")\" > \"$REPO\u002F.saws-migrate\u002F.source-provider-env\" && chmod 600 \"$REPO\u002F.saws-migrate\u002F.source-provider-env\"\n",[1776],{"type":46,"tag":66,"props":1777,"children":1778},{"__ignoreMap":146},[1779],{"type":46,"tag":152,"props":1780,"children":1781},{"class":154,"line":155},[1782,1787,1791,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1849,1853,1857,1862,1868,1872,1876,1880],{"type":46,"tag":152,"props":1783,"children":1784},{"style":186},[1785],{"type":52,"value":1786},"printf",{"type":46,"tag":152,"props":1788,"children":1789},{"style":170},[1790],{"type":52,"value":1517},{"type":46,"tag":152,"props":1792,"children":1793},{"style":164},[1794],{"type":52,"value":1795},"%s=%s\\n",{"type":46,"tag":152,"props":1797,"children":1798},{"style":170},[1799],{"type":52,"value":1527},{"type":46,"tag":152,"props":1801,"children":1802},{"style":170},[1803],{"type":52,"value":194},{"type":46,"tag":152,"props":1805,"children":1806},{"style":546},[1807],{"type":52,"value":1560},{"type":46,"tag":152,"props":1809,"children":1810},{"style":170},[1811],{"type":52,"value":789},{"type":46,"tag":152,"props":1813,"children":1814},{"style":170},[1815],{"type":52,"value":351},{"type":46,"tag":152,"props":1817,"children":1818},{"style":159},[1819],{"type":52,"value":1648},{"type":46,"tag":152,"props":1821,"children":1822},{"style":170},[1823],{"type":52,"value":194},{"type":46,"tag":152,"props":1825,"children":1826},{"style":546},[1827],{"type":52,"value":1560},{"type":46,"tag":152,"props":1829,"children":1830},{"style":170},[1831],{"type":52,"value":1698},{"type":46,"tag":152,"props":1833,"children":1834},{"style":170},[1835],{"type":52,"value":1532},{"type":46,"tag":152,"props":1837,"children":1838},{"style":170},[1839],{"type":52,"value":194},{"type":46,"tag":152,"props":1841,"children":1842},{"style":546},[1843],{"type":52,"value":263},{"type":46,"tag":152,"props":1845,"children":1846},{"style":164},[1847],{"type":52,"value":1848},"\u002F.saws-migrate\u002F.source-provider-env",{"type":46,"tag":152,"props":1850,"children":1851},{"style":170},[1852],{"type":52,"value":789},{"type":46,"tag":152,"props":1854,"children":1855},{"style":170},[1856],{"type":52,"value":427},{"type":46,"tag":152,"props":1858,"children":1859},{"style":159},[1860],{"type":52,"value":1861}," chmod",{"type":46,"tag":152,"props":1863,"children":1865},{"style":1864},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1866],{"type":52,"value":1867}," 600",{"type":46,"tag":152,"props":1869,"children":1870},{"style":170},[1871],{"type":52,"value":194},{"type":46,"tag":152,"props":1873,"children":1874},{"style":546},[1875],{"type":52,"value":263},{"type":46,"tag":152,"props":1877,"children":1878},{"style":164},[1879],{"type":52,"value":1848},{"type":46,"tag":152,"props":1881,"children":1882},{"style":170},[1883],{"type":52,"value":204},{"type":46,"tag":565,"props":1885,"children":1886},{},[],{"type":52,"value":1888},"Then run the format check below and set ",{"type":46,"tag":66,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":52,"value":1894},"sourceBaselineAvailable = true",{"type":52,"value":1896},",\n",{"type":46,"tag":66,"props":1898,"children":1900},{"className":1899},[],[1901],{"type":52,"value":1902},"sourceKeyRef = \"$REPO\u002F.saws-migrate\u002F.source-provider-env\"",{"type":52,"value":293},{"type":46,"tag":79,"props":1905,"children":1906},{},[1907,1912,1914,1920,1922,1928,1930,2056,2059],{"type":46,"tag":267,"props":1908,"children":1909},{},[1910],{"type":52,"value":1911},"I'll write it to a file myself",{"type":52,"value":1913}," → give the user this command to run in THEIR OWN terminal\n(not through the agent; in Claude Code an ",{"type":46,"tag":66,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":52,"value":1919},"!",{"type":52,"value":1921}," prefix runs it in-session) — ",{"type":46,"tag":66,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":52,"value":1927},"read -rs",{"type":52,"value":1929}," collects\nthe key without echoing it:",{"type":46,"tag":141,"props":1931,"children":1933},{"className":143,"code":1932,"language":145,"meta":146,"style":146},"read -rs k && printf '%s=%s\\n' \"\u003CKEY_ENV_VAR>\" \"$k\" > \"\u003CREPO>\u002F.saws-migrate\u002F.source-provider-env\" && chmod 600 \"\u003CREPO>\u002F.saws-migrate\u002F.source-provider-env\" && unset k\n",[1934],{"type":46,"tag":66,"props":1935,"children":1936},{"__ignoreMap":146},[1937],{"type":46,"tag":152,"props":1938,"children":1939},{"class":154,"line":155},[1940,1945,1950,1955,1959,1963,1967,1971,1975,1979,1984,1988,1992,1997,2001,2005,2009,2014,2018,2022,2026,2030,2034,2038,2042,2046,2051],{"type":46,"tag":152,"props":1941,"children":1942},{"style":186},[1943],{"type":52,"value":1944},"read",{"type":46,"tag":152,"props":1946,"children":1947},{"style":164},[1948],{"type":52,"value":1949}," -rs",{"type":46,"tag":152,"props":1951,"children":1952},{"style":164},[1953],{"type":52,"value":1954}," k",{"type":46,"tag":152,"props":1956,"children":1957},{"style":170},[1958],{"type":52,"value":427},{"type":46,"tag":152,"props":1960,"children":1961},{"style":186},[1962],{"type":52,"value":1512},{"type":46,"tag":152,"props":1964,"children":1965},{"style":170},[1966],{"type":52,"value":1517},{"type":46,"tag":152,"props":1968,"children":1969},{"style":164},[1970],{"type":52,"value":1795},{"type":46,"tag":152,"props":1972,"children":1973},{"style":170},[1974],{"type":52,"value":1527},{"type":46,"tag":152,"props":1976,"children":1977},{"style":170},[1978],{"type":52,"value":194},{"type":46,"tag":152,"props":1980,"children":1981},{"style":164},[1982],{"type":52,"value":1983},"\u003CKEY_ENV_VAR>",{"type":46,"tag":152,"props":1985,"children":1986},{"style":170},[1987],{"type":52,"value":789},{"type":46,"tag":152,"props":1989,"children":1990},{"style":170},[1991],{"type":52,"value":194},{"type":46,"tag":152,"props":1993,"children":1994},{"style":546},[1995],{"type":52,"value":1996},"$k",{"type":46,"tag":152,"props":1998,"children":1999},{"style":170},[2000],{"type":52,"value":789},{"type":46,"tag":152,"props":2002,"children":2003},{"style":170},[2004],{"type":52,"value":1532},{"type":46,"tag":152,"props":2006,"children":2007},{"style":170},[2008],{"type":52,"value":194},{"type":46,"tag":152,"props":2010,"children":2011},{"style":164},[2012],{"type":52,"value":2013},"\u003CREPO>\u002F.saws-migrate\u002F.source-provider-env",{"type":46,"tag":152,"props":2015,"children":2016},{"style":170},[2017],{"type":52,"value":789},{"type":46,"tag":152,"props":2019,"children":2020},{"style":170},[2021],{"type":52,"value":427},{"type":46,"tag":152,"props":2023,"children":2024},{"style":159},[2025],{"type":52,"value":1861},{"type":46,"tag":152,"props":2027,"children":2028},{"style":1864},[2029],{"type":52,"value":1867},{"type":46,"tag":152,"props":2031,"children":2032},{"style":170},[2033],{"type":52,"value":194},{"type":46,"tag":152,"props":2035,"children":2036},{"style":164},[2037],{"type":52,"value":2013},{"type":46,"tag":152,"props":2039,"children":2040},{"style":170},[2041],{"type":52,"value":789},{"type":46,"tag":152,"props":2043,"children":2044},{"style":170},[2045],{"type":52,"value":427},{"type":46,"tag":152,"props":2047,"children":2048},{"style":186},[2049],{"type":52,"value":2050}," unset",{"type":46,"tag":152,"props":2052,"children":2053},{"style":164},[2054],{"type":52,"value":2055}," k\n",{"type":46,"tag":565,"props":2057,"children":2058},{},[],{"type":52,"value":2060},"Substitute the literal env-var name and repo path when presenting it (those are not secrets).\nThen run the format check below and set the same flags as above.",{"type":46,"tag":79,"props":2062,"children":2063},{},[2064,2069,2070,2076,2078,2084],{"type":46,"tag":267,"props":2065,"children":2066},{},[2067],{"type":52,"value":2068},"Skip",{"type":52,"value":1244},{"type":46,"tag":66,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":52,"value":2075},"sourceBaselineAvailable = false",{"type":52,"value":2077},", ",{"type":46,"tag":66,"props":2079,"children":2081},{"className":2080},[],[2082],{"type":52,"value":2083},"sourceKeyRef = \"\"",{"type":52,"value":293},{"type":46,"tag":55,"props":2086,"children":2087},{},[2088,2090,2095],{"type":52,"value":2089},"Whichever path wrote the file, verify the format (never prints the key; catches a value\nwritten without the ",{"type":46,"tag":66,"props":2091,"children":2093},{"className":2092},[],[2094],{"type":52,"value":1568},{"type":52,"value":2096}," prefix, which the baseline parser would silently miss):",{"type":46,"tag":141,"props":2098,"children":2100},{"className":143,"code":2099,"language":145,"meta":146,"style":146},"grep -qE '^(OPENAI|ANTHROPIC|GEMINI)_API_KEY=.+' \"$REPO\u002F.saws-migrate\u002F.source-provider-env\" && echo KEY_FORMAT_OK || echo KEY_FORMAT_BAD\n",[2101],{"type":46,"tag":66,"props":2102,"children":2103},{"__ignoreMap":146},[2104],{"type":46,"tag":152,"props":2105,"children":2106},{"class":154,"line":155},[2107,2112,2117,2121,2126,2130,2134,2138,2142,2146,2150,2154,2159,2163,2167],{"type":46,"tag":152,"props":2108,"children":2109},{"style":159},[2110],{"type":52,"value":2111},"grep",{"type":46,"tag":152,"props":2113,"children":2114},{"style":164},[2115],{"type":52,"value":2116}," -qE",{"type":46,"tag":152,"props":2118,"children":2119},{"style":170},[2120],{"type":52,"value":1517},{"type":46,"tag":152,"props":2122,"children":2123},{"style":164},[2124],{"type":52,"value":2125},"^(OPENAI|ANTHROPIC|GEMINI)_API_KEY=.+",{"type":46,"tag":152,"props":2127,"children":2128},{"style":170},[2129],{"type":52,"value":1527},{"type":46,"tag":152,"props":2131,"children":2132},{"style":170},[2133],{"type":52,"value":194},{"type":46,"tag":152,"props":2135,"children":2136},{"style":546},[2137],{"type":52,"value":263},{"type":46,"tag":152,"props":2139,"children":2140},{"style":164},[2141],{"type":52,"value":1848},{"type":46,"tag":152,"props":2143,"children":2144},{"style":170},[2145],{"type":52,"value":789},{"type":46,"tag":152,"props":2147,"children":2148},{"style":170},[2149],{"type":52,"value":427},{"type":46,"tag":152,"props":2151,"children":2152},{"style":186},[2153],{"type":52,"value":189},{"type":46,"tag":152,"props":2155,"children":2156},{"style":164},[2157],{"type":52,"value":2158}," KEY_FORMAT_OK",{"type":46,"tag":152,"props":2160,"children":2161},{"style":170},[2162],{"type":52,"value":183},{"type":46,"tag":152,"props":2164,"children":2165},{"style":186},[2166],{"type":52,"value":189},{"type":46,"tag":152,"props":2168,"children":2169},{"style":164},[2170],{"type":52,"value":2171}," KEY_FORMAT_BAD\n",{"type":46,"tag":55,"props":2173,"children":2174},{},[2175,2177,2183],{"type":52,"value":2176},"On ",{"type":46,"tag":66,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":52,"value":2182},"KEY_FORMAT_BAD",{"type":52,"value":2184},", have the same path that wrote the file rewrite it (do not echo its\ncontents).",{"type":46,"tag":55,"props":2186,"children":2187},{},[2188,2190,2196],{"type":52,"value":2189},"(",{"type":46,"tag":66,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":52,"value":2195},".saws-migrate\u002F",{"type":52,"value":2197}," is already self-ignoring from the first command above; the rewriter\nre-asserts this before any commit as a second layer.)",{"type":46,"tag":55,"props":2199,"children":2200},{},[2201,2206,2208,2214,2216,2221],{"type":46,"tag":267,"props":2202,"children":2203},{},[2204],{"type":52,"value":2205},"IMPORTANT:",{"type":52,"value":2207}," The file is the handoff mechanism — do NOT rely on ",{"type":46,"tag":66,"props":2209,"children":2211},{"className":2210},[],[2212],{"type":52,"value":2213},"export",{"type":52,"value":2215}," to carry the key\ninto later steps. Shell state set in one Bash call does not persist into other calls or into\nworkflow subagents; only a profile-exported variable (the ",{"type":46,"tag":66,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":52,"value":1749},{"type":52,"value":2222}," path above) is\nreliably visible, and even that must be materialized to the file for the baseline runner.",{"type":46,"tag":126,"props":2224,"children":2226},{"id":2225},"b4-bedrock-preflight",[2227],{"type":52,"value":2228},"B4 — Bedrock preflight",{"type":46,"tag":141,"props":2230,"children":2232},{"className":143,"code":2231,"language":145,"meta":146,"style":146},"uv run --project $SCRIPTS python $SCRIPTS\u002Fpreflight_bedrock.py --region $REGION --models \u003Ccomma-separated $TARGET_MODELS> --dataset-size 200\n",[2233],{"type":46,"tag":66,"props":2234,"children":2235},{"__ignoreMap":146},[2236],{"type":46,"tag":152,"props":2237,"children":2238},{"class":154,"line":155},[2239,2243,2248,2253,2258,2263,2268,2273,2278,2283,2288,2292,2297,2302,2306,2311],{"type":46,"tag":152,"props":2240,"children":2241},{"style":159},[2242],{"type":52,"value":137},{"type":46,"tag":152,"props":2244,"children":2245},{"style":164},[2246],{"type":52,"value":2247}," run",{"type":46,"tag":152,"props":2249,"children":2250},{"style":164},[2251],{"type":52,"value":2252}," --project",{"type":46,"tag":152,"props":2254,"children":2255},{"style":546},[2256],{"type":52,"value":2257}," $SCRIPTS ",{"type":46,"tag":152,"props":2259,"children":2260},{"style":164},[2261],{"type":52,"value":2262},"python",{"type":46,"tag":152,"props":2264,"children":2265},{"style":546},[2266],{"type":52,"value":2267}," $SCRIPTS",{"type":46,"tag":152,"props":2269,"children":2270},{"style":164},[2271],{"type":52,"value":2272},"\u002Fpreflight_bedrock.py",{"type":46,"tag":152,"props":2274,"children":2275},{"style":164},[2276],{"type":52,"value":2277}," --region",{"type":46,"tag":152,"props":2279,"children":2280},{"style":546},[2281],{"type":52,"value":2282}," $REGION ",{"type":46,"tag":152,"props":2284,"children":2285},{"style":164},[2286],{"type":52,"value":2287},"--models",{"type":46,"tag":152,"props":2289,"children":2290},{"style":170},[2291],{"type":52,"value":414},{"type":46,"tag":152,"props":2293,"children":2294},{"style":164},[2295],{"type":52,"value":2296},"comma-separated",{"type":46,"tag":152,"props":2298,"children":2299},{"style":546},[2300],{"type":52,"value":2301}," $TARGET_MODELS",{"type":46,"tag":152,"props":2303,"children":2304},{"style":170},[2305],{"type":52,"value":376},{"type":46,"tag":152,"props":2307,"children":2308},{"style":164},[2309],{"type":52,"value":2310}," --dataset-size",{"type":46,"tag":152,"props":2312,"children":2313},{"style":1864},[2314],{"type":52,"value":2315}," 200\n",{"type":46,"tag":55,"props":2317,"children":2318},{},[2319,2320,2326,2328,2333],{"type":52,"value":2189},{"type":46,"tag":66,"props":2321,"children":2323},{"className":2322},[],[2324],{"type":52,"value":2325},"--dataset-size 200",{"type":52,"value":2327}," matches the golden-dataset cap, so the quota warning reflects the worst case. Prefix with ",{"type":46,"tag":66,"props":2329,"children":2331},{"className":2330},[],[2332],{"type":52,"value":1433},{"type":52,"value":2334}," if B2 chose a non-default profile.)",{"type":46,"tag":55,"props":2336,"children":2337},{},[2338,2340,2346,2347,2353,2355,2361,2363,2369],{"type":52,"value":2339},"Parse the JSON output. On failure the TOP LEVEL carries ",{"type":46,"tag":66,"props":2341,"children":2343},{"className":2342},[],[2344],{"type":52,"value":2345},"reason",{"type":52,"value":794},{"type":46,"tag":66,"props":2348,"children":2350},{"className":2349},[],[2351],{"type":52,"value":2352},"detail",{"type":52,"value":2354}," (lifted from the\nfirst failing model) plus ",{"type":46,"tag":66,"props":2356,"children":2358},{"className":2357},[],[2359],{"type":52,"value":2360},"failing_models",{"type":52,"value":2362}," (all failing ids); per-model verdicts are in ",{"type":46,"tag":66,"props":2364,"children":2366},{"className":2365},[],[2367],{"type":52,"value":2368},"models[]",{"type":52,"value":1070},{"type":46,"tag":75,"props":2371,"children":2372},{},[2373,2392,2409,2434,2489,2513],{"type":46,"tag":79,"props":2374,"children":2375},{},[2376,2382,2384,2390],{"type":46,"tag":66,"props":2377,"children":2379},{"className":2378},[],[2380],{"type":52,"value":2381},"ok == false",{"type":52,"value":2383}," + ",{"type":46,"tag":66,"props":2385,"children":2387},{"className":2386},[],[2388],{"type":52,"value":2389},"reason: credentials",{"type":52,"value":2391}," → show the detail (configure\u002Frefresh credentials), stop; user re-runs after fixing.",{"type":46,"tag":79,"props":2393,"children":2394},{},[2395,2400,2401,2407],{"type":46,"tag":66,"props":2396,"children":2398},{"className":2397},[],[2399],{"type":52,"value":2381},{"type":52,"value":2383},{"type":46,"tag":66,"props":2402,"children":2404},{"className":2403},[],[2405],{"type":52,"value":2406},"reason: model_access",{"type":52,"value":2408}," → model access not enabled in the Bedrock console (NOT an IAM problem): point the user at the console Model access page for the failing models, stop; re-run B4 after they enable it.",{"type":46,"tag":79,"props":2410,"children":2411},{},[2412,2417,2418,2424,2426,2432],{"type":46,"tag":66,"props":2413,"children":2415},{"className":2414},[],[2416],{"type":52,"value":2381},{"type":52,"value":2383},{"type":46,"tag":66,"props":2419,"children":2421},{"className":2420},[],[2422],{"type":52,"value":2423},"reason: authz",{"type":52,"value":2425}," → IAM denies ",{"type":46,"tag":66,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":52,"value":2431},"bedrock:InvokeModel",{"type":52,"value":2433},": tell user the IAM action to grant; stop.",{"type":46,"tag":79,"props":2435,"children":2436},{},[2437,2442,2443,2449,2451,2457,2459,2465,2467,2472,2474,2480,2482,2487],{"type":46,"tag":66,"props":2438,"children":2440},{"className":2439},[],[2441],{"type":52,"value":2381},{"type":52,"value":2383},{"type":46,"tag":66,"props":2444,"children":2446},{"className":2445},[],[2447],{"type":52,"value":2448},"reason: model_unavailable",{"type":52,"value":2450}," → Read the ",{"type":46,"tag":66,"props":2452,"children":2454},{"className":2453},[],[2455],{"type":52,"value":2456},"resolve-bedrock-model-id",{"type":52,"value":2458}," reference at ",{"type":46,"tag":66,"props":2460,"children":2462},{"className":2461},[],[2463],{"type":52,"value":2464},"$HELPERS\u002Fresolve-bedrock-model-id\u002Fresolve-bedrock-model-id.md",{"type":52,"value":2466}," and follow its procedure with each ID from ",{"type":46,"tag":66,"props":2468,"children":2470},{"className":2469},[],[2471],{"type":52,"value":2360},{"type":52,"value":2473}," + region. AskUserQuestion with the candidates: \"Use ",{"type":46,"tag":66,"props":2475,"children":2477},{"className":2476},[],[2478],{"type":52,"value":2479},"\u003Ccandidate>",{"type":52,"value":2481}," (cross-region inference profile)\" \u002F \"Paste a different model ID\" \u002F \"Abort\". On a choice, replace the ID in ",{"type":46,"tag":66,"props":2483,"children":2485},{"className":2484},[],[2486],{"type":52,"value":1184},{"type":52,"value":2488}," and re-run B4.",{"type":46,"tag":79,"props":2490,"children":2491},{},[2492,2497,2499,2504,2506,2511],{"type":46,"tag":66,"props":2493,"children":2495},{"className":2494},[],[2496],{"type":52,"value":2381},{"type":52,"value":2498}," + any other ",{"type":46,"tag":66,"props":2500,"children":2502},{"className":2501},[],[2503],{"type":52,"value":2345},{"type":52,"value":2505}," → show ",{"type":46,"tag":66,"props":2507,"children":2509},{"className":2508},[],[2510],{"type":52,"value":2352},{"type":52,"value":2512}," and stop.",{"type":46,"tag":79,"props":2514,"children":2515},{},[2516,2522,2524,2530,2532,2537,2539,2545],{"type":46,"tag":66,"props":2517,"children":2519},{"className":2518},[],[2520],{"type":52,"value":2521},"ok == true",{"type":52,"value":2523}," → proceed. Surface any ",{"type":46,"tag":66,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":52,"value":2529},"quota_warning",{"type":52,"value":2531},", and any model whose ",{"type":46,"tag":66,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":52,"value":2345},{"type":52,"value":2538}," is\n",{"type":46,"tag":66,"props":2540,"children":2542},{"className":2541},[],[2543],{"type":52,"value":2544},"embedding_unprobed",{"type":52,"value":2546}," (embedding family the preflight can't probe — remind the user to confirm\nmodel access in the console).",{"type":46,"tag":115,"props":2548,"children":2549},{},[],{"type":46,"tag":119,"props":2551,"children":2553},{"id":2552},"phase-c-execute",[2554],{"type":52,"value":2555},"Phase C — Execute",{"type":46,"tag":55,"props":2557,"children":2558},{},[2559,2561,2566,2568,2574,2575,2581,2582,2588,2589,2595,2596,2602,2604,2610],{"type":52,"value":2560},"Phase C dispatches the five plugin agents sequentially via the ",{"type":46,"tag":267,"props":2562,"children":2563},{},[2564],{"type":52,"value":2565},"Agent tool",{"type":52,"value":2567}," (subagent types\n",{"type":46,"tag":66,"props":2569,"children":2571},{"className":2570},[],[2572],{"type":52,"value":2573},"aws-startup-advisor:llm2bedrock-code-analyzer",{"type":52,"value":2077},{"type":46,"tag":66,"props":2576,"children":2578},{"className":2577},[],[2579],{"type":52,"value":2580},"aws-startup-advisor:llm2bedrock-log-ingestor",{"type":52,"value":2077},{"type":46,"tag":66,"props":2583,"children":2585},{"className":2584},[],[2586],{"type":52,"value":2587},"aws-startup-advisor:llm2bedrock-prompt-evaluator",{"type":52,"value":1896},{"type":46,"tag":66,"props":2590,"children":2592},{"className":2591},[],[2593],{"type":52,"value":2594},"aws-startup-advisor:llm2bedrock-code-rewriter",{"type":52,"value":2077},{"type":46,"tag":66,"props":2597,"children":2599},{"className":2598},[],[2600],{"type":52,"value":2601},"aws-startup-advisor:llm2bedrock-report-generator",{"type":52,"value":2603},"). Each agent writes its result to\na file under ",{"type":46,"tag":66,"props":2605,"children":2607},{"className":2606},[],[2608],{"type":52,"value":2609},"$PHASE_DIR = $REPO\u002F.saws-migrate\u002Fphase-results\u002F",{"type":52,"value":2611},"; you validate every file with\nthe bundled validator before moving on. There is no workflow runtime — the files ARE the state.",{"type":46,"tag":126,"props":2613,"children":2615},{"id":2614},"the-validator-used-at-every-step",[2616],{"type":52,"value":2617},"The validator (used at every step)",{"type":46,"tag":141,"props":2619,"children":2621},{"className":143,"code":2620,"language":145,"meta":146,"style":146},"uv run --project $SCRIPTS python $SCRIPTS\u002Fvalidate_result.py --schema \u003Canalysis|ingestion|eval|rewrite|delta-decisions> \u003Cfile>\n",[2622],{"type":46,"tag":66,"props":2623,"children":2624},{"__ignoreMap":146},[2625],{"type":46,"tag":152,"props":2626,"children":2627},{"class":154,"line":155},[2628,2632,2636,2640,2644,2648,2652,2657,2662,2666,2671,2676,2681,2685,2690,2694,2699,2703,2708,2713,2717,2722,2727],{"type":46,"tag":152,"props":2629,"children":2630},{"style":159},[2631],{"type":52,"value":137},{"type":46,"tag":152,"props":2633,"children":2634},{"style":164},[2635],{"type":52,"value":2247},{"type":46,"tag":152,"props":2637,"children":2638},{"style":164},[2639],{"type":52,"value":2252},{"type":46,"tag":152,"props":2641,"children":2642},{"style":546},[2643],{"type":52,"value":2257},{"type":46,"tag":152,"props":2645,"children":2646},{"style":164},[2647],{"type":52,"value":2262},{"type":46,"tag":152,"props":2649,"children":2650},{"style":546},[2651],{"type":52,"value":2267},{"type":46,"tag":152,"props":2653,"children":2654},{"style":164},[2655],{"type":52,"value":2656},"\u002Fvalidate_result.py",{"type":46,"tag":152,"props":2658,"children":2659},{"style":164},[2660],{"type":52,"value":2661}," --schema",{"type":46,"tag":152,"props":2663,"children":2664},{"style":170},[2665],{"type":52,"value":414},{"type":46,"tag":152,"props":2667,"children":2668},{"style":164},[2669],{"type":52,"value":2670},"analysis",{"type":46,"tag":152,"props":2672,"children":2673},{"style":170},[2674],{"type":52,"value":2675},"|",{"type":46,"tag":152,"props":2677,"children":2678},{"style":159},[2679],{"type":52,"value":2680},"ingestion",{"type":46,"tag":152,"props":2682,"children":2683},{"style":170},[2684],{"type":52,"value":2675},{"type":46,"tag":152,"props":2686,"children":2687},{"style":186},[2688],{"type":52,"value":2689},"eval",{"type":46,"tag":152,"props":2691,"children":2692},{"style":170},[2693],{"type":52,"value":2675},{"type":46,"tag":152,"props":2695,"children":2696},{"style":159},[2697],{"type":52,"value":2698},"rewrite",{"type":46,"tag":152,"props":2700,"children":2701},{"style":170},[2702],{"type":52,"value":2675},{"type":46,"tag":152,"props":2704,"children":2705},{"style":159},[2706],{"type":52,"value":2707},"delta-decisions",{"type":46,"tag":152,"props":2709,"children":2710},{"style":546},[2711],{"type":52,"value":2712},"> ",{"type":46,"tag":152,"props":2714,"children":2715},{"style":170},[2716],{"type":52,"value":366},{"type":46,"tag":152,"props":2718,"children":2719},{"style":164},[2720],{"type":52,"value":2721},"fil",{"type":46,"tag":152,"props":2723,"children":2724},{"style":546},[2725],{"type":52,"value":2726},"e",{"type":46,"tag":152,"props":2728,"children":2729},{"style":170},[2730],{"type":52,"value":2731},">\n",{"type":46,"tag":75,"props":2733,"children":2734},{},[2735,2748,2760,2772],{"type":46,"tag":79,"props":2736,"children":2737},{},[2738,2740,2746],{"type":52,"value":2739},"Exit 0 + ",{"type":46,"tag":66,"props":2741,"children":2743},{"className":2742},[],[2744],{"type":52,"value":2745},"RESULT=valid CONTROL=ok",{"type":52,"value":2747}," → phase completed; proceed.",{"type":46,"tag":79,"props":2749,"children":2750},{},[2751,2752,2758],{"type":52,"value":2739},{"type":46,"tag":66,"props":2753,"children":2755},{"className":2754},[],[2756],{"type":52,"value":2757},"CONTROL=blocked REASON=\u003Cr>",{"type":52,"value":2759}," → blocked flow (below).",{"type":46,"tag":79,"props":2761,"children":2762},{},[2763,2764,2770],{"type":52,"value":2739},{"type":46,"tag":66,"props":2765,"children":2767},{"className":2766},[],[2768],{"type":52,"value":2769},"CONTROL=partial COMPLETED=\u003Cn> TOTAL=\u003Cm>",{"type":52,"value":2771}," → partial flow (eval only).",{"type":46,"tag":79,"props":2773,"children":2774},{},[2775,2777,2783,2785,2790,2792,2798],{"type":52,"value":2776},"Exit 1 (",{"type":46,"tag":66,"props":2778,"children":2780},{"className":2779},[],[2781],{"type":52,"value":2782},"RESULT=invalid",{"type":52,"value":2784}," + error lines) or exit 2 (file missing) → ",{"type":46,"tag":267,"props":2786,"children":2787},{},[2788],{"type":52,"value":2789},"stateless fixer retry",{"type":52,"value":2791},":\ndispatch a FRESH agent of the same type whose prompt is the original context block + the\nfile path + the validator's verbatim error output + the instruction \"fix ONLY the output\nfile at ",{"type":46,"tag":66,"props":2793,"children":2795},{"className":2794},[],[2796],{"type":52,"value":2797},"\u003Cpath>",{"type":52,"value":2799}," so it validates; do not redo the phase's work unless a required field is\ngenuinely missing from it\". Cap 2 retries per phase; then stop and show the errors.",{"type":46,"tag":126,"props":2801,"children":2803},{"id":2802},"the-context-block-instantiated-at-every-dispatch",[2804],{"type":52,"value":2805},"The context block (instantiated at every dispatch)",{"type":46,"tag":55,"props":2807,"children":2808},{},[2809],{"type":52,"value":2810},"Build this exact line format (agents parse the labels). Omit lines marked optional when empty:",{"type":46,"tag":141,"props":2812,"children":2816},{"className":2813,"code":2815,"language":52},[2814],"language-text","Repository: \u003C$REPO>\nAWS region: \u003C$REGION>\nAWS profile (pass as --profile \u002F AWS_PROFILE= inline on every aws\u002Fboto3 invocation): \u003C$AWS_PROFILE_CHOICE — omit line if default>\nTarget Bedrock model(s): \u003Ccomma-joined $TARGET_MODELS, with any resolved overrides already applied>\nMigration plan dir: \u003C$MIGRATION_DIR>\nResolved target model id: \u003Coverride for the primary chat model — omit if none>\nScripts directory (pinned uv toolchain): \u003C$SCRIPTS>\nReport date suffix: \u003Csaved suffix from run-context — C5\u002FC6 dispatches only>\nSource baseline available: \u003Ctrue|false>\nSource provider env file: \u003Cpath — omit if none>\nUser-supplied log files: \u003Ccomma-joined — omit if none>\nGolden dataset cap (max cases the ingestor may emit): 200\nPhase results directory: \u003C$PHASE_DIR>\nPrior phase results (Read these files): \u003Cpaths of already-validated phase JSONs>\nConfirmed behavior-delta decisions file (Read it): \u003C$PHASE_DIR\u002Fdelta-decisions.json — C5 only>\n\u003Chelper-reference lines — inject ONLY the ones this agent needs, per the table below>\n",[2817],{"type":46,"tag":66,"props":2818,"children":2819},{"__ignoreMap":146},[2820],{"type":52,"value":2815},{"type":46,"tag":55,"props":2822,"children":2823},{},[2824],{"type":52,"value":2825},"Prior-phase results are passed as FILE PATHS — never inline their JSON into the prompt.",{"type":46,"tag":55,"props":2827,"children":2828},{},[2829,2841,2843,2849],{"type":46,"tag":267,"props":2830,"children":2831},{},[2832,2834,2839],{"type":52,"value":2833},"Helper references (the former helper skills, now under ",{"type":46,"tag":66,"props":2835,"children":2837},{"className":2836},[],[2838],{"type":52,"value":104},{"type":52,"value":2840},").",{"type":52,"value":2842}," Agents no longer\nload skills by name; instead the agent Reads a helper reference at an absolute path you\ninject. For each dispatch, add ONLY the helper lines that agent uses (per its ",{"type":46,"tag":66,"props":2844,"children":2846},{"className":2845},[],[2847],{"type":52,"value":2848},"# 4",{"type":52,"value":2850}," section):",{"type":46,"tag":2852,"props":2853,"children":2854},"table",{},[2855,2874],{"type":46,"tag":2856,"props":2857,"children":2858},"thead",{},[2859],{"type":46,"tag":2860,"props":2861,"children":2862},"tr",{},[2863,2869],{"type":46,"tag":2864,"props":2865,"children":2866},"th",{},[2867],{"type":52,"value":2868},"Agent (dispatch)",{"type":46,"tag":2864,"props":2870,"children":2871},{},[2872],{"type":52,"value":2873},"Helper-reference lines to add",{"type":46,"tag":2875,"props":2876,"children":2877},"tbody",{},[2878,2905,2939,2972],{"type":46,"tag":2860,"props":2879,"children":2880},{},[2881,2887],{"type":46,"tag":2882,"props":2883,"children":2884},"td",{},[2885],{"type":52,"value":2886},"C1 llm2bedrock-code-analyzer",{"type":46,"tag":2882,"props":2888,"children":2889},{},[2890,2896,2899],{"type":46,"tag":66,"props":2891,"children":2893},{"className":2892},[],[2894],{"type":52,"value":2895},"behavior-delta-detection reference: $HELPERS\u002Fbehavior-delta-detection\u002Fbehavior-delta-detection.md",{"type":46,"tag":565,"props":2897,"children":2898},{},[],{"type":46,"tag":66,"props":2900,"children":2902},{"className":2901},[],[2903],{"type":52,"value":2904},"resolve-bedrock-model-id reference: $HELPERS\u002Fresolve-bedrock-model-id\u002Fresolve-bedrock-model-id.md",{"type":46,"tag":2860,"props":2906,"children":2907},{},[2908,2913],{"type":46,"tag":2882,"props":2909,"children":2910},{},[2911],{"type":52,"value":2912},"C5 llm2bedrock-code-rewriter",{"type":46,"tag":2882,"props":2914,"children":2915},{},[2916,2922,2925,2930,2933],{"type":46,"tag":66,"props":2917,"children":2919},{"className":2918},[],[2920],{"type":52,"value":2921},"bedrock-known-fixes reference: $HELPERS\u002Fbedrock-known-fixes\u002Fbedrock-known-fixes.md",{"type":46,"tag":565,"props":2923,"children":2924},{},[],{"type":46,"tag":66,"props":2926,"children":2928},{"className":2927},[],[2929],{"type":52,"value":2895},{"type":46,"tag":565,"props":2931,"children":2932},{},[],{"type":46,"tag":66,"props":2934,"children":2936},{"className":2935},[],[2937],{"type":52,"value":2938},"dependency-conflict-resolution reference: $HELPERS\u002Fdependency-conflict-resolution\u002Fdependency-conflict-resolution.md",{"type":46,"tag":2860,"props":2940,"children":2941},{},[2942,2947],{"type":46,"tag":2882,"props":2943,"children":2944},{},[2945],{"type":52,"value":2946},"C3 llm2bedrock-prompt-evaluator",{"type":46,"tag":2882,"props":2948,"children":2949},{},[2950,2955,2958,2963,2966],{"type":46,"tag":66,"props":2951,"children":2953},{"className":2952},[],[2954],{"type":52,"value":2921},{"type":46,"tag":565,"props":2956,"children":2957},{},[],{"type":46,"tag":66,"props":2959,"children":2961},{"className":2960},[],[2962],{"type":52,"value":2904},{"type":46,"tag":565,"props":2964,"children":2965},{},[],{"type":46,"tag":66,"props":2967,"children":2969},{"className":2968},[],[2970],{"type":52,"value":2971},"run-source-model-baseline reference: $HELPERS\u002Frun-source-model-baseline\u002Frun-source-model-baseline.md",{"type":46,"tag":2860,"props":2973,"children":2974},{},[2975,2980],{"type":46,"tag":2882,"props":2976,"children":2977},{},[2978],{"type":52,"value":2979},"C2 llm2bedrock-log-ingestor, C6 llm2bedrock-report-generator",{"type":46,"tag":2882,"props":2981,"children":2982},{},[2983],{"type":52,"value":2984},"(none — these agents load no helpers)",{"type":46,"tag":55,"props":2986,"children":2987},{},[2988,2990,2995,2997,3002,3004,3010],{"type":52,"value":2989},"Expand ",{"type":46,"tag":66,"props":2991,"children":2993},{"className":2992},[],[2994],{"type":52,"value":104},{"type":52,"value":2996}," to its absolute path (you have ",{"type":46,"tag":66,"props":2998,"children":3000},{"className":2999},[],[3001],{"type":52,"value":71},{"type":52,"value":3003},") so the subagent — where\n",{"type":46,"tag":66,"props":3005,"children":3007},{"className":3006},[],[3008],{"type":52,"value":3009},"${CLAUDE_PLUGIN_ROOT}",{"type":52,"value":3011}," is empty — receives a resolvable absolute path.",{"type":46,"tag":126,"props":3013,"children":3015},{"id":3014},"c0-run-context-gate-resume-safety",[3016],{"type":52,"value":3017},"C0 — Run-context gate (resume safety)",{"type":46,"tag":55,"props":3019,"children":3020},{},[3021],{"type":52,"value":3022},"The Eval phase makes one paid Bedrock call per golden case (and, with a source key, one paid\nsource-provider call per case). Before any dispatch, tell the user evaluation will invoke\nBedrock at their expense, capped at 200 cases.",{"type":46,"tag":303,"props":3024,"children":3025},{},[3026],{"type":46,"tag":79,"props":3027,"children":3028},{},[3029,3035,3037,3043,3045,3051],{"type":46,"tag":66,"props":3030,"children":3032},{"className":3031},[],[3033],{"type":52,"value":3034},"mkdir -p $PHASE_DIR",{"type":52,"value":3036},". Build ",{"type":46,"tag":66,"props":3038,"children":3040},{"className":3039},[],[3041],{"type":52,"value":3042},"$PHASE_DIR\u002Fcurrent-context.json",{"type":52,"value":3044}," with exactly these fields\n(hashes via ",{"type":46,"tag":66,"props":3046,"children":3048},{"className":3047},[],[3049],{"type":52,"value":3050},"shasum -a 256",{"type":52,"value":3052},"; key hash is a fingerprint — never store the key value):",{"type":46,"tag":141,"props":3054,"children":3058},{"className":3055,"code":3056,"language":3057,"meta":146,"style":146},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"repo_root\": \"\u003Ccd $REPO && pwd -P>\",\n  \"migration_dir\": \"\u003C$MIGRATION_DIR>\",\n  \"region\": \"\u003C$REGION>\",\n  \"aws_profile\": \"\u003C$AWS_PROFILE_CHOICE or \\\"\\\">\",\n  \"aws_account\": \"\u003CAccount from B2>\",\n  \"repo_head_sha\": \"\u003Cgit -C $REPO rev-parse HEAD>\",\n  \"repo_branch\": \"\u003Cgit -C $REPO rev-parse --abbrev-ref HEAD>\",\n  \"repo_dirty_sha256\": \"\u003Csha256 of: git status --porcelain + git diff + git diff --cached, EACH with pathspecs -- . ':(exclude).saws-migrate' ':(exclude).migration' ':(exclude)MIGRATION_REPORT_*.md'; \\\"\\\" when all three are empty>\",\n  \"target_models\": [{\"source_model\": \"...\", \"aws_model_id\": \"...\", \"use_case\": \"...\"}],\n  \"resolved_model_overrides\": {},\n  \"source_provider\": \"\u003Cfrom B1>\",\n  \"source_baseline_available\": \u003Ctrue|false from B3>,\n  \"source_key_sha256\": \"\u003Csha256 of .source-provider-env contents, \\\"\\\" when absent>\",\n  \"log_files\": [{\"path\": \"...\", \"sha256\": \"...\"}],\n  \"max_golden_cases\": 200,\n  \"assess_design_sha256\": \"\u003Csha256 of $MIGRATION_DIR\u002Faws-design-ai.json>\",\n  \"report_date_suffix\": \"\u003Cdate +%Y-%m-%d>\",\n  \"schema_version\": 1,\n  \"plugin_version\": \"\u003Cversion from \u003Cplugin>\u002F.claude-plugin\u002Fplugin.json>\"\n}\n","json",[3059],{"type":46,"tag":66,"props":3060,"children":3061},{"__ignoreMap":146},[3062,3070,3109,3146,3184,3231,3269,3307,3345,3392,3518,3544,3582,3639,3685,3775,3805,3843,3881,3911,3945],{"type":46,"tag":152,"props":3063,"children":3064},{"class":154,"line":155},[3065],{"type":46,"tag":152,"props":3066,"children":3067},{"style":170},[3068],{"type":52,"value":3069},"{\n",{"type":46,"tag":152,"props":3071,"children":3072},{"class":154,"line":834},[3073,3078,3084,3088,3092,3096,3101,3105],{"type":46,"tag":152,"props":3074,"children":3075},{"style":170},[3076],{"type":52,"value":3077},"  \"",{"type":46,"tag":152,"props":3079,"children":3081},{"style":3080},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[3082],{"type":52,"value":3083},"repo_root",{"type":46,"tag":152,"props":3085,"children":3086},{"style":170},[3087],{"type":52,"value":789},{"type":46,"tag":152,"props":3089,"children":3090},{"style":170},[3091],{"type":52,"value":1070},{"type":46,"tag":152,"props":3093,"children":3094},{"style":170},[3095],{"type":52,"value":194},{"type":46,"tag":152,"props":3097,"children":3098},{"style":164},[3099],{"type":52,"value":3100},"\u003Ccd $REPO && pwd -P>",{"type":46,"tag":152,"props":3102,"children":3103},{"style":170},[3104],{"type":52,"value":789},{"type":46,"tag":152,"props":3106,"children":3107},{"style":170},[3108],{"type":52,"value":1896},{"type":46,"tag":152,"props":3110,"children":3111},{"class":154,"line":844},[3112,3116,3121,3125,3129,3133,3138,3142],{"type":46,"tag":152,"props":3113,"children":3114},{"style":170},[3115],{"type":52,"value":3077},{"type":46,"tag":152,"props":3117,"children":3118},{"style":3080},[3119],{"type":52,"value":3120},"migration_dir",{"type":46,"tag":152,"props":3122,"children":3123},{"style":170},[3124],{"type":52,"value":789},{"type":46,"tag":152,"props":3126,"children":3127},{"style":170},[3128],{"type":52,"value":1070},{"type":46,"tag":152,"props":3130,"children":3131},{"style":170},[3132],{"type":52,"value":194},{"type":46,"tag":152,"props":3134,"children":3135},{"style":164},[3136],{"type":52,"value":3137},"\u003C$MIGRATION_DIR>",{"type":46,"tag":152,"props":3139,"children":3140},{"style":170},[3141],{"type":52,"value":789},{"type":46,"tag":152,"props":3143,"children":3144},{"style":170},[3145],{"type":52,"value":1896},{"type":46,"tag":152,"props":3147,"children":3149},{"class":154,"line":3148},4,[3150,3154,3159,3163,3167,3171,3176,3180],{"type":46,"tag":152,"props":3151,"children":3152},{"style":170},[3153],{"type":52,"value":3077},{"type":46,"tag":152,"props":3155,"children":3156},{"style":3080},[3157],{"type":52,"value":3158},"region",{"type":46,"tag":152,"props":3160,"children":3161},{"style":170},[3162],{"type":52,"value":789},{"type":46,"tag":152,"props":3164,"children":3165},{"style":170},[3166],{"type":52,"value":1070},{"type":46,"tag":152,"props":3168,"children":3169},{"style":170},[3170],{"type":52,"value":194},{"type":46,"tag":152,"props":3172,"children":3173},{"style":164},[3174],{"type":52,"value":3175},"\u003C$REGION>",{"type":46,"tag":152,"props":3177,"children":3178},{"style":170},[3179],{"type":52,"value":789},{"type":46,"tag":152,"props":3181,"children":3182},{"style":170},[3183],{"type":52,"value":1896},{"type":46,"tag":152,"props":3185,"children":3187},{"class":154,"line":3186},5,[3188,3192,3197,3201,3205,3209,3214,3219,3223,3227],{"type":46,"tag":152,"props":3189,"children":3190},{"style":170},[3191],{"type":52,"value":3077},{"type":46,"tag":152,"props":3193,"children":3194},{"style":3080},[3195],{"type":52,"value":3196},"aws_profile",{"type":46,"tag":152,"props":3198,"children":3199},{"style":170},[3200],{"type":52,"value":789},{"type":46,"tag":152,"props":3202,"children":3203},{"style":170},[3204],{"type":52,"value":1070},{"type":46,"tag":152,"props":3206,"children":3207},{"style":170},[3208],{"type":52,"value":194},{"type":46,"tag":152,"props":3210,"children":3211},{"style":164},[3212],{"type":52,"value":3213},"\u003C$AWS_PROFILE_CHOICE or ",{"type":46,"tag":152,"props":3215,"children":3216},{"style":546},[3217],{"type":52,"value":3218},"\\\"\\\"",{"type":46,"tag":152,"props":3220,"children":3221},{"style":164},[3222],{"type":52,"value":376},{"type":46,"tag":152,"props":3224,"children":3225},{"style":170},[3226],{"type":52,"value":789},{"type":46,"tag":152,"props":3228,"children":3229},{"style":170},[3230],{"type":52,"value":1896},{"type":46,"tag":152,"props":3232,"children":3234},{"class":154,"line":3233},6,[3235,3239,3244,3248,3252,3256,3261,3265],{"type":46,"tag":152,"props":3236,"children":3237},{"style":170},[3238],{"type":52,"value":3077},{"type":46,"tag":152,"props":3240,"children":3241},{"style":3080},[3242],{"type":52,"value":3243},"aws_account",{"type":46,"tag":152,"props":3245,"children":3246},{"style":170},[3247],{"type":52,"value":789},{"type":46,"tag":152,"props":3249,"children":3250},{"style":170},[3251],{"type":52,"value":1070},{"type":46,"tag":152,"props":3253,"children":3254},{"style":170},[3255],{"type":52,"value":194},{"type":46,"tag":152,"props":3257,"children":3258},{"style":164},[3259],{"type":52,"value":3260},"\u003CAccount from B2>",{"type":46,"tag":152,"props":3262,"children":3263},{"style":170},[3264],{"type":52,"value":789},{"type":46,"tag":152,"props":3266,"children":3267},{"style":170},[3268],{"type":52,"value":1896},{"type":46,"tag":152,"props":3270,"children":3272},{"class":154,"line":3271},7,[3273,3277,3282,3286,3290,3294,3299,3303],{"type":46,"tag":152,"props":3274,"children":3275},{"style":170},[3276],{"type":52,"value":3077},{"type":46,"tag":152,"props":3278,"children":3279},{"style":3080},[3280],{"type":52,"value":3281},"repo_head_sha",{"type":46,"tag":152,"props":3283,"children":3284},{"style":170},[3285],{"type":52,"value":789},{"type":46,"tag":152,"props":3287,"children":3288},{"style":170},[3289],{"type":52,"value":1070},{"type":46,"tag":152,"props":3291,"children":3292},{"style":170},[3293],{"type":52,"value":194},{"type":46,"tag":152,"props":3295,"children":3296},{"style":164},[3297],{"type":52,"value":3298},"\u003Cgit -C $REPO rev-parse HEAD>",{"type":46,"tag":152,"props":3300,"children":3301},{"style":170},[3302],{"type":52,"value":789},{"type":46,"tag":152,"props":3304,"children":3305},{"style":170},[3306],{"type":52,"value":1896},{"type":46,"tag":152,"props":3308,"children":3310},{"class":154,"line":3309},8,[3311,3315,3320,3324,3328,3332,3337,3341],{"type":46,"tag":152,"props":3312,"children":3313},{"style":170},[3314],{"type":52,"value":3077},{"type":46,"tag":152,"props":3316,"children":3317},{"style":3080},[3318],{"type":52,"value":3319},"repo_branch",{"type":46,"tag":152,"props":3321,"children":3322},{"style":170},[3323],{"type":52,"value":789},{"type":46,"tag":152,"props":3325,"children":3326},{"style":170},[3327],{"type":52,"value":1070},{"type":46,"tag":152,"props":3329,"children":3330},{"style":170},[3331],{"type":52,"value":194},{"type":46,"tag":152,"props":3333,"children":3334},{"style":164},[3335],{"type":52,"value":3336},"\u003Cgit -C $REPO rev-parse --abbrev-ref HEAD>",{"type":46,"tag":152,"props":3338,"children":3339},{"style":170},[3340],{"type":52,"value":789},{"type":46,"tag":152,"props":3342,"children":3343},{"style":170},[3344],{"type":52,"value":1896},{"type":46,"tag":152,"props":3346,"children":3348},{"class":154,"line":3347},9,[3349,3353,3358,3362,3366,3370,3375,3379,3384,3388],{"type":46,"tag":152,"props":3350,"children":3351},{"style":170},[3352],{"type":52,"value":3077},{"type":46,"tag":152,"props":3354,"children":3355},{"style":3080},[3356],{"type":52,"value":3357},"repo_dirty_sha256",{"type":46,"tag":152,"props":3359,"children":3360},{"style":170},[3361],{"type":52,"value":789},{"type":46,"tag":152,"props":3363,"children":3364},{"style":170},[3365],{"type":52,"value":1070},{"type":46,"tag":152,"props":3367,"children":3368},{"style":170},[3369],{"type":52,"value":194},{"type":46,"tag":152,"props":3371,"children":3372},{"style":164},[3373],{"type":52,"value":3374},"\u003Csha256 of: git status --porcelain + git diff + git diff --cached, EACH with pathspecs -- . ':(exclude).saws-migrate' ':(exclude).migration' ':(exclude)MIGRATION_REPORT_*.md'; ",{"type":46,"tag":152,"props":3376,"children":3377},{"style":546},[3378],{"type":52,"value":3218},{"type":46,"tag":152,"props":3380,"children":3381},{"style":164},[3382],{"type":52,"value":3383}," when all three are empty>",{"type":46,"tag":152,"props":3385,"children":3386},{"style":170},[3387],{"type":52,"value":789},{"type":46,"tag":152,"props":3389,"children":3390},{"style":170},[3391],{"type":52,"value":1896},{"type":46,"tag":152,"props":3393,"children":3395},{"class":154,"line":3394},10,[3396,3400,3405,3409,3413,3418,3422,3427,3431,3435,3439,3444,3448,3453,3457,3461,3465,3469,3473,3477,3481,3485,3489,3493,3497,3501,3505,3509,3513],{"type":46,"tag":152,"props":3397,"children":3398},{"style":170},[3399],{"type":52,"value":3077},{"type":46,"tag":152,"props":3401,"children":3402},{"style":3080},[3403],{"type":52,"value":3404},"target_models",{"type":46,"tag":152,"props":3406,"children":3407},{"style":170},[3408],{"type":52,"value":789},{"type":46,"tag":152,"props":3410,"children":3411},{"style":170},[3412],{"type":52,"value":1070},{"type":46,"tag":152,"props":3414,"children":3415},{"style":170},[3416],{"type":52,"value":3417}," [{",{"type":46,"tag":152,"props":3419,"children":3420},{"style":170},[3421],{"type":52,"value":789},{"type":46,"tag":152,"props":3423,"children":3424},{"style":159},[3425],{"type":52,"value":3426},"source_model",{"type":46,"tag":152,"props":3428,"children":3429},{"style":170},[3430],{"type":52,"value":789},{"type":46,"tag":152,"props":3432,"children":3433},{"style":170},[3434],{"type":52,"value":1070},{"type":46,"tag":152,"props":3436,"children":3437},{"style":170},[3438],{"type":52,"value":194},{"type":46,"tag":152,"props":3440,"children":3441},{"style":164},[3442],{"type":52,"value":3443},"...",{"type":46,"tag":152,"props":3445,"children":3446},{"style":170},[3447],{"type":52,"value":789},{"type":46,"tag":152,"props":3449,"children":3450},{"style":170},[3451],{"type":52,"value":3452},",",{"type":46,"tag":152,"props":3454,"children":3455},{"style":170},[3456],{"type":52,"value":194},{"type":46,"tag":152,"props":3458,"children":3459},{"style":159},[3460],{"type":52,"value":1176},{"type":46,"tag":152,"props":3462,"children":3463},{"style":170},[3464],{"type":52,"value":789},{"type":46,"tag":152,"props":3466,"children":3467},{"style":170},[3468],{"type":52,"value":1070},{"type":46,"tag":152,"props":3470,"children":3471},{"style":170},[3472],{"type":52,"value":194},{"type":46,"tag":152,"props":3474,"children":3475},{"style":164},[3476],{"type":52,"value":3443},{"type":46,"tag":152,"props":3478,"children":3479},{"style":170},[3480],{"type":52,"value":789},{"type":46,"tag":152,"props":3482,"children":3483},{"style":170},[3484],{"type":52,"value":3452},{"type":46,"tag":152,"props":3486,"children":3487},{"style":170},[3488],{"type":52,"value":194},{"type":46,"tag":152,"props":3490,"children":3491},{"style":159},[3492],{"type":52,"value":1192},{"type":46,"tag":152,"props":3494,"children":3495},{"style":170},[3496],{"type":52,"value":789},{"type":46,"tag":152,"props":3498,"children":3499},{"style":170},[3500],{"type":52,"value":1070},{"type":46,"tag":152,"props":3502,"children":3503},{"style":170},[3504],{"type":52,"value":194},{"type":46,"tag":152,"props":3506,"children":3507},{"style":164},[3508],{"type":52,"value":3443},{"type":46,"tag":152,"props":3510,"children":3511},{"style":170},[3512],{"type":52,"value":789},{"type":46,"tag":152,"props":3514,"children":3515},{"style":170},[3516],{"type":52,"value":3517},"}],\n",{"type":46,"tag":152,"props":3519,"children":3521},{"class":154,"line":3520},11,[3522,3526,3531,3535,3539],{"type":46,"tag":152,"props":3523,"children":3524},{"style":170},[3525],{"type":52,"value":3077},{"type":46,"tag":152,"props":3527,"children":3528},{"style":3080},[3529],{"type":52,"value":3530},"resolved_model_overrides",{"type":46,"tag":152,"props":3532,"children":3533},{"style":170},[3534],{"type":52,"value":789},{"type":46,"tag":152,"props":3536,"children":3537},{"style":170},[3538],{"type":52,"value":1070},{"type":46,"tag":152,"props":3540,"children":3541},{"style":170},[3542],{"type":52,"value":3543}," {},\n",{"type":46,"tag":152,"props":3545,"children":3547},{"class":154,"line":3546},12,[3548,3552,3557,3561,3565,3569,3574,3578],{"type":46,"tag":152,"props":3549,"children":3550},{"style":170},[3551],{"type":52,"value":3077},{"type":46,"tag":152,"props":3553,"children":3554},{"style":3080},[3555],{"type":52,"value":3556},"source_provider",{"type":46,"tag":152,"props":3558,"children":3559},{"style":170},[3560],{"type":52,"value":789},{"type":46,"tag":152,"props":3562,"children":3563},{"style":170},[3564],{"type":52,"value":1070},{"type":46,"tag":152,"props":3566,"children":3567},{"style":170},[3568],{"type":52,"value":194},{"type":46,"tag":152,"props":3570,"children":3571},{"style":164},[3572],{"type":52,"value":3573},"\u003Cfrom B1>",{"type":46,"tag":152,"props":3575,"children":3576},{"style":170},[3577],{"type":52,"value":789},{"type":46,"tag":152,"props":3579,"children":3580},{"style":170},[3581],{"type":52,"value":1896},{"type":46,"tag":152,"props":3583,"children":3585},{"class":154,"line":3584},13,[3586,3590,3595,3599,3603,3607,3612,3616,3621,3626,3631,3635],{"type":46,"tag":152,"props":3587,"children":3588},{"style":170},[3589],{"type":52,"value":3077},{"type":46,"tag":152,"props":3591,"children":3592},{"style":3080},[3593],{"type":52,"value":3594},"source_baseline_available",{"type":46,"tag":152,"props":3596,"children":3597},{"style":170},[3598],{"type":52,"value":789},{"type":46,"tag":152,"props":3600,"children":3601},{"style":170},[3602],{"type":52,"value":1070},{"type":46,"tag":152,"props":3604,"children":3605},{"style":546},[3606],{"type":52,"value":414},{"type":46,"tag":152,"props":3608,"children":3609},{"style":170},[3610],{"type":52,"value":3611},"true",{"type":46,"tag":152,"props":3613,"children":3614},{"style":546},[3615],{"type":52,"value":2675},{"type":46,"tag":152,"props":3617,"children":3618},{"style":170},[3619],{"type":52,"value":3620},"false",{"type":46,"tag":152,"props":3622,"children":3623},{"style":546},[3624],{"type":52,"value":3625}," from B",{"type":46,"tag":152,"props":3627,"children":3628},{"style":1864},[3629],{"type":52,"value":3630},"3",{"type":46,"tag":152,"props":3632,"children":3633},{"style":546},[3634],{"type":52,"value":376},{"type":46,"tag":152,"props":3636,"children":3637},{"style":170},[3638],{"type":52,"value":1896},{"type":46,"tag":152,"props":3640,"children":3641},{"class":154,"line":29},[3642,3646,3651,3655,3659,3663,3668,3672,3677,3681],{"type":46,"tag":152,"props":3643,"children":3644},{"style":170},[3645],{"type":52,"value":3077},{"type":46,"tag":152,"props":3647,"children":3648},{"style":3080},[3649],{"type":52,"value":3650},"source_key_sha256",{"type":46,"tag":152,"props":3652,"children":3653},{"style":170},[3654],{"type":52,"value":789},{"type":46,"tag":152,"props":3656,"children":3657},{"style":170},[3658],{"type":52,"value":1070},{"type":46,"tag":152,"props":3660,"children":3661},{"style":170},[3662],{"type":52,"value":194},{"type":46,"tag":152,"props":3664,"children":3665},{"style":164},[3666],{"type":52,"value":3667},"\u003Csha256 of .source-provider-env contents, ",{"type":46,"tag":152,"props":3669,"children":3670},{"style":546},[3671],{"type":52,"value":3218},{"type":46,"tag":152,"props":3673,"children":3674},{"style":164},[3675],{"type":52,"value":3676}," when absent>",{"type":46,"tag":152,"props":3678,"children":3679},{"style":170},[3680],{"type":52,"value":789},{"type":46,"tag":152,"props":3682,"children":3683},{"style":170},[3684],{"type":52,"value":1896},{"type":46,"tag":152,"props":3686,"children":3687},{"class":154,"line":33},[3688,3692,3697,3701,3705,3709,3713,3718,3722,3726,3730,3734,3738,3742,3746,3751,3755,3759,3763,3767,3771],{"type":46,"tag":152,"props":3689,"children":3690},{"style":170},[3691],{"type":52,"value":3077},{"type":46,"tag":152,"props":3693,"children":3694},{"style":3080},[3695],{"type":52,"value":3696},"log_files",{"type":46,"tag":152,"props":3698,"children":3699},{"style":170},[3700],{"type":52,"value":789},{"type":46,"tag":152,"props":3702,"children":3703},{"style":170},[3704],{"type":52,"value":1070},{"type":46,"tag":152,"props":3706,"children":3707},{"style":170},[3708],{"type":52,"value":3417},{"type":46,"tag":152,"props":3710,"children":3711},{"style":170},[3712],{"type":52,"value":789},{"type":46,"tag":152,"props":3714,"children":3715},{"style":159},[3716],{"type":52,"value":3717},"path",{"type":46,"tag":152,"props":3719,"children":3720},{"style":170},[3721],{"type":52,"value":789},{"type":46,"tag":152,"props":3723,"children":3724},{"style":170},[3725],{"type":52,"value":1070},{"type":46,"tag":152,"props":3727,"children":3728},{"style":170},[3729],{"type":52,"value":194},{"type":46,"tag":152,"props":3731,"children":3732},{"style":164},[3733],{"type":52,"value":3443},{"type":46,"tag":152,"props":3735,"children":3736},{"style":170},[3737],{"type":52,"value":789},{"type":46,"tag":152,"props":3739,"children":3740},{"style":170},[3741],{"type":52,"value":3452},{"type":46,"tag":152,"props":3743,"children":3744},{"style":170},[3745],{"type":52,"value":194},{"type":46,"tag":152,"props":3747,"children":3748},{"style":159},[3749],{"type":52,"value":3750},"sha256",{"type":46,"tag":152,"props":3752,"children":3753},{"style":170},[3754],{"type":52,"value":789},{"type":46,"tag":152,"props":3756,"children":3757},{"style":170},[3758],{"type":52,"value":1070},{"type":46,"tag":152,"props":3760,"children":3761},{"style":170},[3762],{"type":52,"value":194},{"type":46,"tag":152,"props":3764,"children":3765},{"style":164},[3766],{"type":52,"value":3443},{"type":46,"tag":152,"props":3768,"children":3769},{"style":170},[3770],{"type":52,"value":789},{"type":46,"tag":152,"props":3772,"children":3773},{"style":170},[3774],{"type":52,"value":3517},{"type":46,"tag":152,"props":3776,"children":3778},{"class":154,"line":3777},16,[3779,3783,3788,3792,3796,3801],{"type":46,"tag":152,"props":3780,"children":3781},{"style":170},[3782],{"type":52,"value":3077},{"type":46,"tag":152,"props":3784,"children":3785},{"style":3080},[3786],{"type":52,"value":3787},"max_golden_cases",{"type":46,"tag":152,"props":3789,"children":3790},{"style":170},[3791],{"type":52,"value":789},{"type":46,"tag":152,"props":3793,"children":3794},{"style":170},[3795],{"type":52,"value":1070},{"type":46,"tag":152,"props":3797,"children":3798},{"style":1864},[3799],{"type":52,"value":3800}," 200",{"type":46,"tag":152,"props":3802,"children":3803},{"style":170},[3804],{"type":52,"value":1896},{"type":46,"tag":152,"props":3806,"children":3808},{"class":154,"line":3807},17,[3809,3813,3818,3822,3826,3830,3835,3839],{"type":46,"tag":152,"props":3810,"children":3811},{"style":170},[3812],{"type":52,"value":3077},{"type":46,"tag":152,"props":3814,"children":3815},{"style":3080},[3816],{"type":52,"value":3817},"assess_design_sha256",{"type":46,"tag":152,"props":3819,"children":3820},{"style":170},[3821],{"type":52,"value":789},{"type":46,"tag":152,"props":3823,"children":3824},{"style":170},[3825],{"type":52,"value":1070},{"type":46,"tag":152,"props":3827,"children":3828},{"style":170},[3829],{"type":52,"value":194},{"type":46,"tag":152,"props":3831,"children":3832},{"style":164},[3833],{"type":52,"value":3834},"\u003Csha256 of $MIGRATION_DIR\u002Faws-design-ai.json>",{"type":46,"tag":152,"props":3836,"children":3837},{"style":170},[3838],{"type":52,"value":789},{"type":46,"tag":152,"props":3840,"children":3841},{"style":170},[3842],{"type":52,"value":1896},{"type":46,"tag":152,"props":3844,"children":3846},{"class":154,"line":3845},18,[3847,3851,3856,3860,3864,3868,3873,3877],{"type":46,"tag":152,"props":3848,"children":3849},{"style":170},[3850],{"type":52,"value":3077},{"type":46,"tag":152,"props":3852,"children":3853},{"style":3080},[3854],{"type":52,"value":3855},"report_date_suffix",{"type":46,"tag":152,"props":3857,"children":3858},{"style":170},[3859],{"type":52,"value":789},{"type":46,"tag":152,"props":3861,"children":3862},{"style":170},[3863],{"type":52,"value":1070},{"type":46,"tag":152,"props":3865,"children":3866},{"style":170},[3867],{"type":52,"value":194},{"type":46,"tag":152,"props":3869,"children":3870},{"style":164},[3871],{"type":52,"value":3872},"\u003Cdate +%Y-%m-%d>",{"type":46,"tag":152,"props":3874,"children":3875},{"style":170},[3876],{"type":52,"value":789},{"type":46,"tag":152,"props":3878,"children":3879},{"style":170},[3880],{"type":52,"value":1896},{"type":46,"tag":152,"props":3882,"children":3884},{"class":154,"line":3883},19,[3885,3889,3894,3898,3902,3907],{"type":46,"tag":152,"props":3886,"children":3887},{"style":170},[3888],{"type":52,"value":3077},{"type":46,"tag":152,"props":3890,"children":3891},{"style":3080},[3892],{"type":52,"value":3893},"schema_version",{"type":46,"tag":152,"props":3895,"children":3896},{"style":170},[3897],{"type":52,"value":789},{"type":46,"tag":152,"props":3899,"children":3900},{"style":170},[3901],{"type":52,"value":1070},{"type":46,"tag":152,"props":3903,"children":3904},{"style":1864},[3905],{"type":52,"value":3906}," 1",{"type":46,"tag":152,"props":3908,"children":3909},{"style":170},[3910],{"type":52,"value":1896},{"type":46,"tag":152,"props":3912,"children":3914},{"class":154,"line":3913},20,[3915,3919,3924,3928,3932,3936,3941],{"type":46,"tag":152,"props":3916,"children":3917},{"style":170},[3918],{"type":52,"value":3077},{"type":46,"tag":152,"props":3920,"children":3921},{"style":3080},[3922],{"type":52,"value":3923},"plugin_version",{"type":46,"tag":152,"props":3925,"children":3926},{"style":170},[3927],{"type":52,"value":789},{"type":46,"tag":152,"props":3929,"children":3930},{"style":170},[3931],{"type":52,"value":1070},{"type":46,"tag":152,"props":3933,"children":3934},{"style":170},[3935],{"type":52,"value":194},{"type":46,"tag":152,"props":3937,"children":3938},{"style":164},[3939],{"type":52,"value":3940},"\u003Cversion from \u003Cplugin>\u002F.claude-plugin\u002Fplugin.json>",{"type":46,"tag":152,"props":3942,"children":3943},{"style":170},[3944],{"type":52,"value":204},{"type":46,"tag":152,"props":3946,"children":3948},{"class":154,"line":3947},21,[3949],{"type":46,"tag":152,"props":3950,"children":3951},{"style":170},[3952],{"type":52,"value":3953},"}\n",{"type":46,"tag":303,"props":3955,"children":3956},{},[3957,4043],{"type":46,"tag":79,"props":3958,"children":3959},{},[3960,3965,3966,3972,3974,3980,3982,3988,3990,3996,3998,4003,4005,4011,4013,4019,4021,4027,4029,4034,4036,4041],{"type":46,"tag":267,"props":3961,"children":3962},{},[3963],{"type":52,"value":3964},"Stage 0 (post-C5 normalization).",{"type":52,"value":950},{"type":46,"tag":66,"props":3967,"children":3969},{"className":3968},[],[3970],{"type":52,"value":3971},"$PHASE_DIR\u002Frewrite.json",{"type":52,"value":3973}," exists and validates as\na payload (",{"type":46,"tag":66,"props":3975,"children":3977},{"className":3976},[],[3978],{"type":52,"value":3979},"CONTROL=ok",{"type":52,"value":3981},"), do NOT use live ",{"type":46,"tag":66,"props":3983,"children":3985},{"className":3984},[],[3986],{"type":52,"value":3987},"repo_*",{"type":52,"value":3989}," values. Run three integrity checks:\n(1) ",{"type":46,"tag":66,"props":3991,"children":3993},{"className":3992},[],[3994],{"type":52,"value":3995},"rewrite.baseline_parent_sha",{"type":52,"value":3997}," equals the SAVED ",{"type":46,"tag":66,"props":3999,"children":4001},{"className":4000},[],[4002],{"type":52,"value":3281},{"type":52,"value":4004},"; (2) ",{"type":46,"tag":66,"props":4006,"children":4008},{"className":4007},[],[4009],{"type":52,"value":4010},"git rev-parse \u003Crewrite.branch_name>",{"type":52,"value":4012}," equals ",{"type":46,"tag":66,"props":4014,"children":4016},{"className":4015},[],[4017],{"type":52,"value":4018},"rewrite.branch_tip_sha",{"type":52,"value":4020},"; (3) ",{"type":46,"tag":66,"props":4022,"children":4024},{"className":4023},[],[4025],{"type":52,"value":4026},"git status --porcelain",{"type":52,"value":4028}," (with\nthe artifact exclusions) is empty. All pass → copy the saved ",{"type":46,"tag":66,"props":4030,"children":4032},{"className":4031},[],[4033],{"type":52,"value":3987},{"type":52,"value":4035}," values into\ncurrent-context verbatim, continue to step 3. Check 2 fails (tip moved) → STOP and\nAskUserQuestion: \"Keep your commits (regenerate report only, with a mixed-authorship note)\"\n\u002F \"Reset the branch to the rewriter's tip and regenerate from C6\" \u002F \"Abort\". Check 3 fails\n(dirty tree) → STOP and ask: commit\u002Fstash (then re-check) or discard the edits. Check 1\nfails → treat as a full ",{"type":46,"tag":66,"props":4037,"children":4039},{"className":4038},[],[4040],{"type":52,"value":3987},{"type":52,"value":4042}," mismatch in step 3.",{"type":46,"tag":79,"props":4044,"children":4045},{},[4046,4047,4053],{"type":52,"value":249},{"type":46,"tag":66,"props":4048,"children":4050},{"className":4049},[],[4051],{"type":52,"value":4052},"$PHASE_DIR\u002Frun-context.json",{"type":52,"value":4054}," exists, compare:",{"type":46,"tag":141,"props":4056,"children":4058},{"className":143,"code":4057,"language":145,"meta":146,"style":146},"uv run --project $SCRIPTS python $SCRIPTS\u002Fvalidate_result.py --check-run-context $PHASE_DIR\u002Frun-context.json --current $PHASE_DIR\u002Fcurrent-context.json\n",[4059],{"type":46,"tag":66,"props":4060,"children":4061},{"__ignoreMap":146},[4062],{"type":46,"tag":152,"props":4063,"children":4064},{"class":154,"line":155},[4065,4069,4073,4077,4081,4085,4089,4093,4098,4103,4108,4113,4117],{"type":46,"tag":152,"props":4066,"children":4067},{"style":159},[4068],{"type":52,"value":137},{"type":46,"tag":152,"props":4070,"children":4071},{"style":164},[4072],{"type":52,"value":2247},{"type":46,"tag":152,"props":4074,"children":4075},{"style":164},[4076],{"type":52,"value":2252},{"type":46,"tag":152,"props":4078,"children":4079},{"style":546},[4080],{"type":52,"value":2257},{"type":46,"tag":152,"props":4082,"children":4083},{"style":164},[4084],{"type":52,"value":2262},{"type":46,"tag":152,"props":4086,"children":4087},{"style":546},[4088],{"type":52,"value":2267},{"type":46,"tag":152,"props":4090,"children":4091},{"style":164},[4092],{"type":52,"value":2656},{"type":46,"tag":152,"props":4094,"children":4095},{"style":164},[4096],{"type":52,"value":4097}," --check-run-context",{"type":46,"tag":152,"props":4099,"children":4100},{"style":546},[4101],{"type":52,"value":4102}," $PHASE_DIR",{"type":46,"tag":152,"props":4104,"children":4105},{"style":164},[4106],{"type":52,"value":4107},"\u002Frun-context.json",{"type":46,"tag":152,"props":4109,"children":4110},{"style":164},[4111],{"type":52,"value":4112}," --current",{"type":46,"tag":152,"props":4114,"children":4115},{"style":546},[4116],{"type":52,"value":4102},{"type":46,"tag":152,"props":4118,"children":4119},{"style":164},[4120],{"type":52,"value":4121},"\u002Fcurrent-context.json\n",{"type":46,"tag":75,"props":4123,"children":4124},{},[4125,4151],{"type":46,"tag":79,"props":4126,"children":4127},{},[4128,4134,4136,4141,4143,4149],{"type":46,"tag":66,"props":4129,"children":4131},{"className":4130},[],[4132],{"type":52,"value":4133},"RUN_CONTEXT=match",{"type":52,"value":4135}," → resume: walk C1→C2→C3→(C4: delta-decisions.json)→C5→(C6: report\nfile) in order; a phase counts completed iff its file validates with ",{"type":46,"tag":66,"props":4137,"children":4139},{"className":4138},[],[4140],{"type":52,"value":3979},{"type":52,"value":4142}," (C6:\niff ",{"type":46,"tag":66,"props":4144,"children":4146},{"className":4145},[],[4147],{"type":52,"value":4148},"MIGRATION_REPORT_\u003Csaved suffix>.md",{"type":52,"value":4150}," exists while rewrite.json is payload-valid).\nSTOP the walk at the first missing\u002Finvalid\u002Fcontrol-state file — blocked\u002Fpartial files\nroute to their flows below, NEVER count as completed. Offer the user \"skip completed\nphases X..Y, resume at Z\". Files after an unexplained gap: archive them with the gap.",{"type":46,"tag":79,"props":4152,"children":4153},{},[4154,4160,4162,4168,4170,4175,4177,4182],{"type":46,"tag":66,"props":4155,"children":4157},{"className":4156},[],[4158],{"type":52,"value":4159},"RUN_CONTEXT=mismatch",{"type":52,"value":4161}," → scoped invalidation. Map each MISMATCH line through this table,\narchive the named units to ",{"type":46,"tag":66,"props":4163,"children":4165},{"className":4164},[],[4166],{"type":52,"value":4167},"$REPO\u002F.saws-migrate\u002Fphase-results-archive\u002F\u003Csaved suffix>-$(date +%H%M%S)\u002F",{"type":52,"value":4169},"\n(a SIBLING of phase-results\u002F — never nest it inside), ",{"type":46,"tag":267,"props":4171,"children":4172},{},[4173],{"type":52,"value":4174},"then immediately overwrite\nrun-context.json with current-context.json",{"type":52,"value":4176}," (carrying forward the saved\n",{"type":46,"tag":66,"props":4178,"children":4180},{"className":4179},[],[4181],{"type":52,"value":3855},{"type":52,"value":4183}," unless REPORT itself is being invalidated), then re-run the\ninvalidated phases in order. Tell the user which fields differed and what re-runs.",{"type":46,"tag":2852,"props":4185,"children":4186},{},[4187,4208],{"type":46,"tag":2856,"props":4188,"children":4189},{},[4190],{"type":46,"tag":2860,"props":4191,"children":4192},{},[4193,4198,4203],{"type":46,"tag":2864,"props":4194,"children":4195},{},[4196],{"type":52,"value":4197},"Mismatched field(s)",{"type":46,"tag":2864,"props":4199,"children":4200},{},[4201],{"type":52,"value":4202},"Archive (units)",{"type":46,"tag":2864,"props":4204,"children":4205},{},[4206],{"type":52,"value":4207},"Keep",{"type":46,"tag":2875,"props":4209,"children":4210},{},[4211,4229,4245,4263,4279],{"type":46,"tag":2860,"props":4212,"children":4213},{},[4214,4219,4224],{"type":46,"tag":2882,"props":4215,"children":4216},{},[4217],{"type":52,"value":4218},"repo_root, migration_dir, region, aws_profile, aws_account, source_provider, assess_design_sha256, schema_version, plugin_version",{"type":46,"tag":2882,"props":4220,"children":4221},{},[4222],{"type":52,"value":4223},"everything",{"type":46,"tag":2882,"props":4225,"children":4226},{},[4227],{"type":52,"value":4228},"—",{"type":46,"tag":2860,"props":4230,"children":4231},{},[4232,4237,4241],{"type":46,"tag":2882,"props":4233,"children":4234},{},[4235],{"type":52,"value":4236},"repo_head_sha \u002F repo_branch \u002F repo_dirty_sha256",{"type":46,"tag":2882,"props":4238,"children":4239},{},[4240],{"type":52,"value":4223},{"type":46,"tag":2882,"props":4242,"children":4243},{},[4244],{"type":52,"value":4228},{"type":46,"tag":2860,"props":4246,"children":4247},{},[4248,4253,4258],{"type":46,"tag":2882,"props":4249,"children":4250},{},[4251],{"type":52,"value":4252},"target_models \u002F resolved_model_overrides",{"type":46,"tag":2882,"props":4254,"children":4255},{},[4256],{"type":52,"value":4257},"ANALYSIS, EVAL, REWRITE, REPORT",{"type":46,"tag":2882,"props":4259,"children":4260},{},[4261],{"type":52,"value":4262},"INGESTION",{"type":46,"tag":2860,"props":4264,"children":4265},{},[4266,4271,4275],{"type":46,"tag":2882,"props":4267,"children":4268},{},[4269],{"type":52,"value":4270},"log_files \u002F max_golden_cases",{"type":46,"tag":2882,"props":4272,"children":4273},{},[4274],{"type":52,"value":4223},{"type":46,"tag":2882,"props":4276,"children":4277},{},[4278],{"type":52,"value":4228},{"type":46,"tag":2860,"props":4280,"children":4281},{},[4282,4287,4291],{"type":46,"tag":2882,"props":4283,"children":4284},{},[4285],{"type":52,"value":4286},"source_key_sha256 \u002F source_baseline_available",{"type":46,"tag":2882,"props":4288,"children":4289},{},[4290],{"type":52,"value":4257},{"type":46,"tag":2882,"props":4292,"children":4293},{},[4294],{"type":52,"value":4262},{"type":46,"tag":55,"props":4296,"children":4297},{},[4298,4300,4306,4308,4314,4316,4321],{"type":52,"value":4299},"Units: ANALYSIS = analysis.json · INGESTION = ingestion.json + ",{"type":46,"tag":66,"props":4301,"children":4303},{"className":4302},[],[4304],{"type":52,"value":4305},".saws-migrate\u002Fgolden-dataset\u002F",{"type":52,"value":4307},"\n· EVAL = eval.json + ",{"type":46,"tag":66,"props":4309,"children":4311},{"className":4310},[],[4312],{"type":52,"value":4313},".saws-migrate\u002Feval-results\u002F",{"type":52,"value":4315}," (minus cost_compare.py) · REWRITE =\nrewrite.json + delta-decisions.json · REPORT = ",{"type":46,"tag":66,"props":4317,"children":4319},{"className":4318},[],[4320],{"type":52,"value":4148},{"type":52,"value":293},{"type":46,"tag":55,"props":4323,"children":4324},{},[4325,4330,4332,4338,4340,4346],{"type":46,"tag":267,"props":4326,"children":4327},{},[4328],{"type":52,"value":4329},"Post-C5 reruns of C1–C3 need the pre-migration tree.",{"type":52,"value":4331}," If rewrite.json was payload-valid\nand the table invalidates ANALYSIS\u002FINGESTION\u002FEVAL: confirm with the user that the old\nmigration branch will be discarded (keep-or-reset flow first if the tip moved), then\n",{"type":46,"tag":66,"props":4333,"children":4335},{"className":4334},[],[4336],{"type":52,"value":4337},"git checkout \u003Csaved repo_branch>",{"type":52,"value":4339},", delete the old branch and the ",{"type":46,"tag":66,"props":4341,"children":4343},{"className":4342},[],[4344],{"type":52,"value":4345},"saws-migrate-baseline",{"type":52,"value":4347},"\ntag, and re-run from C1. If the user declines, stop — re-analyzing a tree that contains\nthe rewrite produces garbage.",{"type":46,"tag":303,"props":4349,"children":4350},{},[4351],{"type":46,"tag":79,"props":4352,"children":4353},{},[4354],{"type":52,"value":4355},"No saved run-context → fresh run: write current-context.json as run-context.json, dispatch C1.",{"type":46,"tag":126,"props":4357,"children":4359},{"id":4358},"c1-analyzer-c2-ingestor-c3-evaluator",[4360],{"type":52,"value":4361},"C1 — Analyzer · C2 — Ingestor · C3 — Evaluator",{"type":46,"tag":55,"props":4363,"children":4364},{},[4365],{"type":52,"value":4366},"For each phase in order, dispatch the agent with the context block (listing all\nprior-phase file paths), then validate its output file:",{"type":46,"tag":2852,"props":4368,"children":4369},{},[4370,4396],{"type":46,"tag":2856,"props":4371,"children":4372},{},[4373],{"type":46,"tag":2860,"props":4374,"children":4375},{},[4376,4381,4386,4391],{"type":46,"tag":2864,"props":4377,"children":4378},{},[4379],{"type":52,"value":4380},"Step",{"type":46,"tag":2864,"props":4382,"children":4383},{},[4384],{"type":52,"value":4385},"agentType",{"type":46,"tag":2864,"props":4387,"children":4388},{},[4389],{"type":52,"value":4390},"Output file",{"type":46,"tag":2864,"props":4392,"children":4393},{},[4394],{"type":52,"value":4395},"Schema",{"type":46,"tag":2875,"props":4397,"children":4398},{},[4399,4428,4457],{"type":46,"tag":2860,"props":4400,"children":4401},{},[4402,4407,4415,4424],{"type":46,"tag":2882,"props":4403,"children":4404},{},[4405],{"type":52,"value":4406},"C1",{"type":46,"tag":2882,"props":4408,"children":4409},{},[4410],{"type":46,"tag":66,"props":4411,"children":4413},{"className":4412},[],[4414],{"type":52,"value":2573},{"type":46,"tag":2882,"props":4416,"children":4417},{},[4418],{"type":46,"tag":66,"props":4419,"children":4421},{"className":4420},[],[4422],{"type":52,"value":4423},"$PHASE_DIR\u002Fanalysis.json",{"type":46,"tag":2882,"props":4425,"children":4426},{},[4427],{"type":52,"value":2670},{"type":46,"tag":2860,"props":4429,"children":4430},{},[4431,4436,4444,4453],{"type":46,"tag":2882,"props":4432,"children":4433},{},[4434],{"type":52,"value":4435},"C2",{"type":46,"tag":2882,"props":4437,"children":4438},{},[4439],{"type":46,"tag":66,"props":4440,"children":4442},{"className":4441},[],[4443],{"type":52,"value":2580},{"type":46,"tag":2882,"props":4445,"children":4446},{},[4447],{"type":46,"tag":66,"props":4448,"children":4450},{"className":4449},[],[4451],{"type":52,"value":4452},"$PHASE_DIR\u002Fingestion.json",{"type":46,"tag":2882,"props":4454,"children":4455},{},[4456],{"type":52,"value":2680},{"type":46,"tag":2860,"props":4458,"children":4459},{},[4460,4465,4473,4482],{"type":46,"tag":2882,"props":4461,"children":4462},{},[4463],{"type":52,"value":4464},"C3",{"type":46,"tag":2882,"props":4466,"children":4467},{},[4468],{"type":46,"tag":66,"props":4469,"children":4471},{"className":4470},[],[4472],{"type":52,"value":2587},{"type":46,"tag":2882,"props":4474,"children":4475},{},[4476],{"type":46,"tag":66,"props":4477,"children":4479},{"className":4478},[],[4480],{"type":52,"value":4481},"$PHASE_DIR\u002Feval.json",{"type":46,"tag":2882,"props":4483,"children":4484},{},[4485],{"type":52,"value":2689},{"type":46,"tag":55,"props":4487,"children":4488},{},[4489,4494,4496,4502],{"type":46,"tag":267,"props":4490,"children":4491},{},[4492],{"type":52,"value":4493},"Blocked flow",{"type":52,"value":4495}," (",{"type":46,"tag":66,"props":4497,"children":4499},{"className":4498},[],[4500],{"type":52,"value":4501},"CONTROL=blocked",{"type":52,"value":4503},"): resolve with the user per REASON —",{"type":46,"tag":75,"props":4505,"children":4506},{},[4507,4518,4536,4547],{"type":46,"tag":79,"props":4508,"children":4509},{},[4510,4516],{"type":46,"tag":66,"props":4511,"children":4513},{"className":4512},[],[4514],{"type":52,"value":4515},"model_access",{"type":52,"value":4517}," → user enables the model in the Bedrock console (nothing fingerprinted\nchanges; re-dispatch the blocked phase only)",{"type":46,"tag":79,"props":4519,"children":4520},{},[4521,4527,4529,4534],{"type":46,"tag":66,"props":4522,"children":4524},{"className":4523},[],[4525],{"type":52,"value":4526},"model_unresolvable",{"type":52,"value":4528}," → user picks\u002Fpastes an ID → record it in\n",{"type":46,"tag":66,"props":4530,"children":4532},{"className":4531},[],[4533],{"type":52,"value":3530},{"type":52,"value":4535},", fold it into the Target line",{"type":46,"tag":79,"props":4537,"children":4538},{},[4539,4545],{"type":46,"tag":66,"props":4540,"children":4542},{"className":4541},[],[4543],{"type":52,"value":4544},"source_key_auth",{"type":52,"value":4546}," → user supplies a new key (re-run B3) or sets baseline unavailable",{"type":46,"tag":79,"props":4548,"children":4549},{},[4550,4556],{"type":46,"tag":66,"props":4551,"children":4553},{"className":4552},[],[4554],{"type":52,"value":4555},"assess_output_missing",{"type":52,"value":4557}," → re-run Phase A, then restart Phase C at C0",{"type":46,"tag":55,"props":4559,"children":4560},{},[4561,4563,4568],{"type":52,"value":4562},"After ANY resolution, re-run the C0 recipe (rebuild current-context, apply the invalidation\ntable, overwrite run-context) and re-dispatch ",{"type":46,"tag":267,"props":4564,"children":4565},{},[4566],{"type":52,"value":4567},"from the earliest invalidated phase",{"type":52,"value":4569}," — the\ntable, not the block location, decides where execution resumes.",{"type":46,"tag":55,"props":4571,"children":4572},{},[4573,4578,4580,4586],{"type":46,"tag":267,"props":4574,"children":4575},{},[4576],{"type":52,"value":4577},"Partial flow",{"type":52,"value":4579}," (eval only, ",{"type":46,"tag":66,"props":4581,"children":4583},{"className":4582},[],[4584],{"type":52,"value":4585},"CONTROL=partial",{"type":52,"value":4587},"): AskUserQuestion —",{"type":46,"tag":75,"props":4589,"children":4590},{},[4591,4607,4625],{"type":46,"tag":79,"props":4592,"children":4593},{},[4594,4599,4601],{"type":46,"tag":267,"props":4595,"children":4596},{},[4597],{"type":52,"value":4598},"Continue remaining cases",{"type":52,"value":4600}," → re-dispatch the evaluator with the extra context line:\n",{"type":46,"tag":66,"props":4602,"children":4604},{"className":4603},[],[4605],{"type":52,"value":4606},"Resume: raw_results.jsonl already contains completed cases — evaluate only prompts whose ids are not present in it, then re-score and overwrite eval.json",{"type":46,"tag":79,"props":4608,"children":4609},{},[4610,4615,4617,4623],{"type":46,"tag":267,"props":4611,"children":4612},{},[4613],{"type":52,"value":4614},"Proceed with partial pass rate",{"type":52,"value":4616}," → re-dispatch the evaluator with: ",{"type":46,"tag":66,"props":4618,"children":4620},{"className":4619},[],[4621],{"type":52,"value":4622},"Finalize partial: do NOT call Bedrock again — score the cases already in raw_results.jsonl and emit the FULL eval payload over only those cases, with total_cases = the number scored and a notes prefix line 'partial_coverage: \u003Ccompleted>\u002F\u003Ctotal> cases (throttled)'",{"type":52,"value":4624},". Then C4 runs normally.",{"type":46,"tag":79,"props":4626,"children":4627},{},[4628,4633],{"type":46,"tag":267,"props":4629,"children":4630},{},[4631],{"type":52,"value":4632},"Abort",{"type":52,"value":4634}," → stop; the files stay on disk for a later C0 resume.",{"type":46,"tag":126,"props":4636,"children":4638},{"id":4637},"c4-sidebar-two-gates-persist-decisions",[4639],{"type":52,"value":4640},"C4 — Sidebar (two gates) + persist decisions",{"type":46,"tag":55,"props":4642,"children":4643},{},[4644,4649,4651,4656,4658,4669,4671,4677],{"type":46,"tag":267,"props":4645,"children":4646},{},[4647],{"type":52,"value":4648},"Gate (a) — Quality go\u002Fno-go.",{"type":52,"value":4650}," Read ",{"type":46,"tag":66,"props":4652,"children":4654},{"className":4653},[],[4655],{"type":52,"value":4481},{"type":52,"value":4657},". The threshold is\n",{"type":46,"tag":267,"props":4659,"children":4660},{},[4661,4663],{"type":52,"value":4662},"pass rate >= 0.9 AND ",{"type":46,"tag":66,"props":4664,"children":4666},{"className":4665},[],[4667],{"type":52,"value":4668},"source_baseline_quality != 'poor'",{"type":52,"value":4670}," (with ",{"type":46,"tag":66,"props":4672,"children":4674},{"className":4673},[],[4675],{"type":52,"value":4676},"no_golden_cases: true",{"type":52,"value":4678},"\nin the notes there is no quality signal — always ask). At or above → proceed silently.\nBelow, AskUserQuestion:",{"type":46,"tag":75,"props":4680,"children":4681},{},[4682,4692,4709],{"type":46,"tag":79,"props":4683,"children":4684},{},[4685,4690],{"type":46,"tag":267,"props":4686,"children":4687},{},[4688],{"type":52,"value":4689},"Proceed anyway",{"type":52,"value":4691}," → gate (b)",{"type":46,"tag":79,"props":4693,"children":4694},{},[4695,4700,4702,4707],{"type":46,"tag":267,"props":4696,"children":4697},{},[4698],{"type":52,"value":4699},"Change target model",{"type":52,"value":4701}," → record in ",{"type":46,"tag":66,"props":4703,"children":4705},{"className":4704},[],[4706],{"type":52,"value":3530},{"type":52,"value":4708},", re-run C0 (the table\ninvalidates ANALYSIS\u002FEVAL and execution resumes at C1). Cap: 2 retries.",{"type":46,"tag":79,"props":4710,"children":4711},{},[4712,4716],{"type":46,"tag":267,"props":4713,"children":4714},{},[4715],{"type":52,"value":4632},{"type":52,"value":4717}," → stop, no code touched.",{"type":46,"tag":55,"props":4719,"children":4720},{},[4721,4726,4727,4733,4735,4740,4741,4747,4749,4755,4757,4763,4765,4771,4772,4778,4780,4786],{"type":46,"tag":267,"props":4722,"children":4723},{},[4724],{"type":52,"value":4725},"Gate (a.5) — Rewrite strategy (from migration plan).",{"type":52,"value":4650},{"type":46,"tag":66,"props":4728,"children":4730},{"className":4729},[],[4731],{"type":52,"value":4732},"migration_path",{"type":52,"value":4734}," from\n",{"type":46,"tag":66,"props":4736,"children":4738},{"className":4737},[],[4739],{"type":52,"value":1143},{"type":52,"value":1244},{"type":46,"tag":66,"props":4742,"children":4744},{"className":4743},[],[4745],{"type":52,"value":4746},"ai_architecture.code_migration.migration_path",{"type":52,"value":4748},".\nIf the value is ",{"type":46,"tag":66,"props":4750,"children":4752},{"className":4751},[],[4753],{"type":52,"value":4754},"\"mantle\"",{"type":52,"value":4756},", set ",{"type":46,"tag":66,"props":4758,"children":4760},{"className":4759},[],[4761],{"type":52,"value":4762},"rewrite_strategy = \"mantle\"",{"type":52,"value":4764},". Otherwise (value is\n",{"type":46,"tag":66,"props":4766,"children":4768},{"className":4767},[],[4769],{"type":52,"value":4770},"\"converse\"",{"type":52,"value":2077},{"type":46,"tag":66,"props":4773,"children":4775},{"className":4774},[],[4776],{"type":52,"value":4777},"\"gpt-oss\"",{"type":52,"value":4779},", or the field is absent), set ",{"type":46,"tag":66,"props":4781,"children":4783},{"className":4782},[],[4784],{"type":52,"value":4785},"rewrite_strategy = \"converse\"",{"type":52,"value":4787},".\nNo user question needed — the decision was already made during the Assess\u002FDesign phase.",{"type":46,"tag":55,"props":4789,"children":4790},{},[4791,4796,4798,4804,4806,4812,4814,4820,4822,4828,4830,4835,4837,4843],{"type":46,"tag":267,"props":4792,"children":4793},{},[4794],{"type":52,"value":4795},"Gate (b) — Behavior-delta resolution.",{"type":52,"value":4797}," For each ",{"type":46,"tag":66,"props":4799,"children":4801},{"className":4800},[],[4802],{"type":52,"value":4803},"analysis.behavior_deltas[]",{"type":52,"value":4805}," with\n",{"type":46,"tag":66,"props":4807,"children":4809},{"className":4808},[],[4810],{"type":52,"value":4811},"user_visible == true",{"type":52,"value":4813},", AskUserQuestion with the options from the ",{"type":46,"tag":66,"props":4815,"children":4817},{"className":4816},[],[4818],{"type":52,"value":4819},"behavior-delta-detection",{"type":52,"value":4821},"\nreference (Read ",{"type":46,"tag":66,"props":4823,"children":4825},{"className":4824},[],[4826],{"type":52,"value":4827},"$HELPERS\u002Fbehavior-delta-detection\u002Fbehavior-delta-detection.md",{"type":52,"value":4829},", and the\n",{"type":46,"tag":66,"props":4831,"children":4833},{"className":4832},[],[4834],{"type":52,"value":3556},{"type":52,"value":4836}," sub-reference under its ",{"type":46,"tag":66,"props":4838,"children":4840},{"className":4839},[],[4841],{"type":52,"value":4842},"references\u002F",{"type":52,"value":4844}," dir).",{"type":46,"tag":55,"props":4846,"children":4847},{},[4848,4853,4855,4861,4863,4869,4871,4877,4879,4885],{"type":46,"tag":267,"props":4849,"children":4850},{},[4851],{"type":52,"value":4852},"Persist:",{"type":52,"value":4854}," write the decisions array (entries ",{"type":46,"tag":66,"props":4856,"children":4858},{"className":4857},[],[4859],{"type":52,"value":4860},"{delta_type, location, resolution_chosen, source}",{"type":52,"value":4862},"; ",{"type":46,"tag":66,"props":4864,"children":4866},{"className":4865},[],[4867],{"type":52,"value":4868},"[]",{"type":52,"value":4870}," when there were no user-visible deltas) to ",{"type":46,"tag":66,"props":4872,"children":4874},{"className":4873},[],[4875],{"type":52,"value":4876},"$PHASE_DIR\u002Fdelta-decisions.json",{"type":52,"value":4878},"\nand validate it (",{"type":46,"tag":66,"props":4880,"children":4882},{"className":4881},[],[4883],{"type":52,"value":4884},"--schema delta-decisions",{"type":52,"value":4886},"). The file must exist before C5 — it is what\nmakes a C5 retry or a post-crash resume self-sufficient.",{"type":46,"tag":126,"props":4888,"children":4890},{"id":4889},"c5-rewriter-c6-report",[4891],{"type":52,"value":4892},"C5 — Rewriter · C6 — Report",{"type":46,"tag":2852,"props":4894,"children":4895},{},[4896,4919],{"type":46,"tag":2856,"props":4897,"children":4898},{},[4899],{"type":46,"tag":2860,"props":4900,"children":4901},{},[4902,4906,4910,4915],{"type":46,"tag":2864,"props":4903,"children":4904},{},[4905],{"type":52,"value":4380},{"type":46,"tag":2864,"props":4907,"children":4908},{},[4909],{"type":52,"value":4385},{"type":46,"tag":2864,"props":4911,"children":4912},{},[4913],{"type":52,"value":4914},"Output",{"type":46,"tag":2864,"props":4916,"children":4917},{},[4918],{"type":52,"value":4395},{"type":46,"tag":2875,"props":4920,"children":4921},{},[4922,4950],{"type":46,"tag":2860,"props":4923,"children":4924},{},[4925,4930,4938,4946],{"type":46,"tag":2882,"props":4926,"children":4927},{},[4928],{"type":52,"value":4929},"C5",{"type":46,"tag":2882,"props":4931,"children":4932},{},[4933],{"type":46,"tag":66,"props":4934,"children":4936},{"className":4935},[],[4937],{"type":52,"value":2594},{"type":46,"tag":2882,"props":4939,"children":4940},{},[4941],{"type":46,"tag":66,"props":4942,"children":4944},{"className":4943},[],[4945],{"type":52,"value":3971},{"type":46,"tag":2882,"props":4947,"children":4948},{},[4949],{"type":52,"value":2698},{"type":46,"tag":2860,"props":4951,"children":4952},{},[4953,4958,4966,4976],{"type":46,"tag":2882,"props":4954,"children":4955},{},[4956],{"type":52,"value":4957},"C6",{"type":46,"tag":2882,"props":4959,"children":4960},{},[4961],{"type":46,"tag":66,"props":4962,"children":4964},{"className":4963},[],[4965],{"type":52,"value":2601},{"type":46,"tag":2882,"props":4967,"children":4968},{},[4969,4974],{"type":46,"tag":66,"props":4970,"children":4972},{"className":4971},[],[4973],{"type":52,"value":4148},{"type":52,"value":4975}," in repo root",{"type":46,"tag":2882,"props":4977,"children":4978},{},[4979],{"type":52,"value":4980},"(none — file existence is the completion check)",{"type":46,"tag":55,"props":4982,"children":4983},{},[4984,4986,4992,4994,5000],{"type":52,"value":4985},"C5's context block includes the ",{"type":46,"tag":66,"props":4987,"children":4989},{"className":4988},[],[4990],{"type":52,"value":4991},"Confirmed behavior-delta decisions file",{"type":52,"value":4993}," line and the\n",{"type":46,"tag":66,"props":4995,"children":4997},{"className":4996},[],[4998],{"type":52,"value":4999},"Report date suffix",{"type":52,"value":5001}," line (from run-context, NOT today's date on a resume). C6's context\nblock lists all four phase-result file paths.",{"type":46,"tag":55,"props":5003,"children":5004},{},[5005,5007,5013],{"type":52,"value":5006},"When ",{"type":46,"tag":66,"props":5008,"children":5010},{"className":5009},[],[5011],{"type":52,"value":5012},"rewrite_strategy == \"mantle\"",{"type":52,"value":5014},", C5's context block ALSO includes:",{"type":46,"tag":75,"props":5016,"children":5017},{},[5018,5029],{"type":46,"tag":79,"props":5019,"children":5020},{},[5021,5027],{"type":46,"tag":66,"props":5022,"children":5024},{"className":5023},[],[5025],{"type":52,"value":5026},"Rewrite strategy: mantle",{"type":52,"value":5028}," (omit this line entirely for Converse — its absence is the\nsignal for the default Converse path)",{"type":46,"tag":79,"props":5030,"children":5031},{},[5032,5038,5040,5045,5047,5052,5053,5058],{"type":46,"tag":66,"props":5033,"children":5035},{"className":5034},[],[5036],{"type":52,"value":5037},"Mantle model map: \u003Csource-model> -> \u003Cbedrock-model-id>",{"type":52,"value":5039}," — sourced from the plan's\n",{"type":46,"tag":66,"props":5041,"children":5043},{"className":5042},[],[5044],{"type":52,"value":1157},{"type":52,"value":5046}," entries (each ",{"type":46,"tag":66,"props":5048,"children":5050},{"className":5049},[],[5051],{"type":52,"value":3426},{"type":52,"value":1244},{"type":46,"tag":66,"props":5054,"children":5056},{"className":5055},[],[5057],{"type":52,"value":1176},{"type":52,"value":5059}," pair).",{"type":46,"tag":126,"props":5061,"children":5063},{"id":5062},"c7-render-summary",[5064],{"type":52,"value":5065},"C7 — Render summary",{"type":46,"tag":141,"props":5067,"children":5069},{"className":143,"code":5068,"language":145,"meta":146,"style":146},"uv run --project $SCRIPTS python $SCRIPTS\u002Frender_report.py --phase-results $PHASE_DIR --repo $REPO --date-suffix \u003Csaved suffix>\n",[5070],{"type":46,"tag":66,"props":5071,"children":5072},{"__ignoreMap":146},[5073],{"type":46,"tag":152,"props":5074,"children":5075},{"class":154,"line":155},[5076,5080,5084,5088,5092,5096,5100,5105,5110,5115,5120,5125,5130,5134,5139,5144,5149],{"type":46,"tag":152,"props":5077,"children":5078},{"style":159},[5079],{"type":52,"value":137},{"type":46,"tag":152,"props":5081,"children":5082},{"style":164},[5083],{"type":52,"value":2247},{"type":46,"tag":152,"props":5085,"children":5086},{"style":164},[5087],{"type":52,"value":2252},{"type":46,"tag":152,"props":5089,"children":5090},{"style":546},[5091],{"type":52,"value":2257},{"type":46,"tag":152,"props":5093,"children":5094},{"style":164},[5095],{"type":52,"value":2262},{"type":46,"tag":152,"props":5097,"children":5098},{"style":546},[5099],{"type":52,"value":2267},{"type":46,"tag":152,"props":5101,"children":5102},{"style":164},[5103],{"type":52,"value":5104},"\u002Frender_report.py",{"type":46,"tag":152,"props":5106,"children":5107},{"style":164},[5108],{"type":52,"value":5109}," --phase-results",{"type":46,"tag":152,"props":5111,"children":5112},{"style":546},[5113],{"type":52,"value":5114}," $PHASE_DIR ",{"type":46,"tag":152,"props":5116,"children":5117},{"style":164},[5118],{"type":52,"value":5119},"--repo",{"type":46,"tag":152,"props":5121,"children":5122},{"style":546},[5123],{"type":52,"value":5124}," $REPO ",{"type":46,"tag":152,"props":5126,"children":5127},{"style":164},[5128],{"type":52,"value":5129},"--date-suffix",{"type":46,"tag":152,"props":5131,"children":5132},{"style":170},[5133],{"type":52,"value":414},{"type":46,"tag":152,"props":5135,"children":5136},{"style":164},[5137],{"type":52,"value":5138},"saved",{"type":46,"tag":152,"props":5140,"children":5141},{"style":164},[5142],{"type":52,"value":5143}," suffi",{"type":46,"tag":152,"props":5145,"children":5146},{"style":546},[5147],{"type":52,"value":5148},"x",{"type":46,"tag":152,"props":5150,"children":5151},{"style":170},[5152],{"type":52,"value":2731},{"type":46,"tag":55,"props":5154,"children":5155},{},[5156,5158,5164,5166,5172,5174,5180,5182,5187,5189,5194],{"type":52,"value":5157},"Print the summary. Point the user at ",{"type":46,"tag":66,"props":5159,"children":5161},{"className":5160},[],[5162],{"type":52,"value":5163},"rewrite.branch_name",{"type":52,"value":5165}," (usually ",{"type":46,"tag":66,"props":5167,"children":5169},{"className":5168},[],[5170],{"type":52,"value":5171},"bedrock-migration",{"type":52,"value":5173},", but\na collision-suffixed variant like ",{"type":46,"tag":66,"props":5175,"children":5177},{"className":5176},[],[5178],{"type":52,"value":5179},"bedrock-migration-2",{"type":52,"value":5181}," when they already had that branch)\nand the report file. Tell them how to undo — substitute the ACTUAL branch name from\n",{"type":46,"tag":66,"props":5183,"children":5185},{"className":5184},[],[5186],{"type":52,"value":5163},{"type":52,"value":5188},", never a hardcoded one (on a collision run, ",{"type":46,"tag":66,"props":5190,"children":5192},{"className":5191},[],[5193],{"type":52,"value":5171},{"type":52,"value":5195}," is the\nuser's own pre-existing branch and deleting it would destroy their work):",{"type":46,"tag":637,"props":5197,"children":5198},{},[5199],{"type":46,"tag":55,"props":5200,"children":5201},{},[5202,5204,5210,5211,5217,5218,5224,5226,5232],{"type":52,"value":5203},"To discard: ",{"type":46,"tag":66,"props":5205,"children":5207},{"className":5206},[],[5208],{"type":52,"value":5209},"git checkout \u003Cyour original branch>",{"type":52,"value":2077},{"type":46,"tag":66,"props":5212,"children":5214},{"className":5213},[],[5215],{"type":52,"value":5216},"git branch -D \u003Crewrite.branch_name>",{"type":52,"value":1896},{"type":46,"tag":66,"props":5219,"children":5221},{"className":5220},[],[5222],{"type":52,"value":5223},"git tag -d saws-migrate-baseline",{"type":52,"value":5225},", and ",{"type":46,"tag":66,"props":5227,"children":5229},{"className":5228},[],[5230],{"type":52,"value":5231},"rm -rf .saws-migrate .migration",{"type":52,"value":5233}," removes all\nmigration artifacts (including the API key file).",{"type":46,"tag":115,"props":5235,"children":5236},{},[],{"type":46,"tag":119,"props":5238,"children":5240},{"id":5239},"inline-mode-platforms-without-an-agentsubagent-dispatch-tool",[5241],{"type":52,"value":5242},"Inline mode (platforms without an Agent\u002Fsubagent dispatch tool)",{"type":46,"tag":55,"props":5244,"children":5245},{},[5246],{"type":52,"value":5247},"If this platform has no subagent dispatch tool, run phases inline ONE AT A TIME, with a\nmandatory stop between phases:",{"type":46,"tag":303,"props":5249,"children":5250},{},[5251,5270,5275],{"type":46,"tag":79,"props":5252,"children":5253},{},[5254,5260,5262,5268],{"type":46,"tag":66,"props":5255,"children":5257},{"className":5256},[],[5258],{"type":52,"value":5259},"Read",{"type":52,"value":5261}," exactly ONE agent definition (",{"type":46,"tag":66,"props":5263,"children":5265},{"className":5264},[],[5266],{"type":52,"value":5267},"\u003Cplugin>\u002Fagents\u002F\u003Cname>.md",{"type":52,"value":5269},") — never load more than\none phase's definition into context at once.",{"type":46,"tag":79,"props":5271,"children":5272},{},[5273],{"type":52,"value":5274},"Follow it start-to-finish; write and validate the same phase-result file.",{"type":46,"tag":79,"props":5276,"children":5277},{},[5278],{"type":52,"value":5279},"STOP. Report the phase outcome (validator CONTROL line + one-line summary) and ask the\nuser to confirm before loading the next phase's definition. This sidebar is mandatory:\nit is the context-pressure release valve, and the phase-result file means nothing is lost\nif the user continues in a fresh session instead.",{"type":46,"tag":55,"props":5281,"children":5282},{},[5283],{"type":52,"value":5284},"Warn the user up front that inline mode is slower and context-heavier than subagent dispatch,\nand that the rewriter phase performs git operations (branch, commits, worktree) directly in\nthis session.",{"type":46,"tag":115,"props":5286,"children":5287},{},[],{"type":46,"tag":119,"props":5289,"children":5291},{"id":5290},"failure-handling",[5292],{"type":52,"value":5293},"Failure handling",{"type":46,"tag":75,"props":5295,"children":5296},{},[5297,5302,5321],{"type":46,"tag":79,"props":5298,"children":5299},{},[5300],{"type":52,"value":5301},"An agent dispatch dies (tool error, terminal failure) → the phase file is missing →\nvalidator exit 2 → the stateless fixer-retry path (which, finding no file to fix, re-runs\nthe phase). Do not auto-retry more than the 2-retry cap.",{"type":46,"tag":79,"props":5303,"children":5304},{},[5305,5307,5312,5314,5319],{"type":52,"value":5306},"User aborts at any gate → confirm no SOURCE CODE was modified (C5 never started if aborted\nbefore then). Note that ",{"type":46,"tag":66,"props":5308,"children":5310},{"className":5309},[],[5311],{"type":52,"value":739},{"type":52,"value":5313}," and ",{"type":46,"tag":66,"props":5315,"children":5317},{"className":5316},[],[5318],{"type":52,"value":2195},{"type":52,"value":5320}," artifacts do exist; show the\nundo commands from C7 if the user wants them gone.",{"type":46,"tag":79,"props":5322,"children":5323},{},[5324,5326,5332],{"type":52,"value":5325},"Assess skill fails → show the error and stop. User can re-run ",{"type":46,"tag":66,"props":5327,"children":5329},{"className":5328},[],[5330],{"type":52,"value":5331},"\u002Faws-startup-advisor:llm-to-bedrock",{"type":52,"value":293},{"type":46,"tag":5334,"props":5335,"children":5336},"style",{},[5337],{"type":52,"value":5338},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":5340,"total":5516},[5341,5360,5381,5391,5402,5415,5425,5435,5456,5471,5486,5501],{"slug":5342,"name":5342,"fn":5343,"description":5344,"org":5345,"tags":5346,"stars":5357,"repoUrl":5358,"updatedAt":5359},"agentcore-investigation","investigate Bedrock AgentCore runtime sessions","Investigate Bedrock AgentCore runtime sessions via CloudWatch Logs Insights — resolve session\u002Ftrace IDs, query OTEL spans, filter noise, build timelines. Use when debugging AgentCore agent sessions, tracing tool calls, or analyzing latency.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5347,5348,5351,5354],{"name":27,"slug":28,"type":16},{"name":5349,"slug":5350,"type":16},"Debugging","debugging",{"name":5352,"slug":5353,"type":16},"Logs","logs",{"name":5355,"slug":5356,"type":16},"Observability","observability",9427,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fmcp","2026-07-12T08:37:22.601527",{"slug":5361,"name":5362,"fn":5363,"description":5364,"org":5365,"tags":5366,"stars":5357,"repoUrl":5358,"updatedAt":5380},"amazon-aurora-dsql","amazon aurora dsql","build applications with Aurora DSQL","Build with Aurora DSQL — manage schemas, execute queries, handle migrations, diagnose query plans, load data, and develop applications with a serverless, distributed SQL database. Covers IAM auth, multi-tenant patterns, MySQL-to-DSQL and PostgreSQL-to-DSQL schema conversion, FK replacement code generation, OCC retry patterns, ORM migration (Django\u002FHibernate\u002FRails), DDL operations, query plan explainability, SQL compatibility validation, and bulk data loading. Triggers on phrases like: DSQL, Aurora DSQL, create DSQL table, DSQL schema, migrate to DSQL, distributed SQL database, serverless PostgreSQL-compatible database, DSQL query plan, DSQL EXPLAIN ANALYZE, why is my DSQL query slow, DSQL foreign key, DSQL OCC retry, DSQL multi-region, load into DSQL, load CSV into DSQL, bulk load DSQL, aurora-dsql-loader.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5367,5370,5371,5374,5377],{"name":5368,"slug":5369,"type":16},"Aurora","aurora",{"name":27,"slug":28,"type":16},{"name":5372,"slug":5373,"type":16},"Database","database",{"name":5375,"slug":5376,"type":16},"Serverless","serverless",{"name":5378,"slug":5379,"type":16},"SQL","sql","2026-08-04T05:35:10.770847",{"slug":5382,"name":5383,"fn":5363,"description":5364,"org":5384,"tags":5385,"stars":5357,"repoUrl":5358,"updatedAt":5390},"aurora-dsql","aurora dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5386,5387,5388,5389],{"name":27,"slug":28,"type":16},{"name":5372,"slug":5373,"type":16},{"name":5375,"slug":5376,"type":16},{"name":5378,"slug":5379,"type":16},"2026-08-04T05:35:05.694395",{"slug":5392,"name":5393,"fn":5363,"description":5364,"org":5394,"tags":5395,"stars":5357,"repoUrl":5358,"updatedAt":5401},"aws-dsql","aws dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5396,5397,5398,5399,5400],{"name":27,"slug":28,"type":16},{"name":5372,"slug":5373,"type":16},{"name":18,"slug":19,"type":16},{"name":5375,"slug":5376,"type":16},{"name":5378,"slug":5379,"type":16},"2026-08-04T05:35:08.749669",{"slug":5403,"name":5404,"fn":5363,"description":5364,"org":5405,"tags":5406,"stars":5357,"repoUrl":5358,"updatedAt":5414},"distributed-postgres","distributed postgres",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5407,5408,5409,5412,5413],{"name":27,"slug":28,"type":16},{"name":5372,"slug":5373,"type":16},{"name":5410,"slug":5411,"type":16},"PostgreSQL","postgresql",{"name":5375,"slug":5376,"type":16},{"name":5378,"slug":5379,"type":16},"2026-08-04T05:35:06.713102",{"slug":5416,"name":5417,"fn":5363,"description":5364,"org":5418,"tags":5419,"stars":5357,"repoUrl":5358,"updatedAt":5424},"distributed-sql","distributed sql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5420,5421,5422,5423],{"name":27,"slug":28,"type":16},{"name":5372,"slug":5373,"type":16},{"name":5375,"slug":5376,"type":16},{"name":5378,"slug":5379,"type":16},"2026-08-04T05:35:10.086942",{"slug":5426,"name":5426,"fn":5363,"description":5364,"org":5427,"tags":5428,"stars":5357,"repoUrl":5358,"updatedAt":5434},"dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5429,5430,5431,5432,5433],{"name":27,"slug":28,"type":16},{"name":5372,"slug":5373,"type":16},{"name":18,"slug":19,"type":16},{"name":5375,"slug":5376,"type":16},{"name":5378,"slug":5379,"type":16},"2026-08-04T05:35:07.751779",{"slug":5436,"name":5436,"fn":5437,"description":5438,"org":5439,"tags":5440,"stars":5453,"repoUrl":5454,"updatedAt":5455},"cost-efficiency-analyzer","analyze cost efficiency and expenses","Analyzes cost structure, cost efficiency, and expense management from P&L data. Use when the user asks about costs, expenses, COGS, operating expenses, cost ratios, cost control, spending efficiency, margin compression from cost side, or wants to understand where money is going. Also use for \"are we spending too much\", \"cost breakdown\", \"expense analysis\", or \"how efficient are our operations\". NOT for revenue or top-line analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5441,5444,5447,5450],{"name":5442,"slug":5443,"type":16},"Accounting","accounting",{"name":5445,"slug":5446,"type":16},"Analytics","analytics",{"name":5448,"slug":5449,"type":16},"Cost Optimization","cost-optimization",{"name":5451,"slug":5452,"type":16},"Finance","finance",3176,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fagentcore-samples","2026-07-12T08:40:03.29555",{"slug":5457,"name":5457,"fn":5458,"description":5459,"org":5460,"tags":5461,"stars":5453,"repoUrl":5454,"updatedAt":5470},"executive-financial-briefing","generate executive financial briefings","Generates a concise executive-level financial briefing or summary suitable for a CEO, CFO, or board presentation. Use when the user asks for a summary, briefing, executive summary, board update, financial overview, financial health check, or \"how is the business doing\". Covers the full P&L picture in one page. Also use for \"give me the highlights\", \"what do I need to know\", or \"quick financial update\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5462,5463,5464,5467],{"name":27,"slug":28,"type":16},{"name":5451,"slug":5452,"type":16},{"name":5465,"slug":5466,"type":16},"Management","management",{"name":5468,"slug":5469,"type":16},"Reporting","reporting","2026-07-12T08:40:02.066471",{"slug":5472,"name":5472,"fn":5473,"description":5474,"org":5475,"tags":5476,"stars":5453,"repoUrl":5454,"updatedAt":5485},"multi-quarter-trend-analysis","analyze multi-quarter financial trends","Analyzes financial trends across multiple quarters by comparing P&L metrics over time. Use when the user wants to see trends, patterns, trajectories, or directional movement across 3 or more quarters. Also use for \"how are we trending\", \"show me the trend\", \"track performance over time\", \"quarter over quarter comparison across all quarters\", or any multi-period longitudinal analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5477,5478,5479,5482],{"name":5445,"slug":5446,"type":16},{"name":5451,"slug":5452,"type":16},{"name":5480,"slug":5481,"type":16},"Financial Statements","financial-statements",{"name":5483,"slug":5484,"type":16},"Variance Analysis","variance-analysis","2026-07-12T08:40:00.79141",{"slug":5487,"name":5487,"fn":5488,"description":5489,"org":5490,"tags":5491,"stars":5453,"repoUrl":5454,"updatedAt":5500},"pdf","process and manipulate PDF documents","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5492,5495,5498],{"name":5493,"slug":5494,"type":16},"Automation","automation",{"name":5496,"slug":5497,"type":16},"Documents","documents",{"name":5499,"slug":5487,"type":16},"PDF","2026-07-12T08:41:44.135656",{"slug":5502,"name":5502,"fn":5503,"description":5504,"org":5505,"tags":5506,"stars":5453,"repoUrl":5454,"updatedAt":5515},"quarterly-kpi-calculator","calculate quarterly financial KPIs","Calculates quarterly financial KPIs from P&L data. P&L figures can be provided directly by the user or fetched from the financial data MCP server. Use when the user wants KPI calculations such as Gross Margin %, EBITDA Margin %, Operating Expense Ratio, or Revenue Growth % QoQ. Also use for quarterly performance review, P&L analysis, or interpreting financial ratios against benchmarks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5507,5508,5511,5512],{"name":5442,"slug":5443,"type":16},{"name":5509,"slug":5510,"type":16},"Data Analysis","data-analysis",{"name":5451,"slug":5452,"type":16},{"name":5513,"slug":5514,"type":16},"KPI","kpi","2026-07-12T08:39:59.54971",125,{"items":5518,"total":3309},[5519,5536,5550,5564,5577,5594,5602],{"slug":5520,"name":5520,"fn":5521,"description":5522,"org":5523,"tags":5524,"stars":29,"repoUrl":30,"updatedAt":5535},"agent-advisor","plan and build AWS AI agents","Unified entry point for AI-agent work on AWS: evaluate and pick a runtime, generate a full migration plan (for existing workloads), and build an executable POC — all in one flow. Triggers on: which runtime for my agent, AgentCore vs ECS vs EKS vs Lambda, AgentCore vs Lambda MicroVMs, deploy an AI agent on AWS, agent architecture on AWS, I have an agent idea what do I build, move my agents to AWS, migrate my agents to AWS with a plan, agent migration plan, add AgentCore services, add memory\u002Fgateway\u002Fidentity\u002Fpolicy to my agent, enable AgentCore Memory, add observability to my agent, I'm already on AWS and want to add agent capabilities, migrate Temporal workers to AWS, Temporal to AWS, run Temporal on AWS, Temporal workers on AWS, we use Temporal and want to move to AWS, our service is orchestrated by Temporal, what do I build on AWS for my Temporal workers, move a Temporal-based service to AWS, Temporal Cloud or self-hosted on AWS. Runs a phased flow: Intake (entry point + technical background), Discover (lightweight code detection), Clarify (adaptive questions), deterministic scoring, Design (runtime + deployment model + services + model), Estimate (coarse cost), Generate (layered recommendation doc + scaffolding), then optional gated stages: Migration Plan (full plan generated in-skill by reusing this plugin's gcp-to-aws engine, with the advisor's decisions carried over) and POC (deployment plan + deployable proof-of-concept on the recommended runtime — AgentCore, ECS, EKS, or Lambda; generated deliverables by default, or assisted build in your account on explicit opt-in). Systems with several workloads (interacting or independent agents, batch jobs, services) are decomposed into workload units, each getting its own verdict with a consolidation option. An add-capabilities branch (for teams already running agents on AWS) recommends which AgentCore services to enable on any runtime — no runtime scoring. Temporal systems dissolve into the same unit flow — worker polling tiers and Activity execution classes become units (rules in the Temporal decision reference); Workflow orchestration code is never rewritten — never a Step Functions translation. Requires at least one agentic component: a purely non-agent system (only plain services \u002F batch jobs \u002F HTTP endpoints, or a Temporal worker whose Activities are all non-agent) is out of scope — Clarify halts it (scope gate) and points to gcp-to-aws \u002F heroku-to-aws \u002F llm-to-bedrock. Not for: pure compute\u002Fdata migration with no AI agent; pure LLM SDK rewrite without agent architecture (use llm-to-bedrock); or detailed per-model pricing.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5525,5528,5531,5532],{"name":5526,"slug":5527,"type":16},"Agents","agents",{"name":5529,"slug":5530,"type":16},"AI Infrastructure","ai-infrastructure",{"name":27,"slug":28,"type":16},{"name":5533,"slug":5534,"type":16},"Engineering","engineering","2026-08-14T04:51:57.95352",{"slug":5537,"name":5537,"fn":5538,"description":5539,"org":5540,"tags":5541,"stars":29,"repoUrl":30,"updatedAt":5549},"architect-for-startups","advise on AWS architecture for startups","Startup-tailored AWS architecture advice that adjusts recommendations to the company's stage (pre-revenue through Series B+), team size, runway, and available credits. Use when a founder wants guidance or a recommendation rather than code changes: which services to choose, how to plan or review an architecture, how to stretch credits and control cost, or how to prepare architecture for a fundraise or technical diligence. For an interactive discovery flow that scaffolds and writes the architecture into the codebase, use start-building-for-startups. Do not use for: writing or scaffolding code, factual AWS Activate \u002F programs \u002F credits lookups (see knowledge-base-for-startups), a single copy-paste prompt (see prompt-library-for-startups), or migration intent such as GCP-to-AWS or Heroku-to-AWS (see the migration skills: `gcp-to-aws`, `heroku-to-aws`, `llm-to-bedrock`).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5542,5545,5546],{"name":5543,"slug":5544,"type":16},"Architecture","architecture",{"name":27,"slug":28,"type":16},{"name":5547,"slug":5548,"type":16},"Strategy","strategy","2026-08-14T04:27:18.122372",{"slug":650,"name":650,"fn":5551,"description":5552,"org":5553,"tags":5554,"stars":29,"repoUrl":30,"updatedAt":5563},"migrate workloads from GCP to AWS","Migrate workloads from Google Cloud Platform to AWS — including AI and agentic workloads regardless of cloud provider. Triggers on: migrate from GCP, GCP to AWS, move off Google Cloud, migrate Terraform to AWS, migrate Cloud SQL to RDS, migrate GKE to EKS, migrate Cloud Run to Fargate, Google Cloud migration, migrate from OpenAI to Bedrock, move off OpenAI, switch from ChatGPT API to AWS, migrate from Gemini to Bedrock, migrate LangChain to Bedrock, migrate LangGraph to AWS, migrate agentic workloads to AWS, move AI workloads to AWS, migrate my AI app to AWS. Runs a 6-phase process: discover GCP resources from Terraform files, app code, or billing exports, clarify migration requirements, design AWS architecture, estimate costs, generate migration artifacts, and collect optional feedback. Clarify must finish before Design, Estimate, or Generate. Includes AI provider migration guidance (for example, OpenAI to Amazon Bedrock) by selecting closest-fit Bedrock model families for required modality, latency\u002Fquality targets, context windows, and cost constraints. Model mapping is compatibility-guided, not 1:1 parity; validate prompts, tool-calling behavior, and eval metrics before cutover. Do not use for: Azure or on-premises migrations to AWS, AWS-to-GCP reverse migration, general AWS architecture advice without migration intent, GCP-to-GCP refactoring, or multi-cloud deployments that do not involve migrating off GCP.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5555,5556,5559,5562],{"name":27,"slug":28,"type":16},{"name":5557,"slug":5558,"type":16},"Google Cloud","google-cloud",{"name":5560,"slug":5561,"type":16},"Infrastructure","infrastructure",{"name":18,"slug":19,"type":16},"2026-08-14T04:52:07.358543",{"slug":5565,"name":5565,"fn":5566,"description":5567,"org":5568,"tags":5569,"stars":29,"repoUrl":30,"updatedAt":5576},"heroku-to-aws","migrate workloads from Heroku to AWS","Migrate workloads from Heroku to AWS. Triggers on: migrate from Heroku, Heroku to AWS, move off Heroku, migrate Heroku app, migrate Heroku Postgres to RDS, migrate Heroku Redis to ElastiCache, migrate Heroku Kafka to MSK, migrate dynos to Elastic Beanstalk, migrate dynos to Fargate, Heroku migration, move from Heroku to AWS, migrate Heroku Private Space, Heroku to Elastic Beanstalk, Heroku to ECS, Heroku to Fargate, leave Heroku, migrate off Heroku platform, what-if workshop, reprice Heroku migration, compare migration scenarios, workshop mode. Runs a 6-phase process: discover Heroku resources live via the authenticated Heroku CLI (read-only, consent-gated) and\u002For from Terraform files, Procfile\u002Fapp.json, and optional billing exports, clarify migration requirements, design AWS architecture, estimate costs, generate migration artifacts, and collect optional feedback. After Estimate, an optional what-if workshop can reprice region\u002FHA\u002Fcompute\u002FGraviton scenarios without re-discovery. Clarify must finish before Design, Estimate, or Generate. Uses a flat resource model (no clustering or dependency graphs) with deterministic mapping tables for core services (Dynos → Elastic Beanstalk by default, Postgres → RDS\u002FAurora, Redis → ElastiCache, Kafka → MSK) and a fast-path table for 13+ common add-ons. Cedar\u002FFir generation detection is detect-only in v1. Pipeline\u002FReview Apps are detect-only. Do not use for: GCP or Azure migrations to AWS, AWS-to-Heroku reverse migration, general AWS architecture advice without migration intent, Heroku-to-Heroku refactoring, or multi-cloud deployments that do not involve migrating off Heroku.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5570,5571,5574,5575],{"name":27,"slug":28,"type":16},{"name":5572,"slug":5573,"type":16},"Heroku","heroku",{"name":5560,"slug":5561,"type":16},{"name":18,"slug":19,"type":16},"2026-08-14T04:52:09.216805",{"slug":5578,"name":5578,"fn":5579,"description":5580,"org":5581,"tags":5582,"stars":29,"repoUrl":30,"updatedAt":5593},"knowledge-base-for-startups","retrieve AWS startup reference content","AWS Startups reference content — Activate FAQ, credits guide, programs, partner offers, sample architectures, and hundreds of learn articles spanning generative AI, cloud architecture, cost optimization, security, fundraising, go-to-market, and real-world startup case studies. Use when the user asks factual questions about AWS Activate (eligibility, credits, programs, providers), wants a sample architecture or solution guide, or needs an AWS-curated learn article on a specific startup topic. For copy-paste AI prompts (RAG chatbot, MVP scaffold, security baseline, GPU quota, etc.), see the prompt-library-for-startups skill. Do not use for: account-specific lookups (credits balance, Activate membership status, application status), real-time event listings beyond the events stub, or content not present in the bundled `references\u002F` tree.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5583,5584,5587,5590],{"name":27,"slug":28,"type":16},{"name":5585,"slug":5586,"type":16},"Cloud","cloud",{"name":5588,"slug":5589,"type":16},"Documentation","documentation",{"name":5591,"slug":5592,"type":16},"Research","research","2026-07-25T05:32:19.312255",{"slug":4,"name":4,"fn":5,"description":6,"org":5595,"tags":5596,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5597,5598,5599,5600,5601],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"slug":5603,"name":5603,"fn":5604,"description":5605,"org":5606,"tags":5607,"stars":29,"repoUrl":30,"updatedAt":5614},"prompt-library-for-startups","provide AI coding prompts for startups","AWS-curated copy-paste prompts for AI coding agents (MVP scaffolding, RAG chatbot with Claude on Bedrock, security baseline evaluation, cost anomaly detection, GPU quota requests, EKS deployment, Well-Architected review, etc.) plus downloadable installable agents (Multi-Account Transition Advisor, Bill Shock Preventer, Service Quota Agent, Bedrock Model Availability Agent, AWS DB Advisor). Use when the user asks for a prompt to do X on AWS, wants an installable agent for multi-account \u002F cost monitoring \u002F quota management \u002F Bedrock model availability \u002F database selection, or asks how to use AWS prompts. For migration intent (GCP to AWS, OpenAI\u002FGemini to Bedrock), route to the migration skills in this plugin (`gcp-to-aws`, `heroku-to-aws`, `llm-to-bedrock`). Do not use for: factual AWS Activate \u002F programs \u002F credits questions, learn articles, sample architectures, or for prompts that are not in the bundled `references\u002Fprompt-library\u002F` tree.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[5608,5609,5612,5613],{"name":27,"slug":28,"type":16},{"name":5610,"slug":5611,"type":16},"Coding","coding",{"name":5533,"slug":5534,"type":16},{"name":14,"slug":15,"type":16},"2026-08-14T04:27:16.118669"]