docs: add half-life simulation tables for different work patterns

Added detailed simulation results showing how calendar half-life
translates to effective working-time decay:

- 10h/day (intensive): 72h -> 28.5 work hours at 50%
- 8h/day (typical): 72h -> 22.8 work hours at 50%
- 4h/day (part-time): 72h -> 11.5 work hours at 50%

Key finding: 72h calendar half-life consistently yields ~2.9 work
days at the 50% point, regardless of daily work hours. Activity
scores correctly reflect work fraction (8h/24h = 33.3%).
This commit is contained in:
stellarshenson
2026-01-25 11:54:54 +01:00
parent cdf1e5eaa4
commit b7b3f0e87c
2 changed files with 51 additions and 10 deletions

View File

@@ -252,3 +252,6 @@ This journal tracks substantive work on documents, diagrams, and documentation c
83. **Task - Activity monitor half-life to 72h (3 days)**: Extended decay half-life for smoother scoring<br>
**Result**: Updated JUPYTERHUB_ACTIVITYMON_HALF_LIFE default from 48h to 72h across Dockerfile, custom_handlers.py, activity_sampler.py, settings_dictionary.yml, README.md, and docs/activity-tracking-methodology.md. Added rationale section explaining why 72h: decay applies to wall-clock time, not working time. A user working 8h/day is active only 1/3 of each 24h period - with 72h calendar half-life, ~24 working hours (3 days × 8h) have 50% weight, effectively calibrating decay to one full workday of engagement. This prevents overnight breaks from aggressively penalizing scores
84. **Task - Half-life simulation tables**: Added detailed simulation results to documentation<br>
**Result**: Ran Python simulation for different work patterns (10h, 8h, 4h per day) across calendar half-lives (24h-168h). Added three tables to docs/activity-tracking-methodology.md showing "Work Hours at 50%" and "Work Days at 50%" for each combination. Key finding: 72h calendar half-life consistently yields ~2.9 work days at 50% point regardless of daily work hours. Activity scores correctly reflect work fraction (10h=41.6%, 8h=33.3%, 4h=16.6%)

View File

@@ -11,19 +11,57 @@ Our current approach uses **exponential decay scoring**:
### Why 72-hour Half-life?
The decay applies to **wall-clock time**, not working time. A typical user works 8-9 hours per day - roughly 1/3 of a 24-hour period. This creates a mismatch between calendar decay and effective working activity decay:
The decay applies to **wall-clock time**, not working time. Users work only a fraction of each 24-hour period, creating a mismatch between calendar decay and effective working activity decay.
| Calendar Half-life | Working Hours in Period | Effective Work Half-life |
|--------------------|-------------------------|--------------------------|
| 24 hours | ~8 hours | ~8 hours of work |
| 72 hours (3 days) | ~24 hours | ~24 hours of work |
#### Simulation Results
The following tables show how different calendar half-lives translate to effective working-time decay for various work patterns. "Work Hours at 50%" indicates how many actual working hours contribute 50% of the weighted activity score.
**10h/day work pattern** (intensive)
| Calendar Half-life | Work Hours at 50% | Work Days at 50% | Activity Score |
|:------------------:|:-----------------:|:----------------:|:--------------:|
| 24h (1d) | 10.0h | 1.0 days | 41.0% |
| 48h (2d) | 19.8h | 2.0 days | 41.5% |
| 72h (3d) | 28.5h | 2.9 days | 41.6% |
| 96h (4d) | 35.3h | 3.5 days | 41.6% |
| 168h (7d) | 47.7h | 4.8 days | 41.7% |
**8h/day work pattern** (typical)
| Calendar Half-life | Work Hours at 50% | Work Days at 50% | Activity Score |
|:------------------:|:-----------------:|:----------------:|:--------------:|
| 24h (1d) | 8.0h | 1.0 days | 32.7% |
| 48h (2d) | 16.0h | 2.0 days | 33.2% |
| 72h (3d) | 22.8h | 2.9 days | 33.3% |
| 96h (4d) | 28.3h | 3.5 days | 33.3% |
| 168h (7d) | 38.2h | 4.8 days | 33.3% |
**4h/day work pattern** (part-time)
| Calendar Half-life | Work Hours at 50% | Work Days at 50% | Activity Score |
|:------------------:|:-----------------:|:----------------:|:--------------:|
| 24h (1d) | 4.0h | 1.0 days | 16.3% |
| 48h (2d) | 8.0h | 2.0 days | 16.6% |
| 72h (3d) | 11.5h | 2.9 days | 16.6% |
| 96h (4d) | 14.2h | 3.5 days | 16.6% |
| 168h (7d) | 19.2h | 4.8 days | 16.7% |
#### Summary: 72-hour Half-life Across Work Patterns
| Work Pattern | Work Hours at 50% | Effective Work Days | Activity Score |
|:------------:|:-----------------:|:-------------------:|:--------------:|
| 10h/day | 28.5h | 2.9 days | 41.6% |
| 8h/day | 22.8h | 2.9 days | 33.3% |
| 4h/day | 11.5h | 2.9 days | 16.6% |
#### Key Insights
With a 72-hour calendar half-life:
- A user working 8h/day accumulates ~24 hours of working time over 3 calendar days
- Activity from those 24 working hours has 50% weight
- The decay is effectively calibrated to **one full workday** of actual engagement
This makes scores more stable for users with typical work patterns. A 24-hour half-life would be too aggressive - yesterday's full workday would already be at 50% weight before today even starts, penalizing normal overnight breaks
- **Consistent ~3 work days** at the 50% point regardless of daily work hours
- Activity score reflects actual work fraction (8h/24h ≈ 33%, 4h/24h ≈ 17%)
- Overnight breaks don't aggressively penalize scores
- A 24-hour half-life would be too aggressive - yesterday's work already at 50% weight before today starts
## Industry Approaches