@delete101020/aidlc 4.0.22 → 4.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -192,7 +192,7 @@ description of each.
192
192
 
193
193
  ```
194
194
  aidlc agent add --id <id> --name <n> --skill <skillId>
195
- [--model claude-sonnet-4-5]
195
+ [--model sonnet]
196
196
  [--capabilities files,github,jira]
197
197
  [--description "…"]
198
198
  [--runner default|codex|custom] [--runner-path .aidlc/runners/foo.js]
@@ -227,8 +227,20 @@ providers:
227
227
  ```
228
228
 
229
229
  `model_aliases` translates a `model:` value for one runner. Without it, a Claude
230
- tier alias (`opus` / `sonnet` / `haiku`) resolves to no `--model` at all and the
231
- provider CLI applies its own default. AIDLC ships **no** built-in tier map: saying
230
+ tier alias (`opus` / `sonnet` / `haiku`) resolves to no `--model` at all on a
231
+ provider runner, and the provider CLI applies its own default.
232
+
233
+ The `default` runner passes the agent's `model:` to Claude Code as `--model`, so
234
+ each step runs on the model its agent asks for rather than your session's
235
+ default. Tier aliases go through as-is and follow the current generation; to pin
236
+ one, declare it under `providers.default.model_aliases`:
237
+
238
+ ```yaml
239
+ providers:
240
+ default:
241
+ model_aliases:
242
+ opus: claude-opus-5-5
243
+ ``` AIDLC ships **no** built-in tier map: saying
232
244
  `sonnet` equals some other vendor's model is a claim about your work that only you
233
245
  can make, and a guessed model id fails the run outright.
234
246
 
package/dist/bundle.js CHANGED
@@ -19765,6 +19765,8 @@ var require_WorkspaceSchema = __commonJS({
19765
19765
  Object.defineProperty(exports2, "__esModule", { value: true });
19766
19766
  exports2.WorkspaceValidationError = exports2.WorkspaceSchema = void 0;
19767
19767
  exports2.normalizeStep = normalizeStep4;
19768
+ exports2.stepSkillAlternatives = stepSkillAlternatives;
19769
+ exports2.resolveStepSkills = resolveStepSkills;
19768
19770
  exports2.producesEntries = producesEntries;
19769
19771
  exports2.stepAgentId = stepAgentId3;
19770
19772
  exports2.stepDagId = stepDagId;
@@ -19891,6 +19893,18 @@ var require_WorkspaceSchema = __commonJS({
19891
19893
  * string); the normalizer coerces it into a single-entry array.
19892
19894
  */
19893
19895
  skills: zod_1.z.array(zod_1.z.string().min(1)).optional(),
19896
+ /**
19897
+ * Turns `skills` from "all of these" into "one of these": the person
19898
+ * picks which skill runs before launching the step, and this one is
19899
+ * preselected — and is what the unattended runner uses when nobody
19900
+ * picked. For interchangeable implementations of one step (two review
19901
+ * skills that differ only in the tool they drive), where loading both
19902
+ * would have the model run both procedures, or blend them.
19903
+ *
19904
+ * Must be one of `skills`. Omitted = every listed skill is available at
19905
+ * once, as before.
19906
+ */
19907
+ default_skill: zod_1.z.string().min(1).optional(),
19894
19908
  /** Artifact paths required from upstream. Gate-checked before work AND on Mark step done. */
19895
19909
  requires: zod_1.z.array(zod_1.z.string().min(1)).default([]),
19896
19910
  /**
@@ -19938,6 +19952,9 @@ var require_WorkspaceSchema = __commonJS({
19938
19952
  /** Open a PR after pushing (only valid when push=true). */
19939
19953
  open_pr: zod_1.z.boolean().default(true)
19940
19954
  }).optional()
19955
+ }).refine((s) => !s.default_skill || (s.skills ?? []).includes(s.default_skill), {
19956
+ message: "`default_skill` must be one of the step's `skills`.",
19957
+ path: ["default_skill"]
19941
19958
  }).refine((s) => !s.auto_review || !!s.auto_review_runner, {
19942
19959
  message: "Step with `auto_review: true` must set `auto_review_runner` (path to a JS/TS validator module).",
19943
19960
  path: ["auto_review_runner"]
@@ -20042,6 +20059,7 @@ var require_WorkspaceSchema = __commonJS({
20042
20059
  name: typeof obj.name === "string" ? obj.name : void 0,
20043
20060
  ...typeof obj.description === "string" && obj.description.trim() ? { description: obj.description.trim() } : {},
20044
20061
  skills,
20062
+ ...typeof obj.default_skill === "string" && skills?.includes(obj.default_skill) ? { default_skill: obj.default_skill } : {},
20045
20063
  enabled: typeof obj.enabled === "boolean" ? obj.enabled : true,
20046
20064
  optional: obj.optional === true,
20047
20065
  produces,
@@ -20056,6 +20074,19 @@ var require_WorkspaceSchema = __commonJS({
20056
20074
  ...git && { git }
20057
20075
  };
20058
20076
  }
20077
+ function stepSkillAlternatives(norm) {
20078
+ if (!norm.default_skill || !norm.skills?.includes(norm.default_skill)) {
20079
+ return void 0;
20080
+ }
20081
+ return { options: norm.skills, defaultSkill: norm.default_skill };
20082
+ }
20083
+ function resolveStepSkills(norm, agentSkills, chosen) {
20084
+ const alt = stepSkillAlternatives(norm);
20085
+ if (alt) {
20086
+ return [chosen && alt.options.includes(chosen) ? chosen : alt.defaultSkill];
20087
+ }
20088
+ return norm.skills && norm.skills.length > 0 ? [...norm.skills] : [...agentSkills];
20089
+ }
20059
20090
  function producesEntries(norm) {
20060
20091
  const optional = new Set(norm.produces_optional);
20061
20092
  return norm.produces.map((p) => optional.has(p) ? { path: p, optional: true } : p);
@@ -20406,6 +20437,9 @@ var require_PipelineAssembler = __commonJS({
20406
20437
  if (norm.skills && norm.skills.length > 0) {
20407
20438
  step.skills = norm.skills;
20408
20439
  }
20440
+ if (norm.default_skill) {
20441
+ step.default_skill = norm.default_skill;
20442
+ }
20409
20443
  if (auto_review_runner) {
20410
20444
  step.auto_review_runner = auto_review_runner;
20411
20445
  }
@@ -20734,6 +20768,9 @@ ${raw.slice(0, 200)}`);
20734
20768
  if (norm.skills && norm.skills.length > 0) {
20735
20769
  step.skills = norm.skills;
20736
20770
  }
20771
+ if (norm.default_skill) {
20772
+ step.default_skill = norm.default_skill;
20773
+ }
20737
20774
  if (norm.auto_review_runner) {
20738
20775
  step.auto_review_runner = norm.auto_review_runner;
20739
20776
  }
@@ -21176,6 +21213,7 @@ var require_PipelineRunner = __commonJS({
21176
21213
  exports2.approveStep = approveStep3;
21177
21214
  exports2.rejectStep = rejectStep3;
21178
21215
  exports2.rerunStep = rerunStep3;
21216
+ exports2.chooseStepSkill = chooseStepSkill;
21179
21217
  exports2.requestStepUpdate = requestStepUpdate2;
21180
21218
  exports2.dirtyUpstreamOf = dirtyUpstreamOf2;
21181
21219
  exports2.canRerunApprovedStep = canRerunApprovedStep;
@@ -21460,7 +21498,8 @@ var require_PipelineRunner = __commonJS({
21460
21498
  at: verdict.at,
21461
21499
  revision: nextStep.revision,
21462
21500
  reason: verdict.reason,
21463
- sentBackToIdx: idx
21501
+ sentBackToIdx: idx,
21502
+ ...nextStep.skill ? { skill: nextStep.skill } : {}
21464
21503
  });
21465
21504
  next.status = "running";
21466
21505
  settleOptionalRejection(next, idx, pipeline);
@@ -21537,7 +21576,8 @@ var require_PipelineRunner = __commonJS({
21537
21576
  at: now,
21538
21577
  revision: next2.steps[idx].revision,
21539
21578
  reason,
21540
- sentBackToIdx: targetIdx
21579
+ sentBackToIdx: targetIdx,
21580
+ ...next2.steps[idx].skill ? { skill: next2.steps[idx].skill } : {}
21541
21581
  });
21542
21582
  const usesDag = pipeline ? pipeline.steps.map(WorkspaceSchema_1.normalizeStep).some((s) => s.depends_on.length > 0) : false;
21543
21583
  const targetIdxN = targetIdx;
@@ -21600,7 +21640,8 @@ var require_PipelineRunner = __commonJS({
21600
21640
  at: now,
21601
21641
  revision: step.revision,
21602
21642
  reason,
21603
- sentBackToIdx: idx
21643
+ sentBackToIdx: idx,
21644
+ ...step.skill ? { skill: step.skill } : {}
21604
21645
  })
21605
21646
  };
21606
21647
  next.status = "running";
@@ -21641,6 +21682,24 @@ var require_PipelineRunner = __commonJS({
21641
21682
  next.status = "running";
21642
21683
  return next;
21643
21684
  }
21685
+ function chooseStepSkill(args) {
21686
+ const { state, pipeline, stepIdx, skill } = args;
21687
+ if (!Number.isInteger(stepIdx) || stepIdx < 0 || stepIdx >= state.steps.length) {
21688
+ throw new PipelineRunError3(`Invalid stepIdx ${stepIdx}`);
21689
+ }
21690
+ const target = state.steps[stepIdx];
21691
+ const cfg = pipeline.steps[target.stepIdx];
21692
+ const alt = cfg ? (0, WorkspaceSchema_1.stepSkillAlternatives)((0, WorkspaceSchema_1.normalizeStep)(cfg)) : void 0;
21693
+ if (!alt) {
21694
+ throw new PipelineRunError3(`Step "${target.agent}" has no alternative skills to choose from.`);
21695
+ }
21696
+ if (!alt.options.includes(skill)) {
21697
+ throw new PipelineRunError3(`Skill "${skill}" is not one of step "${target.agent}"'s alternatives (${alt.options.join(", ")}).`);
21698
+ }
21699
+ const next = clone(state);
21700
+ next.steps[stepIdx] = { ...target, skill };
21701
+ return next;
21702
+ }
21644
21703
  function requestStepUpdate2(args) {
21645
21704
  const { state, pipeline, stepIdx, feedback } = args;
21646
21705
  if (!Number.isInteger(stepIdx) || stepIdx < 0 || stepIdx >= state.steps.length) {
@@ -21857,7 +21916,8 @@ var require_PipelineRunner = __commonJS({
21857
21916
  history: pushHistory(approved.history, {
21858
21917
  kind: "approve",
21859
21918
  at: finishedAt,
21860
- revision: approved.revision
21919
+ revision: approved.revision,
21920
+ ...approved.skill ? { skill: approved.skill } : {}
21861
21921
  })
21862
21922
  };
21863
21923
  const normalized = pipeline.steps.map(WorkspaceSchema_1.normalizeStep);
@@ -28437,6 +28497,7 @@ var require_DefaultRunner = __commonJS({
28437
28497
  "use strict";
28438
28498
  Object.defineProperty(exports2, "__esModule", { value: true });
28439
28499
  exports2.DefaultRunner = void 0;
28500
+ exports2.claudeModelArg = claudeModelArg;
28440
28501
  var child_process_1 = require("child_process");
28441
28502
  var claudeEnv_1 = require_claudeEnv();
28442
28503
  var mcp_1 = require_mcp();
@@ -28470,6 +28531,7 @@ var require_DefaultRunner = __commonJS({
28470
28531
  async run(ctx) {
28471
28532
  const bin = this.opts.claudeBin ?? "claude";
28472
28533
  const userMessage = ctx.args.join(" ");
28534
+ const model = claudeModelArg(ctx.model, ctx.modelAliases);
28473
28535
  const args = [
28474
28536
  "--print",
28475
28537
  "--output-format",
@@ -28477,6 +28539,7 @@ var require_DefaultRunner = __commonJS({
28477
28539
  "--verbose",
28478
28540
  "--append-system-prompt",
28479
28541
  ctx.skill,
28542
+ ...model ? ["--model", model] : [],
28480
28543
  ...this.opts.extraArgs ?? [],
28481
28544
  userMessage
28482
28545
  ];
@@ -28526,6 +28589,13 @@ var require_DefaultRunner = __commonJS({
28526
28589
  }
28527
28590
  };
28528
28591
  exports2.DefaultRunner = DefaultRunner3;
28592
+ function claudeModelArg(model, aliases) {
28593
+ const trimmed = model?.trim();
28594
+ if (!trimmed) {
28595
+ return void 0;
28596
+ }
28597
+ return aliases?.[trimmed.toLowerCase()]?.trim() || trimmed;
28598
+ }
28529
28599
  }
28530
28600
  });
28531
28601
 
@@ -29485,6 +29555,10 @@ var require_renameRefs = __commonJS({
29485
29555
  obj.skill = newId;
29486
29556
  moved = true;
29487
29557
  }
29558
+ if (obj.default_skill === oldId) {
29559
+ obj.default_skill = newId;
29560
+ moved = true;
29561
+ }
29488
29562
  return moved;
29489
29563
  }
29490
29564
  function declaredSkills(obj) {
@@ -30707,6 +30781,7 @@ var require_execEngine = __commonJS({
30707
30781
  var budget_1 = require_budget();
30708
30782
  var pricing_1 = require_pricing();
30709
30783
  var models_1 = require_models();
30784
+ var WorkspaceSchema_1 = require_WorkspaceSchema();
30710
30785
  var artifactLanguage_1 = require_artifactLanguage();
30711
30786
  var strictMode_1 = require_strictMode();
30712
30787
  var promptComposer_1 = require_promptComposer();
@@ -30848,13 +30923,13 @@ var require_execEngine = __commonJS({
30848
30923
  }
30849
30924
  }
30850
30925
  }
30851
- function loadAgentSkills3(ws, agent) {
30852
- return agent.skills.map((id) => ws.skills.load(id)).join("\n\n---\n\n");
30926
+ function loadSkills(ws, skillIds) {
30927
+ return skillIds.map((id) => ws.skills.load(id)).join("\n\n---\n\n");
30853
30928
  }
30854
- function buildStepPrompt(ws, agent, runner, root, epicId) {
30929
+ function buildStepPrompt(ws, agent, skillIds, runner, root, epicId) {
30855
30930
  const harness = (0, types_1.harnessCapabilities)(runner);
30856
30931
  return (0, promptComposer_1.composeAgentPrompt)({
30857
- skills: loadAgentSkills3(ws, agent),
30932
+ skills: loadSkills(ws, skillIds),
30858
30933
  persona: ws.personas.load(agent.id),
30859
30934
  instructions: harness.projectInstructions ? null : (0, projectInstructions_1.findProjectInstructions)(root, harness.instructionFile),
30860
30935
  harness,
@@ -30885,6 +30960,11 @@ var require_execEngine = __commonJS({
30885
30960
  hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Agent "${agentId}" not found in workspace.yaml.` });
30886
30961
  return false;
30887
30962
  }
30963
+ const stepCfg = pipeline.steps[stepIdx];
30964
+ const norm = stepCfg ? (0, WorkspaceSchema_1.normalizeStep)(stepCfg) : void 0;
30965
+ const alternatives = norm ? (0, WorkspaceSchema_1.stepSkillAlternatives)(norm) : void 0;
30966
+ const chosen = opts.skill && alternatives?.options.includes(opts.skill) ? opts.skill : stepRec.skill;
30967
+ const skillIds = norm ? (0, WorkspaceSchema_1.resolveStepSkills)(norm, agent.skills, chosen) : [...agent.skills];
30888
30968
  let runner;
30889
30969
  let prompt2;
30890
30970
  try {
@@ -30894,7 +30974,7 @@ var require_execEngine = __commonJS({
30894
30974
  return false;
30895
30975
  }
30896
30976
  try {
30897
- prompt2 = buildStepPrompt(ws, agent, runner, root, state.runId);
30977
+ prompt2 = buildStepPrompt(ws, agent, skillIds, runner, root, state.runId);
30898
30978
  } catch (err) {
30899
30979
  hooks.onStepFailed?.({ stepIdx, agent: agentId, message: `Failed to load skills for agent "${agentId}": ${errMsg(err)}` });
30900
30980
  return false;
@@ -30905,7 +30985,7 @@ var require_execEngine = __commonJS({
30905
30985
  const userMessage = opts.message ?? (contextStr || `Execute step: ${agentId}`);
30906
30986
  if (opts.dryRun) {
30907
30987
  hooks.onDryRunPreview?.({
30908
- skills: agent.skills.join(", "),
30988
+ skills: skillIds.join(", "),
30909
30989
  skillText,
30910
30990
  userMessage,
30911
30991
  env,
@@ -30917,7 +30997,7 @@ var require_execEngine = __commonJS({
30917
30997
  stepIdx,
30918
30998
  agent: agentId,
30919
30999
  revision: stepRec.revision,
30920
- skills: agent.skills,
31000
+ skills: skillIds,
30921
31001
  model: agent.model,
30922
31002
  context: userMessage,
30923
31003
  dirtyUpstream: (0, PipelineRunner_1.dirtyUpstreamOf)({ state, pipeline, stepIdx }).map((d) => ({ stepIdx: d.stepIdx, step: d.step, byStep: d.dirty.byStep }))
@@ -30946,6 +31026,9 @@ var require_execEngine = __commonJS({
30946
31026
  const rec = freshState.steps[stepIdx];
30947
31027
  rec.runner = agent.runner;
30948
31028
  rec.model = resolvedModel;
31029
+ if (alternatives) {
31030
+ rec.skill = skillIds[0];
31031
+ }
30949
31032
  rec.usage = result.usage;
30950
31033
  if (typeof result.costUsd === "number") {
30951
31034
  rec.costUsd = result.costUsd;
@@ -31189,13 +31272,13 @@ var require_runReport = __commonJS({
31189
31272
  return history.map((h) => {
31190
31273
  switch (h.kind) {
31191
31274
  case "reject":
31192
- return ` - \u2718 rejected (rev ${h.revision})${h.reason ? `: ${h.reason}` : ""}`;
31275
+ return ` - \u2718 rejected (rev ${h.revision}${h.skill ? `, ${h.skill}` : ""})${h.reason ? `: ${h.reason}` : ""}`;
31193
31276
  case "rerun":
31194
31277
  return ` - \u21BA rerun \u2192 rev ${h.revision}${h.feedback ? ` (feedback: ${h.feedback})` : ""}`;
31195
31278
  case "auto_review":
31196
31279
  return ` - \u{1F916} auto-review ${h.decision} (rev ${h.revision}): ${h.reason}`;
31197
31280
  case "approve":
31198
- return ` - \u2714 approved (rev ${h.revision})`;
31281
+ return ` - \u2714 approved (rev ${h.revision}${h.skill ? `, ${h.skill}` : ""})`;
31199
31282
  case "undo":
31200
31283
  return ` - \u21B6 mark-done undone (rev ${h.revision}, was ${h.from})`;
31201
31284
  default:
@@ -32678,7 +32761,7 @@ var require_commandModel = __commonJS({
32678
32761
  function shortcutCommandId(phaseId) {
32679
32762
  return phaseId;
32680
32763
  }
32681
- function resolveComposition(config, pipelineId, phaseId) {
32764
+ function resolveComposition(config, pipelineId, phaseId, chosenSkill) {
32682
32765
  const pipeline = config.pipelines.find((p) => p.id === pipelineId);
32683
32766
  if (!pipeline) {
32684
32767
  return { found: false, phaseId, pipelineId };
@@ -32688,11 +32771,8 @@ var require_commandModel = __commonJS({
32688
32771
  return { found: false, phaseId, pipelineId };
32689
32772
  }
32690
32773
  const step = (0, WorkspaceSchema_1.normalizeStep)(stepCfg);
32691
- let skills = step.skills;
32692
- if (!skills || skills.length === 0) {
32693
- const agent = config.agents.find((a) => a.id === step.agent);
32694
- skills = agent?.skills ?? [];
32695
- }
32774
+ const agent = config.agents.find((a) => a.id === step.agent);
32775
+ const skills = (0, WorkspaceSchema_1.resolveStepSkills)(step, agent?.skills ?? [], chosenSkill);
32696
32776
  return {
32697
32777
  found: true,
32698
32778
  phaseId,
@@ -32786,6 +32866,9 @@ The first token is the **epic id**; an optional second token is the **phase**.
32786
32866
  2. In that pipeline's \`steps\`, find the step whose \`name\` (or \`agent\` when
32787
32867
  unnamed) === the chosen phase. That step's \`agent\` + \`skills\` are the
32788
32868
  wiring. If the step omits \`skills\`, use the referenced agent's \`skills:\`.
32869
+ If the step sets \`default_skill\`, its \`skills\` are alternatives: load
32870
+ **only one** \u2014 the step's \`skill\` in \`.aidlc/runs/<epic>.json\` when it
32871
+ is one of them, else \`default_skill\`. Never load the others.
32789
32872
  3. Load the persona from \`.claude/agents/<agent>.md\` (fall back to
32790
32873
  \`~/.claude/agents/<agent>.md\`), and each skill from
32791
32874
  \`.claude/skills/<skill>.md\` (fall back to \`~/.claude/skills/<skill>.md\`).
@@ -33364,13 +33447,13 @@ var require_dist = __commonJS({
33364
33447
  "../core/dist/index.js"(exports2) {
33365
33448
  "use strict";
33366
33449
  Object.defineProperty(exports2, "__esModule", { value: true });
33367
- exports2.renderIntentMarkdown = exports2.openFollowUpEpic = exports2.openIncidentEpic = exports2.SignalParseError = exports2.isSignal = exports2.parseSignal = exports2.SignalSchema = exports2.EpicStepEditError = exports2.resolveStepRef = exports2.describeGateEffect = exports2.commitEpicStepEdit = exports2.planSetEpicStepGates = exports2.planRemoveEpicStep = exports2.planAddEpicStep = exports2.EpicWorkflowSwitchError = exports2.canSwitchEpicWorkflow = exports2.epicWorkflowLock = exports2.applyEpicWorkflowSwitch = exports2.stageEpicWorkflowSwitch = exports2.planEpicWorkflowSwitch = exports2.EpicDescriptionError = exports2.setEpicDescription = exports2.lockedEpicDirError = exports2.EpicScaffoldError = exports2.epicsRoot = exports2.mapStepStatusToEpic = exports2.mirrorRunStateToEpic = exports2.scaffoldEpic = exports2.resolveArtifactCommitConfig = exports2.commitApprovedArtifacts = exports2.PipelineAdaptError = exports2.applyAdaptation = exports2.parseAdaptationVerdict = exports2.buildAdaptationPrompt = exports2.buildPhaseCatalog = exports2.slugEpicId = exports2.parseClassificationVerdict = exports2.buildClassificationPrompt = exports2.heuristicClassify = exports2.PipelineAssembleError = exports2.recipePipelineId = exports2.assemblePipeline = exports2.collectWorkspaceRefIssues = exports2.stepDagId = exports2.stepAgentId = exports2.producesEntries = exports2.normalizeStep = exports2.WorkspaceValidationError = exports2.validateWorkspace = exports2.WorkspaceSchema = void 0;
33368
- exports2.EPIC_PIPELINE_FILENAME = exports2.unusedAfterStepRemoval = exports2.skillReferences = exports2.agentReferences = exports2.renameSkillRefs = exports2.renameAgentRefs = exports2.dropRecipesForPipeline = exports2.dropRecipeStep = exports2.recipesDrawingFrom = exports2.WORKSPACE_DIR = exports2.WORKSPACE_FILENAME = exports2.WorkspaceParseError = exports2.WorkspaceNotFoundError = exports2.WorkspaceLoader = exports2.renderPlanMarkdown = exports2.generatePlan = exports2.collectContext = exports2.followUpHookFailures = exports2.pendingFollowUpDone = exports2.applyFollowUpHookRun = exports2.trackFollowUpChildren = exports2.writeFollowUpHookLedger = exports2.readFollowUpHookLedger = exports2.followUpHookLedgerPath = exports2.runFollowUpHook = exports2.fillFollowUpHookCommand = exports2.resolveFollowUpHooks = exports2.epicPipelineId = exports2.FOLLOW_UP_HOOK_TIMEOUT_MS = exports2.FOLLOW_UP_HOOKS_LEDGER = exports2.stepProducesFollowUps = exports2.collectFollowUpHookIssues = exports2.FOLLOW_UP_HOOK_PLACEHOLDERS = exports2.FOLLOW_UP_HOOK_KEYS = exports2.FOLLOW_UP_INTENT = exports2.FOLLOW_UPS_FILE = exports2.openManifestFollowUp = exports2.followUpChildId = exports2.followUpsOf = exports2.readEpicFollowUps = exports2.parseFollowUps = exports2.FollowUpsParseError = exports2.FollowUpManifestSchema = exports2.FollowUpItemSchema = exports2.SIGNAL_FILE = exports2.FOLLOW_UP_ARTIFACT = exports2.readEpicSignal = exports2.existingEpicIds = exports2.followUpIdFor = exports2.followUpEpicId = void 0;
33369
- exports2.readEpicTags = exports2.normalizeTags = exports2.normalizeTag = exports2.epicMatchesTags = exports2.applyTagEdit = exports2.MAX_TAG_LENGTH = exports2.EPIC_TAGS_KEY = exports2.strictModeSection = exports2.resolveEpicStrictMode = exports2.epicStrictMode = exports2.commandBodyPredatesStrictMode = exports2.STRICT_MODE_KEY = exports2.STRICT_MODE_HEADING = exports2.writeUserEpicIdPrefix = exports2.userConfigPath = exports2.readUserConfig = exports2.readGitUserName = exports2.ensureUserConfigIgnored = exports2.USER_CONFIG_RELPATH = exports2.USER_CONFIG_IGNORE_LINE = exports2.suggestEpicId = exports2.resolveEpicIdPrefixChain = exports2.resolveEpicIdPrefix = exports2.epicIdDateStamp = exports2.deriveEpicIdPrefix = exports2.EPIC_ID_PREFIX_PATTERN = exports2.EPIC_ID_PREFIX_KEY = exports2.resolveArtifactLanguage = exports2.commandBodyPredatesArtifactLanguage = exports2.artifactLanguageSection = exports2.ARTIFACT_LANGUAGE_HEADING = exports2.stripPersonaDirectives = exports2.composeAgentPrompt = exports2.PROJECT_INSTRUCTION_FILES = exports2.findProjectInstructions = exports2.stripPersonaMetadata = exports2.PersonaLoader = exports2.SkillNotFoundError = exports2.SkillLoader = exports2.EnvVarMissingError = exports2.EnvResolver = exports2.epicPipelineReport = exports2.planEpicPipelineExtraction = exports2.epicOwningPipeline = exports2.unstageEpicPipeline = exports2.stageEpicPipeline = exports2.writeEpicPipelines = exports2.splitEpicPipelines = exports2.mergeEpicPipelines = exports2.epicPipelinePath = void 0;
33370
- exports2.weighStepProgress = exports2.isActiveStatus = exports2.isStepOptional = exports2.isRunComplete = exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = exports2.requestStepUpdate = exports2.rerunStep = exports2.rejectStep = exports2.approveStep = exports2.undoStepDone = exports2.canUndoStepDone = exports2.markStepDone = exports2.canStartStep = exports2.startRun = exports2.activateBackendFromWorkspace = exports2.activateRunStateBackend = exports2.resolveRunStateBackend = exports2.GitRunStateStore = exports2.RUN_ID_PATTERN = exports2.FileRunStateStore = exports2.RunStateStore = exports2.harnessCapabilities = exports2.NO_HARNESS_CAPABILITIES = exports2.RunnerValidationError = exports2.validateRunnerExport = exports2.CustomRunnerLoader = exports2.buildClaudeSpawnEnv = exports2.hasClaudeLogin = exports2.isInsideClaudeCodeSession = exports2.createJsonSink = exports2.createLineSink = exports2.isCodexMcpConfigured = exports2.codexConfigPath = exports2.readProjectMcpServer = exports2.mcpRegistrarFor = exports2.codexMcpRegistrar = exports2.claudeMcpRegistrar = exports2.CodexRunner = exports2.DefaultRunner = exports2.RunnerRegistry = exports2.targetPath = exports2.scopePaths = exports2.discoverAssets = exports2.commandBodyIsStale = void 0;
33371
- exports2.isWorkflowGloballyInstalled = exports2.installWorkflowGlobalsByIds = exports2.installGlobalDefaults = exports2.resolveProviderModel = exports2.isClaudeTierAlias = exports2.CLAUDE_TIER_ALIASES = exports2.FAST_MODEL = exports2.CODING_MODEL = exports2.PLANNING_MODEL = exports2.isBuiltinPreset = exports2.BUILTIN_PRESET_IDS = exports2.writeBuiltinAutoReviewValidators = exports2.resolvePrimaryStack = exports2.getSdlcArtifactTemplates = exports2.getBuiltinArtifactTemplates = exports2.phaseArtifactFileName = exports2.sdlcClaudeCommand = exports2.builtinClaudeCommand = exports2.loadAllBuiltinPresets = exports2.loadBuiltinPreset = exports2.planRecipeMigration = exports2.getBuiltinRecipeSummaries = exports2.getAllBuiltinPipelineSummaries = exports2.getSdlcBuiltinPipelineSummary = exports2.getBuiltinPipelineSummary = exports2.getBuiltinWorkflowByPipelineId = exports2.getBuiltinWorkflow = exports2.workflowSlug = exports2.builtinTemplatesRoot = exports2.pipelineCommandId = exports2.PHASES = exports2.BUILTIN_WORKFLOWS = exports2.withBackfilledStepNames = exports2.describeDrift = exports2.reconcileRunSteps = exports2.RUN_STATE_SCHEMA_VERSION = exports2.migrateRunState = exports2.stepIdentity = exports2.resolvePath = exports2.AutoReviewerError = exports2.runAutoReview = exports2.renderRunReport = exports2.verifyRun = exports2.runExecLoop = exports2.estimateCostUsd = exports2.providerAliases = exports2.ratesFromConfig = exports2.mergeRates = exports2.BUILTIN_RATES = exports2.checkBudget = void 0;
33372
- exports2.remapClaudePath = exports2.claudeConfigEnv = exports2.claudeJsonPath = exports2.isDefaultClaudeConfigDir = exports2.claudeConfigDir = exports2.resolveClaudeConfigDir = exports2.defaultClaudeConfigDir = exports2.getClaudeConfigDirOverride = exports2.setClaudeConfigDir = exports2.resolveDeclaredPath = exports2.expandHome = exports2.ProfileLoadError = exports2.UnknownStandardError = exports2.builtinProfiles = exports2.loadActiveProfile = exports2.loadProfile = exports2.listProfileManifests = exports2.resolveStandard = exports2.workspaceStandard = exports2.isBuiltinProfileId = exports2.ProfileSchema = exports2.TRACE_RULES = exports2.PROFILES_DIR = exports2.DEFAULT_PROFILE_ID = exports2.BUILTIN_PROFILE_IDS = exports2.setEpicMemoryHook = exports2.isEpicMemoryHookEnabled = exports2.installAnnotationTools = exports2.relativeEpicRoot = exports2.provisionDeclaredWorkflows = exports2.provisionWorkflowFiles = exports2.writeWorkflowArtifactTemplates = exports2.writeWorkflowCommands = exports2.provisionShortcutDocs = exports2.writeTwoLayerCommands = exports2.shortcutCommandDoc = exports2.backboneCommandDoc = exports2.unprovisionedPhases = exports2.nextEligiblePhase = exports2.resolveComposition = exports2.shortcutCommandId = exports2.getCanonicalPhase = exports2.isCanonicalPhase = exports2.BACKBONE_COMMAND_ID = exports2.CANONICAL_PHASE_IDS = exports2.CANONICAL_PHASES = exports2.renderTemplate = exports2.DEFAULT_GLOBAL_WORKFLOW_IDS = exports2.detectGlobalBuiltinSource = exports2.uninstallWorkflowGlobalsByIds = void 0;
33373
- exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = void 0;
33450
+ exports2.openIncidentEpic = exports2.SignalParseError = exports2.isSignal = exports2.parseSignal = exports2.SignalSchema = exports2.EpicStepEditError = exports2.resolveStepRef = exports2.describeGateEffect = exports2.commitEpicStepEdit = exports2.planSetEpicStepGates = exports2.planRemoveEpicStep = exports2.planAddEpicStep = exports2.EpicWorkflowSwitchError = exports2.canSwitchEpicWorkflow = exports2.epicWorkflowLock = exports2.applyEpicWorkflowSwitch = exports2.stageEpicWorkflowSwitch = exports2.planEpicWorkflowSwitch = exports2.EpicDescriptionError = exports2.setEpicDescription = exports2.lockedEpicDirError = exports2.EpicScaffoldError = exports2.epicsRoot = exports2.mapStepStatusToEpic = exports2.mirrorRunStateToEpic = exports2.scaffoldEpic = exports2.resolveArtifactCommitConfig = exports2.commitApprovedArtifacts = exports2.PipelineAdaptError = exports2.applyAdaptation = exports2.parseAdaptationVerdict = exports2.buildAdaptationPrompt = exports2.buildPhaseCatalog = exports2.slugEpicId = exports2.parseClassificationVerdict = exports2.buildClassificationPrompt = exports2.heuristicClassify = exports2.PipelineAssembleError = exports2.recipePipelineId = exports2.assemblePipeline = exports2.collectWorkspaceRefIssues = exports2.resolveStepSkills = exports2.stepSkillAlternatives = exports2.stepDagId = exports2.stepAgentId = exports2.producesEntries = exports2.normalizeStep = exports2.WorkspaceValidationError = exports2.validateWorkspace = exports2.WorkspaceSchema = void 0;
33451
+ exports2.skillReferences = exports2.agentReferences = exports2.renameSkillRefs = exports2.renameAgentRefs = exports2.dropRecipesForPipeline = exports2.dropRecipeStep = exports2.recipesDrawingFrom = exports2.WORKSPACE_DIR = exports2.WORKSPACE_FILENAME = exports2.WorkspaceParseError = exports2.WorkspaceNotFoundError = exports2.WorkspaceLoader = exports2.renderPlanMarkdown = exports2.generatePlan = exports2.collectContext = exports2.followUpHookFailures = exports2.pendingFollowUpDone = exports2.applyFollowUpHookRun = exports2.trackFollowUpChildren = exports2.writeFollowUpHookLedger = exports2.readFollowUpHookLedger = exports2.followUpHookLedgerPath = exports2.runFollowUpHook = exports2.fillFollowUpHookCommand = exports2.resolveFollowUpHooks = exports2.epicPipelineId = exports2.FOLLOW_UP_HOOK_TIMEOUT_MS = exports2.FOLLOW_UP_HOOKS_LEDGER = exports2.stepProducesFollowUps = exports2.collectFollowUpHookIssues = exports2.FOLLOW_UP_HOOK_PLACEHOLDERS = exports2.FOLLOW_UP_HOOK_KEYS = exports2.FOLLOW_UP_INTENT = exports2.FOLLOW_UPS_FILE = exports2.openManifestFollowUp = exports2.followUpChildId = exports2.followUpsOf = exports2.readEpicFollowUps = exports2.parseFollowUps = exports2.FollowUpsParseError = exports2.FollowUpManifestSchema = exports2.FollowUpItemSchema = exports2.SIGNAL_FILE = exports2.FOLLOW_UP_ARTIFACT = exports2.readEpicSignal = exports2.existingEpicIds = exports2.followUpIdFor = exports2.followUpEpicId = exports2.renderIntentMarkdown = exports2.openFollowUpEpic = void 0;
33452
+ exports2.normalizeTag = exports2.epicMatchesTags = exports2.applyTagEdit = exports2.MAX_TAG_LENGTH = exports2.EPIC_TAGS_KEY = exports2.strictModeSection = exports2.resolveEpicStrictMode = exports2.epicStrictMode = exports2.commandBodyPredatesStrictMode = exports2.STRICT_MODE_KEY = exports2.STRICT_MODE_HEADING = exports2.writeUserEpicIdPrefix = exports2.userConfigPath = exports2.readUserConfig = exports2.readGitUserName = exports2.ensureUserConfigIgnored = exports2.USER_CONFIG_RELPATH = exports2.USER_CONFIG_IGNORE_LINE = exports2.suggestEpicId = exports2.resolveEpicIdPrefixChain = exports2.resolveEpicIdPrefix = exports2.epicIdDateStamp = exports2.deriveEpicIdPrefix = exports2.EPIC_ID_PREFIX_PATTERN = exports2.EPIC_ID_PREFIX_KEY = exports2.resolveArtifactLanguage = exports2.commandBodyPredatesArtifactLanguage = exports2.artifactLanguageSection = exports2.ARTIFACT_LANGUAGE_HEADING = exports2.stripPersonaDirectives = exports2.composeAgentPrompt = exports2.PROJECT_INSTRUCTION_FILES = exports2.findProjectInstructions = exports2.stripPersonaMetadata = exports2.PersonaLoader = exports2.SkillNotFoundError = exports2.SkillLoader = exports2.EnvVarMissingError = exports2.EnvResolver = exports2.epicPipelineReport = exports2.planEpicPipelineExtraction = exports2.epicOwningPipeline = exports2.unstageEpicPipeline = exports2.stageEpicPipeline = exports2.writeEpicPipelines = exports2.splitEpicPipelines = exports2.mergeEpicPipelines = exports2.epicPipelinePath = exports2.EPIC_PIPELINE_FILENAME = exports2.unusedAfterStepRemoval = void 0;
33453
+ exports2.deriveRunProgress = exports2.PipelineRunError = exports2.retryAutoReview = exports2.submitAutoReviewVerdict = exports2.dirtyUpstreamOf = exports2.rerunApprovedStep = exports2.canRerunApprovedStep = exports2.chooseStepSkill = exports2.requestStepUpdate = exports2.rerunStep = exports2.rejectStep = exports2.approveStep = exports2.undoStepDone = exports2.canUndoStepDone = exports2.markStepDone = exports2.canStartStep = exports2.startRun = exports2.activateBackendFromWorkspace = exports2.activateRunStateBackend = exports2.resolveRunStateBackend = exports2.GitRunStateStore = exports2.RUN_ID_PATTERN = exports2.FileRunStateStore = exports2.RunStateStore = exports2.harnessCapabilities = exports2.NO_HARNESS_CAPABILITIES = exports2.RunnerValidationError = exports2.validateRunnerExport = exports2.CustomRunnerLoader = exports2.buildClaudeSpawnEnv = exports2.hasClaudeLogin = exports2.isInsideClaudeCodeSession = exports2.createJsonSink = exports2.createLineSink = exports2.isCodexMcpConfigured = exports2.codexConfigPath = exports2.readProjectMcpServer = exports2.mcpRegistrarFor = exports2.codexMcpRegistrar = exports2.claudeMcpRegistrar = exports2.CodexRunner = exports2.claudeModelArg = exports2.DefaultRunner = exports2.RunnerRegistry = exports2.targetPath = exports2.scopePaths = exports2.discoverAssets = exports2.commandBodyIsStale = exports2.readEpicTags = exports2.normalizeTags = void 0;
33454
+ exports2.isClaudeTierAlias = exports2.CLAUDE_TIER_ALIASES = exports2.FAST_MODEL = exports2.CODING_MODEL = exports2.PLANNING_MODEL = exports2.isBuiltinPreset = exports2.BUILTIN_PRESET_IDS = exports2.writeBuiltinAutoReviewValidators = exports2.resolvePrimaryStack = exports2.getSdlcArtifactTemplates = exports2.getBuiltinArtifactTemplates = exports2.phaseArtifactFileName = exports2.sdlcClaudeCommand = exports2.builtinClaudeCommand = exports2.loadAllBuiltinPresets = exports2.loadBuiltinPreset = exports2.planRecipeMigration = exports2.getBuiltinRecipeSummaries = exports2.getAllBuiltinPipelineSummaries = exports2.getSdlcBuiltinPipelineSummary = exports2.getBuiltinPipelineSummary = exports2.getBuiltinWorkflowByPipelineId = exports2.getBuiltinWorkflow = exports2.workflowSlug = exports2.builtinTemplatesRoot = exports2.pipelineCommandId = exports2.PHASES = exports2.BUILTIN_WORKFLOWS = exports2.withBackfilledStepNames = exports2.describeDrift = exports2.reconcileRunSteps = exports2.RUN_STATE_SCHEMA_VERSION = exports2.migrateRunState = exports2.stepIdentity = exports2.resolvePath = exports2.AutoReviewerError = exports2.runAutoReview = exports2.renderRunReport = exports2.verifyRun = exports2.runExecLoop = exports2.estimateCostUsd = exports2.providerAliases = exports2.ratesFromConfig = exports2.mergeRates = exports2.BUILTIN_RATES = exports2.checkBudget = exports2.weighStepProgress = exports2.isActiveStatus = exports2.isStepOptional = exports2.isRunComplete = void 0;
33455
+ exports2.claudeConfigDir = exports2.resolveClaudeConfigDir = exports2.defaultClaudeConfigDir = exports2.getClaudeConfigDirOverride = exports2.setClaudeConfigDir = exports2.resolveDeclaredPath = exports2.expandHome = exports2.ProfileLoadError = exports2.UnknownStandardError = exports2.builtinProfiles = exports2.loadActiveProfile = exports2.loadProfile = exports2.listProfileManifests = exports2.resolveStandard = exports2.workspaceStandard = exports2.isBuiltinProfileId = exports2.ProfileSchema = exports2.TRACE_RULES = exports2.PROFILES_DIR = exports2.DEFAULT_PROFILE_ID = exports2.BUILTIN_PROFILE_IDS = exports2.setEpicMemoryHook = exports2.isEpicMemoryHookEnabled = exports2.installAnnotationTools = exports2.relativeEpicRoot = exports2.provisionDeclaredWorkflows = exports2.provisionWorkflowFiles = exports2.writeWorkflowArtifactTemplates = exports2.writeWorkflowCommands = exports2.provisionShortcutDocs = exports2.writeTwoLayerCommands = exports2.shortcutCommandDoc = exports2.backboneCommandDoc = exports2.unprovisionedPhases = exports2.nextEligiblePhase = exports2.resolveComposition = exports2.shortcutCommandId = exports2.getCanonicalPhase = exports2.isCanonicalPhase = exports2.BACKBONE_COMMAND_ID = exports2.CANONICAL_PHASE_IDS = exports2.CANONICAL_PHASES = exports2.renderTemplate = exports2.DEFAULT_GLOBAL_WORKFLOW_IDS = exports2.detectGlobalBuiltinSource = exports2.uninstallWorkflowGlobalsByIds = exports2.isWorkflowGloballyInstalled = exports2.installWorkflowGlobalsByIds = exports2.installGlobalDefaults = exports2.resolveProviderModel = void 0;
33456
+ exports2.AIDLC_CORE_VERSION = exports2.AIDLC_CLI_GUIDE_TEXT = exports2.AIDLC_KNOWLEDGE = exports2.clearResolveCommandCache = exports2.resolveCommand = exports2.remapClaudePath = exports2.claudeConfigEnv = exports2.claudeJsonPath = exports2.isDefaultClaudeConfigDir = void 0;
33374
33457
  var WorkspaceSchema_1 = require_WorkspaceSchema();
33375
33458
  Object.defineProperty(exports2, "WorkspaceSchema", { enumerable: true, get: function() {
33376
33459
  return WorkspaceSchema_1.WorkspaceSchema;
@@ -33393,6 +33476,12 @@ var require_dist = __commonJS({
33393
33476
  Object.defineProperty(exports2, "stepDagId", { enumerable: true, get: function() {
33394
33477
  return WorkspaceSchema_1.stepDagId;
33395
33478
  } });
33479
+ Object.defineProperty(exports2, "stepSkillAlternatives", { enumerable: true, get: function() {
33480
+ return WorkspaceSchema_1.stepSkillAlternatives;
33481
+ } });
33482
+ Object.defineProperty(exports2, "resolveStepSkills", { enumerable: true, get: function() {
33483
+ return WorkspaceSchema_1.resolveStepSkills;
33484
+ } });
33396
33485
  Object.defineProperty(exports2, "collectWorkspaceRefIssues", { enumerable: true, get: function() {
33397
33486
  return WorkspaceSchema_1.collectWorkspaceRefIssues;
33398
33487
  } });
@@ -33873,6 +33962,9 @@ var require_dist = __commonJS({
33873
33962
  Object.defineProperty(exports2, "DefaultRunner", { enumerable: true, get: function() {
33874
33963
  return DefaultRunner_1.DefaultRunner;
33875
33964
  } });
33965
+ Object.defineProperty(exports2, "claudeModelArg", { enumerable: true, get: function() {
33966
+ return DefaultRunner_1.claudeModelArg;
33967
+ } });
33876
33968
  var CodexRunner_1 = require_CodexRunner();
33877
33969
  Object.defineProperty(exports2, "CodexRunner", { enumerable: true, get: function() {
33878
33970
  return CodexRunner_1.CodexRunner;
@@ -33982,6 +34074,9 @@ var require_dist = __commonJS({
33982
34074
  Object.defineProperty(exports2, "requestStepUpdate", { enumerable: true, get: function() {
33983
34075
  return PipelineRunner_1.requestStepUpdate;
33984
34076
  } });
34077
+ Object.defineProperty(exports2, "chooseStepSkill", { enumerable: true, get: function() {
34078
+ return PipelineRunner_1.chooseStepSkill;
34079
+ } });
33985
34080
  Object.defineProperty(exports2, "canRerunApprovedStep", { enumerable: true, get: function() {
33986
34081
  return PipelineRunner_1.canRerunApprovedStep;
33987
34082
  } });
@@ -43018,7 +43113,7 @@ var require_package = __commonJS({
43018
43113
  "package.json"(exports2, module2) {
43019
43114
  module2.exports = {
43020
43115
  name: "@delete101020/aidlc",
43021
- version: "4.0.22",
43116
+ version: "4.0.24",
43022
43117
  description: "AIDLC Native CLI, a fork of AIDLC \u2014 drive Claude through the six-stage AI-Native SDLC Playbook: Plan \u2192 Design \u2192 Build \u2192 Test \u2192 Deploy \u2192 Maintain, with artifact gates, requirements traceability, an incident loop back to Plan, and Spec Kit support.",
43023
43118
  license: "MIT",
43024
43119
  repository: {
@@ -47964,7 +48059,7 @@ function registerRun(program3) {
47964
48059
  });
47965
48060
  cmd.command("exec <runId>").description(
47966
48061
  "Execute the current step by spawning the claude CLI, then auto-advance.\n Streams output live. Stops at human_review steps unless --auto-approve.\n Exit codes: 0 completed (or stopped at --until), 2 paused on a gate\n (awaiting review / rejected / budget), 1 error. --require-complete maps\n any non-completed outcome to 1 for CI gating."
47967
- ).option("--until <step>", "Stop after this step completes (index or agent id)").option("--auto-approve", "Also auto-approve human_review steps without pausing").option("--require-complete", "Exit 1 unless the run reaches completed (for CI gating)").option("--json", "Suppress decorative output; print a final JSON summary to stdout (claude stream goes to stderr)").option("--message <text>", "Override the user message sent to claude (default: context pairs)").option("--dry-run", "Print the assembled prompt without spawning claude").action(async (runId, opts, actionCmd) => {
48062
+ ).option("--until <step>", "Stop after this step completes (index or agent id)").option("--auto-approve", "Also auto-approve human_review steps without pausing").option("--require-complete", "Exit 1 unless the run reaches completed (for CI gating)").option("--json", "Suppress decorative output; print a final JSON summary to stdout (claude stream goes to stderr)").option("--message <text>", "Override the user message sent to claude (default: context pairs)").option("--dry-run", "Print the assembled prompt without spawning claude").option("--skill <id>", "On steps that offer alternative skills (default_skill), run this one").action(async (runId, opts, actionCmd) => {
47968
48063
  const root = resolveWorkspaceRoot(actionCmd);
47969
48064
  if (opts.json) {
47970
48065
  setQuiet(true);
@@ -48073,7 +48168,7 @@ async function execLoop(root, runId, opts) {
48073
48168
  return (0, import_core13.runExecLoop)(
48074
48169
  root,
48075
48170
  runId,
48076
- { untilIdx, autoApprove: opts.autoApprove, message: opts.message, dryRun: opts.dryRun },
48171
+ { untilIdx, autoApprove: opts.autoApprove, message: opts.message, dryRun: opts.dryRun, skill: opts.skill },
48077
48172
  cliExecHooks(runId, claudeOut)
48078
48173
  );
48079
48174
  }
@@ -526,9 +526,9 @@
526
526
  <div id="model-selector-wrap">
527
527
  <select id="model-selector" title="Select model for agent">
528
528
  <option value="">Default</option>
529
- <option value="claude-opus-4-8">Opus 4.8</option>
530
- <option value="claude-sonnet-5">Sonnet 5</option>
531
- <option value="claude-haiku-4-5-20251001">Haiku 4.5</option>
529
+ <option value="opus">Opus</option>
530
+ <option value="sonnet">Sonnet</option>
531
+ <option value="haiku">Haiku</option>
532
532
  </select>
533
533
  </div>
534
534
  <label id="ask-mode-wrap" title="Force Ask Mode even with comments (for Q&A over edits)" style="display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--dim-6);">
@@ -709,7 +709,14 @@ let annotations = [];
709
709
  let pendingNew = [];
710
710
 
711
711
  // Agent model & metrics
712
+ // Aliases (`opus` / `sonnet` / `haiku`) always resolve to the current
713
+ // generation. A pinned id saved by an older build (e.g. `claude-opus-4-8`) is
714
+ // migrated to its tier's alias so it does not stay stuck on that generation.
712
715
  let selectedModel = localStorage.getItem('annotron-model') || '';
716
+ if (selectedModel.startsWith('claude-')) {
717
+ selectedModel = ['opus', 'sonnet', 'haiku'].find((t) => selectedModel.includes(t)) || '';
718
+ localStorage.setItem('annotron-model', selectedModel);
719
+ }
713
720
  let forceAskMode = localStorage.getItem('annotron-ask-mode') === 'true';
714
721
  let agentMetricsData = { model: '', tokensUsed: 0, tokensMax: 200000, contextUsed: 0, contextMax: 65536 };
715
722
 
@@ -734,9 +741,9 @@ const infoTokens = document.getElementById('info-tokens');
734
741
  function updateInfoBar() {
735
742
  // Update model display
736
743
  const modelDisplay = selectedModel ?
737
- (selectedModel.includes('opus') ? 'Opus 4.8' :
738
- selectedModel.includes('sonnet') ? 'Sonnet 5' :
739
- selectedModel.includes('haiku') ? 'Haiku 4.5' :
744
+ (selectedModel.includes('opus') ? 'Opus' :
745
+ selectedModel.includes('sonnet') ? 'Sonnet' :
746
+ selectedModel.includes('haiku') ? 'Haiku' :
740
747
  selectedModel) : 'Default';
741
748
  infoModel.textContent = modelDisplay;
742
749
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delete101020/aidlc",
3
- "version": "4.0.22",
3
+ "version": "4.0.24",
4
4
  "description": "AIDLC Native CLI, a fork of AIDLC — drive Claude through the six-stage AI-Native SDLC Playbook: Plan → Design → Build → Test → Deploy → Maintain, with artifact gates, requirements traceability, an incident loop back to Plan, and Spec Kit support.",
5
5
  "license": "MIT",
6
6
  "repository": {