thumbgate 0.9.9 → 0.9.11

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.
Files changed (160) hide show
  1. package/.claude-plugin/README.md +4 -4
  2. package/.claude-plugin/marketplace.json +4 -2
  3. package/.claude-plugin/plugin.json +1 -1
  4. package/.well-known/mcp/server-card.json +1 -1
  5. package/README.md +115 -312
  6. package/adapters/README.md +2 -2
  7. package/adapters/amp/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
  8. package/adapters/chatgpt/openapi.yaml +2 -2
  9. package/adapters/claude/.mcp.json +3 -3
  10. package/adapters/codex/config.toml +4 -4
  11. package/adapters/gemini/function-declarations.json +1 -1
  12. package/adapters/mcp/server-stdio.js +66 -6
  13. package/adapters/opencode/opencode.json +4 -2
  14. package/bin/cli.js +188 -39
  15. package/config/e2e-critical-flows.json +4 -0
  16. package/config/gates/default.json +74 -2
  17. package/config/github-about.json +1 -1
  18. package/config/mcp-allowlists.json +33 -6
  19. package/config/skill-packs/react-testing.json +1 -1
  20. package/config/tessl-tiles.json +3 -3
  21. package/openapi/openapi.yaml +2 -2
  22. package/package.json +23 -9
  23. package/plugins/amp-skill/INSTALL.md +3 -2
  24. package/plugins/amp-skill/SKILL.md +1 -0
  25. package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +1 -1
  26. package/plugins/claude-codex-bridge/.mcp.json +5 -3
  27. package/plugins/claude-codex-bridge/README.md +1 -1
  28. package/plugins/claude-codex-bridge/skills/setup/SKILL.md +1 -1
  29. package/plugins/claude-skill/INSTALL.md +4 -3
  30. package/plugins/claude-skill/SKILL.md +1 -1
  31. package/plugins/codex-profile/.codex-plugin/plugin.json +1 -1
  32. package/plugins/codex-profile/.mcp.json +5 -3
  33. package/plugins/codex-profile/INSTALL.md +2 -2
  34. package/plugins/codex-profile/README.md +1 -1
  35. package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +1 -1
  36. package/plugins/cursor-marketplace/README.md +5 -5
  37. package/plugins/cursor-marketplace/mcp.json +4 -2
  38. package/plugins/cursor-marketplace/rules/pre-action-gates.mdc +1 -1
  39. package/plugins/cursor-marketplace/scripts/gate-check.sh +15 -5
  40. package/plugins/gemini-extension/INSTALL.md +4 -4
  41. package/plugins/opencode-profile/INSTALL.md +5 -5
  42. package/public/dashboard.html +15 -8
  43. package/public/index.html +134 -375
  44. package/public/js/buyer-intent.js +252 -0
  45. package/public/pro.html +1085 -0
  46. package/scripts/__pycache__/train_from_feedback.cpython-312.pyc +0 -0
  47. package/scripts/adk-consolidator.js +17 -5
  48. package/scripts/agent-readiness.js +3 -1
  49. package/scripts/agent-security-hardening.js +4 -4
  50. package/scripts/auto-promote-gates.js +8 -0
  51. package/scripts/auto-wire-hooks.js +105 -21
  52. package/scripts/billing.js +111 -7
  53. package/scripts/build-metadata.js +14 -0
  54. package/scripts/check-congruence.js +1 -1
  55. package/scripts/context-engine.js +2 -1
  56. package/scripts/daemon-manager.js +2 -2
  57. package/scripts/dashboard.js +2 -2
  58. package/scripts/data-governance.js +1 -1
  59. package/scripts/deploy-gcp.sh +1 -1
  60. package/scripts/deploy-policy.js +22 -4
  61. package/scripts/dispatch-brief.js +1 -1
  62. package/scripts/ensure-repo-bootstrap.js +1 -1
  63. package/scripts/feedback-attribution.js +22 -10
  64. package/scripts/feedback-fallback.js +3 -2
  65. package/scripts/feedback-inbox-read.js +1 -1
  66. package/scripts/feedback-loop.js +41 -3
  67. package/scripts/feedback-paths.js +8 -8
  68. package/scripts/feedback-schema.js +1 -1
  69. package/scripts/feedback-to-memory.js +2 -2
  70. package/scripts/filesystem-search.js +2 -2
  71. package/scripts/gates-engine.js +765 -34
  72. package/scripts/generate-paperbanana-diagrams.sh +3 -3
  73. package/scripts/github-about.js +1 -1
  74. package/scripts/gtm-revenue-loop.js +20 -1
  75. package/scripts/hook-runtime.js +89 -0
  76. package/scripts/hook-stop-self-score.sh +3 -3
  77. package/scripts/hook-thumbgate-cache-updater.js +98 -37
  78. package/scripts/hosted-config.js +12 -10
  79. package/scripts/hybrid-feedback-context.js +54 -13
  80. package/scripts/install-mcp.js +14 -1
  81. package/scripts/intent-router.js +1 -1
  82. package/scripts/internal-agent-bootstrap.js +1 -1
  83. package/scripts/lesson-inference.js +6 -1
  84. package/scripts/license.js +54 -16
  85. package/scripts/mcp-config.js +69 -7
  86. package/scripts/memory-migration.js +1 -1
  87. package/scripts/money-watcher.js +166 -16
  88. package/scripts/operational-integrity.js +480 -0
  89. package/scripts/optimize-context.js +1 -1
  90. package/scripts/perplexity-marketing.js +1 -1
  91. package/scripts/post-everywhere.js +7 -12
  92. package/scripts/post-to-x.js +1 -1
  93. package/scripts/pr-manager.js +14 -11
  94. package/scripts/problem-detail.js +10 -10
  95. package/scripts/profile-router.js +2 -0
  96. package/scripts/prompt-dlp.js +1 -0
  97. package/scripts/prove-adapters.js +6 -6
  98. package/scripts/prove-automation.js +1 -1
  99. package/scripts/prove-autoresearch.js +1 -1
  100. package/scripts/prove-claim-verification.js +3 -3
  101. package/scripts/prove-data-pipeline.js +5 -5
  102. package/scripts/prove-data-quality.js +1 -1
  103. package/scripts/prove-evolution.js +7 -7
  104. package/scripts/prove-harnesses.js +2 -2
  105. package/scripts/prove-lancedb.js +2 -2
  106. package/scripts/prove-local-intelligence.js +1 -1
  107. package/scripts/prove-loop-closure.js +1 -1
  108. package/scripts/prove-predictive-insights.js +2 -2
  109. package/scripts/prove-runtime.js +6 -6
  110. package/scripts/prove-seo-gsd.js +1 -1
  111. package/scripts/prove-settings.js +4 -4
  112. package/scripts/prove-subway-upgrades.js +1 -1
  113. package/scripts/prove-tessl.js +2 -2
  114. package/scripts/prove-xmemory.js +2 -2
  115. package/scripts/publish-decision.js +10 -0
  116. package/scripts/published-cli.js +34 -0
  117. package/scripts/rate-limiter.js +2 -2
  118. package/scripts/reddit-monitor-cron.sh +2 -2
  119. package/scripts/reminder-engine.js +1 -1
  120. package/scripts/schedule-manager.js +3 -3
  121. package/scripts/self-healing-check.js +1 -1
  122. package/scripts/shieldcortex-memory-firewall-runner.mjs +1 -1
  123. package/scripts/skill-quality-tracker.js +1 -1
  124. package/scripts/social-analytics/db/social-analytics.db-shm +0 -0
  125. package/scripts/social-analytics/db/social-analytics.db-wal +0 -0
  126. package/scripts/social-analytics/engagement-audit.js +202 -0
  127. package/scripts/social-analytics/generate-instagram-card.js +1 -1
  128. package/scripts/social-analytics/instagram-thumbgate-post.js +5 -1
  129. package/scripts/social-analytics/install-growth-automation.js +114 -0
  130. package/scripts/social-analytics/publish-instagram-thumbgate.js +8 -2
  131. package/scripts/social-analytics/publish-thumbgate-launch.js +1 -1
  132. package/scripts/social-analytics/publishers/reddit.js +7 -12
  133. package/scripts/social-analytics/publishers/zernio.js +19 -0
  134. package/scripts/social-analytics/reconcile-thumbgate-campaign.js +165 -0
  135. package/scripts/social-analytics/schedule-thumbgate-campaign.js +275 -0
  136. package/scripts/social-analytics/sync-launch-assets.js +185 -0
  137. package/scripts/social-pipeline.js +2 -2
  138. package/scripts/social-post-hourly.js +185 -0
  139. package/scripts/social-quality-gate.js +119 -3
  140. package/scripts/social-reply-monitor.js +150 -34
  141. package/scripts/statusline-cache-path.js +27 -0
  142. package/scripts/statusline-meta.js +22 -0
  143. package/scripts/statusline.sh +24 -32
  144. package/scripts/sync-version.js +24 -12
  145. package/scripts/telemetry-analytics.js +4 -4
  146. package/scripts/tessl-export.js +1 -1
  147. package/scripts/test-coverage.js +20 -13
  148. package/scripts/thumbgate-search.js +2 -2
  149. package/scripts/tool-registry.js +98 -1
  150. package/scripts/train_from_feedback.py +1 -1
  151. package/scripts/user-profile.js +4 -4
  152. package/scripts/validate-feedback.js +1 -1
  153. package/scripts/vector-store.js +1 -1
  154. package/scripts/verification-loop.js +1 -1
  155. package/scripts/verify-run.js +1 -1
  156. package/scripts/weekly-auto-post.js +1 -1
  157. package/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
  158. package/src/api/server.js +291 -41
  159. package/scripts/__pycache__/train_from_feedback.cpython-314.pyc +0 -0
  160. package/scripts/social-analytics/db/social-analytics.db +0 -0
@@ -4,10 +4,54 @@
4
4
  {
5
5
  "id": "local-only-git-writes",
6
6
  "layer": "Identity",
7
- "pattern": "^(git\\s+(add|commit|push)|gh\\s+pr\\s+)",
7
+ "pattern": "^(git\\s+(add|commit|push|tag)|gh\\s+pr\\s+|gh\\s+release\\s+create|npm\\s+publish|yarn\\s+publish|pnpm\\s+publish)",
8
8
  "action": "block",
9
9
  "when": { "constraints": { "local_only": true } },
10
- "message": "User requested local-only work. Git writes and PR operations are blocked.",
10
+ "message": "User requested local-only work. Git writes, PR operations, and release actions are blocked.",
11
+ "severity": "critical"
12
+ },
13
+ {
14
+ "id": "task-scope-required",
15
+ "layer": "Decisions",
16
+ "toolNames": ["Bash"],
17
+ "pattern": "^(git\\s+(add|commit|push)|gh\\s+pr\\s+(create|merge)|gh\\s+release\\s+create|git\\s+tag\\b|npm\\s+publish|yarn\\s+publish|pnpm\\s+publish)",
18
+ "requireTaskScope": true,
19
+ "action": "block",
20
+ "message": "Git write, PR, release, and publish operations require an explicit task scope.",
21
+ "severity": "critical"
22
+ },
23
+ {
24
+ "id": "task-scope-edit-boundary",
25
+ "layer": "Decisions",
26
+ "toolNames": ["Edit", "Write", "MultiEdit"],
27
+ "pattern": ".*",
28
+ "requireTaskScope": true,
29
+ "scopeMode": "declared-only",
30
+ "action": "block",
31
+ "message": "Edits outside the declared task scope are blocked once a task scope is active.",
32
+ "severity": "critical"
33
+ },
34
+ {
35
+ "id": "protected-file-approval-required",
36
+ "layer": "Decisions",
37
+ "toolNames": ["Edit", "Write", "MultiEdit", "Bash"],
38
+ "pattern": ".*",
39
+ "requireProtectedApproval": true,
40
+ "protectedGlobs": [
41
+ "AGENTS.md",
42
+ "CLAUDE.md",
43
+ "CLAUDE.local.md",
44
+ "GEMINI.md",
45
+ "README.md",
46
+ ".gitignore",
47
+ ".husky/**",
48
+ ".claude/**",
49
+ "skills/**",
50
+ "SKILL.md",
51
+ "config/gates/**"
52
+ ],
53
+ "action": "block",
54
+ "message": "Protected files require explicit approval before editing or publishing.",
11
55
  "severity": "critical"
12
56
  },
13
57
  {
@@ -28,6 +72,34 @@
28
72
  "message": "PR merging requires explicit 'pr_merge_allowed' satisfaction with evidence of user permission.",
29
73
  "severity": "high"
30
74
  },
75
+ {
76
+ "id": "branch-governance-required",
77
+ "layer": "Decisions",
78
+ "toolNames": ["Bash"],
79
+ "pattern": "^(gh\\s+pr\\s+(create|merge)|gh\\s+release\\s+create|git\\s+tag\\b|npm\\s+publish|yarn\\s+publish|pnpm\\s+publish)",
80
+ "requireBranchGovernance": true,
81
+ "action": "block",
82
+ "message": "PR, release, and publish actions require explicit branch governance.",
83
+ "severity": "critical"
84
+ },
85
+ {
86
+ "id": "release-readiness-required",
87
+ "layer": "Execution",
88
+ "toolNames": ["Bash"],
89
+ "pattern": "^(gh\\s+release\\s+create|git\\s+tag\\b|npm\\s+publish|yarn\\s+publish|pnpm\\s+publish)",
90
+ "requireReleaseReadiness": true,
91
+ "action": "block",
92
+ "message": "Release and publish actions require a releasable mainline commit and a matching version plan.",
93
+ "severity": "critical"
94
+ },
95
+ {
96
+ "id": "admin-merge-bypass-blocked",
97
+ "layer": "Execution",
98
+ "pattern": "gh\\s+pr\\s+merge.*--admin",
99
+ "action": "block",
100
+ "message": "Admin merge bypass is blocked. Use the merge queue or normal protected-branch flow.",
101
+ "severity": "critical"
102
+ },
31
103
  {
32
104
  "id": "loop-abuse-prevention",
33
105
  "layer": "Decisions",
@@ -2,7 +2,7 @@
2
2
  "repo": "IgorGanapolsky/ThumbGate",
3
3
  "repositoryUrl": "https://github.com/IgorGanapolsky/ThumbGate",
4
4
  "homepageUrl": "https://thumbgate-production.up.railway.app",
5
- "description": "Pre-action gates for AI coding agents. Skill disclosure cuts tokens. Hallucination and PII checks harden outputs. 👍 Thumbs up reinforces good behavior. 👎 Thumbs down blocks repeated mistakes. Free is local. History-aware lessons distill vague feedback. Team adds shared lessons and org visibility, plus generated review views.",
5
+ "description": "Pre-action gates for AI coding agents. 👎 Thumbs down prevention rule mistake permanently blocked. 👍 Thumbs up pattern reinforced. History-aware lessons from your corrections. Team adds shared lessons and org visibility.",
6
6
  "topics": [
7
7
  "thumbgate",
8
8
  "pre-action-gates",
@@ -10,7 +10,7 @@
10
10
  "feedback_summary",
11
11
  "search_lessons",
12
12
  "retrieve_lessons",
13
- "search_rlhf",
13
+ "search_thumbgate",
14
14
  "reflect_on_feedback",
15
15
  "feedback_stats",
16
16
  "diagnose_failure",
@@ -28,8 +28,14 @@
28
28
  "commerce_recall",
29
29
  "generate_skill",
30
30
  "satisfy_gate",
31
+ "set_task_scope",
32
+ "get_scope_state",
33
+ "set_branch_governance",
34
+ "get_branch_governance",
35
+ "approve_protected_action",
31
36
  "track_action",
32
37
  "verify_claim",
38
+ "check_operational_integrity",
33
39
  "register_claim_gate",
34
40
  "gate_stats",
35
41
  "dashboard",
@@ -52,11 +58,17 @@
52
58
  "recall",
53
59
  "search_lessons",
54
60
  "retrieve_lessons",
55
- "search_rlhf",
61
+ "search_thumbgate",
56
62
  "reflect_on_feedback",
57
63
  "prevention_rules",
64
+ "set_task_scope",
65
+ "get_scope_state",
66
+ "set_branch_governance",
67
+ "get_branch_governance",
68
+ "approve_protected_action",
58
69
  "track_action",
59
70
  "verify_claim",
71
+ "check_operational_integrity",
60
72
  "feedback_stats",
61
73
  "feedback_summary",
62
74
  "estimate_uncertainty",
@@ -66,10 +78,16 @@
66
78
  "capture_feedback",
67
79
  "recall",
68
80
  "retrieve_lessons",
69
- "search_rlhf",
81
+ "search_thumbgate",
70
82
  "commerce_recall",
83
+ "set_task_scope",
84
+ "get_scope_state",
85
+ "set_branch_governance",
86
+ "get_branch_governance",
87
+ "approve_protected_action",
71
88
  "track_action",
72
89
  "verify_claim",
90
+ "check_operational_integrity",
73
91
  "prevention_rules",
74
92
  "feedback_stats",
75
93
  "feedback_summary"
@@ -79,7 +97,7 @@
79
97
  "feedback_summary",
80
98
  "search_lessons",
81
99
  "retrieve_lessons",
82
- "search_rlhf",
100
+ "search_thumbgate",
83
101
  "feedback_stats",
84
102
  "diagnose_failure",
85
103
  "list_harnesses",
@@ -88,7 +106,10 @@
88
106
  "start_handoff",
89
107
  "complete_handoff",
90
108
  "context_provenance",
109
+ "get_scope_state",
110
+ "get_branch_governance",
91
111
  "verify_claim",
112
+ "check_operational_integrity",
92
113
  "gate_stats",
93
114
  "dashboard",
94
115
  "settings_status",
@@ -102,7 +123,7 @@
102
123
  "feedback_summary",
103
124
  "search_lessons",
104
125
  "retrieve_lessons",
105
- "search_rlhf",
126
+ "search_thumbgate",
106
127
  "feedback_stats",
107
128
  "diagnose_failure",
108
129
  "list_harnesses",
@@ -110,7 +131,10 @@
110
131
  "plan_intent",
111
132
  "run_harness",
112
133
  "context_provenance",
134
+ "get_scope_state",
135
+ "get_branch_governance",
113
136
  "verify_claim",
137
+ "check_operational_integrity",
114
138
  "gate_stats",
115
139
  "dashboard",
116
140
  "settings_status",
@@ -123,12 +147,15 @@
123
147
  "feedback_summary",
124
148
  "search_lessons",
125
149
  "retrieve_lessons",
126
- "search_rlhf",
150
+ "search_thumbgate",
127
151
  "diagnose_failure",
128
152
  "list_intents",
129
153
  "plan_intent",
130
154
  "list_harnesses",
155
+ "get_scope_state",
156
+ "get_branch_governance",
131
157
  "verify_claim",
158
+ "check_operational_integrity",
132
159
  "settings_status"
133
160
  ]
134
161
  }
@@ -19,5 +19,5 @@
19
19
  "maxChars": 6000,
20
20
  "queryPrefix": "react-testing react testing"
21
21
  },
22
- "registeredAt": "2026-04-06T14:11:37.315Z"
22
+ "registeredAt": "2026-04-06T16:47:22.804Z"
23
23
  }
@@ -17,12 +17,12 @@
17
17
  ]
18
18
  },
19
19
  {
20
- "id": "rlhf-feedback",
21
- "tileName": "rlhf-feedback",
20
+ "id": "thumbgate-feedback",
21
+ "tileName": "thumbgate-feedback",
22
22
  "summary": "Thumbs up and thumbs down capture that turns agent feedback into structured memories and prevention rules.",
23
23
  "private": false,
24
24
  "sourceSkills": [
25
- "rlhf-feedback"
25
+ "thumbgate-feedback"
26
26
  ]
27
27
  }
28
28
  ]
@@ -1009,7 +1009,7 @@ paths:
1009
1009
  description: Unauthorized
1010
1010
  /v1/search:
1011
1011
  get:
1012
- operationId: searchRlhf
1012
+ operationId: searchThumbgate
1013
1013
  parameters:
1014
1014
  - in: query
1015
1015
  name: q
@@ -1038,7 +1038,7 @@ paths:
1038
1038
  '401':
1039
1039
  description: Unauthorized
1040
1040
  post:
1041
- operationId: searchRlhfPost
1041
+ operationId: searchThumbgatePost
1042
1042
  requestBody:
1043
1043
  required: true
1044
1044
  content:
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "0.9.9",
4
- "description": "ThumbGate Pre-action gates that block AI coding agents from repeating known mistakes. SQLite+FTS5 lesson DB with corrective-action inference. MemAlign-inspired dual recall (principles + episodic context). Thompson Sampling for adaptive gate sensitivity. LanceDB vector search. Captures feedback, auto-promotes failures into prevention rules, and enforces them via PreToolUse hooks.",
3
+ "version": "0.9.11",
4
+ "description": "ThumbGate \u2014 Make your AI coding agent self-improving. Every mistake becomes a prevention rule that physically blocks the agent from repeating it. Feedback-driven enforcement via PreToolUse hooks, Thompson Sampling for adaptive gates, SQLite+FTS5 lesson DB, and LanceDB vector search. Your agent gets smarter with every session.",
5
5
  "homepage": "https://thumbgate-production.up.railway.app",
6
6
  "repository": {
7
7
  "type": "git",
@@ -12,8 +12,7 @@
12
12
  },
13
13
  "main": "scripts/feedback-loop.js",
14
14
  "bin": {
15
- "thumbgate": "bin/cli.js",
16
- "rlhf": "bin/cli.js"
15
+ "thumbgate": "bin/cli.js"
17
16
  },
18
17
  "files": [
19
18
  "bin/",
@@ -65,10 +64,9 @@
65
64
  "social:mcp": "node scripts/social-analytics/mcp-server.js",
66
65
  "social:post-everywhere": "node scripts/post-everywhere.js",
67
66
  "social:post-everywhere:dry": "node scripts/post-everywhere.js --dry-run",
68
- "social:publish:launch": "node scripts/social-analytics/publish-thumbgate-launch.js",
69
67
  "social:reply-monitor": "node scripts/social-reply-monitor.js",
70
68
  "social:reply-monitor:dry": "node scripts/social-reply-monitor.js --dry-run",
71
- "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:workflow && npm run test:billing && npm run test:cli && npm run test:watcher && npm run test:autoresearch && npm run test:ops && 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: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: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: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:lesson-retrieval && 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-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && npm run test:utm && npm run test:product-feedback && npm run test:feedback-root-consolidator",
69
+ "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: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: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: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: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:lesson-retrieval && 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-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && 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",
72
70
  "test:feedback-fallback": "node --test tests/feedback-fallback.test.js",
73
71
  "test:metaclaw": "node --test tests/metaclaw-features.test.js",
74
72
  "test:server-lock": "node --test tests/server-stdio-lock.test.js",
@@ -117,7 +115,7 @@
117
115
  "test:loop": "node scripts/feedback-loop.js --test",
118
116
  "test:dpo": "node scripts/export-dpo-pairs.js --test",
119
117
  "test:kto": "node --test tests/export-kto.test.js",
120
- "test:api": "node --test --test-concurrency=1 tests/api-server.test.js tests/api-auth-config.test.js tests/mcp-server.test.js tests/adapters.test.js tests/openapi-parity.test.js tests/budget-guard.test.js tests/contextfs.test.js tests/pack-templates.test.js tests/dashboard.test.js tests/dashboard-render-spec.test.js tests/dashboard-html.test.js tests/agent-readiness.test.js tests/mcp-policy.test.js tests/subagent-profiles.test.js tests/intent-router.test.js tests/internal-agent-bootstrap.test.js tests/lesson-search.test.js tests/thumbgate-search.test.js tests/rubric-engine.test.js tests/self-healing-check.test.js tests/self-heal.test.js tests/feedback-schema.test.js tests/thompson-sampling.test.js tests/feedback-sequences.test.js tests/diversity-tracking.test.js tests/vector-store.test.js tests/feedback-attribution.test.js tests/hybrid-feedback-context.test.js tests/loop-closure.test.js tests/code-reasoning.test.js tests/feedback-loop.test.js tests/feedback-inbox-read.test.js tests/feedback-to-memory.test.js tests/test-coverage.test.js tests/version-metadata.test.js tests/claude-mcpb.test.js tests/claude-codex-bridge.test.js tests/cursor-plugin.test.js tests/codex-plugin.test.js tests/telemetry-analytics.test.js tests/public-landing.test.js tests/local-model-profile.test.js tests/risk-scorer.test.js tests/context-compaction.test.js tests/reminder-engine.test.js tests/post-to-x.test.js tests/verification-loop.test.js tests/async-job-runner.test.js tests/commerce-quality.test.js tests/recall-limit.test.js tests/problem-detail.test.js tests/natural-language-harness.test.js tests/settings-hierarchy.test.js",
118
+ "test:api": "node --test --test-concurrency=1 tests/api-server.test.js tests/api-auth-config.test.js tests/mcp-server.test.js tests/adapters.test.js tests/openapi-parity.test.js tests/budget-guard.test.js tests/contextfs.test.js tests/pack-templates.test.js tests/dashboard.test.js tests/dashboard-render-spec.test.js tests/dashboard-html.test.js tests/agent-readiness.test.js tests/mcp-policy.test.js tests/subagent-profiles.test.js tests/intent-router.test.js tests/internal-agent-bootstrap.test.js tests/lesson-search.test.js tests/thumbgate-search.test.js tests/rubric-engine.test.js tests/self-healing-check.test.js tests/self-heal.test.js tests/feedback-schema.test.js tests/thompson-sampling.test.js tests/feedback-sequences.test.js tests/diversity-tracking.test.js tests/vector-store.test.js tests/feedback-attribution.test.js tests/hybrid-feedback-context.test.js tests/loop-closure.test.js tests/code-reasoning.test.js tests/feedback-loop.test.js tests/feedback-inbox-read.test.js tests/feedback-to-memory.test.js tests/test-coverage.test.js tests/version-metadata.test.js tests/claude-mcpb.test.js tests/claude-codex-bridge.test.js tests/cursor-plugin.test.js tests/codex-plugin.test.js tests/telemetry-analytics.test.js tests/public-landing.test.js tests/pro-landing.test.js tests/local-model-profile.test.js tests/risk-scorer.test.js tests/context-compaction.test.js tests/reminder-engine.test.js tests/post-to-x.test.js tests/verification-loop.test.js tests/async-job-runner.test.js tests/commerce-quality.test.js tests/recall-limit.test.js tests/problem-detail.test.js tests/natural-language-harness.test.js tests/settings-hierarchy.test.js",
121
119
  "test:proof": "node --test tests/prove-adapters.test.js tests/prove-attribution.test.js tests/prove-cloudflare-sandbox.test.js tests/prove-data-quality.test.js tests/prove-intelligence.test.js tests/prove-lancedb.test.js tests/prove-loop-closure.test.js tests/prove-subway-upgrades.test.js tests/prove-training-export.test.js tests/prove-local-intelligence.test.js tests/prove-workflow-contract.test.js tests/prove-autoresearch.test.js tests/prove-claim-verification.test.js tests/prove-data-pipeline.test.js tests/prove-evolution.test.js tests/prove-harnesses.test.js tests/prove-runtime.test.js tests/prove-seo-gsd.test.js tests/prove-settings.test.js tests/prove-xmemory.test.js && node --test tests/prove-automation.test.js",
122
120
  "test:e2e": "node --test tests/e2e-pipeline.test.js tests/e2e-product-flows.test.js tests/e2e-coverage-contract.test.js",
123
121
  "test:rlaif": "node --test tests/rlaif-self-audit.test.js tests/dpo-optimizer.test.js tests/meta-policy.test.js",
@@ -126,6 +124,7 @@
126
124
  "test:intelligence": "node --test tests/intelligence.test.js",
127
125
  "test:training-export": "node --test tests/training-export.test.js tests/databricks-export.test.js",
128
126
  "test:deployment": "node --test tests/deployment.test.js tests/deploy-policy.test.js tests/publish-decision.test.js",
127
+ "test:operational-integrity": "node --test tests/operational-integrity.test.js",
129
128
  "test:workflow": "node --test tests/workflow-contract.test.js tests/social-marketing-assets.test.js tests/social-pipeline.test.js tests/positioning-contract.test.js tests/workflow-runs.test.js tests/workflow-sprint-intake.test.js tests/gtm-revenue-loop.test.js",
130
129
  "test:billing": "node --test tests/billing.test.js",
131
130
  "test:cli": "node --test tests/analytics-report.test.js tests/creator-campaigns.test.js tests/cli.test.js tests/codex-bridge-script.test.js tests/dispatch-brief.test.js tests/feedback-normalize.test.js tests/install-mcp.test.js tests/pr-manager.test.js tests/pro-local-dashboard.test.js tests/revenue-status.test.js",
@@ -158,6 +157,8 @@
158
157
  "tessl:export": "node scripts/tessl-export.js export",
159
158
  "tessl:verify": "node scripts/tessl-export.js verify",
160
159
  "deploy:policy": "node scripts/deploy-policy.js",
160
+ "ops:integrity": "node scripts/operational-integrity.js",
161
+ "ops:integrity:ci": "node scripts/operational-integrity.js --ci",
161
162
  "prove:adapters": "node --test tests/prove-adapters.test.js",
162
163
  "prove:automation": "node --test tests/prove-automation.test.js",
163
164
  "prove:workflow-contract": "node --test tests/prove-workflow-contract.test.js",
@@ -219,10 +220,23 @@
219
220
  "test:money-watcher": "node --test tests/money-watcher.test.js",
220
221
  "test:utm": "node --test tests/utm.test.js",
221
222
  "test:product-feedback": "node --test tests/product-feedback.test.js",
222
- "test:feedback-root-consolidator": "node --test tests/feedback-root-consolidator.test.js"
223
+ "test:feedback-root-consolidator": "node --test tests/feedback-root-consolidator.test.js",
224
+ "social:publish:launch": "node scripts/social-analytics/publish-thumbgate-launch.js",
225
+ "social:schedule:campaign": "node scripts/social-analytics/schedule-thumbgate-campaign.js",
226
+ "social:install:growth": "node scripts/social-analytics/install-growth-automation.js",
227
+ "social:reconcile:campaign": "node scripts/social-analytics/reconcile-thumbgate-campaign.js",
228
+ "social:sync:launch-assets": "node scripts/social-analytics/sync-launch-assets.js",
229
+ "social:engagement:audit": "node scripts/social-analytics/engagement-audit.js",
230
+ "test:install-growth-automation": "node --test tests/install-growth-automation.test.js",
231
+ "test:publish-thumbgate-launch": "node --test tests/publish-thumbgate-launch.test.js",
232
+ "test:reconcile-thumbgate-campaign": "node --test tests/reconcile-thumbgate-campaign.test.js",
233
+ "test:schedule-thumbgate-campaign": "node --test tests/schedule-thumbgate-campaign.test.js",
234
+ "test:social-reply-monitor": "node --test tests/social-reply-monitor.test.js",
235
+ "test:sync-launch-assets": "node --test tests/sync-launch-assets.test.js",
236
+ "test:reddit-publisher": "node --test tests/reddit-publisher.test.js",
237
+ "test:engagement-audit": "node --test tests/engagement-audit.test.js"
223
238
  },
224
239
  "keywords": [
225
- "rlhf",
226
240
  "mcp",
227
241
  "mcp-server",
228
242
  "ai-agents",
@@ -5,13 +5,14 @@ Install the ThumbGate skill for Amp in under 60 seconds. No manual file editing
5
5
  ## One-Command Install
6
6
 
7
7
  ```bash
8
- cp plugins/amp-skill/SKILL.md .amp/skills/rlhf-feedback.md
8
+ cp plugins/amp-skill/SKILL.md .amp/skills/thumbgate-feedback.md
9
9
  ```
10
10
 
11
11
  Or from the npm package:
12
12
 
13
13
  ```bash
14
14
  npx thumbgate init
15
+ cp node_modules/thumbgate/plugins/amp-skill/SKILL.md .amp/skills/thumbgate-feedback.md
15
16
  cp node_modules/thumbgate/plugins/amp-skill/SKILL.md .amp/skills/rlhf-feedback.md
16
17
  ```
17
18
 
@@ -48,5 +49,5 @@ node .thumbgate/capture-feedback.js --feedback=down --context="..." --what-went-
48
49
  ## Uninstall
49
50
 
50
51
  ```bash
51
- rm .amp/skills/rlhf-feedback.md
52
+ rm .amp/skills/thumbgate-feedback.md
52
53
  ```
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: thumbgate-feedback
2
3
  name: rlhf-feedback
3
4
  description: Dual-write feedback to Amp MCP memory AND thumbgate for DPO export, analytics, and cross-platform portability
4
5
  ---
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-bridge",
3
- "version": "0.9.9",
3
+ "version": "0.9.11",
4
4
  "description": "Run Codex review, adversarial review, and second-pass handoffs from Claude Code while keeping ThumbGate reliability memory in the loop.",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky",
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "mcpServers": {
3
- "rlhf": {
3
+ "thumbgate": {
4
4
  "command": "npx",
5
5
  "args": [
6
- "-y",
7
- "thumbgate@0.9.9",
6
+ "--yes",
7
+ "--package",
8
+ "thumbgate@0.9.11",
9
+ "thumbgate",
8
10
  "serve"
9
11
  ]
10
12
  }
@@ -6,7 +6,7 @@ This repo-local Claude Code plugin brings Codex into the same workflow for three
6
6
  - skeptical adversarial review before risky merges or deploys
7
7
  - second-pass handoff when you want a different agent to take another shot
8
8
 
9
- The plugin keeps ThumbGate's local reliability memory available through the bundled `rlhf` MCP server while the bridge script persists Codex artifacts in `${CLAUDE_PLUGIN_DATA}`.
9
+ The plugin keeps ThumbGate's local reliability memory available through the bundled `thumbgate` MCP server while the bridge script persists Codex artifacts in `${CLAUDE_PLUGIN_DATA}`.
10
10
 
11
11
  ## Shipped skills
12
12
 
@@ -18,4 +18,4 @@ Then explain:
18
18
  - whether `codex` is installed
19
19
  - whether `codex exec review` is available
20
20
  - where the persistent bridge artifact directory lives
21
- - whether ThumbGate's bundled `rlhf` MCP server config is present
21
+ - whether ThumbGate's bundled `thumbgate` MCP server config is present
@@ -5,13 +5,14 @@ Install the skill in under 60 seconds. No manual file editing required.
5
5
  ## One-Command Install
6
6
 
7
7
  ```bash
8
- cp plugins/claude-skill/SKILL.md .claude/skills/rlhf-feedback.md
8
+ cp plugins/claude-skill/SKILL.md .claude/skills/thumbgate-feedback.md
9
9
  ```
10
10
 
11
11
  Or from the published npm package:
12
12
 
13
13
  ```bash
14
14
  npx thumbgate init
15
+ cp node_modules/thumbgate/plugins/claude-skill/SKILL.md .claude/skills/thumbgate-feedback.md
15
16
  cp node_modules/thumbgate/plugins/claude-skill/SKILL.md .claude/skills/rlhf-feedback.md
16
17
  ```
17
18
 
@@ -27,7 +28,7 @@ After copying, restart Claude Code and run:
27
28
 
28
29
  ```bash
29
30
  # Claude Code will show available skills:
30
- # rlhf-feedback — Capture thumbs up/down feedback into structured memories
31
+ # thumbgate-feedback — Capture thumbs up/down feedback into structured memories
31
32
  ```
32
33
 
33
34
  Then test it:
@@ -51,5 +52,5 @@ node .thumbgate/capture-feedback.js --feedback=up --context="skill install verif
51
52
  ## Uninstall
52
53
 
53
54
  ```bash
54
- rm .claude/skills/rlhf-feedback.md
55
+ rm .claude/skills/thumbgate-feedback.md
55
56
  ```
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: rlhf-feedback
2
+ name: thumbgate-feedback
3
3
  description: >
4
4
  Capture thumbs up/down feedback into structured memories and prevention rules.
5
5
  Use when user gives explicit quality signals about agent work (e.g. "that worked",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-profile",
3
- "version": "0.9.9",
3
+ "version": "0.9.11",
4
4
  "description": "ThumbGate for Codex: pre-action gates, skill packs, hallucination detection, PII scanning, progressive disclosure (82% token savings), and MCP-backed reliability memory.",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky",
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "mcpServers": {
3
- "rlhf": {
3
+ "thumbgate": {
4
4
  "command": "npx",
5
5
  "args": [
6
- "-y",
7
- "thumbgate@0.9.9",
6
+ "--yes",
7
+ "--package",
8
+ "thumbgate@0.9.11",
9
+ "thumbgate",
8
10
  "serve"
9
11
  ]
10
12
  }
@@ -31,7 +31,7 @@ The following block is appended to `~/.codex/config.toml`:
31
31
  ```toml
32
32
  [mcp_servers.thumbgate]
33
33
  command = "npx"
34
- args = ["-y", "thumbgate@0.9.9", "serve"]
34
+ args = ["--yes", "--package", "thumbgate@0.9.11", "thumbgate", "serve"]
35
35
  ```
36
36
 
37
37
  The repo-local Codex app plugin ships the same runtime path through `plugins/codex-profile/.mcp.json`, so the manual config and plugin metadata stay aligned.
@@ -46,7 +46,7 @@ node adapters/mcp/server-stdio.js
46
46
  # Press Ctrl+C to stop
47
47
  ```
48
48
 
49
- Then restart Codex. The `rlhf` MCP server will appear in the tool list.
49
+ Then restart Codex. The `thumbgate` MCP server will appear in the tool list.
50
50
 
51
51
  ## Available Tools (via MCP)
52
52
 
@@ -29,7 +29,7 @@ That profile launches:
29
29
  ```toml
30
30
  [mcp_servers.thumbgate]
31
31
  command = "npx"
32
- args = ["-y", "thumbgate@0.9.9", "serve"]
32
+ args = ["--yes", "--package", "thumbgate@0.9.11", "thumbgate", "serve"]
33
33
  ```
34
34
 
35
35
  ## Why this exists
@@ -2,7 +2,7 @@
2
2
  "name": "thumbgate",
3
3
  "displayName": "ThumbGate",
4
4
  "description": "👍👎 Thumbs down a mistake — your AI agent won't repeat it. Thumbs up good work — it remembers the pattern.",
5
- "version": "0.9.9",
5
+ "version": "0.9.11",
6
6
  "author": {
7
7
  "name": "Igor Ganapolsky"
8
8
  },
@@ -22,7 +22,7 @@ How it works:
22
22
 
23
23
  | File | Always on | Description |
24
24
  |------|-----------|-------------|
25
- | `rules/pre-action-gates.mdc` | Yes | Before risky tool calls (git push, rm -rf, npm publish, deploy), check prevention rules via the rlhf MCP server. Blocks and explains if a rule matches. |
25
+ | `rules/pre-action-gates.mdc` | Yes | Before risky tool calls (git push, rm -rf, npm publish, deploy), check prevention rules via the thumbgate MCP server. Blocks and explains if a rule matches. |
26
26
  | `rules/feedback-capture.mdc` | No | After any mistake or unexpected behavior, prompt to capture structured feedback with context and tags. |
27
27
  | `rules/session-continuity.mdc` | No | At session start, recall past context; at session end, hand off state for next session. |
28
28
 
@@ -53,13 +53,13 @@ How it works:
53
53
 
54
54
  | Hook | Trigger | Description |
55
55
  |------|---------|-------------|
56
- | `beforeShellExecution` | `git push`, `rm -rf`, `npm publish`, `deploy` | Runs `scripts/gate-check.sh` to perform a pre-action health check via `thumbgate doctor`. |
56
+ | `beforeShellExecution` | `git push`, `rm -rf`, `npm publish`, `deploy` | Runs `scripts/gate-check.sh` to evaluate the command through ThumbGate `gate-check` before execution. |
57
57
 
58
58
  ### MCP Server
59
59
 
60
60
  | Server | Command |
61
61
  |--------|---------|
62
- | `rlhf` | `npx -y thumbgate@latest serve` |
62
+ | `thumbgate` | `npx --yes --package thumbgate@latest thumbgate serve` |
63
63
 
64
64
  ## Install
65
65
 
@@ -90,9 +90,9 @@ Or copy the plugin MCP config into `.cursor/mcp.json`:
90
90
  ```json
91
91
  {
92
92
  "mcpServers": {
93
- "rlhf": {
93
+ "thumbgate": {
94
94
  "command": "npx",
95
- "args": ["-y", "thumbgate@latest", "serve"]
95
+ "args": ["--yes", "--package", "thumbgate@latest", "thumbgate", "serve"]
96
96
  }
97
97
  }
98
98
  }
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "mcpServers": {
3
- "rlhf": {
3
+ "thumbgate": {
4
4
  "command": "npx",
5
5
  "args": [
6
- "-y",
6
+ "--yes",
7
+ "--package",
7
8
  "thumbgate@latest",
9
+ "thumbgate",
8
10
  "serve"
9
11
  ]
10
12
  }
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Before risky tool calls (git push, rm -rf, npm publish, deploy), check prevention rules via the rlhf MCP server. If a rule matches, STOP and explain why.
2
+ description: Before risky tool calls (git push, rm -rf, npm publish, deploy), check prevention rules via the thumbgate MCP server. If a rule matches, STOP and explain why.
3
3
  alwaysApply: true
4
4
  ---
5
5
 
@@ -1,11 +1,21 @@
1
1
  #!/usr/bin/env bash
2
2
  # Pre-action gate check — runs before risky shell commands.
3
3
  # Called by hooks/hooks.json beforeShellExecution hook.
4
- # Performs a quick health check via thumbgate doctor.
4
+ # Delegates to the published ThumbGate gate-check entrypoint.
5
5
 
6
6
  set -euo pipefail
7
7
 
8
- npx -y thumbgate@latest doctor 2>/dev/null || {
9
- echo "[gate-check] thumbgate doctor returned non-zero review before proceeding." >&2
10
- exit 1
11
- }
8
+ INPUT=$(cat)
9
+ RESULT=$(echo "$INPUT" | npx --yes --package thumbgate@latest thumbgate gate-check 2>/dev/null) || true
10
+
11
+ if [ -z "$RESULT" ]; then
12
+ exit 0
13
+ fi
14
+
15
+ echo "$RESULT"
16
+
17
+ if echo "$RESULT" | grep -q '"permissionDecision":\s*"deny"'; then
18
+ exit 2
19
+ fi
20
+
21
+ exit 0