Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
187 commits
Select commit Hold shift + click to select a range
3c39c0d
fix(a11y): admin and auth pages accessibility (#13998)
viktoravelino Jul 21, 2026
6aed7af
fix: assets/knowledge-base accessibility (#13973)
deon-sanchez Jul 21, 2026
afc1b52
feat(models): add pluggable provider policy (#14137)
erichare Jul 21, 2026
1d291d5
chore: remove lfx-bundles from default Langflow install (#13869)
erichare Jul 21, 2026
38e1fdb
feat: make langflow-core the shared bundle-free distribution (#14100)
erichare Jul 21, 2026
6fb9e27
fix: settings/messages accessibility (#14064)
deon-sanchez Jul 21, 2026
b8b12f5
chore: bump release versions to 1.12.0 (#14196)
erichare Jul 22, 2026
0cb1e5b
fix(frontend): prevent duplicate text dialog activation
erichare Jul 22, 2026
408b598
ci: add core/full release inventory gates (#14203)
erichare Jul 22, 2026
a565d24
feat: add scoped authorization visibility prefilter (#14102)
erichare Jul 22, 2026
86dca58
feat: automate bundle version propagation and release ordering (#14160)
erichare Jul 22, 2026
f8c5f9c
fix: complete shared resource access (LE-1828) (#14101)
erichare Jul 22, 2026
43e7ee6
feat(ci): add declarative downstream bundle profiles (#14208)
erichare Jul 22, 2026
597d05f
fix: settings/db-provider accessibility (#13999)
deon-sanchez Jul 22, 2026
d3392bb
fix(mcp): reap cancelled session transports (#14214)
erichare Jul 22, 2026
24e82b9
fix: preserve secret values across graph edges (#14216)
erichare Jul 22, 2026
2e677bf
feat: Complete release 1.12 RBAC authorization foundations (#14215)
erichare Jul 22, 2026
6cfa638
Merge release-1.11.0 into release-1.12.0
erichare Jul 23, 2026
dc79b9f
fix: include Google as a default partner bundle (#14220)
erichare Jul 23, 2026
77964d4
Merge remote-tracking branch 'origin/main' into release-1.12.0
erichare Jul 23, 2026
9d6346e
fix(rbac): add permission checks in api and use owner id for provider…
HzaRashid Jul 23, 2026
52b1ea1
feat: Complete RBAC and distribution contracts (#14230)
erichare Jul 23, 2026
f5c517c
fix: graduate Azure and Ollama bundles (#14248)
erichare Jul 24, 2026
720cabc
fix: normalize MCP resource flow IDs (#14253)
erichare Jul 24, 2026
3d226af
fix: populate name and description on starter-projects API response (…
erichare Jul 25, 2026
edfe9dc
fix: render flows whose nodes have no position instead of crashing th…
erichare Jul 25, 2026
41fe68b
fix(mcp): make agentic MCP server removal actually delete the row (#1…
erichare Jul 27, 2026
2b040e4
fix: increment previous_content with content streamed (#14234)
lucaseduoli Jul 23, 2026
01b75c5
fix: add default fallback to instantiation.py and removed default oll…
lucaseduoli Jul 23, 2026
7141a58
fix(tracing): detach orphan spans before database flush (#14243)
erichare Jul 24, 2026
a540d03
fix(settings): enable agentic experience by default (#14244)
Cristhianzl Jul 24, 2026
48c50bd
fix(auth): keep refresh sessions alive on HTTP (#14252)
erichare Jul 24, 2026
08fdb76
fix(mem0): defer client import during startup (#14247)
Success6666 Jul 25, 2026
f878106
refactor(frontend): Add customization hook for API timestamp parsing …
Cristhianzl Jul 25, 2026
42c2acb
fix(components): stop legacy aliases from importing every bundle at s…
erichare Jul 25, 2026
6218c08
fix(frontend): reset modifier-only saved shortcuts to default (#14245)
Cristhianzl Jul 25, 2026
5511c0b
fix(ssrf): honor connector loopback policy for A2A agent and PaddleOC…
erichare Jul 26, 2026
683eae6
Merge main history into release-1.12.0
erichare Jul 27, 2026
d021b3e
fix(mcp): optimistic-lock concurrent MCP server PATCHes (#14005)
thesaadmirza Jul 27, 2026
445d1ef
Merge release-1.11.1 into release-1.12.0
erichare Jul 28, 2026
b93832b
test(authz): align share-level double with enterprise enforcement sem…
erichare Jul 28, 2026
cc7de6d
fix: settings/mcp-client accessibility (#14112)
viktoravelino Jul 28, 2026
66212a7
docs(authz): correct role-assignment domain types in model docstring …
erichare Jul 28, 2026
d250fbd
fix(a11y): label Password and Profile Picture form landmarks on setti…
olayinkaadelakun Jul 28, 2026
cf6dd45
Merge release-1.11.1 into release-1.12.0
erichare Jul 28, 2026
3dabd14
fix(mcp): pin MCP SDK <2.0 for uvx-launched servers (#14297)
viktoravelino Jul 28, 2026
914d682
refactor(frontend): remove legacy Store page and routes (#14141)
olayinkaadelakun Jul 28, 2026
e59f7e2
fix: settings/mcp-servers accessibility (#14063)
viktoravelino Jul 28, 2026
2fad4f5
Merge release-1.11.1 into release-1.12.0
erichare Jul 28, 2026
f831813
fix: settings/model-provider Accessibility (#13997)
deon-sanchez Jul 28, 2026
4d70084
fix(a11y): fix invalid ARIA, unnamed buttons, list markup, and touch …
olayinkaadelakun Jul 29, 2026
062b8d5
refactor(frontend): remove broken orphaned /flow/:id/view route (#14303)
viktoravelino Jul 29, 2026
25f1211
test(a11y): shared playground IBM scan and jest-axe coverage for unte…
viktoravelino Jul 29, 2026
c0ca503
fix(shortcuts): announce recorded key combo via aria-live and add acc…
olayinkaadelakun Jul 29, 2026
22478d6
fix(a11y): resolve IBM Equal Access violations on sidebar, canvas, an…
olayinkaadelakun Jul 29, 2026
7686fc3
chore: remove unused delete-account flow (dead route, stub page, orph…
olayinkaadelakun Jul 29, 2026
5042a65
fix: clean up Write File local staging under remote storage (#14237)
Jkavia Jul 29, 2026
25c6e96
fix(auth): never resolve LFX's no-op auth service in Langflow
erichare Jul 30, 2026
9c653d2
fix(execution): build the executor service off the event loop
erichare Jul 30, 2026
b4d31b1
fix(a11y): resolve Lighthouse button-name and aria-valid-attr-value f…
olayinkaadelakun Jul 30, 2026
2b20764
fix(playground): add accessible names to icon-only controls and fix i…
olayinkaadelakun Jul 30, 2026
b002f93
refactor(frontend): add customization seams for telemetry toggle and …
Cristhianzl Jul 30, 2026
9eb295a
feat: export application telemetry to any OTLP backend (#14213)
ogabrielluiz Jul 30, 2026
d41cca4
feat: Unified KBs and MBs to use common vector db backends (#14239)
dkaushik94 Jul 30, 2026
442b1b7
fix(deps): align system-metrics with the 0.65b0 opentelemetry family …
ogabrielluiz Jul 30, 2026
8e7429d
feat: add event-loop lag and DB pool saturation metrics (#14340)
ogabrielluiz Jul 30, 2026
fc3b885
feat: pgVector implementation for MBs and KBs (#14287)
dkaushik94 Jul 30, 2026
a2c015a
refactor: consolidate Langflow 1.12 on langflow-base (#14339)
erichare Jul 30, 2026
64cfb92
fix: bump lfx-bundles to 1.1.6
erichare Jul 30, 2026
2da52d0
feat(models): establish provider governance foundation (#14323)
erichare Jul 31, 2026
9e13c10
fix(frontend): don't trap users on a flow when save fails (#14358)
keval718 Jul 31, 2026
0ee9643
refactor(frontend): re-file use-refresh-model-inputs into services an…
tarciorodrigues Jul 31, 2026
dba5812
refactor(frontend): decompose dropdown and prompt components into hoo…
tarciorodrigues Jul 31, 2026
98b4f39
refactor(frontend): extract shared primitives and remove duplicated u…
tarciorodrigues Jul 31, 2026
f909928
refactor(frontend): decompose DBProvidersPage into components hooks a…
tarciorodrigues Jul 31, 2026
743a0ba
chore: allow base backend starting in makefile
erichare Jul 31, 2026
170e96c
feat(authz): add source-aware role assignment grants (#14333)
erichare Jul 31, 2026
7ae049d
feat(models): add approved provider policy store (#14324)
erichare Jul 31, 2026
15de3f2
fix: replace models of disconnected providers (#14362)
Cristhianzl Jul 31, 2026
dea1cfb
feat: agent catalog foundations and migration (#14316)
erichare Jul 31, 2026
f61ee33
feat: support externally managed provider and catalog policies (#14377)
erichare Aug 3, 2026
34fa3fe
fix: align catalog policy component identities (#14385)
erichare Aug 3, 2026
e73fd4b
fix: release SQLite lock after API key auth (#14381)
erichare Aug 3, 2026
39781a4
fix: isolate CrewAI runtime state across build_crew calls (#13852)
Zhengcy05 Aug 4, 2026
c4f43e8
fix(components): run user code input in Python REPL tool's run_model …
erichare Aug 4, 2026
b65e195
Merge release-1.11.2 into release-1.12.0
erichare Aug 4, 2026
9c78a02
fix: honor Tool Name/Description inputs in Python REPL tool component…
erichare Aug 4, 2026
4b1dd04
fix(crewai): isolate shared agents per crew (#14399)
erichare Aug 4, 2026
84cbcb8
fix(tests): stub SSRF transport in spoofed-metadata policy tests (#14…
erichare Aug 4, 2026
46903cc
test(frontend): stabilize grouped node readiness (#14411)
erichare Aug 4, 2026
00aa31f
fix(models): preserve edited field on provider auto-selection
erichare Aug 5, 2026
ebbc9f6
fix: serialize model provider variable writes (#14405)
erichare Aug 5, 2026
e2d0dc4
fix: cap alembic before named check comparison
erichare Aug 5, 2026
3ac86f3
fix: show Global Variables permission loading state (#14404)
erichare Aug 5, 2026
62760b2
fix(a11y): name command palette, dialogs, and crash screen (LE-2043) …
viktoravelino Aug 5, 2026
259369e
feat: SSO foundations, login seams, and remove OSS Admin Page (#14276)
deon-sanchez Aug 5, 2026
f953218
feat: add shared database-backed policy bundle (#14426)
erichare Aug 5, 2026
18f9875
feat: Remove use of vertex builds table in workflow API background mo…
Jkavia Aug 5, 2026
23f91d8
fix(authz): support scoped project visibility (#14429)
erichare Aug 6, 2026
b94d7f6
fix(authz): mask unauthorized share creation
erichare Aug 6, 2026
497ef4a
docs: database migrations (#14441)
mendonk Aug 6, 2026
522a463
fix: allow project-scoped flow creation (#14452)
erichare Aug 7, 2026
885adfc
fix: enforce approved catalog across alternate paths (#14449)
erichare Aug 7, 2026
3e5692b
fix(api): end request-scoped transactions before long-running executi…
erichare Aug 7, 2026
a881839
fix(frontend): drop stale refresh after code save (#14460)
Cristhianzl Aug 7, 2026
da4c780
fix: strip query strings from URL attributes before spans are exporte…
ogabrielluiz Aug 7, 2026
46d2572
fix(a11y): resolve ARIA violations in MCP selector and sidebar settin…
olayinkaadelakun Aug 7, 2026
2b14311
fix: right-click inside a modal opened from a node no longer acts on …
tarciorodrigues Aug 7, 2026
802bb7d
feat(security): opt-in exec-sandbox microVM backend for code-executio…
erichare Aug 7, 2026
a7ebfe9
fix(tests): account for pre-run transaction release in catalog-policy…
erichare Aug 7, 2026
e62f3ee
fix(telemetry): rebuild OpenTelemetry singleton after teardown guts i…
erichare Aug 8, 2026
1dfe36d
Merge release-1.11.3 into release-1.12.0
erichare Aug 8, 2026
52a6960
fix(lfx): correct "comparision" typo in Filter Values component descr…
erichare Aug 10, 2026
a860d6e
feat(agentic): Langflow Assistant improvements — flow building, model…
Cristhianzl Aug 10, 2026
da44904
fix(tests): handle the Setup Provider state in selectGptModel (determ…
erichare Aug 10, 2026
445650c
fix(tests): click Save in the provider modal before waiting for the k…
erichare Aug 10, 2026
950d094
fix(auth): add nested group-claim seam for LE-2102, LE-2103, and LE-2…
erichare Aug 10, 2026
6e9c84d
fix(tests): require exact MCP server name match (#14484)
erichare Aug 10, 2026
93ea599
fix(lfx): compare template keys directionally in the upgrade checker …
erichare Aug 10, 2026
525be91
refactor: extract useGlobalVariableUpsert and adopt it in global vari…
tarciorodrigues Aug 10, 2026
4e0c3d0
refactor: unify prompt modals into a strategy driven PromptEditorModa…
tarciorodrigues Aug 10, 2026
01cb729
refactor(frontend): decompose oversized modelInput, nodeToolbar and f…
tarciorodrigues Aug 10, 2026
97c05da
refactor: unify the stepper machinery behind a shared provider and re…
tarciorodrigues Aug 10, 2026
abcb6ad
fix(tests): handle the Setup Provider state in the right-click-dropdo…
erichare Aug 10, 2026
72a6d8f
fix(tests): require exact MCP server name match in remaining locators…
erichare Aug 10, 2026
0a1833f
feat: add deterministic project deployment artifacts (#14437)
erichare Aug 10, 2026
64a2040
refactor: align the deploy choice phase machine with the shared stepp…
tarciorodrigues Aug 10, 2026
3ec80bc
fix: reject prompt variables in the reserved underscore namespace (#1…
tarciorodrigues Aug 10, 2026
3f0eacf
feat(a11y): scan-first accessibility report and make test_frontend_a1…
viktoravelino Aug 10, 2026
f07bb08
fix(a11y): accessible names, dialog titles, keyboard controls, and to…
viktoravelino Aug 10, 2026
53ce3ed
feat: deployment-profile based pre-flight checks (#14393)
dkaushik94 Aug 10, 2026
a0a9a08
refactor: extract shared DataTableTab shell for files and knowledge t…
tarciorodrigues Aug 10, 2026
823ed46
feat: add enterprise lifespan hook registry and run-event store (#14504)
erichare Aug 11, 2026
a0d2714
feat: scope per-user memory to end-user identity header (#14443)
Jkavia Aug 11, 2026
e71face
feat: add deployment-wide blocked-model deny-list to policy bundle (#…
erichare Aug 11, 2026
4526d37
fix(authz): enforce execution principal boundaries (#14495)
erichare Aug 11, 2026
14c8119
feat: add catalog-policy component usage endpoints (#14510)
erichare Aug 11, 2026
ccc52ca
feat: add an opt-in warm graph registry for sync execution (#14290)
Jkavia Aug 11, 2026
e227ea0
fix: correct sync GET-status session_id; gate result cache behind a f…
Jkavia Aug 11, 2026
c89f828
fix: validate production preflight secret key (#14499)
erichare Aug 11, 2026
0fd8175
fix(deps): require cryptography 50 (#14514)
erichare Aug 11, 2026
f380b90
fix(deps): raise vulnerable Python dependency floors (#14513)
erichare Aug 12, 2026
536a8c2
Merge release-1.11.3 into release-1.12.0
erichare Aug 12, 2026
5cf611b
fix: stop shipping application telemetry to the LLM tracing vendor (#…
ogabrielluiz Aug 12, 2026
5e201ce
feat(authz): add durable audit persistence (#14496)
erichare Aug 12, 2026
1d6647a
fix: keep LLM tracing vendors off the global tracer provider, and pin…
ogabrielluiz Aug 12, 2026
3fd8102
feat: flow-execution span on every execution path, labelled by protoc…
ogabrielluiz Aug 12, 2026
d2bc8cb
feat: leak-safe LLM-provider latency and error metrics (#14231)
ogabrielluiz Aug 12, 2026
d32741f
feat: add an OTLP doctor to confirm telemetry delivery (#14226)
ogabrielluiz Aug 12, 2026
30b6af0
feat: spans for MCP tool calls, emitted at the call site (#14423)
ogabrielluiz Aug 12, 2026
8d41b97
Merge main into release-1.12.0
erichare Aug 12, 2026
46854a3
feat: database spans, and pin that sampling stays env-driven (#14420)
ogabrielluiz Aug 12, 2026
b738264
fix: require stored credentials for DB providers (#14500)
erichare Aug 12, 2026
aaa384a
fix: stop pre-selecting an unconfigured model (#14505)
Cristhianzl Aug 12, 2026
e7be040
feat(authz): add anonymous PUBLIC authorization (#14497)
erichare Aug 12, 2026
6a512f8
fix(deps): mend dep upgrades (#14528)
Adam-Aghili Aug 12, 2026
c013bb1
Merge main into release-1.12.0
erichare Aug 12, 2026
8cdbff5
fix(lfx): stop reading output-side tool_mode as a tool-mode capabilit…
erichare Aug 13, 2026
e4f77a6
fix(frontend): order chat messages correctly on WebKit (#14518)
Cristhianzl Aug 13, 2026
98ebf57
fix(a11y): make the shared playground navigable and motion-safe (#14451)
viktoravelino Aug 13, 2026
22ed5c6
feat: add telemetry for run executions (#14501)
Adam-Aghili Aug 13, 2026
4fa0486
fix(a11y): label and keyboard-nav fixes for canvas fields and picker …
olayinkaadelakun Aug 13, 2026
cde696e
test(observability): run the claims that admit the database and URL s…
ogabrielluiz Aug 13, 2026
7b35e88
feat: span for outbound A2A calls, emitted at the call site (#14520)
ogabrielluiz Aug 13, 2026
5c80b49
fix: rebuild drifted built-in components instead of refusing the flow…
erichare Aug 13, 2026
b198465
test: verify log-to-trace correlation against a real OTLP collector (…
ogabrielluiz Aug 13, 2026
e0321f1
test(observability): assert the flow span carries no exception event …
ogabrielluiz Aug 13, 2026
721cd67
fix: PGVector Collection/Indexes separation per KB and MB, locale fix…
dkaushik94 Aug 13, 2026
6218773
fix(observability): withhold log message bodies from OTLP export by d…
ogabrielluiz Aug 13, 2026
9e0a199
fix(security): complete image dependency remediation (#14542)
erichare Aug 13, 2026
9385452
fix(authz): make public playground links work — canonical shares and …
erichare Aug 13, 2026
d280fe6
fix(frontend): keep a file attachment a stale file-list response omit…
erichare Aug 13, 2026
1e3f046
fix(authz): restrict PUBLIC flow shares to execute (#14548)
erichare Aug 13, 2026
68796a6
fix(observability): correct MCP tool span attributes (#14537)
erichare Aug 13, 2026
11169d7
fix: let the caller own the flow span so a run's spans nest under it …
ogabrielluiz Aug 13, 2026
59bab1a
fix(a11y): keep menu arrow keys from dragging the node underneath (#1…
viktoravelino Aug 14, 2026
ee2f9c1
feat(api): add id-keyed project upsert endpoint (#14521)
jordanrfrazier Aug 14, 2026
508e95d
fix(a11y): show where keyboard focus is on the canvas, and keep it af…
viktoravelino Aug 14, 2026
dccd425
fix(test): run the bundle-guarded tests that CI was silently skipping…
erichare Aug 14, 2026
e302378
chore: add bob context file to .gitignore (#14558)
Adam-Aghili Aug 14, 2026
217550d
chore(deps): remediate Mend scan findings on release-1.12.0 (#14555)
erichare Aug 14, 2026
f62f50b
fix(a11y): give the knowledge base provider picker its field's name (…
viktoravelino Aug 14, 2026
946819c
fix(db): ignore foreign tables in alembic check (#14534)
Cristhianzl Aug 14, 2026
d65b98f
ci: harden nightly builds and test reliability (#14540)
erichare Aug 14, 2026
e0859c4
fix(auth): stop IdP bearer defects from breaking authentication (LE-2…
erichare Aug 14, 2026
0a2d167
fix(frontend): gate the add component affordance on the pending permi…
tarciorodrigues Aug 14, 2026
51cd936
Merge release-1.12.0 into main
erichare Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
38 changes: 21 additions & 17 deletions .agents/skills/ibm-a11y-level1-audit/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
---
name: ibm-a11y-level1-audit
description: Audit Langflow frontend UI against IBM Equal Access Level 1 criteria, produce a compliance report, fix violations, and verify with Playwright a11y specs under src/frontend/tests/a11y. Use when the user asks for an IBM Level 1 a11y audit, Level 1 compliance report, accessibility remediation against IBM Able requirements, or to find/report/fix Level 1 WCAG issues.
description: Perform a scoped IBM Equal Access Level 1 compliance audit of a chosen Langflow frontend surface (routes, components, or a PR) and produce a findings report mapped to WCAG/IBM Level 1 criteria. Default behavior is audit and report only — fixes are applied only when the user explicitly asks for remediation in the same request. Use when the user asks for an IBM Level 1 audit, a Level 1 compliance report, or to find/report Level 1 WCAG issues on a specific surface. For scanning a batch of routes without a report, see ibm-a11y-route-scan. For scanning and fixing an entire PR/branch end-to-end by default, see ibm-a11y-pr-remediation.
---

# IBM Accessibility Level 1 Audit

Audit → report → fix → verify. Scope is **IBM Equal Access Toolkit v7.3 Level 1 only**. Do not expand into Level 2/3 unless the user asks.
Audit → report → (fix only if asked) → verify. Scope is **IBM Equal Access Toolkit v7.3 Level 1 only**. Do not expand into Level 2/3 unless the user asks.

This skill's default deliverable is a **report**, not a diff. If the user wants a full scan-and-fix pass across an entire PR/branch, use `ibm-a11y-pr-remediation` instead — it is fix-by-default. This skill fixes only when the user explicitly asks for remediation of the audited surface in the same request.

## Related skills

| Skill | Use for |
|-------|---------|
| [frontend-a11y-check](../frontend-a11y-check/SKILL.md) | How to write/run axe + IBM scans, baselines, component gotchas |
| [ibm-a11y-automation](../ibm-a11y-automation/SKILL.md) | Python route scanner + Markdown/HTML report generation |
| [ibm-a11y-testing-guide](../ibm-a11y-testing-guide/SKILL.md) | How to write/run axe + IBM scans, baselines, component gotchas |
| [ibm-a11y-route-scan](../ibm-a11y-route-scan/SKILL.md) | Python route scanner + Markdown/HTML report generation |
| [ibm-a11y-pr-remediation](../ibm-a11y-pr-remediation/SKILL.md) | Fix-by-default scan of an entire PR/branch |
| [frontend-i18n](../frontend-i18n/SKILL.md) | Any new/changed accessible names or UI strings |

## Sources of truth
Expand All @@ -31,9 +34,9 @@ Level 1 Audit Progress:
- [ ] 2. Scan (IBM + axe as applicable)
- [ ] 3. Map findings to Level 1 criteria
- [ ] 4. Write the report
- [ ] 5. Fix violations
- [ ] 6. Verify with tests/a11y
- [ ] 7. Re-scan and update report status
- [ ] 5. Fix violations (only if the user asked for remediation)
- [ ] 6. Verify with tests/a11y (only if step 5 ran)
- [ ] 7. Re-scan and update report status (only if step 5 ran)
```

### 1. Scope the surface
Expand All @@ -48,7 +51,7 @@ Read `src/frontend/tests/a11y/README.md` and list existing specs that already co

### 2. Scan

Run **both** engines when the surface is interactive UI (see `frontend-a11y-check`):
Run **both** engines when the surface is interactive UI (see `ibm-a11y-testing-guide`):

```bash
# Playwright IBM scans (live DOM / stateful)
Expand All @@ -59,7 +62,7 @@ RUN_A11Y=true RUN_A11Y_ASSERT=true npx playwright test tests/a11y/<feature>.a11y
npm run a11y:html-report --silent
# → coverage/accessibility-reports/index.html

# Ad-hoc route batch (default-loaded page only)
# Ad-hoc route batch (default-loaded page only) — see ibm-a11y-route-scan for details
uv run --with playwright python scripts/a11y/a11y_scan.py \
--url http://localhost:3000 \
--routes-file scripts/a11y/a11y_routes.json \
Expand Down Expand Up @@ -89,18 +92,18 @@ Use [references/report-template.md](references/report-template.md). Deliver the

Required sections: Summary, Scope, Findings table, Fixes applied / proposed, Verification, Remaining risk / baselines.

### 5. Fix violations
**Stop here by default.** List proposed fixes in the report without editing files, unless the user's request explicitly also asked for remediation (e.g. "audit and fix", "fix what you find"). If they only asked for an audit or report, do not proceed to step 5.

### 5. Fix violations (only when explicitly requested)

When this skill is invoked for audit+fix (default), fix in-scope Level 1 violations:
Only continue past the report if the user's request explicitly asked for fixes alongside the audit. Otherwise stop after step 4.

- Prefer semantic HTML over ARIA.
- Follow Langflow patterns in `frontend-a11y-check` (AG Grid, Radix `asChild`, focus restore, icon-only `aria-label`).
- Follow Langflow patterns in `ibm-a11y-testing-guide` (AG Grid, Radix `asChild`, focus restore, icon-only `aria-label`).
- Route new UI strings / `aria-label`s through `frontend-i18n`.
- Do **not** silently disable scans. Use IBM baselines under `src/frontend/tests/a11y/baselines/` only for documented framework debt (see `frontend-a11y-check`).
- Do **not** silently disable scans. Use IBM baselines under `src/frontend/tests/a11y/baselines/` only for documented framework debt (see `ibm-a11y-testing-guide`).
- Keep fixes minimal; do not refactor unrelated UI.

If the user asked for **report only**, stop after step 4 and list proposed fixes without editing.

### 6. Verify with `tests/a11y`

Confirm path: `src/frontend/tests/a11y/`.
Expand Down Expand Up @@ -139,7 +142,7 @@ Scanners miss some Level 1 tasks — spot-check when relevant:

## Best practices (data grids + modals)

When auditing or fixing **settings tables** (especially `/settings/global-variables`) and similar AG Grid + modal flows, treat these as Level 1 best practices (2.1.1 / 2.4.3) — not edge-case gotchas.
When auditing **settings tables** (especially `/settings/global-variables`) and similar AG Grid + modal flows, treat these as Level 1 best practices (2.1.1 / 2.4.3) — not edge-case gotchas.

### Selectable-row keyboard map

Expand All @@ -163,10 +166,11 @@ Implementation notes:
- Create modal opened from **Add New** should restore to that trigger (Radix default when a real `DialogTrigger` exists).
- Verify with a Playwright keyboard test: open from a cell → Escape → `document.activeElement` is still that cell (or its `col-id`), then Enter can open again without a manual mouse re-focus.

For AG Grid pagination/tab traps, Radix `asChild`, and popover Esc restore details, see [frontend-a11y-check](../frontend-a11y-check/SKILL.md) (Gotchas vs Best practices sections).
For AG Grid pagination/tab traps, Radix `asChild`, and popover Esc restore details, see [ibm-a11y-testing-guide](../ibm-a11y-testing-guide/SKILL.md) (Gotchas vs Best practices sections).

## Out of scope (unless asked)

- IBM Level 2/3 criteria listed as deferred in the criteria reference
- Section 508 software-only rows (web UI covered via 4.1.2)
- Media captions (1.2.x) when the surface has no audio/video
- Fixing violations without an explicit remediation request (report only by default)
156 changes: 156 additions & 0 deletions .agents/skills/ibm-a11y-pr-remediation/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
---
name: ibm-a11y-pr-remediation
description: Scan every frontend surface touched by the current PR/branch for IBM Equal Access Level 1 accessibility issues and fix all in-scope violations by default. Discovers changed files, maps them to routes/components/states, runs both axe and IBM engines, remediates until both are green (or only documented baselines remain), and reports back. Use when the user asks to check, scan, or clean up accessibility for "this PR", "my branch", or "my changes" and wants fixes applied, not just a report. For a single scoped audit report without a default fix pass, use ibm-a11y-level1-audit; for a route batch scan only, use ibm-a11y-route-scan.
disable-model-invocation: true
---

# IBM Level 1 PR Accessibility Remediation

Scope is **IBM Equal Access Level 1 only**. **Default mode is fix, not report-only.** Scan every frontend surface touched by the PR/branch and remediate all in-scope issues until both engines are green (or only documented baselines remain).

This skill is a PR-scoped orchestrator. It does not duplicate detailed engine/pattern guidance — read the linked skills for that:

- [ibm-a11y-testing-guide](../ibm-a11y-testing-guide/SKILL.md) — which engine/test layer to use, POUR checklist, axe-vs-IBM gaps, Radix/AG-Grid gotchas, baselines.
- [ibm-a11y-route-scan](../ibm-a11y-route-scan/SKILL.md) — Python scanner options for ad-hoc route batches.
- [ibm-a11y-level1-audit](../ibm-a11y-level1-audit/SKILL.md) — Level 1 criteria references and report template, useful when the user wants a formal audit report for the PR instead of (or in addition to) fixes.
- [frontend-i18n](../frontend-i18n/SKILL.md) — accessible names / UI strings must go through i18n.

## Mandate

1. Diff the PR (or current branch vs its merge base) for `src/frontend/**` changes.
2. Map changed files → UI surfaces → routes / components / states to scan.
3. Run **both** axe (Jest where applicable) and IBM Equal Access (Playwright `page.runA11yScan` and/or `scripts/a11y/a11y_scan.py` — see `ibm-a11y-testing-guide` / `ibm-a11y-route-scan`).
4. **Fix every in-scope Level 1 violation** in the changed surfaces. Do not stop at a findings list unless the user says **report only** (in that case, hand off to `ibm-a11y-level1-audit`).
5. Re-scan until assert mode passes. Add/update a11y specs when coverage is missing.
6. Report what changed, commands run, and any baselined/deferred debt.

Do **not** invent new tag names, silently disable scans, or expand into IBM Level 2/3 unless asked.

## Progress checklist

```
IBM L1 PR A11y:
- [ ] 1. Collect changed frontend files
- [ ] 2. Map files → surfaces / routes / states
- [ ] 3. Scan (IBM + axe)
- [ ] 4. Fix all in-scope violations
- [ ] 5. Add/update tests if needed
- [ ] 6. Re-scan assert-green
- [ ] 7. Report back
```

## 1. Collect changed frontend files

Prefer the PR merge base when a PR exists; otherwise the branch merge base vs `main`/`master`.

```bash
# PR number known
gh pr diff <n> --name-only | grep -E '^src/frontend/' || true

# Current branch vs upstream default
BASE=$(git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD origin/master)
git diff --name-only "$BASE"...HEAD -- 'src/frontend/**'

# Include uncommitted work when the user is mid-change
git diff --name-only HEAD -- 'src/frontend/**'
git diff --name-only --cached -- 'src/frontend/**'
git ls-files --others --exclude-standard 'src/frontend/**'
```

Include:
- `src/frontend/src/**/*.{tsx,ts,jsx,js,css}` (UI)
- `src/frontend/tests/a11y/**` (existing coverage)
- Locale files only when they change accessible names / labels

Skip pure non-UI churn unless it affects a11y (e.g. test helpers that change focus / ARIA). If **no** frontend files changed, say so and stop.

## 2. Map files → surfaces

For each changed file, identify:

| Change type | Scan target |
|-------------|-------------|
| Page / route | That route + meaningful states (empty/populated/modal/mobile) |
| Shared component (`TableComponent`, dialogs, menus) | **Every** consumer page that uses it — not only the file you touched |
| Primitive | Jest axe on the primitive + any Playwright surface that embeds it |
| Spec / baseline only | Re-run that spec; no product fix unless it fails |
| `a11y_routes.json` | Update static coverage; run static or route scan |

List interactive controls and states (default, empty, populated, open modal / menu, selected row, error, mobile). Prefer existing specs under `src/frontend/tests/a11y/`.

## 3. Scan (both engines must pass)

Automated a11y is not one tool — see `ibm-a11y-testing-guide` for the full engine comparison and gotchas. Summary:

- **axe-core** — Jest `axe()` (`@/utils/a11y-test`), jsdom-only.
- **IBM Equal Access** — stricter on ARIA structure and keyboard semantics. Playwright `page.runA11yScan(label)` for stateful surfaces (modals/menus/selected/editing); `scripts/a11y/a11y_scan.py` for default-loaded page only.

```bash
cd src/frontend
RUN_A11Y=true RUN_A11Y_ASSERT=true npx playwright test tests/a11y/<feature>.a11y.spec.ts --project=chromium --workers=5

# Python scanner playwright deps are NOT in default uv sync.
# One-time: uv run --with playwright playwright install chromium
uv run --with playwright python scripts/a11y/a11y_scan.py \
--url http://localhost:3000 \
--routes /settings/<route> \
--out /tmp/a11y.json --markdown /tmp/a11y.md --timeout-ms 45000
```

`RUN_A11Y=true` runs the scan; `RUN_A11Y_ASSERT=true` fails on new violations. After changing a shared component, re-scan every page that uses it.

For component-only changes:

```bash
cd src/frontend
npx jest path/to/<name>.a11y.test.tsx --runInBand
```

Do not invent findings — prefer scanner output plus manual Level 1 spot checks scanners miss (keyboard trap both ways, focus restore, 320px reflow, color-not-only).

## 4. Fix all in-scope Level 1 violations

Default: **fix**. Only list proposed fixes without editing if the user asked **report only** — then hand off to `ibm-a11y-level1-audit` for the formal report format.

Rules:
- Prefer semantic HTML over ARIA.
- Follow the Langflow patterns in `ibm-a11y-testing-guide` (AG Grid, Radix `asChild`, focus restore, icon-only `aria-label`).
- Route new UI strings / `aria-label`s through i18n (`t(...)`, all locale files) per `frontend-i18n`.
- Keep fixes minimal; do not refactor unrelated UI.
- Do **not** silently disable scans. Use IBM baselines under `src/frontend/tests/a11y/baselines/` only for documented framework debt.
- Map each issue to a Level 1 WCAG/IBM id; defer anything listed as Level 2/3 in the criteria guide (`ibm-a11y-level1-audit/references/ibm-level1-criteria.md`) unless the user expands scope.

### Manual Level 1 spot checks (when relevant)

- **2.1.1 / 2.1.2:** Tab and Shift+Tab; Escape closes overlays; no trap.
- **2.4.3 / 2.4.7:** Focus order matches visual order; focus ring visible.
- **1.4.10:** 320px / ~400% zoom — no essential horizontal scroll.
- **1.4.1:** Status/errors not color-only.
- **3.3.1 / 3.3.2:** Errors in text and tied to fields; inputs labeled.

## 5. Tests / coverage

| Surface | Spec |
|---------|------|
| Static routes | `static-routes.a11y.spec.ts` (+ `scripts/a11y/a11y_routes.json`) |
| Auth | `auth-pages.a11y.spec.ts` |
| Core pages | `core-pages.a11y.spec.ts` |
| Data-rich | `files.a11y.spec.ts`, `api-keys.a11y.spec.ts`, `global-variables.a11y.spec.ts` |
| Other data-rich | `data-rich-routes.a11y.spec.ts` |

If you fixed a state with no scan, add one (and keyboard tests for custom keyboard behavior) following `files.a11y.spec.ts` / `api-keys.a11y.spec.ts` patterns.

Tag every Playwright a11y test `@release` plus a domain tag (`@workspace` / `@api` / `@database` / `@components` / `@starter-projects`). Import `test`/`expect` from `../fixtures`.

## 6. Re-scan and report

Re-run the same scans with `RUN_A11Y_ASSERT=true`. Each finding → `fixed` | `baselined` | `open`.

When done, state:
- Changed frontend files considered
- Surfaces / states scanned
- Fixes applied (files + what)
- Commands run — whether **both** axe and IBM ran and both reported zero
- Specs / baselines added or updated
- States skipped and why
- Remaining risk or accepted limitation
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
name: ibm-a11y-automation
description: Run Langflow's local accessibility scanner script against frontend routes from src/frontend/src/routes.tsx and summarize the JSON report.
name: ibm-a11y-route-scan
description: Batch-scan Langflow frontend routes for accessibility issues using the Python IBM Equal Access scanner (scripts/a11y/a11y_scan.py) and produce JSON/Markdown/HTML reports. Scans the default-loaded state of each route only (use explicit state files for modals). Use when asked to scan one or more routes, produce an accessibility report for pages, or batch-check static routes. Reports findings only — does not fix code, run Playwright/axe tests, or perform a formal Level 1 audit; see ibm-a11y-testing-guide, ibm-a11y-level1-audit, and ibm-a11y-pr-remediation for those.
---

# Langflow Accessibility Scanner
# IBM Route Scanner

Use this skill when asked to scan Langflow frontend pages for accessibility issues.
Use this skill when asked to scan Langflow frontend pages for accessibility issues with the local Python scanner. This skill only reports — it does not modify code. For test-writing guidance, formal audits, or PR-wide fixes, see `ibm-a11y-testing-guide`, `ibm-a11y-level1-audit`, and `ibm-a11y-pr-remediation`.

## Scanner

Expand Down Expand Up @@ -181,4 +181,4 @@ Use report fields directly:
- Do not auto-click arbitrary buttons to find modals. Use explicit state actions.
- Avoid destructive modal actions unless the user explicitly asks and data is safe.
- If a route has zero API requests, mention that scan quality may be limited.
- Ask before fixing files unless the user explicitly asks for fixes.
- This skill reports only; do not edit files. If the user also wants fixes applied, hand off to `ibm-a11y-pr-remediation` or `ibm-a11y-level1-audit`.
Loading
Loading