Skip to content

CI integration only — do not merge (#56 + #59 + #60 + #62 + #63) - #61

Closed
dborup wants to merge 13 commits into
masterfrom
codex/ci-integration-1648-1706-a11y
Closed

dborup wants to merge 13 commits into
masterfrom
codex/ci-integration-1648-1706-a11y

Conversation

@dborup

@dborup dborup commented Sep 17, 2026 •

Copy link
Copy Markdown
Owner

CI integration only — do not merge. This draft PR exists solely to run GitHub CI on the combination of five open feature PRs. The real changes live in those PRs; review and merge them individually. This PR will not be merged.

What this branch is

Branch codex/ci-integration-1648-1706-a11y, created from master e17377d8cfe8259f5ba170969907f97c41c10c48, with the exact heads of five PRs merged in with --no-ff (no squash, no extra commits, no conflict resolution needed):

Order PR Head Change
1 #56 52ae9d1caf29ad5ce77def13525b7e5c210f7510 Kpa-clawbot#1648: drop the M4-banned ▾ from a public/map.js comment
2 #59 e3f57426e4a09c1206be413e63dedb79bc6145d1 Kpa-clawbot#1706: gate the foreign-traffic, wardriving and areas analytics tabs in the axe gate
3 #60 e45ae99ec914769703852d048283e10a23174991 a11y: unique analytics table ids; readable LIVE/PAUSED/REPLAY badge text; register the two new tests
4 #62 448ae57c141cfc138aefcb304420be5931f21bc6 lint: declare getNodeFreshness as a readonly global in .eslintrc.json (added after the first CI run failed at the eslint step)
5 #63 a2f2dd0b1f323350e48872a4803c7d157e69a6fe e2e: pin the slide-over packets scenario to a 180-min window; timeout-minutes: 150 on the e2e job (added after the second CI run failed in the slide-over flake gate)

Every changed file in this branch is byte-identical to the corresponding file in its PR head. Combined scope vs master: public/map.js, test-a11y-axe-1668.js, public/analytics.js, public/live.css, test-all.sh, .github/workflows/deploy.yml (+2 lines from #60, +1 line timeout-minutes: 150 from #63), .eslintrc.json (+1 line, from #62), test-slideover-1056-e2e.js (+10, from #63), and two new test files.

Why

Individually, #59 and #60 cannot show a green "Run JS unit tests" step, because the step stops at the Kpa-clawbot#1648 M4 scan until #56 is merged; the full axe gate is only green with #59 and #60 together. This run shows what CI reports for the combination.

Update: the first run on this branch (head d82b4536, run 35187990504) passed the Go suites, all 69 JS unit-test commands and the XSS diff gate, then failed at "Frontend lint" on two pre-existing no-undef errors for getNodeFreshness (present on master since 2026-08-06, never reached before). #62 fixes that; its head was merged in with a normal merge (branch fast-forwarded to a4a6d28f). The integration diff added by that step is exactly the one .eslintrc.json line; .github is unchanged.

Update 2: the second run (head a4a6d28f, run 35189733496) passed the whole Go job including eslint, and the main E2E step including the axe gate (116/116) and slide-over (27/27), then failed in the slide-over flake gate: packets@800 had no rows. Cause (reproduced locally): the static fixture is freshened once, the packets page defaults to a 15-min window, and the gate ran ~16 min after freshening. #63 fixes it; its head was merged in with a normal merge (branch fast-forwarded to aa8c0568). The integration diff added by that step is exactly #63's two changes.

Workflow safety

The only workflow changes are #60's two added node … lines in the existing JS unit-test step and #63's timeout-minutes: 150 on the e2e-test job. Triggers, permissions, concurrency, env, jobs, needs, if/fork-guards and all other steps are semantically identical to master; the cmd/server fork-guard workflow tests pass. All side-effecting steps (GHCR login/push, release upload, staging deploy, badge publishing) still require github.repository == 'Kpa-clawbot/CoreScope', so none of them can run in dborup/CoreScope even if every test passes. This branch is not master, so no push-to-master pipeline is triggered; the only run is the pull_request CI.

Local results for this exact tree (macOS arm64 — not GitHub CI)

  • Workflow JS step from this tree's deploy.yml (set -e, 69 commands): all pass.
  • Full axe gate (isolated local Go server + fixture copy prepared like CI; installed Chrome with DNS restricted to localhost): 116/116 cells clean.
  • node --check, sh -n test-all.sh, YAML parse, git diff --check, XSS --diff gate, fork-guard Go tests: pass.
  • eslint public/*.js with eslint 8.57.1 (the CI version): 0 errors, 89 pre-existing warnings (master: 2 errors, 89 warnings).
  • Not verified locally: most Playwright E2E tests (Leaflet cannot load offline), Docker build, Linux.

🤖 Generated with Claude Code

Dennis Jakobsen and others added 10 commits September 15, 2026 09:32
…ment

test-issue-1648-m4-emoji-scan.js forbids U+25BE (the dropdown caret) on
any map.js line not tagged EMOJI-OK, comments included. The comment
added with the selected-area outline (4d46dba, merged in 9f5d594)
quoted the Area dropdown label with its caret and broke the scan, which
went unnoticed while the JS CI step stopped earlier on the Kpa-clawbot#1375 test.

The quoted "Area: X" still identifies the control, and the next line
names AreaFilter. Comment-only: no runtime change, scanner unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…tabs

test-a11y-axe-routes-coverage.js (Kpa-clawbot#1706) requires every data-tab button
in public/analytics.js to be exercised by the axe gate. The Foreign
Traffic, Wardriving and Areas tabs were added afterwards without ROUTES
entries, so the coverage check failed and the axe gate never scanned
them. Add the three routes and register the tabs so the selftest's
dispatch-arm reciprocity also covers them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Scopes: renderTab numbers .analytics-table elements by position, and the
pass runs again after the tab's async sections are inserted ahead of the
static overview table (and on every theme refresh). The first inserted
table then reused the static table's positional id, giving axe
duplicate-id analytics-tbl-scopes-0. Skip ids that are already taken; a
single pass still yields the same numbering and column-width keys.

Live: .vcr-mode-live rendered its text in --status-green, the swatch hue,
at 2.27:1 on the light-theme VCR bar. Use the existing text token
--status-green-text (#15803d light, unchanged #22c55e dark); the pulsing
dot keeps the swatch hue.

Add focused regression tests for both.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The PAUSED and REPLAY badges had the same problem as LIVE: text in the
swatch hues --status-yellow and --accent, 1.81:1 and 2.52:1 on the
light-theme VCR bar. Use the semantic text tokens --warning and
--link-color (light #b45309 / #2563eb, dark #fcd34d / #60a5fa); the
badges' tinted backgrounds and the LIVE dot keep their indicator colors.

Extend the contrast test to all three modes, the light theme and both
dark token blocks, modelling the bar's color-mix background and each
mode's tint (renamed to test-live-vcr-mode-contrast.js).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Assert the ids the browser shows on the Scopes tab after the fix
(scopes-1, -0, -2, -3), in addition to uniqueness, so the test fails on
the duplicate-id assertion with the old positional algorithm.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Run test-analytics-table-ids-unique.js and test-live-vcr-mode-contrast.js
in the JS unit-test step and in test-all.sh, once each. No other workflow
change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
roles.js defines window.getNodeFreshness at load time and index.html loads
it before nodes.js and live.js, which call it as a bare global. ESLint's
no-undef flagged both calls because the global was missing from
.eslintrc.json, failing the frontend lint step.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@dborup dborup changed the title CI integration only — do not merge (#56 + #59 + #60) CI integration only — do not merge (#56 + #59 + #60 + #62) Sep 17, 2026
… window

The e2e fixture is freshened once before the server starts, and the
packets page defaults to a 15-minute window. The slide-over flake gate
runs after the main E2E step, ~16 minutes in, when that window no longer
contains any fixture packet, so packets@800 waited 30s for a row that
could not appear. Pin the packets scenario to a 180-minute window, the
largest packets.js keeps at <=1024px, and bound the e2e job at 150
minutes so the gate always runs inside it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@dborup dborup changed the title CI integration only — do not merge (#56 + #59 + #60 + #62) CI integration only — do not merge (#56 + #59 + #60 + #62 + #63) Sep 17, 2026
@dborup

dborup commented Sep 17, 2026

Copy link
Copy Markdown
Owner Author

Closing without merge — this draft only existed to run CI on the combination (green run 35200470944 on aa8c0568).

The five feature PRs were merged individually, in order:

Master 693eb045 has tree 32efef6716dbb62dd9074a370b5a39fc37296e9e, identical to this branch's tested tree; git diff 693eb045 aa8c0568 is empty. The branch is kept.

🤖 Generated with Claude Code

@dborup dborup closed this Sep 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant