substrate-ai 0.20.43 → 0.20.45

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/dist/cli/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { FileStateStore, RunManifest, SUBSTRATE_OWNED_SETTINGS_KEYS, SupervisorLock, VALID_PHASES, WorkGraphRepository, ZERO_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, aggregateProbeAuthorMetrics, buildPipelineStatusOutput, createDatabaseAdapter, createStateStore, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, parseDbTimestampAsUtc, parseRuntimeProbes, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, rollupFindingsByAuthor, rollupProbeAuthorMetrics } from "../health-BZ1WtrLT.js";
2
+ import { FileStateStore, RunManifest, SUBSTRATE_OWNED_SETTINGS_KEYS, SupervisorLock, VALID_PHASES, WorkGraphRepository, ZERO_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, aggregateProbeAuthorMetrics, buildPipelineStatusOutput, createDatabaseAdapter, createStateStore, findPackageRoot, formatOutput, formatPipelineStatusHuman, formatPipelineSummary, formatTokenTelemetry, getAllDescendantPids, getAutoHealthData, getSubstrateDefaultSettings, inspectProcessTree, parseDbTimestampAsUtc, parseRuntimeProbes, registerHealthCommand, resolveBmadMethodSrcPath, resolveBmadMethodVersion, resolveMainRepoRoot, resolveRunManifest, rollupFindingCounts, rollupFindingsByAuthor, rollupProbeAuthorMetrics } from "../health-BV-rzjf7.js";
3
3
  import { createLogger } from "../logger-KeHncl-f.js";
4
4
  import { createEventBus } from "../helpers-CElYrONe.js";
5
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, createDoltClient, createPipelineRun, getActiveDecisions, getAllCostEntriesFiltered, getBaselineRunMetrics, getDecisionsByCategory, getDecisionsByPhaseForRun, getLatestCompletedRun, getLatestRun, getPipelineRunById, getPlanningCostTotal, getRetryableEscalations, getRunMetrics, getRunningPipelineRuns, getSessionCostSummary, getSessionCostSummaryFiltered, getStoryMetricsForRun, getTokenUsageSummary, incrementRunRestarts, initSchema, initializeDolt, listRunMetrics, loadParentRunDecisions, supersedeDecision, tagRunAsBaseline, updatePipelineRun } from "../dist-VcMmfo2w.js";
6
6
  import "../adapter-registry-DXLMTmfD.js";
7
- import { 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, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runSolutioningPhase, validateStopAfterFromConflict } from "../run-CEVH9qJy.js";
7
+ import { 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, registerExportCommand, registerFactoryCommand, registerRunCommand, registerScenariosCommand, resolveStoryKeys, runAnalysisPhase, runPlanningPhase, runProbeAuthor, runSolutioningPhase, validateStopAfterFromConflict } from "../run-BWUZK6bP.js";
8
8
  import "../errors-CogpxBUg.js";
9
9
  import "../routing-CcBOCuC9.js";
10
10
  import "../decisions-C0pz9Clx.js";
@@ -3667,7 +3667,7 @@ async function runStatusAction(options) {
3667
3667
  logger$13.debug({ err }, "Work graph query failed, continuing without work graph data");
3668
3668
  }
3669
3669
  if (run === void 0) {
3670
- const { inspectProcessTree: inspectProcessTree$1 } = await import("../health-CP3c3Imm.js");
3670
+ const { inspectProcessTree: inspectProcessTree$1 } = await import("../health-DQrsmYTt.js");
3671
3671
  const substrateDirPath = join(projectRoot, ".substrate");
3672
3672
  const processInfo = inspectProcessTree$1({
3673
3673
  projectRoot,
@@ -5204,7 +5204,7 @@ async function runSupervisorAction(options, deps = {}) {
5204
5204
  await initSchema(expAdapter);
5205
5205
  const { runRunAction: runPipeline } = await import(
5206
5206
  /* @vite-ignore */
5207
- "../run-DRElMHQ7.js"
5207
+ "../run-DRhwVUur.js"
5208
5208
  );
5209
5209
  const runStoryFn = async (opts) => {
5210
5210
  const exitCode = await runPipeline({
@@ -4661,11 +4661,81 @@ function detectNegationContextLines(lines) {
4661
4661
  }
4662
4662
  return result;
4663
4663
  }
4664
+ /**
4665
+ * obs_2026-05-02_020: dependency-context phrase patterns. When any of these
4666
+ * patterns appears on a line (or its indented continuation), every backtick-
4667
+ * wrapped path on the same line is tagged `dependency: true`. The phrases
4668
+ * indicate the AC is naming the path as an architectural integration point
4669
+ * (a peer package the implementation imports from, a service the code
4670
+ * queries, etc.) — NOT as a positive-delivery requirement.
4671
+ *
4672
+ * Strata Run 19 / Story 2-7 (2026-05-02): the AC said
4673
+ *
4674
+ * "publishes a `MorningBriefing` mesh record via `packages/mesh-agent`'s
4675
+ * outbox using the existing `MeshClient` surface"
4676
+ *
4677
+ * The implementation correctly imported `MeshClient` from
4678
+ * `@jplanow/agent-mesh` and called the existing publish surface, but
4679
+ * `pathReferencedInModifiedFiles` (Story 60-3, v0.20.23) couldn't match the
4680
+ * AC's `packages/mesh-agent` token against the package's `@jplanow/agent-mesh`
4681
+ * import path (the words `mesh` and `agent` are reordered between directory
4682
+ * name and package name). The check fired ERROR-level under-delivery and
4683
+ * VERIFICATION_FAILED'd a story whose code was correct.
4684
+ *
4685
+ * Patterns are anchored to backtick-wrapped paths to keep the trigger tight.
4686
+ * Bare prose like "uses the existing surface" or "from yesterday's run"
4687
+ * doesn't fire — only references where the path appears in backticks under
4688
+ * an explicit dependency-context preposition / verb.
4689
+ *
4690
+ * Coverage shapes (each must precede a backtick-wrapped path on the same line):
4691
+ * - `via \`X\`` / `via \`X\`'s ...` — Story 2-7 exact shape
4692
+ * - `imports? from \`X\`` — explicit import statement
4693
+ * - `consumes \`X\`` — skill / queue consumption
4694
+ * - `built atop \`X\`` — architectural foundation
4695
+ * - `\`X\`-shipped` — back-reference to a peer story's package
4696
+ * - `using \`X\`` — when AC narrates "using <package>'s API"
4697
+ */
4698
+ const DEPENDENCY_CONTEXT_PHRASE_PATTERNS = [
4699
+ /\bvia\s+`[^`]+`/i,
4700
+ /\bimports?\s+from\s+`[^`]+`/i,
4701
+ /\bconsumes\s+`[^`]+`/i,
4702
+ /\bbuilt\s+(?:atop|on\s+top\s+of)\s+`[^`]+`/i,
4703
+ /`[^`]+`-shipped/i,
4704
+ /\busing\s+`[^`]+`['']s/i
4705
+ ];
4706
+ /**
4707
+ * Find all line indices that fall within a dependency context. Mirrors the
4708
+ * `detectNegationContextLines` shape exactly (same continuation walk: the
4709
+ * dependency-phrase line plus indented non-bullet continuation lines).
4710
+ */
4711
+ function detectDependencyContextLines(lines) {
4712
+ const result = new Set();
4713
+ for (let i = 0; i < lines.length; i++) {
4714
+ const line = lines[i] ?? "";
4715
+ if (DEPENDENCY_CONTEXT_PHRASE_PATTERNS.some((pat) => pat.test(line))) {
4716
+ result.add(i);
4717
+ let j = i + 1;
4718
+ while (j < lines.length) {
4719
+ const next = lines[j] ?? "";
4720
+ if (next.trim() === "") break;
4721
+ if (/^\s*(?:-|\*|\d+\.)\s+/.test(next)) break;
4722
+ if (/^\s+\S/.test(next)) {
4723
+ result.add(j);
4724
+ j++;
4725
+ continue;
4726
+ }
4727
+ break;
4728
+ }
4729
+ }
4730
+ }
4731
+ return result;
4732
+ }
4664
4733
  function extractHardClauses(sectionContent) {
4665
4734
  const clauses = [];
4666
4735
  const lines = sectionContent.split("\n");
4667
4736
  const alternativeOptions = detectAlternativeOptions(lines);
4668
4737
  const negationContextLines = detectNegationContextLines(lines);
4738
+ const dependencyContextLines = detectDependencyContextLines(lines);
4669
4739
  const mustPattern = /\b(MUST NOT|MUST|SHALL NOT|SHALL)\b/;
4670
4740
  for (const line of lines) {
4671
4741
  const match = mustPattern.exec(line);
@@ -4685,11 +4755,13 @@ function extractHardClauses(sectionContent) {
4685
4755
  while ((pathMatch = pathPattern.exec(line)) !== null) {
4686
4756
  const alt = findOptionForLine(lineIdx, alternativeOptions);
4687
4757
  const inNegation = negationContextLines.has(lineIdx);
4758
+ const inDependency = dependencyContextLines.has(lineIdx);
4688
4759
  clauses.push({
4689
4760
  type: "path",
4690
4761
  text: `\`${pathMatch[1]}\``,
4691
4762
  ...alt ? { alternative: alt } : {},
4692
- ...inNegation ? { negation: true } : {}
4763
+ ...inNegation ? { negation: true } : {},
4764
+ ...inDependency ? { dependency: true } : {}
4693
4765
  });
4694
4766
  }
4695
4767
  }
@@ -4757,6 +4829,14 @@ var SourceAcFidelityCheck = class {
4757
4829
  });
4758
4830
  continue;
4759
4831
  }
4832
+ if (clause.dependency === true) {
4833
+ findings.push({
4834
+ category: "source-ac-dependency-reference",
4835
+ severity: "info",
4836
+ message: `path: "${truncated}" referenced in source AC inside a dependency-context phrase (e.g., "via \`X\`", "via \`X\`'s outbox", "imports from \`X\`", "consumes \`X\`", "built atop \`X\`", "\`X\`-shipped", "using \`X\`'s") — the AC named this path as an architectural integration point the implementation interacts with, not a positive-delivery requirement; treated as reference-only`
4837
+ });
4838
+ continue;
4839
+ }
4760
4840
  if (isOperationalPath(clause.text)) {
4761
4841
  findings.push({
4762
4842
  category: "source-ac-operational-path-reference",
@@ -6700,4 +6780,4 @@ function registerHealthCommand(program, _version = "0.0.0", projectRoot = proces
6700
6780
 
6701
6781
  //#endregion
6702
6782
  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_FINDINGS_BY_AUTHOR, ZERO_FINDING_COUNTS, ZERO_PROBE_AUTHOR_METRICS, __commonJS, __require, __toESM, aggregateProbeAuthorMetrics, 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, rollupFindingsByAuthor, rollupProbeAuthorMetrics, runHealthAction, validateStoryKey };
6703
- //# sourceMappingURL=health-BZ1WtrLT.js.map
6783
+ //# sourceMappingURL=health-BV-rzjf7.js.map
@@ -1,4 +1,4 @@
1
- import { DEFAULT_STALL_THRESHOLD_SECONDS, getAllDescendantPids, getAutoHealthData, inspectProcessTree, isOrchestratorProcessLine, registerHealthCommand, runHealthAction } from "./health-BZ1WtrLT.js";
1
+ import { DEFAULT_STALL_THRESHOLD_SECONDS, getAllDescendantPids, getAutoHealthData, inspectProcessTree, isOrchestratorProcessLine, registerHealthCommand, runHealthAction } from "./health-BV-rzjf7.js";
2
2
  import "./logger-KeHncl-f.js";
3
3
  import "./dist-VcMmfo2w.js";
4
4
  import "./decisions-C0pz9Clx.js";
@@ -1,4 +1,4 @@
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-BZ1WtrLT.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-BV-rzjf7.js";
2
2
  import { createLogger } from "./logger-KeHncl-f.js";
3
3
  import { TypedEventBusImpl, createEventBus, createTuiApp, isTuiCapable, printNonTtyWarning, sleep } from "./helpers-CElYrONe.js";
4
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";
@@ -45175,4 +45175,4 @@ function registerRunCommand(program, _version = "0.0.0", projectRoot = process.c
45175
45175
 
45176
45176
  //#endregion
45177
45177
  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 };
45178
- //# sourceMappingURL=run-CEVH9qJy.js.map
45178
+ //# sourceMappingURL=run-BWUZK6bP.js.map
@@ -1,8 +1,8 @@
1
- import "./health-BZ1WtrLT.js";
1
+ import "./health-BV-rzjf7.js";
2
2
  import "./logger-KeHncl-f.js";
3
3
  import "./helpers-CElYrONe.js";
4
4
  import "./dist-VcMmfo2w.js";
5
- import { normalizeGraphSummaryToStatus, registerRunCommand, resolveMaxReviewCycles, runRunAction, wireNdjsonEmitter } from "./run-CEVH9qJy.js";
5
+ import { normalizeGraphSummaryToStatus, registerRunCommand, resolveMaxReviewCycles, runRunAction, wireNdjsonEmitter } from "./run-BWUZK6bP.js";
6
6
  import "./routing-CcBOCuC9.js";
7
7
  import "./decisions-C0pz9Clx.js";
8
8
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "substrate-ai",
3
- "version": "0.20.43",
3
+ "version": "0.20.45",
4
4
  "description": "Substrate — multi-agent orchestration daemon for AI coding agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -108,7 +108,20 @@ Use this exact format for each item:
108
108
 
109
109
  **Behavioral signals (runtime-dependent even when the artifact ships as TypeScript / JavaScript / Python source):** the AC describes the implementation invoking a **subprocess** (`execSync`, `spawn`, `child_process`), reading or writing the **filesystem outside test tmpdirs** (`fs.read*`, `fs.write*`, `path.join(homedir(), ...)`), running **git operations** (`git log`, `git push`, `git merge`), querying a **database** (Dolt, mysql, sqlite, postgres), making **network requests** (`fetch`, `axios`, `http.get`), or scanning a **registry / configuration source** ("queries the registry", "scans the fleet").
110
110
 
111
- If **either** the artifact-shape signal **or** the behavioral signal fires, add a `## Runtime Probes` section. Each probe is a short shell command whose exit status answers "does this artifact actually work against real state?".
111
+ **Architectural-level signals (the same external-state interactions described at higher abstraction levels — runtime-dependent identically):** the AC names a **named external dependency** (service, package, agent, skill, mesh, registry, queue, outbox, store, daemon, etc.) AND describes any **interaction verb** (queries, publishes, consumes, calls, writes to, reads from, subscribes to, registers with, delegates to, reaches for, persists to). Phrase patterns to recognize as the architectural-level equivalents of the code-API enumeration above:
112
+
113
+ - `queries <service-or-skill>` (network / database) — e.g., "queries agent-mesh's `query-reports` skill", "queries the Dolt registry"
114
+ - `publishes <X> via <package>['s component]` (network / filesystem) — e.g., "publishes `MorningBriefing` via packages/mesh-agent's outbox"
115
+ - `consumes <skill> from <agent>` / `subscribes to <event>` (network) — e.g., "consumes the `vision` skill", "subscribes to mesh telemetry"
116
+ - `via <package>'s [outbox | client | skill | inbox | queue]` (network / filesystem) — names a peer-package surface as the integration point
117
+ - `graceful degradation when <service> unreachable` / `falls back when <X> down` (network) — implies the AC expects a real network round-trip in the happy path
118
+ - `writes to / reads from the <named-store>` (database / filesystem) — store-shaped naming (mesh outbox, briefings table, vault, etc.)
119
+
120
+ The decision rule is identical to the code-API patterns above: **if the AC names a named external dependency that the implementation must interact with, the story IS runtime-dependent** regardless of whether the AC mentions specific code APIs (`fetch`, `execSync`, etc.). Map each architectural-level interaction to the matching `external_state_dependencies` category (mesh/skill/registry queries → `network`; outbox writes → `filesystem` or `network` depending on transport; etc.).
121
+
122
+ Strata Story 2-7 ("jarvis morning briefing consumes agent-mesh query-reports") shipped without probes under v0.20.43 because its ACs used architectural-level phrasing ("queries agent-mesh's skill", "publishes via outbox") that didn't match the code-API patterns; this paragraph closes that gap. See observation `obs_2026-05-01_017` reopen entry dated `2026-05-02T23:05:00Z`.
123
+
124
+ If **any** of the artifact-shape, code-API, or architectural-level signals fires, add a `## Runtime Probes` section. Each probe is a short shell command whose exit status answers "does this artifact actually work against real state?".
112
125
 
113
126
  **Omit the `## Runtime Probes` section ONLY for purely-algorithmic modules**: pure-function transforms (parse, format, sort, score, calculate), type-only refactors, documentation edits, build or tsconfig changes, and unit-test-only stories. A TypeScript module that runs `execSync('git log')`, reads `~/.config/...`, queries Dolt, or fetches from a network endpoint is RUNTIME-DEPENDENT regardless of its `.ts` extension; **do not omit probes for it**.
114
127