thumbgate 1.6.0 โ 1.8.0
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/adapters/README.md +1 -1
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/mcp/server-stdio.js +90 -2
- package/adapters/opencode/opencode.json +1 -1
- package/bin/cli.js +39 -5
- package/config/mcp-allowlists.json +10 -1
- package/package.json +13 -7
- package/public/index.html +2 -2
- package/scripts/autonomous-workflow.js +377 -0
- package/scripts/billing.js +4 -2
- package/scripts/feedback-loop.js +22 -0
- package/scripts/gates-engine.js +308 -5
- package/scripts/mailer/resend-mailer.js +210 -40
- package/scripts/statusline-context.js +207 -0
- package/scripts/statusline.sh +31 -14
- package/scripts/tool-registry.js +39 -0
- package/CHANGELOG.md +0 -702
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate-marketplace",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"owner": {
|
|
5
5
|
"name": "Igor Ganapolsky",
|
|
6
6
|
"email": "ig5973700@gmail.com"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"source": "npm",
|
|
14
14
|
"package": "thumbgate"
|
|
15
15
|
},
|
|
16
|
-
"version": "1.
|
|
16
|
+
"version": "1.8.0",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "Igor Ganapolsky"
|
|
19
19
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
3
|
"description": "Type ๐ or ๐ on any agent action. ThumbGate captures it, distills a lesson, and blocks the pattern from repeating. One thumbs-down = the agent physically cannot make that mistake again. 33 pre-action gates, budget enforcement, self-protection, and NIST/SOC2 compliance tags.",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.8.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Igor Ganapolsky"
|
|
7
7
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "ThumbGate โ ๐๐ feedback that teaches your AI agent. Thumbs down a mistake, it never happens again.",
|
|
5
5
|
"homepage": "https://github.com/IgorGanapolsky/thumbgate",
|
|
6
6
|
"transport": "stdio",
|
package/adapters/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
- `chatgpt/openapi.yaml`: import into GPT Actions.
|
|
4
4
|
- `gemini/function-declarations.json`: Gemini function-calling definitions.
|
|
5
5
|
- `mcp/server-stdio.js`: underlying local MCP stdio server implementation.
|
|
6
|
-
- `claude/.mcp.json`: example Claude Code MCP config using `npx --yes --package thumbgate@1.
|
|
6
|
+
- `claude/.mcp.json`: example Claude Code MCP config using `npx --yes --package thumbgate@1.8.0 thumbgate serve`.
|
|
7
7
|
- `codex/config.toml`: example Codex MCP profile section using the same version-pinned portable launcher.
|
|
8
8
|
- `amp/skills/thumbgate-feedback/SKILL.md`: Amp skill template.
|
|
9
9
|
- `opencode/opencode.json`: portable OpenCode MCP profile using the same version-pinned portable launcher.
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"thumbgate": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--yes", "--package", "thumbgate@1.
|
|
5
|
+
"args": ["--yes", "--package", "thumbgate@1.8.0", "thumbgate", "serve"]
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
8
|
"hooks": {
|
|
9
9
|
"preToolUse": {
|
|
10
10
|
"command": "npx",
|
|
11
|
-
"args": ["--yes", "--package", "thumbgate@1.
|
|
11
|
+
"args": ["--yes", "--package", "thumbgate@1.8.0", "thumbgate", "gate-check"]
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -125,6 +125,8 @@ const {
|
|
|
125
125
|
formatUnifiedContext,
|
|
126
126
|
} = require('../../scripts/context-manager');
|
|
127
127
|
const { exportHfDataset } = require('../../scripts/export-hf-dataset');
|
|
128
|
+
const { distributeContextToAgents } = require('../../scripts/swarm-coordinator');
|
|
129
|
+
const { buildSessionReport } = require('../../scripts/session-report');
|
|
128
130
|
|
|
129
131
|
const PRO_CHECKOUT_URL = 'https://thumbgate-production.up.railway.app/checkout/pro';
|
|
130
132
|
|
|
@@ -146,7 +148,7 @@ const {
|
|
|
146
148
|
finalizeSession: finalizeFeedbackSession,
|
|
147
149
|
} = require('../../scripts/feedback-session');
|
|
148
150
|
|
|
149
|
-
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.
|
|
151
|
+
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.8.0' };
|
|
150
152
|
const COMMERCE_CATEGORIES = [
|
|
151
153
|
'product_recommendation',
|
|
152
154
|
'brand_compliance',
|
|
@@ -201,6 +203,43 @@ function toTextResult(payload) {
|
|
|
201
203
|
};
|
|
202
204
|
}
|
|
203
205
|
|
|
206
|
+
// Format corrective actions as a top-level <system-reminder> block so the
|
|
207
|
+
// calling agent treats them as first-class guidance, not buried JSON.
|
|
208
|
+
// Shape of `actions` varies: lesson-db.inferCorrectiveActions returns
|
|
209
|
+
// {whatToChange, tags, timestamp}; lesson-search.buildSystemActions returns
|
|
210
|
+
// {type, source, text}. Normalize to a single bulleted list.
|
|
211
|
+
function formatCorrectiveActionsReminder(actions) {
|
|
212
|
+
if (!Array.isArray(actions) || actions.length === 0) return '';
|
|
213
|
+
const lines = ['<system-reminder>', 'ThumbGate surfaced prior lessons matching this failure.', 'REVIEW BEFORE YOUR NEXT ACTION:'];
|
|
214
|
+
actions.slice(0, 5).forEach((action, idx) => {
|
|
215
|
+
const text = (action && (action.whatToChange || action.text || action.message)) || '';
|
|
216
|
+
if (!text) return;
|
|
217
|
+
const tags = Array.isArray(action.tags) && action.tags.length > 0 ? ` [${action.tags.join(', ')}]` : '';
|
|
218
|
+
lines.push(`${idx + 1}. ${String(text).trim()}${tags}`);
|
|
219
|
+
});
|
|
220
|
+
lines.push('</system-reminder>', '');
|
|
221
|
+
return lines.join('\n');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Wrap capture_feedback payloads so correctiveActions surface as a
|
|
225
|
+
// top-level <system-reminder> text block appended alongside the JSON body.
|
|
226
|
+
//
|
|
227
|
+
// Ordering: JSON body is content[0] (preserves backward compatibility with
|
|
228
|
+
// callers that parse content[0].text as JSON); the reminder is content[1]
|
|
229
|
+
// so it still appears as a top-level block the agent must process โ not
|
|
230
|
+
// buried inside the JSON structure.
|
|
231
|
+
function toCaptureFeedbackTextResult(result) {
|
|
232
|
+
const body = JSON.stringify(result, null, 2);
|
|
233
|
+
const blocks = [{ type: 'text', text: body }];
|
|
234
|
+
const reminder = result && Array.isArray(result.correctiveActions)
|
|
235
|
+
? formatCorrectiveActionsReminder(result.correctiveActions)
|
|
236
|
+
: '';
|
|
237
|
+
if (reminder) {
|
|
238
|
+
blocks.push({ type: 'text', text: reminder });
|
|
239
|
+
}
|
|
240
|
+
return { content: blocks };
|
|
241
|
+
}
|
|
242
|
+
|
|
204
243
|
function formatContextPack(pack) {
|
|
205
244
|
const lines = [
|
|
206
245
|
'## Context Pack',
|
|
@@ -447,7 +486,7 @@ async function callToolInner(name, args) {
|
|
|
447
486
|
switch (name) {
|
|
448
487
|
case 'capture_feedback':
|
|
449
488
|
|
|
450
|
-
return
|
|
489
|
+
return toCaptureFeedbackTextResult(captureFeedback(args));
|
|
451
490
|
case 'feedback_summary':
|
|
452
491
|
return toTextResult(feedbackSummary(Number(args.recent || 20)));
|
|
453
492
|
case 'search_lessons':
|
|
@@ -699,6 +738,53 @@ async function callToolInner(name, args) {
|
|
|
699
738
|
}
|
|
700
739
|
case 'verify_claim':
|
|
701
740
|
return toTextResult(verifyClaimEvidence(args.claim));
|
|
741
|
+
case 'require_evidence_for_claim': {
|
|
742
|
+
if (!args.claim || typeof args.claim !== 'string') {
|
|
743
|
+
throw new Error('claim is required and must be a string');
|
|
744
|
+
}
|
|
745
|
+
const verification = verifyClaimEvidence(args.claim);
|
|
746
|
+
const mode = args.mode === 'advisory' ? 'advisory' : 'blocking';
|
|
747
|
+
const hasMatchingChecks = Array.isArray(verification.checks) && verification.checks.length > 0;
|
|
748
|
+
const evidenceMissing = hasMatchingChecks && !verification.verified;
|
|
749
|
+
const blocking = mode === 'blocking' && evidenceMissing;
|
|
750
|
+
const missingActions = hasMatchingChecks
|
|
751
|
+
? Array.from(new Set(verification.checks.flatMap((check) => check.missing || [])))
|
|
752
|
+
: [];
|
|
753
|
+
try {
|
|
754
|
+
const { recordAuditEvent } = require('../../scripts/audit-trail');
|
|
755
|
+
recordAuditEvent({
|
|
756
|
+
toolName: 'require_evidence_for_claim',
|
|
757
|
+
toolInput: { claim: args.claim, mode, sessionId: args.sessionId || null },
|
|
758
|
+
decision: blocking ? 'deny' : 'allow',
|
|
759
|
+
gateId: 'completion_claim',
|
|
760
|
+
message: blocking
|
|
761
|
+
? `Completion claim blocked โ missing evidence: ${missingActions.join(', ') || 'unknown'}`
|
|
762
|
+
: `Completion claim verified (${verification.verified ? 'evidence present' : 'no matching gate'})`,
|
|
763
|
+
source: 'completion-gate',
|
|
764
|
+
});
|
|
765
|
+
} catch { /* audit write must never break tool response */ }
|
|
766
|
+
return toTextResult({
|
|
767
|
+
claim: args.claim,
|
|
768
|
+
mode,
|
|
769
|
+
blocking,
|
|
770
|
+
verified: verification.verified,
|
|
771
|
+
matchedChecks: hasMatchingChecks,
|
|
772
|
+
missingActions,
|
|
773
|
+
checks: verification.checks,
|
|
774
|
+
sessionId: args.sessionId || null,
|
|
775
|
+
});
|
|
776
|
+
}
|
|
777
|
+
case 'distribute_context_to_agents':
|
|
778
|
+
return toTextResult(distributeContextToAgents({
|
|
779
|
+
query: args.query || '',
|
|
780
|
+
agents: args.agents,
|
|
781
|
+
maxItems: args.maxItems,
|
|
782
|
+
maxChars: args.maxChars,
|
|
783
|
+
namespaces: Array.isArray(args.namespaces) ? args.namespaces : [],
|
|
784
|
+
ttlMs: args.ttlMs,
|
|
785
|
+
}));
|
|
786
|
+
case 'session_report':
|
|
787
|
+
return toTextResult(buildSessionReport({ windowHours: args.windowHours }));
|
|
702
788
|
case 'check_operational_integrity':
|
|
703
789
|
return toTextResult(evaluateOperationalIntegrity({
|
|
704
790
|
repoPath: args.repoPath,
|
|
@@ -1008,4 +1094,6 @@ module.exports = {
|
|
|
1008
1094
|
callTool,
|
|
1009
1095
|
startStdioServer,
|
|
1010
1096
|
acquireLock,
|
|
1097
|
+
toCaptureFeedbackTextResult,
|
|
1098
|
+
formatCorrectiveActionsReminder,
|
|
1011
1099
|
};
|
package/bin/cli.js
CHANGED
|
@@ -1591,19 +1591,53 @@ function sessionStart() {
|
|
|
1591
1591
|
const { refreshStatuslineCache } = require(path.join(PKG_ROOT, 'scripts', 'hook-thumbgate-cache-updater'));
|
|
1592
1592
|
refreshStatuslineCache(analyzeFeedback());
|
|
1593
1593
|
|
|
1594
|
-
//
|
|
1594
|
+
// Build a top-level <system-reminder> block that Claude Code's SessionStart
|
|
1595
|
+
// hook surfaces to the agent as first-class context โ not buried stderr.
|
|
1596
|
+
// Contract: emit JSON `{hookSpecificOutput:{hookEventName:"SessionStart",
|
|
1597
|
+
// additionalContext:"..."}}` to stdout. Supported by Claude Code v0.4+.
|
|
1598
|
+
const reminderLines = [];
|
|
1599
|
+
|
|
1600
|
+
// Active hard-block rules from gate-program.md
|
|
1595
1601
|
try {
|
|
1596
1602
|
const { readGateProgram, extractBlockPatterns } = require(path.join(PKG_ROOT, 'scripts', 'meta-agent-loop'));
|
|
1597
1603
|
const gateProgram = readGateProgram();
|
|
1598
1604
|
if (gateProgram) {
|
|
1599
1605
|
const blockPatterns = extractBlockPatterns(gateProgram);
|
|
1600
1606
|
if (blockPatterns.length > 0) {
|
|
1601
|
-
|
|
1602
|
-
blockPatterns.forEach((p, i) =>
|
|
1603
|
-
process.stderr.write('\n');
|
|
1607
|
+
reminderLines.push('Active ThumbGate hard-block rules:');
|
|
1608
|
+
blockPatterns.forEach((p, i) => reminderLines.push(` ${i + 1}. ${p}`));
|
|
1604
1609
|
}
|
|
1605
1610
|
}
|
|
1606
|
-
} catch (_) { /*
|
|
1611
|
+
} catch (_) { /* non-critical */ }
|
|
1612
|
+
|
|
1613
|
+
// Top high-risk tags โ force agent to see them at session start, not opt-in
|
|
1614
|
+
try {
|
|
1615
|
+
const { getRiskSummary } = require(path.join(PKG_ROOT, 'scripts', 'risk-scorer'));
|
|
1616
|
+
const summary = getRiskSummary();
|
|
1617
|
+
if (summary && Array.isArray(summary.highRiskTags) && summary.highRiskTags.length > 0) {
|
|
1618
|
+
if (reminderLines.length > 0) reminderLines.push('');
|
|
1619
|
+
reminderLines.push('Top high-risk tags from prior failures:');
|
|
1620
|
+
summary.highRiskTags.slice(0, 5).forEach((bucket, i) => {
|
|
1621
|
+
const key = bucket && (bucket.key || bucket.tag);
|
|
1622
|
+
const score = bucket && (bucket.risk || bucket.score || bucket.riskScore);
|
|
1623
|
+
if (key) reminderLines.push(` ${i + 1}. ${key} (risk=${score || '?'})`);
|
|
1624
|
+
});
|
|
1625
|
+
}
|
|
1626
|
+
} catch (_) { /* non-critical */ }
|
|
1627
|
+
|
|
1628
|
+
if (reminderLines.length > 0) {
|
|
1629
|
+
const additionalContext = ['<system-reminder>', ...reminderLines, '</system-reminder>'].join('\n');
|
|
1630
|
+
try {
|
|
1631
|
+
process.stdout.write(JSON.stringify({
|
|
1632
|
+
hookSpecificOutput: {
|
|
1633
|
+
hookEventName: 'SessionStart',
|
|
1634
|
+
additionalContext,
|
|
1635
|
+
},
|
|
1636
|
+
}));
|
|
1637
|
+
} catch (_) { /* stdout write failure is non-critical */ }
|
|
1638
|
+
// Legacy stderr fallback for older Claude Code versions
|
|
1639
|
+
process.stderr.write('\n[ThumbGate] ' + reminderLines.join('\n[ThumbGate] ') + '\n');
|
|
1640
|
+
}
|
|
1607
1641
|
}
|
|
1608
1642
|
|
|
1609
1643
|
function installMcp() {
|
|
@@ -52,6 +52,9 @@
|
|
|
52
52
|
"get_reliability_rules",
|
|
53
53
|
"describe_reliability_entity",
|
|
54
54
|
"report_product_issue",
|
|
55
|
+
"require_evidence_for_claim",
|
|
56
|
+
"distribute_context_to_agents",
|
|
57
|
+
"session_report",
|
|
55
58
|
"perplexity_search",
|
|
56
59
|
"perplexity_ask",
|
|
57
60
|
"perplexity_research",
|
|
@@ -81,7 +84,9 @@
|
|
|
81
84
|
"feedback_stats",
|
|
82
85
|
"feedback_summary",
|
|
83
86
|
"estimate_uncertainty",
|
|
84
|
-
"report_product_issue"
|
|
87
|
+
"report_product_issue",
|
|
88
|
+
"require_evidence_for_claim",
|
|
89
|
+
"session_report"
|
|
85
90
|
],
|
|
86
91
|
"commerce": [
|
|
87
92
|
"capture_feedback",
|
|
@@ -129,6 +134,8 @@
|
|
|
129
134
|
"describe_semantic_entity",
|
|
130
135
|
"get_reliability_rules",
|
|
131
136
|
"describe_reliability_entity",
|
|
137
|
+
"require_evidence_for_claim",
|
|
138
|
+
"session_report",
|
|
132
139
|
"perplexity_search",
|
|
133
140
|
"perplexity_ask"
|
|
134
141
|
],
|
|
@@ -158,6 +165,8 @@
|
|
|
158
165
|
"describe_semantic_entity",
|
|
159
166
|
"get_reliability_rules",
|
|
160
167
|
"describe_reliability_entity",
|
|
168
|
+
"require_evidence_for_claim",
|
|
169
|
+
"session_report",
|
|
161
170
|
"perplexity_search",
|
|
162
171
|
"perplexity_ask"
|
|
163
172
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Self-improving agent governance: type thumbs-up or thumbs-down on any AI agent action. ThumbGate turns every mistake into a prevention rule and blocks the pattern from repeating. One thumbs-down, never again. 33 pre-action gates, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
|
|
5
5
|
"homepage": "https://thumbgate-production.up.railway.app",
|
|
6
6
|
"repository": {
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
".claude-plugin/marketplace.json",
|
|
20
20
|
".claude-plugin/plugin.json",
|
|
21
21
|
".well-known/",
|
|
22
|
-
"CHANGELOG.md",
|
|
23
22
|
"LICENSE",
|
|
24
23
|
"README.md",
|
|
25
24
|
"adapters/amp/skills/thumbgate-feedback/SKILL.md",
|
|
@@ -49,6 +48,7 @@
|
|
|
49
48
|
"scripts/agentic-data-pipeline.js",
|
|
50
49
|
"scripts/analytics-report.js",
|
|
51
50
|
"scripts/analytics-window.js",
|
|
51
|
+
"scripts/autonomous-workflow.js",
|
|
52
52
|
"scripts/async-job-runner.js",
|
|
53
53
|
"scripts/audit-trail.js",
|
|
54
54
|
"scripts/auto-promote-gates.js",
|
|
@@ -173,6 +173,7 @@
|
|
|
173
173
|
"scripts/slo-alert-engine.js",
|
|
174
174
|
"scripts/spec-gate.js",
|
|
175
175
|
"scripts/statusline-cache-path.js",
|
|
176
|
+
"scripts/statusline-context.js",
|
|
176
177
|
"scripts/statusline-lesson.js",
|
|
177
178
|
"scripts/statusline-links.js",
|
|
178
179
|
"scripts/statusline-local-stats.js",
|
|
@@ -251,7 +252,10 @@
|
|
|
251
252
|
"trace:eval": "node scripts/decision-trace.js eval",
|
|
252
253
|
"social:reply-monitor": "node scripts/social-reply-monitor.js",
|
|
253
254
|
"social:reply-monitor:dry": "node scripts/social-reply-monitor.js --dry-run",
|
|
254
|
-
"test": "npm run test:schema && npm run test:loop && npm run test:dpo && npm run test:kto && npm run test:api && npm run test:proof && npm run test:e2e && npm run test:rlaif && npm run test:attribution && npm run test:quality && npm run test:intelligence && npm run test:training-export && npm run test:deployment && npm run test:operational-integrity && npm run test:workflow && npm run test:billing && npm run test:cli && npm run test:watcher && npm run test:autoresearch && npm run test:ops && npm run test:session-analyzer && npm run test:tessl && npm run test:gates && npm run test:evoskill && npm run test:gates-hardening && npm run test:workers && npm run test:social-analytics && npm run test:memalign && npm run test:xmemory-lite && npm run test:filesystem-search && npm run test:zernio && npm run test:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:obsidian-export && npm run test:lesson-db && npm run test:lesson-rotation && npm run test:memory-dedup && npm run test:feedback-quality && npm run test:sync-version && npm run test:check-congruence && npm run test:tool-registry && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:plan-gate && npm run test:pulse && npm run test:semantic-layer && npm run test:data-pipeline && npm run test:optimize-context && npm run test:principle-extractor && npm run test:analytics-window && npm run test:funnel-analytics && npm run test:experiment-tracker && npm run test:build-metadata && npm run test:context-engine && npm run test:hf-papers && npm run test:marketing-experiment && npm run test:seo-gsd && npm run test:verify-run && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:bot-detector && npm run test:postinstall && npm run test:funnel-invariants && npm run test:cli-telemetry && npm run test:pro-parity && npm run test:model-tier-router && npm run test:computer-use-firewall && npm run test:skill-exporter && npm run test:statusline && npm run test:evolution && npm run test:org-dashboard && npm run test:multi-hop-recall && npm run test:synthetic-dpo && npm run test:thumbgate-skill && npm run test:learn-hub && npm run test:feedback-fallback && npm run test:metaclaw && npm run test:server-lock && npm run test:control-tower && npm run test:pii-scanner && npm run test:data-governance && npm run test:lesson-inference && npm run test:semantic-dedup && npm run test:fs-utils && npm run test:cli-schema && npm run test:explore && npm run test:lesson-reranker && npm run test:lesson-retrieval && npm run test:cross-encoder && npm run test:reflector-agent && npm run test:feedback-session && npm run test:feedback-history-distiller && npm run test:hallucination-detector && npm run test:history-distiller && npm run test:predictive-insights && npm run test:prove-predictive-insights && npm run test:statusbar-cli && npm run test:generate-instagram-card && npm run test:instagram-thumbgate-post && npm run test:publish-instagram-thumbgate && npm run test:lesson-synthesis && npm run test:background-governance && npm run test:memory-migration && npm run test:prompt-dlp && npm run test:ephemeral-store && npm run test:agent-security && npm run test:skill-progressive && npm run test:per-step-scoring && npm run test:weekly-auto-post && npm run test:social-post-hourly && npm run test:social-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && npm run test:budget && npm run test:quick-start && npm run test:utm && npm run test:product-feedback && npm run test:feedback-root-consolidator && npm run test:engagement-audit && npm run test:install-growth-automation && npm run test:publish-thumbgate-launch && npm run test:reconcile-thumbgate-campaign && npm run test:reddit-publisher && npm run test:schedule-thumbgate-campaign && npm run test:social-reply-monitor && npm run test:sync-launch-assets && npm run test:ai-search-visibility && npm run test:perplexity && npm run test:security-scanner && npm run test:llm-client && npm run test:managed-lesson-agent && npm run test:self-distill && npm run test:meta-agent && npm run test:harness-selector && npm run test:thumbgate-bench && npm run test:seo-guides && npm run test:enforcement-loop && npm run test:cli-agent-experience && npm run test:bot-detection && npm run test:checkout-bot-guard && npm run test:session-health && npm run test:session-episodes && npm run test:spec-gate && npm run test:decision-trace && npm run test:dashboard-insights && npm run test:prompt-eval && npm run test:demo-voiceover && npm run test:gate-coherence && npm run test:gate-eval && npm run test:high-roi && npm run test:public-static-assets && npm run test:token-savings && npm run test:workflow-gate-checkpoint && npm run test:lesson-export-import && npm run test:landing-page-claims && npm run test:dashboard-deeplink-e2e && npm run test:public-package-parity && npm run test:token-savings-dashboard && npm run test:cursor-wiring && npm run test:pretooluse-injection && npm run test:recent-corrective-context && npm run test:durability-step && npm run test:mailer && npm run test:brand-assets",
|
|
255
|
+
"test": "npm run test:schema && npm run test:loop && npm run test:dpo && npm run test:kto && npm run test:api && npm run test:proof && npm run test:e2e && npm run test:rlaif && npm run test:attribution && npm run test:quality && npm run test:intelligence && npm run test:training-export && npm run test:deployment && npm run test:operational-integrity && npm run test:workflow && npm run test:billing && npm run test:cli && npm run test:watcher && npm run test:autoresearch && npm run test:ops && npm run test:session-analyzer && npm run test:tessl && npm run test:gates && npm run test:evoskill && npm run test:gates-hardening && npm run test:workers && npm run test:social-analytics && npm run test:memalign && npm run test:xmemory-lite && npm run test:filesystem-search && npm run test:zernio && npm run test:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:obsidian-export && npm run test:lesson-db && npm run test:lesson-rotation && npm run test:memory-dedup && npm run test:feedback-quality && npm run test:sync-version && npm run test:check-congruence && npm run test:tool-registry && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:plan-gate && npm run test:pulse && npm run test:semantic-layer && npm run test:data-pipeline && npm run test:optimize-context && npm run test:principle-extractor && npm run test:analytics-window && npm run test:funnel-analytics && npm run test:experiment-tracker && npm run test:build-metadata && npm run test:context-engine && npm run test:hf-papers && npm run test:marketing-experiment && npm run test:seo-gsd && npm run test:verify-run && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:bot-detector && npm run test:postinstall && npm run test:funnel-invariants && npm run test:cli-telemetry && npm run test:pro-parity && npm run test:model-tier-router && npm run test:computer-use-firewall && npm run test:skill-exporter && npm run test:statusline && npm run test:evolution && npm run test:org-dashboard && npm run test:multi-hop-recall && npm run test:synthetic-dpo && npm run test:thumbgate-skill && npm run test:learn-hub && npm run test:feedback-fallback && npm run test:metaclaw && npm run test:server-lock && npm run test:control-tower && npm run test:pii-scanner && npm run test:data-governance && npm run test:lesson-inference && npm run test:semantic-dedup && npm run test:fs-utils && npm run test:cli-schema && npm run test:explore && npm run test:lesson-reranker && npm run test:lesson-retrieval && npm run test:cross-encoder && npm run test:reflector-agent && npm run test:feedback-session && npm run test:feedback-history-distiller && npm run test:hallucination-detector && npm run test:history-distiller && npm run test:predictive-insights && npm run test:prove-predictive-insights && npm run test:statusbar-cli && npm run test:generate-instagram-card && npm run test:instagram-thumbgate-post && npm run test:publish-instagram-thumbgate && npm run test:lesson-synthesis && npm run test:background-governance && npm run test:memory-migration && npm run test:prompt-dlp && npm run test:ephemeral-store && npm run test:agent-security && npm run test:skill-progressive && npm run test:per-step-scoring && npm run test:weekly-auto-post && npm run test:social-post-hourly && npm run test:social-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && npm run test:budget && npm run test:quick-start && npm run test:utm && npm run test:product-feedback && npm run test:feedback-root-consolidator && npm run test:engagement-audit && npm run test:install-growth-automation && npm run test:publish-thumbgate-launch && npm run test:reconcile-thumbgate-campaign && npm run test:reddit-publisher && npm run test:schedule-thumbgate-campaign && npm run test:social-reply-monitor && npm run test:sync-launch-assets && npm run test:ai-search-visibility && npm run test:perplexity && npm run test:security-scanner && npm run test:llm-client && npm run test:managed-lesson-agent && npm run test:self-distill && npm run test:meta-agent && npm run test:harness-selector && npm run test:thumbgate-bench && npm run test:seo-guides && npm run test:enforcement-loop && npm run test:cli-agent-experience && npm run test:bot-detection && npm run test:checkout-bot-guard && npm run test:session-health && npm run test:session-episodes && npm run test:spec-gate && npm run test:decision-trace && npm run test:dashboard-insights && npm run test:prompt-eval && npm run test:demo-voiceover && npm run test:gate-coherence && npm run test:gate-eval && npm run test:high-roi && npm run test:public-static-assets && npm run test:token-savings && npm run test:workflow-gate-checkpoint && npm run test:lesson-export-import && npm run test:landing-page-claims && npm run test:dashboard-deeplink-e2e && npm run test:public-package-parity && npm run test:token-savings-dashboard && npm run test:cursor-wiring && npm run test:pretooluse-injection && npm run test:recent-corrective-context && npm run test:durability-step && npm run test:mailer && npm run test:brand-assets && npm run test:enforcement-teeth && npm run test:swarm-coordinator && npm run test:session-report && npm run test:require-evidence-gate",
|
|
256
|
+
"test:swarm-coordinator": "node --test tests/swarm-coordinator.test.js",
|
|
257
|
+
"test:session-report": "node --test tests/session-report.test.js",
|
|
258
|
+
"test:require-evidence-gate": "node --test tests/require-evidence-gate.test.js",
|
|
255
259
|
"test:session-health": "node --test tests/session-health-sensor.test.js",
|
|
256
260
|
"test:session-episodes": "node --test tests/session-episode-store.test.js",
|
|
257
261
|
"test:spec-gate": "node --test tests/spec-gate.test.js",
|
|
@@ -265,7 +269,7 @@
|
|
|
265
269
|
"test:multi-hop-recall": "node --test tests/multi-hop-recall.test.js",
|
|
266
270
|
"test:synthetic-dpo": "node --test tests/synthetic-dpo.test.js",
|
|
267
271
|
"test:thumbgate-skill": "node --test tests/thumbgate-skill.test.js",
|
|
268
|
-
"test:statusline": "node --test tests/claude-feedback-sync.test.js tests/statusline.test.js tests/statusline-links.test.js",
|
|
272
|
+
"test:statusline": "node --test tests/claude-feedback-sync.test.js tests/statusline.test.js tests/statusline-context.test.js tests/statusline-links.test.js",
|
|
269
273
|
"test:memory-dedup": "node --test tests/memory-dedup.test.js",
|
|
270
274
|
"test:lesson-db": "node --test tests/lesson-db.test.js",
|
|
271
275
|
"test:lesson-rotation": "node --test tests/lesson-rotation.test.js",
|
|
@@ -483,10 +487,11 @@
|
|
|
483
487
|
"test:demo-voiceover": "node --test tests/demo-voiceover.test.js",
|
|
484
488
|
"test:gate-coherence": "node --test tests/gate-coherence.test.js",
|
|
485
489
|
"test:gate-eval": "node --test tests/gate-eval.test.js",
|
|
486
|
-
"test:high-roi": "node --test tests/high-roi.test.js",
|
|
490
|
+
"test:high-roi": "node --test tests/high-roi.test.js tests/autonomous-workflow.test.js",
|
|
487
491
|
"test:public-static-assets": "node --test tests/public-static-assets.test.js",
|
|
488
492
|
"test:token-savings": "node --test tests/token-savings.test.js",
|
|
489
|
-
"test:workflow-gate-checkpoint": "node --test tests/workflow-gate-checkpoint.test.js",
|
|
493
|
+
"test:workflow-gate-checkpoint": "node --test tests/workflow-gate-checkpoint.test.js tests/autonomous-workflow.test.js",
|
|
494
|
+
"workflow:autonomous": "node scripts/autonomous-workflow.js",
|
|
490
495
|
"test:lesson-export-import": "node --test tests/lesson-export-import.test.js",
|
|
491
496
|
"test:landing-page-claims": "node --test tests/landing-page-claims.test.js",
|
|
492
497
|
"test:dashboard-deeplink-e2e": "node --test tests/dashboard-deeplink-e2e.test.js",
|
|
@@ -498,7 +503,8 @@
|
|
|
498
503
|
"test:pretooluse-injection": "node --test tests/pretooluse-lesson-injection.test.js",
|
|
499
504
|
"test:recent-corrective-context": "node --test tests/recent-corrective-actions-context.test.js",
|
|
500
505
|
"test:mailer": "node --test tests/mailer.test.js tests/billing-webhook-email.test.js",
|
|
501
|
-
"test:brand-assets": "node --test tests/brand-assets.test.js"
|
|
506
|
+
"test:brand-assets": "node --test tests/brand-assets.test.js",
|
|
507
|
+
"test:enforcement-teeth": "node --test tests/enforcement-teeth.test.js"
|
|
502
508
|
},
|
|
503
509
|
"keywords": [
|
|
504
510
|
"mcp",
|
package/public/index.html
CHANGED
|
@@ -974,7 +974,7 @@ __GA_BOOTSTRAP__
|
|
|
974
974
|
<!-- HOW IT WORKS -->
|
|
975
975
|
<section class="how-it-works" id="how-it-works">
|
|
976
976
|
<div class="container">
|
|
977
|
-
<div class="section-label">New in v1.
|
|
977
|
+
<div class="section-label">New in v1.8.0</div>
|
|
978
978
|
<h2 class="section-title">Three steps to stop repeated AI failures</h2>
|
|
979
979
|
<div class="steps">
|
|
980
980
|
<div class="step">
|
|
@@ -1330,7 +1330,7 @@ __GA_BOOTSTRAP__
|
|
|
1330
1330
|
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
1331
1331
|
<a href="/blog">Blog</a>
|
|
1332
1332
|
</div>
|
|
1333
|
-
<span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.
|
|
1333
|
+
<span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.8.0</span>
|
|
1334
1334
|
</div>
|
|
1335
1335
|
</footer>
|
|
1336
1336
|
|