Skip to content

Commit 91d03e7

Browse files
committed
Define 1.2 encode acceleration roadmap
1 parent 3df19ea commit 91d03e7

3 files changed

Lines changed: 83 additions & 60 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858
- Updated the roadmap to record `v1.1.3` and `v1.1.4` checkpoint scope and to
5959
spell out the remaining active encode-dispatch admission work before a
6060
future `1.2.0` family release.
61+
- Expanded the SIMD roadmap so `1.2.0` explicitly means fully working encode
62+
acceleration for the admitted encode scope, with planned `1.1.5` through
63+
`1.1.12` checkpoints leading to that release.
6164

6265
## 1.1.0 - 2026-06-20
6366

docs/PLAN.md

Lines changed: 64 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -638,13 +638,13 @@ Recommended `1.0.x` source-layout sequence:
638638

639639
The recommended post-`1.0` SIMD path is incremental. Minor versions should
640640
mean something visible to users: `1.1.x` is the non-accelerated SIMD encode
641-
evidence series, `1.2.0` is the first release that may activate encode
642-
acceleration if the evidence is complete, `1.2.x` is the non-accelerated SIMD
643-
decode evidence series, and `1.3.0` is the first release that may activate both
644-
encode and decode acceleration if the decode evidence is complete. After each
645-
active-acceleration minor release, pause feature work for a short soak period
646-
so users can report platform-specific regressions before the next acceleration
647-
line begins.
641+
evidence and integration series, `1.2.0` is the release where encode
642+
acceleration must be fully working for the admitted encode scope, `1.2.x` is
643+
the non-accelerated SIMD decode evidence series, and `1.3.0` is the first
644+
release that may activate both encode and decode acceleration if the decode
645+
evidence is complete. After each active-acceleration minor release, pause
646+
feature work for a short soak period so users can report platform-specific
647+
regressions before the next acceleration line begins.
648648

649649
Current `1.1.x` checkpoint state:
650650

@@ -666,47 +666,64 @@ Current `1.1.x` checkpoint state:
666666
before real crates.io publishing, and high-assurance docs now spell out
667667
wrapped in-place retention, strict-error logging, `DecodedBuffer` cloning,
668668
public-length `subtle` comparison, and AArch64/RISC-V deployment posture.
669-
- Next `1.1.x` checkpoints, if needed, should be release-candidate hardening
670-
only: fix real pentest or CI findings, refresh evidence scripts, or improve
671-
documentation. Do not publish additional crates.io versions for this line
672-
unless a user-impacting fix requires it.
673-
674-
Remaining before `1.2.0` active encode dispatch can be considered:
675-
676-
- Decide which encode backend, if any, is admitted first. The conservative
677-
first admission candidate is std-only x86/x86_64 encode dispatch for
678-
Standard and URL-safe alphabets, because runtime CPU feature detection is
679-
available through `std::is_x86_feature_detected!`. NEON, wasm `simd128`,
680-
AVX-512, custom alphabets, and all decode acceleration may remain
681-
real-but-non-dispatchable if their evidence is not complete.
682-
- Wire the admitted backend into the full public encode path:
669+
670+
Planned checkpoints to reach `1.2.0` fully working encode acceleration:
671+
672+
- `1.1.5`: add the public encode-dispatch integration layer while keeping the
673+
selected backend forced to scalar. This checkpoint should route
683674
`Engine::encode_slice`, `encode_slice_clear_tail`, alloc encode helpers, and
684-
in-place encode where applicable. Scalar must remain the reference for tails,
685-
padding, line wrapping, legacy profiles, and custom alphabets unless a
686-
specific accelerated path is separately admitted.
687-
- Add runtime fallback tests proving unsupported CPUs execute scalar code
688-
without illegal instructions and that runtime reports name the active backend
689-
only when an admitted backend is actually selected.
690-
- Keep `active_backend()` returning scalar and keep `ActiveBackend` without
691-
accelerated variants until the admission manifest is updated in the same
692-
commit as the admitted dispatch code.
693-
- Run the complete scalar differential, fuzz, Miri, Kani, dudect-style,
694-
generated assembly, backend evidence, unsafe-boundary, panic-policy,
695-
dependency, package, and release metadata gates on the exact release
696-
candidate.
697-
- Produce per-backend hardware evidence for any backend considered for active
698-
dispatch. A backend may stay real-but-non-dispatchable in `1.2.0` if its
699-
hardware evidence is incomplete.
700-
- Produce benchmark evidence with hardware, OS, Rust version, feature flags,
701-
command, raw output, scalar baseline, and exact admitted backend names.
702-
- Update `docs/SIMD_ADMISSION.md`, runtime report expectations, release notes,
703-
unsafe inventory, benchmark docs, and the release script in the same change
704-
that admits any backend.
705-
- Keep `no_std` acceleration disabled unless a future unsafe caller-contract
706-
API is designed, reviewed, and separately admitted.
707-
- Sync all workspace crate versions and publish the next crates.io family
708-
release as `1.2.0` only after the `1.1.x` checkpoint tags, pentest,
709-
GitHub CI, Kani, and release evidence remain clean.
675+
in-place encode through one audited encode backend boundary, then prove the
676+
boundary is behavior-preserving against scalar for all existing encode
677+
profiles.
678+
- `1.1.6`: admit std-only x86/x86_64 SSSE3/SSE4.1 encode dispatch for Standard
679+
and URL-safe alphabets if scalar parity, fallback, generated assembly,
680+
unsafe inventory, and runtime-report evidence are complete. Unsupported CPUs,
681+
custom alphabets, tails, wrapping, legacy profiles, and `no_std` builds must
682+
remain scalar.
683+
- `1.1.7`: admit std-only x86/x86_64 AVX2 encode dispatch with the same public
684+
API coverage and fallback requirements. Runtime priority must be explicit
685+
and tested, for example AVX2 above SSSE3/SSE4.1 when both are available.
686+
- `1.1.8`: admit AVX-512 VBMI encode dispatch only if hardware evidence,
687+
generated assembly, register cleanup, fallback behavior, and benchmark data
688+
are complete. If AVX-512 evidence is incomplete, keep AVX-512 as a real
689+
non-dispatchable prototype rather than blocking `1.2.0`.
690+
- `1.1.9`: admit AArch64 NEON encode dispatch for Standard and URL-safe
691+
alphabets only if hardware evidence from real AArch64 machines, generated
692+
assembly review, register cleanup review, and platform fallback behavior are
693+
complete. Otherwise keep NEON non-dispatchable and ship `1.2.0` with x86
694+
encode acceleration only.
695+
- `1.1.10`: decide the wasm `simd128` encode posture. Because wasm runtime/JIT
696+
behavior is outside the crate's control, wasm may remain compile-evidence
697+
only unless a specific runtime and deployment profile is admitted. Do not
698+
let wasm block `1.2.0` unless the project explicitly decides that wasm encode
699+
acceleration is part of the `1.2.0` scope.
700+
- `1.1.11`: full encode release-candidate hardening. Run fuzz/dudect/perf,
701+
generated assembly, backend evidence, Miri, Kani, unsafe-boundary,
702+
panic-policy, no-alloc, target-matrix, macOS, and package checks against the
703+
exact candidate. Update benchmarks and release notes with only the backends
704+
actually admitted.
705+
- `1.1.12`: version-sync and publish rehearsal. Set all workspace crates to
706+
`1.2.0`, update `release-crates.toml`, verify signed-tag publish gating,
707+
run `scripts/stable_release_gate.sh release`, run pentest, wait for GitHub
708+
green, then tag the release candidate.
709+
710+
`1.2.0` acceptance criteria:
711+
712+
- Encode acceleration is active for every backend explicitly admitted in
713+
`docs/SIMD_ADMISSION.md`.
714+
- The public encode APIs are fully wired: `encode_slice`,
715+
`encode_slice_clear_tail`, alloc helpers, and applicable in-place encode.
716+
- Scalar fallback remains correct for unsupported CPUs, `no_std`, custom
717+
alphabets unless separately admitted, line wrapping, legacy profiles, tails,
718+
and padding.
719+
- Runtime reports identify active accelerated encode backends only when they
720+
are actually selected; otherwise they report scalar active execution.
721+
- Benchmarks, generated assembly, unsafe inventory, release notes, and
722+
admission manifest name the exact active encode backends. No release note may
723+
imply decode acceleration.
724+
- All workspace crates are version-synced and published as the `1.2.0` family
725+
only after pentest, GitHub CI, Kani, full release gate, and signed-tag checks
726+
pass.
710727

711728
After `1.2.0`:
712729

docs/SIMD.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,22 @@ weakening the scalar trust base.
1717

1818
The SIMD roadmap separates implementation evidence from active acceleration:
1919

20-
- `1.1.x` is the SIMD encode foundation series. It may contain real
21-
fixed-block encode prototypes for SSSE3/SSE4.1, AVX2, AVX-512 VBMI, NEON,
22-
and wasm `simd128`, plus scalar-equivalence tests, generated assembly
23-
evidence, register-cleanup review, fuzz expansion, and admission-tooling
24-
updates. These releases must remain non-dispatchable: `active_backend()`
25-
stays scalar, and release notes must not claim user-visible acceleration.
26-
GitHub checkpoint tags in this line may move evidence forward without a
27-
matching crates.io publish; the next planned crates.io family sync is
28-
`1.2.0`.
29-
- `1.2.0` is the first release that may activate encode acceleration. It may
30-
admit std-only runtime dispatch for the encode backends whose evidence is
31-
complete in that release. Backends without complete evidence remain
32-
candidate-only. The draft package for that decision lives in
20+
- `1.1.x` is the SIMD encode foundation and admission-candidate series. Early
21+
checkpoints contain real fixed-block encode prototypes for SSSE3/SSE4.1,
22+
AVX2, AVX-512 VBMI, NEON, and wasm `simd128`, plus scalar-equivalence tests,
23+
generated assembly evidence, register-cleanup review, fuzz expansion, and
24+
admission-tooling updates. Later checkpoints wire admitted encode backends
25+
into public encode APIs while keeping each checkpoint gated by pentest, CI,
26+
and release evidence. GitHub checkpoint tags in this line may move evidence
27+
forward without a matching crates.io publish; the next planned crates.io
28+
family sync is `1.2.0`.
29+
- `1.2.0` is the release where encode acceleration must be fully working for
30+
the admitted encode scope. Public encode APIs must dispatch to admitted
31+
encode backends when runtime policy and CPU features allow it, and must fall
32+
back to scalar for unsupported CPUs, `no_std`, custom alphabets unless
33+
separately admitted, wrapping, legacy profiles, tails, and padding. Backends
34+
without complete evidence remain real non-dispatchable prototypes. The draft
35+
package for that decision lives in
3336
[SIMD_ENCODE_ADMISSION_DRAFT.md](SIMD_ENCODE_ADMISSION_DRAFT.md).
3437
- After `1.2.0`, pause feature work for a short soak period so users can report
3538
platform-specific encode regressions before decode acceleration work starts.

0 commit comments

Comments
 (0)