claude-dev-env 1.83.0 → 1.85.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 (186) hide show
  1. package/_shared/pr-loop/audit-contract.md +24 -12
  2. package/_shared/pr-loop/scripts/_claude_permissions_common.py +16 -5
  3. package/_shared/pr-loop/scripts/code_rules_gate.py +2 -3
  4. package/_shared/pr-loop/scripts/pr_loop_shared_constants/CLAUDE.md +1 -1
  5. package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +8 -0
  6. package/_shared/pr-loop/scripts/reviews_disabled.py +2 -0
  7. package/_shared/pr-loop/scripts/terminology_sweep.py +85 -39
  8. package/_shared/pr-loop/scripts/tests/test__claude_permissions_common.py +212 -0
  9. package/_shared/pr-loop/scripts/tests/test_agent_config_carveout.py +18 -0
  10. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +18 -0
  11. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +37 -0
  12. package/_shared/pr-loop/scripts/tests/test_reviews_disabled.py +14 -0
  13. package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +94 -4
  14. package/agents/clean-coder.md +3 -0
  15. package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +1 -1
  16. package/bin/install.mjs +16 -8
  17. package/bin/install.test.mjs +17 -6
  18. package/commands/CLAUDE.md +0 -1
  19. package/docs/CODE_RULES.md +1 -1
  20. package/hooks/blocking/CLAUDE.md +0 -4
  21. package/hooks/blocking/claude_md_orphan_file_blocker.py +1 -1
  22. package/hooks/blocking/code_rules_constants_config.py +5 -0
  23. package/hooks/blocking/code_rules_docstrings.py +133 -19
  24. package/hooks/blocking/code_rules_enforcer.py +4 -0
  25. package/hooks/blocking/code_rules_imports_logging.py +10 -6
  26. package/hooks/blocking/code_rules_magic_values.py +5 -0
  27. package/hooks/blocking/code_rules_naming_collection.py +15 -8
  28. package/hooks/blocking/code_rules_paired_test.py +3 -2
  29. package/hooks/blocking/code_rules_shared.py +34 -0
  30. package/hooks/blocking/code_rules_string_magic.py +1 -1
  31. package/hooks/blocking/code_rules_unused_imports.py +2 -2
  32. package/hooks/blocking/duplicate_rmtree_helper_blocker.py +4 -4
  33. package/hooks/blocking/test_code_rules_enforcer_docstring_args_span_scope.py +29 -0
  34. package/hooks/blocking/test_code_rules_enforcer_docstring_prose_wall_illustration.py +197 -0
  35. package/hooks/blocking/test_code_rules_enforcer_docstring_runon_sentence.py +27 -0
  36. package/hooks/blocking/test_code_rules_enforcer_naive_datetime.py +24 -0
  37. package/hooks/blocking/test_code_rules_enforcer_split_constants_config.py +33 -0
  38. package/hooks/blocking/test_code_rules_enforcer_split_shared.py +23 -0
  39. package/hooks/blocking/test_code_rules_magic_values.py +54 -0
  40. package/hooks/blocking/test_duplicate_rmtree_helper_blocker.py +0 -6
  41. package/hooks/blocking/test_pr_converge_bugteam_enforcer_state_tolerance.py +184 -0
  42. package/hooks/blocking/test_shared_stdin_adoption.py +5 -30
  43. package/hooks/hooks_constants/CLAUDE.md +0 -3
  44. package/hooks/hooks_constants/blocking_check_limits.py +4 -0
  45. package/hooks/hooks_constants/code_rules_path_utils_constants.py +1 -1
  46. package/hooks/hooks_constants/duplicate_rmtree_helper_blocker_constants.py +0 -1
  47. package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -5
  48. package/hooks/validation/post_tool_use_dispatcher.py +1 -1
  49. package/hooks/validation/test_post_tool_use_dispatcher.py +51 -35
  50. package/hooks/workflow/CLAUDE.md +2 -8
  51. package/package.json +1 -1
  52. package/rules/CLAUDE.md +1 -1
  53. package/rules/docstring-prose-matches-implementation.md +1 -1
  54. package/rules/env-var-table-code-drift.md +1 -1
  55. package/rules/package-inventory-stale-entry.md +1 -1
  56. package/rules/paired-test-coverage.md +1 -1
  57. package/rules/plain-illustrative-docstrings.md +35 -1
  58. package/skills/CLAUDE.md +6 -1
  59. package/skills/_shared/pr-loop/CLAUDE.md +1 -0
  60. package/skills/_shared/pr-loop/scripts/CLAUDE.md +1 -0
  61. package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/CLAUDE.md +1 -0
  62. package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +45 -0
  63. package/skills/_shared/pr-loop/scripts/test_write_handoff.py +201 -0
  64. package/skills/_shared/pr-loop/scripts/write_handoff.py +309 -0
  65. package/skills/autoconverge/SKILL.md +82 -58
  66. package/skills/autoconverge/reference/closing-report.md +6 -6
  67. package/skills/autoconverge/reference/convergence.md +17 -15
  68. package/skills/autoconverge/reference/gotchas.md +6 -3
  69. package/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +2 -9
  70. package/skills/autoconverge/workflow/converge.contract.test.mjs +87 -13
  71. package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +1 -1
  72. package/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +16 -9
  73. package/skills/autoconverge/workflow/converge.mjs +71 -74
  74. package/skills/autoconverge/workflow/render_report.py +7 -11
  75. package/skills/bugteam/CLAUDE.md +1 -1
  76. package/skills/bugteam/PROMPTS.md +7 -6
  77. package/skills/bugteam/SKILL.md +25 -72
  78. package/skills/bugteam/reference/CLAUDE.md +1 -3
  79. package/skills/bugteam/reference/README.md +1 -1
  80. package/skills/bugteam/reference/audit-and-teammates.md +1 -1
  81. package/skills/bugteam/reference/obstacles/fix-publish-summary.md +1 -1
  82. package/skills/bugteam/reference/team-setup.md +8 -7
  83. package/skills/bugteam/scripts/CLAUDE.md +0 -6
  84. package/skills/bugteam/scripts/README.md +0 -4
  85. package/skills/bugteam/scripts/bugteam_scripts_constants/CLAUDE.md +0 -1
  86. package/skills/code/SKILL.md +2 -0
  87. package/skills/copilot-review/CLAUDE.md +1 -1
  88. package/skills/copilot-review/SKILL.md +25 -23
  89. package/skills/findbugs/CLAUDE.md +2 -2
  90. package/skills/findbugs/SKILL.md +22 -83
  91. package/skills/fixbugs/SKILL.md +2 -4
  92. package/skills/log-audit/CLAUDE.md +20 -0
  93. package/skills/log-audit/SKILL.md +68 -0
  94. package/skills/log-audit/reference/CLAUDE.md +9 -0
  95. package/skills/log-audit/reference/charter.md +52 -0
  96. package/skills/log-audit/scripts/CLAUDE.md +27 -0
  97. package/skills/log-audit/scripts/cluster_recurrences.py +261 -0
  98. package/skills/log-audit/scripts/collect_log_window.py +199 -0
  99. package/skills/log-audit/scripts/log_audit_constants/CLAUDE.md +12 -0
  100. package/skills/log-audit/scripts/log_audit_constants/cluster_recurrences_constants.py +23 -0
  101. package/skills/log-audit/scripts/log_audit_constants/collect_log_window_constants.py +24 -0
  102. package/skills/log-audit/scripts/log_audit_constants/mine_copilot_findings_constants.py +49 -0
  103. package/skills/log-audit/scripts/mine_copilot_findings.py +302 -0
  104. package/skills/log-audit/scripts/test_cluster_recurrences.py +160 -0
  105. package/skills/log-audit/scripts/test_collect_log_window.py +111 -0
  106. package/skills/log-audit/scripts/test_mine_copilot_findings.py +126 -0
  107. package/skills/monitor-open-prs/SKILL.md +2 -2
  108. package/skills/post-audit-findings/SKILL.md +84 -0
  109. package/skills/pr-converge/CLAUDE.md +2 -0
  110. package/skills/pr-converge/SKILL.md +99 -60
  111. package/skills/pr-converge/reference/CLAUDE.md +1 -1
  112. package/skills/pr-converge/reference/convergence-gates.md +16 -19
  113. package/skills/pr-converge/reference/examples.md +5 -5
  114. package/skills/pr-converge/reference/fix-protocol.md +16 -43
  115. package/skills/pr-converge/reference/obstacles/fix-publish-summary.md +1 -1
  116. package/skills/pr-converge/reference/per-tick.md +24 -45
  117. package/skills/pr-converge/reference/state-schema.md +27 -0
  118. package/skills/pr-converge/scripts/README.md +3 -5
  119. package/skills/pr-fix-protocol/SKILL.md +70 -0
  120. package/skills/pr-loop-lifecycle/SKILL.md +73 -0
  121. package/skills/{bugteam → pr-loop-lifecycle}/reference/teardown-publish-permissions.md +22 -24
  122. package/skills/pr-scope-resolve/SKILL.md +48 -0
  123. package/skills/qbug/CLAUDE.md +4 -4
  124. package/skills/qbug/SKILL.md +46 -144
  125. package/skills/qbug/test_qbug_skill_audit_schema.py +2 -2
  126. package/skills/qbug/test_qbug_skill_post_fix_audit.py +1 -1
  127. package/skills/reviewer-gates/SKILL.md +96 -0
  128. package/skills/session-log/CLAUDE.md +7 -7
  129. package/skills/session-log/SKILL.md +27 -44
  130. package/skills/test_markdown_link_integrity.py +103 -0
  131. package/commands/doc-gist.md +0 -16
  132. package/hooks/blocking/_md_to_html_blocker_test_support.py +0 -65
  133. package/hooks/blocking/conftest.py +0 -30
  134. package/hooks/blocking/md_path_exemptions.py +0 -224
  135. package/hooks/blocking/md_to_html_blocker.py +0 -155
  136. package/hooks/blocking/test_md_to_html_blocker_exemptions.py +0 -434
  137. package/hooks/blocking/test_md_to_html_blocker_extensions.py +0 -157
  138. package/hooks/blocking/test_md_to_html_blocker_path_resolution.py +0 -336
  139. package/hooks/hooks_constants/doc_gist_auto_publish_constants.py +0 -18
  140. package/hooks/hooks_constants/html_companion_constants.py +0 -20
  141. package/hooks/hooks_constants/md_to_html_blocker_constants.py +0 -76
  142. package/hooks/hooks_constants/test_md_to_html_blocker_constants.py +0 -125
  143. package/hooks/workflow/doc_gist_auto_publish.py +0 -144
  144. package/hooks/workflow/md_to_html_companion.py +0 -358
  145. package/hooks/workflow/test_doc_gist_auto_publish.py +0 -117
  146. package/hooks/workflow/test_md_to_html_companion.py +0 -613
  147. package/skills/bugteam/reference/audit-contract.md +0 -163
  148. package/skills/bugteam/scripts/_bugteam_permissions_common.py +0 -455
  149. package/skills/bugteam/scripts/bugteam_scripts_constants/claude_permissions_common_constants.py +0 -69
  150. package/skills/bugteam/scripts/grant_project_claude_permissions.py +0 -280
  151. package/skills/bugteam/scripts/revoke_project_claude_permissions.py +0 -266
  152. package/skills/bugteam/scripts/test__bugteam_permissions_common.py +0 -160
  153. package/skills/bugteam/scripts/test_agent_config_carveout.py +0 -356
  154. package/skills/bugteam/scripts/test_bugteam_permissions_common.py +0 -140
  155. package/skills/doc-gist/CLAUDE.md +0 -25
  156. package/skills/doc-gist/SKILL.md +0 -97
  157. package/skills/doc-gist/references/CLAUDE.md +0 -9
  158. package/skills/doc-gist/references/examples/01-exploration-code-approaches.html +0 -453
  159. package/skills/doc-gist/references/examples/02-exploration-visual-designs.html +0 -515
  160. package/skills/doc-gist/references/examples/03-code-review-pr.html +0 -638
  161. package/skills/doc-gist/references/examples/04-code-understanding.html +0 -491
  162. package/skills/doc-gist/references/examples/05-design-system.html +0 -629
  163. package/skills/doc-gist/references/examples/06-component-variants.html +0 -605
  164. package/skills/doc-gist/references/examples/07-prototype-animation.html +0 -455
  165. package/skills/doc-gist/references/examples/08-prototype-interaction.html +0 -396
  166. package/skills/doc-gist/references/examples/09-slide-deck.html +0 -592
  167. package/skills/doc-gist/references/examples/10-svg-illustrations.html +0 -492
  168. package/skills/doc-gist/references/examples/11-status-report.html +0 -528
  169. package/skills/doc-gist/references/examples/12-incident-report.html +0 -596
  170. package/skills/doc-gist/references/examples/13-flowchart-diagram.html +0 -395
  171. package/skills/doc-gist/references/examples/14-research-feature-explainer.html +0 -381
  172. package/skills/doc-gist/references/examples/15-research-concept-explainer.html +0 -368
  173. package/skills/doc-gist/references/examples/16-implementation-plan.html +0 -702
  174. package/skills/doc-gist/references/examples/17-pr-writeup.html +0 -595
  175. package/skills/doc-gist/references/examples/18-editor-triage-board.html +0 -573
  176. package/skills/doc-gist/references/examples/19-editor-feature-flags.html +0 -663
  177. package/skills/doc-gist/references/examples/20-editor-prompt-tuner.html +0 -722
  178. package/skills/doc-gist/references/examples/21-decision-signoff.html +0 -546
  179. package/skills/doc-gist/references/examples/CLAUDE.md +0 -25
  180. package/skills/doc-gist/references/examples/README.md +0 -5
  181. package/skills/doc-gist/scripts/CLAUDE.md +0 -27
  182. package/skills/doc-gist/scripts/doc_gist_scripts_constants/CLAUDE.md +0 -10
  183. package/skills/doc-gist/scripts/doc_gist_scripts_constants/gist_upload_constants.py +0 -16
  184. package/skills/doc-gist/scripts/gist_upload.py +0 -177
  185. package/skills/doc-gist/scripts/test_gist_upload.py +0 -51
  186. /package/skills/{doc-gist/scripts/doc_gist_scripts_constants → log-audit/scripts/log_audit_constants}/__init__.py +0 -0
@@ -1,528 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Birchline — Engineering Status — Week 11</title>
7
- <style>
8
- :root {
9
- --ivory: #FAF9F5;
10
- --slate: #141413;
11
- --clay: #D97757;
12
- --oat: #E3DACC;
13
- --olive: #788C5D;
14
- --rust: #B04A3F;
15
- --gray-100: #F0EEE6;
16
- --gray-300: #D1CFC5;
17
- --gray-500: #87867F;
18
- --gray-700: #3D3D3A;
19
- --white: #FFFFFF;
20
-
21
- --serif: ui-serif, Georgia, serif;
22
- --sans: system-ui, -apple-system, sans-serif;
23
- --mono: ui-monospace, 'SF Mono', Menlo, monospace;
24
-
25
- --radius-panel: 12px;
26
- --radius-row: 8px;
27
- --border: 1.5px solid var(--gray-300);
28
- }
29
-
30
- * { box-sizing: border-box; }
31
-
32
- body {
33
- margin: 0;
34
- padding: 56px 24px 120px;
35
- background: var(--ivory);
36
- color: var(--slate);
37
- font-family: var(--sans);
38
- font-size: 15px;
39
- line-height: 1.6;
40
- -webkit-font-smoothing: antialiased;
41
- }
42
-
43
- .page {
44
- max-width: 860px;
45
- margin: 0 auto;
46
- }
47
-
48
- /* ---------- Header ---------- */
49
- header {
50
- margin-bottom: 40px;
51
- }
52
- .header-top {
53
- display: flex;
54
- align-items: baseline;
55
- justify-content: space-between;
56
- flex-wrap: wrap;
57
- gap: 12px;
58
- margin-bottom: 8px;
59
- }
60
- h1 {
61
- font-family: var(--serif);
62
- font-weight: 500;
63
- font-size: 38px;
64
- letter-spacing: -0.01em;
65
- margin: 0;
66
- }
67
- .auto-pill {
68
- font-family: var(--mono);
69
- font-size: 11px;
70
- text-transform: uppercase;
71
- letter-spacing: 0.06em;
72
- color: var(--gray-500);
73
- background: var(--gray-100);
74
- border: var(--border);
75
- border-radius: 999px;
76
- padding: 5px 11px;
77
- white-space: nowrap;
78
- }
79
- .date-range {
80
- color: var(--gray-500);
81
- font-size: 14px;
82
- }
83
- .date-range .repo {
84
- font-family: var(--mono);
85
- font-size: 13px;
86
- color: var(--gray-700);
87
- }
88
-
89
- /* ---------- Sections ---------- */
90
- section {
91
- margin-bottom: 52px;
92
- }
93
- h2 {
94
- font-family: var(--serif);
95
- font-weight: 500;
96
- font-size: 24px;
97
- letter-spacing: -0.01em;
98
- margin: 0 0 6px;
99
- }
100
- hr.rule {
101
- border: none;
102
- border-top: 1px solid var(--gray-300);
103
- margin: 0 0 22px;
104
- }
105
-
106
- /* ---------- Summary band ---------- */
107
- .summary-band {
108
- display: grid;
109
- grid-template-columns: repeat(4, 1fr);
110
- gap: 14px;
111
- }
112
- @media (max-width: 720px) {
113
- .summary-band { grid-template-columns: repeat(2, 1fr); }
114
- }
115
- .stat-card {
116
- background: var(--white);
117
- border: var(--border);
118
- border-radius: var(--radius-panel);
119
- padding: 20px 22px 18px;
120
- }
121
- .stat-card.warn {
122
- border-left: 4px solid var(--clay);
123
- padding-left: 19px;
124
- }
125
- .stat-num {
126
- font-family: var(--serif);
127
- font-size: 44px;
128
- font-weight: 500;
129
- line-height: 1;
130
- color: var(--slate);
131
- margin-bottom: 8px;
132
- }
133
- .stat-label {
134
- font-family: var(--sans);
135
- font-size: 12px;
136
- text-transform: uppercase;
137
- letter-spacing: 0.05em;
138
- color: var(--gray-500);
139
- }
140
- .stat-delta {
141
- font-family: var(--mono);
142
- font-size: 11px;
143
- margin-top: 6px;
144
- }
145
- .stat-delta.up { color: var(--olive); }
146
- .stat-delta.flat { color: var(--gray-500); }
147
-
148
- /* ---------- Highlights ---------- */
149
- .highlights {
150
- list-style: none;
151
- margin: 0;
152
- padding: 0;
153
- }
154
- .highlights li {
155
- position: relative;
156
- padding: 0 0 14px 26px;
157
- font-size: 15px;
158
- color: var(--gray-700);
159
- }
160
- .highlights li::before {
161
- content: "";
162
- position: absolute;
163
- left: 6px;
164
- top: 8px;
165
- width: 7px;
166
- height: 7px;
167
- border-radius: 2px;
168
- background: var(--clay);
169
- }
170
- .highlights li strong {
171
- color: var(--slate);
172
- font-weight: 600;
173
- }
174
-
175
- /* ---------- Shipped table ---------- */
176
- table.shipped {
177
- width: 100%;
178
- border-collapse: separate;
179
- border-spacing: 0;
180
- background: var(--white);
181
- border: var(--border);
182
- border-radius: var(--radius-panel);
183
- overflow: hidden;
184
- }
185
- table.shipped thead th {
186
- text-align: left;
187
- font-family: var(--sans);
188
- font-size: 11px;
189
- font-weight: 600;
190
- text-transform: uppercase;
191
- letter-spacing: 0.06em;
192
- color: var(--gray-500);
193
- background: var(--gray-100);
194
- padding: 12px 16px;
195
- border-bottom: 1px solid var(--gray-300);
196
- }
197
- table.shipped tbody td {
198
- padding: 13px 16px;
199
- border-bottom: 1px solid var(--gray-100);
200
- font-size: 14px;
201
- vertical-align: middle;
202
- }
203
- table.shipped tbody tr:last-child td {
204
- border-bottom: none;
205
- }
206
- table.shipped tbody tr:hover {
207
- background: var(--ivory);
208
- }
209
- .pr-link {
210
- font-family: var(--mono);
211
- font-size: 13px;
212
- color: var(--clay);
213
- text-decoration: none;
214
- border-bottom: 1px dotted transparent;
215
- }
216
- .pr-link:hover {
217
- border-bottom-color: var(--clay);
218
- }
219
- .author {
220
- color: var(--gray-700);
221
- font-size: 13px;
222
- }
223
- .risk {
224
- display: inline-flex;
225
- align-items: center;
226
- gap: 7px;
227
- font-size: 12px;
228
- color: var(--gray-500);
229
- }
230
- .risk-dot {
231
- width: 9px;
232
- height: 9px;
233
- border-radius: 50%;
234
- flex-shrink: 0;
235
- }
236
- .risk-dot.low { background: var(--olive); }
237
- .risk-dot.med { background: var(--clay); }
238
- .risk-dot.high { background: var(--rust); }
239
-
240
- /* ---------- Velocity chart ---------- */
241
- .chart-panel {
242
- background: var(--white);
243
- border: var(--border);
244
- border-radius: var(--radius-panel);
245
- padding: 24px 28px 18px;
246
- }
247
- .chart-panel svg {
248
- display: block;
249
- width: 100%;
250
- height: auto;
251
- }
252
- .chart-caption {
253
- font-size: 12px;
254
- color: var(--gray-500);
255
- margin-top: 12px;
256
- }
257
-
258
- /* ---------- Carryover ---------- */
259
- .carryover {
260
- background: var(--oat);
261
- border-radius: var(--radius-panel);
262
- padding: 20px 22px;
263
- }
264
- .carry-item {
265
- display: flex;
266
- align-items: baseline;
267
- gap: 14px;
268
- padding: 8px 0;
269
- }
270
- .carry-item + .carry-item {
271
- border-top: 1px solid rgba(20, 20, 19, 0.08);
272
- }
273
- .carry-tag {
274
- font-family: var(--mono);
275
- font-size: 11px;
276
- text-transform: uppercase;
277
- letter-spacing: 0.05em;
278
- color: var(--gray-700);
279
- background: var(--ivory);
280
- border-radius: 4px;
281
- padding: 3px 7px;
282
- flex-shrink: 0;
283
- }
284
- .carry-body {
285
- font-size: 14px;
286
- color: var(--gray-700);
287
- }
288
- .carry-body .who {
289
- color: var(--gray-500);
290
- font-size: 12px;
291
- }
292
-
293
- /* ---------- Footer ---------- */
294
- footer {
295
- margin-top: 64px;
296
- padding-top: 20px;
297
- border-top: 1px solid var(--gray-300);
298
- font-family: var(--mono);
299
- font-size: 12px;
300
- color: var(--gray-500);
301
- }
302
- </style>
303
- </head>
304
- <body>
305
- <div class="page">
306
-
307
- <header>
308
- <div class="header-top">
309
- <h1>Engineering Status &mdash; Week 11</h1>
310
- <span class="auto-pill">auto-generated</span>
311
- </div>
312
- <div class="date-range">
313
- Mar 10 &ndash; Mar 16, 2025 &nbsp;&middot;&nbsp;
314
- <span class="repo">birchline/app @ main</span>
315
- </div>
316
- </header>
317
-
318
- <!-- Summary band -->
319
- <section>
320
- <div class="summary-band">
321
- <div class="stat-card">
322
- <div class="stat-num">14</div>
323
- <div class="stat-label">PRs merged</div>
324
- <div class="stat-delta up">+3 vs wk10</div>
325
- </div>
326
- <div class="stat-card">
327
- <div class="stat-num">6</div>
328
- <div class="stat-label">Deploys</div>
329
- <div class="stat-delta flat">&plusmn;0</div>
330
- </div>
331
- <div class="stat-card warn">
332
- <div class="stat-num">1</div>
333
- <div class="stat-label">Incidents</div>
334
- <div class="stat-delta flat">SEV-2 &middot; 47m</div>
335
- </div>
336
- <div class="stat-card">
337
- <div class="stat-num">3</div>
338
- <div class="stat-label">Flaky tests fixed</div>
339
- <div class="stat-delta up">suite now 99.1%</div>
340
- </div>
341
- </div>
342
- </section>
343
-
344
- <!-- Highlights -->
345
- <section>
346
- <h2>Highlights</h2>
347
- <hr class="rule">
348
- <ul class="highlights">
349
- <li>
350
- <strong>Bulk task editing shipped to 100%.</strong> The multi-select
351
- toolbar landed behind a flag on Monday and ramped to all workspaces by
352
- Thursday with no error-rate regression.
353
- </li>
354
- <li>
355
- <strong>Sync API p95 down 38%.</strong> Replacing per-task auth checks
356
- with a scoped batch lookup cut the hot path from 410ms to 255ms on the
357
- staging load test.
358
- </li>
359
- <li>
360
- <strong>One SEV-2 on Wednesday</strong> &mdash; a config rollout pushed
361
- a bad connection-pool limit to the sync workers. Mitigated in 47 minutes;
362
- full postmortem linked below.
363
- </li>
364
- </ul>
365
- </section>
366
-
367
- <!-- Shipped -->
368
- <section>
369
- <h2>Shipped</h2>
370
- <hr class="rule">
371
- <table class="shipped">
372
- <thead>
373
- <tr>
374
- <th style="width: 90px;">PR</th>
375
- <th>Title</th>
376
- <th style="width: 140px;">Author</th>
377
- <th style="width: 100px;">Risk</th>
378
- </tr>
379
- </thead>
380
- <tbody>
381
- <tr>
382
- <td><a class="pr-link" href="#">#4871</a></td>
383
- <td>Bulk edit toolbar: selection model + keyboard shortcuts</td>
384
- <td class="author">Mira Okafor</td>
385
- <td><span class="risk"><span class="risk-dot med"></span>Med</span></td>
386
- </tr>
387
- <tr>
388
- <td><a class="pr-link" href="#">#4874</a></td>
389
- <td>Batch auth lookup for <code>/v2/sync</code> hot path</td>
390
- <td class="author">Devon Park</td>
391
- <td><span class="risk"><span class="risk-dot med"></span>Med</span></td>
392
- </tr>
393
- <tr>
394
- <td><a class="pr-link" href="#">#4878</a></td>
395
- <td>Fix race in attachment uploader retry loop</td>
396
- <td class="author">Sam Reyes</td>
397
- <td><span class="risk"><span class="risk-dot low"></span>Low</span></td>
398
- </tr>
399
- <tr>
400
- <td><a class="pr-link" href="#">#4879</a></td>
401
- <td>Migrate reminder scheduler to idempotent job keys</td>
402
- <td class="author">Priya Anand</td>
403
- <td><span class="risk"><span class="risk-dot high"></span>High</span></td>
404
- </tr>
405
- <tr>
406
- <td><a class="pr-link" href="#">#4882</a></td>
407
- <td>Board view: collapse empty swimlanes by default</td>
408
- <td class="author">Mira Okafor</td>
409
- <td><span class="risk"><span class="risk-dot low"></span>Low</span></td>
410
- </tr>
411
- <tr>
412
- <td><a class="pr-link" href="#">#4885</a></td>
413
- <td>Quarantine 3 flaky webhook integration tests</td>
414
- <td class="author">Jules Tan</td>
415
- <td><span class="risk"><span class="risk-dot low"></span>Low</span></td>
416
- </tr>
417
- <tr>
418
- <td><a class="pr-link" href="#">#4888</a></td>
419
- <td>Connection pool limits configurable per worker tier</td>
420
- <td class="author">Devon Park</td>
421
- <td><span class="risk"><span class="risk-dot med"></span>Med</span></td>
422
- </tr>
423
- <tr>
424
- <td><a class="pr-link" href="#">#4891</a></td>
425
- <td>Dark mode pass on settings &amp; billing panels</td>
426
- <td class="author">Noor Halabi</td>
427
- <td><span class="risk"><span class="risk-dot low"></span>Low</span></td>
428
- </tr>
429
- </tbody>
430
- </table>
431
- </section>
432
-
433
- <!-- Velocity -->
434
- <section>
435
- <h2>Velocity</h2>
436
- <hr class="rule">
437
- <div class="chart-panel">
438
- <svg viewBox="0 0 640 180" role="img" aria-label="PRs merged per day">
439
- <!-- gridlines -->
440
- <line x1="48" y1="20" x2="620" y2="20" stroke="#F0EEE6" stroke-width="1"/>
441
- <line x1="48" y1="60" x2="620" y2="60" stroke="#F0EEE6" stroke-width="1"/>
442
- <line x1="48" y1="100" x2="620" y2="100" stroke="#F0EEE6" stroke-width="1"/>
443
- <line x1="48" y1="140" x2="620" y2="140" stroke="#D1CFC5" stroke-width="1.5"/>
444
-
445
- <!-- y-axis labels -->
446
- <text x="40" y="144" text-anchor="end" font-family="system-ui" font-size="11" fill="#87867F">0</text>
447
- <text x="40" y="104" text-anchor="end" font-family="system-ui" font-size="11" fill="#87867F">1</text>
448
- <text x="40" y="64" text-anchor="end" font-family="system-ui" font-size="11" fill="#87867F">2</text>
449
- <text x="40" y="24" text-anchor="end" font-family="system-ui" font-size="11" fill="#87867F">3</text>
450
-
451
- <!-- bars: 7 days, values 2,3,1,4,2,1,1 (sum 14)
452
- baseline y=140, unit=40px, bar width=56, gap=24, start x=64 -->
453
- <!-- Mon: 2 -->
454
- <rect x="64" y="60" width="56" height="80" rx="6" fill="#E3DACC"/>
455
- <!-- Tue: 3 -->
456
- <rect x="144" y="20" width="56" height="120" rx="6" fill="#E3DACC"/>
457
- <!-- Wed: 1 -->
458
- <rect x="224" y="100" width="56" height="40" rx="6" fill="#E3DACC"/>
459
- <!-- Thu: 4 (peak) -->
460
- <rect x="304" y="0" width="56" height="140" rx="6" fill="#D97757"/>
461
- <!-- Fri: 2 -->
462
- <rect x="384" y="60" width="56" height="80" rx="6" fill="#E3DACC"/>
463
- <!-- Sat: 1 -->
464
- <rect x="464" y="100" width="56" height="40" rx="6" fill="#E3DACC"/>
465
- <!-- Sun: 1 -->
466
- <rect x="544" y="100" width="56" height="40" rx="6" fill="#E3DACC"/>
467
-
468
- <!-- value labels -->
469
- <text x="92" y="54" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">2</text>
470
- <text x="172" y="14" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">3</text>
471
- <text x="252" y="94" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">1</text>
472
- <text x="332" y="14" text-anchor="middle" font-family="system-ui" font-size="11" fill="#3D3D3A" font-weight="600">4</text>
473
- <text x="412" y="54" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">2</text>
474
- <text x="492" y="94" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">1</text>
475
- <text x="572" y="94" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">1</text>
476
-
477
- <!-- x-axis labels -->
478
- <text x="92" y="158" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">Mon</text>
479
- <text x="172" y="158" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">Tue</text>
480
- <text x="252" y="158" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">Wed</text>
481
- <text x="332" y="158" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">Thu</text>
482
- <text x="412" y="158" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">Fri</text>
483
- <text x="492" y="158" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">Sat</text>
484
- <text x="572" y="158" text-anchor="middle" font-family="system-ui" font-size="11" fill="#87867F">Sun</text>
485
- </svg>
486
- <div class="chart-caption">
487
- PRs merged per day. Thursday spike is the bulk-edit feature train (4 PRs landed together).
488
- </div>
489
- </div>
490
- </section>
491
-
492
- <!-- Carryover -->
493
- <section>
494
- <h2>Carryover</h2>
495
- <hr class="rule">
496
- <div class="carryover">
497
- <div class="carry-item">
498
- <span class="carry-tag">In review</span>
499
- <div class="carry-body">
500
- Workspace export to CSV &mdash; waiting on pagination review.
501
- <span class="who">&middot; Sam Reyes</span>
502
- </div>
503
- </div>
504
- <div class="carry-item">
505
- <span class="carry-tag">Blocked</span>
506
- <div class="carry-body">
507
- SSO group mapping &mdash; blocked on staging IdP credentials from IT.
508
- <span class="who">&middot; Priya Anand</span>
509
- </div>
510
- </div>
511
- <div class="carry-item">
512
- <span class="carry-tag">Slipped</span>
513
- <div class="carry-body">
514
- Mobile push reliability dashboard &mdash; deprioritized for incident follow-up.
515
- <span class="who">&middot; Devon Park</span>
516
- </div>
517
- </div>
518
- </div>
519
- </section>
520
-
521
- <footer>
522
- Sources: git log main..HEAD &middot; CI dashboard &middot; deploy log
523
- &nbsp;&mdash;&nbsp; generated Mar 16 2025 18:02
524
- </footer>
525
-
526
- </div>
527
- </body>
528
- </html>