Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
f4a1487
test(core): specify explicit selection contract
lemone112 Jul 14, 2026
e46288f
feat(core): seal explicit feasibility selection
lemone112 Jul 14, 2026
c20bed0
test(core): bind selection recheck to exact packed cell
lemone112 Jul 14, 2026
3524db1
test(core): ratchet selection runtime work
lemone112 Jul 14, 2026
bfa1a7b
build(core): advance native evidence protocol to v3
lemone112 Jul 14, 2026
5781d4a
refactor(build): remove dead evidence default
lemone112 Jul 14, 2026
805fed0
build(core): admit native feasibility evidence v3
lemone112 Jul 14, 2026
5a4c936
build(wasm): record issue 296-b canonical candidate
lemone112 Jul 14, 2026
b777b1d
build(wasm): admit issue 296-b canonical evidence
lemone112 Jul 14, 2026
2ec438d
test(core): require exhaustive selection outcome
lemone112 Jul 14, 2026
8ba6b6f
fix(core): expose exhaustive selection outcome
lemone112 Jul 14, 2026
076daea
test(core): bound selection receipt byte work
lemone112 Jul 14, 2026
dd44b47
fix(core): stream relation identity once per receipt
lemone112 Jul 14, 2026
5e5fdb3
build(core): advance native admission protocol to v4
lemone112 Jul 14, 2026
72434a5
build(core): admit native feasibility evidence v4
lemone112 Jul 14, 2026
b6c38b4
test(release): reject ephemeral evidence snapshots
lemone112 Jul 14, 2026
01718a2
refactor(evidence): collapse draft native admission to v3
lemone112 Jul 14, 2026
3d9e426
fix(evidence): make feasibility admission squash-durable
lemone112 Jul 14, 2026
eece8a4
test(selection): expose receipt ordinal vacuum
lemone112 Jul 14, 2026
e8a9825
test(selection): bind global receipt ordinals
lemone112 Jul 14, 2026
5a21cfa
build(evidence): rebind selection receipt coverage
lemone112 Jul 14, 2026
b9df921
test(evidence): expose durable lock drift contradiction
lemone112 Jul 15, 2026
4c62ebd
fix(evidence): delegate durable lock compatibility
lemone112 Jul 15, 2026
9a0bbc0
docs(evidence): define durable lock ownership
lemone112 Jul 15, 2026
d3d8de1
build(evidence): admit durable lock handoff
lemone112 Jul 15, 2026
6c8f66b
refactor(core): share selection identity grammar
lemone112 Jul 15, 2026
7906107
build(evidence): record selection review candidate
lemone112 Jul 15, 2026
08c3078
build(evidence): admit reviewed selection artifacts
lemone112 Jul 15, 2026
bc17e27
docs: bound wasm evidence applicability
lemone112 Jul 15, 2026
cffc775
fix(evidence): close selection review vacuums
lemone112 Jul 15, 2026
ea2d7a0
build(evidence): record strict-json review candidate
lemone112 Jul 15, 2026
4b1cc68
build(evidence): admit strict-json review artifacts
lemone112 Jul 15, 2026
f279735
fix(release): keep evidence verification source-clean
lemone112 Jul 15, 2026
b30d2e1
fix(evidence): remove ephemeral commit provenance
lemone112 Jul 15, 2026
cfa5944
refactor(evidence): make native provenance one exact cone
lemone112 Jul 15, 2026
746492d
build(evidence): bind admission to exact dependency cone
lemone112 Jul 15, 2026
e6efd2c
docs(naming): ratchet script inventory
lemone112 Jul 15, 2026
70cc91b
fix(evidence): record native admission in closed build shell
lemone112 Jul 15, 2026
d196cf6
test(evidence): separate shape from admission mutations
lemone112 Jul 15, 2026
268d8cb
fix(evidence): bind recorder to compiled benchmark
lemone112 Jul 15, 2026
140b641
build(evidence): bind closed native admission receipt
lemone112 Jul 15, 2026
11ef5fa
ci(evidence): recapture whole-call candidate
lemone112 Jul 15, 2026
b50a110
fix(evidence): recapture bound Linux observations
lemone112 Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .cargo/mutants.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ examine_globs = [
"crates/labcolors-core/src/wcag22_evidence.rs",
"crates/labcolors-core/src/wcag22_feasibility.rs",
"crates/labcolors-core/src/wcag22_feasibility/explicit.rs",
"crates/labcolors-core/src/wcag22_feasibility/explicit/selection.rs",
"crates/labcolors-core/src/wcag22/kernel.rs",
]

Expand Down
53 changes: 40 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ jobs:
run: python3 scripts/verify_wcag22_feasibility_identity.py
- name: verify explicit WCAG22 feasibility identity and anti-vacuum mutations
run: python3 scripts/verify_wcag22_explicit_feasibility_identity.py --self-test
- name: verify explicit WCAG22 selection identity and anti-vacuum mutations
run: python3 scripts/verify_wcag22_explicit_selection_identity.py --self-test
- name: validate historical and current WCAG22 feasibility benchmark evidence
run: |
historical_artifact="crates/labcolors-core/contracts/wcag22-feasibility-benchmark-v1.json"
Expand All @@ -332,7 +334,7 @@ jobs:
)
historical_checker_snapshot=6001cf41e0a8364f25543e7955ceaf64d50129b4
historical_applicability_snapshot=94efeeeb1811f5515558ab2d79014a5e4c3a570a
historical_root="$RUNNER_TEMP/wcag22-feasibility-slice-a-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT"
historical_root="$RUNNER_TEMP/wcag22-feasibility-history-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT"
git worktree add --detach "$historical_root" "$historical_checker_snapshot"
cleanup_history() {
git worktree remove --force "$historical_root"
Expand All @@ -356,12 +358,42 @@ jobs:
--self-test
)
cleanup_history

v2_artifact="crates/labcolors-core/contracts/wcag22-feasibility-benchmark-v2.json"
v2_snapshot=4afe61b124b05e13b999f83a9de580ef43405080
v2_protocol=(
--admit-revision 965eb42642beb1c072a74886be1d016027afeae5
--admit-rustc-release 1.96.0
--admit-target-triple aarch64-apple-darwin
--admit-target-arch aarch64
--admit-target-os macos
--admit-pointer-width-bits 64
--admit-package-version 0.2.0
--admit-sample-count 5
)
git worktree add --detach "$historical_root" "$v2_snapshot"
(
cd "$historical_root"
python3 scripts/check_wcag22_feasibility_benchmark.py \
"$v2_artifact" "${v2_protocol[@]}" \
--verify-current-subjects \
--artifact-sha256 d8d5c7f3eda834bca9912d835fe3ada13d9dcd5a11cb47a131736716b0b51202 \
--self-test
python3 scripts/check_wcag22_feasibility_applicability.py \
"$v2_artifact" \
--artifact-sha256 d8d5c7f3eda834bca9912d835fe3ada13d9dcd5a11cb47a131736716b0b51202 \
--self-test
)
cleanup_history
trap - EXIT

current_artifact="crates/labcolors-core/contracts/wcag22-feasibility-benchmark-v2.json"
current_artifact="crates/labcolors-core/contracts/wcag22-feasibility-benchmark-v3.json"
current_protocol=(
--admit-revision 965eb42642beb1c072a74886be1d016027afeae5
--admit-rustc-release 1.96.0
--admit-cargo-release 1.96.0
--admit-rustc-binary-sha256 c5922366bfe3d6d028a65d626f4e629b3adad066995cf0b60c8a4b617bba5ffe
--admit-cargo-binary-sha256 fec239e6b74df873f54ef52912bfcfcc8d8414bc14a7ae1e0be80460bae72841
--admit-benchmark-binary-sha256 6ac07bad81a204ee8fcee8f94a3c445f881d1ca10edaf4cc4a86a5db0b232e3a
--admit-target-triple aarch64-apple-darwin
--admit-target-arch aarch64
--admit-target-os macos
Expand All @@ -371,12 +403,7 @@ jobs:
)
python3 scripts/check_wcag22_feasibility_benchmark.py \
"$current_artifact" "${current_protocol[@]}" \
--verify-current-subjects \
--artifact-sha256 d8d5c7f3eda834bca9912d835fe3ada13d9dcd5a11cb47a131736716b0b51202 \
--self-test
python3 scripts/check_wcag22_feasibility_applicability.py \
"$current_artifact" \
--artifact-sha256 d8d5c7f3eda834bca9912d835fe3ada13d9dcd5a11cb47a131736716b0b51202 \
--artifact-sha256 46ec939523a9aff4f253c4c74e997dfd95812a694b2507fae885ff60244ade3a \
--self-test

audit:
Expand Down Expand Up @@ -483,25 +510,25 @@ jobs:
node-version: ${{ env.NODE_TOOLCHAIN }}
cache: npm
cache-dependency-path: packages/colors/package-lock.json
- name: "verify committed #296-A canonical whole-call WASM boundary evidence"
- name: "verify committed #296-B canonical whole-call WASM boundary evidence"
# The admitted JSON binds exact deterministic bytes/shapes and the
# reviewed Uint8Array package root to this built Linux x64 WASM. Fresh
# latency/maxRSS/pages remain observations only.
working-directory: packages/colors
run: >-
node bench/wcag22-feasibility-boundary.bench.mjs
--verify
- name: independently fingerprint the exact #296-A WASM
- name: independently fingerprint the exact #296-B WASM
run: |
bytes="$(wc -c < packages/colors/pkg/labcolors_bg.wasm | tr -d '[:space:]')"
sha256="$(sha256sum packages/colors/pkg/labcolors_bg.wasm | cut -d ' ' -f1)"
echo "canonical candidate raw=${bytes}B sha256=${sha256}"
- name: "upload exact #296-A verified whole-call evidence"
- name: "upload exact #296-B verified whole-call evidence"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: wcag22-feasibility-wasm-boundary-${{ github.sha }}-attempt-${{ github.run_attempt }}
path: |
packages/colors/bench/wcag22-feasibility-wasm-boundary-v1.json
packages/colors/bench/wcag22-feasibility-wasm-boundary-v2.json
packages/colors/pkg/labcolors_bg.wasm
if-no-files-found: error
retention-days: 30
Expand Down
29 changes: 24 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ Migration-note: [exact alpha / typed Glow](docs/migrations/exact-alpha-glow.md),
финальный sRGB8», канонизирует точные UTF-8-байты ID и использует тот же
exhaustive kernel. Возможность включена в default Core, но не проецируется в
Protocol/WASM/FFI/npm/Swift.
- Только полный `Feasible`-терминал минтит sealed capability выбора. Клиент
передаёт непрозрачный ID политики и порядок кандидатов; Core полностью
проверяет декларацию, выбирает первый feasible ID и повторно проверяет его
строку тем же exact evaluator без heap-allocation после создания source/policy.
- Conformance pack 5.0.0 добавляет ровно одно семейство
`wcag22-feasibility.json`: exact 7/2/0/92/59, mixed/all NotApplicable,
typed conflict/resource failures и opaque-ID law. Шесть прежних family
Expand Down Expand Up @@ -75,11 +79,26 @@ Migration-note: [exact alpha / typed Glow](docs/migrations/exact-alpha-glow.md),
`evidence/wcag22-srgb8-q55-proof-v1.json` не меняются: это отдельные version
domains, а доказанная математика и finite artifact прежние.
- WASM size history стала append-only: immutable V1 сохраняет допуск #284
(`454385 B`), V2 — transport #295 (`521240 B` / `d37841…9ca0`), а V3 —
Core-срез #296-A (`521231 B` / `779379…e029`). Каждый допуск имеет нулевой
headroom и точную ссылку на неизменяемый V1 build recipe; V1/V2 не переписаны.
Canonical whole-call artifact фиксирует 10 крайних форм × 5 свежих процессов;
latency, process maxRSS и WASM pages остаются наблюдениями, не SLO.
(`454385 B`), V2 — transport #295 (`521240 B` / `d37841…9ca0`), V3 —
Core-срез #296-A (`521231 B` / `779379…e029`), а текущий V4 — #296-B
(`520920 B` / `c179f4…f94ed`). Каждый допуск имеет нулевой headroom и точную
ссылку на неизменяемый V1 build recipe; V1/V2/V3 не переписаны. Whole-call V2
сохраняет детерминированную request/outcome-проекцию 10 крайних форм × 5
свежих процессов из V1 и привязан к текущему native admission; latency,
process maxRSS и WASM pages остаются наблюдениями, не SLO.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
- Native feasibility admission также append-only относительно принятого
`main`: V1/V2 проверяются в исторических snapshots, а текущий V3 связывает
artifact SHA
`46ec939523a9aff4f253c4c74e997dfd95812a694b2507fae885ff60244ade3a`
с одним точным dependency cone. Source-bound recorder проверяет Git objects,
SHA-256 verifier/subject-файлов и точный `Cargo.lock` до сборки и после
запуска; fresh target, пустая Cargo-config hierarchy и закрытая среда
исключают ambient profile/flags/wrappers. Receipt фиксирует Rust/Cargo 1.96.0,
SHA-256 обоих toolchain executables и реально запущенного benchmark binary,
явный feature set и explicit-empty compiler overrides; 71 негативная мутация
проверяет fail-closed границы.
Сырые наблюдения сохранены без timing threshold, а промежуточные draft-
артефакты не становятся публичной историей.
- Conformance pack 4.0.0 добавил `wcag22.json`; pack 5.0.0 добавляет только
versioned complete-feasibility transport family, поэтому `packDigest`
закономерно изменён. `manifest.numericalCapabilities` зеркалит single public
Expand Down
8 changes: 8 additions & 0 deletions crates/labcolors-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,11 @@ required-features = ["wcag22-feasibility"]
[[test]]
name = "wcag22_explicit_feasibility"
required-features = ["wcag22-explicit-feasibility"]

[[test]]
name = "wcag22_explicit_selection"
required-features = ["wcag22-explicit-feasibility"]

[[test]]
name = "wcag22_explicit_selection_alloc"
required-features = ["wcag22-explicit-feasibility"]
33 changes: 32 additions & 1 deletion crates/labcolors-core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ Core-only API и не попадает в транспортный артефа
их повторы и сам выводит мощность, digest, матрицу и partition. Разные ID с
одинаковыми физическими байтами остаются разными кандидатами. Ни один из входов
не выводит размер текста, компонентную семантику, применимость или предпочтение
из ID; выбор среди допустимых кандидатов в этот контракт не входит.
из ID. Feasibility сам ничего не ранжирует; явный клиентский порядок применяется
только отдельным запечатанным selection-шагом после полного доказательства.

Для `C` кандидатов и `E` канонических применимых рёбер выполняется ровно
`W=C×E` атомарных проверок. При `E>0` единственный упакованный буфер имеет
Expand Down Expand Up @@ -124,6 +125,9 @@ use labcolors_core::{
OccurrenceId, RelationId, RelationV1, ResourceProfileIdV1,
explicit::{
CandidateId, CandidateV1, DomainRequestV1, RequestV1, evaluate,
selection::{
FirstFeasibleInDeclaredOrderV1, PolicyId, SelectionOutcomeV1, select,
},
},
},
};
Expand All @@ -145,11 +149,38 @@ let result = evaluate(RequestV1::try_new(
)?)?;

assert_eq!(result.evaluated().map(|value| value.candidates().len()), Some(2));
let source = result
.selection_source()
.expect("this fixture has at least one feasible candidate");
let policy = FirstFeasibleInDeclaredOrderV1::try_new(
PolicyId::try_new("article/foreground-order")?,
vec![
CandidateId::try_new("brand/paper")?,
CandidateId::try_new("brand/ink")?,
],
)?;
let outcome = select(source, policy)?;
let selected = match &outcome {
SelectionOutcomeV1::Selected { selected, .. } => {
selected.candidate().candidate_id().as_str()
}
SelectionOutcomeV1::NoSelection { .. } => panic!("fixture must select"),
};
assert_eq!(selected, "brand/ink");
# Ok(())
# }
# fn main() {}
```

`selection_source()` возвращает `Some` только для `Feasible`: `Infeasible` и
`NotEvaluated` не могут начать выбор. Политика перечисляет допустимое подмножество
ID в точном клиентском порядке. Core сначала проверяет весь список, затем берёт
первый уже доказанный feasible-ID и повторно проверяет его ровно по всем `E`
каноническим применимым рёбрам тем же вычислителем WCAG. Валидный список без
feasible-ID возвращает исчерпывающий `NoSelection`; неизвестный/повторный ID и
расхождение финальной проверки являются разными типизированными отказами, без
fallback.

В примере `Sc143TextDefault` означает явно объявленный клиентом критерий
SC 1.4.3 для обычного текста с отношением 4.5:1; Core не угадывает его по ID или
типографике. `0x75` и `0x76` — вычисленные граничные результаты именно для двух
Expand Down
Loading
Loading