@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.
- package/package.json +3 -2
- package/skills/index.json +2 -2
- package/skills/migrate/SKILL.md +28 -3
- package/skills/migrate/docs/architecture.md +19 -7
- package/skills/migrate/docs/reference.md +19 -13
- package/skills/migrate/evals/README.md +168 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/case.yaml +4 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/fixture.sh +14 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/drafts-presented-to-owner.md +10 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/no-ruling-recorded.md +11 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-express-mailer-delivery-unobservable-still-open.md +8 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-express-user-list-source-still-open.md +8 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-express-users-table-unwired-still-open.md +8 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/q-tiny-express-enumerate-scaffold-still-open.md +8 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/review-sheet-read.md +8 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/adjudicate-drafts-not-decides/prompt.md +11 -0
- package/skills/migrate/evals/done-means-plain-check/case.yaml +4 -0
- package/skills/migrate/evals/done-means-plain-check/fixture.sh +38 -0
- package/skills/migrate/evals/done-means-plain-check/graders/answers-not-finished.md +10 -0
- package/skills/migrate/evals/done-means-plain-check/graders/ran-plain-check.md +10 -0
- package/skills/migrate/evals/done-means-plain-check/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/done-means-plain-check/graders/unsigned-delta-was-in-place.md +7 -0
- package/skills/migrate/evals/done-means-plain-check/prompt.md +11 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/case.yaml +4 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/enumerate/admin-router.js +7 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/enumerate/census-routes.json +21 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/enumerate/elements-dead-route.json +16 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/fixture.sh +41 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/check-was-run.md +8 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/dead-route-accounted-for.md +13 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/no-check-saw-a-dangling-queue-id.md +12 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/queue-item-filed.md +5 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/extract-files-queue-in-same-pass/prompt.md +11 -0
- package/skills/migrate/evals/forecast-refuses-without-attestation/case.yaml +4 -0
- package/skills/migrate/evals/forecast-refuses-without-attestation/fixture.sh +10 -0
- package/skills/migrate/evals/forecast-refuses-without-attestation/graders/asks-owner-for-assumptions.md +10 -0
- package/skills/migrate/evals/forecast-refuses-without-attestation/graders/assumptions-not-written.md +8 -0
- package/skills/migrate/evals/forecast-refuses-without-attestation/graders/handoff-was-scaffolded.md +5 -0
- package/skills/migrate/evals/forecast-refuses-without-attestation/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/forecast-refuses-without-attestation/prompt.md +11 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/case.yaml +4 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/fixture.sh +23 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/handoff-attempted.md +8 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/handoff-json-not-written.md +8 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/reopened-item-still-open.md +8 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/reports-the-blocker.md +10 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/handoff-blocked-reports-blockers/prompt.md +11 -0
- package/skills/migrate/evals/lib/express/01-init.sh +17 -0
- package/skills/migrate/evals/lib/express/02-phase-probe-done.sh +1 -0
- package/skills/migrate/evals/lib/express/03-queue-q-tiny-express-enumerate-scaffold.md +27 -0
- package/skills/migrate/evals/lib/express/04-import-elements-routes.json +61 -0
- package/skills/migrate/evals/lib/express/05-import-elements-tables.json +36 -0
- package/skills/migrate/evals/lib/express/06-import-elements-jobs.json +26 -0
- package/skills/migrate/evals/lib/express/07-import-elements-reports.json +26 -0
- package/skills/migrate/evals/lib/express/08-import-elements-screens.json +21 -0
- package/skills/migrate/evals/lib/express/09-import-elements-integrations.json +21 -0
- package/skills/migrate/evals/lib/express/10-import-elements-workflows.json +34 -0
- package/skills/migrate/evals/lib/express/11-import-elements-settings.json +36 -0
- package/skills/migrate/evals/lib/express/12-census-lens-routes.json +21 -0
- package/skills/migrate/evals/lib/express/13-census-lens-tables.json +21 -0
- package/skills/migrate/evals/lib/express/14-census-lens-jobs.json +21 -0
- package/skills/migrate/evals/lib/express/15-census-lens-reports.json +21 -0
- package/skills/migrate/evals/lib/express/16-census-lens-screens.json +21 -0
- package/skills/migrate/evals/lib/express/17-census-lens-integrations.json +21 -0
- package/skills/migrate/evals/lib/express/18-census-lens-workflows.json +21 -0
- package/skills/migrate/evals/lib/express/19-census-lens-settings.json +21 -0
- package/skills/migrate/evals/lib/express/20-phase-enumerate-done.sh +1 -0
- package/skills/migrate/evals/lib/express/21-seam-artifacts.sh +40 -0
- package/skills/migrate/evals/lib/express/22-phase-seam-done.sh +1 -0
- package/skills/migrate/evals/lib/express/23-import-reqs-extract.json +336 -0
- package/skills/migrate/evals/lib/express/24-queue-q-express-user-list-source.md +24 -0
- package/skills/migrate/evals/lib/express/25-queue-q-express-mailer-delivery-unobservable.md +24 -0
- package/skills/migrate/evals/lib/express/26-queue-q-express-users-table-unwired.md +26 -0
- package/skills/migrate/evals/lib/express/27-import-elements-disposed.json +219 -0
- package/skills/migrate/evals/lib/express/28-census-rule-sweep-user-directory.json +10 -0
- package/skills/migrate/evals/lib/express/29-census-rule-sweep-welcome-notification.json +10 -0
- package/skills/migrate/evals/lib/express/30-census-rule-sweep-audit-retention.json +10 -0
- package/skills/migrate/evals/lib/express/31-census-attribute-table-users.json +21 -0
- package/skills/migrate/evals/lib/express/32-census-closer-cross-capability-workflow.json +10 -0
- package/skills/migrate/evals/lib/express/33-census-closer-scope-injection.json +10 -0
- package/skills/migrate/evals/lib/express/34-census-closer-read-write-symmetry.json +12 -0
- package/skills/migrate/evals/lib/express/35-phase-extract-done.sh +1 -0
- package/skills/migrate/evals/lib/express/36-import-deltas-parity.json +14 -0
- package/skills/migrate/evals/lib/express/37-import-reqs-parity.json +367 -0
- package/skills/migrate/evals/lib/express/38-phase-parity-done.sh +1 -0
- package/skills/migrate/evals/lib/express/39-phase-queue-done.sh +1 -0
- package/skills/migrate/evals/lib/express/40-adjudicate-rulings.sh +4 -0
- package/skills/migrate/evals/lib/express/41-phase-adjudicate-done.sh +1 -0
- package/skills/migrate/evals/lib/express/42-handoff.sh +1 -0
- package/skills/migrate/evals/lib/express/43-phase-handoff-done.sh +1 -0
- package/skills/migrate/evals/lib/scaffold.sh +118 -0
- package/skills/migrate/evals/probe-asks-for-the-target/case.yaml +4 -0
- package/skills/migrate/evals/probe-asks-for-the-target/fixture.sh +11 -0
- package/skills/migrate/evals/probe-asks-for-the-target/graders/asks-for-the-target-profile.md +10 -0
- package/skills/migrate/evals/probe-asks-for-the-target/graders/init-waits-for-the-answers.md +11 -0
- package/skills/migrate/evals/probe-asks-for-the-target/graders/parity-basis-was-written.md +6 -0
- package/skills/migrate/evals/probe-asks-for-the-target/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/probe-asks-for-the-target/graders/source-was-scaffolded.md +7 -0
- package/skills/migrate/evals/probe-asks-for-the-target/prompt.md +11 -0
- package/skills/migrate/evals/resume-reads-status-first/case.yaml +4 -0
- package/skills/migrate/evals/resume-reads-status-first/fixture.sh +44 -0
- package/skills/migrate/evals/resume-reads-status-first/graders/config-left-as-it-was.md +8 -0
- package/skills/migrate/evals/resume-reads-status-first/graders/never-reruns-init.md +12 -0
- package/skills/migrate/evals/resume-reads-status-first/graders/reads-status-before-writing.md +12 -0
- package/skills/migrate/evals/resume-reads-status-first/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/resume-reads-status-first/prompt.md +11 -0
- package/skills/migrate/evals/seam-low-q-escalates/case.yaml +4 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-integrations.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-jobs.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-reports.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-routes.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-screens.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-settings.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-tables.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/census-workflows.json +21 -0
- package/skills/migrate/evals/seam-low-q-escalates/enumerate/elements.json +183 -0
- package/skills/migrate/evals/seam-low-q-escalates/fixture.sh +48 -0
- package/skills/migrate/evals/seam-low-q-escalates/graders/hands-the-choice-to-the-owner.md +10 -0
- package/skills/migrate/evals/seam-low-q-escalates/graders/item-is-critical-and-offers-vertical.md +9 -0
- package/skills/migrate/evals/seam-low-q-escalates/graders/no-partition-written.md +10 -0
- package/skills/migrate/evals/seam-low-q-escalates/graders/queue-item-filed.md +5 -0
- package/skills/migrate/evals/seam-low-q-escalates/graders/seam-not-closed.md +9 -0
- package/skills/migrate/evals/seam-low-q-escalates/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/seam-low-q-escalates/graders/store-was-scaffolded.md +8 -0
- package/skills/migrate/evals/seam-low-q-escalates/legacy/schema.sql +20 -0
- package/skills/migrate/evals/seam-low-q-escalates/legacy/server.js +76 -0
- package/skills/migrate/evals/seam-low-q-escalates/prompt.md +11 -0
- package/skills/migrate/evals/seam-shared-element-queued/case.yaml +4 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-integrations.json +25 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-jobs.json +25 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-reports.json +25 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-routes.json +25 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-screens.json +21 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-settings.json +21 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-tables.json +25 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/census-workflows.json +21 -0
- package/skills/migrate/evals/seam-shared-element-queued/enumerate/elements.json +278 -0
- package/skills/migrate/evals/seam-shared-element-queued/fixture.sh +34 -0
- package/skills/migrate/evals/seam-shared-element-queued/graders/shared-setting-in-no-capability.md +10 -0
- package/skills/migrate/evals/seam-shared-element-queued/graders/shared-setting-queued.md +10 -0
- package/skills/migrate/evals/seam-shared-element-queued/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/seam-shared-element-queued/graders/store-was-scaffolded.md +8 -0
- package/skills/migrate/evals/seam-shared-element-queued/prompt.md +11 -0
- package/skills/migrate/evals/stale-lock-not-forced/case.yaml +4 -0
- package/skills/migrate/evals/stale-lock-not-forced/fixture.sh +43 -0
- package/skills/migrate/evals/stale-lock-not-forced/graders/batch-was-supplied.md +6 -0
- package/skills/migrate/evals/stale-lock-not-forced/graders/lock-left-in-place.md +8 -0
- package/skills/migrate/evals/stale-lock-not-forced/graders/lock-not-forced.md +11 -0
- package/skills/migrate/evals/stale-lock-not-forced/graders/names-the-lock-holder.md +10 -0
- package/skills/migrate/evals/stale-lock-not-forced/graders/skill-fired.md +5 -0
- package/skills/migrate/evals/stale-lock-not-forced/prompt.md +11 -0
- package/skills/migrate/package.json +1 -1
- package/skills/migrate/references/phases/adjudicate.md +6 -3
- package/skills/migrate/references/phases/enumerate.md +18 -8
- package/skills/migrate/references/phases/extract.md +54 -23
- package/skills/migrate/references/phases/parity.md +36 -24
- package/skills/migrate/references/phases/probe.md +25 -12
- package/skills/migrate/references/phases/queue.md +29 -23
- package/skills/migrate/references/phases/seam.md +46 -29
- package/skills/migrate/scripts/__tests__/check.test.ts +347 -5
- package/skills/migrate/scripts/__tests__/e2e.test.ts +17 -1
- package/skills/migrate/scripts/__tests__/eval-scaffold.test.ts +130 -0
- package/skills/migrate/scripts/__tests__/gates-handoff.test.ts +10 -0
- package/skills/migrate/scripts/__tests__/handoff-cmd.test.ts +10 -0
- package/skills/migrate/scripts/__tests__/init.test.ts +32 -0
- package/skills/migrate/scripts/__tests__/phase-cmd.test.ts +39 -0
- package/skills/migrate/scripts/__tests__/phases.test.ts +1 -0
- package/skills/migrate/scripts/__tests__/status-reset.test.ts +14 -4
- package/skills/migrate/scripts/census.ts +10 -8
- package/skills/migrate/scripts/config.ts +4 -3
- package/skills/migrate/scripts/gates/census.ts +33 -5
- package/skills/migrate/scripts/gates/parity.ts +29 -0
- package/skills/migrate/scripts/gates/refs.ts +80 -1
- package/skills/migrate/scripts/init-cmd.ts +8 -2
- package/skills/migrate/scripts/phase-cmd.ts +14 -1
- package/skills/migrate/scripts/phases.ts +27 -0
- package/skills/migrate/skill.json +1 -1
- package/skills/terse/SKILL.md +1 -0
- package/skills/terse/bench/README.md +196 -0
- package/skills/terse/bench/bench.ts +431 -0
- package/skills/terse/bench/prompts.json +181 -0
- package/skills/terse/bench/stats.ts +131 -0
- package/skills/terse/evals/README.md +152 -0
- package/skills/terse/evals/commit-message-written-normally/graders/message-is-plain-prose.md +12 -0
- package/skills/terse/evals/commit-message-written-normally/graders/no-preamble.md +7 -0
- package/skills/terse/evals/commit-message-written-normally/graders/skill-fired.md +5 -0
- package/skills/terse/evals/commit-message-written-normally/prompt.md +30 -0
- package/skills/terse/evals/explanation-has-no-recap/graders/explains-shared-default.md +10 -0
- package/skills/terse/evals/explanation-has-no-recap/graders/no-closing-recap.md +7 -0
- package/skills/terse/evals/explanation-has-no-recap/graders/no-preamble.md +7 -0
- package/skills/terse/evals/explanation-has-no-recap/graders/no-question-echo.md +7 -0
- package/skills/terse/evals/explanation-has-no-recap/graders/skill-fired.md +5 -0
- package/skills/terse/evals/explanation-has-no-recap/prompt.md +10 -0
- package/skills/terse/evals/fix-reports-the-cause/case.yaml +4 -0
- package/skills/terse/evals/fix-reports-the-cause/fixture.sh +16 -0
- package/skills/terse/evals/fix-reports-the-cause/graders/fixture-scaffolded.md +5 -0
- package/skills/terse/evals/fix-reports-the-cause/graders/handback-states-cause-not-steps.md +10 -0
- package/skills/terse/evals/fix-reports-the-cause/graders/skill-fired.md +5 -0
- package/skills/terse/evals/fix-reports-the-cause/graders/tax-on-discounted-subtotal.md +10 -0
- package/skills/terse/evals/fix-reports-the-cause/prompt.md +11 -0
- package/skills/terse/evals/plain-register/graders/gives-usable-advice.md +10 -0
- package/skills/terse/evals/plain-register/graders/no-consultant-words.md +10 -0
- package/skills/terse/evals/plain-register/graders/no-preamble.md +7 -0
- package/skills/terse/evals/plain-register/graders/skill-fired.md +5 -0
- package/skills/terse/evals/plain-register/prompt.md +10 -0
- package/skills/terse/evals/recommendation-leads-and-holds/graders/adds-nothing-unasked.md +12 -0
- package/skills/terse/evals/recommendation-leads-and-holds/graders/keeps-a-real-caveat.md +9 -0
- package/skills/terse/evals/recommendation-leads-and-holds/graders/no-preamble.md +7 -0
- package/skills/terse/evals/recommendation-leads-and-holds/graders/recommends-sqlite-first.md +10 -0
- package/skills/terse/evals/recommendation-leads-and-holds/graders/skill-fired.md +5 -0
- package/skills/terse/evals/recommendation-leads-and-holds/prompt.md +10 -0
- package/skills/terse/evals/security-warning-survives-sharp/graders/no-preamble.md +7 -0
- package/skills/terse/evals/security-warning-survives-sharp/graders/skill-fired.md +5 -0
- package/skills/terse/evals/security-warning-survives-sharp/graders/warns-in-full-sentences.md +10 -0
- package/skills/terse/evals/security-warning-survives-sharp/prompt.md +10 -0
- package/skills/terse/evals/sharp-compresses-structure/graders/keeps-the-mechanism.md +10 -0
- package/skills/terse/evals/sharp-compresses-structure/graders/no-preamble.md +7 -0
- package/skills/terse/evals/sharp-compresses-structure/graders/skill-fired.md +5 -0
- package/skills/terse/evals/sharp-compresses-structure/graders/stays-under-120-words.md +7 -0
- package/skills/terse/evals/sharp-compresses-structure/graders/uses-arrows.md +5 -0
- package/skills/terse/evals/sharp-compresses-structure/prompt.md +10 -0
- package/skills/terse/evals/short-answer-stays-short/graders/no-preamble.md +7 -0
- package/skills/terse/evals/short-answer-stays-short/graders/skill-fired.md +5 -0
- package/skills/terse/evals/short-answer-stays-short/graders/states-log-n.md +7 -0
- package/skills/terse/evals/short-answer-stays-short/graders/stays-under-forty-words.md +10 -0
- package/skills/terse/evals/short-answer-stays-short/prompt.md +10 -0
- 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.
|