7.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	Integration Point Refactor - Quick Start Guide
Author: Matthew Raymer
Date: 2025-10-29
Status: 🎯 REFERENCE - Quick start for implementation on any machine
Overview
This guide helps you get started implementing the Integration Point Refactor on any machine. All planning and specifications are documented in the codebase.
Key Documents
- 
docs/integration-point-refactor-analysis.md- Complete analysis + improvement directive- Architecture decisions (ADR-001)
 - Public interfaces (TypeScript + Kotlin)
 - Migration plan (7 PRs)
 - Acceptance criteria
 - Risk register
 
 - 
src/types/content-fetcher.ts- TypeScript type definitionsNotificationContentinterfaceJsNotificationContentFetcherinterfaceSchedulingPolicyinterfaceFetchContextinterface
 - 
examples/native-fetcher-android.kt- Kotlin native fetcher skeleton- Complete example implementation
 - Registration pattern
 - Error handling
 
 - 
examples/js-fetcher-typescript.ts- TypeScript JS fetcher skeleton- Foreground fetcher implementation
 - Policy configuration example
 
 - 
tests/fixtures/test-contract.json- Golden test contract- Shared fixture for both JS and Native fetchers
 - Failure scenarios
 
 
Implementation Roadmap (7 PRs)
PR1 — SPI Shell
Status: Ready to start Files to create:
- Kotlin/Swift interface definitions
 - TypeScript types (already in 
src/types/content-fetcher.ts) SchedulingPolicyimplementation (plugin side)- No behavior change yet
 
Reference: Section B in analysis doc
PR2 — Background Workers
Status: After PR1 Tasks:
- Wire Native SPI in WorkManager/BGTasks
 - Metrics skeleton
 - Cache store
 
Reference: Section C1 (Background Reliability)
PR3 — JS Fetcher Path
Status: After PR2 Tasks:
- Foreground bridge
 - Event bus
 - Dev harness screen
 
Reference: Section B1 (TypeScript interfaces)
PR4 — Dedupe/Idempotency
Status: After PR3 Tasks:
- Bloom/filter store
 dedupeKeyenforcement- Tests
 
Reference: Section C3 (Idempotency & De-duplication)
PR5 — Failure Policy
Status: After PR4 Tasks:
- Retry taxonomy (Section E)
 - Backoff implementation
 - Cache fallback
 - Structured errors
 
PR6 — Docs & Samples
Status: After PR5 Tasks:
- INTEGRATION_GUIDE.md (when to use which fetcher)
 - SCHEDULING_POLICY.md (all configuration knobs)
 - Copy-paste snippets
 
PR7 — Feature Flag Legacy
Status: After PR6 Tasks:
- Guard legacy TimeSafari code behind flag
 - Regression tests
 - Changelog for major removal
 
Reference: Section H (Migration Plan)
Architecture Decisions
ADR-001: Dual-Path SPI
- Native Fetcher (Kotlin/Swift) - Required for background
 - JS Fetcher (TypeScript) - Optional, foreground only
 - Legacy code behind feature flag for one minor release
 
See: Section A in analysis doc
Interface Contracts
TypeScript (Host App)
// From src/types/content-fetcher.ts
interface JsNotificationContentFetcher {
  fetchContent(context: FetchContext): Promise<NotificationContent[]>;
}
// Plugin API additions
interface DailyNotificationPlugin {
  setJsContentFetcher(fetcher: JsNotificationContentFetcher): void;
  enableNativeFetcher(enable: boolean): Promise<void>;
  setPolicy(policy: SchedulingPolicy): Promise<void>;
}
Android SPI (Native)
interface NativeNotificationContentFetcher {
    suspend fun fetchContent(context: FetchContext): List<NotificationContent>
}
See: Section B in analysis doc
Key Constraints
Background Workers
- Android: WorkManager - NO JS bridging, native SPI only
 - iOS: BGAppRefreshTask/BGProcessingTask - native SPI only
 - Tasks: Keep < 30s, respect backoff
 
Security
- JWT generation in host app only
 - No TimeSafari DTOs in plugin
 - Tokens never serialized through JS in background
 
Deduplication
- Use 
dedupeKey(fallbackid) - Bloom/filter for recent keys
 - Horizon: 
dedupeHorizonMs(default 24h) 
See: Sections C, D in analysis doc
Failure Handling
| Class | Examples | Behavior | 
|---|---|---|
| Retryable | 5xx, network, timeout | Backoff per policy | 
| Unretryable | 4xx auth, schema error | Log, skip batch | 
| Partial | Some items bad | Enqueue valid subset | 
| Over-quota | 429 | Honor Retry-After | 
See: Section E in analysis doc
Testing Requirements
Golden Contract
- Single JSON fixture (
tests/fixtures/test-contract.json) - Run through both JS and Native fetchers
 - Compare normalized outputs
 - Contract tests must pass
 
Failure Scenarios
- Network chaos (drop, latency)
 - 401 → refresh → 200
 - 429 with Retry-After
 - Malformed items (skip, don't crash)
 
See: Section G in analysis doc
Acceptance Criteria
Before considering this complete:
- ✅ Native fetcher runs with app killed
 - ✅ JS fetcher never required for background
 - ✅ Same inputs → same outputs (parity tests green)
 - ✅ No TimeSafari imports/types in plugin
 - ✅ No duplicate notifications within 
dedupeHorizonMs - ✅ Metrics visible, error classes distinguished
 - ✅ Docs include copy-paste snippets
 - ✅ Battery/quotas respected
 
See: Section J in analysis doc
Open Questions (Resolve Before PR3)
- iOS capabilities: Which BG task identifiers/intervals acceptable?
 - Token hardening: DPoP or JWE now or later?
 - User controls: Per-plan snooze/mute in metadata?
 
See: Section K in analysis doc
Getting Started Checklist
When starting on a new machine:
- Read 
docs/integration-point-refactor-analysis.md(full context) - Review 
src/types/content-fetcher.ts(TypeScript interfaces) - Review 
examples/native-fetcher-android.kt(Kotlin pattern) - Review 
examples/js-fetcher-typescript.ts(JS pattern) - Review 
tests/fixtures/test-contract.json(test contract) - Start with PR1 - SPI Shell (no behavior change)
 - Follow 7-PR plan sequentially
 - Run contract tests after each PR
 
File Locations
docs/
  integration-point-refactor-analysis.md  # Complete spec
  INTEGRATION_REFACTOR_QUICK_START.md     # This file
src/types/
  content-fetcher.ts                       # TypeScript interfaces
examples/
  native-fetcher-android.kt                # Kotlin example
  js-fetcher-typescript.ts                 # TypeScript example
tests/fixtures/
  test-contract.json                       # Golden contract
Next Actions
- 
Start PR1 (SPI Shell)
- Create Kotlin interface in plugin
 - Create Swift interface (if iOS support needed)
 - Wire up TypeScript types (already done)
 - Add 
SchedulingPolicyto plugin 
 - 
Review examples before implementing
- Understand data flow
 - See error handling patterns
 - Note registration points
 
 - 
Plan testing early
- Set up contract test infrastructure
 - Prepare mock fetchers for testing
 
 
Questions?
All specifications are in docs/integration-point-refactor-analysis.md. Refer to:
- Section B for interfaces
 - Section C for policies
 - Section E for failure handling
 - Section I for PR breakdown
 - Section J for acceptance criteria
 
Status: Reference guide Last Updated: 2025-10-29 Maintainer: Plugin development team