claude-dev-env 1.82.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 (217) hide show
  1. package/CLAUDE.md +16 -13
  2. package/_shared/pr-loop/audit-contract.md +24 -12
  3. package/_shared/pr-loop/scripts/CLAUDE.md +1 -0
  4. package/_shared/pr-loop/scripts/README.md +1 -0
  5. package/_shared/pr-loop/scripts/_claude_permissions_common.py +16 -5
  6. package/_shared/pr-loop/scripts/code_rules_gate.py +2 -3
  7. package/_shared/pr-loop/scripts/pr_loop_shared_constants/CLAUDE.md +1 -0
  8. package/_shared/pr-loop/scripts/pr_loop_shared_constants/reviewer_availability_constants.py +12 -0
  9. package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +0 -2
  10. package/_shared/pr-loop/scripts/reviewer_availability.py +182 -0
  11. package/_shared/pr-loop/scripts/reviews_disabled.py +2 -0
  12. package/_shared/pr-loop/scripts/terminology_sweep.py +9 -33
  13. package/_shared/pr-loop/scripts/tests/CLAUDE.md +2 -0
  14. package/_shared/pr-loop/scripts/tests/test__claude_permissions_common.py +212 -0
  15. package/_shared/pr-loop/scripts/tests/test_agent_config_carveout.py +18 -0
  16. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +18 -0
  17. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +37 -0
  18. package/_shared/pr-loop/scripts/tests/test_reviewer_availability.py +159 -0
  19. package/_shared/pr-loop/scripts/tests/test_reviewer_availability_constants.py +36 -0
  20. package/_shared/pr-loop/scripts/tests/test_reviews_disabled.py +14 -0
  21. package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +14 -4
  22. package/agents/clean-coder.md +3 -0
  23. package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +1 -1
  24. package/bin/install.mjs +16 -8
  25. package/bin/install.test.mjs +17 -6
  26. package/commands/CLAUDE.md +0 -1
  27. package/docs/CODE_RULES.md +1 -1
  28. package/hooks/blocking/CLAUDE.md +2 -4
  29. package/hooks/blocking/code_rules_constants_config.py +164 -1
  30. package/hooks/blocking/code_rules_docstrings.py +428 -15
  31. package/hooks/blocking/code_rules_enforcer.py +33 -0
  32. package/hooks/blocking/code_rules_imports_logging.py +867 -1
  33. package/hooks/blocking/code_rules_magic_values.py +5 -0
  34. package/hooks/blocking/code_rules_naming_collection.py +152 -6
  35. package/hooks/blocking/code_rules_shared.py +34 -0
  36. package/hooks/blocking/code_rules_string_magic.py +68 -0
  37. package/hooks/blocking/duplicate_rmtree_helper_blocker.py +4 -4
  38. package/hooks/blocking/pre_tool_use_dispatcher.py +3 -3
  39. package/hooks/blocking/reviewer_spawn_gate.py +182 -0
  40. package/hooks/blocking/stale_comment_reference_blocker.py +267 -0
  41. package/hooks/blocking/state_description_blocker.py +96 -5
  42. package/hooks/blocking/test_code_rules_config_duplicate_path_anchor.py +132 -0
  43. package/hooks/blocking/test_code_rules_enforcer_cap_meta.py +2 -0
  44. package/hooks/blocking/test_code_rules_enforcer_docstring_delegation_summary.py +385 -0
  45. package/hooks/blocking/test_code_rules_enforcer_docstring_prose_wall_illustration.py +197 -0
  46. package/hooks/blocking/test_code_rules_enforcer_docstring_runon_sentence.py +27 -0
  47. package/hooks/blocking/test_code_rules_enforcer_join_separator_magic.py +67 -0
  48. package/hooks/blocking/test_code_rules_enforcer_module_docstring_roster.py +40 -0
  49. package/hooks/blocking/test_code_rules_enforcer_naive_datetime.py +213 -0
  50. package/hooks/blocking/test_code_rules_enforcer_referenced_underscore_loop.py +169 -0
  51. package/hooks/blocking/test_code_rules_enforcer_split_constants_config.py +33 -0
  52. package/hooks/blocking/test_code_rules_enforcer_split_shared.py +23 -0
  53. package/hooks/blocking/test_code_rules_js_bare_flag_return_directive.py +266 -0
  54. package/hooks/blocking/test_code_rules_js_sibling_return_object_key_drift.py +490 -0
  55. package/hooks/blocking/test_code_rules_logging_adjacent_literals.py +171 -0
  56. package/hooks/blocking/test_code_rules_magic_values.py +54 -0
  57. package/hooks/blocking/test_duplicate_rmtree_helper_blocker.py +0 -6
  58. package/hooks/blocking/test_pr_converge_bugteam_enforcer_state_tolerance.py +184 -0
  59. package/hooks/blocking/test_pre_tool_use_dispatcher.py +9 -3
  60. package/hooks/blocking/test_reviewer_spawn_gate.py +230 -0
  61. package/hooks/blocking/test_shared_stdin_adoption.py +5 -30
  62. package/hooks/blocking/test_stale_comment_reference_blocker.py +236 -0
  63. package/hooks/blocking/test_state_description_blocker.py +135 -0
  64. package/hooks/hooks.json +5 -0
  65. package/hooks/hooks_constants/CLAUDE.md +3 -4
  66. package/hooks/hooks_constants/blocking_check_limits.py +46 -0
  67. package/hooks/hooks_constants/code_rules_enforcer_constants.py +41 -0
  68. package/hooks/hooks_constants/code_rules_path_utils_constants.py +1 -1
  69. package/hooks/hooks_constants/duplicate_rmtree_helper_blocker_constants.py +0 -1
  70. package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -5
  71. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +4 -0
  72. package/hooks/hooks_constants/reviewer_spawn_gate_constants.py +41 -0
  73. package/hooks/hooks_constants/stale_comment_reference_blocker_constants.py +76 -0
  74. package/hooks/hooks_constants/state_description_blocker_constants.py +8 -0
  75. package/hooks/validation/post_tool_use_dispatcher.py +1 -1
  76. package/hooks/validation/test_post_tool_use_dispatcher.py +51 -35
  77. package/hooks/workflow/CLAUDE.md +2 -8
  78. package/package.json +1 -1
  79. package/rules/CLAUDE.md +5 -2
  80. package/rules/claude-md-orphan-file.md +5 -0
  81. package/rules/docstring-prose-matches-implementation.md +10 -1
  82. package/rules/env-var-table-code-drift.md +5 -0
  83. package/rules/es-exe-file-search.md +17 -0
  84. package/rules/no-historical-clutter.md +12 -1
  85. package/rules/orphan-css-class.md +5 -0
  86. package/rules/package-inventory-stale-entry.md +10 -0
  87. package/rules/paired-test-coverage.md +5 -0
  88. package/rules/plain-illustrative-docstrings.md +40 -1
  89. package/rules/verify-before-asking.md +7 -0
  90. package/rules/verify-runtime-state.md +40 -0
  91. package/rules/windows-filesystem-safe.md +8 -0
  92. package/rules/workers-done-before-complete.md +33 -0
  93. package/rules/workflow-substitution-slots.md +5 -0
  94. package/skills/CLAUDE.md +7 -2
  95. package/skills/autoconverge/SKILL.md +48 -61
  96. package/skills/autoconverge/reference/closing-report.md +6 -6
  97. package/skills/autoconverge/reference/convergence.md +17 -15
  98. package/skills/autoconverge/reference/gotchas.md +6 -3
  99. package/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +2 -9
  100. package/skills/autoconverge/workflow/converge.contract.test.mjs +153 -10
  101. package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +55 -19
  102. package/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +16 -9
  103. package/skills/autoconverge/workflow/converge.mjs +167 -106
  104. package/skills/autoconverge/workflow/render_report.py +7 -11
  105. package/skills/bugteam/CLAUDE.md +1 -1
  106. package/skills/bugteam/PROMPTS.md +7 -6
  107. package/skills/bugteam/SKILL.md +25 -72
  108. package/skills/bugteam/reference/CLAUDE.md +1 -3
  109. package/skills/bugteam/reference/README.md +1 -1
  110. package/skills/bugteam/reference/audit-and-teammates.md +1 -1
  111. package/skills/bugteam/reference/obstacles/fix-publish-summary.md +1 -1
  112. package/skills/bugteam/reference/team-setup.md +8 -7
  113. package/skills/bugteam/scripts/CLAUDE.md +0 -6
  114. package/skills/bugteam/scripts/README.md +0 -4
  115. package/skills/bugteam/scripts/bugteam_scripts_constants/CLAUDE.md +0 -1
  116. package/skills/code/SKILL.md +2 -0
  117. package/skills/copilot-review/CLAUDE.md +1 -1
  118. package/skills/copilot-review/SKILL.md +25 -23
  119. package/skills/everything-search/SKILL.md +5 -0
  120. package/skills/findbugs/CLAUDE.md +2 -2
  121. package/skills/findbugs/SKILL.md +22 -83
  122. package/skills/fixbugs/SKILL.md +2 -4
  123. package/skills/log-audit/CLAUDE.md +20 -0
  124. package/skills/log-audit/SKILL.md +68 -0
  125. package/skills/log-audit/reference/CLAUDE.md +9 -0
  126. package/skills/log-audit/reference/charter.md +52 -0
  127. package/skills/log-audit/scripts/CLAUDE.md +27 -0
  128. package/skills/log-audit/scripts/cluster_recurrences.py +261 -0
  129. package/skills/log-audit/scripts/collect_log_window.py +199 -0
  130. package/skills/log-audit/scripts/log_audit_constants/CLAUDE.md +12 -0
  131. package/skills/log-audit/scripts/log_audit_constants/cluster_recurrences_constants.py +23 -0
  132. package/skills/log-audit/scripts/log_audit_constants/collect_log_window_constants.py +24 -0
  133. package/skills/log-audit/scripts/log_audit_constants/mine_copilot_findings_constants.py +49 -0
  134. package/skills/log-audit/scripts/mine_copilot_findings.py +302 -0
  135. package/skills/log-audit/scripts/test_cluster_recurrences.py +160 -0
  136. package/skills/log-audit/scripts/test_collect_log_window.py +111 -0
  137. package/skills/log-audit/scripts/test_mine_copilot_findings.py +126 -0
  138. package/skills/monitor-open-prs/SKILL.md +2 -2
  139. package/skills/post-audit-findings/SKILL.md +84 -0
  140. package/skills/pr-converge/CLAUDE.md +2 -0
  141. package/skills/pr-converge/SKILL.md +72 -59
  142. package/skills/pr-converge/reference/CLAUDE.md +1 -1
  143. package/skills/pr-converge/reference/convergence-gates.md +16 -19
  144. package/skills/pr-converge/reference/examples.md +5 -5
  145. package/skills/pr-converge/reference/fix-protocol.md +16 -43
  146. package/skills/pr-converge/reference/obstacles/fix-publish-summary.md +1 -1
  147. package/skills/pr-converge/reference/per-tick.md +24 -45
  148. package/skills/pr-converge/reference/state-schema.md +15 -0
  149. package/skills/pr-converge/scripts/README.md +3 -5
  150. package/skills/pr-fix-protocol/SKILL.md +70 -0
  151. package/skills/pr-loop-lifecycle/SKILL.md +73 -0
  152. package/skills/{bugteam → pr-loop-lifecycle}/reference/teardown-publish-permissions.md +22 -24
  153. package/skills/pr-scope-resolve/SKILL.md +48 -0
  154. package/skills/qbug/CLAUDE.md +4 -4
  155. package/skills/qbug/SKILL.md +46 -144
  156. package/skills/qbug/test_qbug_skill_audit_schema.py +2 -2
  157. package/skills/qbug/test_qbug_skill_post_fix_audit.py +1 -1
  158. package/skills/reviewer-gates/SKILL.md +96 -0
  159. package/skills/session-log/CLAUDE.md +7 -7
  160. package/skills/session-log/SKILL.md +27 -44
  161. package/skills/test_markdown_link_integrity.py +103 -0
  162. package/commands/doc-gist.md +0 -16
  163. package/hooks/blocking/_md_to_html_blocker_test_support.py +0 -65
  164. package/hooks/blocking/conftest.py +0 -30
  165. package/hooks/blocking/md_path_exemptions.py +0 -224
  166. package/hooks/blocking/md_to_html_blocker.py +0 -155
  167. package/hooks/blocking/test_md_to_html_blocker_exemptions.py +0 -434
  168. package/hooks/blocking/test_md_to_html_blocker_extensions.py +0 -157
  169. package/hooks/blocking/test_md_to_html_blocker_path_resolution.py +0 -336
  170. package/hooks/hooks_constants/doc_gist_auto_publish_constants.py +0 -18
  171. package/hooks/hooks_constants/html_companion_constants.py +0 -20
  172. package/hooks/hooks_constants/md_to_html_blocker_constants.py +0 -76
  173. package/hooks/hooks_constants/test_md_to_html_blocker_constants.py +0 -125
  174. package/hooks/workflow/doc_gist_auto_publish.py +0 -144
  175. package/hooks/workflow/md_to_html_companion.py +0 -358
  176. package/hooks/workflow/test_doc_gist_auto_publish.py +0 -117
  177. package/hooks/workflow/test_md_to_html_companion.py +0 -613
  178. package/skills/bugteam/reference/audit-contract.md +0 -163
  179. package/skills/bugteam/scripts/_bugteam_permissions_common.py +0 -455
  180. package/skills/bugteam/scripts/bugteam_scripts_constants/claude_permissions_common_constants.py +0 -69
  181. package/skills/bugteam/scripts/grant_project_claude_permissions.py +0 -280
  182. package/skills/bugteam/scripts/revoke_project_claude_permissions.py +0 -266
  183. package/skills/bugteam/scripts/test__bugteam_permissions_common.py +0 -160
  184. package/skills/bugteam/scripts/test_agent_config_carveout.py +0 -356
  185. package/skills/bugteam/scripts/test_bugteam_permissions_common.py +0 -140
  186. package/skills/doc-gist/CLAUDE.md +0 -25
  187. package/skills/doc-gist/SKILL.md +0 -97
  188. package/skills/doc-gist/references/CLAUDE.md +0 -9
  189. package/skills/doc-gist/references/examples/01-exploration-code-approaches.html +0 -453
  190. package/skills/doc-gist/references/examples/02-exploration-visual-designs.html +0 -515
  191. package/skills/doc-gist/references/examples/03-code-review-pr.html +0 -638
  192. package/skills/doc-gist/references/examples/04-code-understanding.html +0 -491
  193. package/skills/doc-gist/references/examples/05-design-system.html +0 -629
  194. package/skills/doc-gist/references/examples/06-component-variants.html +0 -605
  195. package/skills/doc-gist/references/examples/07-prototype-animation.html +0 -455
  196. package/skills/doc-gist/references/examples/08-prototype-interaction.html +0 -396
  197. package/skills/doc-gist/references/examples/09-slide-deck.html +0 -592
  198. package/skills/doc-gist/references/examples/10-svg-illustrations.html +0 -492
  199. package/skills/doc-gist/references/examples/11-status-report.html +0 -528
  200. package/skills/doc-gist/references/examples/12-incident-report.html +0 -596
  201. package/skills/doc-gist/references/examples/13-flowchart-diagram.html +0 -395
  202. package/skills/doc-gist/references/examples/14-research-feature-explainer.html +0 -381
  203. package/skills/doc-gist/references/examples/15-research-concept-explainer.html +0 -368
  204. package/skills/doc-gist/references/examples/16-implementation-plan.html +0 -702
  205. package/skills/doc-gist/references/examples/17-pr-writeup.html +0 -595
  206. package/skills/doc-gist/references/examples/18-editor-triage-board.html +0 -573
  207. package/skills/doc-gist/references/examples/19-editor-feature-flags.html +0 -663
  208. package/skills/doc-gist/references/examples/20-editor-prompt-tuner.html +0 -722
  209. package/skills/doc-gist/references/examples/21-decision-signoff.html +0 -546
  210. package/skills/doc-gist/references/examples/CLAUDE.md +0 -25
  211. package/skills/doc-gist/references/examples/README.md +0 -5
  212. package/skills/doc-gist/scripts/CLAUDE.md +0 -27
  213. package/skills/doc-gist/scripts/doc_gist_scripts_constants/CLAUDE.md +0 -10
  214. package/skills/doc-gist/scripts/doc_gist_scripts_constants/gist_upload_constants.py +0 -16
  215. package/skills/doc-gist/scripts/gist_upload.py +0 -177
  216. package/skills/doc-gist/scripts/test_gist_upload.py +0 -51
  217. /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>