@productbrain/mcp 0.0.1-beta.1049 → 0.0.1-beta.1058
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/{chunk-CIHITLKC.js → chunk-WG7H45D3.js} +92 -92
- package/dist/chunk-WG7H45D3.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/http.js +1 -1
- package/dist/index.js +1 -1
- package/dist/{setup-RYYXRDPB.js → setup-PC43F5AO.js} +7 -7
- package/dist/setup-PC43F5AO.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-CIHITLKC.js.map +0 -1
- package/dist/setup-RYYXRDPB.js.map +0 -1
|
@@ -1814,7 +1814,7 @@ var captureSchema = z2.object({
|
|
|
1814
1814
|
preview: z2.boolean().optional().describe("If true, validates the capture without writing. Returns what would happen. Default false."),
|
|
1815
1815
|
// WP-318 S2: Pre-write grounding — run link suggestion before creating entry.
|
|
1816
1816
|
suggestOnly: z2.boolean().optional().describe(
|
|
1817
|
-
"If true, runs pre-write grounding (suggestLinksForCapture) and returns a groundingReport WITHOUT creating any entry. Use to preview graph participation before
|
|
1817
|
+
"If true, runs pre-write grounding (suggestLinksForCapture) and returns a groundingReport WITHOUT creating any entry. Use to preview graph participation before accepting. Default false."
|
|
1818
1818
|
),
|
|
1819
1819
|
// WP-318 S2: Format for groundingReport in response.
|
|
1820
1820
|
format: z2.enum(["agent", "human"]).optional().describe(
|
|
@@ -2799,7 +2799,7 @@ Use \`entries action=get\` to inspect the existing entry, or \`update-entry\` to
|
|
|
2799
2799
|
if (finalStatus === "committed") {
|
|
2800
2800
|
const wasAutoCommitted = autoCommit === void 0 && freshGovernanceMode === "open";
|
|
2801
2801
|
lines.push("");
|
|
2802
|
-
lines.push(`##
|
|
2802
|
+
lines.push(`## Accepted: ${finalEntryId}`);
|
|
2803
2803
|
if (wasAutoCommitted) {
|
|
2804
2804
|
lines.push(`**${name}** added to your knowledge base.`);
|
|
2805
2805
|
} else {
|
|
@@ -2811,16 +2811,16 @@ Use \`entries action=get\` to inspect the existing entry, or \`update-entry\` to
|
|
|
2811
2811
|
} else if (finalStatus === "proposed") {
|
|
2812
2812
|
lines.push("");
|
|
2813
2813
|
lines.push(`## Proposal created: ${finalEntryId}`);
|
|
2814
|
-
lines.push(`**${name}** requires consent before it can be
|
|
2814
|
+
lines.push(`**${name}** requires consent before it can be accepted, so a proposal was created instead of accepting directly.`);
|
|
2815
2815
|
} else if (commitError) {
|
|
2816
2816
|
lines.push("");
|
|
2817
|
-
lines.push("##
|
|
2817
|
+
lines.push("## Accept failed");
|
|
2818
2818
|
lines.push(`Error: ${commitError}. Entry saved as draft \u2014 use \`commit-entry entryId="${finalEntryId}"\` to promote when ready.`);
|
|
2819
2819
|
}
|
|
2820
2820
|
if (shouldAutoCommit && conflictCandidates.length > 0) {
|
|
2821
2821
|
lines.push("");
|
|
2822
2822
|
lines.push("## Potential Overlaps");
|
|
2823
|
-
lines.push(`Auto-
|
|
2823
|
+
lines.push(`Auto-accepted with advisory: ${conflictCandidates.length} similar ${conflictCandidates.length === 1 ? "entry" : "entries"} found.`);
|
|
2824
2824
|
for (const c of conflictCandidates) {
|
|
2825
2825
|
lines.push(`- \`${c.entryId}\`: ${c.name} [${c.collection}]`);
|
|
2826
2826
|
}
|
|
@@ -2903,7 +2903,7 @@ Use \`entries action=get\` to inspect the existing entry, or \`update-entry\` to
|
|
|
2903
2903
|
if (isBetOrGoal && !hasStrategyLink) {
|
|
2904
2904
|
lines.push("");
|
|
2905
2905
|
lines.push(
|
|
2906
|
-
`**Strategy link:** This ${isBetCapture ? "bet" : "goal"} doesn't connect to any strategy entry. Consider linking before
|
|
2906
|
+
`**Strategy link:** This ${isBetCapture ? "bet" : "goal"} doesn't connect to any strategy entry. Consider linking before accepting. Use \`graph action=suggest entryId="${finalEntryId}"\` to find strategy entries to connect to.`
|
|
2907
2907
|
);
|
|
2908
2908
|
await recordSessionActivity({ strategyLinkWarnedForEntryId: internalId });
|
|
2909
2909
|
}
|
|
@@ -2917,7 +2917,7 @@ Use \`entries action=get\` to inspect the existing entry, or \`update-entry\` to
|
|
|
2917
2917
|
for (const w of contradictionWarnings) {
|
|
2918
2918
|
lines.push(`- ${w.name} (${w.collection}, ${w.entryId}) \u2014 has 'governs' relation to ${w.governsCount} entries`);
|
|
2919
2919
|
}
|
|
2920
|
-
lines.push("Run `context action=gather` on these entries before
|
|
2920
|
+
lines.push("Run `context action=gather` on these entries before accepting.");
|
|
2921
2921
|
}
|
|
2922
2922
|
if (entryWarnings.length > 0) {
|
|
2923
2923
|
lines.push("");
|
|
@@ -2947,7 +2947,7 @@ Use \`entries action=get\` to inspect the existing entry, or \`update-entry\` to
|
|
|
2947
2947
|
if (userLinkResults.length === 0) {
|
|
2948
2948
|
lines.push(`1. **Connect it:** \`graph action=suggest entryId="${eid}"\` \u2014 discover what this should link to`);
|
|
2949
2949
|
}
|
|
2950
|
-
lines.push(`${userLinkResults.length === 0 ? "2" : "1"}. **
|
|
2950
|
+
lines.push(`${userLinkResults.length === 0 ? "2" : "1"}. **Accept it:** \`commit-entry entryId="${eid}"\` \u2014 promote from draft to SSOT on the Chain`);
|
|
2951
2951
|
if (failedChecks.length > 0) {
|
|
2952
2952
|
lines.push(`${userLinkResults.length === 0 ? "3" : "2"}. **Improve quality:** \`update-entry entryId="${eid}"\` \u2014 fill missing fields`);
|
|
2953
2953
|
}
|
|
@@ -2973,9 +2973,9 @@ Use \`entries action=get\` to inspect the existing entry, or \`update-entry\` to
|
|
|
2973
2973
|
if (userLinkResults.length === 0) {
|
|
2974
2974
|
next.push({ tool: "graph", description: "Discover links", parameters: { action: "suggest", entryId: finalEntryId } });
|
|
2975
2975
|
}
|
|
2976
|
-
next.push({ tool: "commit-entry", description: "
|
|
2976
|
+
next.push({ tool: "commit-entry", description: "Accept onto Chain", parameters: { entryId: finalEntryId } });
|
|
2977
2977
|
}
|
|
2978
|
-
const summary = finalStatus === "committed" ? `Captured and
|
|
2978
|
+
const summary = finalStatus === "committed" ? `Captured and accepted ${finalEntryId} (${name}) onto ${resolvedCollection}. Quality ${quality.score}/10.` : finalStatus === "proposed" ? `Captured ${finalEntryId} (${name}) in ${resolvedCollection} and created a proposal for acceptance. Quality ${quality.score}/10.` : `Captured ${finalEntryId} (${name}) as draft in ${resolvedCollection}. Quality ${quality.score}/10.`;
|
|
2979
2979
|
const expectedFields = (col.fields ?? []).map((f) => ({
|
|
2980
2980
|
key: f.key,
|
|
2981
2981
|
type: f.type,
|
|
@@ -3465,7 +3465,7 @@ _Use \`move-entry\` to correct any misclassified entries._`);
|
|
|
3465
3465
|
lines.push(`- **Connect:** Run \`graph action=suggest\` on key entries to build the knowledge graph`);
|
|
3466
3466
|
}
|
|
3467
3467
|
if (drafts.length > 0) {
|
|
3468
|
-
lines.push(`- **
|
|
3468
|
+
lines.push(`- **Accept:** Use \`commit-entry\` to promote remaining drafts to SSOT`);
|
|
3469
3469
|
}
|
|
3470
3470
|
if (skippedLowConfidence.length > 0) {
|
|
3471
3471
|
lines.push(`- **Classify:** Re-capture ${skippedLowConfidence.length} skipped entries with explicit collections`);
|
|
@@ -3484,7 +3484,7 @@ _Use \`move-entry\` to correct any misclassified entries._`);
|
|
|
3484
3484
|
next.push({ tool: "graph", description: "Discover connections", parameters: { action: "suggest", entryId: created[0].entryId } });
|
|
3485
3485
|
}
|
|
3486
3486
|
if (firstDraft) {
|
|
3487
|
-
next.push({ tool: "commit-entry", description: "
|
|
3487
|
+
next.push({ tool: "commit-entry", description: "Accept first draft", parameters: { entryId: firstDraft.entryId } });
|
|
3488
3488
|
}
|
|
3489
3489
|
if (skippedLowConfidence.length > 0) {
|
|
3490
3490
|
next.push({ tool: "capture", description: `Capture skipped entry with explicit collection`, parameters: { name: skippedLowConfidence[0].name, collection: skippedLowConfidence[0].suggestedCollection ?? "" } });
|
|
@@ -3865,9 +3865,9 @@ var getHistorySchema = z3.object({
|
|
|
3865
3865
|
entryId: z3.string().describe("Entry ID, e.g. 'T-SUPPLIER', '<PREFIX>-<n>'")
|
|
3866
3866
|
});
|
|
3867
3867
|
var commitEntrySchema = z3.object({
|
|
3868
|
-
entryId: z3.string().describe("Entry ID to
|
|
3868
|
+
entryId: z3.string().describe("Entry ID to accept, e.g. 'TEN-abc123', '<PREFIX>-<n>'"),
|
|
3869
3869
|
// WP-316 S3: Preview gate — dry-run mode. Returns would-succeed result, no DB writes.
|
|
3870
|
-
preview: z3.boolean().optional().describe("If true, validates the
|
|
3870
|
+
preview: z3.boolean().optional().describe("If true, validates the accept without writing. Returns what would happen. Default false.")
|
|
3871
3871
|
});
|
|
3872
3872
|
function registerKnowledgeTools(server) {
|
|
3873
3873
|
const updateTool = server.registerTool(
|
|
@@ -3952,7 +3952,7 @@ function registerKnowledgeTools(server) {
|
|
|
3952
3952
|
const summary = `Updated ${entryId} \u2014 ${versionMode}. Fields: ${fieldsProvided.join(", ") || "none"}.`;
|
|
3953
3953
|
const next = [
|
|
3954
3954
|
{ tool: "entries", description: "View updated entry", parameters: { action: "get", entryId } },
|
|
3955
|
-
{ tool: "commit-entry", description: "
|
|
3955
|
+
{ tool: "commit-entry", description: "Accept onto Chain", parameters: { entryId } }
|
|
3956
3956
|
];
|
|
3957
3957
|
return {
|
|
3958
3958
|
content: [{ type: "text", text: responseLines.join("\n") }],
|
|
@@ -4014,8 +4014,8 @@ ${formatted}` }],
|
|
|
4014
4014
|
const commitTool = server.registerTool(
|
|
4015
4015
|
"commit-entry",
|
|
4016
4016
|
{
|
|
4017
|
-
title: "
|
|
4018
|
-
description: "Promote a draft entry to
|
|
4017
|
+
title: "Accept Entry onto Chain",
|
|
4018
|
+
description: "Promote a draft entry to accepted status (SSOT on the Chain). Runs the staging-grade semantic conflict detector before accepting and blocks high-confidence contradictions. Lower-confidence conflicts remain advisory.\n\nUse after capture + graph action=suggest + relations action=create to finalize an entry.",
|
|
4019
4019
|
inputSchema: commitEntrySchema,
|
|
4020
4020
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false }
|
|
4021
4021
|
},
|
|
@@ -4048,15 +4048,15 @@ ${formatted}` }],
|
|
|
4048
4048
|
const conflictLines = preflight.blockingContradictions.map((c) => `- ${c.chainEntryName} (${c.chainEntryId}) \u2014 ${c.explanation}`).join("\n");
|
|
4049
4049
|
return failureResult(
|
|
4050
4050
|
[
|
|
4051
|
-
`#
|
|
4051
|
+
`# Accept blocked: contradiction detected`,
|
|
4052
4052
|
"",
|
|
4053
|
-
`\`${entryId}\` matches ${preflight.blockingContradictions.length} high-confidence contradiction(s). Resolve the conflict before
|
|
4053
|
+
`\`${entryId}\` matches ${preflight.blockingContradictions.length} high-confidence contradiction(s). Resolve the conflict before accepting.`,
|
|
4054
4054
|
"",
|
|
4055
4055
|
conflictLines
|
|
4056
4056
|
].join("\n"),
|
|
4057
4057
|
"CONTRADICTION_BLOCKED",
|
|
4058
4058
|
`${preflight.blockingContradictions.length} high-confidence contradiction(s) found.`,
|
|
4059
|
-
"Review the conflicting entry or entries before retrying the
|
|
4059
|
+
"Review the conflicting entry or entries before retrying the accept.",
|
|
4060
4060
|
void 0,
|
|
4061
4061
|
{
|
|
4062
4062
|
entryId,
|
|
@@ -4104,7 +4104,7 @@ ${formatted}` }],
|
|
|
4104
4104
|
}
|
|
4105
4105
|
if (result?.preview) {
|
|
4106
4106
|
const previewEnvelope = success(
|
|
4107
|
-
`Preview: would
|
|
4107
|
+
`Preview: would accept ${entryId} \u2014 no DB writes`,
|
|
4108
4108
|
{
|
|
4109
4109
|
entryId,
|
|
4110
4110
|
name: entry.name,
|
|
@@ -4112,17 +4112,17 @@ ${formatted}` }],
|
|
|
4112
4112
|
currentStatus: result.currentStatus,
|
|
4113
4113
|
wouldSetStatus: result.wouldSetStatus
|
|
4114
4114
|
},
|
|
4115
|
-
[{ tool: "commit-entry", description: "
|
|
4115
|
+
[{ tool: "commit-entry", description: "Accept for real", parameters: { entryId } }]
|
|
4116
4116
|
);
|
|
4117
4117
|
if (result.contract) {
|
|
4118
4118
|
previewEnvelope.contract = result.contract;
|
|
4119
4119
|
}
|
|
4120
4120
|
return {
|
|
4121
|
-
content: [{ type: "text", text: `# Preview: would
|
|
4121
|
+
content: [{ type: "text", text: `# Preview: would accept ${entryId}
|
|
4122
4122
|
|
|
4123
4123
|
Current status: \`${result.currentStatus}\` \u2192 would become \`${result.wouldSetStatus}\`.
|
|
4124
4124
|
|
|
4125
|
-
No DB writes \u2014 call without \`preview:true\` to
|
|
4125
|
+
No DB writes \u2014 call without \`preview:true\` to accept for real.` }],
|
|
4126
4126
|
structuredContent: previewEnvelope
|
|
4127
4127
|
};
|
|
4128
4128
|
}
|
|
@@ -4143,14 +4143,14 @@ No DB writes \u2014 call without \`preview:true\` to commit for real.` }],
|
|
|
4143
4143
|
if (isProposal) {
|
|
4144
4144
|
lines = [
|
|
4145
4145
|
`# Proposal created: ${result.entryId ?? entryId}`,
|
|
4146
|
-
`**${result.name ?? entry.name}** \u2014
|
|
4146
|
+
`**${result.name ?? entry.name}** \u2014 accepting requires consent. A proposal was created instead of accepting directly.`,
|
|
4147
4147
|
`**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,
|
|
4148
4148
|
"",
|
|
4149
|
-
result.existing ? "An open proposal for this entry already exists." : "Affected owners will be notified. The entry will be
|
|
4149
|
+
result.existing ? "An open proposal for this entry already exists." : "Affected owners will be notified. The entry will be accepted when the consent window expires with no objections, or when all owners approve."
|
|
4150
4150
|
];
|
|
4151
4151
|
} else {
|
|
4152
4152
|
lines = [
|
|
4153
|
-
`#
|
|
4153
|
+
`# Accepted: ${entryId}`,
|
|
4154
4154
|
`**${entry.name}** promoted to SSOT on the Chain.`,
|
|
4155
4155
|
`**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`
|
|
4156
4156
|
];
|
|
@@ -4161,7 +4161,7 @@ No DB writes \u2014 call without \`preview:true\` to commit for real.` }],
|
|
|
4161
4161
|
for (const w of advisoryWarnings) {
|
|
4162
4162
|
lines.push(w.kind === "semantic" ? `- ${w.name} (${w.entryId}) \u2014 ${w.explanation}` : `- ${w.name} (${w.collection}, ${w.entryId}) \u2014 has 'governs' relation to ${w.governsCount} entries`);
|
|
4163
4163
|
}
|
|
4164
|
-
lines.push(preflight.source === "semantic" ? "Run context action=gather on the conflicting entries before
|
|
4164
|
+
lines.push(preflight.source === "semantic" ? "Run context action=gather on the conflicting entries before accepting." : "Run context action=gather on these entries before accepting.");
|
|
4165
4165
|
}
|
|
4166
4166
|
if (coachingResult?.verdict) {
|
|
4167
4167
|
try {
|
|
@@ -4188,7 +4188,7 @@ No DB writes \u2014 call without \`preview:true\` to commit for real.` }],
|
|
|
4188
4188
|
lines.push(coaching);
|
|
4189
4189
|
if (!coachingResult.verdict.passed && coachingResult.verdict.tier === "assertive") {
|
|
4190
4190
|
lines.push("");
|
|
4191
|
-
lines.push("_This entry was
|
|
4191
|
+
lines.push("_This entry was accepted despite quality concerns. The override has been recorded._");
|
|
4192
4192
|
}
|
|
4193
4193
|
}
|
|
4194
4194
|
}
|
|
@@ -4199,7 +4199,7 @@ No DB writes \u2014 call without \`preview:true\` to commit for real.` }],
|
|
|
4199
4199
|
for (const w of guidanceWarnings) {
|
|
4200
4200
|
lines.push(`- **${w.field}:** ${w.message}`);
|
|
4201
4201
|
}
|
|
4202
|
-
lines.push(`_These are advisory \u2014 the entry was
|
|
4202
|
+
lines.push(`_These are advisory \u2014 the entry was accepted. Use \`update-entry entryId="${entryId}"\` to address them._`);
|
|
4203
4203
|
const uniqueTypes = [...new Set(guidanceWarnings.map((w) => w.warningType))];
|
|
4204
4204
|
trackFieldQualityWarning(wsCtx.workspaceId, {
|
|
4205
4205
|
warning_count: guidanceWarnings.length,
|
|
@@ -4229,9 +4229,9 @@ No DB writes \u2014 call without \`preview:true\` to commit for real.` }],
|
|
|
4229
4229
|
{ tool: "entries", description: "View entry", parameters: { action: "get", entryId } }
|
|
4230
4230
|
] : [
|
|
4231
4231
|
{ tool: "graph", description: "Discover connections", parameters: { action: "suggest", entryId } },
|
|
4232
|
-
{ tool: "entries", description: "View
|
|
4232
|
+
{ tool: "entries", description: "View accepted entry", parameters: { action: "get", entryId } }
|
|
4233
4233
|
];
|
|
4234
|
-
const summary = isProposal ? `Proposal created for ${entryId} (${entry.name}). Awaiting consent.` : `
|
|
4234
|
+
const summary = isProposal ? `Proposal created for ${entryId} (${entry.name}). Awaiting consent.` : `Accepted ${entryId} (${entry.name}) onto the Chain.`;
|
|
4235
4235
|
const commitSuccessEnvelope = success(
|
|
4236
4236
|
summary,
|
|
4237
4237
|
{
|
|
@@ -6418,7 +6418,7 @@ import { z as z8 } from "zod";
|
|
|
6418
6418
|
var COLLECTIONS_ACTIONS = ["list", "create", "update", "describe", "audit", "export"];
|
|
6419
6419
|
var qualityCriterionSchema = z8.object({
|
|
6420
6420
|
field: z8.string().describe("Entry data field key this criterion applies to, e.g. 'description', 'owner'"),
|
|
6421
|
-
rule: z8.enum(["required", "min_length", "pattern"]).describe("'required': field must be non-empty (blocks
|
|
6421
|
+
rule: z8.enum(["required", "min_length", "pattern"]).describe("'required': field must be non-empty (blocks accept). 'min_length': minimum string length (warns). 'pattern': regex match (warns)."),
|
|
6422
6422
|
value: z8.string().optional().describe("For min_length: the minimum length as a string integer. For pattern: the regex string. Unused for 'required'.")
|
|
6423
6423
|
});
|
|
6424
6424
|
var fieldSchema = z8.object({
|
|
@@ -6467,7 +6467,7 @@ var collectionsSchema = z8.object({
|
|
|
6467
6467
|
classificationPriority: z8.number().optional().describe("Classifier priority (1\u20139, lower = higher priority). Used with classificationCheck to order the decision tree."),
|
|
6468
6468
|
// FEAT-301 Slice 2: quality gate criteria and usage guidance.
|
|
6469
6469
|
// FEAT-257
|
|
6470
|
-
qualityCriteria: z8.array(qualityCriterionSchema).optional().describe("Per-collection
|
|
6470
|
+
qualityCriteria: z8.array(qualityCriterionSchema).optional().describe("Per-collection accept gate rules. 'required' rule hard-blocks accepts on empty fields; 'min_length'/'pattern' rules warn. Pass an empty array to clear all criteria."),
|
|
6471
6471
|
usageGuidance: z8.string().optional().describe("Plain-text guidance shown to agents and users: when to use this collection, when not to, and what makes a good entry.")
|
|
6472
6472
|
});
|
|
6473
6473
|
function registerCollectionsTools(server) {
|
|
@@ -7474,7 +7474,7 @@ function renderPersistentGapOffers(gaps) {
|
|
|
7474
7474
|
}
|
|
7475
7475
|
lines.push("");
|
|
7476
7476
|
lines.push(
|
|
7477
|
-
'_Say "capture these as tensions" to
|
|
7477
|
+
'_Say "capture these as tensions" to accept them onto the Chain, or skip to continue._'
|
|
7478
7478
|
);
|
|
7479
7479
|
lines.push("");
|
|
7480
7480
|
return lines;
|
|
@@ -7691,7 +7691,7 @@ async function runWrapupReview() {
|
|
|
7691
7691
|
const draftIds = data.drafts.map((d) => `\`${d.entryId}\``).join(", ");
|
|
7692
7692
|
lines.push("### Actions", "");
|
|
7693
7693
|
lines.push(`Uncommitted: ${draftIds}`);
|
|
7694
|
-
lines.push("- **
|
|
7694
|
+
lines.push("- **Accept all:** call `session-wrapup` with action `commit-all`");
|
|
7695
7695
|
lines.push("- **Skip:** call `session action=close` \u2014 drafts remain for next session's orient recovery.");
|
|
7696
7696
|
}
|
|
7697
7697
|
if (data.captureAudit) {
|
|
@@ -7837,14 +7837,14 @@ async function runWrapupCommitAll(data, cachedSuggestions) {
|
|
|
7837
7837
|
const lines = [
|
|
7838
7838
|
"## Wrapup Complete",
|
|
7839
7839
|
"",
|
|
7840
|
-
`**${committed}** drafts
|
|
7840
|
+
`**${committed}** drafts accepted, **${proposalsCreated}** proposals created, **${linksCreated}** links created.`
|
|
7841
7841
|
];
|
|
7842
7842
|
if (linksFailed > 0) {
|
|
7843
7843
|
lines.push(`**${linksFailed}** link${linksFailed === 1 ? "" : "s"} failed to create.`);
|
|
7844
7844
|
}
|
|
7845
7845
|
if (failed.length > 0) {
|
|
7846
7846
|
lines.push("");
|
|
7847
|
-
lines.push("### Failed to
|
|
7847
|
+
lines.push("### Failed to accept");
|
|
7848
7848
|
for (const f of failed) {
|
|
7849
7849
|
lines.push(`- \`${f.entryId}\`: ${f.error}`);
|
|
7850
7850
|
}
|
|
@@ -7867,10 +7867,10 @@ async function runWrapupCommitAll(data, cachedSuggestions) {
|
|
|
7867
7867
|
failed: failed.length
|
|
7868
7868
|
};
|
|
7869
7869
|
}
|
|
7870
|
-
var WRAPUP_TOOL_DESCRIPTION = "Review your session before closing. Shows uncommitted drafts with quality scores, suggests links for low-connection entries, and offers batch
|
|
7870
|
+
var WRAPUP_TOOL_DESCRIPTION = "Review your session before closing. Shows uncommitted drafts with quality scores, suggests links for low-connection entries, and offers batch accept. Run this before `session action=close` to ensure nothing is left behind. If you call `session action=close` without running wrapup first, you'll get a review-only nudge.";
|
|
7871
7871
|
var wrapupSchema = z10.object({
|
|
7872
7872
|
action: z10.enum(["review", "commit-all"]).optional().describe(
|
|
7873
|
-
"Action to perform. 'review' (default) shows the wrapup summary. 'commit-all'
|
|
7873
|
+
"Action to perform. 'review' (default) shows the wrapup summary. 'commit-all' accepts all uncommitted drafts and creates suggested links."
|
|
7874
7874
|
)
|
|
7875
7875
|
});
|
|
7876
7876
|
function registerWrapupTools(server) {
|
|
@@ -7902,7 +7902,7 @@ function registerWrapupTools(server) {
|
|
|
7902
7902
|
})).data;
|
|
7903
7903
|
}
|
|
7904
7904
|
if (data2.drafts.length === 0) {
|
|
7905
|
-
return failureResult("No uncommitted drafts to
|
|
7905
|
+
return failureResult("No uncommitted drafts to accept.", "NOT_FOUND", "No uncommitted drafts to accept.", "Nothing to accept.");
|
|
7906
7906
|
}
|
|
7907
7907
|
const result = await runWrapupCommitAll(data2, useCachedReview ? lastReviewSuggestions : []);
|
|
7908
7908
|
lastReviewData = null;
|
|
@@ -7911,7 +7911,7 @@ function registerWrapupTools(server) {
|
|
|
7911
7911
|
const linkWarnSuffix = result.linksFailed > 0 ? `, ${result.linksFailed} link(s) failed` : "";
|
|
7912
7912
|
return successResult(
|
|
7913
7913
|
result.text,
|
|
7914
|
-
`Wrapup processed: ${result.committed}
|
|
7914
|
+
`Wrapup processed: ${result.committed} accepted, ${result.proposalsCreated} proposals, ${result.linksCreated} links${linkWarnSuffix}.`,
|
|
7915
7915
|
{
|
|
7916
7916
|
committed: result.committed,
|
|
7917
7917
|
proposalsCreated: result.proposalsCreated,
|
|
@@ -7931,7 +7931,7 @@ ${text}` : text;
|
|
|
7931
7931
|
if (failureCode) {
|
|
7932
7932
|
return failureResult(fullText, failureCode, text);
|
|
7933
7933
|
}
|
|
7934
|
-
const localNext = data.drafts.length > 0 ? [{ tool: "session-wrapup", description: "
|
|
7934
|
+
const localNext = data.drafts.length > 0 ? [{ tool: "session-wrapup", description: "Accept all drafts", parameters: { action: "commit-all" } }] : void 0;
|
|
7935
7935
|
const next = kernelNext || localNext;
|
|
7936
7936
|
const gapsSummary = gapCount ? `, ${gapCount} knowledge gaps detected` : "";
|
|
7937
7937
|
const coherenceSummary = coherenceVerdict ? `, coherence: ${coherenceVerdict}` : "";
|
|
@@ -8479,7 +8479,7 @@ function compileWorkflowDefinition(descriptor) {
|
|
|
8479
8479
|
var RETRO_WORKFLOW_DESCRIPTOR = {
|
|
8480
8480
|
id: "retro",
|
|
8481
8481
|
name: "Retrospective",
|
|
8482
|
-
shortDescription: "Structured team retrospective \u2014 reflect, surface patterns, commit to actions.
|
|
8482
|
+
shortDescription: "Structured team retrospective \u2014 reflect, surface patterns, commit to actions. Accepts a decision entry onto the Chain.",
|
|
8483
8483
|
template: {
|
|
8484
8484
|
slug: "retro",
|
|
8485
8485
|
name: "Retrospective"
|
|
@@ -8621,7 +8621,7 @@ Create a Cursor Plan with these rounds as tasks. Mark each in_progress as you en
|
|
|
8621
8621
|
label: "Close & Capture",
|
|
8622
8622
|
type: "close",
|
|
8623
8623
|
instruction: "One last thing \u2014 in one sentence, what's the single most important thing you're taking away from this retro?",
|
|
8624
|
-
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
|
|
8624
|
+
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 accept that draft onto the Chain. Thank them for the retro.",
|
|
8625
8625
|
outputSchema: {
|
|
8626
8626
|
field: "takeaway",
|
|
8627
8627
|
description: "Single-sentence takeaway",
|
|
@@ -8653,7 +8653,7 @@ Create a Cursor Plan with these rounds as tasks. Mark each in_progress as you en
|
|
|
8653
8653
|
2. **AskQuestion not available**: Fall back to numbered options in plain text. "Reply with 1, 2, or 3."
|
|
8654
8654
|
3. **Plan creation fails**: Continue without the Plan. The conversation IS the record.
|
|
8655
8655
|
4. **Participant goes off-topic**: Gently redirect: "That's valuable \u2014 let's capture it. For now, let's stay with [current round]."
|
|
8656
|
-
5. **Participant wants to stop**: Respect it. Summarize what you have so far. Offer to
|
|
8656
|
+
5. **Participant wants to stop**: Respect it. Summarize what you have so far. Offer to accept partial results onto the Chain.
|
|
8657
8657
|
6. **Checkpoint failed (e.g. 400, superseded session)**: Say so in one line. **Start or refresh session** (\`session action=start\` / \`pb session start\`), then \`workflows action=get-run\` with the \`runId\` you were given. If the run is **incomplete**, retry \`checkpoint\` with that \`runId\`. If the run is **complete** or **missing**, treat server state as unreliable: run \`workflows action=start workflowId=retro restart=true\` and **paste the Facilitated workflow handoff block** from the prior chat into round 1 so scope and completed rounds are explicit \u2014 do not assume partial server progress exists.
|
|
8658
8658
|
7. **Cross-agent resume (default expectation)**: Receiving agent reads the handoff block first. Prefer \`get-run\` to verify status; otherwise **restart** and continue from the **next round** named in the handoff. The conversation + handoff block are valid SSOT when ChainWork did not persist checkpoints (TEN-917).
|
|
8659
8659
|
|
|
@@ -8671,7 +8671,7 @@ var SHAPE_WORKFLOW_DESCRIPTOR = {
|
|
|
8671
8671
|
facilitatorPreamble: `You are now in **Shaping Mode**. The shaping skill owns the facilitation loop end-to-end \u2014 read it for scoring rubrics, investigation patterns, and the capture flow.
|
|
8672
8672
|
|
|
8673
8673
|
Use \`capture\` to create constellation entries (elements, risks, decisions, glossary terms) linked to the bet.
|
|
8674
|
-
Use \`facilitate action=commit-constellation\` to atomically
|
|
8674
|
+
Use \`facilitate action=commit-constellation\` to atomically accept the bet and all linked entries when the shape is complete.
|
|
8675
8675
|
Use \`workflows action=checkpoint\` after each round to persist progress to the durable run.`,
|
|
8676
8676
|
rounds: [
|
|
8677
8677
|
{
|
|
@@ -8779,13 +8779,13 @@ Use \`workflows action=checkpoint\` after each round to persist progress to the
|
|
|
8779
8779
|
{
|
|
8780
8780
|
id: "capture",
|
|
8781
8781
|
num: "06",
|
|
8782
|
-
label: "Capture &
|
|
8782
|
+
label: "Capture & Accept",
|
|
8783
8783
|
type: "close",
|
|
8784
|
-
instruction: "Capture the pitch to the Chain.
|
|
8785
|
-
facilitatorGuidance: "List all draft entries created during shaping (elements, risks, decisions, glossary terms). Ask the user to confirm: 'Ready to
|
|
8784
|
+
instruction: "Capture the pitch to the Chain. Accept draft entries. Connect the constellation.",
|
|
8785
|
+
facilitatorGuidance: "List all draft entries created during shaping (elements, risks, decisions, glossary terms). Ask the user to confirm: 'Ready to accept these onto the Chain?' Call `facilitate action=commit-constellation` to atomically accept the bet and all linked entries. Then `graph action=suggest entryId='<betId>'` to discover connections. Create the top 3 suggested relations via `relations action=batch-create`. Thank the user. State: what was shaped, how many constellation entries captured, what the implementer inherits.",
|
|
8786
8786
|
outputSchema: {
|
|
8787
8787
|
field: "capture",
|
|
8788
|
-
description: "Final capture summary \u2014 entries
|
|
8788
|
+
description: "Final capture summary \u2014 entries accepted, relations created",
|
|
8789
8789
|
format: "structured"
|
|
8790
8790
|
},
|
|
8791
8791
|
kbCollection: "work-packages",
|
|
@@ -8837,14 +8837,14 @@ Use \`workflows action=checkpoint\` after each round to persist progress to the
|
|
|
8837
8837
|
2. **Chain capture failure (duplicate)**: The tool handles duplicates by linking existing entries. If it still fails, note the entry name and move on \u2014 capture manually after the session.
|
|
8838
8838
|
3. **Score seems wrong**: Scoring is local to the shaping skill \u2014 re-apply the scoring rubric from the shaping SKILL.md against the conversation context. Scores are heuristic; the agent's judgment matters more than the number.
|
|
8839
8839
|
4. **User wants to stop mid-session**: Respect it. Everything captured so far is on the Chain as drafts. Use \`facilitate action=resume\` to pick up later.
|
|
8840
|
-
5. **MCP server unreachable**: Run the shaping from conversation knowledge. Skip chain capture. Say: "Product Brain is temporarily unavailable \u2014 I'll shape from our conversation and we can
|
|
8840
|
+
5. **MCP server unreachable**: Run the shaping from conversation knowledge. Skip chain capture. Say: "Product Brain is temporarily unavailable \u2014 I'll shape from our conversation and we can accept afterward."
|
|
8841
8841
|
|
|
8842
8842
|
The shaping must never fail silently. Always communicate state.`
|
|
8843
8843
|
};
|
|
8844
8844
|
var IMPLEMENTATION_REVIEW_WORKFLOW_DESCRIPTOR = {
|
|
8845
8845
|
id: "implementation-review",
|
|
8846
8846
|
name: "Implementation Review",
|
|
8847
|
-
shortDescription: "Fix-as-you-go implementation review: finds issues, fixes them immediately, verifies, then proceeds. Three expert lenses (Staff+ Engineer, CTO, Chain Coherence). Spawns sub-agents for code and test review. Extracts learnings into standards/rules. Ends with BET/chain IDs.
|
|
8847
|
+
shortDescription: "Fix-as-you-go implementation review: finds issues, fixes them immediately, verifies, then proceeds. Three expert lenses (Staff+ Engineer, CTO, Chain Coherence). Spawns sub-agents for code and test review. Extracts learnings into standards/rules. Ends with BET/chain IDs. Accepts an insight onto the Chain.",
|
|
8848
8848
|
template: {
|
|
8849
8849
|
slug: "implementation-review",
|
|
8850
8850
|
name: "Implementation Review"
|
|
@@ -9099,10 +9099,10 @@ var PROCESS_CHANGE_WORKFLOW_DESCRIPTOR = {
|
|
|
9099
9099
|
label: "Capture & Close",
|
|
9100
9100
|
type: "close",
|
|
9101
9101
|
instruction: "Capture to the Chain. Link to related entries. Confirm with the user.",
|
|
9102
|
-
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
|
|
9102
|
+
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 accept 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.",
|
|
9103
9103
|
outputSchema: {
|
|
9104
9104
|
field: "capture",
|
|
9105
|
-
description: "Entry captured, relations created,
|
|
9105
|
+
description: "Entry captured, relations created, accept status",
|
|
9106
9106
|
format: "structured"
|
|
9107
9107
|
},
|
|
9108
9108
|
maxDurationHint: "1 min"
|
|
@@ -9128,7 +9128,7 @@ var PROCESS_CHANGE_WORKFLOW_DESCRIPTOR = {
|
|
|
9128
9128
|
},
|
|
9129
9129
|
errorRecovery: `If anything goes wrong during change processing:
|
|
9130
9130
|
|
|
9131
|
-
1. **Tool failure**: Explain briefly. Capture in the conversation. Offer to retry or
|
|
9131
|
+
1. **Tool failure**: Explain briefly. Capture in the conversation. Offer to retry or accept manually later.
|
|
9132
9132
|
2. **Classifier misroutes**: Use update-entry to move the entry to the correct collection. Mention this to the user.
|
|
9133
9133
|
3. **No related entries found**: That's fine \u2014 not every change connects to existing knowledge. Capture it standalone.
|
|
9134
9134
|
4. **MCP unreachable**: Note the change in conversation. Offer to capture when PB is back.
|
|
@@ -9751,7 +9751,7 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
|
|
|
9751
9751
|
} catch (err) {
|
|
9752
9752
|
const msg = err instanceof Error ? err.message : String(err);
|
|
9753
9753
|
lines.push(
|
|
9754
|
-
`**Chain
|
|
9754
|
+
`**Chain accept failed**: ${msg}`,
|
|
9755
9755
|
"",
|
|
9756
9756
|
`The workflow output is preserved in this conversation. `,
|
|
9757
9757
|
`You can manually create the entry later using \`capture\` with:`,
|
|
@@ -9763,7 +9763,7 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
|
|
|
9763
9763
|
content: [{ type: "text", text: lines.join("\n") }],
|
|
9764
9764
|
structuredContent: failure(
|
|
9765
9765
|
"BACKEND_ERROR",
|
|
9766
|
-
`Chain
|
|
9766
|
+
`Chain accept failed: ${msg}.`,
|
|
9767
9767
|
"Capture manually with the capture tool.",
|
|
9768
9768
|
[{ tool: "capture", description: "Capture manually", parameters: {} }]
|
|
9769
9769
|
)
|
|
@@ -9824,7 +9824,7 @@ This checkpoint was NOT saved. The conversation context is preserved \u2014 cont
|
|
|
9824
9824
|
} else {
|
|
9825
9825
|
lines.push(
|
|
9826
9826
|
"",
|
|
9827
|
-
`**All rounds complete.** Call this tool again with \`isFinal: true\` to
|
|
9827
|
+
`**All rounds complete.** Call this tool again with \`isFinal: true\` to accept onto the Chain.`
|
|
9828
9828
|
);
|
|
9829
9829
|
}
|
|
9830
9830
|
return {
|
|
@@ -9975,7 +9975,7 @@ import { z as z14 } from "zod";
|
|
|
9975
9975
|
var FACILITATE_ACTIONS = ["resume", "commit-constellation"];
|
|
9976
9976
|
var facilitateSchema = z14.object({
|
|
9977
9977
|
action: z14.enum(FACILITATE_ACTIONS).describe(
|
|
9978
|
-
"'resume': load session state from an existing bet entry. 'commit-constellation': atomically
|
|
9978
|
+
"'resume': load session state from an existing bet entry. 'commit-constellation': atomically accept a bet and all its linked draft entries in one call. Requires betEntryId."
|
|
9979
9979
|
),
|
|
9980
9980
|
betEntryId: z14.string().optional().describe("Bet entry ID. Required for both actions."),
|
|
9981
9981
|
operationId: z14.string().optional().describe("Optional idempotency key for commit-constellation retries.")
|
|
@@ -9988,8 +9988,8 @@ function registerFacilitateTools(server) {
|
|
|
9988
9988
|
server.registerTool(
|
|
9989
9989
|
"facilitate",
|
|
9990
9990
|
{
|
|
9991
|
-
title: "Facilitate \u2014 Session Resume & Constellation
|
|
9992
|
-
description: "Session state loading and atomic constellation
|
|
9991
|
+
title: "Facilitate \u2014 Session Resume & Constellation Accept",
|
|
9992
|
+
description: "Session state loading and atomic constellation accept for shaped bets.\n\n- **resume**: Load session state (bet data, constellation, drafts) from an existing bet entry.\n- **commit-constellation**: Atomically accept a bet and all its linked draft entries (features, tensions, decisions) in one call. Validates strategy link and required fields before accepting anything. Replaces sequential commit-entry calls.\n\nScoring, coaching, and the facilitation loop are handled by the agent-side shaping skill.",
|
|
9993
9993
|
inputSchema: facilitateSchema,
|
|
9994
9994
|
annotations: {
|
|
9995
9995
|
readOnlyHint: false,
|
|
@@ -10095,9 +10095,9 @@ async function handleCommitConstellation(args) {
|
|
|
10095
10095
|
content: [{
|
|
10096
10096
|
type: "text",
|
|
10097
10097
|
text: [
|
|
10098
|
-
`#
|
|
10098
|
+
`# Accept blocked: contradiction detected`,
|
|
10099
10099
|
"",
|
|
10100
|
-
`\`${betId}\` matches ${preflight.blockingContradictions.length} high-confidence contradiction(s). Resolve the conflict before
|
|
10100
|
+
`\`${betId}\` matches ${preflight.blockingContradictions.length} high-confidence contradiction(s). Resolve the conflict before accepting the constellation.`,
|
|
10101
10101
|
"",
|
|
10102
10102
|
conflictLines
|
|
10103
10103
|
].join("\n")
|
|
@@ -10105,7 +10105,7 @@ async function handleCommitConstellation(args) {
|
|
|
10105
10105
|
structuredContent: failure(
|
|
10106
10106
|
"CONTRADICTION_BLOCKED",
|
|
10107
10107
|
`${preflight.blockingContradictions.length} high-confidence contradiction(s) found.`,
|
|
10108
|
-
"Review the conflicting entry or entries before retrying the
|
|
10108
|
+
"Review the conflicting entry or entries before retrying the accept.",
|
|
10109
10109
|
void 0,
|
|
10110
10110
|
{
|
|
10111
10111
|
betEntryId: betId,
|
|
@@ -10135,16 +10135,16 @@ async function handleCommitConstellation(args) {
|
|
|
10135
10135
|
return {
|
|
10136
10136
|
content: [{
|
|
10137
10137
|
type: "text",
|
|
10138
|
-
text: `# Bet
|
|
10138
|
+
text: `# Bet accept failed
|
|
10139
10139
|
|
|
10140
|
-
\`${betId}\` could not be
|
|
10140
|
+
\`${betId}\` could not be accepted: ${msg}
|
|
10141
10141
|
|
|
10142
|
-
No constellation entries were
|
|
10142
|
+
No constellation entries were accepted.`
|
|
10143
10143
|
}],
|
|
10144
10144
|
structuredContent: failure(
|
|
10145
10145
|
"BACKEND_ERROR",
|
|
10146
|
-
`Bet
|
|
10147
|
-
"Retry or check for
|
|
10146
|
+
`Bet accept failed: ${msg}`,
|
|
10147
|
+
"Retry or check for accept blockers.",
|
|
10148
10148
|
[{ tool: "facilitate", description: "Resume session", parameters: { action: "resume", betEntryId: betId } }],
|
|
10149
10149
|
diagnostics
|
|
10150
10150
|
)
|
|
@@ -10165,15 +10165,15 @@ No constellation entries were committed.`
|
|
|
10165
10165
|
lines.push(
|
|
10166
10166
|
hasIssues ? `# Proposal created with issues` : `# Proposal created`,
|
|
10167
10167
|
"",
|
|
10168
|
-
`Workspace uses consent-based governance. \`${betId}\` was submitted as a proposal \u2014 it will be
|
|
10169
|
-
`No linked entries were
|
|
10168
|
+
`Workspace uses consent-based governance. \`${betId}\` was submitted as a proposal \u2014 it will be accepted when approved.`,
|
|
10169
|
+
`No linked entries were accepted because the bet itself is still awaiting approval.`
|
|
10170
10170
|
);
|
|
10171
10171
|
} else {
|
|
10172
10172
|
lines.push(
|
|
10173
|
-
hasIssues ? `#
|
|
10173
|
+
hasIssues ? `# Accepted with issues` : `# Accepted`,
|
|
10174
10174
|
"",
|
|
10175
|
-
`**${result.committedIds?.length ?? 0} entries**
|
|
10176
|
-
hasIssues ? `\`${betId}\` was partially
|
|
10175
|
+
`**${result.committedIds?.length ?? 0} entries** accepted onto the Chain, **${result.totalRelations} connections** preserved.`,
|
|
10176
|
+
hasIssues ? `\`${betId}\` was partially accepted. Review conflicts/failed entries below before considering the constellation complete.` : `\`${betId}\` and its full constellation are now source of truth.`
|
|
10177
10177
|
);
|
|
10178
10178
|
}
|
|
10179
10179
|
if (preflight.source === "semantic" && preflight.conflicts.length > 0) {
|
|
@@ -10192,13 +10192,13 @@ No constellation entries were committed.`
|
|
|
10192
10192
|
);
|
|
10193
10193
|
}
|
|
10194
10194
|
if ((result.committedIds?.length ?? 0) > 0) {
|
|
10195
|
-
lines.push("", `**
|
|
10195
|
+
lines.push("", `**Accepted:** ${result.committedIds.join(", ")}`);
|
|
10196
10196
|
}
|
|
10197
10197
|
if ((result.alreadyCommittedIds?.length ?? 0) > 0) {
|
|
10198
|
-
lines.push("", `**Already
|
|
10198
|
+
lines.push("", `**Already accepted:** ${result.alreadyCommittedIds.join(", ")}`);
|
|
10199
10199
|
}
|
|
10200
10200
|
if ((result.proposedIds?.length ?? 0) > 0) {
|
|
10201
|
-
lines.push("", `**Proposed (not yet
|
|
10201
|
+
lines.push("", `**Proposed (not yet accepted):** ${result.proposedIds.join(", ")}`);
|
|
10202
10202
|
}
|
|
10203
10203
|
if ((result.conflictIds?.length ?? 0) > 0) {
|
|
10204
10204
|
lines.push("", `**${result.conflictIds.length} conflicts:**`);
|
|
@@ -10559,7 +10559,7 @@ function registerVerifyTools(server) {
|
|
|
10559
10559
|
"verify-entry",
|
|
10560
10560
|
{
|
|
10561
10561
|
title: "Verify Entry",
|
|
10562
|
-
description: "Mark a single entry as verified. Required for agent-origin entries before they can be
|
|
10562
|
+
description: "Mark a single entry as verified. Required for agent-origin entries before they can be accepted. Unlike the 'verify' tool (which scans code mappings against the codebase), this tool only sets verificationStatus to 'verified'. Works in any context \u2014 no codebase required.",
|
|
10563
10563
|
inputSchema: verifyEntrySchema,
|
|
10564
10564
|
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false }
|
|
10565
10565
|
},
|
|
@@ -11203,7 +11203,7 @@ async function buildOrientResponse(wsCtx, agentSessionId, errors, task) {
|
|
|
11203
11203
|
const isLowReadiness = readiness !== null && readiness.score < 50;
|
|
11204
11204
|
const isHighReadiness = readiness !== null && readiness.score >= 50;
|
|
11205
11205
|
const stage = readiness?.stage ?? null;
|
|
11206
|
-
const captureBehaviorNote = wsCtx.governanceMode === "open" ? "_In Open mode, user-authored captures
|
|
11206
|
+
const captureBehaviorNote = wsCtx.governanceMode === "open" ? "_In Open mode, user-authored captures are accepted immediately unless you ask me to keep them as drafts._" : "_Everything I capture stays pending until you confirm._";
|
|
11207
11207
|
const coherence = buildCoherenceSection();
|
|
11208
11208
|
let allCollections = [];
|
|
11209
11209
|
try {
|
|
@@ -13002,7 +13002,7 @@ async function _handleOrient({ mode = "full", tier, task, scope }) {
|
|
|
13002
13002
|
}
|
|
13003
13003
|
let fullCoherenceSnapshot;
|
|
13004
13004
|
if (isLowReadiness) {
|
|
13005
|
-
const captureBehaviorNote = (readiness?.governanceMode ?? wsCtx?.governanceMode ?? "open") === "open" ? "_In Open mode, captures
|
|
13005
|
+
const captureBehaviorNote = (readiness?.governanceMode ?? wsCtx?.governanceMode ?? "open") === "open" ? "_In Open mode, captures are accepted automatically unless you ask me to keep them as drafts._" : "_Everything stays as a draft until you confirm._";
|
|
13006
13006
|
const gaps = readiness.gaps ?? [];
|
|
13007
13007
|
if (gaps.length > 0) {
|
|
13008
13008
|
const gapCtx = {
|
|
@@ -13651,7 +13651,7 @@ async function handleWorkspaceStatus() {
|
|
|
13651
13651
|
`_${stageDescription}_`,
|
|
13652
13652
|
"",
|
|
13653
13653
|
`${scoreBar} ${stageLabel} \xB7 ${score}%`,
|
|
13654
|
-
`**Governance:** ${governanceMode ?? "open"}${(governanceMode ?? "open") !== "open" ? " (
|
|
13654
|
+
`**Governance:** ${governanceMode ?? "open"}${(governanceMode ?? "open") !== "open" ? " (accepts require proposal)" : ""}`,
|
|
13655
13655
|
"",
|
|
13656
13656
|
"## Stats",
|
|
13657
13657
|
`- **Entries:** ${stats.totalEntries} (${stats.activeCount} active, ${stats.draftCount} draft)`,
|
|
@@ -14385,7 +14385,7 @@ function formatEntryMarkdown(entry) {
|
|
|
14385
14385
|
function buildOrientationMarkdown(collections, trackingEvents, standards, businessRules, principles) {
|
|
14386
14386
|
const sections = ["# Product Brain \u2014 Orientation"];
|
|
14387
14387
|
sections.push(
|
|
14388
|
-
"## About Product Brain (PB)\nPB is a knowledge management system used by many product teams. This section describes how PB works \u2014 not your product.\n\n### How PB Organizes Its Tools\n- **Tools** = actions with side-effects or dynamic computation (capture,
|
|
14388
|
+
"## About Product Brain (PB)\nPB is a knowledge management system used by many product teams. This section describes how PB works \u2014 not your product.\n\n### How PB Organizes Its Tools\n- **Tools** = actions with side-effects or dynamic computation (capture, accept, search).\n- **Resources** = stable, read-only data (orientation, terminology, collection schemas).\n- **Prompts** = multi-step choreography (workflows, guided capture, deep dives).\n- Every tool, resource, and prompt works for ANY workspace \u2014 no bespoke logic.\n- Resource templates (URI params) serve workspace-specific data through generic patterns.\n- Compound tools with `action` enums keep the tool count minimal.\n\n### How PB Handles Your Data\n- **Draft-first**: all writes create drafts. SSOT requires explicit user confirmation.\n- **Empty-workspace safe**: every operation handles zero entries and fresh workspaces.\n- **Advisory, not blocking**: quality scores, contradiction checks, and coaching never prevent operations.\n- **Workspace-agnostic**: PB is a product for many teams \u2014 no workspace-specific logic.\n- **Self-documenting**: orient and server instructions teach agents how PB works."
|
|
14389
14389
|
);
|
|
14390
14390
|
const wsRules = [];
|
|
14391
14391
|
for (const p of (principles ?? []).filter((e) => e.status === "active" || e.status === "verified")) {
|
|
@@ -14404,17 +14404,17 @@ function buildOrientationMarkdown(collections, trackingEvents, standards, busine
|
|
|
14404
14404
|
}).join("\n");
|
|
14405
14405
|
sections.push(
|
|
14406
14406
|
`## Your Workspace Principles & Rules (${wsRules.length} active)
|
|
14407
|
-
These are principles, standards, and rules your team has
|
|
14407
|
+
These are principles, standards, and rules your team has accepted onto the Chain. Respect them during implementation.
|
|
14408
14408
|
|
|
14409
14409
|
` + ruleLines + '\n\nUse `entries action=get entryId="<ID>"` to drill into any rule before making changes in that area.'
|
|
14410
14410
|
);
|
|
14411
14411
|
} else {
|
|
14412
14412
|
sections.push(
|
|
14413
|
-
"## Your Workspace Principles & Rules\nNo active principles, standards, or business rules on the Chain yet.\nUse `capture` with collection `principles`, `standards`, or `business-rules` to add your team's guardrails.\nOnce
|
|
14413
|
+
"## Your Workspace Principles & Rules\nNo active principles, standards, or business rules on the Chain yet.\nUse `capture` with collection `principles`, `standards`, or `business-rules` to add your team's guardrails.\nOnce accepted, they appear here at orient time \u2014 so every agent session starts with your rules visible."
|
|
14414
14414
|
);
|
|
14415
14415
|
}
|
|
14416
14416
|
sections.push(
|
|
14417
|
-
"## Core Product Architecture\nThe Chain is a versioned, connected, compounding knowledge base \u2014 the SSOT for a product team.\nEverything on the Chain is one of **three primitives**:\n\n- **Entry** (atom) \u2014 a discrete knowledge unit: target audience, business rule, glossary term, metric, tension. Lives in a collection.\n- **Process** (authored) \u2014 a narrative chain with named links (Strategy Coherence, IDM Proposal). Content is inline text. Collection: `chains`.\n- **Map** (composed) \u2014 a framework assembled by reference (Lean Canvas, Empathy Map). Slots point to ingredient entries. Collection: `maps`.\n\nEntries are atoms. Processes author narrative from atoms. Maps compose frameworks from atoms.\nAll three share the same versioning, branching, gating, and relation system.\n\nThe Chain compounds: each new relation makes entries discoverable from more starting points \u2192 context gathering returns richer results \u2192 AI processes have more context \u2192 quality scores improve \u2192 next
|
|
14417
|
+
"## Core Product Architecture\nThe Chain is a versioned, connected, compounding knowledge base \u2014 the SSOT for a product team.\nEverything on the Chain is one of **three primitives**:\n\n- **Entry** (atom) \u2014 a discrete knowledge unit: target audience, business rule, glossary term, metric, tension. Lives in a collection.\n- **Process** (authored) \u2014 a narrative chain with named links (Strategy Coherence, IDM Proposal). Content is inline text. Collection: `chains`.\n- **Map** (composed) \u2014 a framework assembled by reference (Lean Canvas, Empathy Map). Slots point to ingredient entries. Collection: `maps`.\n\nEntries are atoms. Processes author narrative from atoms. Maps compose frameworks from atoms.\nAll three share the same versioning, branching, gating, and relation system.\n\nThe Chain compounds: each new relation makes entries discoverable from more starting points \u2192 context gathering returns richer results \u2192 AI processes have more context \u2192 quality scores improve \u2192 next accept is smarter than the last."
|
|
14418
14418
|
);
|
|
14419
14419
|
sections.push(
|
|
14420
14420
|
"## Architecture\n```\nCursor (stdio) \u2192 MCP Server (mcp-server/src/index.ts)\n \u2192 POST /api/aki with Bearer token\n \u2192 Convex HTTP Action (convex/http.ts)\n \u2192 internalQuery / internalMutation (convex/agentKnowledge/*)\n \u2192 Convex DB (workspace-scoped)\n```\nSecurity: API key auth on every request, workspace-scoped data, internal functions blocked from external clients.\nKey files: `packages/mcp-server/src/client.ts` (HTTP client + audit), `convex/schema.ts` (schema)."
|
|
@@ -14483,7 +14483,7 @@ var AGENT_CHEATSHEET = `# Product Brain \u2014 Agent Cheatsheet
|
|
|
14483
14483
|
| \`quality\` | Score an entry | \`entryId\` |
|
|
14484
14484
|
| \`session\` | Start / close agent session | \`action\` |
|
|
14485
14485
|
| \`health\` | Check / audit / whoami | \`action\` |
|
|
14486
|
-
| \`facilitate\` | Session resume & constellation
|
|
14486
|
+
| \`facilitate\` | Session resume & constellation accept | \`action\`: resume, commit-constellation |
|
|
14487
14487
|
|
|
14488
14488
|
## Collection Prefixes
|
|
14489
14489
|
GLO (glossary), BR (business-rules), PRI (principles), STD (standards),
|
|
@@ -15047,7 +15047,7 @@ var INSTRUCTIONS = [
|
|
|
15047
15047
|
"These describe how PB works \u2014 not your product.",
|
|
15048
15048
|
"",
|
|
15049
15049
|
"### How PB Organizes Its Tools",
|
|
15050
|
-
"- **Tools** are for actions with side-effects or dynamic computation (capture,
|
|
15050
|
+
"- **Tools** are for actions with side-effects or dynamic computation (capture, accept, search).",
|
|
15051
15051
|
"- **Resources** are for stable, read-only data (orientation, terminology, collection schemas).",
|
|
15052
15052
|
"- **Prompts** are for multi-step choreography (workflows, guided capture, deep dives).",
|
|
15053
15053
|
"- Every tool, resource, and prompt works for ANY workspace \u2014 no bespoke logic.",
|
|
@@ -15080,7 +15080,7 @@ var INSTRUCTIONS = [
|
|
|
15080
15080
|
' 4. Drill in: use `entries action=get entryId="..."` for full details \u2014 data, labels, relations, history.',
|
|
15081
15081
|
" 5. Context: use `context action=gather` with an entryId or a task description.",
|
|
15082
15082
|
" 6. Capture: use `capture` to create entries \u2014 auto-links and scores in one call.",
|
|
15083
|
-
" 7.
|
|
15083
|
+
" 7. Accept: use `commit-entry` to promote drafts to SSOT \u2014 only when the user confirms.",
|
|
15084
15084
|
" 8. Connect: use `graph action=suggest` then `relations action=create` to build the graph.",
|
|
15085
15085
|
" 9. Wrapup: call `session-wrapup` before closing \u2014 reviews drafts, coaches quality, suggests links.",
|
|
15086
15086
|
" 10. Close: call `session action=close` when done \u2014 records session activity. Auto-nudges if wrapup was skipped.",
|
|
@@ -15089,8 +15089,8 @@ var INSTRUCTIONS = [
|
|
|
15089
15089
|
" - Call `start_pb` to begin (starts session + loads context). Call `orient` mid-session for a refresh.",
|
|
15090
15090
|
" - A readwrite API key scope",
|
|
15091
15091
|
"",
|
|
15092
|
-
"
|
|
15093
|
-
"Only call `commit-entry` when the user explicitly confirms (e.g. '
|
|
15092
|
+
"Accept-on-confirm: always capture as draft first and show the user what was captured.",
|
|
15093
|
+
"Only call `commit-entry` when the user explicitly confirms (e.g. 'accept', 'looks good', 'yes').",
|
|
15094
15094
|
"This builds trust \u2014 the Chain (main) is SSOT; nothing goes there without user consent.",
|
|
15095
15095
|
"",
|
|
15096
15096
|
"Alignment-first: before proposing or building anything, check orient's Workspace Governance",
|
|
@@ -15290,4 +15290,4 @@ export {
|
|
|
15290
15290
|
createProductBrainServer,
|
|
15291
15291
|
initFeatureFlags
|
|
15292
15292
|
};
|
|
15293
|
-
//# sourceMappingURL=chunk-
|
|
15293
|
+
//# sourceMappingURL=chunk-WG7H45D3.js.map
|