@evertonferreira96/agents 0.0.0-stage → 0.1.0

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 (258) hide show
  1. package/.claude/agents/api.md +45 -0
  2. package/.claude/agents/app.md +41 -0
  3. package/.claude/agents/architect.md +49 -0
  4. package/.claude/agents/infra.md +27 -0
  5. package/.claude/agents/product.md +58 -0
  6. package/.claude/agents/quick.md +33 -0
  7. package/.claude/agents/security.md +39 -0
  8. package/.claude/agents/ui.md +54 -0
  9. package/.claude/agents/verifier.md +56 -0
  10. package/.claude/agents/web.md +41 -0
  11. package/.claude/hooks/config-update-check.mjs +14 -0
  12. package/.claude/hooks/context-budget.mjs +51 -0
  13. package/.claude/hooks/graphify-update.sh +16 -0
  14. package/.claude/hooks/guard-bash.sh +64 -0
  15. package/.claude/hooks/orchestrator-guard.sh +49 -0
  16. package/.claude/hooks/post-compact.sh +26 -0
  17. package/.claude/hooks/readonly-guard.sh +54 -0
  18. package/.claude/hooks/stop-verify.sh +52 -0
  19. package/.claude/rules/api.md +21 -0
  20. package/.claude/rules/db.md +9 -0
  21. package/.claude/rules/delivery-diagram.md +16 -0
  22. package/.claude/rules/git-workflow.md +34 -0
  23. package/.claude/rules/graphify.md +3 -0
  24. package/.claude/rules/mobile.md +22 -0
  25. package/.claude/rules/tickets.md +9 -0
  26. package/.claude/rules/ui.md +14 -0
  27. package/.claude/rules/web.md +27 -0
  28. package/.claude/settings.json +114 -0
  29. package/.claude/skills/animate/RECIPES.md +324 -0
  30. package/.claude/skills/animate/SKILL.md +208 -0
  31. package/.claude/skills/animate/agents/openai.yaml +5 -0
  32. package/.claude/skills/animate-expo/RECIPES.md +385 -0
  33. package/.claude/skills/animate-expo/SKILL.md +264 -0
  34. package/.claude/skills/animate-expo/agents/openai.yaml +5 -0
  35. package/.claude/skills/animation-performance/SKILL.md +223 -0
  36. package/.claude/skills/animation-performance/agents/openai.yaml +5 -0
  37. package/.claude/skills/apple-design/SKILL.md +291 -0
  38. package/.claude/skills/apple-design/agents/openai.yaml +5 -0
  39. package/.claude/skills/arch-api/SKILL.md +291 -0
  40. package/.claude/skills/arch-api/agents/openai.yaml +3 -0
  41. package/.claude/skills/arch-api/references/common.md +174 -0
  42. package/.claude/skills/arch-api/references/contract.md +289 -0
  43. package/.claude/skills/arch-api/references/domain.md +301 -0
  44. package/.claude/skills/arch-api/references/endpoints.md +184 -0
  45. package/.claude/skills/arch-api/references/review.md +228 -0
  46. package/.claude/skills/arch-api/references/security.md +151 -0
  47. package/.claude/skills/arch-app/SKILL.md +278 -0
  48. package/.claude/skills/arch-app/agents/openai.yaml +3 -0
  49. package/.claude/skills/arch-app/references/navigation-session.md +257 -0
  50. package/.claude/skills/arch-app/references/review.md +155 -0
  51. package/.claude/skills/arch-app/references/screens.md +214 -0
  52. package/.claude/skills/arch-app/references/services.md +301 -0
  53. package/.claude/skills/arch-app/references/ui-mobile.md +124 -0
  54. package/.claude/skills/arch-db/SKILL.md +181 -0
  55. package/.claude/skills/arch-db/agents/openai.yaml +3 -0
  56. package/.claude/skills/arch-db/references/indexes-queries.md +251 -0
  57. package/.claude/skills/arch-db/references/migrations.md +191 -0
  58. package/.claude/skills/arch-db/references/modeling.md +214 -0
  59. package/.claude/skills/arch-db/references/mysql.md +262 -0
  60. package/.claude/skills/arch-db/references/pooling-ops.md +112 -0
  61. package/.claude/skills/arch-db/references/review.md +143 -0
  62. package/.claude/skills/arch-db/references/transactions-locks.md +141 -0
  63. package/.claude/skills/arch-web/SKILL.md +307 -0
  64. package/.claude/skills/arch-web/agents/openai.yaml +3 -0
  65. package/.claude/skills/arch-web/references/auth-session-env.md +165 -0
  66. package/.claude/skills/arch-web/references/blocks.md +198 -0
  67. package/.claude/skills/arch-web/references/cache.md +124 -0
  68. package/.claude/skills/arch-web/references/review.md +142 -0
  69. package/.claude/skills/arch-web/references/services.md +297 -0
  70. package/.claude/skills/arch-web/references/tests.md +159 -0
  71. package/.claude/skills/arch-web/references/ui-forms.md +143 -0
  72. package/.claude/skills/break-ui/CATALOG.md +135 -0
  73. package/.claude/skills/break-ui/SKILL.md +176 -0
  74. package/.claude/skills/break-ui/agents/openai.yaml +5 -0
  75. package/.claude/skills/brief/SKILL.md +91 -0
  76. package/.claude/skills/brief/agents/openai.yaml +3 -0
  77. package/.claude/skills/diagnosing-bugs/SKILL.md +138 -0
  78. package/.claude/skills/diagnosing-bugs/agents/openai.yaml +3 -0
  79. package/.claude/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
  80. package/.claude/skills/emil-design-eng/SKILL.md +675 -0
  81. package/.claude/skills/emil-design-eng/agents/openai.yaml +5 -0
  82. package/.claude/skills/find-animation-opportunities/SKILL.md +141 -0
  83. package/.claude/skills/find-animation-opportunities/agents/openai.yaml +5 -0
  84. package/.claude/skills/graphify/.graphify_version +1 -0
  85. package/.claude/skills/graphify/SKILL.md +742 -0
  86. package/.claude/skills/graphify/agents/openai.yaml +3 -0
  87. package/.claude/skills/graphify/references/add-watch.md +56 -0
  88. package/.claude/skills/graphify/references/exports.md +91 -0
  89. package/.claude/skills/graphify/references/extraction-spec.md +70 -0
  90. package/.claude/skills/graphify/references/github-and-merge.md +46 -0
  91. package/.claude/skills/graphify/references/hooks.md +33 -0
  92. package/.claude/skills/graphify/references/query.md +317 -0
  93. package/.claude/skills/graphify/references/transcribe.md +52 -0
  94. package/.claude/skills/graphify/references/update.md +221 -0
  95. package/.claude/skills/grill-me/SKILL.md +7 -0
  96. package/.claude/skills/grill-me/agents/openai.yaml +5 -0
  97. package/.claude/skills/grill-with-docs/SKILL.md +64 -0
  98. package/.claude/skills/grill-with-docs/agents/openai.yaml +5 -0
  99. package/.claude/skills/grilling/SKILL.md +30 -0
  100. package/.claude/skills/grilling/agents/openai.yaml +3 -0
  101. package/.claude/skills/handoff/SKILL.md +28 -0
  102. package/.claude/skills/handoff/agents/openai.yaml +5 -0
  103. package/.claude/skills/impeccable/SKILL.md +89 -0
  104. package/.claude/skills/impeccable/agents/openai.yaml +5 -0
  105. package/.claude/skills/impeccable/reference/adapt.md +318 -0
  106. package/.claude/skills/impeccable/reference/adapt.native.md +58 -0
  107. package/.claude/skills/impeccable/reference/android.md +46 -0
  108. package/.claude/skills/impeccable/reference/animate.md +89 -0
  109. package/.claude/skills/impeccable/reference/audit.md +137 -0
  110. package/.claude/skills/impeccable/reference/audit.native.md +139 -0
  111. package/.claude/skills/impeccable/reference/bolder.md +33 -0
  112. package/.claude/skills/impeccable/reference/clarify.md +94 -0
  113. package/.claude/skills/impeccable/reference/colorize.md +86 -0
  114. package/.claude/skills/impeccable/reference/component-review.md +63 -0
  115. package/.claude/skills/impeccable/reference/craft-floor.md +44 -0
  116. package/.claude/skills/impeccable/reference/craft.md +5 -0
  117. package/.claude/skills/impeccable/reference/critique.md +809 -0
  118. package/.claude/skills/impeccable/reference/degraded/asset-producer.md +42 -0
  119. package/.claude/skills/impeccable/reference/degraded/documenter.md +24 -0
  120. package/.claude/skills/impeccable/reference/degraded/finish-reviewer.md +38 -0
  121. package/.claude/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  122. package/.claude/skills/impeccable/reference/delight.md +70 -0
  123. package/.claude/skills/impeccable/reference/distill.md +111 -0
  124. package/.claude/skills/impeccable/reference/doctor.md +54 -0
  125. package/.claude/skills/impeccable/reference/document.md +416 -0
  126. package/.claude/skills/impeccable/reference/extract.md +69 -0
  127. package/.claude/skills/impeccable/reference/generate.md +101 -0
  128. package/.claude/skills/impeccable/reference/harden.md +345 -0
  129. package/.claude/skills/impeccable/reference/hooks.md +113 -0
  130. package/.claude/skills/impeccable/reference/init.md +131 -0
  131. package/.claude/skills/impeccable/reference/ios.md +51 -0
  132. package/.claude/skills/impeccable/reference/layout.md +84 -0
  133. package/.claude/skills/impeccable/reference/live-setup.md +104 -0
  134. package/.claude/skills/impeccable/reference/live.md +325 -0
  135. package/.claude/skills/impeccable/reference/mode-operate.md +21 -0
  136. package/.claude/skills/impeccable/reference/mode-persuade.md +19 -0
  137. package/.claude/skills/impeccable/reference/mode-read.md +21 -0
  138. package/.claude/skills/impeccable/reference/new-work.md +154 -0
  139. package/.claude/skills/impeccable/reference/onboard.md +234 -0
  140. package/.claude/skills/impeccable/reference/operate.md +61 -0
  141. package/.claude/skills/impeccable/reference/optimize.md +258 -0
  142. package/.claude/skills/impeccable/reference/overdrive.md +127 -0
  143. package/.claude/skills/impeccable/reference/polish.md +105 -0
  144. package/.claude/skills/impeccable/reference/quieter.md +99 -0
  145. package/.claude/skills/impeccable/reference/region-map.md +26 -0
  146. package/.claude/skills/impeccable/reference/routing.md +24 -0
  147. package/.claude/skills/impeccable/reference/shape.md +59 -0
  148. package/.claude/skills/impeccable/reference/typeset.md +80 -0
  149. package/.claude/skills/impeccable/reference/visualize.md +47 -0
  150. package/.claude/skills/impeccable/scripts/VERSION +1 -0
  151. package/.claude/skills/impeccable/scripts/command-metadata.json +98 -0
  152. package/.claude/skills/impeccable/scripts/data/font-index-failures.json +121 -0
  153. package/.claude/skills/impeccable/scripts/data/font-index.json +1 -0
  154. package/.claude/skills/impeccable/scripts/impeccable +206 -0
  155. package/.claude/skills/impeccable/scripts/impeccable.cmd +214 -0
  156. package/.claude/skills/impeccable/scripts/live-browser-dom.js +281 -0
  157. package/.claude/skills/impeccable/scripts/live-browser-ignores.js +242 -0
  158. package/.claude/skills/impeccable/scripts/live-browser-session.js +148 -0
  159. package/.claude/skills/impeccable/scripts/live-browser.js +13532 -0
  160. package/.claude/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  161. package/.claude/skills/improve-animations/AUDIT.md +115 -0
  162. package/.claude/skills/improve-animations/PLAN-TEMPLATE.md +73 -0
  163. package/.claude/skills/improve-animations/SKILL.md +110 -0
  164. package/.claude/skills/improve-animations/agents/openai.yaml +5 -0
  165. package/.claude/skills/mobile-native/SKILL.md +311 -0
  166. package/.claude/skills/mobile-native/agents/openai.yaml +3 -0
  167. package/.claude/skills/orchestrate/SKILL.md +181 -0
  168. package/.claude/skills/orchestrate/agents/openai.yaml +3 -0
  169. package/.claude/skills/pick-ui-library/SKILL.md +85 -0
  170. package/.claude/skills/pick-ui-library/agents/openai.yaml +5 -0
  171. package/.claude/skills/ponytail/SKILL.md +52 -0
  172. package/.claude/skills/ponytail/agents/openai.yaml +3 -0
  173. package/.claude/skills/ponytail-audit/SKILL.md +103 -0
  174. package/.claude/skills/ponytail-audit/agents/openai.yaml +3 -0
  175. package/.claude/skills/ponytail-debt/SKILL.md +44 -0
  176. package/.claude/skills/ponytail-debt/agents/openai.yaml +3 -0
  177. package/.claude/skills/ponytail-review/SKILL.md +101 -0
  178. package/.claude/skills/ponytail-review/agents/openai.yaml +3 -0
  179. package/.claude/skills/postgres-best-practices/SKILL.md +42 -0
  180. package/.claude/skills/postgres-best-practices/agents/openai.yaml +3 -0
  181. package/.claude/skills/postgres-best-practices/references/backup-restore.md +372 -0
  182. package/.claude/skills/postgres-best-practices/references/bulk-loading.md +315 -0
  183. package/.claude/skills/postgres-best-practices/references/connection-pooling.md +310 -0
  184. package/.claude/skills/postgres-best-practices/references/hot-standby.md +221 -0
  185. package/.claude/skills/postgres-best-practices/references/indexing.md +318 -0
  186. package/.claude/skills/postgres-best-practices/references/logical-replication.md +610 -0
  187. package/.claude/skills/postgres-best-practices/references/major-version-upgrades.md +334 -0
  188. package/.claude/skills/postgres-best-practices/references/performance-diagnostics.md +553 -0
  189. package/.claude/skills/postgres-best-practices/references/query-optimization.md +294 -0
  190. package/.claude/skills/postgres-best-practices/references/query-patterns.md +566 -0
  191. package/.claude/skills/postgres-best-practices/references/schema-design.md +362 -0
  192. package/.claude/skills/postgres-best-practices/references/security-roles.md +489 -0
  193. package/.claude/skills/postgres-best-practices/references/transaction-isolation.md +344 -0
  194. package/.claude/skills/project-docs/SKILL.md +330 -0
  195. package/.claude/skills/project-docs/agents/openai.yaml +3 -0
  196. package/.claude/skills/prototype/PICKER.md +197 -0
  197. package/.claude/skills/prototype/SKILL.md +98 -0
  198. package/.claude/skills/prototype/agents/openai.yaml +5 -0
  199. package/.claude/skills/retro/SKILL.md +43 -0
  200. package/.claude/skills/retro/agents/openai.yaml +5 -0
  201. package/.claude/skills/review/SKILL.md +74 -0
  202. package/.claude/skills/review/agents/openai.yaml +3 -0
  203. package/.claude/skills/review/references/smells.md +23 -0
  204. package/.claude/skills/review-animations/SKILL.md +120 -0
  205. package/.claude/skills/review-animations/STANDARDS.md +187 -0
  206. package/.claude/skills/review-animations/agents/openai.yaml +5 -0
  207. package/.claude/skills/tdd/SKILL.md +38 -0
  208. package/.claude/skills/tdd/agents/openai.yaml +3 -0
  209. package/.claude/skills/tdd/mocking.md +59 -0
  210. package/.claude/skills/tdd/tests.md +77 -0
  211. package/.claude/skills/triage/SKILL.md +58 -0
  212. package/.claude/skills/triage/agents/openai.yaml +3 -0
  213. package/.claude/skills/ui-ux-pro-max/SKILL.md +378 -0
  214. package/.claude/skills/ui-ux-pro-max/agents/openai.yaml +5 -0
  215. package/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -0
  216. package/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -0
  217. package/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -0
  218. package/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -0
  219. package/.claude/skills/ui-ux-pro-max/data/products.csv +97 -0
  220. package/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  221. package/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  222. package/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  223. package/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  224. package/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  225. package/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  226. package/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  227. package/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  228. package/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  229. package/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  230. package/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  231. package/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  232. package/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  233. package/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  234. package/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -0
  235. package/.claude/skills/ui-ux-pro-max/data/typography.csv +58 -0
  236. package/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  237. package/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  238. package/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  239. package/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -0
  240. package/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  241. package/.claude/skills/ui-ux-pro-max/scripts/search.py +114 -0
  242. package/.claude/skills/writing-for-agents/SKILL-MECHANICS.md +22 -0
  243. package/.claude/skills/writing-for-agents/SKILL.md +81 -0
  244. package/.claude/skills/writing-for-agents/agents/openai.yaml +3 -0
  245. package/.worktreeinclude +3 -0
  246. package/AGENTS.md +44 -0
  247. package/README.md +14 -2
  248. package/VERSION +1 -0
  249. package/bin/agents.mjs +45 -0
  250. package/docs/adr/README.md +31 -0
  251. package/docs/brief-template.md +3 -0
  252. package/docs/plans/README.md +73 -0
  253. package/package.json +46 -4
  254. package/scripts/bootstrap.mjs +188 -0
  255. package/scripts/check-catalog.mjs +43 -0
  256. package/scripts/skills-update.mjs +51 -0
  257. package/skills-lock.json +269 -0
  258. package/templates/CLAUDE.project.md +41 -0
@@ -0,0 +1,334 @@
1
+ # Major Version Upgrades Reference
2
+
3
+ ## Contents
4
+ - Upgrade methods overview
5
+ - pg_upgrade (in-place)
6
+ - Logical replication (minimal downtime)
7
+ - Pre-upgrade checklist
8
+ - Post-upgrade checklist
9
+ - Testing strategy
10
+
11
+ ## Upgrade Methods Overview
12
+
13
+ | Method | Downtime | Complexity | Rollback | Best for |
14
+ |--------|----------|------------|----------|----------|
15
+ | `pg_upgrade` | Minutes to hours | Low | Restore from backup | Most upgrades, moderate database sizes |
16
+ | `pg_upgrade --swap` (PG18+) | Minutes | Low | Restore from backup | Fastest in-place upgrade |
17
+ | Logical replication | Seconds | High | Switch back to old primary | Large databases requiring near-zero downtime |
18
+ | pg_dump/pg_restore | Hours to days | Low | Old cluster still running | Small databases, or when other methods fail |
19
+
20
+ **Default recommendation**: `pg_upgrade` for most cases. Use logical replication only when you need near-zero downtime on a large database.
21
+
22
+ ## pg_upgrade (In-Place)
23
+
24
+ `pg_upgrade` replaces the old cluster's data files with the new version in place, without dumping and reloading data. PG18 supports five transfer modes:
25
+
26
+ | Mode | Flag | Speed | Disk usage |
27
+ |------|------|-------|------------|
28
+ | Copy | (default) | Moderate | 2x disk during upgrade |
29
+ | Copy file range | `--copy-file-range` (PG18+) | Fast where supported | 2x disk during upgrade |
30
+ | Link | `--link` | Fast | Minimal extra disk (hard links) |
31
+ | Swap | `--swap` (PG18+) | Fastest | No extra disk (swaps data dirs) |
32
+ | Clone | `--clone` | Fast (if filesystem supports reflinks) | Minimal extra disk |
33
+
34
+ ### Step-by-Step: pg_upgrade
35
+
36
+ #### 1. Install the New Version
37
+
38
+ Install the new PostgreSQL version alongside the old one. Do not remove the old version yet.
39
+
40
+ ```bash
41
+ # Example: upgrading from PG16 to PG17
42
+ # Install PG17 (method depends on your OS/package manager)
43
+ # Both versions coexist with different binary directories
44
+ ```
45
+
46
+ #### 2. Run Pre-Upgrade Check
47
+
48
+ ```bash
49
+ # Dry run — checks compatibility without making changes
50
+ pg_upgrade \
51
+ --old-datadir /var/lib/postgresql/16/main \
52
+ --new-datadir /var/lib/postgresql/17/main \
53
+ --old-bindir /usr/lib/postgresql/16/bin \
54
+ --new-bindir /usr/lib/postgresql/17/bin \
55
+ --check
56
+ ```
57
+
58
+ Fix any issues reported before proceeding. Common issues:
59
+ - Extensions not available in the new version
60
+ - Custom data types with incompatible binary formats
61
+ - `contrib` modules that need updating
62
+
63
+ #### 3. Stop the Old Cluster
64
+
65
+ ```bash
66
+ pg_ctl stop -D /var/lib/postgresql/16/main
67
+ ```
68
+
69
+ #### 4. Run pg_upgrade
70
+
71
+ ```bash
72
+ # Copy mode (safe, uses more disk)
73
+ pg_upgrade \
74
+ --old-datadir /var/lib/postgresql/16/main \
75
+ --new-datadir /var/lib/postgresql/17/main \
76
+ --old-bindir /usr/lib/postgresql/16/bin \
77
+ --new-bindir /usr/lib/postgresql/17/bin
78
+
79
+ # Link mode (faster, old cluster becomes unusable)
80
+ pg_upgrade \
81
+ --old-datadir /var/lib/postgresql/16/main \
82
+ --new-datadir /var/lib/postgresql/17/main \
83
+ --old-bindir /usr/lib/postgresql/16/bin \
84
+ --new-bindir /usr/lib/postgresql/17/bin \
85
+ --link
86
+
87
+ # PG18+: Swap mode (fastest, swaps data directories)
88
+ pg_upgrade \
89
+ --old-datadir /var/lib/postgresql/17/main \
90
+ --new-datadir /var/lib/postgresql/18/main \
91
+ --old-bindir /usr/lib/postgresql/17/bin \
92
+ --new-bindir /usr/lib/postgresql/18/bin \
93
+ --swap
94
+
95
+ # Parallel checking: speed up pre-checks
96
+ pg_upgrade ... --jobs 4
97
+ ```
98
+
99
+ #### 5. Start the New Cluster
100
+
101
+ ```bash
102
+ pg_ctl start -D /var/lib/postgresql/17/main
103
+ ```
104
+
105
+ #### 6. Post-Upgrade Tasks
106
+
107
+ After a successful upgrade, refresh optimizer statistics and remove the old cluster only after verification:
108
+
109
+ ```bash
110
+ # Update optimizer statistics in stages
111
+ vacuumdb --all --analyze-in-stages
112
+
113
+ # Generated by pg_upgrade — delete old cluster data (only after confirming the upgrade works)
114
+ ./delete_old_cluster.sh
115
+ ```
116
+
117
+ Current `pg_upgrade` releases generate the deletion script but may instruct you to run `vacuumdb` directly instead of generating `analyze_new_cluster.sh`.
118
+
119
+ ### Optimizer Statistics Preservation (PG18+)
120
+
121
+ PG18's `pg_upgrade` preserves most optimizer statistics by default, reducing the post-upgrade performance dip:
122
+
123
+ ```bash
124
+ # Default in PG18: statistics are preserved
125
+ pg_upgrade ...
126
+
127
+ # Opt out (if you want fresh statistics)
128
+ pg_upgrade ... --no-statistics
129
+ ```
130
+
131
+ Some statistics, including cumulative statistics and statistics that cannot be transferred, still need to be rebuilt. On older versions, always run `ANALYZE` on all databases immediately after upgrading.
132
+
133
+ ## Logical Replication (Minimal Downtime)
134
+
135
+ For near-zero downtime upgrades on large databases, use logical replication to stream changes from the old version to the new version, then cut over.
136
+
137
+ ### Overview
138
+
139
+ 1. Set up new cluster on the target PG version
140
+ 2. Create schema on the new cluster
141
+ 3. Set up logical replication (old → new)
142
+ 4. Wait for initial sync + streaming to catch up
143
+ 5. Cut over applications to the new cluster
144
+
145
+ See `logical-replication.md` for the full live migration pattern.
146
+
147
+ ### Advantages Over pg_upgrade
148
+
149
+ - Downtime measured in seconds (just the application switchover)
150
+ - Can upgrade across multiple major versions in one step
151
+ - Allows testing the new cluster while the old one is still serving traffic
152
+ - Rollback is simple: point applications back to the old cluster
153
+
154
+ ### Disadvantages
155
+
156
+ - More complex setup
157
+ - Sequences must be synchronized manually
158
+ - DDL is not replicated — schema must be created manually on the target
159
+ - Large objects (lo) are not replicated
160
+ - Some extensions may behave differently across versions
161
+
162
+ ### pg_createsubscriber (PG17+)
163
+
164
+ Converts a physical standby into a logical subscriber, simplifying the setup:
165
+
166
+ ```bash
167
+ # PG18+: --all flag converts all databases at once
168
+ pg_createsubscriber \
169
+ --pgdata /var/lib/postgresql/18/main \
170
+ --publisher-server "host=old_primary dbname=mydb" \
171
+ --all
172
+ ```
173
+
174
+ ## Pre-Upgrade Checklist
175
+
176
+ ### 1. Review Release Notes
177
+
178
+ Read the release notes for **every version** between your current and target version. Pay attention to:
179
+ - Removed features or changed defaults
180
+ - Extension compatibility changes
181
+ - Authentication changes (e.g., PG18 deprecates md5)
182
+ - Behavior changes that could affect queries
183
+
184
+ ### 2. Check Extension Compatibility
185
+
186
+ ```sql
187
+ -- List installed extensions and versions
188
+ SELECT extname, extversion FROM pg_extension ORDER BY extname;
189
+
190
+ -- Check if extensions are available in the new version
191
+ -- (run against the new cluster after initdb)
192
+ SELECT name, default_version FROM pg_available_extensions WHERE name IN (
193
+ SELECT extname FROM pg_extension
194
+ ) ORDER BY name;
195
+ ```
196
+
197
+ ### 3. Check for Deprecated Features
198
+
199
+ ```sql
200
+ -- Check for md5 passwords (deprecated in PG18)
201
+ SELECT rolname
202
+ FROM pg_authid
203
+ WHERE rolcanlogin AND rolpassword LIKE 'md5%';
204
+
205
+ -- Check for removed/renamed GUC settings
206
+ -- (pg_upgrade --check will catch these)
207
+ ```
208
+
209
+ ### 4. Take a Full Backup
210
+
211
+ **Non-negotiable**. Before any upgrade:
212
+
213
+ ```bash
214
+ # Full cluster backup
215
+ pg_dumpall -f pre_upgrade_backup.sql
216
+
217
+ # Or physical backup
218
+ pg_basebackup -D /backup/pre_upgrade -Ft -z -Xs -P
219
+ ```
220
+
221
+ ### 5. Test on a Clone
222
+
223
+ Never upgrade production first. Test on a copy:
224
+
225
+ ```bash
226
+ # Create a test copy
227
+ pg_basebackup -D /tmp/upgrade_test -Fp -Xs -P
228
+
229
+ # Initialize an empty target cluster with the new version's binaries
230
+ /usr/lib/postgresql/17/bin/initdb -D /tmp/new_cluster
231
+
232
+ # Run pg_upgrade --check against the copy
233
+ /usr/lib/postgresql/17/bin/pg_upgrade --check \
234
+ --old-datadir /tmp/upgrade_test \
235
+ --new-datadir /tmp/new_cluster \
236
+ --old-bindir /usr/lib/postgresql/16/bin \
237
+ --new-bindir /usr/lib/postgresql/17/bin
238
+ ```
239
+
240
+ ### 6. Plan for Replication
241
+
242
+ If using streaming replication:
243
+ - Standbys must be rebuilt after pg_upgrade (they can't follow a pg_upgraded primary)
244
+ - Alternative: upgrade standbys with `pg_upgrade` too (stop all, upgrade all, restart)
245
+ - Or use `pg_createsubscriber` (PG17+) to convert to logical replication
246
+
247
+ ## Post-Upgrade Checklist
248
+
249
+ ### 1. Update Optimizer Statistics
250
+
251
+ ```bash
252
+ # Rebuild optimizer statistics in stages
253
+ vacuumdb --all --analyze-in-stages --jobs 4
254
+ ```
255
+
256
+ On PG18+ with `pg_upgrade`, most optimizer statistics are preserved by default, but analyze tables whose statistics were not transferred and tables changed after the upgrade.
257
+
258
+ ### 2. Check for Invalid Indexes
259
+
260
+ ```sql
261
+ SELECT indexrelid::regclass, indisvalid
262
+ FROM pg_index
263
+ WHERE NOT indisvalid;
264
+ ```
265
+
266
+ ### 3. Update Extensions
267
+
268
+ ```sql
269
+ -- Update extensions to latest available version
270
+ ALTER EXTENSION pg_stat_statements UPDATE;
271
+ ALTER EXTENSION postgis UPDATE;
272
+ -- Repeat for each extension
273
+ ```
274
+
275
+ ### 4. Review Changed Defaults
276
+
277
+ Check if new default values for GUC parameters affect your workload:
278
+
279
+ ```sql
280
+ -- Compare settings that differ from defaults
281
+ SELECT name, setting, boot_val, source
282
+ FROM pg_settings
283
+ WHERE setting != boot_val
284
+ AND source != 'default'
285
+ ORDER BY name;
286
+ ```
287
+
288
+ ### 5. Monitor Performance
289
+
290
+ After upgrade, monitor for:
291
+ - Query plan regressions (optimizer changes across versions)
292
+ - Connection behavior changes
293
+ - Extension behavior changes
294
+
295
+ ```sql
296
+ -- Compare top queries before/after via pg_stat_statements
297
+ SELECT left(query, 80), calls,
298
+ round(mean_exec_time::numeric, 1) AS avg_ms
299
+ FROM pg_stat_statements
300
+ WHERE dbid = (SELECT oid FROM pg_database WHERE datname = current_database())
301
+ ORDER BY total_exec_time DESC
302
+ LIMIT 20;
303
+ ```
304
+
305
+ ### 6. Clean Up
306
+
307
+ ```bash
308
+ # Remove old cluster (only after confirming upgrade is stable)
309
+ ./delete_old_cluster.sh
310
+
311
+ # Or manually:
312
+ rm -rf /var/lib/postgresql/16/main # be very careful with this
313
+
314
+ # Uninstall old PostgreSQL version
315
+ # (method depends on your package manager)
316
+ ```
317
+
318
+ ## Testing Strategy
319
+
320
+ ### Regression Testing
321
+
322
+ 1. **Dump queries from pg_stat_statements** before upgrade
323
+ 2. **Replay on the test cluster** (or use `pg_stat_statements` to compare plans)
324
+ 3. **Compare EXPLAIN plans** for your top-20 queries by total time
325
+ 4. **Run application test suite** against the new version
326
+ 5. **Load test** at production-like traffic levels
327
+
328
+ ### Rollback Plan
329
+
330
+ - **pg_upgrade (copy mode)**: Old cluster is intact — start it back up
331
+ - **pg_upgrade (link mode)**: Old cluster is unusable — restore from backup
332
+ - **pg_upgrade (swap mode)**: The file transfer is destructive; restore the old cluster from backup
333
+ - **Logical replication**: Point applications back to the old cluster
334
+ - **Always have a tested backup** regardless of method