substrate-ai 0.20.37 → 0.20.40

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.
@@ -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-BnMsd9hC.js";
1
+ import { addTokenUsage, createDecision, createPipelineRun, createRequirement, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunningPipelineRuns, getTokenUsageSummary, listRequirements, registerArtifact, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision } from "./dist-VcMmfo2w.js";
2
2
  import "./decisions-C0pz9Clx.js";
3
3
 
4
4
  export { getLatestRun };
@@ -11014,5 +11014,5 @@ async function callLLM(params) {
11014
11014
  }
11015
11015
 
11016
11016
  //#endregion
11017
- export { ADVISORY_NOTES, AdapterRegistry, AdtError, BudgetConfigSchema, 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, 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, compareRunMetrics, createAmendmentRun, createConfigSystem, createDatabaseAdapter as createDatabaseAdapter$1, createDecision, createDoltClient, createExperimenter, createPipelineRun, createRequirement, createVersionManager, detectInterfaceChanges, determineVerdict, getActiveDecisions, getAllCostEntriesFiltered, getArtifactByTypeForRun, getArtifactsByRun, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getModelTier, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initializeDolt, listRequirements, listRunMetrics, loadModelRoutingConfig, loadParentRunDecisions, registerArtifact, resolvePromptFile, supersedeDecision, tagRunAsBaseline, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics };
11018
- //# sourceMappingURL=dist-BnMsd9hC.js.map
11017
+ export { ADVISORY_NOTES, AdapterRegistry, AdtError, BudgetConfigSchema, 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, compareRunMetrics, createAmendmentRun, createConfigSystem, createDatabaseAdapter as createDatabaseAdapter$1, createDecision, createDoltClient, createExperimenter, createPipelineRun, createRequirement, createVersionManager, detectInterfaceChanges, determineVerdict, getActiveDecisions, getAllCostEntriesFiltered, getArtifactByTypeForRun, getArtifactsByRun, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getModelTier, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initializeDolt, listRequirements, listRunMetrics, loadModelRoutingConfig, loadParentRunDecisions, registerArtifact, resolvePromptFile, supersedeDecision, tagRunAsBaseline, updateDecision, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics };
11018
+ //# sourceMappingURL=dist-VcMmfo2w.js.map
@@ -1,4 +1,4 @@
1
- import { AdtError } from "./dist-BnMsd9hC.js";
1
+ import { AdtError } from "./dist-VcMmfo2w.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-DSGhhrgv.js.map
74
+ //# sourceMappingURL=errors-CogpxBUg.js.map
@@ -1,3 +1,3 @@
1
- import { buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, createExperimenter, determineVerdict, resolvePromptFile } from "./dist-BnMsd9hC.js";
1
+ import { buildAuditLogEntry, buildBranchName, buildModificationDirective, buildPRBody, buildWorktreePath, createExperimenter, determineVerdict, resolvePromptFile } from "./dist-VcMmfo2w.js";
2
2
 
3
3
  export { createExperimenter };
@@ -1,6 +1,6 @@
1
- import { DEFAULT_STALL_THRESHOLD_SECONDS, getAllDescendantPids, getAutoHealthData, inspectProcessTree, isOrchestratorProcessLine, registerHealthCommand, runHealthAction } from "./health-BAcRfZ4s.js";
1
+ import { DEFAULT_STALL_THRESHOLD_SECONDS, getAllDescendantPids, getAutoHealthData, inspectProcessTree, isOrchestratorProcessLine, registerHealthCommand, runHealthAction } from "./health-qUCPCz1O.js";
2
2
  import "./logger-KeHncl-f.js";
3
- import "./dist-BnMsd9hC.js";
3
+ import "./dist-VcMmfo2w.js";
4
4
  import "./decisions-C0pz9Clx.js";
5
5
 
6
6
  export { inspectProcessTree };
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from "./logger-KeHncl-f.js";
2
- import { DoltClient, DoltQueryError, LEARNING_FINDING, createDatabaseAdapter$1 as createDatabaseAdapter, createDecision, getDecisionsByCategory, getLatestRun, getPipelineRunById, initSchema } from "./dist-BnMsd9hC.js";
2
+ import { DoltClient, DoltQueryError, LEARNING_FINDING, createDatabaseAdapter$1 as createDatabaseAdapter, createDecision, getDecisionsByCategory, getLatestRun, getPipelineRunById, initSchema } from "./dist-VcMmfo2w.js";
3
3
  import { createRequire } from "module";
4
4
  import { dirname, join } from "path";
5
5
  import { readFile } from "fs/promises";
@@ -4508,10 +4508,90 @@ function computeTakenOptionPerGroup(hardClauses, workingDir) {
4508
4508
  * 3. The presence of `## Runtime Probes` heading followed by a fenced yaml block
4509
4509
  * (represented as a single "runtime-probes-section" clause)
4510
4510
  */
4511
+ /**
4512
+ * Negation phrases that mark a paragraph as "the paths in this paragraph
4513
+ * are references the dev should NOT deliver/modify". When any of these
4514
+ * phrases appears in a paragraph, every path-clause in that paragraph is
4515
+ * tagged `negation: true` so the verification emit routes them to the
4516
+ * info-severity `source-ac-negation-reference` finding instead of the
4517
+ * under-delivery error path.
4518
+ *
4519
+ * Strata Run 16 (Story 1-16, 2026-04-27): the AC contained
4520
+ *
4521
+ * "the existing test scaffolding is documented (NOT replaced):
4522
+ * `packages/memory` already uses vitest (Story 1.8+);
4523
+ * `packages/memory-mcp` already uses pytest (Story 1.10+); ...
4524
+ * 1.16 does NOT replace or rewrite existing test infrastructure."
4525
+ *
4526
+ * Substrate emitted 6 ERROR-level under-delivery findings on the listed
4527
+ * paths; the dev had correctly NOT modified them. The flood of
4528
+ * false-positive ERRORs masked a real WARN about the missing `## Runtime
4529
+ * Probes` section (which itself would have surfaced two real defects in
4530
+ * the delivery). Detecting the negation context up-front separates the
4531
+ * legitimate "paths the AC mentions but the dev should not modify" case
4532
+ * from genuine under-delivery.
4533
+ *
4534
+ * Patterns are case-sensitive on the keyword (NOT, MUST NOT, gitignored)
4535
+ * because lowercased forms are common in non-imperative prose ("not
4536
+ * really" / "must not exceed" appear in unrelated contexts and
4537
+ * over-trigger). The strata observation enumerates the canonical forms.
4538
+ */
4539
+ const NEGATION_PHRASE_PATTERNS = [
4540
+ /\(NOT\s+\w+/,
4541
+ /documented\s*\(NOT/i,
4542
+ /\bMUST\s+NOT\b|\bSHALL\s+NOT\b/,
4543
+ /\bdo(?:es)?\s+NOT\s+\w+/,
4544
+ /\bdeferred\s+to\b/i,
4545
+ /\b(?:is|are)\s+gitignored\b/i
4546
+ ];
4547
+ /**
4548
+ * Find all line indices that fall within a negation context. The scope of
4549
+ * a single negation context is the line that contains the negation phrase
4550
+ * PLUS any markdown indented-continuation lines following it (so a bullet
4551
+ * that wraps onto multiple indented lines is treated as one logical unit).
4552
+ *
4553
+ * The continuation walk stops at the first of: blank line, next markdown
4554
+ * bullet (`- `, `* `, numbered list), or any non-indented non-blank line.
4555
+ *
4556
+ * Coarser scopes (e.g., paragraph-wide aggregation) over-triggered on
4557
+ * test fixtures like:
4558
+ *
4559
+ * The implementation MUST validate input.
4560
+ * The system MUST NOT skip authentication.
4561
+ * Files SHALL be placed in `src/auth/validator.ts`.
4562
+ *
4563
+ * — three independent statements wrapped without blank-line separators.
4564
+ * The "MUST NOT" on line 2 should not mark the unrelated path on line 3
4565
+ * as a negation reference. Only the bullet's CONTINUATION-LINE structure
4566
+ * constitutes "the same logical reference unit" as the negation phrase.
4567
+ */
4568
+ function detectNegationContextLines(lines) {
4569
+ const result = new Set();
4570
+ for (let i = 0; i < lines.length; i++) {
4571
+ const line = lines[i] ?? "";
4572
+ if (NEGATION_PHRASE_PATTERNS.some((pat) => pat.test(line))) {
4573
+ result.add(i);
4574
+ let j = i + 1;
4575
+ while (j < lines.length) {
4576
+ const next = lines[j] ?? "";
4577
+ if (next.trim() === "") break;
4578
+ if (/^\s*(?:-|\*|\d+\.)\s+/.test(next)) break;
4579
+ if (/^\s+\S/.test(next)) {
4580
+ result.add(j);
4581
+ j++;
4582
+ continue;
4583
+ }
4584
+ break;
4585
+ }
4586
+ }
4587
+ }
4588
+ return result;
4589
+ }
4511
4590
  function extractHardClauses(sectionContent) {
4512
4591
  const clauses = [];
4513
4592
  const lines = sectionContent.split("\n");
4514
4593
  const alternativeOptions = detectAlternativeOptions(lines);
4594
+ const negationContextLines = detectNegationContextLines(lines);
4515
4595
  const mustPattern = /\b(MUST NOT|MUST|SHALL NOT|SHALL)\b/;
4516
4596
  for (const line of lines) {
4517
4597
  const match = mustPattern.exec(line);
@@ -4530,10 +4610,12 @@ function extractHardClauses(sectionContent) {
4530
4610
  let pathMatch;
4531
4611
  while ((pathMatch = pathPattern.exec(line)) !== null) {
4532
4612
  const alt = findOptionForLine(lineIdx, alternativeOptions);
4613
+ const inNegation = negationContextLines.has(lineIdx);
4533
4614
  clauses.push({
4534
4615
  type: "path",
4535
4616
  text: `\`${pathMatch[1]}\``,
4536
- ...alt ? { alternative: alt } : {}
4617
+ ...alt ? { alternative: alt } : {},
4618
+ ...inNegation ? { negation: true } : {}
4537
4619
  });
4538
4620
  }
4539
4621
  }
@@ -4583,15 +4665,24 @@ var SourceAcFidelityCheck = class {
4583
4665
  for (const clause of hardClauses) if (clause.type === "runtime-probes-section") {
4584
4666
  if (!storyContent.includes("## Runtime Probes")) {
4585
4667
  const truncated = clause.text.length > 120 ? clause.text.slice(0, 120) : clause.text;
4668
+ const isEventDrivenAc = detectsEventDrivenAC(context.sourceEpicContent);
4586
4669
  findings.push({
4587
4670
  category: "source-ac-drift",
4588
- severity: "warn",
4589
- message: `runtime-probes-section: "${truncated}" present in epics source but absent in story artifact`
4671
+ severity: isEventDrivenAc ? "error" : "warn",
4672
+ message: isEventDrivenAc ? `runtime-probes-section: "${truncated}" present in epics source but absent in story artifact AND source AC is event-driven (probes are required for event-driven ACs — runtime-probes check will skip without the section)` : `runtime-probes-section: "${truncated}" present in epics source but absent in story artifact`
4590
4673
  });
4591
4674
  }
4592
4675
  } else if (!storyContent.includes(clause.text)) {
4593
4676
  const truncated = clause.text.length > 120 ? clause.text.slice(0, 120) : clause.text;
4594
4677
  if (clause.type === "path") {
4678
+ if (clause.negation === true) {
4679
+ findings.push({
4680
+ category: "source-ac-negation-reference",
4681
+ severity: "info",
4682
+ message: `path: "${truncated}" referenced in source AC inside a negation context (e.g., "(NOT replaced)", "MUST NOT", "deferred to", "documented (NOT", "does NOT replace", "is gitignored") — the AC explicitly directed the dev NOT to deliver/modify this path; treated as reference-only, not a deliverable`
4683
+ });
4684
+ continue;
4685
+ }
4595
4686
  if (isOperationalPath(clause.text)) {
4596
4687
  findings.push({
4597
4688
  category: "source-ac-operational-path-reference",
@@ -6344,4 +6435,4 @@ function registerHealthCommand(program, _version = "0.0.0", projectRoot = proces
6344
6435
 
6345
6436
  //#endregion
6346
6437
  export { BMAD_BASELINE_TOKENS_FULL, DEFAULT_STALL_THRESHOLD_SECONDS, DoltMergeConflict, FileStateStore, FindingsInjector, RunManifest, RuntimeProbeListSchema, STOP_AFTER_VALID_PHASES, STORY_KEY_PATTERN$1 as STORY_KEY_PATTERN, SUBSTRATE_OWNED_SETTINGS_KEYS, SupervisorLock, VALID_PHASES, WorkGraphRepository, ZERO_FINDING_COUNTS, __commonJS, __require, __toESM, applyConfigToGraph, buildPipelineStatusOutput, createDatabaseAdapter$1 as createDatabaseAdapter, createDefaultVerificationPipeline, createGraphOrchestrator, createSdlcCodeReviewHandler, createSdlcCreateStoryHandler, createSdlcDevStoryHandler, createSdlcPhaseHandler, createStateStore, detectCycles, detectsEventDrivenAC, extractTargetFilesFromStoryContent, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, isOrchestratorProcessLine, parseDbTimestampAsUtc, parseRuntimeProbes, registerHealthCommand, renderFindings, resolveBmadMethodSrcPath, resolveBmadMethodVersion, resolveGraphPath, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, runHealthAction, validateStoryKey };
6347
- //# sourceMappingURL=health-BAcRfZ4s.js.map
6438
+ //# sourceMappingURL=health-qUCPCz1O.js.map
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-BnMsd9hC.js";
3
+ import { AdapterRegistry, AdtError, ClaudeCodeAdapter, CodexCLIAdapter, ConfigError, ConfigIncompatibleFormatError, GeminiCLIAdapter } from "./dist-VcMmfo2w.js";
4
4
  import "./adapter-registry-DXLMTmfD.js";
5
- import { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError } from "./errors-DSGhhrgv.js";
5
+ import { BudgetExceededError, GitError, RecoveryError, TaskConfigError, TaskGraphCycleError, TaskGraphError, TaskGraphIncompatibleFormatError, WorkerError, WorkerNotFoundError } from "./errors-CogpxBUg.js";
6
6
 
7
7
  //#region src/core/di.ts
8
8
  /**
@@ -1,4 +1,4 @@
1
- import { ModelRoutingConfigSchema, ProviderPolicySchema, RoutingConfigError, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, TASK_TYPE_PHASE_MAP, getModelTier, loadModelRoutingConfig } from "./dist-BnMsd9hC.js";
1
+ import { ModelRoutingConfigSchema, ProviderPolicySchema, RoutingConfigError, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, TASK_TYPE_PHASE_MAP, getModelTier, loadModelRoutingConfig } from "./dist-VcMmfo2w.js";
2
2
  import "./routing-CcBOCuC9.js";
3
3
 
4
4
  export { loadModelRoutingConfig };
@@ -1,8 +1,8 @@
1
- import "./health-BAcRfZ4s.js";
1
+ import "./health-qUCPCz1O.js";
2
2
  import "./logger-KeHncl-f.js";
3
3
  import "./helpers-CElYrONe.js";
4
- import "./dist-BnMsd9hC.js";
5
- import { normalizeGraphSummaryToStatus, registerRunCommand, resolveMaxReviewCycles, runRunAction, wireNdjsonEmitter } from "./run-YBY2vrF4.js";
4
+ import "./dist-VcMmfo2w.js";
5
+ import { normalizeGraphSummaryToStatus, registerRunCommand, resolveMaxReviewCycles, runRunAction, wireNdjsonEmitter } from "./run-Dhxrf7Nj.js";
6
6
  import "./routing-CcBOCuC9.js";
7
7
  import "./decisions-C0pz9Clx.js";
8
8
 
@@ -1,7 +1,7 @@
1
- import { BMAD_BASELINE_TOKENS_FULL, DoltMergeConflict, FileStateStore, FindingsInjector, RunManifest, RuntimeProbeListSchema, STOP_AFTER_VALID_PHASES, STORY_KEY_PATTERN, VALID_PHASES, WorkGraphRepository, __commonJS, __require, __toESM, applyConfigToGraph, buildPipelineStatusOutput, createDatabaseAdapter, createDefaultVerificationPipeline, createGraphOrchestrator, createSdlcCodeReviewHandler, createSdlcCreateStoryHandler, createSdlcDevStoryHandler, createSdlcPhaseHandler, detectCycles, detectsEventDrivenAC, extractTargetFilesFromStoryContent, formatOutput, formatPipelineSummary, formatTokenTelemetry, inspectProcessTree, parseDbTimestampAsUtc, renderFindings, resolveGraphPath, resolveMainRepoRoot, validateStoryKey } from "./health-BAcRfZ4s.js";
1
+ import { BMAD_BASELINE_TOKENS_FULL, DoltMergeConflict, FileStateStore, FindingsInjector, RunManifest, RuntimeProbeListSchema, STOP_AFTER_VALID_PHASES, STORY_KEY_PATTERN, VALID_PHASES, WorkGraphRepository, __commonJS, __require, __toESM, applyConfigToGraph, buildPipelineStatusOutput, createDatabaseAdapter, createDefaultVerificationPipeline, createGraphOrchestrator, createSdlcCodeReviewHandler, createSdlcCreateStoryHandler, createSdlcDevStoryHandler, createSdlcPhaseHandler, detectCycles, detectsEventDrivenAC, extractTargetFilesFromStoryContent, formatOutput, formatPipelineSummary, formatTokenTelemetry, inspectProcessTree, parseDbTimestampAsUtc, renderFindings, resolveGraphPath, resolveMainRepoRoot, validateStoryKey } from "./health-qUCPCz1O.js";
2
2
  import { createLogger } from "./logger-KeHncl-f.js";
3
3
  import { TypedEventBusImpl, createEventBus, createTuiApp, isTuiCapable, printNonTtyWarning, sleep } from "./helpers-CElYrONe.js";
4
- import { ADVISORY_NOTES, Categorizer, ConsumerAnalyzer, DEFAULT_GLOBAL_SETTINGS, DispatcherImpl, DoltClient, ESCALATION_DIAGNOSIS, EXPERIMENT_RESULT, EfficiencyScorer, IngestionServer, LogTurnAnalyzer, OPERATIONAL_FINDING, Recommender, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, STORY_METRICS, STORY_OUTCOME, SubstrateConfigSchema, TEST_EXPANSION_FINDING, TEST_PLAN, TelemetryNormalizer, TelemetryPipeline, TurnAnalyzer, addTokenUsage, aggregateTokenUsageForRun, aggregateTokenUsageForStory, callLLM, createConfigSystem, createDatabaseAdapter$1, createDecision, createPipelineRun, createRequirement, detectInterfaceChanges, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunMetrics, getRunningPipelineRuns, getStoryMetricsForRun, getTokenUsageSummary, initSchema, listRequirements, loadModelRoutingConfig, registerArtifact, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics } from "./dist-BnMsd9hC.js";
4
+ import { ADVISORY_NOTES, Categorizer, ConsumerAnalyzer, DEFAULT_GLOBAL_SETTINGS, DispatcherImpl, DoltClient, ESCALATION_DIAGNOSIS, EXPERIMENT_RESULT, EfficiencyScorer, IngestionServer, LogTurnAnalyzer, OPERATIONAL_FINDING, Recommender, RoutingRecommender, RoutingResolver, RoutingTelemetry, RoutingTokenAccumulator, RoutingTuner, STORY_METRICS, STORY_OUTCOME, SubstrateConfigSchema, TEST_EXPANSION_FINDING, TEST_PLAN, TelemetryNormalizer, TelemetryPipeline, TurnAnalyzer, addTokenUsage, aggregateTokenUsageForRun, aggregateTokenUsageForStory, callLLM, createConfigSystem, createDatabaseAdapter$1, createDecision, createPipelineRun, createRequirement, detectInterfaceChanges, getArtifactByTypeForRun, getArtifactsByRun, getDecisionsByCategory, getDecisionsByPhase, getDecisionsByPhaseForRun, getLatestRun, getPipelineRunById, getRunMetrics, getRunningPipelineRuns, getStoryMetricsForRun, getTokenUsageSummary, initSchema, listRequirements, loadModelRoutingConfig, registerArtifact, updatePipelineRun, updatePipelineRunConfig, upsertDecision, writeRunMetrics, writeStoryMetrics } from "./dist-VcMmfo2w.js";
5
5
  import { basename, dirname, extname, join } from "path";
6
6
  import { access, readFile, readdir, stat } from "fs/promises";
7
7
  import { EventEmitter } from "node:events";
@@ -4848,7 +4848,7 @@ function createDispatcher(options) {
4848
4848
  },
4849
4849
  routingResolver: options.config?.routingResolver ?? void 0
4850
4850
  };
4851
- return new DispatcherImpl(options.eventBus, options.adapterRegistry, config);
4851
+ return new DispatcherImpl(options.eventBus, options.adapterRegistry, config, ...options.logger !== void 0 ? [options.logger] : []);
4852
4852
  }
4853
4853
  /**
4854
4854
  * Detect the package manager / build system used in a project.
@@ -8346,19 +8346,19 @@ const TIMEOUT_RETRY_MULTIPLIER = 1.5;
8346
8346
  */
8347
8347
  async function runProbeAuthor(deps, params) {
8348
8348
  const start = Date.now();
8349
- const { storyKey, storyFilePath, pipelineRunId, sourceAcContent, epicContent, emitEvent } = params;
8349
+ const { storyKey, storyFilePath, pipelineRunId, sourceAcContent, epicContent, emitEvent, bypassGates } = params;
8350
8350
  const tokenUsage = {
8351
8351
  input: 0,
8352
8352
  output: 0
8353
8353
  };
8354
- if (!detectsEventDrivenAC(epicContent)) {
8354
+ if (bypassGates !== true && !detectsEventDrivenAC(epicContent)) {
8355
8355
  logger$14.debug({ storyKey }, "probe-author: source AC not event-driven — skipping");
8356
8356
  return makeSkippedResult(tokenUsage, start);
8357
8357
  }
8358
8358
  let storyContent;
8359
8359
  try {
8360
8360
  storyContent = await readFile$1(storyFilePath, "utf-8");
8361
- if (/^## Runtime Probes/m.test(storyContent)) {
8361
+ if (bypassGates !== true && /^## Runtime Probes/m.test(storyContent)) {
8362
8362
  logger$14.info({ storyKey }, "probe-author: story artifact already has ## Runtime Probes — skipping");
8363
8363
  return makeSkippedResult(tokenUsage, start);
8364
8364
  }
@@ -45150,5 +45150,5 @@ function registerRunCommand(program, _version = "0.0.0", projectRoot = process.c
45150
45150
  }
45151
45151
 
45152
45152
  //#endregion
45153
- export { AdapterTelemetryPersistence, AppError, DoltRepoMapMetaRepository, DoltSymbolRepository, ERR_REPO_MAP_STORAGE_WRITE, EpicIngester, GitClient, GrammarLoader, RepoMapInjector, RepoMapModule, RepoMapQueryEngine, RepoMapStorage, SymbolParser, createContextCompiler, createDispatcher, createEventEmitter, createImplementationOrchestrator, createPackLoader, createPhaseOrchestrator, createStopAfterGate, createTelemetryAdvisor, formatPhaseCompletionSummary, getFactoryRunSummaries, getScenarioResultsForRun, getTwinRunsForRun, listGraphRuns, normalizeGraphSummaryToStatus, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveMaxReviewCycles, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runRunAction, runSolutioningPhase, validateStopAfterFromConflict, wireNdjsonEmitter };
45154
- //# sourceMappingURL=run-YBY2vrF4.js.map
45153
+ export { AdapterTelemetryPersistence, AppError, DoltRepoMapMetaRepository, DoltSymbolRepository, ERR_REPO_MAP_STORAGE_WRITE, EpicIngester, GitClient, GrammarLoader, RepoMapInjector, RepoMapModule, RepoMapQueryEngine, RepoMapStorage, SymbolParser, createContextCompiler, createDispatcher, createEventEmitter, createImplementationOrchestrator, createPackLoader, createPhaseOrchestrator, createStopAfterGate, createTelemetryAdvisor, formatPhaseCompletionSummary, getFactoryRunSummaries, getScenarioResultsForRun, getTwinRunsForRun, listGraphRuns, normalizeGraphSummaryToStatus, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveMaxReviewCycles, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runRunAction, runSolutioningPhase, validateStopAfterFromConflict, wireNdjsonEmitter };
45154
+ //# sourceMappingURL=run-Dhxrf7Nj.js.map
@@ -1,4 +1,4 @@
1
- import { createVersionManager } from "./dist-BnMsd9hC.js";
1
+ import { createVersionManager } from "./dist-VcMmfo2w.js";
2
2
  import { execSync, spawn } from "child_process";
3
3
  import * as readline from "readline";
4
4
 
@@ -123,4 +123,4 @@ function registerUpgradeCommand(program) {
123
123
 
124
124
  //#endregion
125
125
  export { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand };
126
- //# sourceMappingURL=upgrade-D3NuTkSL.js.map
126
+ //# sourceMappingURL=upgrade-CF4__LCr.js.map
@@ -1,5 +1,5 @@
1
- import "./dist-BnMsd9hC.js";
1
+ import "./dist-VcMmfo2w.js";
2
2
  import "./version-manager-impl-BmOWu8ml.js";
3
- import { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand } from "./upgrade-D3NuTkSL.js";
3
+ import { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand } from "./upgrade-CF4__LCr.js";
4
4
 
5
5
  export { isGlobalInstall, registerUpgradeCommand, runUpgradeCommand };
@@ -1,4 +1,4 @@
1
- import { VersionManagerImpl, createVersionManager } from "./dist-BnMsd9hC.js";
1
+ import { VersionManagerImpl, createVersionManager } from "./dist-VcMmfo2w.js";
2
2
  import "./version-manager-impl-BmOWu8ml.js";
3
3
 
4
4
  export { createVersionManager };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "substrate-ai",
3
- "version": "0.20.37",
3
+ "version": "0.20.40",
4
4
  "description": "Substrate — multi-agent orchestration daemon for AI coding agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -224,6 +224,12 @@ prompts:
224
224
  # Test plan prompt (Story 25-7)
225
225
  test-plan: prompts/test-plan.md
226
226
  test-expansion: prompts/test-expansion.md
227
+ # Probe-author phase (Epic 60 Phase 2 — Story 60-12; manifest registration
228
+ # repaired in v0.20.38 / Story 60-14g after the eval harness surfaced that
229
+ # `pack.getPrompt('probe-author')` had been throwing since Sprint 13,
230
+ # causing runProbeAuthor to silently return template_load_failed in every
231
+ # production dispatch).
232
+ probe-author: prompts/probe-author.md
227
233
 
228
234
  constraints:
229
235
  create-story: constraints/create-story.yaml
@@ -142,13 +142,27 @@ Author runtime probes for the story described above. Use the AC sections provide
142
142
 
143
143
  ## Output Contract
144
144
 
145
- Emit a single `yaml` fenced block containing a list of probes conforming to `RuntimeProbeListSchema`. The list may be empty (`[]`) if the story has no runtime-testable behaviors (e.g., pure TypeScript types or test-only stories). Do not emit any other content after the yaml block.
145
+ Emit a single `yaml` fenced block containing **TWO TOP-LEVEL FIELDS**:
146
+
147
+ 1. `result: success` (when probes were authored) or `result: failed` (when no useful probes could be derived from the AC — empty `probes:` list expected)
148
+ 2. `probes:` — a list of probe entries conforming to `RuntimeProbeListSchema`
149
+
150
+ Do not emit any other content after the yaml block. Do not emit a bare list at the YAML root — the parser requires the `result` + `probes` envelope.
146
151
 
147
152
  ```yaml
148
- - name: example-probe
149
- sandbox: host
150
- command: echo "hello world"
151
- expect_stdout_regex:
152
- - 'hello world'
153
- description: example probe showing output contract shape
153
+ result: success
154
+ probes:
155
+ - name: example-probe
156
+ sandbox: host
157
+ command: echo "hello world"
158
+ expect_stdout_regex:
159
+ - 'hello world'
160
+ description: example probe showing output contract shape
161
+ ```
162
+
163
+ When the AC has no runtime-testable behaviors (e.g., pure TypeScript types or test-only stories), emit:
164
+
165
+ ```yaml
166
+ result: success
167
+ probes: []
154
168
  ```
@@ -1,4 +0,0 @@
1
- import { AdapterRegistry } from "./dist-BnMsd9hC.js";
2
- import "./adapter-registry-DXLMTmfD.js";
3
-
4
- export { AdapterRegistry };