@@ -240,14 +240,46 @@ When annotating the API, consider:
240240
241241## Estimated Effort
242242
243- - ** Phase 1-2** (Core + Impl): ~ 8 files, 2-3 hours
244- - ** Phase 3** (Stats): ~ 11 files, 1-2 hours
245- - ** Phase 4-5** (Instrumentation + Scheduler): ~ 6 files, 1-2 hours
246- - ** Phase 6-7** (Registries + Reactive): ~ 5 files, 1 hour
247- - ** Phase 8** (Annotations): ~ 6 files, 30 minutes
248- - ** Final verification and testing** : 1-2 hours
249-
250- ** Total estimated effort** : 6-10 hours
243+ ### Per-Phase Breakdown
244+
245+ | Phase | Files | Time Estimate | Justification |
246+ | -------| -------| ---------------| ---------------|
247+ | ** Phase 1-2** (Core + Impl) | 8 files | 2-3 hours | ` Try.java ` and ` DataLoaderOptions.java ` require careful analysis of nullable generics and multiple nullable fields. Implementation classes need review of internal null handling. |
248+ | ** Phase 3** (Stats) | 11 files | 1-2 hours | Mostly straightforward classes with few nullable members. Context classes are simple records. |
249+ | ** Phase 4-5** (Instrumentation + Scheduler) | 6 files | 1-2 hours | Methods explicitly return nullable ` DataLoaderInstrumentationContext ` . Requires attention to null callback patterns. |
250+ | ** Phase 6-7** (Registries + Reactive) | 5 files | 1 hour | ` DispatchPredicate ` is simple. Reactive subscribers follow established patterns. |
251+ | ** Phase 8** (Annotations) | 6 files | 30 minutes | Annotation definitions rarely need null annotations; quick review only. |
252+ | ** Final verification** | N/A | 1-2 hours | Full build, test suite, and enable ` AnnotatedPackages ` option. |
253+
254+ ### Time Estimate Rationale
255+
256+ Each file requires the following activities:
257+
258+ 1 . ** Analysis** (~ 5-10 min/file): Review all fields, parameters, return types, and generic bounds
259+ 2 . ** Annotation** (~ 5-10 min/file): Add ` @NullMarked ` and ` @Nullable ` annotations
260+ 3 . ** Compilation check** (~ 2-5 min/file): Run ` ./gradlew compileJava ` and fix NullAway errors
261+ 4 . ** Iteration** (variable): Complex classes may need multiple rounds of fixes
262+
263+ ** Complexity factors that increase time:**
264+ - Generic types with nullable bounds (e.g., ` Try<V> ` , ` DataLoader<K, V> ` )
265+ - Classes with many optional/nullable fields (e.g., ` DataLoaderOptions ` )
266+ - Interfaces that return nullable values (e.g., ` DataLoaderInstrumentation ` )
267+ - Chained builders or fluent APIs
268+
269+ ** Factors that decrease time:**
270+ - Simple data classes with all non-null fields
271+ - Annotation definitions (usually no changes needed)
272+ - Classes that already follow non-null patterns
273+
274+ ### Total Estimated Effort
275+
276+ | Scenario | Hours | Conditions |
277+ | ----------| -------| ------------|
278+ | ** Optimistic** | 6 hours | Experienced with JSpecify, no unexpected issues |
279+ | ** Expected** | 8 hours | Normal pace, some debugging of NullAway errors |
280+ | ** Pessimistic** | 10 hours | Complex edge cases, API design decisions needed |
281+
282+ ** Recommendation** : Plan for 8 hours, which allows for one full working day or 2-3 focused sessions.
251283
252284## References
253285
0 commit comments