Skip to content

Commit 9e59ba4

Browse files
authored
Merge pull request #473 from Chris0Jeky/chore/dependency-update-automation-policy
OPS-18: Dependency update automation and security triage workflow
2 parents fac5f52 + 7d120b6 commit 9e59ba4

File tree

6 files changed

+220
-3
lines changed

6 files changed

+220
-3
lines changed

.github/dependabot.yml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Dependabot configuration for automated dependency updates
2+
# Policy: docs/ops/DEPENDENCY_UPDATE_POLICY.md
3+
# Linked issue: #148 (OPS-18)
4+
5+
version: 2
6+
7+
updates:
8+
# --- NuGet (backend .NET) ---
9+
- package-ecosystem: nuget
10+
directory: /backend
11+
schedule:
12+
interval: weekly
13+
day: monday
14+
time: "06:00"
15+
timezone: America/Chicago
16+
open-pull-requests-limit: 10
17+
reviewers:
18+
- jekyt
19+
labels:
20+
- dependencies
21+
- backend
22+
groups:
23+
# Group minor/patch updates together to reduce PR noise
24+
dotnet-minor-patch:
25+
update-types:
26+
- minor
27+
- patch
28+
# Let major versions come as individual PRs for explicit review
29+
commit-message:
30+
prefix: "deps(nuget)"
31+
32+
# --- npm (frontend) ---
33+
- package-ecosystem: npm
34+
directory: /frontend/taskdeck-web
35+
schedule:
36+
interval: weekly
37+
day: monday
38+
time: "06:00"
39+
timezone: America/Chicago
40+
open-pull-requests-limit: 10
41+
reviewers:
42+
- jekyt
43+
labels:
44+
- dependencies
45+
- frontend
46+
groups:
47+
# Group minor/patch updates together
48+
npm-minor-patch:
49+
update-types:
50+
- minor
51+
- patch
52+
commit-message:
53+
prefix: "deps(npm)"
54+
55+
# --- GitHub Actions ---
56+
- package-ecosystem: github-actions
57+
directory: /
58+
schedule:
59+
interval: weekly
60+
day: monday
61+
time: "06:00"
62+
timezone: America/Chicago
63+
open-pull-requests-limit: 5
64+
reviewers:
65+
- jekyt
66+
labels:
67+
- dependencies
68+
- ci
69+
groups:
70+
# Group all Actions updates together since they are low-risk
71+
actions-all:
72+
update-types:
73+
- major
74+
- minor
75+
- patch
76+
commit-message:
77+
prefix: "deps(actions)"

docs/IMPLEMENTATION_MASTERPLAN.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,11 @@ Delivered in the latest cycle:
434434
- ArchiveRecovery decomposition: `ArchiveRecoveryService``ArchiveConflictDetector` + `RestorePlanner` + `RestoreExecutor`
435435
- AutomationExecutor decomposition: `AutomationExecutorService``OperationParameterParser` + `ExecutionAuditRecorder` + `OperationHandlerRegistry`
436436
- Deploy/MCP failure injection drills: 5 shell drill scripts + `run-all-drills.sh` orchestrator in `scripts/drills/`
437+
95. OPS-18 dependency update automation and security triage workflow (`#148`):
438+
- added `.github/dependabot.yml` with weekly update schedules for NuGet (`/backend`), npm (`/frontend/taskdeck-web`), and GitHub Actions (`/`) ecosystems
439+
- minor/patch updates grouped per ecosystem; major NuGet/npm updates arrive as individual PRs; GitHub Actions updates fully grouped
440+
- added `docs/ops/DEPENDENCY_UPDATE_POLICY.md` with update categories, PR verification expectations, severity-based triage SLAs, escalation procedures, and policy boundaries
441+
- security triage workflow aligns with existing `docs/security/SECURITY_DEPENDENCY_VULNERABILITY_POLICY.md` severity policy; no auto-merge enabled
437442

438443
## Current Planning Pivot (2026-03-07)
439444

docs/STATUS.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,14 @@ Release workflow: `.github/workflows/ci-release.yml`
619619

620620
- release/tag/manual build verification (backend + frontend)
621621
- container image artifact/checksum lane reused from container baseline workflow
622-
- SBOM/provenance placeholder (follow-through: `#103`, `#106`, `#148`)
622+
- SBOM/provenance placeholder (follow-through: `#103`, `#106`)
623+
624+
Dependency update automation: `.github/dependabot.yml`
625+
626+
- weekly Dependabot PRs for NuGet, npm, and GitHub Actions ecosystems
627+
- minor/patch grouped; major NuGet/npm individual; Actions fully grouped
628+
- security updates follow severity-based triage SLAs in `docs/ops/DEPENDENCY_UPDATE_POLICY.md`
629+
- no auto-merge; all dependency PRs require human review and `ci-required.yml` gate pass
623630

624631
Release/security deep workflow: `.github/workflows/release-security.yml`
625632

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# Dependency Update Policy
2+
3+
Last Updated: 2026-03-29
4+
Owner: Repository maintainers
5+
Linked issue: `#148` (OPS-18)
6+
7+
## Purpose
8+
9+
This document defines the dependency update automation policy and security-advisory triage workflow for Taskdeck. It complements the existing vulnerability management policy (`docs/security/SECURITY_DEPENDENCY_VULNERABILITY_POLICY.md`) by adding proactive update automation and structured triage ownership.
10+
11+
Related docs:
12+
13+
- `docs/security/SECURITY_DEPENDENCY_VULNERABILITY_POLICY.md` — vulnerability scan cadence, severity policy, exception process
14+
- `.github/dependabot.yml` — Dependabot automation configuration
15+
16+
## Automation Tool
17+
18+
Taskdeck uses **GitHub Dependabot** for automated dependency update PRs across three ecosystems:
19+
20+
| Ecosystem | Config directory | Schedule | Grouping strategy |
21+
|----------------|---------------------------|-----------------|--------------------------------------------|
22+
| NuGet (backend)| `/backend` | Weekly (Monday) | Minor/patch grouped; major individual |
23+
| npm (frontend) | `/frontend/taskdeck-web` | Weekly (Monday) | Minor/patch grouped; major individual |
24+
| GitHub Actions | `/` | Weekly (Monday) | All update types grouped |
25+
26+
## Update Categories
27+
28+
### Routine updates (minor and patch)
29+
30+
- Grouped into single PRs per ecosystem to reduce noise.
31+
- Expected to pass CI without intervention in most cases.
32+
- Maintainer review is required before merge; no auto-merge is enabled.
33+
- If CI passes and the changelog shows no breaking changes, merge promptly.
34+
35+
### Major version updates
36+
37+
- Arrive as individual PRs for explicit review.
38+
- Require maintainer assessment of breaking changes, migration guides, and downstream impact.
39+
- Should be tested locally when the changelog indicates API surface changes.
40+
- Target resolution within one development cycle (1 to 2 weeks) unless blocked.
41+
42+
### Security updates
43+
44+
- Dependabot security updates are enabled by default on GitHub and create PRs independently of the weekly schedule.
45+
- Security PRs are distinguishable by the security advisory reference in the PR body. GitHub may also auto-apply a `security` label if one exists in the repo. Note: the PR title format is the same as regular Dependabot PRs ("Bump X from Y to Z"), so rely on the body and labels rather than the title to identify security updates.
46+
- Security updates follow the severity-based SLA targets defined below.
47+
48+
### Lock-file-only updates
49+
50+
- Dependabot may propose lock-file-only changes when transitive dependencies have updates.
51+
- These follow the same review process as routine updates.
52+
- Pay attention to transitive security fixes surfaced through lock-file changes.
53+
54+
## PR Verification Expectations
55+
56+
All Dependabot PRs must pass the `ci-required.yml` gate before merge. This includes:
57+
58+
- Backend build and unit tests (domain, application, CLI, API integration)
59+
- Frontend typecheck, lint, unit tests, and E2E smoke
60+
- Architecture boundary tests
61+
- Docs governance checks
62+
63+
Additional verification for dependency PRs:
64+
65+
- Review the Dependabot PR body for changelog links and compatibility notes.
66+
- For NuGet major bumps: verify `dotnet build` succeeds locally and check for deprecation warnings.
67+
- For npm major bumps: verify `npm run build` and `npx vitest --run` succeed locally.
68+
- For GitHub Actions bumps: verify the referenced action version exists and check for breaking changes in the action's release notes.
69+
70+
## Security-Advisory Triage Workflow
71+
72+
### Trigger sources
73+
74+
1. **Dependabot security alerts** — GitHub surfaces these on the Security tab and may auto-create PRs.
75+
2. **Dependabot security update PRs** — automated fix PRs for known advisories.
76+
3. **Nightly dependency security signals**`nightly-quality.yml` runs vulnerability scans on schedule.
77+
4. **Manual scan** — operators can run `dotnet list ... --vulnerable` and `npm audit` locally (see commands in the vulnerability policy doc).
78+
79+
### Triage ownership
80+
81+
- The maintainer who sees the alert first owns initial triage classification.
82+
- Classification means: confirm severity, determine if the package is runtime/test/build-only, and assign a remediation owner.
83+
- If no maintainer is available within the SLA window, the alert must be escalated (GitHub issue with `Priority I` or `Priority II` label).
84+
85+
### Severity-based response targets
86+
87+
These targets align with the existing vulnerability policy (`docs/security/SECURITY_DEPENDENCY_VULNERABILITY_POLICY.md`):
88+
89+
| Severity | Triage SLA | Remediation target |
90+
|----------|---------------------|-------------------------------------------------------|
91+
| Critical | Same business day | Merge fix within 1 business day; block releases |
92+
| High | 1 business day | Merge fix within 3 business days; block releases |
93+
| Moderate | 5 business days | Schedule in normal backlog; does not block release |
94+
| Low/Info | 10 business days | Batch with routine dependency hygiene |
95+
96+
### Triage checklist
97+
98+
For each security advisory or Dependabot security PR:
99+
100+
1. Confirm the advisory applies to Taskdeck's usage of the package (not just presence in the dependency tree).
101+
2. Classify exposure: `runtime`, `test-only`, `build-only`, `local-dev-only`.
102+
3. Check if Dependabot has already opened a fix PR. If yes, prioritize review.
103+
4. If no automated fix exists, create a GitHub issue with the appropriate priority label.
104+
5. If remediation is blocked (no upstream fix available), follow the exception process in the vulnerability policy doc.
105+
6. Post triage outcome (fixed, excepted, or false positive) as a comment on the alert or PR.
106+
107+
### Escalation
108+
109+
- Critical/High findings with no available fix: create a GitHub issue with `Priority I` label and document compensating controls.
110+
- Findings that affect the release pipeline: notify maintainers and block release candidates per the vulnerability policy enforcement rules.
111+
112+
## Policy Boundaries
113+
114+
### What this policy does NOT cover
115+
116+
- Auto-merge: all dependency PRs require human review. Auto-merge may be considered in the future for patch-only grouped updates with passing CI, but is not enabled now.
117+
- Renovate: the project uses Dependabot only. Renovate may be evaluated if Dependabot proves insufficient.
118+
- SBOM generation: tracked separately in `#103`.
119+
- Stricter required-PR blocking for vulnerability findings: tracked as a follow-up in the vulnerability policy doc.
120+
121+
### Review cadence
122+
123+
- Maintainers should review open Dependabot PRs at least weekly (aligned with the Monday generation schedule).
124+
- Stale Dependabot PRs older than 30 days should be investigated: either the update is blocked (needs an issue) or it was overlooked.

docs/ops/GITHUB_LABEL_TAXONOMY.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ Note:
4444
- Background worker runtime behavior, queue processing, retry semantics, and worker observability.
4545
- `performance`
4646
- Latency, throughput, responsiveness, and resource-efficiency improvements across API, worker, and frontend surfaces.
47+
- `dependencies`
48+
- Dependency version updates managed by Dependabot or manual dependency hygiene.
49+
- `ci`
50+
- CI/CD pipeline, workflow, and build infrastructure changes.
4751

4852
## Priority Labels
4953

docs/security/SECURITY_DEPENDENCY_VULNERABILITY_POLICY.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ node --test scripts/ci/summarize-dependency-security-signals.test.mjs
176176
## Follow-up Scope Still Outside This Policy
177177

178178
- automated issue creation for fresh findings
179-
- Dependabot or Renovate policy automation beyond current dependency review usage
180179
- stricter required-PR blocking for vulnerability findings
180+
- auto-merge for low-risk dependency update PRs
181181

182-
Those can be added later if the current signal-first posture proves reliable enough.
182+
Dependabot automation is now active (`.github/dependabot.yml`). The update policy and security-advisory triage workflow are documented in `docs/ops/DEPENDENCY_UPDATE_POLICY.md`.

0 commit comments

Comments
 (0)