Files
kandev/docs/plans/watch-task-cleanup/task-07-actions-cache.md
T
2026-09-23 13:31:12 +01:00

138 lines
5.2 KiB
Markdown

---
id: "07-actions-cache"
title: "Cache Actions observations with bounded expiry"
status: done
wave: 7
depends_on: ["06-adaptive-discovery"]
plan: "plan.md"
requirements:
- REQ-INTEGRATIONS-GITHUB-WORKFLOW-ATTENTION-002
acceptance_criteria:
- AC-INTEGRATIONS-GITHUB-WORKFLOW-ATTENTION-002.1
- AC-INTEGRATIONS-GITHUB-WORKFLOW-ATTENTION-002.2
- AC-INTEGRATIONS-GITHUB-WORKFLOW-ATTENTION-002.3
- AC-INTEGRATIONS-GITHUB-WORKFLOW-ATTENTION-002.4
system_design:
- ../../specs/integrations/system-design/github-workflow-attention.md
---
# Task 07: Cache Actions observations with bounded expiry
## Summary
Cache Actions observations with bounded expiry. Implement with TDD and preserve workspace identity.
## In scope
Share workflow-run and job observations across batch enrichment and service
status/feedback reads. Scope by credential generation and repository; runs also
use head SHA, and jobs use run ID plus attempt. Classify each PR separately.
Use 30 seconds for empty, pending, running, unknown, or attention-required data.
Use 5 minutes only for nonempty completed data without attention requirements.
Keep 512 entries each for runs and jobs, and coalesce concurrent misses. Do not
cache errors or change merge/check eligibility. Preserve the existing 4-worker,
5-second batch enrichment budget.
Explicit refresh invalidates relevant outer and Actions cache entries. Prevent
in-flight old observations from repopulating after invalidation. Head and
credential changes must select fresh entries. Future mutation hooks can reuse
this invalidation seam; no approval or rerun UI is added.
Add TestWorkflowAttentionCacheExpiryAndInvalidation to a new
workflow_attention_cache_test.go. Cover same-SHA reruns, new run attempts,
empty/approval/error results, concurrent callers, credential isolation, different
PRs sharing one SHA, explicit refresh, and bounded eviction. Use fake time.
Retain the existing workflow attention classification suite.
Update `docs/public/integrations.md` during implementation to describe the
shipped freshness bounds. Keep the public guide unchanged during planning.
Run these additional checks after that documentation edit:
```bash
node --test scripts/validate-public-docs.test.mjs
node scripts/validate-public-docs.mjs
```
## Out of scope
New UI controls, credential policies, global schedulers, and unrelated providers.
## Acceptance
- Meet every linked acceptance criterion with deterministic regressions.
- Preserve existing policy, scope, and error-handling contracts.
- Record the expected red test result and passing package results.
## Verification
Run from the repository root.
```bash
(cd apps/backend && go test ./internal/github -count=1)
git diff --check
```
## Files likely touched
- `apps/backend/internal/github/service_pr_watch_batched.go`
- `apps/backend/internal/github/service_pr.go`
- `apps/backend/internal/github/service.go`
- `apps/backend/internal/github/ttl_cache.go`
- `apps/backend/internal/github/workflow_attention.go`
- `apps/backend/internal/github/workflow_attention_cache.go`
- `apps/backend/internal/github/workflow_attention_cache_test.go`
- `apps/backend/internal/github/workflow_attention_test.go`
- `docs/public/integrations.md`
## Dependencies
06-adaptive-discovery.
## Risks
Same-SHA results can change. Never freeze a completed workflow collection indefinitely.
## Parallelism
`sequential`
## Inputs
- [Requirements](../../specs/integrations/requirements/github-workflow-attention.md)
- [Design](../../specs/integrations/system-design/github-workflow-attention.md)
- Source files and existing adjacent tests listed above. New helper/test files are created as needed.
## Results
Implemented bounded Actions observation caches shared by batched workflow
enrichment and service status, feedback, and watch reads. Run entries are
scoped by credential, repository, and head SHA. Job entries are scoped by
credential, repository, run ID, and attempt. Completed nonempty observations
without attention use a five-minute TTL; empty, changing, unknown, and
attention-required observations use 30 seconds. Each cache has 512 entries,
singleflight coalescing, and provider-error omission.
Explicit PR refresh invalidates the affected outer status or feedback entry
and repository Actions entries. Automatic task subscriptions, reconnects, and
retries use passive sync and preserve a completed Actions observation; only a
user refresh carries explicit refresh intent and invalidates the relevant
entries. Per-key epochs prevent an older in-flight read from repopulating an
invalidated cache. Credential changes clear the caches and credential
generations remain part of every workspace cache key. Existing workflow
classification, fork identity, check state, merge eligibility, and the
four-worker, five-second batch budget remain unchanged.
Added `TestWorkflowAttentionCacheExpiryAndInvalidation` and an in-flight
invalidation regression covering same-SHA reruns, attempts, empty and
attention data, provider errors, concurrent callers, credential isolation,
shared SHAs, explicit refresh, and bounded eviction. The focused test failed
before the cache seams existed as expected. Verification passed:
```bash
(cd apps/backend && go test ./internal/github -count=1)
node --test scripts/validate-public-docs.test.mjs
node scripts/validate-public-docs.mjs
```