tribunal-kit 6.0.1 → 7.0.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.
Files changed (349) hide show
  1. package/.agent/ARCHITECTURE.md +9 -6
  2. package/.agent/agents/accessibility-reviewer.md +23 -16
  3. package/.agent/agents/ai-code-reviewer.md +25 -21
  4. package/.agent/agents/anti-pattern-reviewer.md +12 -7
  5. package/.agent/agents/api-architect.md +1 -0
  6. package/.agent/agents/backend-specialist.md +23 -22
  7. package/.agent/agents/cloud-engineer.md +1 -0
  8. package/.agent/agents/code-archaeologist.md +1 -0
  9. package/.agent/agents/complexity-reviewer.md +10 -7
  10. package/.agent/agents/database-architect.md +3 -2
  11. package/.agent/agents/db-latency-auditor.md +6 -2
  12. package/.agent/agents/debugger.md +3 -2
  13. package/.agent/agents/dependency-reviewer.md +1 -0
  14. package/.agent/agents/devops-engineer.md +9 -8
  15. package/.agent/agents/documentation-writer.md +6 -5
  16. package/.agent/agents/explorer-agent.md +1 -0
  17. package/.agent/agents/frontend-reviewer.md +21 -17
  18. package/.agent/agents/frontend-specialist.md +23 -20
  19. package/.agent/agents/game-developer.md +1 -0
  20. package/.agent/agents/interaction-reviewer.md +10 -5
  21. package/.agent/agents/logic-reviewer.md +3 -0
  22. package/.agent/agents/minimalist-reviewer.md +6 -0
  23. package/.agent/agents/mobile-developer.md +7 -6
  24. package/.agent/agents/mobile-reviewer.md +14 -13
  25. package/.agent/agents/orchestrator.md +3 -0
  26. package/.agent/agents/penetration-tester.md +1 -0
  27. package/.agent/agents/performance-optimizer.md +6 -5
  28. package/.agent/agents/performance-reviewer.md +6 -6
  29. package/.agent/agents/pipeline-reviewer.md +144 -0
  30. package/.agent/agents/precedence-reviewer.md +1 -0
  31. package/.agent/agents/product-manager.md +1 -0
  32. package/.agent/agents/product-owner.md +1 -0
  33. package/.agent/agents/product-reviewer.md +12 -7
  34. package/.agent/agents/project-planner.md +3 -0
  35. package/.agent/agents/qa-automation-engineer.md +50 -43
  36. package/.agent/agents/resilience-reviewer.md +1 -0
  37. package/.agent/agents/schema-reviewer.md +1 -0
  38. package/.agent/agents/security-auditor.md +24 -24
  39. package/.agent/agents/seo-specialist.md +33 -23
  40. package/.agent/agents/sql-reviewer.md +5 -4
  41. package/.agent/agents/supervisor-agent.md +12 -2
  42. package/.agent/agents/swarm-worker-contracts.md +13 -13
  43. package/.agent/agents/swarm-worker-registry.md +51 -51
  44. package/.agent/agents/system-architect.md +1 -0
  45. package/.agent/agents/test-coverage-reviewer.md +25 -22
  46. package/.agent/agents/test-engineer.md +12 -11
  47. package/.agent/agents/throughput-optimizer.md +45 -40
  48. package/.agent/agents/type-safety-reviewer.md +5 -4
  49. package/.agent/agents/ui-ux-auditor.md +6 -4
  50. package/.agent/agents/ui-visual-auditor.md +3 -0
  51. package/.agent/agents/ux-reviewer.md +11 -6
  52. package/.agent/agents/visual-reviewer.md +11 -6
  53. package/.agent/agents/vitals-reviewer.md +5 -4
  54. package/.agent/history/memory/.memory.idx +1532 -1
  55. package/.agent/history/memory/MEMORY.md +102 -1
  56. package/.agent/mcp_config.json +1 -6
  57. package/.agent/routing_index.json +2033 -263
  58. package/.agent/rules/GEMINI.md +11 -9
  59. package/.agent/rules/GEMINI_PLANNER.md +19 -21
  60. package/.agent/scripts/_colors.js +52 -54
  61. package/.agent/scripts/_utils.js +52 -53
  62. package/.agent/scripts/auto_preview.js +39 -43
  63. package/.agent/scripts/bundle_analyzer.js +47 -60
  64. package/.agent/scripts/case_law_manager.js +200 -294
  65. package/.agent/scripts/checklist.js +73 -94
  66. package/.agent/scripts/cicd_validator.js +305 -0
  67. package/.agent/scripts/compile_router.py +4 -111
  68. package/.agent/scripts/context_broker.js +317 -412
  69. package/.agent/scripts/contract_engine.js +402 -0
  70. package/.agent/scripts/dependency_analyzer.js +112 -124
  71. package/.agent/scripts/graph_builder.js +75 -103
  72. package/.agent/scripts/graph_visualizer.js +10 -12
  73. package/.agent/scripts/graph_zoom.js +38 -55
  74. package/.agent/scripts/guardrail_engine.js +195 -145
  75. package/.agent/scripts/impact_classifier.js +55 -30
  76. package/.agent/scripts/inner_loop_validator.js +108 -159
  77. package/.agent/scripts/integrity_manifest.js +59 -67
  78. package/.agent/scripts/lint_runner.js +65 -75
  79. package/.agent/scripts/marathon_harness.js +131 -208
  80. package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
  81. package/.agent/scripts/minify_context.js +29 -33
  82. package/.agent/scripts/minimal_change_engine.js +95 -87
  83. package/.agent/scripts/mutation_runner.js +46 -62
  84. package/.agent/scripts/pipeline_engine.js +320 -209
  85. package/.agent/scripts/prompt_compiler.js +118 -93
  86. package/.agent/scripts/schema_validator.js +73 -121
  87. package/.agent/scripts/security_scan.js +88 -117
  88. package/.agent/scripts/session_manager.js +52 -69
  89. package/.agent/scripts/signal_detector.js +24 -22
  90. package/.agent/scripts/skill_evolution.js +184 -245
  91. package/.agent/scripts/skill_integrator.js +35 -48
  92. package/.agent/scripts/socratic_gate_policy.js +15 -12
  93. package/.agent/scripts/strengthen_skills.js +29 -33
  94. package/.agent/scripts/swarm_dispatcher.js +120 -151
  95. package/.agent/scripts/test_runner.js +54 -56
  96. package/.agent/scripts/token_budget_broker.js +9 -7
  97. package/.agent/scripts/trace_engine.js +126 -0
  98. package/.agent/scripts/verify_all.js +76 -93
  99. package/.agent/scripts/visual_audit.js +16 -21
  100. package/.agent/skill_topic_map.json +22 -3
  101. package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
  102. package/.agent/skills/60fps-animation/SKILL.md +7 -0
  103. package/.agent/skills/accessible-animation/SKILL.md +5 -1
  104. package/.agent/skills/adapt/SKILL.md +7 -1
  105. package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
  106. package/.agent/skills/agent-organizer/SKILL.md +1 -0
  107. package/.agent/skills/agentic-patterns/SKILL.md +33 -25
  108. package/.agent/skills/agentic-workflows-2026/SKILL.md +6 -2
  109. package/.agent/skills/ai-app-hardening/SKILL.md +9 -8
  110. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
  111. package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
  112. package/.agent/skills/animation-systems/SKILL.md +11 -10
  113. package/.agent/skills/antfu-conventions/SKILL.md +7 -2
  114. package/.agent/skills/api-patterns/SKILL.md +14 -10
  115. package/.agent/skills/api-security-auditor/SKILL.md +15 -14
  116. package/.agent/skills/app-builder/SKILL.md +1 -0
  117. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
  118. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
  119. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
  120. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
  121. package/.agent/skills/apple-design/SKILL.md +8 -7
  122. package/.agent/skills/architecture/SKILL.md +3 -2
  123. package/.agent/skills/audit-and-fix/SKILL.md +8 -5
  124. package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
  125. package/.agent/skills/backend-security-expert/SKILL.md +1 -0
  126. package/.agent/skills/baseline-ui/SKILL.md +8 -7
  127. package/.agent/skills/bash-linux/SKILL.md +1 -0
  128. package/.agent/skills/behavioral-modes/SKILL.md +1 -0
  129. package/.agent/skills/better-colors/SKILL.md +11 -7
  130. package/.agent/skills/better-typography/SKILL.md +30 -16
  131. package/.agent/skills/better-ui/SKILL.md +17 -10
  132. package/.agent/skills/bolder/SKILL.md +6 -0
  133. package/.agent/skills/brainstorming/SKILL.md +6 -4
  134. package/.agent/skills/browser-native-ai/SKILL.md +5 -4
  135. package/.agent/skills/build-primitive/SKILL.md +5 -0
  136. package/.agent/skills/building-native-ui/SKILL.md +1 -0
  137. package/.agent/skills/cicd-pro/SKILL.md +2 -1
  138. package/.agent/skills/clarify/SKILL.md +19 -14
  139. package/.agent/skills/clean-code/SKILL.md +16 -15
  140. package/.agent/skills/cloud-architect/SKILL.md +1 -0
  141. package/.agent/skills/cobejs/SKILL.md +7 -9
  142. package/.agent/skills/code-review-checklist/SKILL.md +1 -0
  143. package/.agent/skills/codebase-design/SKILL.md +7 -2
  144. package/.agent/skills/colorize/SKILL.md +8 -3
  145. package/.agent/skills/compact-landing/SKILL.md +8 -3
  146. package/.agent/skills/company-logos/SKILL.md +6 -0
  147. package/.agent/skills/config-validator/SKILL.md +10 -9
  148. package/.agent/skills/containerization-pro/SKILL.md +6 -5
  149. package/.agent/skills/context-engineering-pro/SKILL.md +5 -4
  150. package/.agent/skills/create-design-md/SKILL.md +13 -5
  151. package/.agent/skills/critique/SKILL.md +10 -8
  152. package/.agent/skills/csharp-developer/SKILL.md +1 -0
  153. package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
  154. package/.agent/skills/database-design/SKILL.md +2 -1
  155. package/.agent/skills/delight/SKILL.md +6 -0
  156. package/.agent/skills/deployment-procedures/SKILL.md +2 -1
  157. package/.agent/skills/design-lab/SKILL.md +5 -0
  158. package/.agent/skills/devops-engineer/SKILL.md +3 -2
  159. package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
  160. package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
  161. package/.agent/skills/distill/SKILL.md +7 -2
  162. package/.agent/skills/documentation-templates/SKILL.md +3 -2
  163. package/.agent/skills/domain-modeling/SKILL.md +12 -4
  164. package/.agent/skills/duckdb-analytical-sql/SKILL.md +7 -3
  165. package/.agent/skills/edge-ai-mobile/SKILL.md +5 -1
  166. package/.agent/skills/edge-computing/SKILL.md +9 -8
  167. package/.agent/skills/emil-design-eng/SKILL.md +43 -27
  168. package/.agent/skills/error-resilience/SKILL.md +34 -16
  169. package/.agent/skills/expo-router-v4/SKILL.md +2 -1
  170. package/.agent/skills/extract-design-system/SKILL.md +12 -11
  171. package/.agent/skills/fabel-protocol/SKILL.md +24 -17
  172. package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
  173. package/.agent/skills/fixing-metadata/SKILL.md +24 -13
  174. package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
  175. package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
  176. package/.agent/skills/frontend-design/SKILL.md +21 -13
  177. package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
  178. package/.agent/skills/game-design-expert/SKILL.md +1 -0
  179. package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
  180. package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
  181. package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
  182. package/.agent/skills/git-pro/SKILL.md +10 -9
  183. package/.agent/skills/github-operations/SKILL.md +2 -1
  184. package/.agent/skills/gpt-taste/SKILL.md +7 -0
  185. package/.agent/skills/gsap-core/SKILL.md +26 -22
  186. package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
  187. package/.agent/skills/gsap-performance/SKILL.md +4 -3
  188. package/.agent/skills/gsap-plugins/SKILL.md +34 -33
  189. package/.agent/skills/gsap-react/SKILL.md +9 -8
  190. package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
  191. package/.agent/skills/gsap-timeline/SKILL.md +18 -15
  192. package/.agent/skills/gsap-utils/SKILL.md +25 -24
  193. package/.agent/skills/harden/SKILL.md +9 -3
  194. package/.agent/skills/harness-protocol/SKILL.md +1 -0
  195. package/.agent/skills/i18n-localization/SKILL.md +10 -9
  196. package/.agent/skills/impeccable/SKILL.md +5 -0
  197. package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
  198. package/.agent/skills/improve-ui/SKILL.md +12 -5
  199. package/.agent/skills/intelligent-routing/SKILL.md +7 -6
  200. package/.agent/skills/knowledge-graph/SKILL.md +1 -0
  201. package/.agent/skills/landing-page/SKILL.md +1 -0
  202. package/.agent/skills/lint-and-validate/SKILL.md +9 -4
  203. package/.agent/skills/llm-engineering/SKILL.md +55 -54
  204. package/.agent/skills/local-first/SKILL.md +20 -19
  205. package/.agent/skills/local-first-architecture/SKILL.md +6 -1
  206. package/.agent/skills/lottie-animation/SKILL.md +7 -3
  207. package/.agent/skills/marquee-loop/SKILL.md +1 -0
  208. package/.agent/skills/masked-reveal/SKILL.md +17 -4
  209. package/.agent/skills/mcp-builder/SKILL.md +13 -10
  210. package/.agent/skills/micro-interaction/SKILL.md +20 -5
  211. package/.agent/skills/mobile-design/SKILL.md +26 -15
  212. package/.agent/skills/monorepo-management/SKILL.md +3 -2
  213. package/.agent/skills/morphing-icons/SKILL.md +16 -6
  214. package/.agent/skills/motion-engineering/SKILL.md +19 -15
  215. package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
  216. package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
  217. package/.agent/skills/observability/SKILL.md +45 -44
  218. package/.agent/skills/opentelemetry-observability/SKILL.md +2 -1
  219. package/.agent/skills/page-transition-animation/SKILL.md +6 -3
  220. package/.agent/skills/parallel-agents/SKILL.md +7 -2
  221. package/.agent/skills/performance-profiling/SKILL.md +24 -13
  222. package/.agent/skills/plan-writing/SKILL.md +1 -0
  223. package/.agent/skills/platform-engineer/SKILL.md +3 -2
  224. package/.agent/skills/platform-engineering-opentofu/SKILL.md +1 -0
  225. package/.agent/skills/playwright-ai-e2e/SKILL.md +3 -2
  226. package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
  227. package/.agent/skills/polish/SKILL.md +13 -12
  228. package/.agent/skills/powershell-windows/SKILL.md +1 -0
  229. package/.agent/skills/pricing-page/SKILL.md +8 -3
  230. package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
  231. package/.agent/skills/progressive-blur/SKILL.md +9 -4
  232. package/.agent/skills/project-idioms/SKILL.md +1 -0
  233. package/.agent/skills/property-based-testing/SKILL.md +10 -12
  234. package/.agent/skills/python-patterns/SKILL.md +1 -0
  235. package/.agent/skills/python-pro/SKILL.md +1 -0
  236. package/.agent/skills/quieter/SKILL.md +6 -0
  237. package/.agent/skills/react-doctor/SKILL.md +6 -0
  238. package/.agent/skills/react-specialist/SKILL.md +32 -28
  239. package/.agent/skills/readme-builder/SKILL.md +1 -0
  240. package/.agent/skills/realtime-patterns/SKILL.md +34 -33
  241. package/.agent/skills/red-team-tactics/SKILL.md +1 -0
  242. package/.agent/skills/redesign-skill/SKILL.md +6 -0
  243. package/.agent/skills/review-animations/SKILL.md +5 -2
  244. package/.agent/skills/review-animations/STANDARDS.md +37 -23
  245. package/.agent/skills/rust-pro/SKILL.md +1 -0
  246. package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
  247. package/.agent/skills/server-management/SKILL.md +1 -0
  248. package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
  249. package/.agent/skills/shape/SKILL.md +9 -2
  250. package/.agent/skills/skill-creator/SKILL.md +1 -0
  251. package/.agent/skills/soft-skill/SKILL.md +6 -0
  252. package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
  253. package/.agent/skills/sql-pro/SKILL.md +1 -0
  254. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
  255. package/.agent/skills/svg-animation/SKILL.md +16 -7
  256. package/.agent/skills/swiftui-expert/SKILL.md +1 -0
  257. package/.agent/skills/swiss-design/SKILL.md +5 -0
  258. package/.agent/skills/system-design-pro/SKILL.md +1 -0
  259. package/.agent/skills/systematic-debugging/SKILL.md +1 -0
  260. package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
  261. package/.agent/skills/taste-skill/SKILL.md +6 -0
  262. package/.agent/skills/tdd-workflow/SKILL.md +5 -0
  263. package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
  264. package/.agent/skills/testing-patterns/SKILL.md +123 -115
  265. package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
  266. package/.agent/skills/thinking-protocol/SKILL.md +3 -0
  267. package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
  268. package/.agent/skills/transitions-dev/SKILL.md +19 -6
  269. package/.agent/skills/trend-researcher/SKILL.md +1 -0
  270. package/.agent/skills/typescript-advanced/SKILL.md +23 -18
  271. package/.agent/skills/typeset/SKILL.md +10 -1
  272. package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
  273. package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
  274. package/.agent/skills/ui-skills-root/SKILL.md +39 -38
  275. package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
  276. package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
  277. package/.agent/skills/vector-search-pgvector/SKILL.md +3 -2
  278. package/.agent/skills/vue-expert/SKILL.md +22 -19
  279. package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
  280. package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
  281. package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
  282. package/.agent/skills/web-quality-audit/SKILL.md +5 -0
  283. package/.agent/skills/webapp-testing/SKILL.md +14 -13
  284. package/.agent/skills/webgpu-performance/SKILL.md +1 -0
  285. package/.agent/skills/whimsy-injector/SKILL.md +9 -5
  286. package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
  287. package/.agent/skills/zero-trust-passkeys/SKILL.md +11 -6
  288. package/.agent/templates/DESIGN.md +119 -110
  289. package/.agent/templates/design-tokens.json +9 -6
  290. package/.agent/workflows/acf.md +1 -0
  291. package/.agent/workflows/api-tester.md +1 -0
  292. package/.agent/workflows/audit.md +1 -0
  293. package/.agent/workflows/brainstorm.md +1 -0
  294. package/.agent/workflows/changelog.md +1 -0
  295. package/.agent/workflows/contract.md +60 -0
  296. package/.agent/workflows/create.md +1 -0
  297. package/.agent/workflows/debug.md +1 -0
  298. package/.agent/workflows/deploy.md +1 -0
  299. package/.agent/workflows/enhance.md +1 -0
  300. package/.agent/workflows/fix-ci.md +89 -0
  301. package/.agent/workflows/fix.md +1 -0
  302. package/.agent/workflows/generate.md +1 -0
  303. package/.agent/workflows/marathon.md +1 -0
  304. package/.agent/workflows/migrate.md +1 -0
  305. package/.agent/workflows/minimal.md +9 -7
  306. package/.agent/workflows/orchestrate.md +1 -0
  307. package/.agent/workflows/performance-benchmarker.md +1 -0
  308. package/.agent/workflows/pipeline.md +26 -21
  309. package/.agent/workflows/plan.md +1 -0
  310. package/.agent/workflows/preview.md +1 -0
  311. package/.agent/workflows/refactor.md +3 -2
  312. package/.agent/workflows/review-ai.md +4 -3
  313. package/.agent/workflows/review.md +1 -0
  314. package/.agent/workflows/session.md +1 -0
  315. package/.agent/workflows/status.md +1 -0
  316. package/.agent/workflows/strengthen-skills.md +1 -0
  317. package/.agent/workflows/super-prompt.md +1 -0
  318. package/.agent/workflows/swarm.md +15 -3
  319. package/.agent/workflows/test.md +8 -7
  320. package/.agent/workflows/tribunal-backend.md +3 -2
  321. package/.agent/workflows/tribunal-cicd.md +104 -0
  322. package/.agent/workflows/tribunal-database.md +1 -0
  323. package/.agent/workflows/tribunal-frontend.md +8 -6
  324. package/.agent/workflows/tribunal-full.md +2 -1
  325. package/.agent/workflows/tribunal-mobile.md +6 -5
  326. package/.agent/workflows/tribunal-performance.md +1 -0
  327. package/.agent/workflows/tribunal-speed.md +1 -0
  328. package/.agent/workflows/tribunal-ui.md +29 -21
  329. package/.agent/workflows/ui-ux-pro-max.md +19 -15
  330. package/CONTRIBUTING.md +3 -3
  331. package/README.md +94 -44
  332. package/SECURITY.md +10 -10
  333. package/bin/mcp-server.js +385 -252
  334. package/bin/tribunal-kit.js +29 -30
  335. package/bin/wrapper.js +40 -46
  336. package/dist/cli.js +6 -0
  337. package/dist/commands/case.js +2 -0
  338. package/dist/commands/contract.js +440 -0
  339. package/dist/commands/status.js +6 -0
  340. package/dist/index.d.ts +8 -1
  341. package/package.json +13 -12
  342. package/scripts/benchmark.js +62 -86
  343. package/scripts/changelog.js +67 -73
  344. package/scripts/fix-vbc.js +13 -15
  345. package/scripts/fix-vbc.ps1 +2 -118
  346. package/scripts/stress_benchmark.js +358 -0
  347. package/scripts/sync-version.js +71 -41
  348. package/scripts/validate-payload.js +23 -30
  349. package/scripts/visual_audit.js +23 -13
@@ -0,0 +1,144 @@
1
+ ---
2
+ name: pipeline-reviewer
3
+ description: CI/CD Pipeline & Workflow Auditor. Audits GitHub Actions, GitLab CI, Dockerfiles, and deployment workflows for deprecated action versions, missing concurrency locks, secret leaks, unpinned 3rd-party action tags, insecure pull_request_target triggers, and permission escalation. Activates on /tribunal-cicd, /fix-ci, and /tribunal-full.
4
+ tools: Read, Grep, Glob, Bash, Edit, Write
5
+ model: inherit
6
+ skills:
7
+ - cicd-pro
8
+ - containerization-pro
9
+ - devops-engineer
10
+ - backend-security-expert
11
+ version: 3.0.0
12
+ last-updated: 2026-08-14
13
+ ---
14
+
15
+ # Pipeline Reviewer — CI/CD & Workflow Gatekeeper
16
+
17
+ ---
18
+
19
+ ## Mandatory Pre-Flight Context Inspection
20
+
21
+ Before auditing CI/CD pipelines, you MUST inspect:
22
+
23
+ 1. Target workflow definitions (`.github/workflows/*.yml`, `.gitlab-ci.yml`, `Dockerfile`)
24
+ 2. Runtime configuration (`package.json`, `Cargo.toml`, `requirements.txt`, Docker lockfiles)
25
+ 3. Secret and credential references (verify OIDC vs static tokens)
26
+
27
+ ---
28
+
29
+ ## 1. Pipeline Vulnerability & Anti-Pattern Checklist
30
+
31
+ | Code | Category | What to Flag |
32
+ | :-------- | :-------------------------------- | :--------------------------------------------------------------------------------------------------- |
33
+ | **CI-01** | **Deprecated Action Versions** | `actions/checkout@v2` or `@v3` (must be `@v4+`), `actions/setup-node@v2`/`@v3`, old Docker actions |
34
+ | **CI-02** | **Insecure PR Triggers** | `pull_request_target` with code checkout of untrusted PR branch (Pwn-Request vulnerability) |
35
+ | **CI-03** | **Missing Concurrency Mutex** | Missing top-level `concurrency:` with `cancel-in-progress` on deployment or test pipelines |
36
+ | **CI-04** | **Excessive Permissions** | Omission of `permissions:` block (defaults to write-all) or `permissions: write-all` |
37
+ | **CI-05** | **Static Cloud Credentials** | Static `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` instead of OIDC (`id-token: write`) |
38
+ | **CI-06** | **Non-Deterministic Builds** | Using `npm install` instead of `npm ci`, or `pip install` without lockfile pinning |
39
+ | **CI-07** | **Unpinned 3rd-Party Actions** | Community actions referenced by mutable branch/tag instead of immutable full-length commit SHA |
40
+ | **CI-08** | **Missing Failure Notifications** | Deployment pipelines with only success alerts and missing `if: failure()` alerts |
41
+ | **CI-09** | **Unprotected Production Gates** | Direct push-to-production deployment jobs without staging dependency or manual approval environments |
42
+ | **CI-10** | **Script Injection in Run Steps** | Injecting `${{ github.event.issue.title }}` directly into inline `run:` bash commands |
43
+
44
+ ---
45
+
46
+ ## 2. Critical Flaws & Approved Patterns
47
+
48
+ ### A. Deprecated Action Versions
49
+
50
+ ```yaml
51
+ # ❌ DEPRECATED: Uses obsolete Node 16 runner runtime
52
+ - uses: actions/checkout@v3
53
+ - uses: actions/setup-node@v3
54
+ with:
55
+ node-version: 18
56
+
57
+ # ✅ APPROVED: Modern runtime with caching
58
+ - uses: actions/checkout@v4
59
+ - uses: actions/setup-node@v4
60
+ with:
61
+ node-version: 22
62
+ cache: npm
63
+ ```
64
+
65
+ ### B. Insecure `pull_request_target` Trigger
66
+
67
+ ```yaml
68
+ # ❌ VULNERABLE: Malicious PR can execute arbitrary code with repository secrets
69
+ on: pull_request_target
70
+ jobs:
71
+ build:
72
+ runs-on: ubuntu-latest
73
+ steps:
74
+ - uses: actions/checkout@v4
75
+ with:
76
+ ref: ${{ github.event.pull_request.head.sha }} # Exploit vector!
77
+ - run: npm ci && npm test
78
+
79
+ # ✅ APPROVED: Standard pull_request trigger with unprivileged context
80
+ on:
81
+ pull_request:
82
+ branches: [main]
83
+ ```
84
+
85
+ ### C. Permissions Lockdown (Least Privilege)
86
+
87
+ ```yaml
88
+ # ❌ DANGEROUS: Default permissions inherit repository-wide write access
89
+ jobs:
90
+ test:
91
+ runs-on: ubuntu-latest
92
+
93
+ # ✅ APPROVED: Explicit least-privilege permissions
94
+ permissions:
95
+ contents: read
96
+
97
+ jobs:
98
+ deploy:
99
+ runs-on: ubuntu-latest
100
+ permissions:
101
+ contents: read
102
+ id-token: write # Required for OIDC role assumption
103
+ ```
104
+
105
+ ### D. Concurrency Mutex Lock
106
+
107
+ ```yaml
108
+ # ❌ RACE CONDITION: Parallel runs collide on deploy or build cache
109
+ name: Deploy
110
+
111
+ # ✅ APPROVED: Prevents conflicting parallel runs and cancels redundant PR checks
112
+ concurrency:
113
+ group: ${{ github.workflow }}-${{ github.ref }}
114
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
115
+ ```
116
+
117
+ ### E. Script Injection Prevention
118
+
119
+ ```yaml
120
+ # ❌ INJECTION VULNERABLE: Title can contain `"; rm -rf /; echo "`
121
+ - name: Echo issue title
122
+ run: echo "${{ github.event.issue.title }}"
123
+
124
+ # ✅ APPROVED: Pass untrusted user input via environment variables
125
+ - name: Echo issue title safely
126
+ env:
127
+ ISSUE_TITLE: ${{ github.event.issue.title }}
128
+ run: echo "$ISSUE_TITLE"
129
+ ```
130
+
131
+ ---
132
+
133
+ ## 3. Verdict Decision Tree
134
+
135
+ ```
136
+ Does the workflow contain:
137
+ 1. `pull_request_target` with head.sha checkout? → ❌ REJECT (Critical Security)
138
+ 2. Static cloud keys instead of OIDC? → ❌ REJECT (Security)
139
+ 3. Direct script injection into bash run:? → ❌ REJECT (Command Injection)
140
+ 4. Deprecated action versions (v1, v2, v3)? → ❌ REJECT (Deprecation)
141
+ 5. `npm install` instead of `npm ci` in CI? → ❌ REJECT (Build Stability)
142
+ 6. Missing concurrency block on deploy? → ⚠️ WARNING
143
+ 7. Missing `if: failure()` alerting on deploy? → ⚠️ WARNING
144
+ ```
@@ -26,6 +26,7 @@ You are the **repository's living memory**. Your sole purpose is to check every
26
26
  ## Mandatory Pre-Flight Context Inspection
27
27
 
28
28
  Before checking case law precedents, you MUST inspect:
29
+
29
30
  1. `.agent/history/case-law/index.json` → Load the active case law index and similarity thresholds
30
31
  2. Proposed diff / code snippet → Extract top-10 domain keywords (API names, packages, async patterns)
31
32
  3. Active reviewer outputs → Prepare to auto-record new rejections via `auto-record` command if any reviewer issues `❌ REJECTED`
@@ -17,6 +17,7 @@ last-updated: 2026-07-29
17
17
  ## Mandatory Pre-Flight Context Inspection
18
18
 
19
19
  Before writing PRDs or user stories, you MUST inspect:
20
+
20
21
  1. Product roadmap / existing PRDs (`docs/`, `task.md`) → Establish feature baseline and business metric goals
21
22
  2. User personas & role permissions → Identify auth roles, scope boundaries, and target user behaviors
22
23
  3. Existing UX wireframes / UI surfaces → Confirm UI capability and technical boundary conditions
@@ -17,6 +17,7 @@ last-updated: 2026-07-29
17
17
  ## Mandatory Pre-Flight Context Inspection
18
18
 
19
19
  Before refining backlogs or sizing stories, you MUST inspect:
20
+
20
21
  1. `task.md` / `implementation_plan.md` → Read current sprint items, wave dependencies, and active backlog items
21
22
  2. User acceptance test suite / E2E test files → Verify existing testable acceptance criteria
22
23
  3. Feature scope documents (`PRD.md`, `docs/`) → Confirm definition of done criteria against business targets
@@ -17,6 +17,7 @@ You evaluate whether the generated UI aligns with the specific functional requir
17
17
  ## Mandatory Pre-Flight Context Inspection
18
18
 
19
19
  Before auditing product heuristics, you MUST inspect:
20
+
20
21
  1. `package.json` / README → Identify the core product type (SaaS, Developer Tool, AI Chatbot, Landing Page, Fintech)
21
22
  2. Data grid / Numeric displays → Check for `font-variant-numeric: tabular-nums` in financial or analytical columns
22
23
  3. Code/Log view components → Ensure monospace font families and copy-to-clipboard elements exist in DevTool contexts
@@ -26,21 +27,24 @@ Before auditing product heuristics, you MUST inspect:
26
27
  ## What This Reviewer Catches
27
28
 
28
29
  ### ❌ REJECTED Criteria (Blocking)
29
- * **Context Mismatches:**
30
- * *SaaS/Dashboard:* Insufficient density, excessive spacing padding, or missing batch records controls.
31
- * *Developer Tools:* Lacking monospace layout components for command paths, logs, code blocks, or active diagnostic metrics.
32
- * *AI Interface:* Lacking streaming indicator containers, prompt suggestion chips, or history containment rules.
33
- * *Marketing/Landing:* Boring, flat templates with no visual identity, or missing clear Conversion CTA buttons.
34
- * *Fintech:* Arbitrary numeric formatting, lack of tabular alignment numbers (`font-variant-numeric: tabular-nums` missing), or overly alarmist primary colors for negative indicators.
30
+
31
+ - **Context Mismatches:**
32
+ - _SaaS/Dashboard:_ Insufficient density, excessive spacing padding, or missing batch records controls.
33
+ - _Developer Tools:_ Lacking monospace layout components for command paths, logs, code blocks, or active diagnostic metrics.
34
+ - _AI Interface:_ Lacking streaming indicator containers, prompt suggestion chips, or history containment rules.
35
+ - _Marketing/Landing:_ Boring, flat templates with no visual identity, or missing clear Conversion CTA buttons.
36
+ - _Fintech:_ Arbitrary numeric formatting, lack of tabular alignment numbers (`font-variant-numeric: tabular-nums` missing), or overly alarmist primary colors for negative indicators.
35
37
 
36
38
  ### ⚠️ WARNING Criteria (Non-blocking)
37
- * *Interaction Density:* General spacing elements that waste screen space in professional operator panels.
39
+
40
+ - _Interaction Density:_ General spacing elements that waste screen space in professional operator panels.
38
41
 
39
42
  ---
40
43
 
41
44
  ## Code Comparison Examples
42
45
 
43
46
  ### DevTool: Text Code Block vs. Monospace Console Output
47
+
44
48
  ```tsx
45
49
  // ❌ REJECTED: Plain text div without monospace tags or visual code block structure
46
50
  <div className="bg-gray-800 text-white p-4">
@@ -60,6 +64,7 @@ Before auditing product heuristics, you MUST inspect:
60
64
  ```
61
65
 
62
66
  ### Fintech: Jagged Numbers vs. Tabular Aligned Numbers
67
+
63
68
  ```tsx
64
69
  // ❌ REJECTED: Standard font styling causing numbers of different widths to misalign columns
65
70
  <div className="flex flex-col text-sm">
@@ -18,6 +18,7 @@ last-updated: 2026-07-29
18
18
  ## Mandatory Pre-Flight Context Inspection
19
19
 
20
20
  Before creating implementation plans, you MUST inspect:
21
+
21
22
  1. Active codebase layout (`package.json`, `schema.prisma`, route structures) → Verify current project state and tech stack
22
23
  2. Existing `implementation_plan.md` / `task.md` → Check previous plan history and active wave progress
23
24
  3. Dependency Ladder rungs (Rungs 1 to 6) → Validate that proposed architecture uses the lowest possible dependency rung
@@ -114,7 +115,9 @@ Wave 4 — Polish & Deploy
114
115
  > [Any breaking changes, architectural decisions, or open questions needing approval]
115
116
 
116
117
  ## Dependency Ladder Alignment
118
+
117
119
  Evaluate proposed changes against the Dependency Ladder (Rungs 1 to 6). Confirm the lowest possible rung is chosen to avoid bloat:
120
+
118
121
  - **Proposed Rung**: [e.g. Rung 3: Platform / Rung 4: Installed Dep]
119
122
  - **Justification**: [Explain why lower rungs are not applicable. If using Rung 6 (custom code/new library), justify with a // VERIFY comment]
120
123
 
@@ -19,6 +19,7 @@ last-updated: 2026-07-29
19
19
  ## Mandatory Pre-Flight Context Inspection
20
20
 
21
21
  Before designing test automation suites or Playwright specs, you MUST inspect:
22
+
22
23
  1. `package.json` / `playwright.config.ts` / `vitest.config.ts` → Read existing test runners, timeouts, and CI configurations
23
24
  2. Component ARIA roles & accessible labels (`getByRole`, `getByLabelText`) → Verify accessible DOM selectors over brittle CSS classes
24
25
  3. MSW handlers (`src/mocks/handlers.ts`) & API contracts → Audit mock network responses and status codes for integration suites
@@ -54,27 +55,27 @@ Write tests that fail when real user-facing behavior breaks — nothing less, no
54
55
  // ❌ DON'T unit test: component rendering, API calls, DB queries
55
56
 
56
57
  // ✅ DO unit test: business logic isolated
57
- import { describe, it, expect } from "vitest";
58
- import { calculateDiscount } from "./pricing";
58
+ import { describe, it, expect } from 'vitest';
59
+ import { calculateDiscount } from './pricing';
59
60
 
60
- describe("calculateDiscount()", () => {
61
+ describe('calculateDiscount()', () => {
61
62
  // Always test the happy path
62
- it("applies 10% to orders over $100", () => {
63
+ it('applies 10% to orders over $100', () => {
63
64
  expect(calculateDiscount(150)).toBe(135);
64
65
  });
65
66
 
66
67
  // Always test all boundary cases
67
- it("applies no discount at exactly $100 (exclusive boundary)", () => {
68
+ it('applies no discount at exactly $100 (exclusive boundary)', () => {
68
69
  expect(calculateDiscount(100)).toBe(100);
69
70
  });
70
71
 
71
72
  // Always test error/invalid input
72
- it("throws RangeError on negative input", () => {
73
+ it('throws RangeError on negative input', () => {
73
74
  expect(() => calculateDiscount(-50)).toThrow(RangeError);
74
75
  });
75
76
 
76
77
  // Always test zero and extreme values
77
- it("returns 0 for $0 order", () => {
78
+ it('returns 0 for $0 order', () => {
78
79
  expect(calculateDiscount(0)).toBe(0);
79
80
  });
80
81
  });
@@ -145,38 +146,38 @@ test('shows error on failed load', async () => {
145
146
 
146
147
  ```typescript
147
148
  // playwright.config.ts
148
- import { defineConfig, devices } from "@playwright/test";
149
+ import { defineConfig, devices } from '@playwright/test';
149
150
 
150
151
  export default defineConfig({
151
- testDir: "./e2e",
152
+ testDir: './e2e',
152
153
  fullyParallel: true,
153
154
  retries: process.env.CI ? 2 : 0, // Retry in CI for flakiness
154
- reporter: [["html"], ["github"]],
155
+ reporter: [['html'], ['github']],
155
156
  use: {
156
- baseURL: "http://localhost:3000",
157
- trace: "on-first-retry", // Record trace only on failure
158
- video: "on-first-retry", // Record video only on failure
159
- screenshot: "only-on-failure",
157
+ baseURL: 'http://localhost:3000',
158
+ trace: 'on-first-retry', // Record trace only on failure
159
+ video: 'on-first-retry', // Record video only on failure
160
+ screenshot: 'only-on-failure',
160
161
  },
161
162
  projects: [
162
- { name: "chromium", use: { ...devices["Desktop Chrome"] } },
163
- { name: "Mobile Safari", use: { ...devices["iPhone 14"] } },
163
+ { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
164
+ { name: 'Mobile Safari', use: { ...devices['iPhone 14'] } },
164
165
  ],
165
166
  });
166
167
 
167
168
  // e2e/auth.spec.ts
168
- import { test, expect } from "@playwright/test";
169
+ import { test, expect } from '@playwright/test';
169
170
 
170
171
  // Store auth state to avoid logging in every test
171
- test.use({ storageState: "e2e/auth.json" });
172
-
173
- test("user can complete checkout flow", async ({ page }) => {
174
- await page.goto("/products");
175
- await page.getByRole("button", { name: "Add to cart" }).first().click();
176
- await page.getByRole("link", { name: "Cart" }).click();
177
- await expect(page.getByText("1 item")).toBeVisible();
178
- await page.getByRole("button", { name: "Checkout" }).click();
179
- await expect(page).toHaveURL("/checkout");
172
+ test.use({ storageState: 'e2e/auth.json' });
173
+
174
+ test('user can complete checkout flow', async ({ page }) => {
175
+ await page.goto('/products');
176
+ await page.getByRole('button', { name: 'Add to cart' }).first().click();
177
+ await page.getByRole('link', { name: 'Cart' }).click();
178
+ await expect(page.getByText('1 item')).toBeVisible();
179
+ await page.getByRole('button', { name: 'Checkout' }).click();
180
+ await expect(page).toHaveURL('/checkout');
180
181
  });
181
182
  ```
182
183
 
@@ -186,15 +187,15 @@ test("user can complete checkout flow", async ({ page }) => {
186
187
 
187
188
  ```typescript
188
189
  // ❌ BRITTLE (fails on UI refactor)
189
- page.locator(".cart-btn > span.label");
190
- getByTestId("btn-0"); // Index-based
191
- container.querySelector("#submit-47f3"); // Generated ID
190
+ page.locator('.cart-btn > span.label');
191
+ getByTestId('btn-0'); // Index-based
192
+ container.querySelector('#submit-47f3'); // Generated ID
192
193
 
193
194
  // ✅ RESILIENT (survives refactoring + validates accessibility)
194
- getByRole("button", { name: /add to cart/i }); // Role + name
195
- getByLabelText("Email address"); // Form label association
196
- getByPlaceholderText("Search products"); // Input placeholder
197
- getByText("Free shipping on orders over $50"); // Visible text
195
+ getByRole('button', { name: /add to cart/i }); // Role + name
196
+ getByLabelText('Email address'); // Form label association
197
+ getByPlaceholderText('Search products'); // Input placeholder
198
+ getByText('Free shipping on orders over $50'); // Visible text
198
199
  ```
199
200
 
200
201
  ---
@@ -203,25 +204,31 @@ getByText("Free shipping on orders over $50"); // Visible text
203
204
 
204
205
  ```typescript
205
206
  // Test server routes with supertest — no browser needed
206
- import request from "supertest";
207
- import app from "../src/app";
207
+ import request from 'supertest';
208
+ import app from '../src/app';
208
209
 
209
- describe("POST /api/auth/login", () => {
210
- it("returns JWT on valid credentials", async () => {
211
- const response = await request(app).post("/api/auth/login").send({ email: "alice@example.com", password: "correct" }).expect(200);
210
+ describe('POST /api/auth/login', () => {
211
+ it('returns JWT on valid credentials', async () => {
212
+ const response = await request(app)
213
+ .post('/api/auth/login')
214
+ .send({ email: 'alice@example.com', password: 'correct' })
215
+ .expect(200);
212
216
 
213
217
  expect(response.body).toMatchObject({ token: expect.any(String) });
214
218
  });
215
219
 
216
- it("returns 401 on invalid credentials", async () => {
217
- await request(app).post("/api/auth/login").send({ email: "alice@example.com", password: "wrong" }).expect(401);
220
+ it('returns 401 on invalid credentials', async () => {
221
+ await request(app)
222
+ .post('/api/auth/login')
223
+ .send({ email: 'alice@example.com', password: 'wrong' })
224
+ .expect(401);
218
225
  });
219
226
 
220
- it("returns 429 after 10 failed attempts", async () => {
227
+ it('returns 429 after 10 failed attempts', async () => {
221
228
  for (let i = 0; i < 10; i++) {
222
- await request(app).post("/api/auth/login").send({ password: "wrong" });
229
+ await request(app).post('/api/auth/login').send({ password: 'wrong' });
223
230
  }
224
- await request(app).post("/api/auth/login").send({ password: "wrong" }).expect(429); // Rate limit hit
231
+ await request(app).post('/api/auth/login').send({ password: 'wrong' }).expect(429); // Rate limit hit
225
232
  });
226
233
  });
227
234
  ```
@@ -20,6 +20,7 @@ You have one job: ensure the code does not crash the system or fail silently whe
20
20
  ## Mandatory Pre-Flight Context Inspection
21
21
 
22
22
  Before auditing fault tolerance, you MUST inspect:
23
+
23
24
  1. Active environment configs (`package.json`, `.env.example`) → Check for timeout values, retry limits, and environment variable fallbacks
24
25
  2. Network boundary calls → Verify `AbortController`, `fetch` timeout wrappers, or DB connection pool retry configurations
25
26
  3. Top-level process entry points (`index.ts`, `server.ts`, `app/layout.tsx`) → Verify error boundaries and global exception handlers
@@ -20,6 +20,7 @@ You have one job: ensure no untrusted data enters the application without strict
20
20
  ## Mandatory Pre-Flight Context Inspection
21
21
 
22
22
  Before auditing validation boundaries, you MUST inspect:
23
+
23
24
  1. `package.json` / `requirements.txt` → Check for Zod, Valibot, ArkType, Pydantic, or native validation libraries
24
25
  2. Schema declaration directories (`schemas/`, `lib/validations/`, `models/`) → Ensure schemas are centralized and shared
25
26
  3. Target API entry points → Verify request body, path params, query parameters, and header parsing
@@ -51,13 +51,11 @@ element.innerHTML = userInput; // Executes embedded scripts
51
51
  const query = `UPDATE orders SET status = '${status}' WHERE id = ${orderId}`;
52
52
 
53
53
  // ✅ Parameterized query
54
- const result = await db.query("SELECT * FROM users WHERE email = $1", [email]);
54
+ const result = await db.query('SELECT * FROM users WHERE email = $1', [email]);
55
55
 
56
56
  // ✅ exec validation
57
- const ALLOWED_REPOS = new Set([
58
- /* allowlist */
59
- ]);
60
- if (!ALLOWED_REPOS.has(repoUrl)) throw new Error("Unauthorized repo");
57
+ const ALLOWED_REPOS = new Set([/* allowlist */]);
58
+ if (!ALLOWED_REPOS.has(repoUrl)) throw new Error('Unauthorized repo');
61
59
 
62
60
  // ✅ textContent for user-generated text (no script execution)
63
61
  element.textContent = userInput;
@@ -72,31 +70,31 @@ element.textContent = userInput;
72
70
  jwt.verify(token, secret); // Attacker can forge with algorithm: 'none'
73
71
 
74
72
  // ❌ WEAK SECRET: Under 32 chars = brute-forceable
75
- const JWT_SECRET = "password123";
73
+ const JWT_SECRET = 'password123';
76
74
 
77
75
  // ❌ NO EXPIRY: Token valid forever
78
76
  jwt.sign({ userId }, secret); // Missing expiresIn
79
77
 
80
78
  // ❌ HARDCODED CREDENTIAL
81
- const DB_PASSWORD = "admin1234";
79
+ const DB_PASSWORD = 'admin1234';
82
80
 
83
81
  // ✅ Secure JWT
84
82
  jwt.verify(token, process.env.JWT_SECRET!, {
85
- algorithms: ["HS256"], // Explicit algorithm enforcement
86
- issuer: "api.myapp.com",
87
- audience: "myapp-client",
83
+ algorithms: ['HS256'], // Explicit algorithm enforcement
84
+ issuer: 'api.myapp.com',
85
+ audience: 'myapp-client',
88
86
  });
89
87
 
90
88
  // ✅ Environment variable with existence guard
91
89
  const JWT_SECRET = process.env.JWT_SECRET;
92
90
  if (!JWT_SECRET || JWT_SECRET.length < 32) {
93
- throw new Error("JWT_SECRET must be at least 32 characters");
91
+ throw new Error('JWT_SECRET must be at least 32 characters');
94
92
  }
95
93
 
96
94
  // ✅ Short expiry + refresh token pattern
97
95
  jwt.sign({ userId }, JWT_SECRET, {
98
- expiresIn: "15m", // Short-lived access token
99
- algorithm: "HS256",
96
+ expiresIn: '15m', // Short-lived access token
97
+ algorithm: 'HS256',
100
98
  });
101
99
  ```
102
100
 
@@ -106,7 +104,7 @@ jwt.sign({ userId }, JWT_SECRET, {
106
104
 
107
105
  ```typescript
108
106
  // ❌ CRITICAL: User controls the URL — can hit internal services
109
- app.get("/proxy", async (req, res) => {
107
+ app.get('/proxy', async (req, res) => {
110
108
  const response = await fetch(req.query.url); // http://169.254.169.254/metadata (AWS IMDS!)
111
109
  res.json(await response.json());
112
110
  });
@@ -115,7 +113,7 @@ app.get("/proxy", async (req, res) => {
115
113
  await fetch(webhookUrl); // Could be http://internal-db:5432
116
114
 
117
115
  // ✅ SAFE: URL allowlist validation
118
- const ALLOWED_HOSTS = new Set(["api.stripe.com", "hooks.slack.com"]);
116
+ const ALLOWED_HOSTS = new Set(['api.stripe.com', 'hooks.slack.com']);
119
117
  const url = new URL(webhookUrl);
120
118
  if (!ALLOWED_HOSTS.has(url.hostname)) {
121
119
  throw new Error(`Unauthorized webhook host: ${url.hostname}`);
@@ -127,7 +125,7 @@ function isPrivateIP(hostname: string): boolean {
127
125
  return /^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.|127\.|169\.254\.)/.test(hostname);
128
126
  }
129
127
  if (isPrivateIP(new URL(url).hostname)) {
130
- throw new Error("Private network access forbidden");
128
+ throw new Error('Private network access forbidden');
131
129
  }
132
130
  ```
133
131
 
@@ -137,15 +135,15 @@ if (isPrivateIP(new URL(url).hostname)) {
137
135
 
138
136
  ```typescript
139
137
  // ❌ IDOR: User can access any resource by changing the ID parameter
140
- app.get("/user/:id/documents", async (req, res) => {
138
+ app.get('/user/:id/documents', async (req, res) => {
141
139
  const docs = await db.documents.findMany({ where: { userId: req.params.id } });
142
140
  return res.json(docs); // Missing: does req.session.userId === req.params.id?
143
141
  });
144
142
 
145
143
  // ✅ SAFE: Scoped to authenticated user's own data
146
- app.get("/user/:id/documents", requireAuth, async (req, res) => {
147
- if (req.session.userId !== req.params.id && req.session.role !== "admin") {
148
- return res.status(403).json({ error: "Forbidden" });
144
+ app.get('/user/:id/documents', requireAuth, async (req, res) => {
145
+ if (req.session.userId !== req.params.id && req.session.role !== 'admin') {
146
+ return res.status(403).json({ error: 'Forbidden' });
149
147
  }
150
148
  const docs = await db.documents.findMany({ where: { userId: req.params.id } });
151
149
  return res.json(docs);
@@ -158,7 +156,7 @@ app.get("/user/:id/documents", requireAuth, async (req, res) => {
158
156
 
159
157
  ```typescript
160
158
  // ❌ CORS wildcard in production — any origin can call your API
161
- app.use(cors({ origin: "*" }));
159
+ app.use(cors({ origin: '*' }));
162
160
 
163
161
  // ❌ Verbose error exposing internals
164
162
  app.use((err, req, res, next) => {
@@ -166,7 +164,7 @@ app.use((err, req, res, next) => {
166
164
  });
167
165
 
168
166
  // ✅ Restrictive CORS
169
- const allowedOrigins = (process.env.ALLOWED_ORIGINS ?? "").split(",");
167
+ const allowedOrigins = (process.env.ALLOWED_ORIGINS ?? '').split(',');
170
168
  app.use(
171
169
  cors({
172
170
  origin: (origin, cb) => {
@@ -178,8 +176,8 @@ app.use(
178
176
 
179
177
  // ✅ Safe error response — log internally, generic to client
180
178
  app.use((err: Error, req, res, next) => {
181
- logger.error({ err, path: req.path }, "Unhandled error");
182
- res.status(500).json({ error: "Internal server error", code: "INTERNAL_ERROR" });
179
+ logger.error({ err, path: req.path }, 'Unhandled error');
180
+ res.status(500).json({ error: 'Internal server error', code: 'INTERNAL_ERROR' });
183
181
  });
184
182
  ```
185
183
 
@@ -188,11 +186,13 @@ app.use((err: Error, req, res, next) => {
188
186
  ## 4. Prompt Injection Defense & LLM Call Security
189
187
 
190
188
  ### Prompt Injection Defenses
189
+
191
190
  - Ensure user-provided input is never concatenated directly into top-level system prompts.
192
191
  - Verify that user inputs are isolated in `<user_provided_context>` or custom XML tags, and system prompts explicitly instruct the model to ignore instructions within those tags.
193
192
  - Verify that HTML/XML tags are stripped or sanitized from user input before sending to LLM APIs.
194
193
 
195
194
  ### LLM Call Audit Checklist
195
+
196
196
  - Flag any hardcoded API keys. They must be loaded from environment variables.
197
197
  - Verify model strings against official current lists (no invented names like `claude-4-opus` or `gpt-5`).
198
198
  - Ensure all LLM API calls are asynchronous and properly awaited.