substrate-ai 0.21.10 → 0.21.12

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.
Files changed (36) hide show
  1. package/dist/acceptance-judge-CKNJdq03.js +4 -0
  2. package/dist/acceptance-judge-eIZZha1C.js +702 -0
  3. package/dist/adapter-registry-Z0RlAJY4.js +4 -0
  4. package/dist/cli/index.js +173 -21
  5. package/dist/{decision-router-BAPpON_C.js → decision-router-Dyby0fUf.js} +1 -1
  6. package/dist/{decisions-DMUwdH1O.js → decisions-Cst_r3kF.js} +2 -2
  7. package/dist/{dist-CO4BbTu3.js → dist-BZGqn-XQ.js} +5 -3
  8. package/dist/{errors-0OA2nge4.js → errors-xSeGw6pf.js} +2 -2
  9. package/dist/{experimenter-BTUtFcGu.js → experimenter-hnLiBgcQ.js} +1 -1
  10. package/dist/health--DIz8sJ9.js +8 -0
  11. package/dist/{health-BFucsjla.js → health-B867L-8I.js} +3 -3
  12. package/dist/{index-s7wBSfVT.d.ts → index-Be5MEp2y.d.ts} +2 -1
  13. package/dist/index.d.ts +13 -2
  14. package/dist/index.js +2 -2
  15. package/dist/{interactive-prompt-BqOdHdh8.js → interactive-prompt-BvHUcoY4.js} +2 -2
  16. package/dist/{manifest-read-B0dsJk2z.js → manifest-read-BGzmmY01.js} +259 -5
  17. package/dist/modules/interactive-prompt/index.js +3 -3
  18. package/dist/{recovery-engine-BKGBeBnW.js → recovery-engine-dtLHyV4M.js} +2 -2
  19. package/dist/{routing-Bet3Iu2w.js → routing-BcnHtKAm.js} +2 -2
  20. package/dist/{run-CD4LLdA6.js → run-6iVsrLQb.js} +567 -1220
  21. package/dist/run-BShpywVI.js +15 -0
  22. package/dist/src/modules/decision-router/index.js +1 -1
  23. package/dist/src/modules/recovery-engine/index.d.ts +1 -1
  24. package/dist/src/modules/recovery-engine/index.js +2 -2
  25. package/dist/{upgrade-Cryksfvg.js → upgrade-BoSsIewI.js} +3 -3
  26. package/dist/{upgrade-DGpQdA9A.js → upgrade-CNGc12AV.js} +2 -2
  27. package/dist/version-manager-impl-B9VDdCKb.js +4 -0
  28. package/dist/{work-graph-repository-DZyJv5pV.js → work-graph-repository-4cKsf8Lf.js} +1 -1
  29. package/package.json +1 -1
  30. package/dist/adapter-registry-Cr9f2ICC.js +0 -4
  31. package/dist/health-MfuPScBT.js +0 -8
  32. package/dist/run-AzMKyyR7.js +0 -14
  33. package/dist/version-manager-impl-DSK9i3Xk.js +0 -4
  34. /package/dist/{decisions-CzSIEeGP.js → decisions-BAaxpVD0.js} +0 -0
  35. /package/dist/{routing-DFxoKHDt.js → routing-DZT5PN3N.js} +0 -0
  36. /package/dist/{version-manager-impl-qFBiO4Eh.js → version-manager-impl-DMTw551Q.js} +0 -0
@@ -0,0 +1,4 @@
1
+ import { AdapterRegistry } from "./dist-BZGqn-XQ.js";
2
+ import "./adapter-registry-DXLMTmfD.js";
3
+
4
+ export { AdapterRegistry };
package/dist/cli/index.js CHANGED
@@ -1,20 +1,21 @@
1
1
  #!/usr/bin/env node
2
- import { FileKvStore, SUBSTRATE_OWNED_SETTINGS_KEYS, VALID_PHASES, buildPipelineStatusOutput, createDatabaseAdapter, createDoltOperatorReader, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, parseDbTimestampAsUtc, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion } from "../health-BFucsjla.js";
2
+ import { FileKvStore, SUBSTRATE_OWNED_SETTINGS_KEYS, VALID_PHASES, buildPipelineStatusOutput, createDatabaseAdapter, createDoltOperatorReader, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, parseDbTimestampAsUtc, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion } from "../health-B867L-8I.js";
3
3
  import { createLogger } from "../logger-KeHncl-f.js";
4
4
  import { createEventBus } from "../helpers-CElYrONe.js";
5
- import { AdapterRegistry, BudgetConfigSchema, CURRENT_CONFIG_FORMAT_VERSION, CURRENT_TASK_GRAPH_VERSION, ConfigError, CostTrackerConfigSchema, DEFAULT_CONFIG, DoltClient, DoltNotInstalled, GlobalSettingsSchema, InMemoryDatabaseAdapter, IngestionServer, MonitorDatabaseImpl, OPERATIONAL_FINDING, PartialGlobalSettingsSchema, PartialProviderConfigSchema, ProvidersSchema, RoutingRecommender, STORY_METRICS, TelemetryConfigSchema, addTokenUsage, aggregateTokenUsageForRun, checkDoltInstalled, compareRunMetrics, createAmendmentRun, createConfigSystem, createDecision, createGitWorktreeManager, createPipelineRun, createStderrLogger, getActiveDecisions, getAllCostEntriesFiltered, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initWorkGraphSchema, initializeDolt, listRunMetrics, loadParentRunDecisions, supersedeDecision, swallowDebug, tagRunAsBaseline, updatePipelineRun } from "../dist-CO4BbTu3.js";
5
+ import { AdapterRegistry, BudgetConfigSchema, CURRENT_CONFIG_FORMAT_VERSION, CURRENT_TASK_GRAPH_VERSION, ConfigError, CostTrackerConfigSchema, DEFAULT_CONFIG, DoltClient, DoltNotInstalled, GlobalSettingsSchema, InMemoryDatabaseAdapter, IngestionServer, MonitorDatabaseImpl, OPERATIONAL_FINDING, PartialGlobalSettingsSchema, PartialProviderConfigSchema, ProvidersSchema, RoutingRecommender, STORY_METRICS, TelemetryConfigSchema, addTokenUsage, aggregateTokenUsageForRun, checkDoltInstalled, compareRunMetrics, createAmendmentRun, createConfigSystem, createDecision, createGitWorktreeManager, createPipelineRun, createStderrLogger, getActiveDecisions, getAllCostEntriesFiltered, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initWorkGraphSchema, initializeDolt, listRunMetrics, loadParentRunDecisions, supersedeDecision, swallowDebug, tagRunAsBaseline, updatePipelineRun } from "../dist-BZGqn-XQ.js";
6
6
  import "../adapter-registry-DXLMTmfD.js";
7
- import { ACCEPTANCE_CONTRACT_PROFILE_PATH, JOURNEY_DEFERRALS_PATH, JOURNEY_REGISTRY_PATH, RunManifest, SupervisorLock, ZERO_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, aggregateProbeAuthorMetrics, loadAcceptanceContractFromTrustedTree, loadJourneyRegistryFromFile, loadJourneyRegistryFromTrustedTree, parseAcceptanceContract, parseJourneyDeferrals, parseJourneyRegistry, parseRuntimeProbes, readCurrentRunId, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, rollupFindingsByAuthor, rollupProbeAuthorByClass, rollupProbeAuthorMetrics, runAcTraceabilityCheck } from "../manifest-read-B0dsJk2z.js";
8
- import { AdapterTelemetryPersistence, AppError, DoltRepoMapMetaRepository, DoltSymbolRepository, ERR_REPO_MAP_STORAGE_WRITE, EpicIngester, GLOBSTAR, GitClient, GrammarLoader, Minimatch, Minipass, RepoMapInjector, RepoMapModule, RepoMapQueryEngine, RepoMapStorage, SymbolParser, createContextCompiler, createDispatcher, createEventEmitter, createImplementationOrchestrator, createPackLoader, createPhaseOrchestrator, createStopAfterGate, createTelemetryAdvisor, escape, formatPhaseCompletionSummary, getFactoryRunSummaries, getScenarioResultsForRun, getTwinRunsForRun, listGraphRuns, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveStoryKeys, runAcceptanceJudge, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runSolutioningPhase, unescape, validateStopAfterFromConflict } from "../run-CD4LLdA6.js";
9
- import "../errors-0OA2nge4.js";
10
- import "../routing-DFxoKHDt.js";
11
- import { WorkGraphRepository } from "../work-graph-repository-DZyJv5pV.js";
12
- import "../decisions-CzSIEeGP.js";
13
- import "../decision-router-BAPpON_C.js";
14
- import "../interactive-prompt-BqOdHdh8.js";
15
- import "../recovery-engine-BKGBeBnW.js";
16
- import "../version-manager-impl-qFBiO4Eh.js";
17
- import { registerUpgradeCommand } from "../upgrade-DGpQdA9A.js";
7
+ import { ACCEPTANCE_CONTRACT_PROFILE_PATH, JOURNEY_DEFERRALS_PATH, JOURNEY_REGISTRY_PATH, RunManifest, SupervisorLock, ZERO_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, aggregateProbeAuthorMetrics, clearGateDemotion, computePrecision, computeRecall, demoteGate, loadAcceptanceContractFromTrustedTree, loadJourneyRegistryFromFile, loadJourneyRegistryFromTrustedTree, parseAcceptanceContract, parseJourneyDeferrals, parseJourneyRegistry, parseRuntimeProbes, readAcceptanceMetrics, readCurrentRunId, readGateState, recordCanary, recordOverride, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, rollupFindingsByAuthor, rollupProbeAuthorByClass, rollupProbeAuthorMetrics, runAcTraceabilityCheck, runCanary } from "../manifest-read-BGzmmY01.js";
8
+ import { AdapterTelemetryPersistence, AppError, DoltRepoMapMetaRepository, DoltSymbolRepository, ERR_REPO_MAP_STORAGE_WRITE, EpicIngester, GLOBSTAR, GitClient, GrammarLoader, Minimatch, Minipass, RepoMapInjector, RepoMapModule, RepoMapQueryEngine, RepoMapStorage, SymbolParser, createContextCompiler, createDispatcher, createEventEmitter, createImplementationOrchestrator, createPackLoader, createPhaseOrchestrator, createStopAfterGate, createTelemetryAdvisor, escape, formatPhaseCompletionSummary, getFactoryRunSummaries, getScenarioResultsForRun, getTwinRunsForRun, listGraphRuns, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runSolutioningPhase, unescape, validateStopAfterFromConflict } from "../run-6iVsrLQb.js";
9
+ import "../errors-xSeGw6pf.js";
10
+ import { runAcceptanceJudge } from "../acceptance-judge-eIZZha1C.js";
11
+ import "../routing-DZT5PN3N.js";
12
+ import { WorkGraphRepository } from "../work-graph-repository-4cKsf8Lf.js";
13
+ import "../decisions-BAaxpVD0.js";
14
+ import "../decision-router-Dyby0fUf.js";
15
+ import "../interactive-prompt-BvHUcoY4.js";
16
+ import "../recovery-engine-dtLHyV4M.js";
17
+ import "../version-manager-impl-DMTw551Q.js";
18
+ import { registerUpgradeCommand } from "../upgrade-CNGc12AV.js";
18
19
  import { Command } from "commander";
19
20
  import { fileURLToPath } from "url";
20
21
  import { dirname, join, resolve } from "path";
@@ -700,6 +701,7 @@ const STAR = ".substrate/*";
700
701
  const CONFIG_NEGATION = "!.substrate/config.yaml";
701
702
  const PROFILE_NEGATION = "!.substrate/project-profile.yaml";
702
703
  const ACCEPTANCE_NEGATION = "!.substrate/acceptance/";
704
+ const ACCEPTANCE_LOCAL_IGNORES = [".substrate/acceptance/gate-state.json", ".substrate/acceptance/metrics.json"];
703
705
  const CODEX_PROMPTS = ".codex/prompts/";
704
706
  const CODEX_SKILLS = ".codex/skills/";
705
707
  /**
@@ -723,6 +725,10 @@ function computeSubstrateGitignore(existing) {
723
725
  if (!acceptanceNegationEffective) append.push(ACCEPTANCE_NEGATION);
724
726
  if (!trimmed.includes(CODEX_PROMPTS)) append.push(CODEX_PROMPTS);
725
727
  if (!trimmed.includes(CODEX_SKILLS)) append.push(CODEX_SKILLS);
728
+ for (const localIgnore of ACCEPTANCE_LOCAL_IGNORES) {
729
+ const li = trimmed.lastIndexOf(localIgnore);
730
+ if (li === -1 || li < acceptanceNegIdx) append.push(localIgnore);
731
+ }
726
732
  let content = lines.join("\n");
727
733
  if (append.length > 0) {
728
734
  const needsNewline = content.length > 0 && !content.endsWith("\n");
@@ -7130,7 +7136,7 @@ async function runStatusAction(options) {
7130
7136
  logger$15.debug({ err }, "Work graph query failed, continuing without work graph data");
7131
7137
  }
7132
7138
  if (run === void 0) {
7133
- const { inspectProcessTree: inspectProcessTree$1 } = await import("../health-MfuPScBT.js");
7139
+ const { inspectProcessTree: inspectProcessTree$1 } = await import("../health--DIz8sJ9.js");
7134
7140
  const substrateDirPath = join(projectRoot, ".substrate");
7135
7141
  const processInfo = inspectProcessTree$1({
7136
7142
  projectRoot,
@@ -8078,7 +8084,7 @@ function defaultSupervisorDeps() {
8078
8084
  if (cached === null) {
8079
8085
  const { AdapterRegistry: AR } = await import(
8080
8086
  /* @vite-ignore */
8081
- "../adapter-registry-Cr9f2ICC.js"
8087
+ "../adapter-registry-Z0RlAJY4.js"
8082
8088
  );
8083
8089
  cached = new AR();
8084
8090
  await cached.discoverAndRegister();
@@ -8645,11 +8651,11 @@ async function runSupervisorAction(options, deps = {}) {
8645
8651
  try {
8646
8652
  const { createExperimenter } = await import(
8647
8653
  /* @vite-ignore */
8648
- "../experimenter-BTUtFcGu.js"
8654
+ "../experimenter-hnLiBgcQ.js"
8649
8655
  );
8650
8656
  const { getLatestRun: getLatest } = await import(
8651
8657
  /* @vite-ignore */
8652
- "../decisions-DMUwdH1O.js"
8658
+ "../decisions-Cst_r3kF.js"
8653
8659
  );
8654
8660
  const expAdapter = createDatabaseAdapter({
8655
8661
  backend: "auto",
@@ -8659,7 +8665,7 @@ async function runSupervisorAction(options, deps = {}) {
8659
8665
  await initSchema(expAdapter);
8660
8666
  const { runRunAction: runPipeline } = await import(
8661
8667
  /* @vite-ignore */
8662
- "../run-AzMKyyR7.js"
8668
+ "../run-BShpywVI.js"
8663
8669
  );
8664
8670
  const runStoryFn = async (opts) => {
8665
8671
  const exitCode = await runPipeline({
@@ -9184,7 +9190,7 @@ async function runMetricsAction(options) {
9184
9190
  const routingConfigPath = join(dbDir, "routing.yml");
9185
9191
  let routingConfig = null;
9186
9192
  if (existsSync$1(routingConfigPath)) try {
9187
- const { loadModelRoutingConfig } = await import("../routing-Bet3Iu2w.js");
9193
+ const { loadModelRoutingConfig } = await import("../routing-BcnHtKAm.js");
9188
9194
  routingConfig = loadModelRoutingConfig(routingConfigPath);
9189
9195
  } catch {}
9190
9196
  if (routingConfig === null) routingConfig = {
@@ -13660,6 +13666,152 @@ function registerAcceptanceCommand(program, version, registry) {
13660
13666
  process.stdout.write(JSON.stringify(output, null, 2) + "\n");
13661
13667
  process.exit(result.result === "success" ? ACCEPTANCE_EXIT_SUCCESS : ACCEPTANCE_EXIT_ERROR);
13662
13668
  });
13669
+ acceptanceCmd.command("canary <journeyId>").description("Self-test the gate: revert a journey's wiring commit(s), re-judge, require the verdict to flip. A miss auto-demotes the gate to advisory. Set LOG_LEVEL=silent for clean JSON.").requiredOption("--wiring-commit <sha...>", "commit SHA(s) that wired the journey (reverted in a scratch clone)").option("--registry-file <path>", `registry YAML (default: ${JOURNEY_REGISTRY_PATH} in cwd)`).option("--agent <id>", "agent adapter id", "claude-code").option("--pack <name>", "methodology pack carrying the judge prompt", "bmad").action(async (journeyId, opts) => {
13670
+ if (process.env.LOG_LEVEL === void 0) process.env.LOG_LEVEL = "silent";
13671
+ if (registry === void 0) {
13672
+ process.stdout.write("acceptance canary: adapter registry unavailable in this invocation context\n");
13673
+ process.exit(ACCEPTANCE_EXIT_ERROR);
13674
+ }
13675
+ const projectRoot = process.cwd();
13676
+ const registryPath = opts.registryFile !== void 0 ? resolve$1(opts.registryFile) : join$1(projectRoot, JOURNEY_REGISTRY_PATH);
13677
+ let registryContent;
13678
+ try {
13679
+ registryContent = await readFile$1(registryPath, "utf-8");
13680
+ } catch (err) {
13681
+ process.stdout.write(`acceptance canary: cannot read registry at ${registryPath}: ${String(err)}\n`);
13682
+ process.exit(ACCEPTANCE_EXIT_ERROR);
13683
+ return;
13684
+ }
13685
+ const parsed = parseJourneyRegistry(registryContent);
13686
+ if (!parsed.ok) {
13687
+ process.stdout.write(`acceptance canary: registry invalid:\n${parsed.issues.map((i) => ` ${i.path}: ${i.message}`).join("\n")}\n`);
13688
+ process.exit(ACCEPTANCE_EXIT_ERROR);
13689
+ return;
13690
+ }
13691
+ const journey = parsed.registry.journeys.find((j) => j.id === journeyId);
13692
+ if (journey === void 0) {
13693
+ process.stdout.write(`acceptance canary: journey "${journeyId}" not in registry\n`);
13694
+ process.exit(ACCEPTANCE_EXIT_ERROR);
13695
+ return;
13696
+ }
13697
+ const contractLoad = await loadAcceptanceContractFromTrustedTree(projectRoot);
13698
+ if (contractLoad.status !== "ok") {
13699
+ process.stdout.write(`acceptance canary: no usable acceptance contract (${contractLoad.status}) — cannot render\n`);
13700
+ process.exit(ACCEPTANCE_EXIT_ERROR);
13701
+ return;
13702
+ }
13703
+ const { runAcceptanceJudge: runAcceptanceJudge$1 } = await import("../acceptance-judge-CKNJdq03.js");
13704
+ const eventBus = createEventBus();
13705
+ const adapter = new InMemoryDatabaseAdapter();
13706
+ const packLoader = createPackLoader();
13707
+ let pack;
13708
+ try {
13709
+ pack = await packLoader.load(join$1(projectRoot, "packs", opts.pack));
13710
+ } catch (err) {
13711
+ process.stdout.write(`acceptance canary: failed to load pack '${opts.pack}': ${String(err)}\n`);
13712
+ process.exit(ACCEPTANCE_EXIT_ERROR);
13713
+ return;
13714
+ }
13715
+ const contextCompiler = createContextCompiler({ db: adapter });
13716
+ const noopLogger = {
13717
+ debug: () => {},
13718
+ info: () => {},
13719
+ warn: () => {},
13720
+ error: () => {}
13721
+ };
13722
+ const dispatcher = createDispatcher({
13723
+ eventBus,
13724
+ adapterRegistry: registry,
13725
+ logger: noopLogger
13726
+ });
13727
+ const result = await runCanary({
13728
+ repoRoot: projectRoot,
13729
+ journey,
13730
+ contract: contractLoad.contract,
13731
+ wiringCommits: opts.wiringCommit,
13732
+ judge: async (jrny, artifactsDir, artifacts) => {
13733
+ const j = await runAcceptanceJudge$1({
13734
+ db: adapter,
13735
+ pack,
13736
+ contextCompiler,
13737
+ dispatcher,
13738
+ agentId: opts.agent
13739
+ }, {
13740
+ journey: jrny,
13741
+ artifactsDir,
13742
+ artifacts
13743
+ });
13744
+ return j.result === "success" && j.verdicts !== void 0 ? {
13745
+ ok: true,
13746
+ verdicts: j.verdicts.map((v) => ({
13747
+ end_state_id: v.end_state_id,
13748
+ verdict: v.verdict
13749
+ }))
13750
+ } : {
13751
+ ok: false,
13752
+ error: j.error ?? "judge failed"
13753
+ };
13754
+ }
13755
+ });
13756
+ await dispatcher.shutdown();
13757
+ let demoted = false;
13758
+ if (result.inconclusive !== true) {
13759
+ recordCanary(projectRoot, result.caught);
13760
+ if (!result.caught) {
13761
+ demoteGate(projectRoot, "canary-missed", `journey ${journey.id}: ${result.detail}`);
13762
+ demoted = true;
13763
+ }
13764
+ }
13765
+ const output = buildJsonOutput("substrate acceptance canary", {
13766
+ ...result,
13767
+ gateDemoted: demoted
13768
+ }, version);
13769
+ process.stdout.write(JSON.stringify(output, null, 2) + "\n");
13770
+ process.exit(result.caught || result.inconclusive === true ? ACCEPTANCE_EXIT_SUCCESS : ACCEPTANCE_EXIT_ERROR);
13771
+ });
13772
+ acceptanceCmd.command("clear-demotion").description("Clear an acceptance-gate auto-demotion (after diagnosing a canary miss or precision-floor breach), restoring blocking authority.").action(() => {
13773
+ const projectRoot = process.cwd();
13774
+ const state = readGateState(projectRoot);
13775
+ if (state === void 0 || !state.demoted) {
13776
+ process.stdout.write("acceptance gate is not demoted — nothing to clear.\n");
13777
+ process.exit(ACCEPTANCE_EXIT_SUCCESS);
13778
+ }
13779
+ clearGateDemotion(projectRoot);
13780
+ process.stdout.write(`cleared gate demotion (was: ${state.reason}${state.detail !== void 0 ? ` — ${state.detail}` : ""}, since ${state.since}). Blocking authority restored.\n`);
13781
+ process.exit(ACCEPTANCE_EXIT_SUCCESS);
13782
+ });
13783
+ acceptanceCmd.command("override <storyKey>").description("Record an operator override of a journey-critical acceptance FAIL (a false positive). Sustained low precision auto-demotes the gate.").requiredOption("--reason <text>", "why the block was wrong (the operator judgement)").option("--precision-floor <n>", "precision floor (default 0.8 or acceptance.precision_floor)", parseFloat).action((storyKey, opts) => {
13784
+ const projectRoot = process.cwd();
13785
+ const floor = opts.precisionFloor ?? .8;
13786
+ const result = recordOverride(projectRoot, storyKey, opts.reason, floor);
13787
+ process.stdout.write(`recorded override for ${storyKey} ("${opts.reason}"). verdict precision now ${result.precision.toFixed(2)} (${result.metrics.overrides.length} overrides / ${String(result.metrics.total_fails)} blocks).\n` + (result.demoted ? `⚠ precision below floor ${floor.toFixed(2)} — gate AUTO-DEMOTED to advisory. Diagnose, then \`substrate acceptance clear-demotion\`.\n` : ""));
13788
+ process.exit(ACCEPTANCE_EXIT_SUCCESS);
13789
+ });
13790
+ acceptanceCmd.command("status").description("Show acceptance-gate health: verdict precision, canary recall, and any active auto-demotion.").option("--output-format <format>", "text (default) or json", "text").action((opts) => {
13791
+ const projectRoot = process.cwd();
13792
+ const m = readAcceptanceMetrics(projectRoot);
13793
+ const precision = computePrecision(m);
13794
+ const recall = computeRecall(m);
13795
+ const demotion = readGateState(projectRoot);
13796
+ if (opts.outputFormat === "json") {
13797
+ const output = buildJsonOutput("substrate acceptance status", {
13798
+ verdict_precision: precision,
13799
+ canary_recall: recall,
13800
+ total_fails: m.total_fails,
13801
+ overrides: m.overrides.length,
13802
+ canaries: {
13803
+ planted: m.canaries_planted,
13804
+ caught: m.canaries_caught
13805
+ },
13806
+ demoted: demotion?.demoted ?? false,
13807
+ demotion: demotion ?? null
13808
+ }, version);
13809
+ process.stdout.write(JSON.stringify(output, null, 2) + "\n");
13810
+ process.exit(ACCEPTANCE_EXIT_SUCCESS);
13811
+ }
13812
+ process.stdout.write(`acceptance gate health:\n verdict precision: ${precision.toFixed(2)} (${String(Math.max(0, m.total_fails - m.overrides.length))} confirmed / ${String(m.total_fails)} blocks, ${String(m.overrides.length)} overrides)\n canary recall: ${recall.toFixed(2)} (${String(m.canaries_caught)} caught / ${String(m.canaries_planted)} planted)\n status: ${demotion?.demoted === true ? `DEMOTED to advisory — ${demotion.reason} (${demotion.detail ?? ""}), since ${demotion.since}` : "trusted (blocking authority intact)"}\n`);
13813
+ process.exit(ACCEPTANCE_EXIT_SUCCESS);
13814
+ });
13663
13815
  }
13664
13816
 
13665
13817
  //#endregion
@@ -13736,8 +13888,8 @@ async function createProgram() {
13736
13888
  /** Fire-and-forget startup version check (story 8.3, AC3/AC5) */
13737
13889
  function checkForUpdatesInBackground(currentVersion) {
13738
13890
  if (process.env.SUBSTRATE_NO_UPDATE_CHECK === "1") return;
13739
- import("../upgrade-Cryksfvg.js").then(async () => {
13740
- const { createVersionManager } = await import("../version-manager-impl-DSK9i3Xk.js");
13891
+ import("../upgrade-BoSsIewI.js").then(async () => {
13892
+ const { createVersionManager } = await import("../version-manager-impl-B9VDdCKb.js");
13741
13893
  const vm = createVersionManager();
13742
13894
  const result = await vm.checkForUpdates();
13743
13895
  if (result.updateAvailable) {
@@ -96,4 +96,4 @@ function deriveExitCode(outcome) {
96
96
 
97
97
  //#endregion
98
98
  export { DECISION_SEVERITY_MAP, deriveExitCode, routeDecision };
99
- //# sourceMappingURL=decision-router-BAPpON_C.js.map
99
+ //# sourceMappingURL=decision-router-Dyby0fUf.js.map
@@ -1,4 +1,4 @@
1
- import { addTokenUsage, createDecision, createPipelineRun, createRequirement, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunningPipelineRuns, getTokenUsageSummary, listRequirements, registerArtifact, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision } from "./dist-CO4BbTu3.js";
2
- import "./decisions-CzSIEeGP.js";
1
+ import { addTokenUsage, createDecision, createPipelineRun, createRequirement, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunningPipelineRuns, getTokenUsageSummary, listRequirements, registerArtifact, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision } from "./dist-BZGqn-XQ.js";
2
+ import "./decisions-BAaxpVD0.js";
3
3
 
4
4
  export { getLatestRun };
@@ -6349,7 +6349,8 @@ const SubstrateConfigSchema = z.object({
6349
6349
  "advisory",
6350
6350
  "blocking"
6351
6351
  ]).optional(),
6352
- critical_pass_finalization: z.enum(["branch", "pr"]).optional()
6352
+ critical_pass_finalization: z.enum(["branch", "pr"]).optional(),
6353
+ precision_floor: z.number().min(0).max(1).optional()
6353
6354
  }).strict().optional()
6354
6355
  }).passthrough();
6355
6356
  const PartialProviderConfigSchema = ProviderConfigSchema.partial();
@@ -6384,7 +6385,8 @@ const PartialSubstrateConfigSchema = z.object({
6384
6385
  "advisory",
6385
6386
  "blocking"
6386
6387
  ]).optional(),
6387
- critical_pass_finalization: z.enum(["branch", "pr"]).optional()
6388
+ critical_pass_finalization: z.enum(["branch", "pr"]).optional(),
6389
+ precision_floor: z.number().min(0).max(1).optional()
6388
6390
  }).strict().optional()
6389
6391
  }).passthrough();
6390
6392
 
@@ -12645,4 +12647,4 @@ async function callLLM(params) {
12645
12647
 
12646
12648
  //#endregion
12647
12649
  export { ADVISORY_NOTES, AdapterRegistry, AdtError, BRANCH_PREFIX, BudgetConfigSchema, CLAUDE_AUTH_FAILURE_HINT, CODEX_SANDBOX_BLOCK_HINT, CURRENT_CONFIG_FORMAT_VERSION, CURRENT_TASK_GRAPH_VERSION, Categorizer, ClaudeCodeAdapter, CodexCLIAdapter, ConfigError, ConfigIncompatibleFormatError, ConsumerAnalyzer, CostTrackerConfigSchema, DEFAULT_CONFIG, DEFAULT_GLOBAL_SETTINGS, DispatcherImpl, DoltClient, DoltNotInstalled, DoltQueryError, ESCALATION_DIAGNOSIS, EXPERIMENT_RESULT, EfficiencyScorer, GeminiCLIAdapter, GlobalSettingsSchema, InMemoryDatabaseAdapter, IngestionServer, LEARNING_FINDING, LogTurnAnalyzer, ModelRoutingConfigSchema, MonitorDatabaseImpl, OPERATIONAL_FINDING, PartialGlobalSettingsSchema, PartialProviderConfigSchema, ProviderPolicySchema, ProvidersSchema, Recommender, RoutingConfigError, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, STORY_METRICS, STORY_OUTCOME, SubstrateConfigSchema, TASK_TYPE_PHASE_MAP, TEST_EXPANSION_FINDING, TEST_PLAN, TelemetryConfigSchema, TelemetryNormalizer, TelemetryPipeline, TurnAnalyzer, VersionManagerImpl, addTokenUsage, aggregateTokenUsageForRun, aggregateTokenUsageForStory, buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, callLLM, checkDoltInstalled, classifyVersionGap, compareRunMetrics, createAmendmentRun, createConfigSystem, createDatabaseAdapter as createDatabaseAdapter$1, createDecision, createExperimenter, createGitWorktreeManager, createPipelineRun, createRequirement, createStderrLogger, createVersionManager, detectClaudeAuthFailure, detectCodexSandboxBlock, detectInterfaceChanges, determineVerdict, getActiveDecisions, getAllCostEntriesFiltered, getArtifactByTypeForRun, getArtifactsByRun, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getModelTier, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initWorkGraphSchema, initializeDolt, listRequirements, listRunMetrics, loadModelRoutingConfig, loadParentRunDecisions, registerArtifact, resolvePromptFile, supersedeDecision, swallowDebug, tagRunAsBaseline, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics };
12648
- //# sourceMappingURL=dist-CO4BbTu3.js.map
12650
+ //# sourceMappingURL=dist-BZGqn-XQ.js.map
@@ -1,4 +1,4 @@
1
- import { AdtError } from "./dist-CO4BbTu3.js";
1
+ import { AdtError } from "./dist-BZGqn-XQ.js";
2
2
 
3
3
  //#region src/core/errors.ts
4
4
  /** Error thrown when task configuration is invalid */
@@ -71,4 +71,4 @@ var TaskGraphIncompatibleFormatError = class extends AdtError {
71
71
 
72
72
  //#endregion
73
73
  export { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError };
74
- //# sourceMappingURL=errors-0OA2nge4.js.map
74
+ //# sourceMappingURL=errors-xSeGw6pf.js.map
@@ -1,3 +1,3 @@
1
- import { buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, createExperimenter, determineVerdict, resolvePromptFile } from "./dist-CO4BbTu3.js";
1
+ import { buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, createExperimenter, determineVerdict, resolvePromptFile } from "./dist-BZGqn-XQ.js";
2
2
 
3
3
  export { createExperimenter };
@@ -0,0 +1,8 @@
1
+ import { DEFAULT_STALL_THRESHOLD_SECONDS, getAllDescendantPids, getAutoHealthData, inspectProcessTree, isOrchestratorProcessLine, registerHealthCommand, runHealthAction } from "./health-B867L-8I.js";
2
+ import "./logger-KeHncl-f.js";
3
+ import "./dist-BZGqn-XQ.js";
4
+ import "./manifest-read-BGzmmY01.js";
5
+ import "./work-graph-repository-4cKsf8Lf.js";
6
+ import "./decisions-BAaxpVD0.js";
7
+
8
+ export { inspectProcessTree };
@@ -1,6 +1,6 @@
1
1
  import { createLogger } from "./logger-KeHncl-f.js";
2
- import { DoltClient, DoltQueryError, createDatabaseAdapter$1 as createDatabaseAdapter, getLatestRun, getPipelineRunById, initSchema } from "./dist-CO4BbTu3.js";
3
- import { resolveMainRepoRoot, resolveRunManifest } from "./manifest-read-B0dsJk2z.js";
2
+ import { DoltClient, DoltQueryError, createDatabaseAdapter$1 as createDatabaseAdapter, getLatestRun, getPipelineRunById, initSchema } from "./dist-BZGqn-XQ.js";
3
+ import { resolveMainRepoRoot, resolveRunManifest } from "./manifest-read-BGzmmY01.js";
4
4
  import { createRequire } from "module";
5
5
  import { dirname, join } from "path";
6
6
  import { existsSync, readFileSync } from "node:fs";
@@ -1000,4 +1000,4 @@ function registerHealthCommand(program, _version = "0.0.0", projectRoot = proces
1000
1000
 
1001
1001
  //#endregion
1002
1002
  export { BMAD_BASELINE_TOKENS_FULL, DEFAULT_STALL_THRESHOLD_SECONDS, FileKvStore, STOP_AFTER_VALID_PHASES, STORY_KEY_PATTERN, SUBSTRATE_OWNED_SETTINGS_KEYS, VALID_PHASES, __commonJS, __require, __toESM, buildPipelineStatusOutput, createDatabaseAdapter$1 as createDatabaseAdapter, createDoltOperatorReader, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, isOrchestratorProcessLine, parseDbTimestampAsUtc, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion, runHealthAction, validateStoryKey };
1003
- //# sourceMappingURL=health-BFucsjla.js.map
1003
+ //# sourceMappingURL=health-B867L-8I.js.map
@@ -324,6 +324,7 @@ declare const SubstrateConfigSchema: z.ZodObject<{
324
324
  branch: "branch";
325
325
  pr: "pr";
326
326
  }>>;
327
+ precision_floor: z.ZodOptional<z.ZodNumber>;
327
328
  }, z.core.$strict>>;
328
329
  }, z.core.$loose>;
329
330
  type SubstrateConfig = z.infer<typeof SubstrateConfigSchema>; //#endregion
@@ -1633,4 +1634,4 @@ interface Recommendation {
1633
1634
 
1634
1635
  //#endregion
1635
1636
  export { AdapterDiscoveryResult, AdapterRegistry as AdapterRegistry$1, AdtError as AdtError$1, ClaudeCodeAdapter as ClaudeCodeAdapter$1, CodexCLIAdapter as CodexCLIAdapter$1, ConfigError as ConfigError$1, ConfigIncompatibleFormatError as ConfigIncompatibleFormatError$1, CoreEvents, DatabaseAdapter, DiscoveryReport, GeminiCLIAdapter as GeminiCLIAdapter$1, Recommendation, TypedEventBus };
1636
- //# sourceMappingURL=index-s7wBSfVT.d.ts.map
1637
+ //# sourceMappingURL=index-Be5MEp2y.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AdapterDiscoveryResult, AdapterRegistry$1 as AdapterRegistry, AdtError$1 as AdtError, ClaudeCodeAdapter$1 as ClaudeCodeAdapter, CodexCLIAdapter$1 as CodexCLIAdapter, ConfigError$1 as ConfigError, ConfigIncompatibleFormatError$1 as ConfigIncompatibleFormatError, DiscoveryReport, GeminiCLIAdapter$1 as GeminiCLIAdapter, Recommendation, TypedEventBus } from "./index-s7wBSfVT.js";
1
+ import { AdapterDiscoveryResult, AdapterRegistry$1 as AdapterRegistry, AdtError$1 as AdtError, ClaudeCodeAdapter$1 as ClaudeCodeAdapter, CodexCLIAdapter$1 as CodexCLIAdapter, ConfigError$1 as ConfigError, ConfigIncompatibleFormatError$1 as ConfigIncompatibleFormatError, DiscoveryReport, GeminiCLIAdapter$1 as GeminiCLIAdapter, Recommendation, TypedEventBus } from "./index-Be5MEp2y.js";
2
2
  import pino from "pino";
3
3
  import { z } from "zod";
4
4
  import { Readable, Writable } from "node:stream";
@@ -260,6 +260,17 @@ interface AcceptanceVerdictEvent {
260
260
  excerpt: string;
261
261
  }[];
262
262
  }
263
+ /** A6.1: canary self-test — did the gate catch a planted (reverted-wiring) regression? */
264
+ interface AcceptanceCanaryEvent {
265
+ type: 'acceptance:canary';
266
+ ts: string;
267
+ journey: string;
268
+ /** true = verdict flipped away from all-PASS (gate caught it); false = MISS. */
269
+ caught: boolean;
270
+ /** true = the canary couldn't run (revert conflict / render error) — not a miss. */
271
+ inconclusive?: boolean;
272
+ detail: string;
273
+ }
263
274
  /**
264
275
  * Emitted when the orchestrator auto-approves a story after exhausting
265
276
  * review cycles with only minor issues remaining. Provides transparency
@@ -893,7 +904,7 @@ interface PipelineMergeConflictDetectedEvent {
893
904
  * }
894
905
  * ```
895
906
  */
896
- type PipelineEvent = PipelineStartEvent | PipelineCompleteEvent | PipelinePreFlightFailureEvent | PipelineProfileStaleEvent | PipelineContractMismatchEvent | PipelineContractVerificationSummaryEvent | StoryPhaseEvent | StoryDoneEvent | StoryCommittedEvent | StoryMergedEvent | StoryFinalizedEvent | AcceptanceCoverageEvent | AcceptanceStartedEvent | AcceptanceRenderedEvent | AcceptanceVerdictEvent | StoryEscalationEvent | StoryWarnEvent | StoryLogEvent | PipelineHeartbeatEvent | StoryStallEvent | StoryZeroDiffEscalationEvent | StoryBuildVerificationFailedEvent | StoryBuildVerificationPassedEvent | StoryInterfaceChangeWarningEvent | StoryMetricsEvent | SupervisorPollEvent | SupervisorKillEvent | SupervisorRestartEvent | SupervisorAbortEvent | SupervisorSummaryEvent | SupervisorAnalysisCompleteEvent | SupervisorAnalysisErrorEvent | SupervisorExperimentStartEvent | SupervisorExperimentSkipEvent | SupervisorExperimentRecommendationsEvent | SupervisorExperimentCompleteEvent | SupervisorExperimentErrorEvent | RoutingModelSelectedEvent | PipelinePhaseStartEvent | PipelinePhaseCompleteEvent | StoryAutoApprovedEvent | VerificationCheckCompleteEvent | VerificationStoryCompleteEvent | CostWarningEvent | CostCeilingReachedEvent | DecisionHaltSkippedNonInteractiveEvent | PipelineMergeConflictDetectedEvent; //#endregion
907
+ type PipelineEvent = PipelineStartEvent | PipelineCompleteEvent | PipelinePreFlightFailureEvent | PipelineProfileStaleEvent | PipelineContractMismatchEvent | PipelineContractVerificationSummaryEvent | StoryPhaseEvent | StoryDoneEvent | StoryCommittedEvent | StoryMergedEvent | StoryFinalizedEvent | AcceptanceCoverageEvent | AcceptanceStartedEvent | AcceptanceRenderedEvent | AcceptanceVerdictEvent | AcceptanceCanaryEvent | StoryEscalationEvent | StoryWarnEvent | StoryLogEvent | PipelineHeartbeatEvent | StoryStallEvent | StoryZeroDiffEscalationEvent | StoryBuildVerificationFailedEvent | StoryBuildVerificationPassedEvent | StoryInterfaceChangeWarningEvent | StoryMetricsEvent | SupervisorPollEvent | SupervisorKillEvent | SupervisorRestartEvent | SupervisorAbortEvent | SupervisorSummaryEvent | SupervisorAnalysisCompleteEvent | SupervisorAnalysisErrorEvent | SupervisorExperimentStartEvent | SupervisorExperimentSkipEvent | SupervisorExperimentRecommendationsEvent | SupervisorExperimentCompleteEvent | SupervisorExperimentErrorEvent | RoutingModelSelectedEvent | PipelinePhaseStartEvent | PipelinePhaseCompleteEvent | StoryAutoApprovedEvent | VerificationCheckCompleteEvent | VerificationStoryCompleteEvent | CostWarningEvent | CostCeilingReachedEvent | DecisionHaltSkippedNonInteractiveEvent | PipelineMergeConflictDetectedEvent; //#endregion
897
908
  //#region src/core/errors.d.ts
898
909
 
899
910
  /**
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { childLogger, createLogger, logger } from "./logger-KeHncl-f.js";
2
2
  import { assertDefined, createEventBus, createTuiApp, deepClone, formatDuration, generateId, isPlainObject, isTuiCapable, printNonTtyWarning, sleep, withRetry } from "./helpers-CElYrONe.js";
3
- import { AdapterRegistry, AdtError, ClaudeCodeAdapter, CodexCLIAdapter, ConfigError, ConfigIncompatibleFormatError, GeminiCLIAdapter } from "./dist-CO4BbTu3.js";
3
+ import { AdapterRegistry, AdtError, ClaudeCodeAdapter, CodexCLIAdapter, ConfigError, ConfigIncompatibleFormatError, GeminiCLIAdapter } from "./dist-BZGqn-XQ.js";
4
4
  import "./adapter-registry-DXLMTmfD.js";
5
- import { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError } from "./errors-0OA2nge4.js";
5
+ import { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError } from "./errors-xSeGw6pf.js";
6
6
 
7
7
  //#region src/core/di.ts
8
8
  /**
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from "./logger-KeHncl-f.js";
2
- import { readCurrentRunId, resolveMainRepoRoot } from "./manifest-read-B0dsJk2z.js";
2
+ import { readCurrentRunId, resolveMainRepoRoot } from "./manifest-read-BGzmmY01.js";
3
3
  import { join } from "node:path";
4
4
  import { mkdir, readFile, writeFile } from "node:fs/promises";
5
5
  import * as readline from "node:readline";
@@ -180,4 +180,4 @@ async function runInteractivePrompt(decisionContext) {
180
180
 
181
181
  //#endregion
182
182
  export { runInteractivePrompt };
183
- //# sourceMappingURL=interactive-prompt-BqOdHdh8.js.map
183
+ //# sourceMappingURL=interactive-prompt-BvHUcoY4.js.map