You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-up to v6.15.0 closing the remaining safe quality wins before
Phase 2 (containers.js split, deferred to v6.16.0 with its own
deep-spec at plans/deep-spec-containers-split.md).
Changes:
- 13 cron/interval jobs instrumented via new _m(name, fn) helper:
stats-aggregate-{1m,1h}, alert-evaluate, session-mfa-cleanup,
security-alert-windowed, purge-old-data, vacuum-db,
certificate-scan, secret-rotation-scan, daily-backup,
schedule-executor, s3-backup, sandbox-ttl-sweep. The
background_job_{runs,errors}_total Prometheus counters we
exposed in v6.15.0 but didn't populate are now live.
Net -45 LOC (helper replaces duplicated try/catch boilerplate).
- HTTP security headers tightened in src/server.js:
- X-Frame-Options: DENY (was SAMEORIGIN default)
- new Permissions-Policy denying 24 browser APIs we never use
Existing HSTS/Referrer-Policy/COOP/CORP/nosniff defaults
verified on staging, unchanged.
- Lint: 2 warnings → 0:
- removed stale eslint-disable in acme-cloudflare-live.test.js
- kernel → _kernel in platform-detect.js per _-prefix convention
Documentation:
- Production readiness badge: 9.5 → 9.1 (honest defensible
weighted score; 9.5 was aspirational). After Phase 2 containers
split: expected 9.3-9.4.
- Phase 2 deep-spec written (9 sections, local/gitignored).
Tests: 757 / 4 (unchanged). Lint: 0/0.
Follow-up to v6.15.0 closing the remaining "safe quality wins" before Phase 2 (containers.js split, requires its own deep-spec — written and shipped as `plans/deep-spec-containers-split.md`).
8
+
9
+
### Added — `docker_dash_background_job_runs_total` now actually populated
10
+
11
+
v6.15.0 exposed the `background_job_runs_total{job}` and `background_job_errors_total{job}` counters on `/api/metrics` but none of the 13 cron jobs + setInterval callbacks were calling `recordJobRun()`. This release wires them all via a helper:
Net LOC: −45 (the helper replaces the duplicated try/catch + log.error boilerplate on each job). Same pattern as the v6.14.1 `asyncHandler` refactor for route handlers.
37
+
38
+
### Added — Tightened HTTP security headers
39
+
40
+
New [src/server.js:28-58](src/server.js#L28-L58):
41
+
42
+
-**`X-Frame-Options: DENY`** (was SAMEORIGIN via helmet default). Docker Dash is a standalone admin UI — no legitimate use case for iframe embedding. Tighter default prevents clickjacking via any same-origin subdomain.
43
+
-**`Permissions-Policy`** header explicitly denies ~24 browser APIs we never use (camera, microphone, geolocation, USB, MIDI, payment, etc.). Any future feature that needs one of these must opt-in here first. Defense-in-depth for XSS-post-escape scenarios.
44
+
45
+
Existing Helmet defaults are preserved and verified on staging:
- Removed unused `eslint-disable-next-line no-console` directive in `acme-cloudflare-live.test.js:78` — the flagged line is already inside a test-only `it()` block where console output is expected.
55
+
- Renamed unused `kernel` parameter → `_kernel` in `platform-detect.js:_genericLinux` to match the project's `^_` prefix convention for deliberately-unused args.
56
+
57
+
### Added — Phase 2 deep-spec
58
+
59
+
[plans/deep-spec-containers-split.md](plans/deep-spec-containers-split.md) — a 9-section spec for splitting the 5,774-line `containers.js` into list (eager, ~2.3k LOC) + detail (lazy-loaded on first navigation, ~3.5k LOC). Expected impact: Performance score 7 → 9, initial JS payload −40%. Execution deferred to a dedicated v6.16.0 session — touches the most-visited page and deserves focus.
60
+
61
+
### Production readiness scorecard (weighted, v6.15.1)
Targeted at moving the production readiness score from the v5-era 9.2/10 claim toward a defensible **9.5/10** on current v6.x state. Phase 1 of the 3-phase plan captured in `plans/production-readiness-v6.15.md` (Phase 2 = containers.js split, Phase 3 = v7 HA + external audit).
{type: 'feature',text: 'Background job Prometheus counters now actually populated: 13 cron + setInterval callbacks instrumented via new _m(name, fn) helper. Grafana can now track stats-aggregate-1m, alert-evaluate, session-mfa-cleanup, purge-old-data, vacuum-db, certificate-scan, secret-rotation-scan, daily-backup, schedule-executor, s3-backup, sandbox-ttl-sweep. Same refactor pattern as v6.14.1 asyncHandler — net -45 LOC.'},
18
+
{type: 'security',text: 'HTTP headers tightened: X-Frame-Options: DENY (was SAMEORIGIN via helmet default — Docker Dash is a standalone admin UI, no iframe embedding) + new Permissions-Policy header explicitly denying ~24 browser APIs we never use (camera, mic, geolocation, USB, etc.). Defense-in-depth for XSS-post-escape scenarios. Existing HSTS/Referrer-Policy/COOP/CORP/nosniff defaults unchanged.'},
19
+
{type: 'fix',text: 'Lint: 2 warnings → 0. Removed stale eslint-disable directive in acme-cloudflare-live.test.js and renamed unused kernel param to _kernel in platform-detect.js per project convention.'},
20
+
{type: 'improvement',text: 'Phase 2 deep-spec written (plans/deep-spec-containers-split.md, local): splitting the 5,774-line containers.js into list (eager) + detail (lazy-loaded on /containers/:id navigation). Expected: Performance score 7 → 9, initial JS payload -40%. Deferred to v6.16.0 as a dedicated session — touches the most-visited page.'},
21
+
{type: 'improvement',text: 'Production readiness: honest current score is ~9.1 weighted (was 9.5 aspirational). Performance stays at 7 until Phase 2 ships; after Phase 2 expecting 9.3-9.4. External security audit + Redis HA remain v7 material.'},
0 commit comments