@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,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,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 @@
|
|
|
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
|