[package]
name = "round2-a11y-oracle"
version = "0.1.0"
edition.workspace = true
publish.workspace = true

# Packet 2B-A (ROUND2_TEXT_RECIPE.md §8, spec/CONTRACT_EDITOR_T4_SPIKE.md pin
# 13): the check-5 accessibility oracle's *comparison-data* half. This crate
# reads the already-committed, already-validated `round2-textkit/fixtures.json`
# (via `round2_textkit::output::load_fixtures`, which validates it against its
# embedded digest — see that crate) and writes
# `round2-a11y-oracle/a11y_expectations.json`: per fixture, the exact accepted/
# prohibited at-spi2 roles and the exact byte strings each `PROHIBITED_OUTCOMES`
# classification would produce, so `a11y-verifier/verify.py`'s live-tree mode
# compares observed bytes against precommitted bytes rather than guessing what
# a wrong name "looks like".
#
# This crate must exist and be reviewed *before* either Round 2 candidate
# builds a tree (pin 13): if a candidate's own tree shaped what this oracle
# expects, the oracle would no longer be neutral evidence.
#
# Deliberately no rendering, windowing, or accessibility crate here — this
# crate never touches a live tree; that is `a11y-verifier/verify.py`'s job.

[dependencies]
round2-textkit = { path = "../round2-textkit" }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# Pinned to the same version already resolved transitively (epiphany-core /
# epiphany-ops both already pull it), so adding this dependency changes
# nothing in Cargo.lock's resolution.
unicode-normalization = "=0.1.25"
# Same version round2-textkit shapes fixtures with, for the same reason it
# pins it: grapheme-boundary derivation here must agree with the grapheme
# boundaries `crate::hittest`'s caret stops were built from.
unicode-segmentation = "=1.13.3"

[[bin]]
name = "generate_a11y_expectations"
path = "src/bin/generate_a11y_expectations.rs"
