@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,21 @@
1
+ {
2
+ "kind": "lens",
3
+ "surface": "jobs",
4
+ "phase": "enumerate",
5
+ "directions": {
6
+ "grep": {
7
+ "count": 1,
8
+ "evidence": "grep \"cron.schedule\" across cron.js"
9
+ },
10
+ "manual": {
11
+ "count": 1,
12
+ "evidence": "manual review of cron.js"
13
+ }
14
+ },
15
+ "total": 1,
16
+ "in_ledger": 0,
17
+ "added": 1,
18
+ "skipped": [],
19
+ "queued": [],
20
+ "batch": "b-jobs-census-001"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "kind": "lens",
3
+ "surface": "reports",
4
+ "phase": "enumerate",
5
+ "directions": {
6
+ "grep": {
7
+ "count": 1,
8
+ "evidence": "ls reports/*.json"
9
+ },
10
+ "manual": {
11
+ "count": 1,
12
+ "evidence": "manual review of report definitions under reports/"
13
+ }
14
+ },
15
+ "total": 1,
16
+ "in_ledger": 0,
17
+ "added": 1,
18
+ "skipped": [],
19
+ "queued": [],
20
+ "batch": "b-reports-census-001"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "kind": "lens",
3
+ "surface": "screens",
4
+ "phase": "enumerate",
5
+ "directions": {
6
+ "grep": {
7
+ "count": 1,
8
+ "evidence": "ls views/*.html"
9
+ },
10
+ "manual": {
11
+ "count": 1,
12
+ "evidence": "manual review of templates under views/"
13
+ }
14
+ },
15
+ "total": 1,
16
+ "in_ledger": 0,
17
+ "added": 1,
18
+ "skipped": [],
19
+ "queued": [],
20
+ "batch": "b-screens-census-001"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "kind": "lens",
3
+ "surface": "integrations",
4
+ "phase": "enumerate",
5
+ "directions": {
6
+ "grep": {
7
+ "count": 1,
8
+ "evidence": "grep \"fetch(\" across app.js"
9
+ },
10
+ "manual": {
11
+ "count": 1,
12
+ "evidence": "manual review of outbound HTTP calls in app.js"
13
+ }
14
+ },
15
+ "total": 1,
16
+ "in_ledger": 0,
17
+ "added": 1,
18
+ "skipped": [],
19
+ "queued": [],
20
+ "batch": "b-integrations-census-001"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "kind": "lens",
3
+ "surface": "workflows",
4
+ "phase": "enumerate",
5
+ "directions": {
6
+ "grep": {
7
+ "count": 1,
8
+ "evidence": "manual review of state stored and later consumed across app.js handlers"
9
+ },
10
+ "manual": {
11
+ "count": 1,
12
+ "evidence": "grep \"pendingWelcomes\" across app.js"
13
+ }
14
+ },
15
+ "total": 1,
16
+ "in_ledger": 0,
17
+ "added": 1,
18
+ "skipped": [],
19
+ "queued": [],
20
+ "batch": "b-workflows-census-001"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "kind": "lens",
3
+ "surface": "settings",
4
+ "phase": "enumerate",
5
+ "directions": {
6
+ "grep": {
7
+ "count": 2,
8
+ "evidence": "grep \"settings\\.\" across app.js, excluding the require line"
9
+ },
10
+ "manual": {
11
+ "count": 2,
12
+ "evidence": "manual review of settings.json keys"
13
+ }
14
+ },
15
+ "total": 2,
16
+ "in_ledger": 0,
17
+ "added": 2,
18
+ "skipped": [],
19
+ "queued": [],
20
+ "batch": "b-settings-census-001"
21
+ }
@@ -0,0 +1 @@
1
+ migrate phase enumerate --status done
@@ -0,0 +1,40 @@
1
+ cat > .migrate/capabilities.jsonl <<'JSONL'
2
+ {"slug":"audit-retention","title":"Audit Retention","ns":"AR","elements":["job-purge-audit-log","table-audit-log"]}
3
+ {"slug":"user-directory","title":"User Directory","ns":"UD","elements":["report-daily-users","route-get-api-users","route-post-api-users","table-users","screen-users","setting-max-users-per-page"]}
4
+ {"slug":"welcome-notification","title":"Welcome Notification","ns":"WN","elements":["route-get-api-users-id-welcome","setting-welcome-email-enabled","workflow-welcome-email","integration-mailer"]}
5
+ JSONL
6
+ cat > .migrate/seam.json <<'JSON'
7
+ {
8
+ "validators": {
9
+ "schema-clustering": {
10
+ "ran": false,
11
+ "reason": "no relational schema this run can cluster"
12
+ },
13
+ "call-graph": {
14
+ "ran": false,
15
+ "reason": "no static call-graph tooling in this environment"
16
+ },
17
+ "change-coupling": {
18
+ "ran": false,
19
+ "reason": "the copied fixture carries no VCS history"
20
+ },
21
+ "surface-affinity": {
22
+ "ran": true,
23
+ "modularity": 0.459
24
+ }
25
+ },
26
+ "agreement": [
27
+ "surface-affinity"
28
+ ],
29
+ "modularity": 0.459,
30
+ "status": "accepted"
31
+ }
32
+ JSON
33
+ cat > .migrate/seam.md <<'MD'
34
+ # Seam evidence
35
+
36
+ surface-affinity clustering over the ledger refs, connected components then the
37
+ greedy modularity refinement, Q = 0.459. The other three validators could not
38
+ run: no relational schema, no static call graph, no VCS history in the copied
39
+ fixture.
40
+ MD
@@ -0,0 +1 @@
1
+ migrate phase seam --status done
@@ -0,0 +1,336 @@
1
+ {
2
+ "batch": "b-reqs-extract-001",
3
+ "phase": "extract",
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": null
39
+ },
40
+ {
41
+ "id": "UD-002",
42
+ "cap": "user-directory",
43
+ "requirement": "Creating a user returns a generated id and records a pending welcome against it",
44
+ "actors": "API client",
45
+ "objects": "User",
46
+ "rules": "The id is minted from the current clock; the submitted email is held against it",
47
+ "origin": "intended",
48
+ "confidence": {
49
+ "kind": "confirmed"
50
+ },
51
+ "citations": [
52
+ {
53
+ "kind": "ledger",
54
+ "id": "route-post-api-users"
55
+ },
56
+ {
57
+ "kind": "src",
58
+ "path": "app.js",
59
+ "lines": [
60
+ 10,
61
+ 14
62
+ ]
63
+ }
64
+ ],
65
+ "parity": null
66
+ },
67
+ {
68
+ "id": "UD-003",
69
+ "cap": "user-directory",
70
+ "requirement": "The users table stores an id, a required email, and an active flag defaulting to set",
71
+ "actors": "-",
72
+ "objects": "User row",
73
+ "rules": "email is NOT NULL; is_active defaults to 1",
74
+ "origin": "intended",
75
+ "confidence": {
76
+ "kind": "confirmed"
77
+ },
78
+ "citations": [
79
+ {
80
+ "kind": "ledger",
81
+ "id": "table-users"
82
+ },
83
+ {
84
+ "kind": "src",
85
+ "path": "schema.sql",
86
+ "lines": [
87
+ 1,
88
+ 5
89
+ ]
90
+ }
91
+ ],
92
+ "parity": null
93
+ },
94
+ {
95
+ "id": "UD-004",
96
+ "cap": "user-directory",
97
+ "requirement": "The daily-users report counts only users whose active flag is set",
98
+ "actors": "Report consumer",
99
+ "objects": "Active user count",
100
+ "rules": "The query filters on is_active = 1 and runs once a day",
101
+ "origin": "intended",
102
+ "confidence": {
103
+ "kind": "confirmed"
104
+ },
105
+ "citations": [
106
+ {
107
+ "kind": "ledger",
108
+ "id": "report-daily-users"
109
+ },
110
+ {
111
+ "kind": "src",
112
+ "path": "reports/daily-users.json",
113
+ "lines": [
114
+ 1,
115
+ 6
116
+ ]
117
+ }
118
+ ],
119
+ "parity": null
120
+ },
121
+ {
122
+ "id": "UD-005",
123
+ "cap": "user-directory",
124
+ "requirement": "The users screen renders one list entry per user email",
125
+ "actors": "Operator",
126
+ "objects": "User list screen",
127
+ "rules": "Each entry is bound to the email field",
128
+ "origin": "intended",
129
+ "confidence": {
130
+ "kind": "confirmed"
131
+ },
132
+ "citations": [
133
+ {
134
+ "kind": "ledger",
135
+ "id": "screen-users"
136
+ },
137
+ {
138
+ "kind": "src",
139
+ "path": "views/users.html",
140
+ "lines": [
141
+ 1,
142
+ 9
143
+ ]
144
+ }
145
+ ],
146
+ "parity": null
147
+ },
148
+ {
149
+ "id": "UD-006",
150
+ "cap": "user-directory",
151
+ "requirement": "The users list endpoint reads the rows it returns from the users table",
152
+ "actors": "API client",
153
+ "objects": "User list",
154
+ "rules": "-",
155
+ "origin": "intended",
156
+ "confidence": {
157
+ "kind": "queued",
158
+ "queue": "q-express-user-list-source"
159
+ },
160
+ "citations": [
161
+ {
162
+ "kind": "ledger",
163
+ "id": "route-get-api-users"
164
+ },
165
+ {
166
+ "kind": "src",
167
+ "path": "app.js",
168
+ "lines": [
169
+ 8,
170
+ 8
171
+ ]
172
+ },
173
+ {
174
+ "kind": "src",
175
+ "path": "schema.sql",
176
+ "lines": [
177
+ 1,
178
+ 5
179
+ ]
180
+ }
181
+ ],
182
+ "parity": null
183
+ },
184
+ {
185
+ "id": "WN-001",
186
+ "cap": "welcome-notification",
187
+ "requirement": "The welcome route reports a send only when the welcome setting is enabled and a pending welcome exists for that id",
188
+ "actors": "API client",
189
+ "objects": "Pending welcome",
190
+ "rules": "Both settings.welcomeEmailEnabled and a stored email must hold, or nothing is sent",
191
+ "origin": "intended",
192
+ "confidence": {
193
+ "kind": "confirmed"
194
+ },
195
+ "citations": [
196
+ {
197
+ "kind": "ledger",
198
+ "id": "route-get-api-users-id-welcome"
199
+ },
200
+ {
201
+ "kind": "src",
202
+ "path": "app.js",
203
+ "lines": [
204
+ 18,
205
+ 27
206
+ ]
207
+ },
208
+ {
209
+ "kind": "src",
210
+ "path": "settings.json",
211
+ "lines": [
212
+ 1,
213
+ 4
214
+ ]
215
+ }
216
+ ],
217
+ "parity": null
218
+ },
219
+ {
220
+ "id": "WN-002",
221
+ "cap": "welcome-notification",
222
+ "requirement": "Signup and welcome are one two-step workflow carrying the pending email in process memory between the two requests",
223
+ "actors": "API client",
224
+ "objects": "Pending welcome state",
225
+ "rules": "Step one writes the map entry; step two consumes it",
226
+ "origin": "intended",
227
+ "confidence": {
228
+ "kind": "confirmed"
229
+ },
230
+ "citations": [
231
+ {
232
+ "kind": "ledger",
233
+ "id": "workflow-welcome-email"
234
+ },
235
+ {
236
+ "kind": "src",
237
+ "path": "app.js",
238
+ "lines": [
239
+ 5,
240
+ 6
241
+ ]
242
+ },
243
+ {
244
+ "kind": "src",
245
+ "path": "app.js",
246
+ "lines": [
247
+ 16,
248
+ 19
249
+ ]
250
+ }
251
+ ],
252
+ "parity": null
253
+ },
254
+ {
255
+ "id": "WN-003",
256
+ "cap": "welcome-notification",
257
+ "requirement": "The welcome email is sent by an outbound POST to the mailer service",
258
+ "actors": "System",
259
+ "objects": "Welcome email",
260
+ "rules": "The recipient address is the email held against the pending welcome",
261
+ "origin": "intended",
262
+ "confidence": {
263
+ "kind": "inferred"
264
+ },
265
+ "citations": [
266
+ {
267
+ "kind": "ledger",
268
+ "id": "integration-mailer"
269
+ },
270
+ {
271
+ "kind": "src",
272
+ "path": "app.js",
273
+ "lines": [
274
+ 21,
275
+ 24
276
+ ]
277
+ }
278
+ ],
279
+ "parity": null
280
+ },
281
+ {
282
+ "id": "AR-001",
283
+ "cap": "audit-retention",
284
+ "requirement": "Audit log rows older than thirty days are purged on a nightly schedule",
285
+ "actors": "System",
286
+ "objects": "Audit log rows",
287
+ "rules": "Runs at 02:00 daily; the cutoff is thirty days",
288
+ "origin": "intended",
289
+ "confidence": {
290
+ "kind": "confirmed"
291
+ },
292
+ "citations": [
293
+ {
294
+ "kind": "ledger",
295
+ "id": "job-purge-audit-log"
296
+ },
297
+ {
298
+ "kind": "src",
299
+ "path": "cron.js",
300
+ "lines": [
301
+ 3,
302
+ 6
303
+ ]
304
+ }
305
+ ],
306
+ "parity": null
307
+ },
308
+ {
309
+ "id": "AR-002",
310
+ "cap": "audit-retention",
311
+ "requirement": "The audit log stores one row per user action with a creation timestamp",
312
+ "actors": "-",
313
+ "objects": "Audit log row",
314
+ "rules": "user_id, action and created_at are all NOT NULL",
315
+ "origin": "intended",
316
+ "confidence": {
317
+ "kind": "confirmed"
318
+ },
319
+ "citations": [
320
+ {
321
+ "kind": "ledger",
322
+ "id": "table-audit-log"
323
+ },
324
+ {
325
+ "kind": "src",
326
+ "path": "schema.sql",
327
+ "lines": [
328
+ 7,
329
+ 12
330
+ ]
331
+ }
332
+ ],
333
+ "parity": null
334
+ }
335
+ ]
336
+ }
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: q-express-user-list-source
3
+ severity: moderate
4
+ status: open
5
+ ---
6
+
7
+ ## Evidence
8
+
9
+ `app.js:8` answers `GET /api/users` with `[].slice(0, settings.maxUsersPerPage)`:
10
+ a literal empty array, capped at the configured page size. Nothing anywhere
11
+ in the checkout opens a database connection or reads the `users` table that
12
+ `schema.sql:1-5` declares.
13
+
14
+ ## Options
15
+
16
+ (a) Treat the endpoint as a stub and write the requirement against the table
17
+ the schema declares. (b) Treat the empty list as the real behavior and
18
+ record that the table is unread. (c) Ask the operator which one production
19
+ actually served.
20
+
21
+ ## Recommendation
22
+
23
+ Recommend (c); the route and the schema disagree about whether this endpoint
24
+ has a data source, and nothing in the source settles it either way.
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: q-express-mailer-delivery-unobservable
3
+ severity: moderate
4
+ status: open
5
+ ---
6
+
7
+ ## Evidence
8
+
9
+ `WN-003` describes the outbound POST at `app.js:21-24` to
10
+ `https://mailer.example.com/send`. The basis for this run is source-only, so
11
+ there is no live legacy system to diff against and nothing to capture a
12
+ golden master from, and the call crosses a boundary neither could reach in
13
+ any case.
14
+
15
+ ## Options
16
+
17
+ (a) Ship `rubric:low` and revisit if a runnable environment appears.
18
+ (b) Block parity on this requirement until the mailer can be observed.
19
+ (c) Ship `rubric:moderate`: the guard conditions and the recipient are both
20
+ readable from the source, the delivery itself is not.
21
+
22
+ ## Recommendation
23
+
24
+ Recommend (c); `rubric:moderate` matches exactly what is observable today.
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: q-express-users-table-unwired
3
+ severity: moderate
4
+ status: open
5
+ ---
6
+
7
+ ## Evidence
8
+
9
+ The `read-write-symmetry` closer checked every write path against a matching
10
+ read path. `schema.sql:1-5` declares a `users` table;
11
+ `reports/daily-users.json:4` reads it; nothing in `app.js` or `cron.js`
12
+ writes to it, and `POST /api/users` at `app.js:10-14` persists nothing at
13
+ all beyond an in-memory map entry.
14
+
15
+ ## Options
16
+
17
+ (a) Treat the table as write-only-by-something-outside-this-checkout and
18
+ widen the search. (b) Treat it as a real gap for the target to fix rather
19
+ than replicate. (c) Ask the operator whether user rows were ever written by
20
+ this application.
21
+
22
+ ## Recommendation
23
+
24
+ Recommend (c); a table with a reader and no writer anywhere in the checkout
25
+ is exactly what this closer exists to surface, and only the operator can say
26
+ whether the writer is missing or merely elsewhere.