|
| 1 | +#+title: Linear |
| 2 | +#+startup: content |
| 3 | + |
| 4 | +We use Linear to keep on top of the backlog of tasks associated with new |
| 5 | +features, improvements, and bugs we need to squash. |
| 6 | + |
| 7 | +* Estimation |
| 8 | +:PROPERTIES: |
| 9 | +:CUSTOM_ID: estimation |
| 10 | +:END: |
| 11 | +We use Fibonacci-scale story points to estimate the relative size of |
| 12 | +work. Points measure complexity and effort, not time. A task that takes |
| 13 | +one person a day might be a 2 for an expert or an 8 for someone learning |
| 14 | +the domain. |
| 15 | + |
| 16 | +** Quick Reference |
| 17 | +| Pts | Size | Layers | Tests | Example | |
| 18 | +|-----+---------------+--------+----------------+--------------------------------------| |
| 19 | +| 1 | Single file | 1 | None/minimal | Fix typo, config tweak | |
| 20 | +| 2 | Few files | 1 | Few unit tests | Add schema attr, new spec | |
| 21 | +| 3 | One feature | 1 | Some tests | New Hiccup component, action handler | |
| 22 | +| 5 | Multi-file | 1--2 | Good coverage | New tab view, component lifecycle | |
| 23 | +| 8 | Cross-cutting | 3+ | Comprehensive | Schema + middleware + config + tests | |
| 24 | +| 13 | *Decompose* | --- | --- | Session hardening, OAuth provider | |
| 25 | +| 21 | *Decompose* | --- | --- | Per-tenant DBs, GDPR excision | |
| 26 | + |
| 27 | +*Rule of thumb:* If it touches 3+ layers with comprehensive tests, it's an 8. If |
| 28 | +it's bigger than that, decompose it. |
| 29 | + |
| 30 | +** The Scale |
| 31 | +| Points | Complexity | Status | |
| 32 | +|--------+-------------+---------------------------| |
| 33 | +| 1 | Trivial | Ready to work | |
| 34 | +| 2 | Small | Ready to work | |
| 35 | +| 3 | Moderate | Ready to work | |
| 36 | +| 5 | Significant | Ready to work | |
| 37 | +| 8 | Large | Ready to work | |
| 38 | +| 13 | Too large | Decompose before starting | |
| 39 | +| 21 | Epic | Decompose before starting | |
| 40 | + |
| 41 | +Issues estimated at 13 or 21 must be broken down into smaller tasks before work |
| 42 | +begins. Filter Linear for =estimate >= 8= to find decomposition candidates |
| 43 | +during planning. |
| 44 | + |
| 45 | +** Point Definitions |
| 46 | +*** 1 Point --- Trivial |
| 47 | +Single-file fix, typo, config tweak, no coordination needed. |
| 48 | + |
| 49 | +- Fix a typo in documentation |
| 50 | +- Update a dependency version in deps.edn |
| 51 | +- Add a missing environment variable to devenv.nix |
| 52 | +- Suppress a logging warning in configuration |
| 53 | + |
| 54 | +*** 2 Points --- Small |
| 55 | +Small, well-understood change with minimal testing impact. |
| 56 | + |
| 57 | +- Add a new Tailwind color token to the theme template |
| 58 | +- Add a new attribute to Datomic schema |
| 59 | +- Fix a CSS layout issue in a Hiccup component |
| 60 | +- Add a missing spec to bits.spec |
| 61 | + |
| 62 | +*** 3 Points --- Moderate |
| 63 | +Single feature in one layer, requires some tests. |
| 64 | + |
| 65 | +- Add a new Hiccup UI component in bits.ui.* |
| 66 | +- Add a new action handler in bits.next |
| 67 | +- Implement a form with Malli coercion validation |
| 68 | +- Add a new middleware function with tests |
| 69 | + |
| 70 | +*** 5 Points --- Significant |
| 71 | +Multi-file feature, requires good test coverage, may touch a couple of layers. |
| 72 | + |
| 73 | +- Add a new tab view with components and actions |
| 74 | +- Implement a new component with lifecycle (record + factory + spec) |
| 75 | +- Add PostgreSQL migration with queries and session integration |
| 76 | +- Create a UI namespace with multiple related components |
| 77 | + |
| 78 | +*** 8 Points --- Large |
| 79 | +Cross-cutting feature, multiple layers, comprehensive testing, may require |
| 80 | +domain knowledge or iteration. |
| 81 | + |
| 82 | +- Migrate database backend (schema, deps, config, tests) |
| 83 | +- Add multi-step modal with SSE state transitions |
| 84 | +- Implement tenant-scoped feature with middleware, schema, and tests |
| 85 | +- Build real-time feature with client/server coordination |
| 86 | + |
| 87 | +*** 13 Points --- Too Large |
| 88 | +Architectural change, new subsystem, significant coordination. *Must be |
| 89 | +decomposed before work begins.* |
| 90 | + |
| 91 | +- Session security hardening (tenant scoping, hashing, drift detection) |
| 92 | +- Add OAuth/OIDC identity provider (Sign in with Bits) |
| 93 | +- Implement horizontal scaling for real-time features |
| 94 | +- Major refactor affecting multiple components and their dependencies |
| 95 | + |
| 96 | +*** 21 Points --- Epic |
| 97 | +Fundamental restructuring or new capability. *Must be decomposed before work |
| 98 | +begins.* |
| 99 | + |
| 100 | +- Per-tenant Datomic databases with connection pooling |
| 101 | +- GDPR excision infrastructure with deletion workflows |
| 102 | +- Complete redesign of a core user flow |
| 103 | +- Adding payment processing with multiple providers |
| 104 | + |
| 105 | +** Estimation Guidelines |
| 106 | +*** Issues Must Be Deliverables |
| 107 | +Each issue must represent a complete, measurable piece of value. An issue is |
| 108 | +done when it is *implemented, tested, and documented*. |
| 109 | + |
| 110 | +Do not create separate issues for: |
| 111 | + |
| 112 | +- "Write the tests" |
| 113 | +- "Write the documentation" |
| 114 | +- "Implement the feature" |
| 115 | + |
| 116 | +These are parts of one deliverable---the working, tested, documented |
| 117 | +feature. |
| 118 | + |
| 119 | +*** Decomposition Means Zero Points on Parent |
| 120 | +Sub-issues are for *decomposition only*. When you decompose an issue: |
| 121 | + |
| 122 | +- All work moves to the sub-issues |
| 123 | +- The parent becomes a tracking container with *0 points* |
| 124 | +- Each sub-issue is a complete deliverable |
| 125 | + |
| 126 | +*Strict rule:* A parent with sub-issues always has 0 points. |
| 127 | + |
| 128 | +| Situation | Action | |
| 129 | +|-------------------------------------------+-----------------------------------------------| |
| 130 | +| Decomposing a large issue | Create sub-issues, set parent to 0 points | |
| 131 | +| Estimating a sub-issue | Estimate normally; verify parent has 0 points | |
| 132 | +| Found parent with estimate AND sub-issues | Remove the parent's estimate | |
| 133 | + |
| 134 | +*Don't use sub-issues for associated tasks.* If you have a reminder or follow-up |
| 135 | +that isn't part of decomposition, use Linear's "Related issues" feature instead. |
| 136 | +Related issues are separate deliverables with their own estimates---no |
| 137 | +double-counting risk. |
| 138 | + |
| 139 | +*** Compare, Don't Calculate |
| 140 | +Estimate by comparing to known tasks, not by adding up hours. Ask: "Is this |
| 141 | +bigger or smaller than our 8-point reference?" |
| 142 | + |
| 143 | +*** Uncertainty Increases Points |
| 144 | +If you don't fully understand the problem space, estimate higher. A "probably |
| 145 | +simple" task with unknowns might be a 5 instead of a 3. |
| 146 | + |
| 147 | +*** Include Testing |
| 148 | +Points include all work: implementation, tests, documentation, code review |
| 149 | +iterations. A feature with comprehensive test requirements is larger than one |
| 150 | +without. |
| 151 | + |
| 152 | +*** Avoid Anchoring on Time |
| 153 | +"This will take a day" is not estimation. Two people might take different |
| 154 | +amounts of time on the same 5-point task based on familiarity with the code. |
| 155 | + |
| 156 | +*** Re-estimate When Scope Changes |
| 157 | +If requirements change mid-task, update the estimate. This helps calibrate |
| 158 | +future estimates. |
| 159 | + |
| 160 | +** Velocity |
| 161 | +:PROPERTIES: |
| 162 | +:CUSTOM_ID: velocity |
| 163 | +:END: |
| 164 | +Velocity measures how many points a developer completes per week. Use |
| 165 | +this to forecast project target dates. |
| 166 | + |
| 167 | +*** Adjusting Velocity |
| 168 | +Re-calculate velocity after each completed sprint: |
| 169 | + |
| 170 | +#+begin_example |
| 171 | +velocity = points_completed / weeks_elapsed |
| 172 | +#+end_example |
| 173 | + |
| 174 | +Update project target dates using =/forecast= when velocity changes |
| 175 | +significantly (±20% or more). |
| 176 | + |
| 177 | +*** Scaling |
| 178 | +Adding developers doesn't double velocity due to coordination overhead. Rough |
| 179 | +multipliers: |
| 180 | + |
| 181 | +| Team size | Effective multiplier | |
| 182 | +|-----------+----------------------| |
| 183 | +| 1 | 1.0× | |
| 184 | +| 2 | 1.7× | |
| 185 | +| 3 | 2.2× | |
| 186 | + |
| 187 | +** Decomposition |
| 188 | +When an issue is estimated at 13 or 21: |
| 189 | + |
| 190 | +1. Identify independent deliverables within the work |
| 191 | +2. Create child issues for each deliverable |
| 192 | +3. Estimate each child issue (should be 8 or less) |
| 193 | +4. Keep the parent as an epic or project for tracking |
| 194 | + |
| 195 | +Signs that decomposition is needed: |
| 196 | + |
| 197 | +- Multiple unrelated acceptance criteria |
| 198 | +- Work spans more than two major system layers |
| 199 | +- Requires sequential phases (research, then implementation, then |
| 200 | + migration) |
| 201 | +- Different people could work on different parts independently |
0 commit comments