claude-dev-env 1.83.0 → 1.84.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 (165) 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/reviews_disabled.py +2 -0
  5. package/_shared/pr-loop/scripts/tests/test__claude_permissions_common.py +212 -0
  6. package/_shared/pr-loop/scripts/tests/test_agent_config_carveout.py +18 -0
  7. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +18 -0
  8. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +37 -0
  9. package/_shared/pr-loop/scripts/tests/test_reviews_disabled.py +14 -0
  10. package/agents/clean-coder.md +3 -0
  11. package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +1 -1
  12. package/bin/install.mjs +16 -8
  13. package/bin/install.test.mjs +17 -6
  14. package/commands/CLAUDE.md +0 -1
  15. package/docs/CODE_RULES.md +1 -1
  16. package/hooks/blocking/CLAUDE.md +0 -4
  17. package/hooks/blocking/code_rules_constants_config.py +5 -0
  18. package/hooks/blocking/code_rules_docstrings.py +116 -6
  19. package/hooks/blocking/code_rules_enforcer.py +4 -0
  20. package/hooks/blocking/code_rules_magic_values.py +5 -0
  21. package/hooks/blocking/code_rules_naming_collection.py +11 -6
  22. package/hooks/blocking/code_rules_shared.py +34 -0
  23. package/hooks/blocking/duplicate_rmtree_helper_blocker.py +4 -4
  24. package/hooks/blocking/test_code_rules_enforcer_docstring_prose_wall_illustration.py +197 -0
  25. package/hooks/blocking/test_code_rules_enforcer_docstring_runon_sentence.py +27 -0
  26. package/hooks/blocking/test_code_rules_enforcer_split_constants_config.py +33 -0
  27. package/hooks/blocking/test_code_rules_enforcer_split_shared.py +23 -0
  28. package/hooks/blocking/test_code_rules_magic_values.py +54 -0
  29. package/hooks/blocking/test_duplicate_rmtree_helper_blocker.py +0 -6
  30. package/hooks/blocking/test_pr_converge_bugteam_enforcer_state_tolerance.py +184 -0
  31. package/hooks/blocking/test_shared_stdin_adoption.py +5 -30
  32. package/hooks/hooks_constants/CLAUDE.md +0 -3
  33. package/hooks/hooks_constants/blocking_check_limits.py +3 -0
  34. package/hooks/hooks_constants/code_rules_path_utils_constants.py +1 -1
  35. package/hooks/hooks_constants/duplicate_rmtree_helper_blocker_constants.py +0 -1
  36. package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -5
  37. package/hooks/validation/post_tool_use_dispatcher.py +1 -1
  38. package/hooks/validation/test_post_tool_use_dispatcher.py +51 -35
  39. package/hooks/workflow/CLAUDE.md +2 -8
  40. package/package.json +1 -1
  41. package/rules/CLAUDE.md +1 -1
  42. package/rules/plain-illustrative-docstrings.md +35 -1
  43. package/skills/CLAUDE.md +6 -1
  44. package/skills/autoconverge/SKILL.md +38 -57
  45. package/skills/autoconverge/reference/closing-report.md +6 -6
  46. package/skills/autoconverge/reference/convergence.md +17 -15
  47. package/skills/autoconverge/reference/gotchas.md +6 -3
  48. package/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +2 -9
  49. package/skills/autoconverge/workflow/converge.contract.test.mjs +87 -13
  50. package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +1 -1
  51. package/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +16 -9
  52. package/skills/autoconverge/workflow/converge.mjs +70 -73
  53. package/skills/autoconverge/workflow/render_report.py +7 -11
  54. package/skills/bugteam/CLAUDE.md +1 -1
  55. package/skills/bugteam/PROMPTS.md +7 -6
  56. package/skills/bugteam/SKILL.md +25 -72
  57. package/skills/bugteam/reference/CLAUDE.md +1 -3
  58. package/skills/bugteam/reference/README.md +1 -1
  59. package/skills/bugteam/reference/audit-and-teammates.md +1 -1
  60. package/skills/bugteam/reference/obstacles/fix-publish-summary.md +1 -1
  61. package/skills/bugteam/reference/team-setup.md +8 -7
  62. package/skills/bugteam/scripts/CLAUDE.md +0 -6
  63. package/skills/bugteam/scripts/README.md +0 -4
  64. package/skills/bugteam/scripts/bugteam_scripts_constants/CLAUDE.md +0 -1
  65. package/skills/code/SKILL.md +2 -0
  66. package/skills/copilot-review/CLAUDE.md +1 -1
  67. package/skills/copilot-review/SKILL.md +25 -23
  68. package/skills/findbugs/CLAUDE.md +2 -2
  69. package/skills/findbugs/SKILL.md +22 -83
  70. package/skills/fixbugs/SKILL.md +2 -4
  71. package/skills/log-audit/CLAUDE.md +20 -0
  72. package/skills/log-audit/SKILL.md +68 -0
  73. package/skills/log-audit/reference/CLAUDE.md +9 -0
  74. package/skills/log-audit/reference/charter.md +52 -0
  75. package/skills/log-audit/scripts/CLAUDE.md +27 -0
  76. package/skills/log-audit/scripts/cluster_recurrences.py +261 -0
  77. package/skills/log-audit/scripts/collect_log_window.py +199 -0
  78. package/skills/log-audit/scripts/log_audit_constants/CLAUDE.md +12 -0
  79. package/skills/log-audit/scripts/log_audit_constants/cluster_recurrences_constants.py +23 -0
  80. package/skills/log-audit/scripts/log_audit_constants/collect_log_window_constants.py +24 -0
  81. package/skills/log-audit/scripts/log_audit_constants/mine_copilot_findings_constants.py +49 -0
  82. package/skills/log-audit/scripts/mine_copilot_findings.py +302 -0
  83. package/skills/log-audit/scripts/test_cluster_recurrences.py +160 -0
  84. package/skills/log-audit/scripts/test_collect_log_window.py +111 -0
  85. package/skills/log-audit/scripts/test_mine_copilot_findings.py +126 -0
  86. package/skills/monitor-open-prs/SKILL.md +2 -2
  87. package/skills/post-audit-findings/SKILL.md +84 -0
  88. package/skills/pr-converge/CLAUDE.md +2 -0
  89. package/skills/pr-converge/SKILL.md +72 -59
  90. package/skills/pr-converge/reference/CLAUDE.md +1 -1
  91. package/skills/pr-converge/reference/convergence-gates.md +16 -19
  92. package/skills/pr-converge/reference/examples.md +5 -5
  93. package/skills/pr-converge/reference/fix-protocol.md +16 -43
  94. package/skills/pr-converge/reference/obstacles/fix-publish-summary.md +1 -1
  95. package/skills/pr-converge/reference/per-tick.md +24 -45
  96. package/skills/pr-converge/reference/state-schema.md +15 -0
  97. package/skills/pr-converge/scripts/README.md +3 -5
  98. package/skills/pr-fix-protocol/SKILL.md +70 -0
  99. package/skills/pr-loop-lifecycle/SKILL.md +73 -0
  100. package/skills/{bugteam → pr-loop-lifecycle}/reference/teardown-publish-permissions.md +22 -24
  101. package/skills/pr-scope-resolve/SKILL.md +48 -0
  102. package/skills/qbug/CLAUDE.md +4 -4
  103. package/skills/qbug/SKILL.md +46 -144
  104. package/skills/qbug/test_qbug_skill_audit_schema.py +2 -2
  105. package/skills/qbug/test_qbug_skill_post_fix_audit.py +1 -1
  106. package/skills/reviewer-gates/SKILL.md +96 -0
  107. package/skills/session-log/CLAUDE.md +7 -7
  108. package/skills/session-log/SKILL.md +27 -44
  109. package/skills/test_markdown_link_integrity.py +103 -0
  110. package/commands/doc-gist.md +0 -16
  111. package/hooks/blocking/_md_to_html_blocker_test_support.py +0 -65
  112. package/hooks/blocking/conftest.py +0 -30
  113. package/hooks/blocking/md_path_exemptions.py +0 -224
  114. package/hooks/blocking/md_to_html_blocker.py +0 -155
  115. package/hooks/blocking/test_md_to_html_blocker_exemptions.py +0 -434
  116. package/hooks/blocking/test_md_to_html_blocker_extensions.py +0 -157
  117. package/hooks/blocking/test_md_to_html_blocker_path_resolution.py +0 -336
  118. package/hooks/hooks_constants/doc_gist_auto_publish_constants.py +0 -18
  119. package/hooks/hooks_constants/html_companion_constants.py +0 -20
  120. package/hooks/hooks_constants/md_to_html_blocker_constants.py +0 -76
  121. package/hooks/hooks_constants/test_md_to_html_blocker_constants.py +0 -125
  122. package/hooks/workflow/doc_gist_auto_publish.py +0 -144
  123. package/hooks/workflow/md_to_html_companion.py +0 -358
  124. package/hooks/workflow/test_doc_gist_auto_publish.py +0 -117
  125. package/hooks/workflow/test_md_to_html_companion.py +0 -613
  126. package/skills/bugteam/reference/audit-contract.md +0 -163
  127. package/skills/bugteam/scripts/_bugteam_permissions_common.py +0 -455
  128. package/skills/bugteam/scripts/bugteam_scripts_constants/claude_permissions_common_constants.py +0 -69
  129. package/skills/bugteam/scripts/grant_project_claude_permissions.py +0 -280
  130. package/skills/bugteam/scripts/revoke_project_claude_permissions.py +0 -266
  131. package/skills/bugteam/scripts/test__bugteam_permissions_common.py +0 -160
  132. package/skills/bugteam/scripts/test_agent_config_carveout.py +0 -356
  133. package/skills/bugteam/scripts/test_bugteam_permissions_common.py +0 -140
  134. package/skills/doc-gist/CLAUDE.md +0 -25
  135. package/skills/doc-gist/SKILL.md +0 -97
  136. package/skills/doc-gist/references/CLAUDE.md +0 -9
  137. package/skills/doc-gist/references/examples/01-exploration-code-approaches.html +0 -453
  138. package/skills/doc-gist/references/examples/02-exploration-visual-designs.html +0 -515
  139. package/skills/doc-gist/references/examples/03-code-review-pr.html +0 -638
  140. package/skills/doc-gist/references/examples/04-code-understanding.html +0 -491
  141. package/skills/doc-gist/references/examples/05-design-system.html +0 -629
  142. package/skills/doc-gist/references/examples/06-component-variants.html +0 -605
  143. package/skills/doc-gist/references/examples/07-prototype-animation.html +0 -455
  144. package/skills/doc-gist/references/examples/08-prototype-interaction.html +0 -396
  145. package/skills/doc-gist/references/examples/09-slide-deck.html +0 -592
  146. package/skills/doc-gist/references/examples/10-svg-illustrations.html +0 -492
  147. package/skills/doc-gist/references/examples/11-status-report.html +0 -528
  148. package/skills/doc-gist/references/examples/12-incident-report.html +0 -596
  149. package/skills/doc-gist/references/examples/13-flowchart-diagram.html +0 -395
  150. package/skills/doc-gist/references/examples/14-research-feature-explainer.html +0 -381
  151. package/skills/doc-gist/references/examples/15-research-concept-explainer.html +0 -368
  152. package/skills/doc-gist/references/examples/16-implementation-plan.html +0 -702
  153. package/skills/doc-gist/references/examples/17-pr-writeup.html +0 -595
  154. package/skills/doc-gist/references/examples/18-editor-triage-board.html +0 -573
  155. package/skills/doc-gist/references/examples/19-editor-feature-flags.html +0 -663
  156. package/skills/doc-gist/references/examples/20-editor-prompt-tuner.html +0 -722
  157. package/skills/doc-gist/references/examples/21-decision-signoff.html +0 -546
  158. package/skills/doc-gist/references/examples/CLAUDE.md +0 -25
  159. package/skills/doc-gist/references/examples/README.md +0 -5
  160. package/skills/doc-gist/scripts/CLAUDE.md +0 -27
  161. package/skills/doc-gist/scripts/doc_gist_scripts_constants/CLAUDE.md +0 -10
  162. package/skills/doc-gist/scripts/doc_gist_scripts_constants/gist_upload_constants.py +0 -16
  163. package/skills/doc-gist/scripts/gist_upload.py +0 -177
  164. package/skills/doc-gist/scripts/test_gist_upload.py +0 -51
  165. /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>