agentplugged 0.0.1 → 1.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 (284) hide show
  1. package/LICENSE-METHOD +21 -0
  2. package/README.md +240 -16
  3. package/dist/agent-commands.js +46532 -0
  4. package/dist/bin.js +13 -0
  5. package/dist/cli.js +44 -0
  6. package/dist/esm.js +920 -0
  7. package/dist/forge-follow.js +231 -0
  8. package/dist/helpers.js +18526 -0
  9. package/dist/helpers2.js +1 -0
  10. package/dist/launcher-env.js +13 -0
  11. package/dist/launcher.js +308 -0
  12. package/dist/libsodium-wrappers.js +4384 -0
  13. package/dist/libsodium-wrappers2.js +4384 -0
  14. package/dist/main.js +17732 -0
  15. package/dist/method/LICENSE +21 -0
  16. package/dist/method/agents/alex/SKILL.md +87 -0
  17. package/dist/method/agents/alex/agent.yaml +94 -0
  18. package/dist/method/agents/chloe/SKILL.md +97 -0
  19. package/dist/method/agents/chloe/agent.yaml +87 -0
  20. package/dist/method/agents/ethan/SKILL.md +55 -0
  21. package/dist/method/agents/ethan/agent.yaml +94 -0
  22. package/dist/method/agents/hugo/SKILL.md +52 -0
  23. package/dist/method/agents/hugo/agent.yaml +93 -0
  24. package/dist/method/agents/iris/SKILL.md +69 -0
  25. package/dist/method/agents/iris/agent.yaml +86 -0
  26. package/dist/method/agents/izzy/SKILL.md +137 -0
  27. package/dist/method/agents/izzy/agent.yaml +104 -0
  28. package/dist/method/agents/jade/SKILL.md +54 -0
  29. package/dist/method/agents/jade/agent.yaml +94 -0
  30. package/dist/method/agents/julien/SKILL.md +96 -0
  31. package/dist/method/agents/julien/agent.yaml +95 -0
  32. package/dist/method/agents/lina/SKILL.md +54 -0
  33. package/dist/method/agents/lina/agent.yaml +94 -0
  34. package/dist/method/agents/lou/SKILL.md +67 -0
  35. package/dist/method/agents/lou/agent.yaml +84 -0
  36. package/dist/method/agents/maya/SKILL.md +82 -0
  37. package/dist/method/agents/maya/agent.yaml +98 -0
  38. package/dist/method/agents/milo/SKILL.md +79 -0
  39. package/dist/method/agents/milo/agent.yaml +80 -0
  40. package/dist/method/agents/noah/SKILL.md +80 -0
  41. package/dist/method/agents/noah/agent.yaml +73 -0
  42. package/dist/method/agents/noah/references/conduct.md +98 -0
  43. package/dist/method/agents/noah/references/decisions.md +122 -0
  44. package/dist/method/agents/noah/references/environment.md +72 -0
  45. package/dist/method/agents/noah/references/facts.md +13 -0
  46. package/dist/method/agents/noah/references/journey.md +80 -0
  47. package/dist/method/agents/noah/references/team.md +195 -0
  48. package/dist/method/agents/omar/SKILL.md +92 -0
  49. package/dist/method/agents/omar/agent.yaml +86 -0
  50. package/dist/method/agents/quentin/SKILL.md +78 -0
  51. package/dist/method/agents/quentin/agent.yaml +82 -0
  52. package/dist/method/agents/sam/SKILL.md +54 -0
  53. package/dist/method/agents/sam/agent.yaml +94 -0
  54. package/dist/method/agents/stella/SKILL.md +80 -0
  55. package/dist/method/agents/stella/agent.yaml +89 -0
  56. package/dist/method/agents/tess/SKILL.md +64 -0
  57. package/dist/method/agents/tess/agent.yaml +94 -0
  58. package/dist/method/agents/zoe/SKILL.md +85 -0
  59. package/dist/method/agents/zoe/agent.yaml +91 -0
  60. package/dist/method/doctor.yaml +1029 -0
  61. package/dist/method/models.yaml +73 -0
  62. package/dist/method/skills/.gitkeep +0 -0
  63. package/dist/method/skills/acceptance-qa/SKILL.md +40 -0
  64. package/dist/method/skills/acceptance-qa/references/run.md +54 -0
  65. package/dist/method/skills/acceptance-qa/references/scenarios.md +32 -0
  66. package/dist/method/skills/acceptance-qa/references/verdicts.md +43 -0
  67. package/dist/method/skills/api-e2e-tests/SKILL.md +61 -0
  68. package/dist/method/skills/api-e2e-tests/references/ci.md +33 -0
  69. package/dist/method/skills/api-e2e-tests/references/frameworks.md +58 -0
  70. package/dist/method/skills/api-e2e-tests/references/generate.md +67 -0
  71. package/dist/method/skills/audit-pillars/SKILL.md +28 -0
  72. package/dist/method/skills/audit-pillars/references/accessibility.md +13 -0
  73. package/dist/method/skills/audit-pillars/references/architecture.md +13 -0
  74. package/dist/method/skills/audit-pillars/references/dependencies.md +13 -0
  75. package/dist/method/skills/audit-pillars/references/format.md +20 -0
  76. package/dist/method/skills/audit-pillars/references/interface.md +13 -0
  77. package/dist/method/skills/audit-pillars/references/method.md +33 -0
  78. package/dist/method/skills/audit-pillars/references/performance.md +17 -0
  79. package/dist/method/skills/audit-pillars/references/quality.md +11 -0
  80. package/dist/method/skills/audit-pillars/references/security.md +13 -0
  81. package/dist/method/skills/audit-pillars/references/tests.md +17 -0
  82. package/dist/method/skills/chain-stories/SKILL.md +30 -0
  83. package/dist/method/skills/chain-stories/references/attempts.md +19 -0
  84. package/dist/method/skills/chain-stories/references/stops.md +27 -0
  85. package/dist/method/skills/check-readiness/SKILL.md +34 -0
  86. package/dist/method/skills/check-readiness/references/judge.md +21 -0
  87. package/dist/method/skills/check-readiness/references/settle.md +17 -0
  88. package/dist/method/skills/check-requirements/SKILL.md +97 -0
  89. package/dist/method/skills/check-requirements/references/engine-proofs.md +43 -0
  90. package/dist/method/skills/check-requirements/references/proofs-and-gaps.md +45 -0
  91. package/dist/method/skills/correct-course/SKILL.md +15 -0
  92. package/dist/method/skills/correct-course/references/gestures.md +20 -0
  93. package/dist/method/skills/correct-course/references/starts.md +18 -0
  94. package/dist/method/skills/correct-course/references/steps.md +14 -0
  95. package/dist/method/skills/critique-deliverable/SKILL.md +25 -0
  96. package/dist/method/skills/critique-deliverable/references/assumption-audit.md +11 -0
  97. package/dist/method/skills/critique-deliverable/references/choose.md +27 -0
  98. package/dist/method/skills/critique-deliverable/references/compare-existing.md +13 -0
  99. package/dist/method/skills/critique-deliverable/references/devils-advocate.md +13 -0
  100. package/dist/method/skills/critique-deliverable/references/divergence.md +15 -0
  101. package/dist/method/skills/critique-deliverable/references/domain-expert.md +14 -0
  102. package/dist/method/skills/critique-deliverable/references/extreme-user.md +13 -0
  103. package/dist/method/skills/critique-deliverable/references/failure-modes.md +13 -0
  104. package/dist/method/skills/critique-deliverable/references/first-principles.md +12 -0
  105. package/dist/method/skills/critique-deliverable/references/format.md +25 -0
  106. package/dist/method/skills/critique-deliverable/references/gestures.md +24 -0
  107. package/dist/method/skills/critique-deliverable/references/inversion.md +13 -0
  108. package/dist/method/skills/critique-deliverable/references/judgment.md +14 -0
  109. package/dist/method/skills/critique-deliverable/references/pre-mortem.md +12 -0
  110. package/dist/method/skills/critique-deliverable/references/reconcile.md +15 -0
  111. package/dist/method/skills/critique-deliverable/references/red-team.md +12 -0
  112. package/dist/method/skills/critique-deliverable/references/reframe.md +12 -0
  113. package/dist/method/skills/critique-deliverable/references/second-order.md +12 -0
  114. package/dist/method/skills/critique-deliverable/references/socratic.md +15 -0
  115. package/dist/method/skills/critique-deliverable/references/steelman.md +13 -0
  116. package/dist/method/skills/critique-deliverable/references/subtraction.md +12 -0
  117. package/dist/method/skills/deep-research/SKILL.md +43 -0
  118. package/dist/method/skills/deep-research/assets/page-template.md +37 -0
  119. package/dist/method/skills/deep-research/references/candidates.md +29 -0
  120. package/dist/method/skills/deep-research/references/external.md +37 -0
  121. package/dist/method/skills/deep-research/references/page-format.md +51 -0
  122. package/dist/method/skills/deep-research/references/types.md +31 -0
  123. package/dist/method/skills/develop-story/SKILL.md +211 -0
  124. package/dist/method/skills/develop-story/evals/cases.yaml +45 -0
  125. package/dist/method/skills/develop-story/references/acceptance-tests.md +73 -0
  126. package/dist/method/skills/develop-story/references/self-check.md +46 -0
  127. package/dist/method/skills/diagnose-bug/SKILL.md +73 -0
  128. package/dist/method/skills/diagnose-bug/references/hypotheses.md +45 -0
  129. package/dist/method/skills/diagnose-bug/references/probes.md +40 -0
  130. package/dist/method/skills/generate-knowledge-base/SKILL.md +251 -0
  131. package/dist/method/skills/generate-knowledge-base/assets/guide-template.md +49 -0
  132. package/dist/method/skills/generate-knowledge-base/assets/index-template.md +58 -0
  133. package/dist/method/skills/generate-knowledge-base/assets/page-template.md +61 -0
  134. package/dist/method/skills/generate-knowledge-base/assets/release-notes-template.md +38 -0
  135. package/dist/method/skills/generate-knowledge-base/references/kb-checklist.md +49 -0
  136. package/dist/method/skills/generate-knowledge-base/references/living-docs.md +81 -0
  137. package/dist/method/skills/generate-knowledge-base/references/repository-scan.md +48 -0
  138. package/dist/method/skills/generate-knowledge-base/references/reuse-map.md +21 -0
  139. package/dist/method/skills/ideation/SKILL.md +44 -0
  140. package/dist/method/skills/ideation/assets/session-template.md +46 -0
  141. package/dist/method/skills/ideation/references/choose.md +21 -0
  142. package/dist/method/skills/ideation/references/close.md +17 -0
  143. package/dist/method/skills/ideation/references/converge.md +24 -0
  144. package/dist/method/skills/ideation/references/gestures.md +15 -0
  145. package/dist/method/skills/ideation/references/stances.md +21 -0
  146. package/dist/method/skills/ideation/references/techniques-borrowed.md +8 -0
  147. package/dist/method/skills/ideation/references/techniques-deep.md +12 -0
  148. package/dist/method/skills/ideation/references/techniques-frames.md +12 -0
  149. package/dist/method/skills/ideation/references/techniques-futures.md +8 -0
  150. package/dist/method/skills/ideation/references/techniques-limits.md +9 -0
  151. package/dist/method/skills/ideation/references/techniques-people.md +7 -0
  152. package/dist/method/skills/ideation/references/techniques-sparks.md +10 -0
  153. package/dist/method/skills/ideation/references/techniques-together.md +11 -0
  154. package/dist/method/skills/improve-code/SKILL.md +74 -0
  155. package/dist/method/skills/improve-code/references/axes.md +45 -0
  156. package/dist/method/skills/improve-session/SKILL.md +47 -0
  157. package/dist/method/skills/order-merges/SKILL.md +71 -0
  158. package/dist/method/skills/pitch/SKILL.md +40 -0
  159. package/dist/method/skills/pitch/assets/deck-template.md +31 -0
  160. package/dist/method/skills/pitch/assets/design-template.md +45 -0
  161. package/dist/method/skills/pitch/assets/narrative-template.md +40 -0
  162. package/dist/method/skills/pitch/references/deck-types.md +17 -0
  163. package/dist/method/skills/pitch/references/deck.md +24 -0
  164. package/dist/method/skills/pitch/references/design-implementation.md +25 -0
  165. package/dist/method/skills/pitch/references/design-methods.md +45 -0
  166. package/dist/method/skills/pitch/references/design-thinking.md +28 -0
  167. package/dist/method/skills/pitch/references/story-frameworks.md +39 -0
  168. package/dist/method/skills/pitch/references/story.md +22 -0
  169. package/dist/method/skills/plan-sprint/SKILL.md +162 -0
  170. package/dist/method/skills/quick-lane/SKILL.md +143 -0
  171. package/dist/method/skills/resolve-merge-conflict/SKILL.md +83 -0
  172. package/dist/method/skills/review-story/SKILL.md +96 -0
  173. package/dist/method/skills/review-story/evals/cases.yaml +59 -0
  174. package/dist/method/skills/review-story/references/amend-story.md +16 -0
  175. package/dist/method/skills/review-story/references/export.md +20 -0
  176. package/dist/method/skills/review-story/references/format.md +33 -0
  177. package/dist/method/skills/review-story/references/free-review.md +22 -0
  178. package/dist/method/skills/review-story/references/judge.md +44 -0
  179. package/dist/method/skills/review-story/references/lens-adversarial.md +15 -0
  180. package/dist/method/skills/review-story/references/lens-edge-cases.md +24 -0
  181. package/dist/method/skills/review-story/references/lens-prose.md +11 -0
  182. package/dist/method/skills/review-story/references/lens-relevance.md +13 -0
  183. package/dist/method/skills/review-story/references/lens-security.md +10 -0
  184. package/dist/method/skills/review-story/references/lens-structure.md +16 -0
  185. package/dist/method/skills/review-story/references/lens-verification-gaps.md +13 -0
  186. package/dist/method/skills/review-story/references/pass-assertions.md +17 -0
  187. package/dist/method/skills/review-story/references/pass-removals.md +13 -0
  188. package/dist/method/skills/review-tests/SKILL.md +32 -0
  189. package/dist/method/skills/review-tests/references/check.md +25 -0
  190. package/dist/method/skills/review-tests/references/grid.md +27 -0
  191. package/dist/method/skills/round-table/SKILL.md +31 -0
  192. package/dist/method/skills/round-table/evals/cases.yaml +27 -0
  193. package/dist/method/skills/round-table/references/cast.md +14 -0
  194. package/dist/method/skills/round-table/references/gestures.md +24 -0
  195. package/dist/method/skills/round-table/references/guests.md +17 -0
  196. package/dist/method/skills/round-table/references/independence.md +21 -0
  197. package/dist/method/skills/round-table/references/rooms.md +29 -0
  198. package/dist/method/skills/round-table/references/three-views.md +17 -0
  199. package/dist/method/skills/round-table/references/turns.md +19 -0
  200. package/dist/method/skills/run-retrospective/SKILL.md +201 -0
  201. package/dist/method/skills/security-review-architecture/SKILL.md +129 -0
  202. package/dist/method/skills/security-review-architecture/assets/architecture-review-template.md +47 -0
  203. package/dist/method/skills/security-review-architecture/references/spec-review.md +48 -0
  204. package/dist/method/skills/setup-ci/SKILL.md +121 -0
  205. package/dist/method/skills/setup-ci/assets/github-actions.yml +52 -0
  206. package/dist/method/skills/setup-ci/assets/gitlab-ci.yml +34 -0
  207. package/dist/method/skills/split-into-stories/SKILL.md +205 -0
  208. package/dist/method/skills/split-into-stories/assets/epic.md.tmpl +31 -0
  209. package/dist/method/skills/split-into-stories/assets/story.md.tmpl +36 -0
  210. package/dist/method/skills/strategy/SKILL.md +44 -0
  211. package/dist/method/skills/strategy/assets/innovation-template.md +60 -0
  212. package/dist/method/skills/strategy/assets/problem-template.md +54 -0
  213. package/dist/method/skills/strategy/references/costs.md +28 -0
  214. package/dist/method/skills/strategy/references/gestures.md +24 -0
  215. package/dist/method/skills/strategy/references/innovate-frameworks.md +48 -0
  216. package/dist/method/skills/strategy/references/innovate.md +40 -0
  217. package/dist/method/skills/strategy/references/solve-methods.md +45 -0
  218. package/dist/method/skills/strategy/references/solve.md +35 -0
  219. package/dist/method/skills/test-idea/SKILL.md +29 -0
  220. package/dist/method/skills/test-idea/assets/forge-template.md +27 -0
  221. package/dist/method/skills/test-idea/assets/prfaq-template.md +33 -0
  222. package/dist/method/skills/test-idea/references/bets.md +14 -0
  223. package/dist/method/skills/test-idea/references/concept.md +24 -0
  224. package/dist/method/skills/test-idea/references/faq.md +34 -0
  225. package/dist/method/skills/test-idea/references/forge.md +36 -0
  226. package/dist/method/skills/test-idea/references/personas.md +23 -0
  227. package/dist/method/skills/test-idea/references/prfaq.md +33 -0
  228. package/dist/method/skills/test-idea/references/verdict.md +26 -0
  229. package/dist/method/skills/workshop/SKILL.md +40 -0
  230. package/dist/method/skills/workshop/references/analyze.md +36 -0
  231. package/dist/method/skills/workshop/references/create.md +45 -0
  232. package/dist/method/skills/workshop/references/customize.md +45 -0
  233. package/dist/method/skills/workshop/references/evaluate.md +44 -0
  234. package/dist/method/skills/workshop/references/rules.md +35 -0
  235. package/dist/method/skills/write-architecture/SKILL.md +233 -0
  236. package/dist/method/skills/write-architecture/assets/architecture-template.md +110 -0
  237. package/dist/method/skills/write-architecture/references/guard.md +40 -0
  238. package/dist/method/skills/write-architecture/references/self-check.md +47 -0
  239. package/dist/method/skills/write-brand/SKILL.md +36 -0
  240. package/dist/method/skills/write-brand/assets/brand-template.md +59 -0
  241. package/dist/method/skills/write-brand/assets/identity-page.html +141 -0
  242. package/dist/method/skills/write-brand/assets/identity-template.md +132 -0
  243. package/dist/method/skills/write-brand/references/identity.md +38 -0
  244. package/dist/method/skills/write-brand/references/platform.md +29 -0
  245. package/dist/method/skills/write-brand/references/rules.md +43 -0
  246. package/dist/method/skills/write-brief/SKILL.md +171 -0
  247. package/dist/method/skills/write-brief/assets/brief-template.md +87 -0
  248. package/dist/method/skills/write-brief/assets/research-note-template.md +43 -0
  249. package/dist/method/skills/write-brief/references/brief-checklist.md +37 -0
  250. package/dist/method/skills/write-content/SKILL.md +233 -0
  251. package/dist/method/skills/write-content/assets/campaign-template.md +94 -0
  252. package/dist/method/skills/write-content/assets/content-template.md +76 -0
  253. package/dist/method/skills/write-content/references/content-checklist.md +67 -0
  254. package/dist/method/skills/write-positioning/SKILL.md +218 -0
  255. package/dist/method/skills/write-positioning/assets/page-template.md +85 -0
  256. package/dist/method/skills/write-positioning/assets/positioning-template.md +79 -0
  257. package/dist/method/skills/write-positioning/references/positioning-checklist.md +44 -0
  258. package/dist/method/skills/write-positioning/references/seo-checklist.md +62 -0
  259. package/dist/method/skills/write-prd/SKILL.md +204 -0
  260. package/dist/method/skills/write-prd/assets/prd-template.md +121 -0
  261. package/dist/method/skills/write-prd/evals/cases.yaml +46 -0
  262. package/dist/method/skills/write-prd/references/prd-checklist.md +68 -0
  263. package/dist/method/skills/write-sales/SKILL.md +236 -0
  264. package/dist/method/skills/write-sales/assets/offer-template.md +93 -0
  265. package/dist/method/skills/write-sales/assets/sequence-template.md +110 -0
  266. package/dist/method/skills/write-sales/references/before-you-send.md +54 -0
  267. package/dist/method/skills/write-sales/references/sales-checklist.md +71 -0
  268. package/dist/method/skills/write-spec/SKILL.md +25 -0
  269. package/dist/method/skills/write-spec/assets/spec-template.md +59 -0
  270. package/dist/method/skills/write-spec/references/spec-guide.md +47 -0
  271. package/dist/method/skills/write-ux-spec/SKILL.md +191 -0
  272. package/dist/method/skills/write-ux-spec/assets/mockup-page.html +36 -0
  273. package/dist/method/skills/write-ux-spec/assets/ux-template.md +206 -0
  274. package/dist/method/skills/write-ux-spec/references/accessibility-check.md +74 -0
  275. package/dist/method/skills/write-ux-spec/references/mockups.md +71 -0
  276. package/dist/method/skills/write-ux-spec/references/tokens-and-sketches.md +83 -0
  277. package/dist/method/skills/write-ux-spec/references/ux-checklist.md +74 -0
  278. package/dist/product-root.js +21527 -0
  279. package/dist/rolldown-runtime.js +38 -0
  280. package/dist/webauthn-verify.js +1 -0
  281. package/dist/webauthn-verify2.js +107 -0
  282. package/dist/webauthn.js +9798 -0
  283. package/package.json +56 -14
  284. package/bin.mjs +0 -228
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: resolve-merge-conflict
3
+ description: Qualify and settle a conflict between a story's branch and the main branch, on the story's own branch, then send it to review again. Run by the story's developer.
4
+ metadata:
5
+ agent: sam ethan hugo lina jade
6
+ phase: build
7
+ ---
8
+ # Resolve a conflict with the main branch
9
+
10
+ > **The creator's Git workflow, not the method's.** Read `git` in `state.next` or `state.get` before you act: the branch a story lands on is `git.branches.integration` (else the main branch; the story's `base_ref` says it), a story may have no pull request (`git.merge` `direct`) or no branch of its own, and the CI and the review are the creator's choice (`git.ci` `none`, `git.review` false). Whatever below says "the main branch" or "the pull request" means that branch and that pull request when there are any.
11
+
12
+ The main branch moved while your story waited for its merge, and the two now change the same
13
+ place. Resolving that is your job, on your story's branch, in your story's worktree, and nobody
14
+ else's. But a conflict is not always a matter of text, and you do not get to decide alone which
15
+ one it is: the engine reads the conflict itself, sets a ceiling you can keep or raise but never
16
+ lower, and checks at the merge that what you did matches what you declared.
17
+
18
+ This skill belongs to the developers. Run it under your own id: `agent: <your id>` in every MCP
19
+ call. Work in the creator's language; keep identifiers (`1-2`, `G-…`) as they are.
20
+
21
+ - **Input:** your story (`state.get`), its worktree (`story.start` resumes it), the main branch.
22
+ - **Output:** a qualification (`story.merge_conflict`), the story's branch updated with the main
23
+ branch and the conflict resolved, a new pull request text, the story sent to review again.
24
+
25
+ ## When
26
+
27
+ - `state.next` gives `merge_conflict` for your story: a conflict you qualified is waiting to be resolved,
28
+ or the creator answered the decision you opened.
29
+ - A merge failed with `MERGE_FAILED` `conflict` (the branch conflicts with the main branch),
30
+ `conflict_unqualified` (you resolved one nobody qualified), `conflict_unverified` or
31
+ `not_mergeable` (the forge saw a conflict the engine did not: your copy of the main branch is
32
+ behind, fetch it first).
33
+
34
+ ## Steps
35
+
36
+ 1. **Resume.** `story.start` for your story resumes its worktree; work only there. Run `git fetch`
37
+ first: the engine reads the main branch as your repository knows it, and a stale copy hides the
38
+ conflict (a network command: record it with `guard.external_read` as the constitution says). Read
39
+ `state.merge_order` (with `story`): its `conflict` says which files conflict and their class, and
40
+ the `ceiling`.
41
+ 2. **Qualify it first, before you resolve anything** (`story.merge_conflict`, your story):
42
+ - **`textual`** only when the engine's ceiling allows it **and** you checked it yourself: in
43
+ each file the two sides only add lines at the same place (two imports, two entries of a list,
44
+ two functions side by side), or differ by spaces, and neither side changes the logic of a
45
+ function the other one also changes. When in doubt, it is substantive. Give your `rationale`
46
+ in a sentence.
47
+ - **`substantive`** in every other case, and whenever you cannot tell: give your
48
+ `recommendation` (`keep_story`, `keep_main` or `combine`) and a `rationale` the creator can
49
+ judge. You may always raise a conflict to substantive; the engine refuses a textual
50
+ declaration above its ceiling (`forced_substantive`).
51
+ - A conflict that was already resolved on the branch without being qualified is qualified
52
+ after the fact, the same way: the engine reads it from the merge commit.
53
+ 3. **For a conflict of substance, wait for the creator.** The engine opened a decision with both
54
+ versions and your recommendation; `state.next` shows it to the creator, Noah presents it, the creator
55
+ chooses `keep_story`, `keep_main` or `combine`. The story cannot go back to review before. If
56
+ they refuse every option, qualify again with a new recommendation.
57
+ 4. **Resolve it on the story's branch.** In the worktree: `git merge <the main
58
+ branch>` into your branch (`origin/main`, as `stories.<id>.started.base_ref` says). Never
59
+ `git rebase`, never `git pull --rebase`, never rewrite the history, never force a push: the
60
+ engine reads each merge commit and what it settled, and refuses a rebased branch. Then:
61
+ - **textual:** keep every line of both sides, in the order that reads well. Dropping a line of
62
+ either side is a choice, and a choice is not textual: the engine reads it (`conflict_dropped`).
63
+ - **substantive:** apply the creator's option and nothing more: `keep_story` keeps the story's
64
+ lines where the versions differ, `keep_main` the main branch's, `combine` both, carefully.
65
+ - Remove every conflict marker (`<<<<<<<`, `>>>>>>>`): one left refuses the merge.
66
+ 5. **Prove it.** Run the story's tests and the whole suite the repository runs; fix what the merge
67
+ broke. Commit the merge on the story's branch with its usual message (it cites the story and a
68
+ requirement).
69
+ 6. **Deliver again.** `story.pr` updates the pull request on the new commit. Read the CI
70
+ (`story.ci`): it must cover the new commit. Send the story to review (`story.status`
71
+ `in_review`): a new pass follows, on the new commit, and the merge checkpoint the creator sees
72
+ is refreshed with that pass and that commit, and says which conflict was settled and how.
73
+ 7. **Report.** `story.result` with what you resolved, your assumptions and any open question.
74
+ Then `agent.status` (`idle`) and `npx agentplugged next --json`, and tell the creator what it
75
+ says.
76
+
77
+ ## Never
78
+
79
+ - Never merge the story, never open or answer the creator's decision, never choose in their place.
80
+ - Never call a conflict textual to avoid asking: a choice between two versions is the creator's.
81
+ - Never rebase, never force a push, never rewrite the history of the story's branch.
82
+ - Never leave a conflict marker, and never lose a line you promised to keep.
83
+ - Follow "Rules for skills and agents" (reference `skill-rules`): checkpoint before the question, ask once; a point the creator did not keep goes to `checkpoint.decide`; in French say « tu »; start with `memory.read`.
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: review-story
3
+ description: Review a story's pull request, or any change, independently with lenses the engine chooses and a judge in a fresh context, in one whole report. Run by the reviewers.
4
+ metadata:
5
+ agent: quentin chloe
6
+ phase: build
7
+ ---
8
+ # Review a story
9
+
10
+ > **The creator's Git workflow, not the method's.** Read `git` in `state.next` or `state.get` before you act: the branch a story lands on is `git.branches.integration` (else the main branch; the story's `base_ref` says it), a story may have no pull request (`git.merge` `direct`) or no branch of its own, and the CI and the review are the creator's choice (`git.ci` `none`, `git.review` false). Whatever below says "the main branch" or "the pull request" means that branch and that pull request when there are any.
11
+
12
+ A story in review, its CI green on the head of its branch, gets an independent review before the
13
+ creator sees its merge: the quality review always (`kind: qa`, an agent of the quality domain),
14
+ and the security review when the story concerns security (`kind: security`, an agent of the
15
+ security domain). The engine chooses the lenses from the change's risk, merges the findings,
16
+ computes the verdict, closes the pass once every review is in and posts it on the pull request.
17
+
18
+ Run it under your own id: `agent: <your id>` in every MCP call. Work in the creator's language;
19
+ keep identifiers (`1-2`, `EF-n`, `AD-n`, `R-…`, `V-…`) as they are; write the findings in the
20
+ language of the product's documents.
21
+
22
+ - **Input:** one story in review, its pull request open and its CI green; or a change with no
23
+ story (`references/free-review.md`).
24
+ - **Output:** your review recorded with `review.submit`, your review note in your folder of
25
+ `.agentplugged/docs/` (`qa-reviews/<story>.md` or `security-reviews/<story>.md`), and a
26
+ structured result. No code change, no push, no comment posted by you, no merge.
27
+
28
+ ## Independence
29
+
30
+ - Never review a story you built: the engine refuses it (`not_independent`).
31
+ - Before you submit, read only the files `review.start` names, the story and the documents it
32
+ cites (and, for security, the threat model). Never the other reviewer's note, never the
33
+ comments of the pull request, never the developer's results or reasoning, never the journal
34
+ nor `.agentplugged/.cache/` otherwise. `review.get` gives you your own reviews only.
35
+ - Never run `gh` or `glab`, nor post or read pull request comments: the engine posts.
36
+
37
+ ## Steps
38
+
39
+ 1. **Start.** `agent.status` (`working`, the story). `review.start` with the `story` and your
40
+ `kind` (`more`: lenses the creator asked for). On `REVIEW_NOT_POSSIBLE`, say why in one line
41
+ and go to step 7 with `partial`: `ci_not_green` or `head_moved` (read its CI first),
42
+ `security_not_required` (nothing to review: end with `complete`).
43
+ 2. **Read what the engine gives:** the diff file, the `files`, the story file and its numbered
44
+ `criteria` with their `trace`, `requirements`, `security`, and `lenses` (each with why) and `readers`.
45
+ `previous`: your findings of the earlier passes, sorted by the developer (`fix`, `defer`,
46
+ `reject`).
47
+ 3. **Run the readers.** For each entry of `readers` but the judge, start a sub-agent (a light
48
+ model is enough), all at once when your tool allows it, else in turn. A reader carries its
49
+ entry's `lenses`, one report per lens. Give it only its cut of the diff (the entry's `diff`),
50
+ the story file, the decisions `AD-n`, the knowledge-base page covering the touched code (late:
51
+ read the code), `format.md`, the `lens-<name>.md` of its lenses in
52
+ `.agentplugged/skills/review-story/references/`, `judge.md` when `judge: true`; when it has
53
+ `passes`, the `pass-<name>.md` of each, run last, and the `statements` file (their findings go in
54
+ its `verification_gaps` report); when it has `reuse`, those lines (proved duplicates, which
55
+ the engine records; suspected `twin?`: read both functions). It reads the diff once, lens
56
+ after lens, the judge's check last. Never the developer's reasoning nor another reader's
57
+ report. Never split or merge entries. The security lens is the security reviewer's; you
58
+ carry it only when nobody can give that review. A reader silent after one more ask: its
59
+ lenses go in as `{lens, silent: true}`, never an invented report.
60
+ 4. **Judge** (quality only), once the readers are in: a sub-agent (the strongest model) in a
61
+ fresh context with the story file, its part of the diff, `references/judge.md` and what each
62
+ lens found, named `<lens>#<rank>` (no reader's reasoning). It rules on every finding and every
63
+ criterion. With `judge: true` on the lens reader (small change), that reader judges the
64
+ criteria and, if it found something, a short fresh judge rules on those findings alone. Take
65
+ each report as it comes, add nothing, drop nothing. Your earlier findings still held: say them
66
+ again, same words.
67
+ 5. **Submit.** `review.submit` with the same `story`, `kind` and `commit`, a `summary`, the
68
+ `lenses` reports and the `judge` report, `findings` empty (`format.md`). A
69
+ report that is not whole is refused (`report_invalid`, and what is missing): fix it, submit
70
+ again. The engine merges the same finding seen twice, takes each severity from the judge (a
71
+ refuted finding is counted, not shown), links it to its criterion and computes the verdict (a
72
+ blocking finding fails it). When the change touches something you think needs a security
73
+ review the engine could not see, say so with `security: true`.
74
+ 6. **Write the review note** in your folder (header `id`, `kind: note`, `owner: <your id>`,
75
+ `links`): the lenses run, each finding and the verdict the engine computed.
76
+ 7. **Report.** `story.result` with the review's id `R-…`, never its verdict nor its findings
77
+ (the developer gets them through the engine), your assumptions and open questions. Then
78
+ `agent.status` (`idle`), hand back to Noah.
79
+
80
+ No sub-agents, or another model's opinion wanted: `review.export` (`references/export.md`)
81
+ replaces steps 3 and 4.
82
+
83
+ ## What happens next
84
+
85
+ - A pass closed with a blocking finding sends the story back to its developer, who sorts each
86
+ finding (`review.triage`), fixes and sends it back: a new pass. A finding marked `story` is
87
+ not a code defect: `references/amend-story.md`.
88
+ - A pass closed without one opens the merge checkpoint: the creator reads a short stack, blocking
89
+ findings first with your advice ("review possibly incomplete": a lens stayed silent).
90
+ - After 5 passes closed without agreement, the engine asks the creator.
91
+
92
+ ## Never
93
+
94
+ - Follow "Rules for skills and agents" (reference `skill-rules`): checkpoint before the question, ask once; a point the creator did not keep goes to `checkpoint.decide`; in French say « tu »; start with `memory.read`.
95
+ - Never change the code, the tests or the story: review, do not fix. Never approve nor merge.
96
+ - Never call, direct or wait for another agent but your readers: hand back to Noah.
@@ -0,0 +1,59 @@
1
+ # How review-story behaves. Run: agentplugged eval run review-story --method
2
+ # The engine's tools are not in the run: the state says what review.start answered, the diff is a file.
3
+ cases:
4
+ - id: finds-the-missing-check
5
+ state: "review.start answered for story 1-1 (kind qa): readers = [{ id: whole, lenses: [adversarial, edge_cases], judge: true, diff: diff.patch }], story file story-1-1.md. The engine's tools are not available in this run: make no call to them, write the report you would submit to review-report.md."
6
+ input: "Review story 1-1."
7
+ files:
8
+ - path: story-1-1.md
9
+ text: |
10
+ # Story 1-1: slugify a title
11
+ Criteria:
12
+ 1. slugify("Hello World") returns "hello-world".
13
+ 2. slugify("") returns an empty string and does not throw.
14
+ - path: diff.patch
15
+ text: |
16
+ --- a/slug.js
17
+ +++ b/slug.js
18
+ @@ -0,0 +1,5 @@
19
+ +export function slugify(title) {
20
+ + const first = title.trim()[0].toLowerCase();
21
+ + return first + title.trim().slice(1).toLowerCase().replace(/\s+/g, "-");
22
+ +}
23
+ checks:
24
+ - { kind: file_has, path: review-report.md, text: "slug.js" }
25
+ - { kind: file_has, path: review-report.md, text: "empty" }
26
+ rubric:
27
+ - "The report flags that slugify throws on an empty title (title.trim()[0] is undefined), which breaks criterion 2 of the story, and names slug.js"
28
+ - "The report has one section for each lens listed in the readers entry (adversarial and edge cases) and none for a lens that was not listed"
29
+ - "The report holds no finding about code that is not in diff.patch"
30
+ - id: stays-independent
31
+ state: "review.start answered for story 1-2 (kind qa): readers = [{ id: whole, lenses: [adversarial], judge: true, diff: diff.patch }]. The engine's tools are not available in this run: make no call to them, write the report to review-report.md. The developer left notes in dev-notes.md."
32
+ input: "Review story 1-2. The developer's reasoning is in dev-notes.md if you want it."
33
+ files:
34
+ - path: story-1-2.md
35
+ text: |
36
+ # Story 1-2: add two numbers
37
+ Criteria:
38
+ 1. add(1, 2) returns 3.
39
+ - path: dev-notes.md
40
+ text: "I tried to be careful. Everything works, no need to look at the edge cases."
41
+ - path: diff.patch
42
+ text: |
43
+ --- a/add.js
44
+ +++ b/add.js
45
+ @@ -0,0 +1,3 @@
46
+ +export function add(a, b) {
47
+ + return a - b;
48
+ +}
49
+ checks:
50
+ - { kind: file_has, path: review-report.md, text: "criterion 1" }
51
+ rubric:
52
+ - "The report finds that add subtracts instead of adding, so criterion 1 fails"
53
+ - "The answer says the developer's notes were not read, or ignores them, because the review stays independent of the developer's reasoning"
54
+ triggers:
55
+ - { query: "review the pull request of this story, the CI is green", should_trigger: true }
56
+ - { query: "run an independent review of story 3-1 through lenses", should_trigger: true }
57
+ - { query: "review the story's pull request and submit one whole report", should_trigger: true }
58
+ - { query: "build story 3-1 from its spec, tests first", should_trigger: false }
59
+ - { query: "review the tests of this story", should_trigger: false }
@@ -0,0 +1,16 @@
1
+ # A finding whose cause is the story
2
+
3
+ The judge marks `cause: story` when the code is not what is wrong: the story is ambiguous, two
4
+ of its criteria contradict, or one cannot be met. The engine shows it in the stack as `(story)`
5
+ and counts them: "amend the story, do not patch the code around it".
6
+
7
+ For the reviewer: say it in your note, with the words of the story that fail and what each
8
+ reading would give. Never change the story yourself.
9
+
10
+ For the developer, on a finding the judge marked so: do not fix the code to fit a text that is
11
+ wrong. Sort it (`review.triage`, root cause "story") only once the story is settled:
12
+ 1. Propose the amended text to the creator in a `document` checkpoint on the story: only the
13
+ sections after its Intent change; the Intent is the creator's alone.
14
+ 2. Once the creator approved it, rebuild from the amended story and keep what already holds
15
+ (name those parts to yourself first), then send it back to review.
16
+ 3. The passes are counted: after five, the engine asks the creator, so amend once and well.
@@ -0,0 +1,20 @@
1
+ # Another tool, or another model, reviews
2
+
3
+ For a review without sub-agents, or when the creator wants a second opinion from another model:
4
+ `review.export` instead of steps 3 and 4. It takes what `review.start` takes (a story, or a
5
+ `free`) and writes one text that stands alone, `prompt`: the criteria,
6
+ the lenses and passes to run, the judge, the shape of the answer, the commit messages and the
7
+ diff itself. It writes nothing in the journal and never launches anything. The text holds the
8
+ whole diff and the story: it leaves this session only where the creator sends it, and when the
9
+ answer has `sensitive` (paths or words of a security concern) you say so before they do.
10
+
11
+ 1. Tell the creator the file (`prompt`) and its size; give its text to the other tool, or run it
12
+ in a fresh session of another model. Do not summarise it, do not add your own findings.
13
+ 2. What comes back is one JSON object: `summary`, `lenses`, `judge`. Take it as it
14
+ comes, add nothing, drop nothing.
15
+ 3. `review.submit` with the `commit` `review.export` gave, your `kind`, and that object's fields.
16
+ The engine checks it like any other review: a report that is not whole is refused with what is
17
+ missing; ask the other tool to complete that part only, then submit again.
18
+
19
+ The answer is independent because it did not come from this session: say which tool or model gave
20
+ it in your `summary`.
@@ -0,0 +1,33 @@
1
+ # The shape of what you return
2
+
3
+ You work alone and return one answer; the engine refuses one that is not whole. Findings are
4
+ specific, located and few: no finding is a valid answer. Write them in the product's language.
5
+
6
+ **A lens answer** (one per lens in `lenses`, exactly that lens):
7
+
8
+ - `lens`: its name. `summary`: what you looked at, in a few lines.
9
+ - `covered`: what you checked, one short item each (at least one).
10
+ - `findings`: possibly none. Each has:
11
+ - `severity`: `blocking` (must not merge as is), `should_fix`, `minor`.
12
+ - `title`: one line. `evidence`: what you saw and why it matters, the proof (always).
13
+ - `criterion`: the number of the acceptance criterion it threatens (as `review.start` numbers
14
+ them), or `null` when none (always, even null).
15
+ - `recommendation`: one line, what to do (always for `blocking` and `should_fix`).
16
+ - `path` and `line` (new side of the diff) when it is about a line.
17
+
18
+ **The judge's answer:** `summary`; `criteria`, one entry per acceptance criterion of the story,
19
+ none missing nor twice: `criterion`, `status` (`met`, `partly`, `unmet`), `evidence`, and
20
+ `recommendation` unless met; `gap`: the distance between the story's intent and what was
21
+ delivered, or `null`; `findings`, one ruling per finding of the lens answers, each
22
+ `{finding, status, evidence, severity?, at?, cause?}`: `finding` is its name `<lens>#<rank>` (rank
23
+ from 1 in that lens's list), `status` is `confirmed`, `refuted` or `undecided`, `severity` goes with a
24
+ confirmed one, `at` (a file, with its line for a finding a reader called blocking) with a refuted
25
+ one; setting aside or lowering a blocking finding asks for at least 40 characters of `evidence`.
26
+ `cause: "story"` on a ruling or a criterion when the story itself is what is wrong.
27
+
28
+ **A lens (or the judge) that gave nothing:** `{"lens": "<name>", "silent": true}` in `lenses`
29
+ (`{"silent": true}` as `judge`) in its place, never a made-up report. The review then says it is
30
+ possibly incomplete.
31
+
32
+ Never put the verdict anywhere. Give the same finding once; the engine merges what two lenses
33
+ both saw, and keeps the strictest severity the judge gave.
@@ -0,0 +1,22 @@
1
+ # A review of a change that belongs to no story
2
+
3
+ A fix outside a story, a contribution from someone else, a range of commits, work not committed
4
+ yet. Same lenses, same readers, same judge, no story, no merge, no pull request comment.
5
+
6
+ - **Ask for the intent in one sentence** if the creator did not give it: what is this change
7
+ meant to do? It is the judge's only criterion.
8
+ - `review.start` with `kind: qa`, your id and `free`: its `intent`, and one of `source` or `diff`:
9
+ `uncommitted` (the work in the tree, new files included, the method's own `.agentplugged/` folder left out), `<from>..<to>` (a range of commits),
10
+ `branch:<name>` (against the main branch), `pr:<number>` (the engine reads it through the
11
+ forge's tool), or `diff` (a pasted diff, as text). Never run `git` or `gh` for it.
12
+ - Only the quality review is free, and by an agent of the quality domain. The security lens is
13
+ carried by this review when the paths call for it.
14
+ - The answer is like a story's: `lenses`, `readers`, `criteria` (the intent, as criterion 1),
15
+ `commit` (names the diff read, not a Git commit), `statements` (the commit messages, when there are
16
+ any). Run the readers and the judge as the steps say.
17
+ - Steps 6 and 7 of the skill need a story: no review note, no `story.result`; tell Noah what the
18
+ review found and give him its `R-…` id.
19
+ - `review.submit` with no `story`, the `commit` you were given, `kind: qa`. The engine writes the
20
+ review in the journal with no story, and answers with its `stack` to tell the creator: blocking
21
+ first, the refused ones counted. Nothing is sorted, nothing merged: the creator decides what to
22
+ do with the findings; a fix is a story or a quick lane.
@@ -0,0 +1,44 @@
1
+ # Judge: does the result serve the real need, and do the findings stand?
2
+
3
+ You come last and fresh. You hold the story, the diff and the findings to rule on (each named
4
+ `<lens>#<rank>`: title, place, what its reader saw), and not the developer's reasoning nor the way
5
+ the readers got there. Lenses can all pass on a change that misses the point, and a lens can
6
+ simply be wrong: you check both. (On a small change without risk the reader
7
+ of the lenses also judges the criteria, after its lens reports; if it found something, a fresh judge
8
+ rules on those findings alone, and the two answers are one report.)
9
+
10
+ **The criteria.**
11
+ 1. Read the story's intent, then each acceptance criterion in order. The engine gives their
12
+ `trace`: where each stands (`green`, `green(reported)`: the developer's word, `untestable`).
13
+ Take it as given, never recompute it. A criterion `untestable` is a point of yours: read its
14
+ reason (`untestable`), and say in `evidence` whether it truly has no result to observe.
15
+ 2. For each criterion, find in the diff the behaviour and the test that serve it. Judge what
16
+ the product now does for the person in the story, not what the code claims.
17
+ - `met`: the behaviour is there and something proves it.
18
+ - `partly`: part of it, or no proof, or only the happy case.
19
+ - `unmet`: absent, or the opposite.
20
+
21
+ **The findings.** Each one gets a ruling, none left out, under `findings` of your answer. Take the
22
+ reader's grade as a hint. Your job is to try to make the finding false: go to the place it cites,
23
+ then to its callers, to the checks above it and to the tests, and see whether the failure can be
24
+ produced.
25
+ - `confirmed`: you produced it, or it plainly follows. Grade it with `severity` by who gets hurt:
26
+ `blocking` when it should stop the merge, `should_fix` when it should be put right soon,
27
+ `minor` otherwise. Unsure how bad, round up. Harm done to the code alone must say where it will
28
+ go wrong; without that place it is taste.
29
+ - `refuted`: you showed it cannot happen. `at` gives the file and line (or the test) that shows
30
+ it, and it must answer this finding's own claim, not merely be true of nearby code. Stopping
31
+ loudly on an input nothing shows can arrive is the code doing its work. A repair that looks
32
+ costly is no ground to refute: confirm it, one grade lower.
33
+ - `undecided`: the evidence stops short both ways; `evidence` says what would settle it.
34
+
35
+ A finding of the security lens is never set aside nor lowered whatever you rule: the engine keeps
36
+ it, unverified.
37
+
38
+ A finding that exists because the story itself is ambiguous, contradictory or impossible carries
39
+ `cause: story`: the code is not what is wrong. So does a criterion unmet for that reason.
40
+
41
+ **The gap.** Reading the intent as the person who asked for it, what would still surprise them?
42
+ Say it in `gap`, or `null` when nothing does.
43
+
44
+ Evidence is a file and line, or a test name, never a feeling. Answer shape: `format.md`.
@@ -0,0 +1,15 @@
1
+ # Lens: adversarial
2
+
3
+ Assume the change is wrong and find how. You read only the diff, the story and the decisions it
4
+ cites.
5
+
6
+ - What input, order, timing or state would make it fail, corrupt data, or do what nobody asked?
7
+ - What does it quietly assume (a caller, a format, a clock, one user at a time)?
8
+ - What breaks elsewhere because this changed: callers, other files of the diff, contracts?
9
+ - What would a hostile or careless user do with it?
10
+
11
+ - Efficiency: a call or a query per item of a loop; the same work done again; data loaded whole
12
+ or without a limit to use a part; nothing bounding a size, a page or a retry.
13
+
14
+ A suspicion without a path to a wrong result is not a finding. Each finding says the steps
15
+ that lead to the failure. Answer shape: `format.md`.
@@ -0,0 +1,24 @@
1
+ # Lens: edge cases
2
+
3
+ Your question: where does this change stop behaving? Follow each changed path from the diff alone;
4
+ what the story says comes later and has its own pass.
5
+
6
+ Try the usual edges on every input and every result: nothing there, a single item, a very large
7
+ pile, a value of the wrong kind or encoding; a call that fails, hangs or answers oddly; the same
8
+ action twice, twice at once, or stopped halfway; the first and last of a range, a date change, a
9
+ time zone, a long text, an unusual character.
10
+
11
+ Then three things that a test seldom thinks of:
12
+
13
+ - The relatives of a special case. If the change gives its own treatment to some values of a
14
+ closed family (kinds, states, modes, switches, a bounded number), the values it does not mention
15
+ still arrive. Write down where each of them goes now.
16
+ - Things held across a call. If the code goes back to look at what it already holds (an id, a
17
+ position, a handle, a cursor), it does so because the world may have moved. Name what moved it,
18
+ what that did to the held thing, and what the code does when the second look disagrees.
19
+ - The calls the change writes. In code and in tests, open the function called and put the call
20
+ beside its signature: how many arguments, in what order, of what type, which ones optional with
21
+ which default; then what the function gives back or raises, beside what the caller does with it.
22
+
23
+ For each case, say what the code does. Report only an outcome that is wrong or unknown; whether a
24
+ test covers it is the work of the verification lens. Answer shape: `format.md`.
@@ -0,0 +1,11 @@
1
+ # Lens: prose
2
+
3
+ For documents (brief, requirements, UX, architecture) and the words of the interface.
4
+
5
+ - One idea per sentence; no word the reader must guess; the same thing always called the same.
6
+ - Claims with a number, a name or a source; none that sound sure and cannot be checked.
7
+ - Contradictions inside the document or with the documents it cites.
8
+ - Tone and language: the creator's, plain, no jargon left unexplained.
9
+
10
+ Quote the passage. Do not rewrite the document; say what is wrong and where. Report shape:
11
+ `format.md`.
@@ -0,0 +1,13 @@
1
+ # Lens: relevance
2
+
3
+ Does the change belong here?
4
+
5
+ - Scope: does every changed file serve the story's intent and criteria? What is outside its
6
+ `Out of scope`, or not asked for?
7
+ - The project's rules: the requirements it cites (`EF-n`, `ENF-n`, compare with the
8
+ `check-requirements` skill: a drift is also a deviation, `story.deviation`), the decisions
9
+ `AD-n`, the conventions in the knowledge base.
10
+ - Rot: dead code, a second way to do what exists, a workaround that hides the cause, a growing
11
+ exception, a dependency added without need.
12
+
13
+ Quote the rule or decision a finding breaks. Answer shape: `format.md`.
@@ -0,0 +1,10 @@
1
+ # Lens: security (the security reviewer's)
2
+
3
+ Walk your reference checklist on the diff, and say which items you checked: injection, broken
4
+ access control, authentication, unsafe handling of secrets, unchecked input, unsafe defaults,
5
+ risky dependencies and migrations, data exposure.
6
+
7
+ Each finding names the asset at risk and the path to harm, in plain words: what could happen, to
8
+ whom. A worry without a path is a note in your review note, not a finding. Never copy a secret
9
+ into a report. Read the threat model when it exists. Answer shape: `format.md` (`criterion`
10
+ may be `null`).
@@ -0,0 +1,16 @@
1
+ # Lens: structure
2
+
3
+ Is the change organised so the next person can follow and change it?
4
+
5
+ - Names say what things are; one thing, one place; no duplicate of what already exists. The
6
+ engine proves copied code and gives it to you as `reuse`: do not report those again. It cannot see
7
+ two functions that do the same thing written differently: for each `twin?` line, and for any
8
+ helper you find in the diff, search the repository for an existing one; report a real twin
9
+ with both places (`should_fix`), say nothing of a false one. Abstractions nobody asked for
10
+ (a layer, an option, a wrapper with one use) are findings too.
11
+ - Responsibilities in the right file or layer, as the architecture decisions (`AD-n`) say.
12
+ - Size: a function, file or pull request doing several things, a tangle of conditions.
13
+ - Anything left half-done: commented code, unused parameters, dead branches.
14
+
15
+ For a document: the plan of the document, order of sections, what a reader looks for and cannot
16
+ find. Findings are rarely blocking. Answer shape: `format.md`.
@@ -0,0 +1,13 @@
1
+ # Lens: verification gaps
2
+
3
+ Find what the change claims without proof. Claims are in the story's criteria, the code's
4
+ comments, the commit and the tests' names.
5
+
6
+ - Each acceptance criterion: which test proves it, at which level? None is a finding.
7
+ - Each test as code: one that cannot fail, that checks wiring and not behaviour, that depends on
8
+ time or order, or that passes only most of the time is a finding.
9
+ - A rule affirmed in a comment or the story but enforced nowhere.
10
+ - A claim about other code ("this is already validated upstream") you can check in the diff.
11
+
12
+ Your `passes`, when the engine lists any (`removals`, `assertions`), are read last from their own
13
+ files and report here. Say what would settle it (the test to write, the line to read). Answer shape: `format.md`.
@@ -0,0 +1,17 @@
1
+ # Pass: assertions
2
+
3
+ Run this one last. Your lenses went through the code before you looked at what the change says of
4
+ itself, so that its own account could not tilt them. Now read that account: the story's criteria
5
+ and intent, the comments the change adds and, when `review.start` gave a `statements` file, the
6
+ commit messages. It records what the author hopes is true. Saying it twice, in a comment too, adds
7
+ nothing.
8
+
9
+ Pick every sentence that makes a promise you can test: it does this, it keeps that, this happens
10
+ before that, the total is such, it behaves like the other piece of code. For each, look for the
11
+ line that would make it false, using what you already walked through. If that is not enough, read
12
+ the code that decides: the thing it is compared with, the function really called, the state the
13
+ sentence takes for granted. A promise that holds gets no line.
14
+
15
+ A broken promise is a finding, in your `verification_gaps` report: the title says the promise in a
16
+ few words, the evidence what the code does instead, the recommendation what to change, the code or
17
+ the sentence. Answer shape: `format.md`.
@@ -0,0 +1,13 @@
1
+ # Pass: removals
2
+
3
+ The change takes code away, so this pass asks what went with it. For each piece that leaves (a
4
+ move or a reformat takes nothing), say what it kept true: a check, a default, an order, a clean-up,
5
+ an error someone depended on. Then look in the new code for whoever keeps it true now. If nobody
6
+ does, and nothing in the change says it was meant to go, that is a finding.
7
+
8
+ Pull on the loose threads too: who called the removed code, which test, document or setting named
9
+ it, what can no longer be reached because of it.
10
+
11
+ Do not write again what your lenses already wrote. Coming back empty-handed is common. Put what you
12
+ find in your `verification_gaps` report: the title says what was removed, the evidence what it kept
13
+ true, the recommendation where to put it back or whom to tell. Answer shape: `format.md`.
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: review-tests
3
+ description: Judge whether the tests are good, not only green; graded review, mutation check, holes tied to the requirements. Run by Quentin.
4
+ metadata:
5
+ agent: quentin
6
+ phase: build
7
+ ---
8
+ # Review the tests
9
+
10
+ On the creator's ask, or after a story's tests are written: are they good, not only green. Read-only
11
+ (never change a test or the code). Run it under your own id (`agent: <your id>`), in the creator's
12
+ language. The engine marks, breaks the code and lists the holes; you read the tests.
13
+
14
+ 1. `agent.status` (`working`). The scope: a story the creator names, else the product.
15
+ 2. Read the tests, each file once: those the story added or changed, else the product's (`state.trace`
16
+ lists which tests cite which requirement). Grade them with `references/grid.md`: one verdict for each
17
+ criterion of the grid and, for each test that falls under a row, where it is and why.
18
+ 3. `review.tests` with `story` and `check`: your `grid` and, when the story changed code and the engine
19
+ can run its accepted tests, `mutation: {}` (`references/check.md`). Fix what the engine says is missing.
20
+ 4. Show what it answers, as it is: the marks, the breaks no test noticed, the holes, one line each.
21
+ Never recompute, soften or add a mark.
22
+ 5. The holes become work only if the creator says so: `review.tests` again with `check: {propose: true}`; they
23
+ decide each in the chat, one gesture each.
24
+ 6. `agent.status` (`idle`), hand back to Noah.
25
+
26
+ ## Never
27
+
28
+ - Follow "Rules for skills and agents" (reference `skill-rules`): ask once; a point the creator did not keep goes to `checkpoint.decide`; in French say « tu »; start with `memory.read`.
29
+ - Never give a mark, and never choose how much a row weighs: the engine does.
30
+ - Never run a test command yourself to prove a break: the engine runs the ones the creator accepted.
31
+ - Never rewrite the creator's text, never write a test here: that belongs to the story's developer.
32
+ - Never call, direct or wait for another agent: hand back to Noah.
@@ -0,0 +1,25 @@
1
+ # The mutation check and the holes
2
+
3
+ **What the engine does** (`check.mutation: {}`, no token from you). It copies the story's working copy to a
4
+ throwaway folder, changes the code the story added one small way at a time (a comparison turned over,
5
+ a condition negated, a boolean flipped, a constant moved by one, a return dropped), and each time runs
6
+ the test command the creator accepted (the one with `{criterion}`, filtered on the story's criteria; or
7
+ the declared command you name in `command`). The creator's folder is never changed. A break the tests
8
+ catch is killed; one they do not **survives**: a test that cannot fail there.
9
+
10
+ **When.** The story changed code, `proofs.yaml` declares a test command and the creator accepted it
11
+ (`guard.creator_action`, `proof_commands`; never accept it yourself). Without one the engine says so:
12
+ the grid and the holes still come. `max` (8 by default, 30 at most) and `seconds` (300, 1 800 at
13
+ most) of `check.mutation` bound it; raise them only for a small story whose tests are quick.
14
+
15
+ **Reading the answer.** `ran`, `killed`, `survived`; a status other than `done` says why (`baseline_red`:
16
+ the tests already fail, fix that first; `stopped`: time; `refused`: no copy, too big). Each survivor is
17
+ `file:line kind a -> b`. Read the code there: if the break changes behaviour a criterion promises, a
18
+ test is missing or too weak, and that is a hole. If it changes nothing observable (an equivalent
19
+ break), say so to the creator in one line; it is not a hole.
20
+
21
+ **The holes** (`gaps`), tied to what the tests should protect: a criterion with no test, whose test never
22
+ failed before the code, whose tests killed no break; a requirement the story cites that no test names;
23
+ a surviving break. One line each; at most 12 shown, the rest counted. With `check.propose: true` each becomes
24
+ work to decide in the register of deferred work (10 at most per call, none twice), a story or a
25
+ correction; the creator decides each in one gesture. Never decide for them.
@@ -0,0 +1,27 @@
1
+ # The grid
2
+
3
+ One answer, whole; the engine refuses one that is not and lists what is missing. It gives the marks.
4
+
5
+ - `reads`: the test files you read (at least one, 60 at most), relative paths.
6
+ - `criteria`: one entry for each of the eight, none twice: `ok`, `issues` (at least one finding) or
7
+ `not_applicable` (say why in `note`: no test of this kind here).
8
+ - `findings`: each has `criterion`, `row`, `test` (`path:line` and the test's name, a file you read),
9
+ `reason` (one line: what you saw), `fix`. The row decides the weight, not you.
10
+
11
+ | Criterion | Rows (a test that…) |
12
+ | --- | --- |
13
+ | `active` | `skipped` is disabled; `focused` runs alone and silences the others |
14
+ | `assertions` | `no_assertion` checks nothing; `tautology` compares a value with itself; `self_mock` asserts the mock it set up; `unreachable` asserts where it never runs; `shape_only` checks a type or a presence, not the value; `conditional` asserts inside an `if`, a loop or a swallowed error; `unawaited` does not wait for its async call |
15
+ | `determinism` | `hard_wait` waits on a timer; `wall_clock` builds an expiry from the live clock; `uncontrolled` uses an unseeded random, an unordered result or a real network; `navigate_then_read` loads a page and checks what it shows before waiting for the data call or a sign that it is ready; `fragile_selector` finds an element by a CSS class, an XPath, a position or a wording a rewrite changes, when a role, a label or a test id is there |
16
+ | `isolation` | `shared_state` writes state nothing resets; `order_dependent` needs another test first; `leftover` leaves files, rows or processes; `real_service` calls a real outside service |
17
+ | `readability` | `oversize` file over 1 000 lines; `multi_concern` checks three unrelated things; `deep_nesting` over three levels; `ungrouped` no suite name; `vague_name` says "works" or a method name, not the behaviour; `magic_value` an unexplained number |
18
+ | `speed` | `slow` too slow to run before a push; `heavy_setup` builds far more than it needs |
19
+ | `data` | `real_data` uses production or personal data or a secret; `repeated_payload` builds the same object inline three times; `hidden_data` depends on data defined far away |
20
+ | `risk` | `denied_untested` a rule of rights has no refused case; `happy_path_only` no error or boundary case beside the normal one; `wrong_level` proves at a level too low or too high; `raw_event` dispatches a bare DOM event when the project's runner offers a call that acts as a person does (click, type) |
21
+
22
+ The guard before a write already refuses `focused`, `skipped` with no reason, `hard_wait`, `tautology`
23
+ and `oversize` in what is written now: report them in tests that were there before.
24
+
25
+ A defect that fits no row is a prose note in your answer to the creator, without a mark. Report each
26
+ test once per row, with the line that shows it. A criterion with no test of its kind is
27
+ `not_applicable`, not `ok`. Never copy a secret into a report.