@productbrain/mcp 0.0.1-beta.53 → 0.0.1-beta.55

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.
@@ -38,7 +38,7 @@ import {
38
38
  unknownAction,
39
39
  validationResult,
40
40
  withEnvelope
41
- } from "./chunk-WEH5CZJ7.js";
41
+ } from "./chunk-U4ABXFUT.js";
42
42
  import {
43
43
  trackQualityCheck,
44
44
  trackQualityVerdict
@@ -232,7 +232,7 @@ ${formatted}` }],
232
232
  },
233
233
  withEnvelope(async ({ entryId }) => {
234
234
  requireWriteAccess();
235
- const { runContradictionCheck } = await import("./smart-capture-3OXWEXWM.js");
235
+ const { runContradictionCheck } = await import("./smart-capture-6IM4EMLF.js");
236
236
  const entry = await mcpQuery("chain.getEntry", { entryId });
237
237
  if (!entry) {
238
238
  return notFoundResult(entryId, `Entry '${entryId}' not found. Try search to find the right ID.`);
@@ -2639,9 +2639,9 @@ function validateWorkflowDescriptor(descriptor) {
2639
2639
  `Workflow '${descriptor.id}' is facilitated and must define runtime.primaryTool.`
2640
2640
  );
2641
2641
  }
2642
- if (descriptor.output.summaryCapture?.createsPrimaryRecord && descriptor.output.primaryRecord.routing.mode !== "fixed") {
2642
+ if (descriptor.output.summaryCapture?.createsPrimaryRecord && descriptor.output.primaryRecord.routing.mode === "fixed" && descriptor.output.summaryCapture.descriptionField === "") {
2643
2643
  throw new Error(
2644
- `Workflow '${descriptor.id}' cannot define summaryCapture when primaryRecord routing is classifier-based.`
2644
+ `Workflow '${descriptor.id}' summaryCapture.descriptionField cannot be empty.`
2645
2645
  );
2646
2646
  }
2647
2647
  }
@@ -2651,13 +2651,10 @@ function getWorkflowSummaryCaptureDefinition(descriptor) {
2651
2651
  if (!summaryCapture || !summaryCapture.createsPrimaryRecord) {
2652
2652
  return null;
2653
2653
  }
2654
- if (routing.mode !== "fixed") {
2655
- return null;
2656
- }
2657
2654
  return {
2658
- collection: routing.collection,
2655
+ routing: routing.mode === "fixed" ? { mode: "fixed", collection: routing.collection } : { mode: "classifier" },
2659
2656
  nameTemplate: summaryCapture.nameTemplate,
2660
- descriptionField: summaryCapture.descriptionField ?? "description",
2657
+ descriptionField: summaryCapture.descriptionField,
2661
2658
  descriptionSource: summaryCapture.descriptionSource ?? "final-output-text"
2662
2659
  };
2663
2660
  }
@@ -2696,9 +2693,9 @@ function compileWorkflowDefinition(descriptor) {
2696
2693
  facilitatorPreamble: clonedDescriptor.facilitatorPreamble,
2697
2694
  rounds: clonedDescriptor.rounds,
2698
2695
  kbOutputCollection: primaryRecordCollection ?? void 0,
2699
- kbOutputTemplate: summaryCapture ? {
2696
+ kbOutputTemplate: summaryCapture && summaryCapture.routing.mode === "fixed" ? {
2700
2697
  nameTemplate: summaryCapture.nameTemplate,
2701
- descriptionField: summaryCapture.descriptionField
2698
+ descriptionField: summaryCapture.descriptionField ?? "description"
2702
2699
  } : void 0,
2703
2700
  errorRecovery: clonedDescriptor.errorRecovery
2704
2701
  };
@@ -2724,7 +2721,7 @@ var RETRO_WORKFLOW_DESCRIPTOR = {
2724
2721
  4. **Create a Plan** at the start showing all rounds as tasks. Update it as you progress.
2725
2722
  5. **Synthesize between rounds.** After collecting input, reflect back what you heard before moving on.
2726
2723
  6. **Never go silent.** If something fails, say what happened and what to do next.
2727
- 7. **Commit to the Chain** at the end using the Product OS capture tool.
2724
+ 7. **Finalize through the workflow substrate.** Complete the terminal round with \`workflows action=checkpoint ... isFinal=true\` so the durable run creates the retro draft record.
2728
2725
  8. **Match the energy.** Be warm but structured. This is a ceremony, not a checklist.
2729
2726
 
2730
2727
  ## Communication Style
@@ -2848,7 +2845,7 @@ Create a Cursor Plan with these rounds as tasks. Mark each in_progress as you en
2848
2845
  label: "Close & Capture",
2849
2846
  type: "close",
2850
2847
  instruction: "One last thing \u2014 in one sentence, what's the single most important thing you're taking away from this retro?",
2851
- facilitatorGuidance: "Keep it brief. One sentence reflection. Then summarize the entire retro: scope, key wins, key pain points, patterns identified, actions committed. Ask if they want to commit this to the Chain. If yes, use capture to create a decision/tension entry. Thank them for the retro.",
2848
+ facilitatorGuidance: "Keep it brief. One sentence reflection. Then summarize the entire retro: scope, key wins, key pain points, patterns identified, actions committed. Finalize the durable run through `workflows action=checkpoint` with `isFinal=true` so the retro draft record is created via the workflow substrate. Then ask if they want to commit that draft to the Chain. Thank them for the retro.",
2852
2849
  outputSchema: {
2853
2850
  field: "takeaway",
2854
2851
  description: "Single-sentence takeaway",
@@ -2876,7 +2873,7 @@ Create a Cursor Plan with these rounds as tasks. Mark each in_progress as you en
2876
2873
  },
2877
2874
  errorRecovery: `If anything goes wrong during the retro:
2878
2875
 
2879
- 1. **MCP tool failure**: Skip the chain commit step. Summarize everything in the conversation instead. Suggest the participant runs \`capture\` manually later.
2876
+ 1. **MCP tool failure**: Skip the workflow finalization step. Summarize everything in the conversation instead. Suggest retrying \`workflows action=checkpoint\` later or capturing manually if needed.
2880
2877
  2. **AskQuestion not available**: Fall back to numbered options in plain text. "Reply with 1, 2, or 3."
2881
2878
  3. **Plan creation fails**: Continue without the Plan. The conversation IS the record.
2882
2879
  4. **Participant goes off-topic**: Gently redirect: "That's valuable \u2014 let's capture it. For now, let's stay with [current round]."
@@ -3124,10 +3121,18 @@ var IMPLEMENTATION_REVIEW_WORKFLOW_DESCRIPTOR = {
3124
3121
  icon: "\u2713",
3125
3122
  facilitatorPreamble: `You are now in **Implementation Review Mode**. You orchestrate a structured review of work that was just built \u2014 not a conversation, but a tool-driven audit with sub-agent support.
3126
3123
 
3124
+ ## Review scope (CRITICAL)
3125
+
3126
+ - **Default scope is this conversation only.** Only the work discussed or produced in this conversation is in scope. Do not review or touch files, BETs, or work outside that scope unless the user explicitly expands it (e.g. "also review the auth module").
3127
+ - **Infer scope first.** Use conversation context, git status/diff, and recent edits to determine which BET, feature, or files are in scope. Call orient/start and \`context action=gather\` with the inferred scope; do not ask the user to pick what to review unless it's ambiguous.
3128
+ - **Ask only to clarify boundaries.** If scope is ambiguous after inference, ask a single, focused question to clarify (e.g. "Should this review include only the changes we just made, or the whole feature?"). Do not ask open-ended "what should we review?" or "which work area?" unless inference failed.
3129
+ - **State scope explicitly in Round 01.** After orient and context gather, state in one sentence what is in scope (e.g. "Scope: changes in this conversation for BET-72" or "Scope: files X, Y and BET-72"). Confirm only if the user might reasonably expect something else.
3130
+ - **Sub-agents and tools are scope-bound.** When spawning sub-agents or calling verify/review-against-rules, restrict attention to the scoped work only. Do not audit or suggest changes to code outside the stated scope.
3131
+
3127
3132
  ## Your Behavior
3128
3133
 
3129
3134
  1. **Tool-heavy, not chat-heavy.** Each round calls specific tools: orient, quality, verify, chain-review, context action=gather, review-against-rules. Use Context7 (query-docs) for relevant testing and framework docs \u2014 not for Chain truth.
3130
- 2. **Spawn sub-agents** for parallel review: (a) code/architecture review, (b) test honesty (did we edit tests to pass or do they validate real behavior?), (c) Chain/standards coherence. Max 2 agents in parallel, 30s budget each.
3135
+ 2. **Spawn sub-agents** for parallel review: (a) code/architecture review, (b) test honesty (did we edit tests to pass or do they validate real behavior?), (c) Chain/standards coherence. Max 2 agents in parallel, 30s budget each. **Constrain each sub-agent to the stated review scope only.**
3131
3136
  3. **Chain is SSOT.** Call orient or start first. Use entries action=search and context action=gather to load relevant BETs, DECs, BRs. If findings conflict with Chain entries, report the conflict and cite the entry ID.
3132
3137
  4. **One round at a time.** Complete each round before moving to the next. Checkpoint progress.
3133
3138
  5. **CRITICAL: End with BET/chain IDs.** The final output MUST include a single sentence: "BET/feature IDs reviewed: [IDs]. [One-line summary of findings]."
@@ -3153,11 +3158,11 @@ When reviewing test results: (a) test staleness \u2014 code changed, test not up
3153
3158
  num: "01",
3154
3159
  label: "Orient & Scope",
3155
3160
  type: "open",
3156
- instruction: "Load governance and scope. What BET or work are we reviewing? Call orient or start. Use context action=gather with the BET/feature ID.",
3157
- facilitatorGuidance: "Call orient or start to load workspace governance and active bets. Ask the participant which BET, feature, or work area to review. Use context action=gather task='implementation review for [BET-ID]' to load related entries. Present: scope, relevant BETs/DECs/BRs, and any stale entries orient surfaces.",
3161
+ instruction: "Apply the Review scope rules: infer scope from this conversation, git diff, and recent edits (default = work in this conversation only). Call orient or start, then context action=gather for the inferred BET/feature. State scope in one explicit sentence. Only ask the participant if scope is ambiguous.",
3162
+ facilitatorGuidance: "Infer scope from conversation context, git status/diff, and recent edits \u2014 default is work in this conversation only. Call orient or start to load governance and active bets. Use context action=gather task='implementation review for [inferred-BET-or-feature]' to load related entries. State scope explicitly in one sentence (e.g. 'Scope: changes in this conversation for BET-72'). Present: stated scope, relevant BETs/DECs/BRs, and any stale entries orient surfaces. Ask the participant only if scope is ambiguous (e.g. 'Only the files we changed, or the whole feature?').",
3158
3163
  outputSchema: {
3159
3164
  field: "scope",
3160
- description: "BET/feature IDs and related Chain context",
3165
+ description: "Explicit scope statement plus BET/feature IDs and related Chain context",
3161
3166
  format: "structured"
3162
3167
  },
3163
3168
  maxDurationHint: "3 min"
@@ -3181,8 +3186,8 @@ When reviewing test results: (a) test staleness \u2014 code changed, test not up
3181
3186
  num: "03",
3182
3187
  label: "Code & Test Honesty",
3183
3188
  type: "open",
3184
- instruction: "Spawn sub-agents to review implementation and tests. Did we meet high standards? Are tests validating real behavior or did we edit them just to pass?",
3185
- facilitatorGuidance: "Spawn 1\u20132 sub-agents in parallel: (1) explore agent \u2014 code review, architecture boundaries, type-safety. (2) generalPurpose agent \u2014 test review: are tests asserting real behavior or were they edited to pass? Use Context7 (query-docs) for relevant testing and framework best practices if needed. Classify any test failures: staleness, regression, or flaky. Synthesize: implementation grade, test honesty verdict, refactoring suggestions.",
3189
+ instruction: "Spawn sub-agents to review implementation and tests for the stated scope only. Did we meet high standards? Are tests validating real behavior or did we edit them just to pass?",
3190
+ facilitatorGuidance: "Restrict all review to the scope stated in Round 01 (by default, work in this conversation only). Spawn 1\u20132 sub-agents in parallel: (1) explore agent \u2014 code review, architecture boundaries, type-safety for scoped files only. (2) generalPurpose agent \u2014 test review for scoped code: are tests asserting real behavior or were they edited to pass? Pass the scope (files/BET) explicitly to sub-agents so they do not touch other work. Use Context7 (query-docs) for relevant testing and framework best practices if needed. Classify any test failures: staleness, regression, or flaky. Synthesize: implementation grade, test honesty verdict, refactoring suggestions (within scope only).",
3186
3191
  outputSchema: {
3187
3192
  field: "codeAndTests",
3188
3193
  description: "Implementation grade, test honesty, refactor suggestions",
@@ -3223,8 +3228,8 @@ When reviewing test results: (a) test staleness \u2014 code changed, test not up
3223
3228
  num: "06",
3224
3229
  label: "Capture & Close",
3225
3230
  type: "close",
3226
- instruction: "Capture the review as an insight. Use session-wrapup. Thank the participant.",
3227
- facilitatorGuidance: "Summarize the review for capture. Use capture with collection=insights. Include: BET/feature IDs, verdict, key findings. Run session-wrapup before closing. Thank the participant. Remind them to commit-entry when ready.",
3231
+ instruction: "Finalize the review as an insight draft. Use session-wrapup. Thank the participant.",
3232
+ facilitatorGuidance: "Summarize the review for finalization. Complete the terminal round through `workflows action=checkpoint` with `isFinal=true` so the workflow substrate creates the draft insight record. Include: BET/feature IDs, verdict, key findings. Run session-wrapup before closing. Thank the participant. Remind them to commit-entry when ready.",
3228
3233
  outputSchema: {
3229
3234
  field: "capture",
3230
3235
  description: "Insight entry created, BET IDs referenced",
@@ -3276,15 +3281,15 @@ var PROCESS_CHANGE_WORKFLOW_DESCRIPTOR = {
3276
3281
  2. **Orient first.** Call orient to load workspace context \u2014 but present only what's relevant to the change, not the full briefing.
3277
3282
  3. **Capture the why.** The single most important thing: why is this change happening? The what is usually obvious from the code. The why is what evaporates.
3278
3283
  4. **Link to what exists.** Search the Chain for related entries. If this change was triggered by a tension, bet, or decision \u2014 link it. If it creates a new decision or surfaces a new tension \u2014 capture that too.
3279
- 5. **Route via classifier.** Use capture without specifying a collection. The classifier knows where it belongs: tensions for bugs, decisions for choices made, features for new capabilities, insights for lessons learned.
3280
- 6. **Don't over-process.** If the user gives you everything in one message, skip to capture. Not every round needs a conversation.
3284
+ 5. **Finalize through the workflow substrate.** Complete the terminal round with \`workflows action=checkpoint ... isFinal=true\`. The substrate will classifier-route the primary record and attach it to the durable run.
3285
+ 6. **Don't over-process.** If the user gives you everything in one message, move quickly through the required checkpoints in order, then finalize. Not every round needs a conversation.
3281
3286
  7. **End with the link.** Always finish by connecting the new entry to related Chain knowledge via graph suggest.
3282
3287
 
3283
3288
  ## Tool Usage
3284
3289
 
3285
3290
  - \`orient\` \u2014 load workspace context (governance, active bets, stale entries)
3286
3291
  - \`entries action=search\` \u2014 find related entries
3287
- - \`capture\` \u2014 create the entry (let classifier route)
3292
+ - \`capture\` \u2014 manual fallback only if workflow finalization cannot safely route the entry
3288
3293
  - \`graph action=suggest\` \u2014 discover connections
3289
3294
  - \`relations action=create\` or \`relations action=batch-create\` \u2014 link to related entries
3290
3295
  - \`commit-entry\` \u2014 promote to SSOT (only on user confirmation)
@@ -3293,8 +3298,8 @@ var PROCESS_CHANGE_WORKFLOW_DESCRIPTOR = {
3293
3298
  ## Communication Style
3294
3299
 
3295
3300
  - **Conversational, not ceremonial.** No round headers needed unless the user wants structure.
3296
- - **One question at a time.** Ask what you need, capture, move on.
3297
- - **If the user gives rich context upfront**, skip straight to capture and linking. Don't ask questions they already answered.
3301
+ - **One question at a time.** Ask what you need, checkpoint, move on.
3302
+ - **If the user gives rich context upfront**, checkpoint the answered rounds in order, then finalize and link. Don't ask questions they already answered.
3298
3303
  - **Show what you captured.** Always confirm what went to the Chain before closing.`,
3299
3304
  rounds: [
3300
3305
  {
@@ -3345,7 +3350,7 @@ var PROCESS_CHANGE_WORKFLOW_DESCRIPTOR = {
3345
3350
  label: "Capture & Close",
3346
3351
  type: "close",
3347
3352
  instruction: "Capture to the Chain. Link to related entries. Confirm with the user.",
3348
- facilitatorGuidance: "Use capture with name and description \u2014 omit collection to let the classifier route. After capture, call graph action=suggest to find connections. Create the top 2-3 relevant relations. Show the user what was captured: entry ID, collection it landed in, relations created. Ask if they want to commit now or leave as draft. If they confirm, commit-entry. If there are stale entries to reconfirm, mention them. Thank the user briefly and exit \u2014 don't linger.",
3353
+ facilitatorGuidance: "Finalize through workflows action=checkpoint with isFinal=true, passing a summaryName when you have a clean title. The workflow substrate will create the primary record as a draft and attach it to the durable run. After finalization, call graph action=suggest to find connections. Create the top 2-3 relevant relations. Show the user what was captured: entry ID, collection it landed in, relations created. Ask if they want to commit now or leave as draft. If they confirm, commit-entry. If there are stale entries to reconfirm, mention them. Thank the user briefly and exit \u2014 don't linger.",
3349
3354
  outputSchema: {
3350
3355
  field: "capture",
3351
3356
  description: "Entry captured, relations created, commit status",
@@ -3359,6 +3364,10 @@ var PROCESS_CHANGE_WORKFLOW_DESCRIPTOR = {
3359
3364
  routing: {
3360
3365
  mode: "classifier"
3361
3366
  }
3367
+ },
3368
+ summaryCapture: {
3369
+ createsPrimaryRecord: true,
3370
+ nameTemplate: "{whatAndWhy}"
3362
3371
  }
3363
3372
  },
3364
3373
  runtime: {
@@ -3710,9 +3719,13 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
3710
3719
  const descriptor = getWorkflowDescriptor(workflowId);
3711
3720
  const template = descriptor ? getWorkflowTemplateMetadata(descriptor) : { slug: wf.id, name: wf.name };
3712
3721
  const summaryCapture = descriptor ? getWorkflowSummaryCaptureDefinition(descriptor) : wf.kbOutputCollection && wf.kbOutputTemplate ? {
3713
- collection: wf.kbOutputCollection,
3722
+ routing: {
3723
+ mode: "fixed",
3724
+ collection: wf.kbOutputCollection
3725
+ },
3714
3726
  nameTemplate: wf.kbOutputTemplate.nameTemplate,
3715
- descriptionField: wf.kbOutputTemplate.descriptionField
3727
+ descriptionField: wf.kbOutputTemplate.descriptionField,
3728
+ descriptionSource: "final-output-text"
3716
3729
  } : null;
3717
3730
  if (!summaryCapture) {
3718
3731
  return validationResult(
@@ -3756,7 +3769,12 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
3756
3769
  finalRoundId: roundId,
3757
3770
  finalOutput: normalizedOutput,
3758
3771
  summaryCapture: {
3759
- collection: summaryCapture.collection,
3772
+ routing: summaryCapture.routing.mode === "fixed" ? {
3773
+ mode: "fixed",
3774
+ collection: summaryCapture.routing.collection
3775
+ } : {
3776
+ mode: "classifier"
3777
+ },
3760
3778
  nameTemplate: summaryCapture.nameTemplate,
3761
3779
  descriptionField: summaryCapture.descriptionField,
3762
3780
  descriptionSource: summaryCapture.descriptionSource
@@ -3766,7 +3784,7 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
3766
3784
  });
3767
3785
  lines.push(
3768
3786
  result.summary.created ? `**Draft Created**: \`${result.summary.entryId}\`` : `**Draft Already Exists**: \`${result.summary.entryId}\``,
3769
- `Collection: \`${summaryCapture.collection}\``,
3787
+ `Collection: \`${result.summary.collection ?? (summaryCapture.routing.mode === "fixed" ? summaryCapture.routing.collection : "classifier-routed")}\``,
3770
3788
  `Name: ${result.summary.name}`,
3771
3789
  "",
3772
3790
  `The summary is captured as a draft. Use \`commit-entry entryId="${result.summary.entryId}"\` to promote it to the Chain.`,
@@ -3780,7 +3798,7 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
3780
3798
  entryId: result.summary.entryId,
3781
3799
  workflowId,
3782
3800
  roundId,
3783
- collection: summaryCapture.collection,
3801
+ collection: result.summary.collection ?? (summaryCapture.routing.mode === "fixed" ? summaryCapture.routing.collection : null),
3784
3802
  isFinal: true,
3785
3803
  runId: result.runId,
3786
3804
  created: result.summary.created
@@ -3804,9 +3822,9 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
3804
3822
  lines.push(
3805
3823
  `**Chain commit failed**: ${msg}`,
3806
3824
  "",
3807
- `The retro output is preserved in this conversation. `,
3825
+ `The workflow output is preserved in this conversation. `,
3808
3826
  `You can manually create the entry later using \`capture\` with:`,
3809
- `- Collection: \`${summaryCapture.collection}\``,
3827
+ `- Collection: \`${summaryCapture.routing.mode === "fixed" ? summaryCapture.routing.collection : "classifier-routed"}\``,
3810
3828
  `- Name: ${summaryName ?? summaryCapture.nameTemplate}`,
3811
3829
  `- Description: ${summaryDescription ?? outputPreview}`
3812
3830
  );
@@ -6058,7 +6076,7 @@ async function handleCommitConstellation(args) {
6058
6076
  }
6059
6077
  let contradictionWarnings = [];
6060
6078
  try {
6061
- const { runContradictionCheck } = await import("./smart-capture-3OXWEXWM.js");
6079
+ const { runContradictionCheck } = await import("./smart-capture-6IM4EMLF.js");
6062
6080
  const descField = betData.problem ?? betData.description ?? "";
6063
6081
  contradictionWarnings = await runContradictionCheck(
6064
6082
  betEntry.name ?? betId,
@@ -10877,7 +10895,7 @@ Make sure the rule is consistent with existing rules and doesn't contradict them
10877
10895
  );
10878
10896
  server.prompt(
10879
10897
  "run-workflow",
10880
- "Launch a Chainwork workflow (retro, shape, IDM) in Facilitator Mode. Returns the full workflow definition, facilitation instructions, and round structure. The agent enters Facilitator Mode and guides the participant through each round.",
10898
+ "Launch any registered Chainwork workflow in Facilitator Mode. Returns the full workflow definition, facilitation instructions, and round structure. The agent enters Facilitator Mode and guides the participant through each round.",
10881
10899
  {
10882
10900
  workflow: z21.string().describe(
10883
10901
  "Workflow ID to run. Available: " + listWorkflows().map((w) => `'${w.id}' (${w.name})`).join(", ")
@@ -10943,13 +10961,17 @@ Use it \u2014 don't make them repeat themselves.
10943
10961
  ` : "";
10944
10962
  const outputDescription = descriptor ? describeWorkflowPrimaryOutput(descriptor) : wf.kbOutputCollection ? `Primary record routes to \`${wf.kbOutputCollection}\`.` : "Primary output routing is resolved at runtime.";
10945
10963
  const summaryCapture = descriptor ? getWorkflowSummaryCaptureDefinition(descriptor) : wf.kbOutputCollection && wf.kbOutputTemplate ? {
10946
- collection: wf.kbOutputCollection,
10964
+ routing: {
10965
+ mode: "fixed",
10966
+ collection: wf.kbOutputCollection
10967
+ },
10947
10968
  nameTemplate: wf.kbOutputTemplate.nameTemplate,
10948
- descriptionField: wf.kbOutputTemplate.descriptionField
10969
+ descriptionField: wf.kbOutputTemplate.descriptionField,
10970
+ descriptionSource: "final-output-text"
10949
10971
  } : null;
10950
- const chainOutputBlock = summaryCapture ? `Primary record routes to \`${summaryCapture.collection}\`.
10972
+ const chainOutputBlock = summaryCapture ? `Primary record routes to \`${summaryCapture.routing.mode === "fixed" ? summaryCapture.routing.collection : "classifier"}\`.
10951
10973
  Summary capture template: ${summaryCapture.nameTemplate}
10952
- Description field: ${summaryCapture.descriptionField}
10974
+ Description field: ${summaryCapture.descriptionField ?? "collection default"}
10953
10975
  ` : `Primary output: ${outputDescription}
10954
10976
  Use the workflow guidance to capture the primary record directly rather than relying on final summary auto-capture.
10955
10977
  `;
@@ -11596,4 +11618,4 @@ export {
11596
11618
  SERVER_VERSION,
11597
11619
  createProductBrainServer
11598
11620
  };
11599
- //# sourceMappingURL=chunk-QUWYOGHB.js.map
11621
+ //# sourceMappingURL=chunk-HQLEMADT.js.map