Skip to content

Implements the path-aware, two-tier documentation accessibility CI gate - #3691

Merged
Sayt-0 merged 4 commits into
mainfrom
docs/a11y-smart-gate
Jul 16, 2026
Merged

Sayt-0 merged 4 commits into
mainfrom
docs/a11y-smart-gate

Conversation

@aheritier

Copy link
Copy Markdown
Collaborator

described in the shared plan docs-a11y-smart-gate (prior context:
docs-a11y-audit, shipped as PR #3687).

What changed

PR 1 — dark-mode callout-link contrast fix (docs/css/style.css)
Links inside a callout (warning/info/tip) sat on a variant-colored panel,
not the page background, so the shared prose-link color
(--accent-hover) failed there even though it passes everywhere else:
3.95:1 on the dark warning callout background (#643700), below the
4.5:1 AA threshold. This was a pre-existing bug, first surfaced while
pre-verifying features/tui/ as a new archetype (see below) — that page
has a link inside a [!WARNING] callout at line 503.

Scoped .content .callout a:not(.btn) { color: var(--blue-200); } (plus
a light-mode override restoring --accent, and an explicit :hover
rule so the shared --link-hover token isn't shadowed by the new
equal-specificity selector). Verified contrast ratios:

Background --blue-200 (dark) --accent (light, unchanged)
warning #643700 6.46:1 4.83:1
info #00153C 11.50:1 4.60:1
tip #11371A 8.51:1 4.75:1

The fix is intentionally scoped to callout links only — nothing broader
was touched.

PR 2 — scripts/docs-a11y-urls.sh (new)
Maps changed docs Markdown files to rendered URLs for Tier 2 of the
gate: docs/index.md → /, docs/404.md → /404.html,
docs/<section>/<page>/index.md → /<section>/<page>/ for the 8
mounted sections, _index.md/STYLE.md/non-Markdown files dropped
(silently or via ::notice for unexpected locations), de-dupes against
the static archetype list already in docs/.pa11yci.json, live-probes
survivors to catch renames, caps at ${A11Y_MAX_PAGES:-10} pages
(lexicographic, deterministic), and emits both ?theme=light and
?theme=dark for each surviving page. Ships with --self-test
(fixture-driven, no server required) and a header comment documenting
the mapping rules and env vars.

PR 3 — expand the static archetype list 8 → 12 URLs
(docs/.pa11yci.json)

Kept the existing 4 pages (home, configuration/sandbox/,
getting-started/quickstart/, 404.html) and added 2 more layout
archetypes: features/tui/ (the densest page — images, inline HTML,
many callouts/tables) and concepts/multi-agent/ (deep heading
structure). Each listed in both themes, so this tier is now 12 URLs.
Depends on PR 1 (the callout-link fix), since features/tui/?theme=dark
would otherwise fail immediately on the pre-existing bug.

PR 4 — wire Tier 2 into .github/workflows/docs-a11y.yml

  • actions/checkout gets fetch-depth: 2 so git diff HEAD^1 HEAD
    (against the pull_request test-merge commit) yields exactly the
    PR's changed files — token-free, fork-safe, no changed-files action.
  • A Compute changed-page URLs step (PR-only) runs the new helper
    script against that diff.
  • An Assemble pa11y config step jq-merges the changed-page URLs into
    a generated config on top of the checked-in docs/.pa11yci.json
    (which stays the single source of truth for the static list and
    defaults, so the local contributor flow is unchanged).
  • The Run pa11y-ci step uses the generated config when one exists,
    else falls back to the static-only config — so push-to-main and
    content-free PRs stay static-only (12 URLs), matching the plan (no
    PR diff to compute Tier 2 from on push).
  • Workflow header comment rewritten to describe the two-tier model;
    scripts/docs-a11y-urls.sh added to both paths: trigger lists.

docs/STYLE.md updated in the same PRs that introduce each piece: the
callout-link contrast rule + table row (PR 1), and the two-tier
model/cap/archetype-maintenance guidance under "Running the
accessibility scan locally" (PR 4).

Deviations from the plan

None. All mechanisms (checked-in static config + generated merge file,
git-native diff, deterministic lexicographic cap at N=10, static+changed
for mixed PRs, 6-page/12-URL archetype list, callout-scoped contrast
fix) match the plan's recommendations as confirmed by the user. No
scope expansion beyond the callout-link fix.

Validation

  • ./scripts/docs-a11y-urls.sh --self-test — all checks pass (mapping
    rules, de-dup, both-theme emission, cap + lexicographic tie-break +
    notice).
  • shellcheck scripts/docs-a11y-urls.sh — clean.
  • actionlint .github/workflows/docs-a11y.yml and
    ./scripts/workflow-lint.sh — clean.
  • python3 -c "import json; json.load(open('docs/.pa11yci.json'))" —
    valid JSON.
  • npx markdownlint-cli2 STYLE.md — 0 errors.
  • Local hugo server (Hugo v0.164.0) + pa11y-ci@3.1.0 (system Chrome
    via PUPPETEER_EXECUTABLE_PATH, Docker was unavailable in this
    sandbox) against the full 12-URL static set, both themes: 12/12
    passed, 0 errors
    — including features/tui/?theme=dark, confirming
    the PR 1 fix.
  • End-to-end simulation of the exact CI mechanism (helper script → jq
    merge → generated config → pa11y-ci) against a real changed-page
    example: 14/14 passed (12 static + 2 changed-page URLs, with a
    static-list page correctly de-duped away and a nonexistent/renamed
    page correctly dropped by the live-probe safety net).
  • No dark-mode regression: only the callout-link token changed, and it
    doesn't touch anything on the docs-a11y-audit "verified passing —
    do not touch" list.

Final green CI is to be confirmed on GitHub once this PR is open — not
verifiable from the local sandbox for the GitHub Actions runner itself
(the local run stands in for the mechanism, using system Chrome instead
of browser-actions/setup-chrome).

Note: unrelated pre-existing uncommitted changes in the sandbox

The working tree also had uncommitted changes to docs/hugo.yaml,
docs/layouts/_partials/footer.html, and a new
docs/layouts/home.llms.txt (an in-progress llms.txt output-format
feature) that predate this task and are unrelated to the a11y gate.
They were deliberately left uncommitted/untouched — not included in any
commit here — so this PR stays scoped to the accessibility gate only.

Refs: plan docs-a11y-smart-gate, plan docs-a11y-audit, PR #3687.

@aheritier
aheritier requested a review from a team as a code owner July 16, 2026 16:09
@Sayt-0
Sayt-0 merged commit 88bfc40 into main Jul 16, 2026
20 checks passed
@Sayt-0
Sayt-0 deleted the docs/a11y-smart-gate branch July 16, 2026 16:19
pull Bot pushed a commit to TheTechOddBug/cagent that referenced this pull request Jul 16, 2026
The light-mode default override for callout links
([data-theme="light"] .content .callout a:not(.btn)) has the same
specificity as the shared hover rule but sits after it in source
order, so it silently won on hover too — light-mode callout links
stayed --accent (#2560FF) on hover instead of switching to
--link-hover (#1A4DD9) as STYLE.md documents. Not an AA failure
(--accent already passes on every callout background), just a
behavioral mismatch with the intended hover token.

Add an explicit [data-theme="light"] ... :hover rule after the light
default, mirroring the dark-mode fix already in place. Verified new
hover ratios: 6.52:1 warning, 6.21:1 info, 6.42:1 tip (all above the
previous --accent hover values, since blue-600 is darker than
blue-500) — dark-mode hover and non-callout/.btn links are untouched.

Follow-up from the review of PR docker#3691.
social4hyq pushed a commit to social4hyq/homebrew-core that referenced this pull request Sep 20, 2026
docker-agent 1.111.0

Created-by: HarmonybrewBot
Commit-by: HarmonybrewBot
Merged-by: HarmonybrewBot
Description: Created by `brew bump`

---

Created with `brew bump-formula-pr`.<details>
  <summary>release notes</summary>
  <pre>This release adds a new scheduler toolset, inline Mermaid diagram rendering, model switching in the lean TUI, project config autodiscovery, and a range of bug fixes and performance improvements across the agent, TUI, and server.

## What's New

- Adds a built-in `scheduler` toolset with `create_schedule`, `list_schedules`, and `cancel_schedule` tools, enabling agents to schedule instructions to run once at a time, after a delay, or on a recurring interval
- Adds prompt cache miss warnings via an opt-in `warn_on_cache_miss` user setting that emits notifications when cached input tokens are absent after the first session response
- Adds inline Mermaid diagram rendering in the TUI
- Adds model switching (`/model`) to the lean TUI and shares fuzzy model search between the lean and full TUIs
- Adds autodiscovery of `docker-agent.yaml`, `docker-agent.yml`, and `docker-agent.hcl` project config files for no-argument local `docker agent run`
- Surfaces background-job elicitation (user-input) requests in the TUI, ensuring each request opens exactly one dialog regardless of which runtime delivers it
- Makes a custom `base_url` on a model automatically imply `bypass_models_gateway: true`, removing the need to set it explicitly

## Improvements

- Improves session cost details in the TUI: aligns layout, color-codes cost percentages per message, groups averages together, and puts "Total" on its own line
- Speeds up model switcher credential discovery by deduplicating credential names and resolving lookups concurrently, reducing model-picker latency
- Parallelizes toolset startup and prefetches the MCP catalog off the load critical path, reducing agent startup time

## Bug Fixes

- Fixes glob wildcard matching in permissions so `*` and `?` span path separators (`/`) in argument values such as file paths and URLs
- Fixes a bug where setting `defer_all: true` on a toolset caused the toolset's custom `Instructions` to be permanently dropped from the agent's context
- Fixes `SafetyPolicy` not persisting across turns, causing users to be re-prompted for tool approvals they had already opted into
- Fixes background elicitations over the API so requests from concurrent background jobs are replayable and answerable instead of being auto-declined
- Fixes Anthropic cache breakpoints exceeding the hard limit of 4 when deferred tools are present, which caused API errors at runtime
- Fixes the TUI editor not regaining focus after external editing (`Ctrl+G`), which caused Enter to route to the transcript instead of sending the composed message
- Fixes the scheduler schema so `type: scheduler` is accepted in agent config files (was previously rejected by JSON schema validation)
- Fixes foreground elicitations being delivered twice into the app event stream
- Fixes a mutex unlock in the scheduler's `setRuntime` method to use `defer` for safer lock release
- Fixes VCR cassette path normalization for portable prompt-file matching
- Fixes CI workflow YAML indentation that caused all CI runs to fail before any job could start

## Technical Changes

- Adds `MapSlice` fan-out helper in the concurrent utilities package and uses it for parallel toolset operations
- Serializes interactive OAuth flows across toolsets to prevent concurrent conflicts
- Brings the documentation portal to WCAG 2.1 AA conformance across light and dark themes and adds a pa11y-ci CI gate to maintain it
- Adds new documentation pages for the scheduler toolset, sandbox templates, custom commands, user settings, context and compaction guide, and fixes stale command syntax in the Named Commands docs
---

## What's Changed
* docs: update CHANGELOG.md for v1.110.0 by @docker-read-write[bot] in docker/docker-agent#3665
* fix: repair CI workflow YAML and failing AgentsMd e2e test on main by @dgageot in docker/docker-agent#3666
* feat(tools): add "scheduler" toolset to run instructions on a time or recurring interval by @dwin-gharibi in docker/docker-agent#3632
* fix(config): add scheduler toolset to agent-schema.json type enum by @aheritier in docker/docker-agent#3670
* feat: custom base_url implies bypass_models_gateway by @dgageot in docker/docker-agent#3667
* feat: add prompt cache miss warnings by @rumpl in docker/docker-agent#3671
* Improve session cost details by @rumpl in docker/docker-agent#3672
* perf: speed up model switcher credential discovery by @rumpl in docker/docker-agent#3673
* Add model switching to the lean TUI by @rumpl in docker/docker-agent#3674
* feat(tui,app): surface & correlate background-job elicitations (#3584) by @aheritier in docker/docker-agent#3624
* chore: bump go-isatty, openai-go, and libopenapi by @dgageot in docker/docker-agent#3675
* ci: bump golangci-lint-action to v9.3.0 and fix DeferMutexUnlock lint offense by @dgageot in docker/docker-agent#3676
* ci: bump pinned actions to latest same-major versions by @dgageot in docker/docker-agent#3677
* feat(server): session-scoped elicitation sink for API/server runtimes (#3584) by @aheritier in docker/docker-agent#3625
* Render Mermaid diagrams inline by @rumpl in docker/docker-agent#3679
* fix(server): surface background elicitations over API by @Sayt-0 in docker/docker-agent#3678
* fix(teamloader): preserve deferred toolset instructions by @Piyush0049 in docker/docker-agent#3680
* fix(permissions): match glob wildcards across path separators by @parveshsaini in docker/docker-agent#3605
* docs(agents): fix stale command syntax and sub_agents claim in Named Commands by @aheritier in docker/docker-agent#3684
* docs(sandbox): document Docker Sandboxes integration and published sbx templates by @aheritier in docker/docker-agent#3682
* docs: surface orphan pages and add compaction, commands, and user-settings docs by @aheritier in docker/docker-agent#3683
* fix(docs): WCAG 2.1 AA accessibility remediation for the docs portal by @aheritier in docker/docker-agent#3687
* fix(tui): refocus the editor after external editing so Enter sends the content by @dgageot in docker/docker-agent#3690
* Implements the path-aware, two-tier documentation accessibility CI gate by @aheritier in docker/docker-agent#3691
* feat(run): autodiscover project agent config by @HajimohammadiNet in docker/docker-agent#3681
* perf: parallelize toolset startup and prefetch MCP catalog by @dgageot in docker/docker-agent#3688
* fix(anthropic): keep cache breakpoints within Anthropic's limit of 4 with deferred tools by @dgageot in docker/docker-agent#3692
* fix(docs): render --link-hover on light-mode callout-link hover by @aheritier in docker/docker-agent#3693
* build(deps): bump the pip group across 1 directory with 2 updates by @dependabot[bot] in docker/docker-agent#3697
* fix(session): persist SafetyPolicy across turns by @trungutt in docker/docker-agent#3685

## New Contributors
* @parveshsaini made their first contribution in docker/docker-agent#3605
* @HajimohammadiNet made their first contribution in docker/docker-agent#3681

**Full Changelog**: docker/docker-agent@v1.110.0...v1.111.0
</pre>
  <p>View the full release notes at <a href="https://github.com/docker/docker-agent/releases/tag/v1.111.0">https://github.com/docker/docker-agent/releases/tag/v1.111.0</a>.</p>
</details>
<hr>

See merge request: Harmonybrew/homebrew-core!14465
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.

2 participants