@1aboveio/skills 1.0.9 → 1.0.11

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 (213) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/.codex-plugin/resources.json +297 -216
  3. package/README.md +3 -3
  4. package/package.json +10 -8
  5. package/skills/app-dev/airflow/SKILL.md +1 -1
  6. package/skills/app-dev/android-foundation/SKILL.md +35 -37
  7. package/skills/app-dev/android-foundation/references/delivery-focus.md +4 -2
  8. package/skills/app-dev/android-foundation/references/feature-work.md +50 -0
  9. package/skills/app-dev/android-foundation/references/setup.md +24 -9
  10. package/skills/app-dev/android-foundation/references/workspace.md +81 -0
  11. package/skills/app-dev/android-foundation/scripts/workspace-runtime/bin/workspaces.mjs +52 -0
  12. package/skills/app-dev/android-foundation/scripts/workspace-runtime/native-workspace.mjs +239 -0
  13. package/skills/app-dev/android-foundation/scripts/workspace-runtime/workspace-lifecycle.mjs +2154 -0
  14. package/skills/app-dev/app-debug/SKILL.md +1 -1
  15. package/skills/app-dev/better-auth/SKILL.md +1 -1
  16. package/skills/app-dev/data-catalog/SKILL.md +1 -1
  17. package/skills/app-dev/data-quality/SKILL.md +1 -1
  18. package/skills/app-dev/ios-foundation/SKILL.md +15 -10
  19. package/skills/app-dev/ios-foundation/references/setup.md +25 -9
  20. package/skills/app-dev/ios-foundation/references/workspace.md +82 -0
  21. package/skills/app-dev/ios-foundation/scripts/workspace-runtime/bin/workspaces.mjs +52 -0
  22. package/skills/app-dev/ios-foundation/scripts/workspace-runtime/native-workspace.mjs +239 -0
  23. package/skills/app-dev/ios-foundation/scripts/workspace-runtime/workspace-lifecycle.mjs +2154 -0
  24. package/skills/app-dev/monorepo/SKILL.md +1 -1
  25. package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
  26. package/skills/app-dev/prisma-setup/SKILL.md +1 -1
  27. package/skills/app-dev/pyspark/SKILL.md +1 -1
  28. package/skills/app-dev/python-backend/SKILL.md +1 -1
  29. package/skills/app-dev/shadcn/SKILL.md +1 -1
  30. package/skills/app-dev/zod-v4/SKILL.md +1 -1
  31. package/skills/cicd/cloud-build/SKILL.md +1 -1
  32. package/skills/cicd/cloud-debug/SKILL.md +1 -1
  33. package/skills/cicd/cloud-deploy/SKILL.md +1 -1
  34. package/skills/cicd/docker/SKILL.md +1 -1
  35. package/skills/cicd/github-actions/SKILL.md +1 -1
  36. package/skills/cicd/github-flow/SKILL.md +1 -1
  37. package/skills/cicd/google-cloud/SKILL.md +1 -1
  38. package/skills/cicd/mergify/SKILL.md +1 -1
  39. package/skills/cicd/podman/SKILL.md +1 -1
  40. package/skills/content/article-review/SKILL.md +1 -1
  41. package/skills/content/article-to-image/SKILL.md +1 -1
  42. package/skills/content/flowchart-svg/SKILL.md +1 -1
  43. package/skills/content/image-gen/SKILL.md +1 -1
  44. package/skills/content/mermaid/SKILL.md +1 -1
  45. package/skills/content/wechat-article-writer/SKILL.md +1 -1
  46. package/skills/content/wechat-publisher/SKILL.md +1 -1
  47. package/skills/content/wechat-search/SKILL.md +1 -1
  48. package/skills/content/xai-search/SKILL.md +1 -1
  49. package/skills/core/distill-writing/SKILL.md +3 -3
  50. package/skills/core/distill-writing/references/extraction.md +1 -1
  51. package/skills/core/doc-to-md/SKILL.md +1 -1
  52. package/skills/core/editorial-review/SKILL.md +82 -12
  53. package/skills/core/editorial-review/references/checklist.md +26 -1
  54. package/skills/core/house-style/SKILL.md +8 -3
  55. package/skills/core/house-style/references/analytical-reporting.md +123 -0
  56. package/skills/core/house-style/references/analytical-writing-patterns.md +79 -0
  57. package/skills/core/house-style/references/analytical-writing-research.md +129 -0
  58. package/skills/core/{write-doc → house-style}/references/bilingual.md +7 -5
  59. package/skills/core/house-style/references/definitions-and-metrics.md +86 -0
  60. package/skills/core/house-style/references/document-workflow.md +193 -0
  61. package/skills/core/house-style/references/initialization.md +66 -0
  62. package/skills/core/house-style/references/persistence.md +9 -4
  63. package/skills/core/house-style/references/rules.md +11 -4
  64. package/skills/core/house-style/scripts/init-guidance.mjs +213 -0
  65. package/skills/core/house-style/templates/analytical-report.md +54 -0
  66. package/skills/core/house-style/templates/gap-analysis.md +1 -1
  67. package/skills/core/plain-language/SKILL.md +2 -2
  68. package/skills/core/polish-cn/SKILL.md +9 -2
  69. package/skills/core/reg-parser/SKILL.md +3 -3
  70. package/skills/core/terminology/SKILL.md +8 -4
  71. package/skills/core/write-doc/SKILL.md +40 -151
  72. package/skills/core/write-report/SKILL.md +129 -0
  73. package/skills/core/{write-doc → write-report}/references/compliance-reports.md +4 -4
  74. package/skills/engineering/better-review/SKILL.md +37 -37
  75. package/skills/engineering/better-review/references/passes.md +35 -41
  76. package/skills/engineering/better-review/references/result.md +10 -9
  77. package/skills/engineering/e2e-test/SKILL.md +17 -17
  78. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +11 -13
  79. package/skills/engineering/e2e-test/references/presentation-sweep.md +7 -7
  80. package/skills/engineering/e2e-test/references/reviewing.md +9 -11
  81. package/skills/engineering/e2e-test/references/route-manifest.md +1 -1
  82. package/skills/engineering/engineering/SKILL.md +124 -0
  83. package/skills/engineering/engineering/references/engineering-conventions.md +32 -0
  84. package/skills/engineering/engineering/references/feature-delivery.md +8 -0
  85. package/skills/engineering/engineering/references/init-scope.md +37 -0
  86. package/skills/engineering/engineering/scripts/init.mjs +160 -0
  87. package/skills/engineering/{contributing → engineering}/scripts/persist-conventions.mjs +1 -1
  88. package/skills/engineering/engineering-runtime/SKILL.md +1 -1
  89. package/skills/engineering/engineering-runtime/coherence/workflow.json +19 -19
  90. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +1 -1
  91. package/skills/engineering/ensure-coverage/SKILL.md +22 -109
  92. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +7 -5
  93. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +4 -4
  94. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +3 -3
  95. package/skills/engineering/ensure-coverage/references/depth/characterization.md +4 -65
  96. package/skills/engineering/ensure-coverage/references/depth/grading.md +5 -7
  97. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +6 -12
  98. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +1 -1
  99. package/skills/engineering/ensure-coverage/references/presentation/axis.md +6 -6
  100. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +7 -23
  101. package/skills/engineering/ensure-coverage/references/process/output-template.md +18 -133
  102. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +7 -12
  103. package/skills/engineering/ensure-coverage/scripts/README.md +12 -4
  104. package/skills/engineering/golden-path/SKILL.md +1 -1
  105. package/skills/engineering/harness-runtime/SKILL.md +3 -1
  106. package/skills/engineering/harness-runtime/bin/workspaces.mjs +52 -0
  107. package/skills/engineering/harness-runtime/native-workspace.mjs +239 -0
  108. package/skills/engineering/harness-runtime/references/workspaces.md +78 -0
  109. package/skills/engineering/harness-runtime/workspace-lifecycle.mjs +2154 -0
  110. package/skills/engineering/resolve-issues/SKILL.md +40 -61
  111. package/skills/engineering/resolve-issues/references/ci.md +13 -3
  112. package/skills/engineering/resolve-issues/references/delivery-progress.md +4 -3
  113. package/skills/engineering/resolve-issues/references/done.md +11 -2
  114. package/skills/engineering/resolve-issues/references/expire.md +9 -2
  115. package/skills/engineering/resolve-issues/references/implementation.md +33 -17
  116. package/skills/engineering/resolve-issues/references/preflight.md +3 -1
  117. package/skills/engineering/resolve-issues/references/principles.md +52 -0
  118. package/skills/engineering/resolve-issues/references/review.md +25 -15
  119. package/skills/engineering/resolve-issues/references/task-plan.md +64 -27
  120. package/skills/engineering/resolve-issues/references/workspaces.md +164 -0
  121. package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +185 -317
  122. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +44 -7
  123. package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +36 -2
  124. package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +9 -8
  125. package/skills/engineering/resolve-issues/scripts/workspace-lifecycle.mjs +1 -0
  126. package/skills/engineering/resolve-release/SKILL.md +1 -1
  127. package/skills/engineering/rush-issues/SKILL.md +7 -5
  128. package/skills/engineering/rush-release/SKILL.md +1 -1
  129. package/skills/engineering/test-quality/SKILL.md +19 -4
  130. package/skills/engineering/test-quality/references/lint.md +1 -1
  131. package/skills/engineering/test-quality/references/principles.md +2 -2
  132. package/skills/engineering/test-quality/references/testing-conventions.md +1 -1
  133. package/skills/risk-compliance/compliance-audit/SKILL.md +4 -8
  134. package/skills/risk-compliance/compliance-audit/references/audience-and-reports.md +12 -0
  135. package/skills/risk-compliance/contract-compare/SKILL.md +17 -1
  136. package/skills/risk-compliance/contract-review/SKILL.md +6 -1
  137. package/skills/risk-compliance/contract-review/references/report-stage.md +17 -0
  138. package/skills/risk-compliance/doc-authenticity/SKILL.md +11 -1
  139. package/skills/risk-compliance/fraud-detection/LICENSE +3 -0
  140. package/skills/risk-compliance/fraud-detection/SKILL.md +148 -0
  141. package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/archetypes/first-party-fraud.md +3 -2
  142. package/skills/risk-compliance/fraud-detection/references/archetypes/third-party-fraud.md +47 -0
  143. package/skills/risk-compliance/fraud-detection/references/collection-payout-features.md +151 -0
  144. package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/contexts/bank-transfer.md +4 -3
  145. package/skills/risk-compliance/fraud-detection/references/contexts/card-payment.md +70 -0
  146. package/skills/risk-compliance/fraud-detection/references/contexts/payment-collection.md +34 -0
  147. package/skills/risk-compliance/fraud-detection/references/contexts/payout.md +34 -0
  148. package/skills/risk-compliance/fraud-detection/references/enrichment.md +74 -0
  149. package/skills/risk-compliance/fraud-detection/references/entities.md +48 -0
  150. package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/feature-engineering.md +69 -33
  151. package/skills/risk-compliance/fraud-detection/references/feature-sql.md +150 -0
  152. package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/report-rationale.md +4 -2
  153. package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/report-template.md +45 -23
  154. package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/review-checklist.md +60 -20
  155. package/skills/risk-compliance/fraud-detection/references/workflow.md +216 -0
  156. package/skills/risk-compliance/fraud-detection/release-check.mjs +95 -0
  157. package/skills/risk-compliance/payment-analysis/SKILL.md +36 -17
  158. package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +2 -2
  159. package/skills/risk-compliance/payment-analysis/references/report-template.md +10 -2
  160. package/skills/risk-compliance/payment-analysis/references/visualization.md +11 -1
  161. package/skills/risk-compliance/portfolio-payment-analysis/LICENSE +3 -0
  162. package/skills/risk-compliance/portfolio-payment-analysis/SKILL.md +170 -0
  163. package/skills/risk-compliance/portfolio-payment-analysis/references/identity-and-reconciliation.md +46 -0
  164. package/skills/risk-compliance/portfolio-payment-analysis/references/metrics-and-reporting.md +170 -0
  165. package/skills/risk-compliance/portfolio-payment-analysis/references/risk-history.md +89 -0
  166. package/skills/risk-compliance/portfolio-payment-analysis/release-check.mjs +95 -0
  167. package/skills/risk-compliance/portfolio-payment-analysis/scripts/analyze.py +636 -0
  168. package/skills/risk-compliance/portfolio-payment-analysis/scripts/build_report.py +386 -0
  169. package/skills/risk-compliance/portfolio-payment-analysis/scripts/comparison_charts.py +425 -0
  170. package/skills/risk-compliance/portfolio-payment-analysis/scripts/csv_export.py +52 -0
  171. package/skills/risk-compliance/portfolio-payment-analysis/scripts/render.py +160 -0
  172. package/skills/risk-compliance/portfolio-payment-analysis/scripts/risk_history.py +435 -0
  173. package/skills/risk-compliance/similar-domain/SKILL.md +9 -4
  174. package/skills/risk-compliance/tld-detection/SKILL.md +124 -239
  175. package/skills/risk-compliance/tld-detection/agents/openai.yaml +1 -1
  176. package/skills/risk-compliance/tld-detection/references/clean.md +18 -51
  177. package/skills/risk-compliance/tld-detection/references/fx-conversion.md +56 -219
  178. package/skills/risk-compliance/tld-detection/references/metric-contract.md +109 -0
  179. package/skills/risk-compliance/tld-detection/references/pattern.md +99 -0
  180. package/skills/risk-compliance/tld-detection/references/report-template.md +49 -272
  181. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +46 -13
  182. package/skills/risk-compliance/tld-detection/scripts/detect_patterns.py +346 -0
  183. package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +51 -19
  184. package/skills/risk-compliance/tld-detection/scripts/profile_groups.py +109 -0
  185. package/skills/risk-compliance/tld-detection/scripts/render_charts.py +218 -0
  186. package/skills/risk-compliance/tld-detection/scripts/tld_common.py +243 -0
  187. package/skills/engineering/contributing/SKILL.md +0 -70
  188. package/skills/risk-compliance/fraud-analysis/SKILL.md +0 -114
  189. package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +0 -27
  190. package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +0 -30
  191. package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +0 -20
  192. package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +0 -20
  193. package/skills/risk-compliance/fraud-analysis/references/workflow.md +0 -175
  194. package/skills/risk-compliance/tld-detection/references/chinese-polish.md +0 -55
  195. package/skills/risk-compliance/tld-detection/references/clustering.md +0 -235
  196. package/skills/risk-compliance/tld-detection/references/decision.md +0 -189
  197. package/skills/risk-compliance/tld-detection/references/streams.md +0 -141
  198. package/skills/risk-compliance/tld-detection/references/terminology.md +0 -95
  199. package/skills/risk-compliance/tld-detection/references/workflow.md +0 -95
  200. /package/skills/{engineering/contributing → core/write-report}/LICENSE +0 -0
  201. /package/skills/core/{write-doc → write-report}/references/reports/audit-report-template.md +0 -0
  202. /package/skills/core/{write-doc → write-report}/references/reports/external-assessment-template.md +0 -0
  203. /package/skills/core/{write-doc → write-report}/references/reports/management-report-template.md +0 -0
  204. /package/skills/core/{write-doc → write-report}/references/reports/vars-report-template.md +0 -0
  205. /package/skills/{engineering/contributing → core/write-report}/release-check.mjs +0 -0
  206. /package/skills/{risk-compliance/fraud-analysis → engineering/engineering}/LICENSE +0 -0
  207. /package/skills/engineering/{contributing → engineering}/references/tracker-conventions.md +0 -0
  208. /package/skills/{risk-compliance/fraud-analysis → engineering/engineering}/release-check.mjs +0 -0
  209. /package/skills/engineering/{contributing → engineering}/scripts/persist-conventions-core.mjs +0 -0
  210. /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/archetypes/authorized-payment-scam.md +0 -0
  211. /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/mechanisms/account-takeover.md +0 -0
  212. /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/taxonomy.md +0 -0
  213. /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/terminology.md +0 -0
@@ -17,11 +17,10 @@ finding's `rule` and `paths` ([result.md](result.md)). Below a P0/P1, skip them.
17
17
  it is a P2 follow-up. On a delta, search again only when the fix diff adds or moves a writer.
18
18
  Example: grep every call that changes a balance: the refund route, the batch refund job, and
19
19
  the chargeback webhook are three rows, not the one the trigger used.
20
- 3. **Check every path against one shared list of conditions, including its own failure.** For
21
- a path that guards a session, credentials, money, or a deletion, settle it each way
22
- (success, refusal, error, timeout) against the same list of events for every path; for other
23
- paths, the events that can reach it. An event the program cannot produce is ruled out in one
24
- line; one guard that rules out a whole row of events closes every cell in it.
20
+ 3. **Check relevant conditions on every path.** Select reachable outcomes and interleavings
21
+ from the broken rule, changed contract, and material risks, including failures where they
22
+ matter. Follow binding repo hazard and proof requirements. Rule out a case using code, not
23
+ assumptions about how it is reached; do not build a full event matrix by default.
25
24
  Example: an org switch was tried against "offline" and "a second tab", never against "the
26
25
  role lookup times out after the switch", and that cell granted the old org's role.
27
26
  4. **One rule, one finding, one id, every round.** A new witness that breaks the same guarded
@@ -30,47 +29,40 @@ finding's `rule` and `paths` ([result.md](result.md)). Below a P0/P1, skip them.
30
29
  an id resolved in an earlier round that breaks again is a new id whose summary names it.
31
30
  Example: a cache-invalidation finding fixed for writes is still open when a bulk import
32
31
  leaves the cache stale: same id, one more open row.
33
- 5. **Name one owner as the fix.** Prefer the place every path passes through: a guard copied to
34
- each path misses the next one. Copied guards that close every row still resolve the
35
- finding; when no such place exists, say so, and the rows are the fix.
32
+ 5. **Identify the applicable paths, not a mandatory architecture.** A shared owner may help
33
+ explain a defect, but do not require centralization or prescribe a new framework. Copied
34
+ guards that close every row resolve the finding.
36
35
  Example: three handlers each re-check the tenant; the owner is the repository method all
37
36
  three call.
38
- 6. **A rule that breaks again after a fix means the approach is wrong.** Say so in the
39
- finding, name the owner (5), and re-derive every path (2); never review the next patch as if
40
- it were the first. Example: the refund cap is open after two fixes, each adding a check to
37
+ 6. **A rule still broken after a fix stays open.** Say so in the finding and re-derive every
38
+ path (2); never review the next patch as if it were the first. Example: the refund cap is open after two fixes, each adding a check to
41
39
  one route: the finding names the balance service as the owner and lists every writer.
42
40
 
43
41
  ## Adversarial techniques
44
42
 
45
43
  "Be adversarial" means nothing without a method. The one move behind all four: **build the
46
- specific artifact that would fail, and cite it.** A finding with no concrete trigger is a hunch.
44
+ specific artifact that would fail, and cite it.** Alternatively cite an explicit unmet requirement
45
+ and evidence; a finding supported by neither is a hunch.
47
46
 
48
47
  - **Diff each new or changed function against its siblings.** Find its family: the same module,
49
48
  naming pattern, or role (a set of `detect*`, `validate*`, `parse*`, or route handlers). Compare
50
49
  the logic line by line. A function that handles a case differently, uses a looser or tighter
51
- pattern, orders its guards differently, or lacks a branch all its siblings have is a defect until
52
- the difference is justified. Name the sibling and the exact divergence, for example:
50
+ pattern, orders its guards differently, or lacks a branch all its siblings have is a lead to
51
+ investigate, not a defect without a supported failure or unmet requirement. Name the sibling
52
+ and the exact divergence, for example:
53
53
  "`detectOverMockedEvidence` matches `route.fulfill` but its sibling `detectTier1UiOnlyEvidence`
54
54
  also matches `page.route(`, so the first misses that vector."
55
- - **Break patterns with boundary inputs.** For each regex, glob, string match, or parser the diff
56
- adds or changes, write the input that breaks it before you trust it: prefix or substring leakage
57
- (does `/foo` also match `/foobar`? is it anchored?), empty or whitespace, case, escaping and
58
- metacharacters, unicode, very long input. Put the failing string in the finding.
59
- - **Hold each async step open.** For every async step the change relies on (sign-out, revoke,
60
- refresh, cancel, save, upload), ask what the code does *while it is pending*, and settle it
61
- each way (success, refusal, error, timeout) against every event that can coincide:
62
- backgrounded or hidden, offline, a second request, a retry, a sign-in as the same or a
63
- different subject, sign-out, expiry ([principle 3](#review-the-rule-not-the-instance) scopes
64
- the list). Write the sequence that interleaves them. Rule a cell out only by code that prevents
65
- it (a guard, a lock, a state check), never by how you expect the step to be reached: list every
66
- caller of the step, including timers, push events, expiry, and error handlers, not just the
67
- button a user presses. A test that awaits the step to completion never runs this window, so it
68
- proves nothing about it. Example: "export a report to a temp
69
- file, put the app in the background, then log out and leave the logout request hanging: the
70
- cleanup waits for logout to finish, so the exported file outlives the session."
71
- - **Name a test for each new branch.** For every conditional, `else`, early return, switch case,
72
- and error path in the diff, find the test that drives it. A branch whose failure would be
73
- observable and has no test is a gap; line coverage is not branch coverage.
55
+ - **Break relevant patterns with boundary inputs.** Choose inputs from the contract and material
56
+ risks, such as prefix leakage, empty values, case, escaping, or malformed input. Put a failing
57
+ input in the finding; do not require every boundary for every pattern.
58
+ - **Examine relevant async windows.** Where the contract or material risk depends on pending
59
+ state or ordering, trace reachable callers and interleavings, including failure outcomes that
60
+ matter. Cite the sequence or the code that rules it out. A completed async test does not prove
61
+ a pending state. Example: "export a report to a temp file, background the app, then leave
62
+ logout hanging: cleanup waits for logout, so the file outlives the session."
63
+ - **Assess test evidence for the changed behavior.** Look for tests that can expose material
64
+ failures and for proof explicitly required by the agreement or binding repo rules. Do not
65
+ demand a test for every branch or invent a new harness.
74
66
 
75
67
  Shapes to look for while doing this:
76
68
 
@@ -85,12 +77,12 @@ Shapes to look for while doing this:
85
77
  can pin its own expected state, so the service accepting it proves nothing about the action the
86
78
  button calls.
87
79
  - **A permanent event routed through a temporary path.** Code that handles "paused, hidden,
88
- checking" and "revoked, signed out, deleted" in one branch keeps data or access alive after it
89
- should be gone. Check each permanent event arriving during each temporary state, and record it
90
- under `windows` (see "Revocation during a pause" in [domain-hazards.md](domain-hazards.md)).
80
+ checking" and "revoked, signed out, deleted" in one branch can keep data or access alive after
81
+ it should be gone. Check relevant reachable interleavings and record them under `windows`
82
+ (see "Revocation during a pause" in [domain-hazards.md](domain-hazards.md)).
91
83
  - **Centralizing drops an edge.** A refactor that moves a cross-cutting concern into one place (an
92
84
  auth redirect into a layout, error handling into a shared hook) silently loses edges the old
93
- paths handled. Check that the old edges are pinned by a test that existed before the move.
85
+ paths handled. Check relevant old behavior against the changed contract and any required proof.
94
86
 
95
87
  ## Enforcement-point sweep
96
88
 
@@ -122,10 +114,10 @@ searching for the old value, not by rerunning the suite.
122
114
 
123
115
  Search hard; then report only what survives this bar.
124
116
 
125
- - **Provable.** Every finding cites the diff hunk, and for a ripple effect the code it provably
126
- breaks. Label any inference.
127
- - **One finding per broken rule.** Say the rule, every open path in `paths`, and the one owner
128
- that fixes it. Example: four places miss the generation check: one finding with four open
117
+ - **Provable.** Cite the diff hunk and a supported failure, or the explicit unmet requirement
118
+ and evidence. For a ripple effect cite the code it breaks. Label any inference.
119
+ - **One finding per broken rule.** Say the rule and every open path in `paths`; identify a
120
+ shared owner when useful, without making an architecture decision. Example: four places miss the generation check: one finding with four open
129
121
  rows, not four findings and not one row.
130
122
  - **The author would fix it.** Do not flag intended changes or rely on guesses about intent.
131
123
  - **Rigor in proportion.** Hold the code to the bar the surrounding code already holds.
@@ -135,6 +127,8 @@ Do not raise:
135
127
 
136
128
  - a sibling divergence that is justified by a genuinely different case;
137
129
  - an unanchored pattern whose inputs come from a closed, validated set;
130
+ - a missing test or hypothetical hardening as a blocker without required proof or a concrete
131
+ material defect; do not invent gates, expanded acceptance, a new harness, or unrelated cleanup;
138
132
  - an "untested" branch already driven by an integration or E2E test, or whose failure is harmless;
139
133
  - a fake of a real external boundary (third-party API, clock, email, randomness);
140
134
  - a pre-existing issue the diff neither depends on nor worsens as a blocker (P2 at most);
@@ -10,8 +10,8 @@ Only P0/P1 block. Pick the level by consequence, not by which pass found it. Nev
10
10
  | Level | Meaning |
11
11
  |---|---|
12
12
  | **P0** | Exploitable security, auth, tenancy, money, or data-loss defect on a reachable path. |
13
- | **P1** | A contract break: an acceptance criterion unmet or wrong, required behavior wrong, a correctness bug with a concrete breaking input, a required repo standard or gate violated, a dishonest test cited as proof, or prose agents act on that contradicts the code. |
14
- | **P2** | A real defect outside the contract: optional hardening, an untested branch whose failure is observable, scope creep, test tooling that hides no product bug. |
13
+ | **P1** | A supported contract break: an explicit acceptance criterion or binding repo rule unmet, agreed or binding required proof missing, or a correctness defect with a concrete breaking input or sequence. Cite the requirement and evidence or the supported failure. |
14
+ | **P2** | A material non-blocking issue: for example, a test weakness or scope creep that does not violate required proof or show a concrete material defect. Optional hardening alone is not a blocker. |
15
15
  | **P3** | Not reported. Cleanup, naming, smells, cosmetics, architecture opinions, minor pre-existing issues: leave them out of the result and the chat report. |
16
16
 
17
17
  A pre-existing defect the diff neither causes nor worsens is never P0/P1 for this change, however
@@ -101,7 +101,9 @@ P2 lacks its follow-up URL when the caller asked for follow-ups.
101
101
  - `commands` lists the checks you ran against the code. Leave out this skill's update check and its
102
102
  scripts (`pr-context.mjs`, `scan-diff.mjs`, `rereview-scope.mjs`): a caller reads a non-empty
103
103
  list as proof the code was checked.
104
- - `trigger` is required on P0/P1: the input, state, or sequence that breaks it.
104
+ - `trigger` is required on P0/P1: the concrete input, state, or sequence that breaks it; for
105
+ an explicitly unmet requirement or missing required proof, identify the requirement and the
106
+ evidence of what is missing.
105
107
  - `rule` and `paths` are required on P0/P1, with at least one row `open`: the rule as one
106
108
  sentence, and one row per path the diff adds, changes, or relies on (a writer, caller, sweep
107
109
  place, or async cell), each `open` or `closed`, a closed row citing its guard's `file:line`.
@@ -124,12 +126,11 @@ P2 lacks its follow-up URL when the caller asked for follow-ups.
124
126
  needs both matching identities, otherwise review in full. Empty `sweeps` is `[]`.
125
127
  - On a delta, retain the tier decision (`reasons`, `integrationFiles`, `integrationLines`,
126
128
  `baseMovedFiles`, and prior HEAD) so carry-forward approval names what was checked.
127
- - `windows` lists each async step the change relies on, every caller of it you found (timers,
128
- push events, expiry, and error handlers too), the events it was checked against, and for each
129
- outcome (success, refusal, error, timeout) what the code did or the guard that rules the cell
130
- out; `[]` when the diff has none.
131
- - `boundaries` lists each regex, glob, parser, or validator the diff adds or changes with the
132
- inputs tried against it; `[]` when the diff has none.
129
+ - `windows` lists the async windows selected for the changed contract and material risks,
130
+ their relevant callers, events and outcomes checked, and what the code did or what ruled a
131
+ case out; `[]` when none was selected. Binding repo proof requirements still apply.
132
+ - `boundaries` lists the patterns, parsers, or validators selected for the changed contract and
133
+ material risks with the inputs tried; `[]` when none was selected.
133
134
  - On a re-review, keep a prior finding's `id` while its rule is broken anywhere, with every
134
135
  row updated; a new witness of that rule is a new row, never a new id.
135
136
 
@@ -1,22 +1,22 @@
1
1
  ---
2
2
  name: e2e-test
3
- description: "Playwright end-to-end standard: the 3-tier suite (render-health / functional / journey), generated route manifest, and presentation sweep. Use when browser routes or user flows ship or change, or a Playwright test flakes. NOT for non-browser tests, defining what to test (ensure-coverage), the curated ALIVE/DEAD golden-path gate (golden-path), or CI workflow YAML (github-actions)."
4
- release-version: 0.44.0
3
+ description: "Playwright end-to-end guidance for affected browser journeys, render health and presentation checks, with route manifests and sweeps for broader audits. Use when browser routes or user flows ship or change, or a Playwright test flakes. NOT for non-browser tests, defining what to test (ensure-coverage), the curated ALIVE/DEAD golden-path gate (golden-path), or CI workflow YAML (github-actions)."
4
+ release-version: 0.45.0
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # E2E Testing Standard
8
8
 
9
- The executable browser layer for `ensure-coverage`'s doctrine. ensure-coverage says *what must be proven* (required levels, the ledger, the presentation floor, the golden-path-only CI contract). This skill is *how* browser and journey surfaces get proven. `resolve-issues` implementers author the tests and run the sweep; `better-review` checks them against [reviewing.md](references/reviewing.md); `golden-path` selects the `@golden-path` subset of Tier 3 as the sole per-PR liveness gate.
9
+ The executable browser layer for `ensure-coverage`: that skill determines what needs proof; this skill shows how to obtain browser evidence. For routine feature work, use the existing suite and exercise the affected business journey, relevant render checks, and material errors. Reuse a journey's assertions for each render, functional, or presentation claim they actually check. Do not create a new harness, duplicate tests by tier, regenerate an all-routes manifest, run a whole-app sweep, or add a golden-path gate automatically. Follow existing binding repo requirements and safety rules. Route product policy and broad architecture decisions to their owners.
10
10
 
11
11
  ## Test tiers
12
12
 
13
13
  | Tier | Name | What to test | Required when |
14
14
  |---|---|---|---|
15
- | 1 | **Render-health** | Route loads, no crash, heading visible, no console errors (the `presentation:render-health` spine) | Every route not already proven by a Tier 2/3 test that calls `assertRenderHealthy` |
16
- | 2 | **Functional** | Forms, filters, auth, API responses, error states | Routes with user interaction |
17
- | 3 | **Journey** | Multi-step flows crossing pages and APIs; the golden paths whose failure means do-not-ship | Core business flows |
15
+ | 1 | **Render-health** | Route loads, no crash, meaningful content visible, no material console errors | Relevant affected renders |
16
+ | 2 | **Functional** | Forms, filters, auth, API responses, error states | Affected behavior needing proof |
17
+ | 3 | **Journey** | Multi-step flows crossing pages and APIs | Affected business journey |
18
18
 
19
- Tier 3 is where the golden paths live. `golden-path` authors nothing new: it selects the curated `@golden-path`-tagged subset and gates it ALIVE/DEAD. A tagged spec holds one journey, named by one `@covers <journey-id>` beside its surface `@covers`.
19
+ These tiers describe kinds of evidence, not three required tests. Existing golden paths may select a curated journey subset; changing that contract belongs to `golden-path` and needs an appropriate request or binding requirement.
20
20
 
21
21
  ## Directory layout
22
22
 
@@ -33,10 +33,10 @@ e2e/
33
33
 
34
34
  ## Writing tests
35
35
 
36
- 1. Every new route needs render-health proof: a Tier 1 test, or a Tier 2/3 test on that route that calls `assertRenderHealthy`. Interactive routes need Tier 2 with success, error, and edge cases. Core flows need a Tier 3 journey; tag the do-not-ship subset `@golden-path`.
37
- 2. One test per page and behavior. Never add a Tier 1 test for a route a Tier 2/3 test already proves, and never repeat an assertion another test on the same page makes.
38
- 3. The manifest is generated, never hand-edited. Regenerate it and put curation in the overlay ([route-manifest.md](references/route-manifest.md)).
39
- 4. Tag every spec `// @covers <surface-id>` and `// @level <level>` so the ledger resolves it. Untagged specs are invisible to the accounting gate.
36
+ 1. Extend or run existing tests for the affected journey and relevant render health, including material errors and appropriate success or failure cases. Add focused proof where existing tests leave a meaningful gap.
37
+ 2. Reuse assertions where they actually prove the claim; do not duplicate a journey solely to fill separate tiers. Real UX and layout claims need real-browser evidence, and a functional pass alone does not prove contrast.
38
+ 3. When an audit or binding repo requirement calls for a manifest, generate it rather than hand-editing it; put curation in the overlay ([route-manifest.md](references/route-manifest.md)).
39
+ 4. Follow existing `// @covers <surface-id>` and `// @level <level>` conventions where the repo uses a ledger.
40
40
  5. `getByRole` / `getByLabel` / `getByText`, never CSS selectors. Wait for real state, never `waitForTimeout()`.
41
41
  6. Auth lives in shared fixtures. Seeded accounts and tenants carry the `e2e-` prefix with a run-scoped suffix ([auth-flows.md](references/authoring/auth-flows.md)).
42
42
  7. Journeys drive real APIs. Mock only external third-party boundaries; a first-party `page.route` in a journey grades `Over-mocked`.
@@ -45,9 +45,9 @@ e2e/
45
45
 
46
46
  Patterns and tier examples: [playwright-patterns.md](references/authoring/playwright-patterns.md). Config and the AGENTS.md snippet: [playwright-config.md](references/authoring/playwright-config.md).
47
47
 
48
- ## The two commands every browser change owes
48
+ ## Whole-app audit tools
49
49
 
50
- Regenerate the manifest from the inventory:
50
+ Run a whole-app sweep only for an explicit audit, a changed shared shell with a real broad blast radius, or an existing binding repo requirement. When that scope needs a current manifest, regenerate it from the inventory:
51
51
 
52
52
  ```bash
53
53
  node "$SKILL_DIR/scripts/project-route-manifest.mjs" \
@@ -55,7 +55,7 @@ node "$SKILL_DIR/scripts/project-route-manifest.mjs" \
55
55
  --overlay e2e/route-manifest.overlay.json --out e2e/route-manifest.json
56
56
  ```
57
57
 
58
- Run the presentation sweep over every manifest route against the real render path:
58
+ For a whole-app sweep, run it over every manifest route against the real render path:
59
59
 
60
60
  ```bash
61
61
  E2E_AUTH_BYPASS=1 node "$SKILL_DIR/scripts/presentation-sweep.mjs" \
@@ -65,7 +65,7 @@ E2E_AUTH_BYPASS=1 node "$SKILL_DIR/scripts/presentation-sweep.mjs" \
65
65
 
66
66
  `SKILL_DIR` is this skill's own directory, the path you read this file from. Never resolve a script against your CWD, and never locate one with `find` over `$HOME`.
67
67
 
68
- The sweep is separate evidence from the functional suite. A green functional run is not presentation proof: a spec that intercepts its own API never exercises the render path that crashes. Instruments, fixtures, mutate-health, and the result shape the ledger reads: [presentation-sweep.md](references/presentation-sweep.md). A route with no in-app link is still reachable by URL; "no way to view it" is never `blocked`.
68
+ A real-browser journey can also prove the render and presentation properties it explicitly checks; functional success alone does not prove contrast or other untested layout properties. A spec intercepting first-party APIs does not prove the real backend render path. Instruments, fixtures, mutate-health, and the result shape: [presentation-sweep.md](references/presentation-sweep.md). A route with no in-app link can still be reached by URL.
69
69
 
70
70
  ## Verify locally before the queue
71
71
 
@@ -77,11 +77,11 @@ Whether you added tests, wrote notes, or reviewed a PR, the first line answers "
77
77
 
78
78
  ## CI
79
79
 
80
- Curated golden-path smoke is the sole CI gate (`ensure-coverage/references/enforcement/ci-contract.md`). On GitHub Actions, `golden-path init --write` generates the workflow from the repo's contract; on Cloud Build, copy [`assets/ci-gates.cloudbuild.yaml`](assets/ci-gates.cloudbuild.yaml). Verify either with `ci-audit.mjs`. Wiring notes: [ci-integration.md](references/ci-integration.md). Running Playwright in a pinned container on self-hosted runners: [ci-playwright-container.md](references/ci-playwright-container.md).
80
+ Run the repo's existing required checks; routine feature work does not create or change a golden-path gate. When explicitly tasked with CI wiring, see [ci-integration.md](references/ci-integration.md) and [ci-playwright-container.md](references/ci-playwright-container.md).
81
81
 
82
82
  ## Reviewing
83
83
 
84
- Checklist and comment template: [reviewing.md](references/reviewing.md). Block on: a new route without a manifest entry, an interactive route without Tier 2, a browser-route change with no sweep run, any skipped or guarded test, or an assertion that would pass on a 404 or empty page.
84
+ Checklist and comment template: [reviewing.md](references/reviewing.md). Report missing relevant proof and actual failures; do not block solely because a manifest, sweep, or separate tier is absent unless explicitly agreed or required by the repo. Preserve required checks and do not count a 404 or empty page as a real render.
85
85
 
86
86
  ## Scripts
87
87
 
@@ -42,17 +42,17 @@ export default defineConfig({
42
42
 
43
43
  ## AGENTS.md section
44
44
 
45
- Drop into each repo's AGENTS.md or CLAUDE.md:
45
+ Use this snippet only when explicitly authorized to update a repo's AGENTS.md or CLAUDE.md; preserve existing binding requirements:
46
46
 
47
47
  ```markdown
48
48
  ## E2E Testing
49
49
 
50
50
  ### Rules
51
- 1. Every new route/endpoint MUST be added to `e2e/route-manifest.json` (the coverage audit will fail otherwise)
52
- 2. Every new route needs at least a Tier 1 render-health test
53
- 3. Interactive routes need Tier 2 functional tests (success + error + edge cases)
54
- 4. Core business flows need Tier 3 journey tests — the golden paths (multi-step, real API); tag the do-not-ship subset `@golden-path`
55
- 5. Directory: `render/`, `functional/`, `journeys/`
51
+ 1. Use the existing suite to prove the affected business journey, relevant render health, and material errors.
52
+ 2. Reuse journey assertions for the render, functional, and presentation properties they actually check; do not duplicate tests by tier.
53
+ 3. Prove UX and layout claims in a real browser; functional success alone does not prove contrast.
54
+ 4. Journeys claiming real backend proof use real first-party APIs. Do not add a golden-path gate automatically.
55
+ 5. Follow the repo's existing test layout and required checks.
56
56
  6. Use `getByRole`/`getByLabel`/`getByText` -- not CSS selectors
57
57
  7. No `waitForTimeout()` -- wait for real state
58
58
  8. Run route discovery and reachability analysis before E2E coverage audits; do not audit from memory, sampling, or file enumeration alone
@@ -61,13 +61,11 @@ Drop into each repo's AGENTS.md or CLAUDE.md:
61
61
  11. Timeouts: 15s per action/assertion (`actionTimeout`/`expect.timeout`); no per-test timeout raises without justification
62
62
 
63
63
  ### Checks before a PR
64
- - Run route detection -- a page/endpoint without a manifest entry is a gap
65
- - Run the presentation sweep -- a route that throws on render is a bug even when a functional spec passes
66
- - Reviewer will block PRs with uncovered interactive routes without justification
64
+ - Run affected specs and relevant real-browser checks; report failures and unverified claims.
65
+ - Run a whole-app sweep only for an explicit audit, a shared-shell change with a real broad blast radius, or an existing binding repo requirement.
66
+ - Do not require a manifest, separate tier, or sweep solely because a browser route changed.
67
67
 
68
68
  ### CI
69
- - Curated golden-path smoke is the sole CI gate
70
- - Smoke drives the real app with deterministic seeded state and no first-party interception
71
- - the job passes only on an ALIVE verdict (DEAD, CANNOT-RUN, and EMPTY fail it)
72
- - Reviewer will block uncovered interactive routes based on the audit evidence, not CI wiring
69
+ - Run existing required CI checks; do not create a new gate for routine feature work.
70
+ - Existing real-backend smoke drives the real app with deterministic seeded state and no first-party interception.
73
71
  ```
@@ -4,7 +4,7 @@
4
4
 
5
5
  A green functional suite can pass while a route throws on render — when the only spec for that route **intercepts its own API** (`page.route('**/api/**')`), it never exercises the real render path that crashes. The presentation sweep catches this: it opens **every manifest route** in a real browser over the real render path (no first-party interception) and asserts the presentation floor **spine first**. It is the runner half of ensure-coverage's presentation axis (that skill *grades* the axis; this skill *runs* it and owns the result shape below).
6
6
 
7
- **It is separate evidence from the functional/journey suite, even though both use Playwright.** A passing functional E2E run is not presentation proof.
7
+ A real-browser journey can prove the presentation properties it actually asserts. A functional pass alone does not prove contrast or other unchecked presentation properties; first-party interception does not prove the real backend render path.
8
8
 
9
9
  ## Instruments (import into a spec, or use the sweep)
10
10
 
@@ -28,9 +28,9 @@ test('/tasks renders without error', async ({ page, baseURL }) => {
28
28
  })
29
29
  ```
30
30
 
31
- ## The sweep (mandatory for browser-route changes)
31
+ ## The sweep (scoped whole-app work)
32
32
 
33
- Run the whole-manifest sweep as review evidence, not a per-route afterthought:
33
+ Run a whole-app sweep only for an explicit audit, a changed shared shell with a real broad blast radius, or an existing binding repo requirement. Routine changes use affected journey and render checks instead. When a sweep is in scope:
34
34
  ```bash
35
35
  E2E_AUTH_BYPASS=1 node <skill-dir>/scripts/presentation-sweep.mjs \
36
36
  --manifest e2e/route-manifest.json --base-url http://127.0.0.1:3000 \
@@ -42,9 +42,9 @@ It exits non-zero on any `fail`/`blocked` and writes the per-`(route, level)` re
42
42
 
43
43
  #### "No in-app way to view it" is not blocked
44
44
 
45
- Reaching the route is your job. The sweep navigates *by URL*, so a route with no nav link or in-app entry point is still fully reachable. `blocked` is reserved for the genuinely un-renderable conditions above; "I had no convenient route to it" is never an excuse to skip the gate or merge without it. Stand up the local build (dev server + disposable DB + seeded/bypass auth) and drive the route's URL directly:
45
+ The sweep navigates *by URL*, so a route with no nav link or in-app entry point may still be reachable. A missing convenient link alone is not evidence that a required check is impossible. When needed, stand up the local build (dev server + disposable DB + seeded/bypass auth) and drive the route's URL directly:
46
46
 
47
- - **Manifest route → `presentation-sweep.mjs`** — the result the ledger and reviewer consume; run it whenever the route is in the manifest.
47
+ - **Whole-app sweep in scope → `presentation-sweep.mjs`** — produces the per-route results the ledger can consume.
48
48
  - **Ad-hoc one-route check → `agent-browser` (preferred).** Navigate, screenshot the states that matter (expanded/collapsed/popover), read the console, clean up. The default for "is this one route OK before I merge."
49
49
  - When agent-browser doesn't fit: **chrome-devtools MCP** for devtools surfaces (console, network, a perf/Lighthouse trace) alongside the render; **raw Playwright** (`page.goto(url)`) when scripting navigation into an authored spec.
50
50
 
@@ -73,7 +73,7 @@ Opt-in, for a surface built from a cited design source. ensure-coverage owns the
73
73
 
74
74
  ## What the sweep must do, and the result shape the ledger consumes
75
75
 
76
- `coverage-ledger.mjs` is a static analyzer: it proves a qualifying real-browser, non-intercepting, attested test was *authored*. It cannot observe a `pageerror`, an overflow, or a layout shift. The coverage verdict therefore needs two evidence sources: **accounting** (the ledger) and **rendering** (this sweep). Neither is a CI gate; curated golden-path smoke is the sole CI gate.
76
+ `coverage-ledger.mjs` is a static analyzer: it cannot observe a `pageerror`, an overflow, or a layout shift. Use observed real-browser evidence for claims about those properties. A sweep can supply that evidence when in scope; an existing journey can supply it for the properties it actually checks. Follow the repo's required checks.
77
77
 
78
78
  Given the generated route manifest (the `kind: "route"` surfaces from the surface inventory), the sweep must:
79
79
 
@@ -101,4 +101,4 @@ Emit JSON to `docs/tests/_generated/presentation-results.json`:
101
101
 
102
102
  - `status` is `pass | fail | unverified | blocked`. `fail` and `blocked` exit the sweep non-zero. `unverified` is a ledger warning by default.
103
103
  - `evidence` names the concrete observation: the `pageerror` text, the offending selector and overflow px, the unreachable param.
104
- - The ledger reconciles these against each route's required levels: a `fail` / `blocked` / missing result on a required level is a finding; a `pass` still needs a clean authored test, read and marked `verified: true`, to reach `Covered`.
104
+ - The ledger reconciles results against its configured required levels. Report a `fail`, `blocked`, or missing required result accurately; do not claim a missing sweep alone blocks routine work unless explicitly agreed or required by the repo.
@@ -4,11 +4,11 @@
4
4
 
5
5
  Checklist:
6
6
 
7
- - [ ] Route discovery and reachability analysis were run before coverage audit
8
- - [ ] Route manifest regenerated (projection) if routes added/removed; no drift vs the surface inventory
9
- - [ ] New routes have render-health proof (Tier 1, or a Tier 2/3 test calling `assertRenderHealthy`); no duplicate Tier 1 for a route already proven
10
- - [ ] Interactive routes have Tier 2 (success + error cases)
11
- - [ ] Browser-route changes ran the presentation sweep (a separate run); no `fail` results. **A `blocked` result depends on who is running this list.** Producing the work (fixtures yours to supply), `blocked` is a genuine gap — a route the harness cannot render is a route nobody proved renders, so it blocks. *Reviewing* a diff from a read-only sandbox, `blocked` usually means your environment lacks a `DATABASE_URL`, an auth session, or a resolvable param — an inability to verify, which is never evidence of absence. Report the route and the error and take `BLOCKED` for that route's obligation; do not convert it into a finding against the diff
7
+ - [ ] The affected business journey, relevant renders, and material errors have appropriate evidence from the existing suite or focused checks
8
+ - [ ] Reused journey assertions are credited only for what they actually check; functional success alone does not prove contrast or layout
9
+ - [ ] UX and layout claims have real-browser evidence; first-party interception is not real backend proof
10
+ - [ ] A whole-app sweep is scoped to an explicit audit, a shared-shell change with a real broad blast radius, or an existing binding repo requirement; discover and check reachability when conducting an audit
11
+ - [ ] Required checks ran, and actual failures or unverified obligations are reported with their cause. A reviewer's inability to run a check is not evidence that the diff lacks coverage
12
12
  - [ ] No `waitForTimeout()` -- use explicit waits
13
13
  - [ ] No CSS class assertions -- test user-visible behavior
14
14
  - [ ] **No test skipped or disabled.** The PR adds no `test.skip` / `xit` / `describe.skip`, no conditional skip unless CI still runs the test where the condition is false (a platform or optional-dependency skip), no disguised `if (!x) return` guard. A missing precondition is **seeded**; an un-sandboxable/flaky case goes to the **quarantine lane** (non-blocking, graded `Unverified`), never skipped. A `TODO`/issue link does **not** authorize a skip (policy: `ensure-coverage/references/process/test-strategy.md`)
@@ -17,10 +17,9 @@ Checklist:
17
17
  - [ ] Auth in shared fixtures, not duplicated
18
18
  - [ ] Bugfix PRs have regression test covering the exact failure
19
19
  - [ ] Tier 3 journeys use real APIs (no mocking internal endpoints)
20
- - [ ] Do-not-ship golden journeys (sign in → core action → pay) are tagged `@golden-path` so the golden-path check selects them; a new critical flow with no `@golden-path` tag / `golden-paths.json` entry is a gap
21
- - [ ] Specs tagged `@covers`/`@level` so the ledger resolves them
20
+ - [ ] Existing golden-path and ledger conventions are followed where required; no new gate is demanded automatically
22
21
 
23
- **Red flags (block PR):** route discovery/reachability not run before audit, route treated as valid only because a file exists, tests assert implementation details, fixed sleeps, new route without manifest entry, copy-pasted auth setup, happy-path-only Tier 2, no presentation sweep run for a browser-route change (a sweep you could not *run* is a `BLOCKED`, not a red flag — the distinction is whether the sweep is missing or your environment is), **any test skipped/disabled/guarded** instead of seeded-or-quarantined, an assertion that passes on a 404/not-found/empty page where a real render is expected, **an authorized lane whose only observed failure mode is a timeout** (it is failing closed before it renders, not asserting).
22
+ **Red flags:** treating a route as rendered only because a file exists, assertions that pass on a 404 or empty page, fixed sleeps, unsupported skips or guards, and an authorized lane that only times out instead of proving its subject rendered. Report material gaps and failures. Do not block solely for an absent manifest, sweep, or separate tier unless explicitly agreed or required by the repo.
24
23
 
25
24
  **Lead with the verdict, then follow-ups.** Put the verdict at the **top** of the review (and any coverage `notes.md`) — *is this surface covered / ship-ready, or do gaps remain?* — then what the tests prove and deliberately don't, and concrete follow-up action items (owner/level where known) for anything uncovered.
26
25
 
@@ -29,9 +28,8 @@ Checklist:
29
28
  ### E2E Coverage
30
29
 
31
30
  **Missing:**
32
- - Route `/new-page` added but not in the surface inventory / route manifest
33
- - No Tier 2 test for the date filter (need: valid range, invalid range, empty)
34
- - `/tasks` has no presentation-sweep result (render unproven)
31
+ - The affected date-filter journey has no evidence for its error state
32
+ - The claimed contrast improvement has no real-browser contrast evidence
35
33
 
36
34
  **Issues:**
37
35
  - `line 42`: Uses `waitForTimeout(3000)` -- replace with `waitForResponse`
@@ -1,6 +1,6 @@
1
1
  # Route Discovery and the Route Manifest
2
2
 
3
- > Read when: a route was added or removed, the manifest is stale, or an audit needs the route inventory before it can grade anything.
3
+ > Read when: an audit, a shared-shell change with a real broad blast radius, or a binding repo requirement needs route discovery or a current manifest. A routine route change does not itself require a whole-app inventory or regeneration.
4
4
 
5
5
  ## Discover first, never audit from memory
6
6
 
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: engineering
3
+ description: "Project engineering conventions and explicit /engineering init: feature-delivery priorities, focused verification and review, operational boundaries, and tracker routing. Use when setting up AGENTS.md or CONTRIBUTING.md, saving engineering defaults, or before creating an engineering issue, spec, epic, ticket, or sub-issue on GitHub or Linear. Reads existing policy without writing during ordinary work. NOT the issue-to-PR workflow (resolve-issues), release execution (resolve-release), Git delivery (github-flow), or CI setup (github-actions)."
4
+ release-version: 0.45.0
5
+ ---
6
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
+ # Engineering
8
+
9
+ Keep engineering work focused on the requested business outcome. Read the project's
10
+ existing `AGENTS.md` and `CONTRIBUTING.md` and the relevant domain
11
+ hazards or ADRs. Follow binding local requirements. Do not turn ordinary feature
12
+ work into a setup, audit, framework, or gate project.
13
+
14
+ ## Find the task
15
+
16
+ | Task | Action |
17
+ | --- | --- |
18
+ | `/engineering init` or an explicit request to register project defaults | [Initialize](#initialize-project-guidance) |
19
+ | Ordinary implementation or review | Read applicable guidance; apply the defaults below without writing files |
20
+ | Create an issue, spec, epic, or sub-issue | [Tracker routing](#tracker-routing); do not initialize as a side effect |
21
+ | Existing guidance conflicts with a proposed default | Preserve it; ask for a decision only if the requested action needs one |
22
+ | Choose additional setup capabilities | [Initialization scope](references/init-scope.md); route to the owning skill |
23
+
24
+ ## Delivery defaults
25
+
26
+ Prioritize the requested outcome. Supporting code, tests, and infrastructure need
27
+ a direct dependency, a binding requirement, or a demonstrated defect. Reuse existing
28
+ patterns and sufficient proof. Preserve security, tenancy, financial correctness,
29
+ data integrity, and cleanup. Do not invent recovery, compatibility, test layers,
30
+ frameworks, or gates for speculative scenarios. Keep acceptance stable and stop when
31
+ the outcome works and the agreed checks pass. Report unrelated debt without fixing it.
32
+
33
+ These defaults do not waive project rules, authorize external actions, or require
34
+ extra planning roles. Ordinary implementation choices stay with the implementer.
35
+
36
+ ## Initialize project guidance
37
+
38
+ An explicit `/engineering init` authorizes the additions described here in the
39
+ selected project. Automatic skill discovery, an issue-routing trigger, installation,
40
+ updates, and quoted examples do not authorize writes. When defaults would help an
41
+ unconfigured project, offer init once and continue; setup is not a feature prerequisite.
42
+
43
+ 1. Read existing project guidance and check for policy conflicts. The script preserves
44
+ existing sections; it does not interpret or replace the project's decisions.
45
+ 2. Set `SKILL_DIR` to this installed skill's directory. Preview:
46
+
47
+ ```sh
48
+ node "$SKILL_DIR/scripts/init.mjs" [--repo-root <project-root>] \
49
+ [--github-repo <owner/name>] [--linear-project "<name>"]...
50
+ ```
51
+
52
+ 3. For the explicitly authorized init, run the same command with `--write`. A preview
53
+ request alone stays read-only. No second approval is needed for the additions
54
+ already requested; a conflicting policy change needs separate agreement.
55
+ 4. Report created, updated, and preserved files and any unresolved project decisions.
56
+ Do not install dependencies, generate CI, create issues, push, or deploy as part of init.
57
+
58
+ The default scope is the nearest Git root, or the current directory without a Git
59
+ repository. `--repo-root` explicitly selects a different project. Do not walk parent
60
+ projects or edit global agent files. A GitHub origin or explicit `--github-repo` supplies
61
+ the known issue destination; without one, write neutral routing instructions and
62
+ resolve the destination before any issue creation. Never infer a Linear project.
63
+
64
+ | File or section | Init owns |
65
+ | --- | --- |
66
+ | `AGENTS.md` | Missing `Feature delivery` section and a pointer to `CONTRIBUTING.md` |
67
+ | `CONTRIBUTING.md` | Missing `Engineering conventions`, `Testing conventions`, and `Issue tracking` sections |
68
+
69
+ The templates are [feature delivery](references/feature-delivery.md),
70
+ [engineering conventions](references/engineering-conventions.md),
71
+ [testing conventions](../test-quality/references/testing-conventions.md), and
72
+ [tracker conventions](references/tracker-conventions.md). Install `engineering` with
73
+ its required sibling `test-quality`; init reads that skill's canonical template
74
+ without invoking its writer. `test-quality` owns the testing rules and deliberate
75
+ updates; init only adds a missing section. The [skill review](references/init-scope.md)
76
+ explains what is included and what remains opt-in.
77
+
78
+ Existing sections, including legacy `conventions:tracker` blocks written by
79
+ `contributing`, are preserved byte-for-byte. Repeated init is not a refresh and
80
+ leaves manual edits unchanged. No force/update mode is implied. If policy needs to
81
+ change, agree the specific change rather than rerunning setup over it.
82
+
83
+ Every target is checked before writing. Invalid targets, unreadable files, malformed
84
+ owned markers, dangling links, and links outside the selected project refuse setup.
85
+ Valid in-project symlinks are preserved. Keep distinct agent-instruction and
86
+ contributor-guide files. Init does not read, create, or update `CLAUDE.md`.
87
+ Report a write error honestly; do not claim setup completed when it did not.
88
+
89
+ ## Tracker routing
90
+
91
+ Read the destination from project guidance first, then the GitHub resources linked
92
+ from a source Linear project; ask if unresolved. An explicit user destination wins.
93
+
94
+ | Work | Default tracker |
95
+ | --- | --- |
96
+ | Product goals, business requirements, consulting work, delivery summaries | Linear where used by the project |
97
+ | Engineering specs, implementation epics, technical tasks, engineering bugs | GitHub |
98
+
99
+ Before creating work:
100
+
101
+ 1. Classify the work, not the conversation it came from. Engineering implementation
102
+ stays in GitHub even when the request started in Linear.
103
+ 2. Resolve the actual repository. Do not guess among multiple repos or fall back to
104
+ Linear because the GitHub destination is missing.
105
+ 3. Search the destination for duplicates and reuse a match.
106
+ 4. Link the GitHub epic to its Linear source requirement once. Do not create
107
+ implementation children in Linear or mirror every ticket there.
108
+ 5. Report engineering delivery in Linear as a linked summary; the requester owns
109
+ product acceptance.
110
+
111
+ The retained tracker-only helper supports explicit requests to persist or update
112
+ that section:
113
+
114
+ ```sh
115
+ node "$SKILL_DIR/scripts/persist-conventions.mjs" --repo-root <project-root> \
116
+ [--github-repo <owner/name>] [--linear-project "<name>"]... [--if-missing] [--write]
117
+ ```
118
+
119
+ It previews without `--write`; `--if-missing` preserves an existing tracker block.
120
+ Without that flag, an authorized tracker refresh replaces only its managed block.
121
+ It retains the existing shared convention-writer behavior; use `init.mjs` for
122
+ project setup with the all-target validation and preservation rules above. Ordinary
123
+ issue routing never runs either writer automatically. The old `contributing` name
124
+ is archived, not a second active policy owner.
@@ -0,0 +1,32 @@
1
+ ## Engineering conventions
2
+
3
+ ### Deliver the requested outcome
4
+
5
+ Build the smallest complete end-to-end change using existing patterns and tools.
6
+ Supporting code, tests, and infrastructure need a direct dependency, a binding
7
+ requirement, or a concrete defect. Do not invent fallback values, retries,
8
+ compatibility modes, or abstractions for hypothetical future needs. Preserve
9
+ necessary input validation and report unexpected failures through existing boundaries.
10
+
11
+ ### Verify proportionately
12
+
13
+ Reuse tests and checks that already prove the changed behavior. Add focused proof
14
+ for material risks at the lowest level that observes the real outcome. Mocks do
15
+ not prove the persistence, authorization, or transaction behavior they replace.
16
+ Do not duplicate proof across layers, pin source text instead of behavior, or
17
+ start a whole-app audit for a local change. Run the project's required checks;
18
+ report failed or unavailable checks honestly, without weakening them to get green.
19
+
20
+ ### Review and finish
21
+
22
+ Block delivery for a concrete supported failure, an explicit unmet requirement,
23
+ or missing agreed required proof, not speculative hardening or optional tests.
24
+ Keep acceptance criteria stable; new scope needs agreement. Stop when the outcome
25
+ works and the agreed checks pass. Report unrelated debt without fixing it.
26
+
27
+ ### Respect operational boundaries
28
+
29
+ Preserve authentication, tenant isolation, financial correctness, data integrity,
30
+ and cleanup. Follow this project's existing commit, PR, queue, and release policy.
31
+ Do not invent a delivery flow, introduce new CI gates, or treat initialization as
32
+ authorization to push, deploy, migrate shared data, change permissions, or release.