cora-mcp-summary
summarize_fixes’ result: what became of each issue whose remediation loop is open, every issue a scan found whether or not a fix was tried, for a person to review. Each issue gives its rule and where to read about it, its page and element, what became of it, the fixer’s account of it and the test that pins its fix, and the element’s accessibility-tree entries before and after its last fix. The call ends the loop of each issue it lists.
Each version lists its fields, then a section for each object they hold, headed by its path, in which [] stands for each entry of a list. Where objects of several kinds share a path, each kind has a section, named by the field that tells them apart. A field marked required is in every object of its kind, and the description of any other says when it is absent.
Version 1
Section titled “Version 1”The version this release writes. Its JSON Schema is schemas/cora-mcp-summary/v1.json in the @vispero/cora package and at https://cora.vispero.com/docs/0.10/schemas/cora-mcp-summary/v1.json.
format(“cora-mcp-summary”, required): The result’s format, alwayscora-mcp-summary.version(1, required): The version of cora-mcp’s tool surface, which every result and error of its tools declares.issues(array of objects, required): The issues awaiting a person first, escalated then proposed, then those fixed; within each, most severe first, an issue whose scan’s run file cannot be read last. They are listed in that order while the result has room.omitted(integer, required): How many issues the result leaves out, for its size or because a verification of them is running. Each keeps its loop, so a later call reports it.
issues[]
Section titled “issues[]”id(string, required): The issue’s ID when its loop started, as 32 lowercase hexadecimal characters.listedAs(array of strings, required): Each other ID a rescan has listed the issue under since its loop started, oldest first, kept in order while the list has room.rule(object, required): The issue’s rule, with where to read about it.page(object, required): The page the issue’s loop followed its element on.element(string, required): The element the loop followed, by its path: each iframe or shadow host it is inside, outermost first, asframe:orshadow:and its CSS selector, then the element’s own selector, joined by>>with a space on each side, such asframe:#checkout >> button.pay. Cut short, ending with…, when it is long.found(object): The issue as the scan its loop started from found it; absent when that scan’s run file cannot be read, as when it was deleted, or holds none of the issue’s IDs.disposition(“fixed”, “proposed” or “escalated”, required): What became of the issue:fixedwhenverify_fixlast found it fixed,escalatedwhen its loop escalated it to a person after the attempts it allows did not fix it, and otherwiseproposed, for a person to review the fix the fixer proposes or to make the one that needs their judgement, whether or not a fix was tried.report(true):truewhencora scan’s report of the scan its loop started from lists the issue as report-only: its violations are of rules the project’s rule selection set toreporton their page, beside any in a page state an agent reached, so its findings are shown but never fail CI’s gate and are never baselined. Absent otherwise, as on an issue that needs review, or when that scan’s run file cannot be read.accepted(true):truewhen the latest scan that compared the issue with the project’s baseline found that the baseline accepts it, ascora scancounts it, so CI’s gate does not fail on it: a scan of its page as it loads, or a verification’s rescan of one. Absent otherwise, as before any such scan. The issue’s loop keeps it, so a run file that cannot be read leaves it as it is.change(string): The fixer’s account of the issue, as the call’sfixesgave it, for a person to review, cut short, ending with…, when it is long; absent when no entry offixesnamed the issue.test(string): The test that pins the fix, by its file and name, as the call’sfixesnamed it, cut short, ending with…, when it is long; absent when the issue’s entry named none.before(object, required): The element’s entry in the browser’s accessibility tree when the issue’s loop started, or why it has none. Its texts from the page are cut short, ending with…, when they are long, and its states, or an excluded entry’s reasons, are kept in order while the list has room, each cut short too.after(object): The element’s entry in the rescan of the issue’s last attempt, or why it has none, cut asbeforeis; absent before any attempt, and when that attempt kept no entry.
issues[].rule
Section titled “issues[].rule”id(string, required): The rule’s ID, such asaxe/image-alt.title(string): The rule in plain language, from its fix guidance, such as “Buttons need a name”; absent for a rule CORA has no guidance for.affects(array of “screen-reader”, “low-vision”, “color-vision”, “deaf”, “keyboard”, “voice-control”, “dexterity”, “cognitive” or “motion”): Who the rule’s failures affect, most affected first, from its fix guidance, such asscreen-readerorkeyboard; absent for a rule CORA has no guidance for.wcag(array of strings, required): The WCAG success criteria the rule checks, such as1.1.1, kept in order while the list has room; empty for a best practice, and for a rule this cora knows only by its ID.bestPractice(boolean, required): Whether the rule is a best practice: one known to name no WCAG success criterion, whose failures are not WCAG failures.falsefor a rule this cora knows only by its ID.understanding(array of objects, required): The page in the W3C’s Understanding WCAG 2.2 of each ofwcag’s criteria that has one, inwcag’s order, kept in order while the list has room.helpUrl(string): The address of the rule’s documentation from its engine, such as Deque University’s page for an axe-core rule; absent for a rule this cora does not know.guidanceUrl(string): The address of the rule’s guidance page in the docs of the cora-mcp release that answered; absent for a rule CORA has no guidance for.
issues[].rule.understanding[]
Section titled “issues[].rule.understanding[]”criterion(string, required): The WCAG success criterion, such as1.4.3.url(string, required): The address of the criterion’s page in Understanding WCAG 2.2, such ashttps://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html.
issues[].page
Section titled “issues[].page”url(string, required): The page’s URL, as the scan that started the issue’s loop recorded it, with its credentials redacted as a results file stores a URL, cut short, ending with…, when it is long.reachedBy(“navigation” or “interaction”, required): How the page state was reached:navigationfor a pagescan_urlloaded, andinteractionfor a pagescan_pagescanned as the agent left it.browser(string, required): The name of the browser the page ran in, such aschrome. An open set: a cora that does not know a name, such as one a newer cora writes, keeps and compares it as it is.viewport(object, required): The size of the browser’s viewport the page was shown at.
issues[].page.viewport
Section titled “issues[].page.viewport”width(integer, required): Its width, in CSS pixels.height(integer, required): Its height, in CSS pixels.
issues[].found
Section titled “issues[].found”run(string, required): The ID of that scan’s run, whichexplain_findingtakes: its start time and eight random characters, such as20261005T221403123Z-k3j9x2ab.severity(“critical”, “serious”, “moderate” or “minor”, required): How much the issue hinders people in that scan: its most severe violation’s severity, or its most severe finding’s when it has no violation.sources(array of objects, required): Each distinct place in the project’s source the issue’s findings are at, in the issue’s order, its representative’s first, with each opening tag cut short, ending with…, when it is long. They are kept in order while the list has room, and a place too long for the list on its own is left out; empty when no finding has a source location.omittedSources(integer, required): How many placessourcesleaves out for its size.callSites(integer, required): How many distinctcall-sitesource locations the issue’s findings are at in that scan, each place counted once: the host elements in the project’s source around the uses of a component that renders the element, which a fix at the call site must reach. Zero when none of its findings has one.
issues[].found.sources[]
Section titled “issues[].found.sources[]”file(string, required): The file, from the repository’s root, with forward slashes, such assrc/App.tsx.line(integer, required): The line the opening tag’s<is on, from 1.column(integer, required): The column of the opening tag’s<, from 1, counting UTF-16 code units, as ESLint and SARIF do: a tab is one column, and an emoji two.endLine(integer): The line the opening tag’s closing>is on, which may beline; absent when the location does not give its end.endColumn(integer): The column just after the opening tag’s closing>, counted ascolumnis; absent when the location does not give its end.openingTag(string, required): The opening tag as the source fingerprint hashes it: its source text from<to>, each run of whitespace written as one space.resolution(“element” or “call-site”, required): Whose opening tag the location is:elementfor the element’s own, when it has a source stamp of its own;call-sitefor its nearest stamped ancestor’s when it has none, such as an element a component fromnode_modulesrenders: the closest host element in the project’s source that encloses it.
issues[].before where status is “missing”
Section titled “issues[].before where status is “missing””Also at: issues[].after
status(“missing”, required): What became of the element’s entry:missingwhen its reference leads to no single element,excludedwhen the browser leaves the element out of the tree,includedwhen the tree holds it, andunavailablewhen the entry could not be read.
issues[].before where status is “excluded”
Section titled “issues[].before where status is “excluded””Also at: issues[].after
status(“excluded”, required): What became of the element’s entry:missingwhen its reference leads to no single element,excludedwhen the browser leaves the element out of the tree,includedwhen the tree holds it, andunavailablewhen the entry could not be read.reasons(array of strings, required): The browser’s names for why it leaves the element out, at least one, such asnotRenderedorariaHiddenElement. An open set, which differs between browser versions.
issues[].before where status is “included”
Section titled “issues[].before where status is “included””Also at: issues[].after
status(“included”, required): What became of the element’s entry:missingwhen its reference leads to no single element,excludedwhen the browser leaves the element out of the tree,includedwhen the tree holds it, andunavailablewhen the entry could not be read.role(string, required): The element’s role in the tree, such asbutton.name(string, required): The accessible name; empty when the element has none.description(string): The accessible description; absent when the element has none.states(object of string, number or boolean, required): Each asserted property’s value by its name, such asfocusable: true; a property that is not asserted has no key. A tristate, such ascheckedorpressed, istrue,falseormixedas a string, and a number stays a number.
issues[].before where status is “unavailable”
Section titled “issues[].before where status is “unavailable””Also at: issues[].after
status(“unavailable”, required): What became of the element’s entry:missingwhen its reference leads to no single element,excludedwhen the browser leaves the element out of the tree,includedwhen the tree holds it, andunavailablewhen the entry could not be read.reason(“facet-absent”, “failed” or “timed-out”, required): Why the entry could not be read:facet-absentwhen the browser cannot give one, as only Chromium gives accessibility entries;failedwhen reading it failed on this element; andtimed-outwhen the capture’s time ran out first.