@iceinvein/agent-skills 0.21.2 → 0.21.4

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 (230) hide show
  1. package/package.json +3 -2
  2. package/skills/index.json +2 -2
  3. package/skills/migrate/SKILL.md +28 -3
  4. package/skills/migrate/docs/architecture.md +19 -7
  5. package/skills/migrate/docs/reference.md +19 -13
  6. package/skills/migrate/evals/README.md +168 -0
  7. package/skills/migrate/evals/adjudicate-drafts-not-decides/case.yaml +4 -0
  8. package/skills/migrate/evals/adjudicate-drafts-not-decides/fixture.sh +14 -0
  9. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/drafts-presented-to-owner.md +10 -0
  10. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/no-ruling-recorded.md +11 -0
  11. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-express-mailer-delivery-unobservable-still-open.md +8 -0
  12. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-express-user-list-source-still-open.md +8 -0
  13. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-express-users-table-unwired-still-open.md +8 -0
  14. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-tiny-express-enumerate-scaffold-still-open.md +8 -0
  15. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/review-sheet-read.md +8 -0
  16. package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/skill-fired.md +5 -0
  17. package/skills/migrate/evals/adjudicate-drafts-not-decides/prompt.md +11 -0
  18. package/skills/migrate/evals/done-means-plain-check/case.yaml +4 -0
  19. package/skills/migrate/evals/done-means-plain-check/fixture.sh +38 -0
  20. package/skills/migrate/evals/done-means-plain-check/graders/answers-not-finished.md +10 -0
  21. package/skills/migrate/evals/done-means-plain-check/graders/ran-plain-check.md +10 -0
  22. package/skills/migrate/evals/done-means-plain-check/graders/skill-fired.md +5 -0
  23. package/skills/migrate/evals/done-means-plain-check/graders/unsigned-delta-was-in-place.md +7 -0
  24. package/skills/migrate/evals/done-means-plain-check/prompt.md +11 -0
  25. package/skills/migrate/evals/extract-files-queue-in-same-pass/case.yaml +4 -0
  26. package/skills/migrate/evals/extract-files-queue-in-same-pass/enumerate/admin-router.js +7 -0
  27. package/skills/migrate/evals/extract-files-queue-in-same-pass/enumerate/census-routes.json +21 -0
  28. package/skills/migrate/evals/extract-files-queue-in-same-pass/enumerate/elements-dead-route.json +16 -0
  29. package/skills/migrate/evals/extract-files-queue-in-same-pass/fixture.sh +41 -0
  30. package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/check-was-run.md +8 -0
  31. package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/dead-route-accounted-for.md +13 -0
  32. package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/no-check-saw-a-dangling-queue-id.md +12 -0
  33. package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/queue-item-filed.md +5 -0
  34. package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/skill-fired.md +5 -0
  35. package/skills/migrate/evals/extract-files-queue-in-same-pass/prompt.md +11 -0
  36. package/skills/migrate/evals/forecast-refuses-without-attestation/case.yaml +4 -0
  37. package/skills/migrate/evals/forecast-refuses-without-attestation/fixture.sh +10 -0
  38. package/skills/migrate/evals/forecast-refuses-without-attestation/graders/asks-owner-for-assumptions.md +10 -0
  39. package/skills/migrate/evals/forecast-refuses-without-attestation/graders/assumptions-not-written.md +8 -0
  40. package/skills/migrate/evals/forecast-refuses-without-attestation/graders/handoff-was-scaffolded.md +5 -0
  41. package/skills/migrate/evals/forecast-refuses-without-attestation/graders/skill-fired.md +5 -0
  42. package/skills/migrate/evals/forecast-refuses-without-attestation/prompt.md +11 -0
  43. package/skills/migrate/evals/handoff-blocked-reports-blockers/case.yaml +4 -0
  44. package/skills/migrate/evals/handoff-blocked-reports-blockers/fixture.sh +23 -0
  45. package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/handoff-attempted.md +8 -0
  46. package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/handoff-json-not-written.md +8 -0
  47. package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/reopened-item-still-open.md +8 -0
  48. package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/reports-the-blocker.md +10 -0
  49. package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/skill-fired.md +5 -0
  50. package/skills/migrate/evals/handoff-blocked-reports-blockers/prompt.md +11 -0
  51. package/skills/migrate/evals/lib/express/01-init.sh +17 -0
  52. package/skills/migrate/evals/lib/express/02-phase-probe-done.sh +1 -0
  53. package/skills/migrate/evals/lib/express/03-queue-q-tiny-express-enumerate-scaffold.md +27 -0
  54. package/skills/migrate/evals/lib/express/04-import-elements-routes.json +61 -0
  55. package/skills/migrate/evals/lib/express/05-import-elements-tables.json +36 -0
  56. package/skills/migrate/evals/lib/express/06-import-elements-jobs.json +26 -0
  57. package/skills/migrate/evals/lib/express/07-import-elements-reports.json +26 -0
  58. package/skills/migrate/evals/lib/express/08-import-elements-screens.json +21 -0
  59. package/skills/migrate/evals/lib/express/09-import-elements-integrations.json +21 -0
  60. package/skills/migrate/evals/lib/express/10-import-elements-workflows.json +34 -0
  61. package/skills/migrate/evals/lib/express/11-import-elements-settings.json +36 -0
  62. package/skills/migrate/evals/lib/express/12-census-lens-routes.json +21 -0
  63. package/skills/migrate/evals/lib/express/13-census-lens-tables.json +21 -0
  64. package/skills/migrate/evals/lib/express/14-census-lens-jobs.json +21 -0
  65. package/skills/migrate/evals/lib/express/15-census-lens-reports.json +21 -0
  66. package/skills/migrate/evals/lib/express/16-census-lens-screens.json +21 -0
  67. package/skills/migrate/evals/lib/express/17-census-lens-integrations.json +21 -0
  68. package/skills/migrate/evals/lib/express/18-census-lens-workflows.json +21 -0
  69. package/skills/migrate/evals/lib/express/19-census-lens-settings.json +21 -0
  70. package/skills/migrate/evals/lib/express/20-phase-enumerate-done.sh +1 -0
  71. package/skills/migrate/evals/lib/express/21-seam-artifacts.sh +40 -0
  72. package/skills/migrate/evals/lib/express/22-phase-seam-done.sh +1 -0
  73. package/skills/migrate/evals/lib/express/23-import-reqs-extract.json +336 -0
  74. package/skills/migrate/evals/lib/express/24-queue-q-express-user-list-source.md +24 -0
  75. package/skills/migrate/evals/lib/express/25-queue-q-express-mailer-delivery-unobservable.md +24 -0
  76. package/skills/migrate/evals/lib/express/26-queue-q-express-users-table-unwired.md +26 -0
  77. package/skills/migrate/evals/lib/express/27-import-elements-disposed.json +219 -0
  78. package/skills/migrate/evals/lib/express/28-census-rule-sweep-user-directory.json +10 -0
  79. package/skills/migrate/evals/lib/express/29-census-rule-sweep-welcome-notification.json +10 -0
  80. package/skills/migrate/evals/lib/express/30-census-rule-sweep-audit-retention.json +10 -0
  81. package/skills/migrate/evals/lib/express/31-census-attribute-table-users.json +21 -0
  82. package/skills/migrate/evals/lib/express/32-census-closer-cross-capability-workflow.json +10 -0
  83. package/skills/migrate/evals/lib/express/33-census-closer-scope-injection.json +10 -0
  84. package/skills/migrate/evals/lib/express/34-census-closer-read-write-symmetry.json +12 -0
  85. package/skills/migrate/evals/lib/express/35-phase-extract-done.sh +1 -0
  86. package/skills/migrate/evals/lib/express/36-import-deltas-parity.json +14 -0
  87. package/skills/migrate/evals/lib/express/37-import-reqs-parity.json +367 -0
  88. package/skills/migrate/evals/lib/express/38-phase-parity-done.sh +1 -0
  89. package/skills/migrate/evals/lib/express/39-phase-queue-done.sh +1 -0
  90. package/skills/migrate/evals/lib/express/40-adjudicate-rulings.sh +4 -0
  91. package/skills/migrate/evals/lib/express/41-phase-adjudicate-done.sh +1 -0
  92. package/skills/migrate/evals/lib/express/42-handoff.sh +1 -0
  93. package/skills/migrate/evals/lib/express/43-phase-handoff-done.sh +1 -0
  94. package/skills/migrate/evals/lib/scaffold.sh +118 -0
  95. package/skills/migrate/evals/probe-asks-for-the-target/case.yaml +4 -0
  96. package/skills/migrate/evals/probe-asks-for-the-target/fixture.sh +11 -0
  97. package/skills/migrate/evals/probe-asks-for-the-target/graders/asks-for-the-target-profile.md +10 -0
  98. package/skills/migrate/evals/probe-asks-for-the-target/graders/init-waits-for-the-answers.md +11 -0
  99. package/skills/migrate/evals/probe-asks-for-the-target/graders/parity-basis-was-written.md +6 -0
  100. package/skills/migrate/evals/probe-asks-for-the-target/graders/skill-fired.md +5 -0
  101. package/skills/migrate/evals/probe-asks-for-the-target/graders/source-was-scaffolded.md +7 -0
  102. package/skills/migrate/evals/probe-asks-for-the-target/prompt.md +11 -0
  103. package/skills/migrate/evals/resume-reads-status-first/case.yaml +4 -0
  104. package/skills/migrate/evals/resume-reads-status-first/fixture.sh +44 -0
  105. package/skills/migrate/evals/resume-reads-status-first/graders/config-left-as-it-was.md +8 -0
  106. package/skills/migrate/evals/resume-reads-status-first/graders/never-reruns-init.md +12 -0
  107. package/skills/migrate/evals/resume-reads-status-first/graders/reads-status-before-writing.md +12 -0
  108. package/skills/migrate/evals/resume-reads-status-first/graders/skill-fired.md +5 -0
  109. package/skills/migrate/evals/resume-reads-status-first/prompt.md +11 -0
  110. package/skills/migrate/evals/seam-low-q-escalates/case.yaml +4 -0
  111. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-integrations.json +21 -0
  112. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-jobs.json +21 -0
  113. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-reports.json +21 -0
  114. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-routes.json +21 -0
  115. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-screens.json +21 -0
  116. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-settings.json +21 -0
  117. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-tables.json +21 -0
  118. package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-workflows.json +21 -0
  119. package/skills/migrate/evals/seam-low-q-escalates/enumerate/elements.json +183 -0
  120. package/skills/migrate/evals/seam-low-q-escalates/fixture.sh +48 -0
  121. package/skills/migrate/evals/seam-low-q-escalates/graders/hands-the-choice-to-the-owner.md +10 -0
  122. package/skills/migrate/evals/seam-low-q-escalates/graders/item-is-critical-and-offers-vertical.md +9 -0
  123. package/skills/migrate/evals/seam-low-q-escalates/graders/no-partition-written.md +10 -0
  124. package/skills/migrate/evals/seam-low-q-escalates/graders/queue-item-filed.md +5 -0
  125. package/skills/migrate/evals/seam-low-q-escalates/graders/seam-not-closed.md +9 -0
  126. package/skills/migrate/evals/seam-low-q-escalates/graders/skill-fired.md +5 -0
  127. package/skills/migrate/evals/seam-low-q-escalates/graders/store-was-scaffolded.md +8 -0
  128. package/skills/migrate/evals/seam-low-q-escalates/legacy/schema.sql +20 -0
  129. package/skills/migrate/evals/seam-low-q-escalates/legacy/server.js +76 -0
  130. package/skills/migrate/evals/seam-low-q-escalates/prompt.md +11 -0
  131. package/skills/migrate/evals/seam-shared-element-queued/case.yaml +4 -0
  132. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-integrations.json +25 -0
  133. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-jobs.json +25 -0
  134. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-reports.json +25 -0
  135. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-routes.json +25 -0
  136. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-screens.json +21 -0
  137. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-settings.json +21 -0
  138. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-tables.json +25 -0
  139. package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-workflows.json +21 -0
  140. package/skills/migrate/evals/seam-shared-element-queued/enumerate/elements.json +278 -0
  141. package/skills/migrate/evals/seam-shared-element-queued/fixture.sh +34 -0
  142. package/skills/migrate/evals/seam-shared-element-queued/graders/shared-setting-in-no-capability.md +10 -0
  143. package/skills/migrate/evals/seam-shared-element-queued/graders/shared-setting-queued.md +10 -0
  144. package/skills/migrate/evals/seam-shared-element-queued/graders/skill-fired.md +5 -0
  145. package/skills/migrate/evals/seam-shared-element-queued/graders/store-was-scaffolded.md +8 -0
  146. package/skills/migrate/evals/seam-shared-element-queued/prompt.md +11 -0
  147. package/skills/migrate/evals/stale-lock-not-forced/case.yaml +4 -0
  148. package/skills/migrate/evals/stale-lock-not-forced/fixture.sh +43 -0
  149. package/skills/migrate/evals/stale-lock-not-forced/graders/batch-was-supplied.md +6 -0
  150. package/skills/migrate/evals/stale-lock-not-forced/graders/lock-left-in-place.md +8 -0
  151. package/skills/migrate/evals/stale-lock-not-forced/graders/lock-not-forced.md +11 -0
  152. package/skills/migrate/evals/stale-lock-not-forced/graders/names-the-lock-holder.md +10 -0
  153. package/skills/migrate/evals/stale-lock-not-forced/graders/skill-fired.md +5 -0
  154. package/skills/migrate/evals/stale-lock-not-forced/prompt.md +11 -0
  155. package/skills/migrate/package.json +1 -1
  156. package/skills/migrate/references/phases/adjudicate.md +6 -3
  157. package/skills/migrate/references/phases/enumerate.md +18 -8
  158. package/skills/migrate/references/phases/extract.md +54 -23
  159. package/skills/migrate/references/phases/parity.md +36 -24
  160. package/skills/migrate/references/phases/probe.md +25 -12
  161. package/skills/migrate/references/phases/queue.md +29 -23
  162. package/skills/migrate/references/phases/seam.md +46 -29
  163. package/skills/migrate/scripts/__tests__/check.test.ts +347 -5
  164. package/skills/migrate/scripts/__tests__/e2e.test.ts +17 -1
  165. package/skills/migrate/scripts/__tests__/eval-scaffold.test.ts +130 -0
  166. package/skills/migrate/scripts/__tests__/gates-handoff.test.ts +10 -0
  167. package/skills/migrate/scripts/__tests__/handoff-cmd.test.ts +10 -0
  168. package/skills/migrate/scripts/__tests__/init.test.ts +32 -0
  169. package/skills/migrate/scripts/__tests__/phase-cmd.test.ts +39 -0
  170. package/skills/migrate/scripts/__tests__/phases.test.ts +1 -0
  171. package/skills/migrate/scripts/__tests__/status-reset.test.ts +14 -4
  172. package/skills/migrate/scripts/census.ts +10 -8
  173. package/skills/migrate/scripts/config.ts +4 -3
  174. package/skills/migrate/scripts/gates/census.ts +33 -5
  175. package/skills/migrate/scripts/gates/parity.ts +29 -0
  176. package/skills/migrate/scripts/gates/refs.ts +80 -1
  177. package/skills/migrate/scripts/init-cmd.ts +8 -2
  178. package/skills/migrate/scripts/phase-cmd.ts +14 -1
  179. package/skills/migrate/scripts/phases.ts +27 -0
  180. package/skills/migrate/skill.json +1 -1
  181. package/skills/terse/SKILL.md +1 -0
  182. package/skills/terse/bench/README.md +196 -0
  183. package/skills/terse/bench/bench.ts +431 -0
  184. package/skills/terse/bench/prompts.json +181 -0
  185. package/skills/terse/bench/stats.ts +131 -0
  186. package/skills/terse/evals/README.md +152 -0
  187. package/skills/terse/evals/commit-message-written-normally/graders/message-is-plain-prose.md +12 -0
  188. package/skills/terse/evals/commit-message-written-normally/graders/no-preamble.md +7 -0
  189. package/skills/terse/evals/commit-message-written-normally/graders/skill-fired.md +5 -0
  190. package/skills/terse/evals/commit-message-written-normally/prompt.md +30 -0
  191. package/skills/terse/evals/explanation-has-no-recap/graders/explains-shared-default.md +10 -0
  192. package/skills/terse/evals/explanation-has-no-recap/graders/no-closing-recap.md +7 -0
  193. package/skills/terse/evals/explanation-has-no-recap/graders/no-preamble.md +7 -0
  194. package/skills/terse/evals/explanation-has-no-recap/graders/no-question-echo.md +7 -0
  195. package/skills/terse/evals/explanation-has-no-recap/graders/skill-fired.md +5 -0
  196. package/skills/terse/evals/explanation-has-no-recap/prompt.md +10 -0
  197. package/skills/terse/evals/fix-reports-the-cause/case.yaml +4 -0
  198. package/skills/terse/evals/fix-reports-the-cause/fixture.sh +16 -0
  199. package/skills/terse/evals/fix-reports-the-cause/graders/fixture-scaffolded.md +5 -0
  200. package/skills/terse/evals/fix-reports-the-cause/graders/handback-states-cause-not-steps.md +10 -0
  201. package/skills/terse/evals/fix-reports-the-cause/graders/skill-fired.md +5 -0
  202. package/skills/terse/evals/fix-reports-the-cause/graders/tax-on-discounted-subtotal.md +10 -0
  203. package/skills/terse/evals/fix-reports-the-cause/prompt.md +11 -0
  204. package/skills/terse/evals/plain-register/graders/gives-usable-advice.md +10 -0
  205. package/skills/terse/evals/plain-register/graders/no-consultant-words.md +10 -0
  206. package/skills/terse/evals/plain-register/graders/no-preamble.md +7 -0
  207. package/skills/terse/evals/plain-register/graders/skill-fired.md +5 -0
  208. package/skills/terse/evals/plain-register/prompt.md +10 -0
  209. package/skills/terse/evals/recommendation-leads-and-holds/graders/adds-nothing-unasked.md +12 -0
  210. package/skills/terse/evals/recommendation-leads-and-holds/graders/keeps-a-real-caveat.md +9 -0
  211. package/skills/terse/evals/recommendation-leads-and-holds/graders/no-preamble.md +7 -0
  212. package/skills/terse/evals/recommendation-leads-and-holds/graders/recommends-sqlite-first.md +10 -0
  213. package/skills/terse/evals/recommendation-leads-and-holds/graders/skill-fired.md +5 -0
  214. package/skills/terse/evals/recommendation-leads-and-holds/prompt.md +10 -0
  215. package/skills/terse/evals/security-warning-survives-sharp/graders/no-preamble.md +7 -0
  216. package/skills/terse/evals/security-warning-survives-sharp/graders/skill-fired.md +5 -0
  217. package/skills/terse/evals/security-warning-survives-sharp/graders/warns-in-full-sentences.md +10 -0
  218. package/skills/terse/evals/security-warning-survives-sharp/prompt.md +10 -0
  219. package/skills/terse/evals/sharp-compresses-structure/graders/keeps-the-mechanism.md +10 -0
  220. package/skills/terse/evals/sharp-compresses-structure/graders/no-preamble.md +7 -0
  221. package/skills/terse/evals/sharp-compresses-structure/graders/skill-fired.md +5 -0
  222. package/skills/terse/evals/sharp-compresses-structure/graders/stays-under-120-words.md +7 -0
  223. package/skills/terse/evals/sharp-compresses-structure/graders/uses-arrows.md +5 -0
  224. package/skills/terse/evals/sharp-compresses-structure/prompt.md +10 -0
  225. package/skills/terse/evals/short-answer-stays-short/graders/no-preamble.md +7 -0
  226. package/skills/terse/evals/short-answer-stays-short/graders/skill-fired.md +5 -0
  227. package/skills/terse/evals/short-answer-stays-short/graders/states-log-n.md +7 -0
  228. package/skills/terse/evals/short-answer-stays-short/graders/stays-under-forty-words.md +10 -0
  229. package/skills/terse/evals/short-answer-stays-short/prompt.md +10 -0
  230. package/skills/terse/skill.json +1 -1
@@ -0,0 +1,219 @@
1
+ {
2
+ "batch": "b-elements-disposition-001",
3
+ "phase": "extract",
4
+ "rows": [
5
+ {
6
+ "id": "route-get-api-users",
7
+ "surface": "routes",
8
+ "element": "GET /api/users",
9
+ "found_by": [
10
+ "code"
11
+ ],
12
+ "disposition": {
13
+ "kind": "mapped",
14
+ "fr": "UD-001"
15
+ },
16
+ "refs": [
17
+ {
18
+ "kind": "ledger",
19
+ "id": "table-users"
20
+ }
21
+ ],
22
+ "lens": "code",
23
+ "notes": ""
24
+ },
25
+ {
26
+ "id": "route-post-api-users",
27
+ "surface": "routes",
28
+ "element": "POST /api/users",
29
+ "found_by": [
30
+ "code"
31
+ ],
32
+ "disposition": {
33
+ "kind": "mapped",
34
+ "fr": "UD-002"
35
+ },
36
+ "refs": [
37
+ {
38
+ "kind": "ledger",
39
+ "id": "table-users"
40
+ }
41
+ ],
42
+ "lens": "code",
43
+ "notes": ""
44
+ },
45
+ {
46
+ "id": "route-get-api-users-id-welcome",
47
+ "surface": "routes",
48
+ "element": "GET /api/users/:id/welcome",
49
+ "found_by": [
50
+ "code"
51
+ ],
52
+ "disposition": {
53
+ "kind": "mapped",
54
+ "fr": "WN-001"
55
+ },
56
+ "refs": [],
57
+ "lens": "code",
58
+ "notes": ""
59
+ },
60
+ {
61
+ "id": "table-users",
62
+ "surface": "tables",
63
+ "element": "users",
64
+ "found_by": [
65
+ "code"
66
+ ],
67
+ "disposition": {
68
+ "kind": "mapped",
69
+ "fr": "UD-003"
70
+ },
71
+ "refs": [],
72
+ "lens": "code",
73
+ "notes": ""
74
+ },
75
+ {
76
+ "id": "table-audit-log",
77
+ "surface": "tables",
78
+ "element": "audit_log",
79
+ "found_by": [
80
+ "code"
81
+ ],
82
+ "disposition": {
83
+ "kind": "mapped",
84
+ "fr": "AR-002"
85
+ },
86
+ "refs": [],
87
+ "lens": "code",
88
+ "notes": ""
89
+ },
90
+ {
91
+ "id": "job-purge-audit-log",
92
+ "surface": "jobs",
93
+ "element": "nightly purge of audit_log",
94
+ "found_by": [
95
+ "code"
96
+ ],
97
+ "disposition": {
98
+ "kind": "mapped",
99
+ "fr": "AR-001"
100
+ },
101
+ "refs": [
102
+ {
103
+ "kind": "ledger",
104
+ "id": "table-audit-log"
105
+ }
106
+ ],
107
+ "lens": "code",
108
+ "notes": ""
109
+ },
110
+ {
111
+ "id": "report-daily-users",
112
+ "surface": "reports",
113
+ "element": "daily-users report",
114
+ "found_by": [
115
+ "code"
116
+ ],
117
+ "disposition": {
118
+ "kind": "mapped",
119
+ "fr": "UD-004"
120
+ },
121
+ "refs": [
122
+ {
123
+ "kind": "ledger",
124
+ "id": "table-users"
125
+ }
126
+ ],
127
+ "lens": "code",
128
+ "notes": ""
129
+ },
130
+ {
131
+ "id": "screen-users",
132
+ "surface": "screens",
133
+ "element": "users list screen",
134
+ "found_by": [
135
+ "code"
136
+ ],
137
+ "disposition": {
138
+ "kind": "mapped",
139
+ "fr": "UD-005"
140
+ },
141
+ "refs": [],
142
+ "lens": "code",
143
+ "notes": ""
144
+ },
145
+ {
146
+ "id": "integration-mailer",
147
+ "surface": "integrations",
148
+ "element": "call to mailer service",
149
+ "found_by": [
150
+ "code"
151
+ ],
152
+ "disposition": {
153
+ "kind": "mapped",
154
+ "fr": "WN-003"
155
+ },
156
+ "refs": [],
157
+ "lens": "code",
158
+ "notes": ""
159
+ },
160
+ {
161
+ "id": "workflow-welcome-email",
162
+ "surface": "workflows",
163
+ "element": "welcome email workflow",
164
+ "found_by": [
165
+ "code"
166
+ ],
167
+ "disposition": {
168
+ "kind": "mapped",
169
+ "fr": "WN-002"
170
+ },
171
+ "refs": [
172
+ {
173
+ "kind": "ledger",
174
+ "id": "route-post-api-users"
175
+ },
176
+ {
177
+ "kind": "ledger",
178
+ "id": "route-get-api-users-id-welcome"
179
+ },
180
+ {
181
+ "kind": "ledger",
182
+ "id": "setting-welcome-email-enabled"
183
+ }
184
+ ],
185
+ "lens": "code",
186
+ "notes": ""
187
+ },
188
+ {
189
+ "id": "setting-welcome-email-enabled",
190
+ "surface": "settings",
191
+ "element": "welcomeEmailEnabled",
192
+ "found_by": [
193
+ "code"
194
+ ],
195
+ "disposition": {
196
+ "kind": "mapped",
197
+ "fr": "WN-001"
198
+ },
199
+ "refs": [],
200
+ "lens": "code",
201
+ "notes": ""
202
+ },
203
+ {
204
+ "id": "setting-max-users-per-page",
205
+ "surface": "settings",
206
+ "element": "maxUsersPerPage",
207
+ "found_by": [
208
+ "code"
209
+ ],
210
+ "disposition": {
211
+ "kind": "mapped",
212
+ "fr": "UD-001"
213
+ },
214
+ "refs": [],
215
+ "lens": "code",
216
+ "notes": ""
217
+ }
218
+ ]
219
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "kind": "rule-sweep",
3
+ "subject": "user-directory",
4
+ "phase": "extract",
5
+ "probes": 2,
6
+ "found": 1,
7
+ "as_requirements": 1,
8
+ "queued": [],
9
+ "batch": "b-rules-user-directory-001"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "kind": "rule-sweep",
3
+ "subject": "welcome-notification",
4
+ "phase": "extract",
5
+ "probes": 2,
6
+ "found": 1,
7
+ "as_requirements": 1,
8
+ "queued": [],
9
+ "batch": "b-rules-welcome-notification-001"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "kind": "rule-sweep",
3
+ "subject": "audit-retention",
4
+ "phase": "extract",
5
+ "probes": 2,
6
+ "found": 1,
7
+ "as_requirements": 1,
8
+ "queued": [],
9
+ "batch": "b-rules-audit-retention-001"
10
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "kind": "attribute",
3
+ "surface": "tables",
4
+ "subject": "table-users",
5
+ "phase": "extract",
6
+ "directions": {
7
+ "ddl": {
8
+ "count": 3,
9
+ "evidence": "column list from CREATE TABLE users in schema.sql"
10
+ },
11
+ "report_query": {
12
+ "count": 1,
13
+ "evidence": "columns named in the query in reports/daily-users.json"
14
+ }
15
+ },
16
+ "total": 3,
17
+ "behavioral": 2,
18
+ "explained": 2,
19
+ "queued": [],
20
+ "batch": "b-attr-table-users-001"
21
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "kind": "closer",
3
+ "closer": "cross-capability-workflow",
4
+ "phase": "extract",
5
+ "checked": 1,
6
+ "findings": 1,
7
+ "fixed": 1,
8
+ "queued": [],
9
+ "batch": "b-closer-cross-capability-001"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "kind": "closer",
3
+ "closer": "scope-injection",
4
+ "phase": "extract",
5
+ "checked": 11,
6
+ "findings": 0,
7
+ "fixed": 0,
8
+ "queued": [],
9
+ "batch": "b-closer-scope-injection-001"
10
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "kind": "closer",
3
+ "closer": "read-write-symmetry",
4
+ "phase": "extract",
5
+ "checked": 11,
6
+ "findings": 1,
7
+ "fixed": 0,
8
+ "queued": [
9
+ "q-express-users-table-unwired"
10
+ ],
11
+ "batch": "b-closer-read-write-symmetry-001"
12
+ }
@@ -0,0 +1 @@
1
+ migrate phase extract --status done
@@ -0,0 +1,14 @@
1
+ {
2
+ "batch": "b-deltas-parity-001",
3
+ "phase": "parity",
4
+ "rows": [
5
+ {
6
+ "id": "delta-mailer-provider-swap",
7
+ "scope": "Outbound welcome email delivery (WN-003)",
8
+ "rationale": "The legacy app posts straight to mailer.example.com from inside the request handler. The target sends through its own provider, so the outbound request differs by destination and headers for reasons that have nothing to do with whether a welcome was owed.",
9
+ "parity_exclusion": "The WN-003 parity check must not assert on the mailer endpoint or the shape of the request sent to it, only that a send was attempted for an enabled, pending welcome.",
10
+ "validation": "A greenfield-only test asserts the target provider is called with the right recipient; the parity suite does not re-prove the transport.",
11
+ "owner_signed": "2026-08-08"
12
+ }
13
+ ]
14
+ }
@@ -0,0 +1,367 @@
1
+ {
2
+ "batch": "b-reqs-parity-001",
3
+ "phase": "parity",
4
+ "rows": [
5
+ {
6
+ "id": "UD-001",
7
+ "cap": "user-directory",
8
+ "requirement": "Listing users returns at most the configured maximum number of users per page",
9
+ "actors": "API client",
10
+ "objects": "User list",
11
+ "rules": "The response is sliced to settings.maxUsersPerPage entries",
12
+ "origin": "intended",
13
+ "confidence": {
14
+ "kind": "confirmed"
15
+ },
16
+ "citations": [
17
+ {
18
+ "kind": "ledger",
19
+ "id": "route-get-api-users"
20
+ },
21
+ {
22
+ "kind": "src",
23
+ "path": "app.js",
24
+ "lines": [
25
+ 8,
26
+ 8
27
+ ]
28
+ },
29
+ {
30
+ "kind": "src",
31
+ "path": "settings.json",
32
+ "lines": [
33
+ 1,
34
+ 4
35
+ ]
36
+ }
37
+ ],
38
+ "parity": {
39
+ "kind": "rubric",
40
+ "level": "high"
41
+ }
42
+ },
43
+ {
44
+ "id": "UD-002",
45
+ "cap": "user-directory",
46
+ "requirement": "Creating a user returns a generated id and records a pending welcome against it",
47
+ "actors": "API client",
48
+ "objects": "User",
49
+ "rules": "The id is minted from the current clock; the submitted email is held against it",
50
+ "origin": "intended",
51
+ "confidence": {
52
+ "kind": "confirmed"
53
+ },
54
+ "citations": [
55
+ {
56
+ "kind": "ledger",
57
+ "id": "route-post-api-users"
58
+ },
59
+ {
60
+ "kind": "src",
61
+ "path": "app.js",
62
+ "lines": [
63
+ 10,
64
+ 14
65
+ ]
66
+ }
67
+ ],
68
+ "parity": {
69
+ "kind": "rubric",
70
+ "level": "high"
71
+ }
72
+ },
73
+ {
74
+ "id": "UD-003",
75
+ "cap": "user-directory",
76
+ "requirement": "The users table stores an id, a required email, and an active flag defaulting to set",
77
+ "actors": "-",
78
+ "objects": "User row",
79
+ "rules": "email is NOT NULL; is_active defaults to 1",
80
+ "origin": "intended",
81
+ "confidence": {
82
+ "kind": "confirmed"
83
+ },
84
+ "citations": [
85
+ {
86
+ "kind": "ledger",
87
+ "id": "table-users"
88
+ },
89
+ {
90
+ "kind": "src",
91
+ "path": "schema.sql",
92
+ "lines": [
93
+ 1,
94
+ 5
95
+ ]
96
+ }
97
+ ],
98
+ "parity": {
99
+ "kind": "golden-master",
100
+ "ref": "tests/parity/user-directory/users-table.test.ts"
101
+ }
102
+ },
103
+ {
104
+ "id": "UD-004",
105
+ "cap": "user-directory",
106
+ "requirement": "The daily-users report counts only users whose active flag is set",
107
+ "actors": "Report consumer",
108
+ "objects": "Active user count",
109
+ "rules": "The query filters on is_active = 1 and runs once a day",
110
+ "origin": "intended",
111
+ "confidence": {
112
+ "kind": "confirmed"
113
+ },
114
+ "citations": [
115
+ {
116
+ "kind": "ledger",
117
+ "id": "report-daily-users"
118
+ },
119
+ {
120
+ "kind": "src",
121
+ "path": "reports/daily-users.json",
122
+ "lines": [
123
+ 1,
124
+ 6
125
+ ]
126
+ }
127
+ ],
128
+ "parity": {
129
+ "kind": "golden-master",
130
+ "ref": "tests/parity/user-directory/daily-users-report.test.ts"
131
+ }
132
+ },
133
+ {
134
+ "id": "UD-005",
135
+ "cap": "user-directory",
136
+ "requirement": "The users screen renders one list entry per user email",
137
+ "actors": "Operator",
138
+ "objects": "User list screen",
139
+ "rules": "Each entry is bound to the email field",
140
+ "origin": "intended",
141
+ "confidence": {
142
+ "kind": "confirmed"
143
+ },
144
+ "citations": [
145
+ {
146
+ "kind": "ledger",
147
+ "id": "screen-users"
148
+ },
149
+ {
150
+ "kind": "src",
151
+ "path": "views/users.html",
152
+ "lines": [
153
+ 1,
154
+ 9
155
+ ]
156
+ }
157
+ ],
158
+ "parity": {
159
+ "kind": "rubric",
160
+ "level": "high"
161
+ }
162
+ },
163
+ {
164
+ "id": "UD-006",
165
+ "cap": "user-directory",
166
+ "requirement": "The users list endpoint reads the rows it returns from the users table",
167
+ "actors": "API client",
168
+ "objects": "User list",
169
+ "rules": "-",
170
+ "origin": "intended",
171
+ "confidence": {
172
+ "kind": "queued",
173
+ "queue": "q-express-user-list-source"
174
+ },
175
+ "citations": [
176
+ {
177
+ "kind": "ledger",
178
+ "id": "route-get-api-users"
179
+ },
180
+ {
181
+ "kind": "src",
182
+ "path": "app.js",
183
+ "lines": [
184
+ 8,
185
+ 8
186
+ ]
187
+ },
188
+ {
189
+ "kind": "src",
190
+ "path": "schema.sql",
191
+ "lines": [
192
+ 1,
193
+ 5
194
+ ]
195
+ }
196
+ ],
197
+ "parity": null
198
+ },
199
+ {
200
+ "id": "WN-001",
201
+ "cap": "welcome-notification",
202
+ "requirement": "The welcome route reports a send only when the welcome setting is enabled and a pending welcome exists for that id",
203
+ "actors": "API client",
204
+ "objects": "Pending welcome",
205
+ "rules": "Both settings.welcomeEmailEnabled and a stored email must hold, or nothing is sent",
206
+ "origin": "intended",
207
+ "confidence": {
208
+ "kind": "confirmed"
209
+ },
210
+ "citations": [
211
+ {
212
+ "kind": "ledger",
213
+ "id": "route-get-api-users-id-welcome"
214
+ },
215
+ {
216
+ "kind": "src",
217
+ "path": "app.js",
218
+ "lines": [
219
+ 18,
220
+ 27
221
+ ]
222
+ },
223
+ {
224
+ "kind": "src",
225
+ "path": "settings.json",
226
+ "lines": [
227
+ 1,
228
+ 4
229
+ ]
230
+ }
231
+ ],
232
+ "parity": {
233
+ "kind": "rubric",
234
+ "level": "high"
235
+ }
236
+ },
237
+ {
238
+ "id": "WN-002",
239
+ "cap": "welcome-notification",
240
+ "requirement": "Signup and welcome are one two-step workflow carrying the pending email in process memory between the two requests",
241
+ "actors": "API client",
242
+ "objects": "Pending welcome state",
243
+ "rules": "Step one writes the map entry; step two consumes it",
244
+ "origin": "intended",
245
+ "confidence": {
246
+ "kind": "confirmed"
247
+ },
248
+ "citations": [
249
+ {
250
+ "kind": "ledger",
251
+ "id": "workflow-welcome-email"
252
+ },
253
+ {
254
+ "kind": "src",
255
+ "path": "app.js",
256
+ "lines": [
257
+ 5,
258
+ 6
259
+ ]
260
+ },
261
+ {
262
+ "kind": "src",
263
+ "path": "app.js",
264
+ "lines": [
265
+ 16,
266
+ 19
267
+ ]
268
+ }
269
+ ],
270
+ "parity": {
271
+ "kind": "rubric",
272
+ "level": "high"
273
+ }
274
+ },
275
+ {
276
+ "id": "WN-003",
277
+ "cap": "welcome-notification",
278
+ "requirement": "The welcome email is sent by an outbound POST to the mailer service",
279
+ "actors": "System",
280
+ "objects": "Welcome email",
281
+ "rules": "The recipient address is the email held against the pending welcome",
282
+ "origin": "intended",
283
+ "confidence": {
284
+ "kind": "inferred"
285
+ },
286
+ "citations": [
287
+ {
288
+ "kind": "ledger",
289
+ "id": "integration-mailer"
290
+ },
291
+ {
292
+ "kind": "src",
293
+ "path": "app.js",
294
+ "lines": [
295
+ 21,
296
+ 24
297
+ ]
298
+ }
299
+ ],
300
+ "parity": {
301
+ "kind": "rubric",
302
+ "level": "moderate",
303
+ "queue": "q-express-mailer-delivery-unobservable"
304
+ }
305
+ },
306
+ {
307
+ "id": "AR-001",
308
+ "cap": "audit-retention",
309
+ "requirement": "Audit log rows older than thirty days are purged on a nightly schedule",
310
+ "actors": "System",
311
+ "objects": "Audit log rows",
312
+ "rules": "Runs at 02:00 daily; the cutoff is thirty days",
313
+ "origin": "intended",
314
+ "confidence": {
315
+ "kind": "confirmed"
316
+ },
317
+ "citations": [
318
+ {
319
+ "kind": "ledger",
320
+ "id": "job-purge-audit-log"
321
+ },
322
+ {
323
+ "kind": "src",
324
+ "path": "cron.js",
325
+ "lines": [
326
+ 3,
327
+ 6
328
+ ]
329
+ }
330
+ ],
331
+ "parity": {
332
+ "kind": "rubric",
333
+ "level": "high"
334
+ }
335
+ },
336
+ {
337
+ "id": "AR-002",
338
+ "cap": "audit-retention",
339
+ "requirement": "The audit log stores one row per user action with a creation timestamp",
340
+ "actors": "-",
341
+ "objects": "Audit log row",
342
+ "rules": "user_id, action and created_at are all NOT NULL",
343
+ "origin": "intended",
344
+ "confidence": {
345
+ "kind": "confirmed"
346
+ },
347
+ "citations": [
348
+ {
349
+ "kind": "ledger",
350
+ "id": "table-audit-log"
351
+ },
352
+ {
353
+ "kind": "src",
354
+ "path": "schema.sql",
355
+ "lines": [
356
+ 7,
357
+ 12
358
+ ]
359
+ }
360
+ ],
361
+ "parity": {
362
+ "kind": "golden-master",
363
+ "ref": "tests/parity/audit-retention/audit-log-table.test.ts"
364
+ }
365
+ }
366
+ ]
367
+ }
@@ -0,0 +1 @@
1
+ migrate phase parity --status done