Skip to main content

Development

Consumers build native packaged Rust sources. Node and the frozen TypeScript checkout are development-only contract/oracle inputs. Follow AGENTS.md, PHASES.md and the accepted design.

All 448 methods and 3,820 exported capabilities of the frozen TypeScript 0.34.0 baseline are implemented with explicit native adaptations. The phase records bind each accepted Claude Code review to its exact source and passing checks. Implementation, executed contracts, live acceptance and release publication retain separate evidence.

Prerequisites​

Use Python 3.12+ (CI pins 3.14.7 in .python-version), Git, rustup and a native C/C++ toolchain. The default reqwest/rustls transport uses non-FIPS AWS-LC native code with generated bindings; the selected configuration does not require CMake, Go or bindgen. Windows native runners need MSVC tools. See DEPENDENCIES.md.

Install exact compilers without changing the machine's default:

rustup toolchain install 1.89.0 --profile minimal --component rustfmt,clippy --no-self-update
rustup toolchain install 1.99.0 --profile minimal --component rustfmt,clippy --no-self-update

Rust 1.89 is the workspace minimum, including minimal builds. Patched optional tokio-websockets 0.13.3 declares that minimum; ICU/time retain their 1.88 minimum. Earlier accepted Rust 1.88.0/1.99.0 reports remain historical evidence of their original source/dependencies. Current reports select toolchains explicitly.

Native checks and features​

python3 scripts/check-rust.py --toolchain 1.89.0 --feature-set minimal
python3 scripts/check-rust.py --toolchain 1.89.0 --feature-set default
python3 scripts/check-rust.py --toolchain 1.89.0 --feature-set all
python3 scripts/check-rust.py --toolchain 1.99.0 --feature-set minimal
python3 scripts/check-rust.py --toolchain 1.99.0 --feature-set default
python3 scripts/check-rust.py --toolchain 1.99.0 --feature-set all

The checker verifies formatting, all-target builds, strict Clippy, tests/doctests and rustdoc with warnings denied. Cargo uses the committed lockfile and actual compiler host. Reports preserve commands, output, compiler/host, hashes and outcomes; source changes during a run invalidate its evidence. Synthetic tests have PANW_, AIRS_ and SCM_ environment values removed. Live execution is a separately selected workflow.

Cargo build output is ignored at every workspace depth. The standalone export consumer uses the root target directory when CARGO_TARGET_DIR is absent or empty, and preserves a nonempty caller choice. Keep generated build output in ignored directories so it cannot change source fingerprints or consume the bounded private-material inventory. See the retained diagnosis in CI.md.

Defaults are scan and reqwest-transport. Named product features are management, dlp, iam, model-security, red-team, gateway and agentguard; models selects shared contracts. Management includes canonical DLP and Gateway includes canonical IAM. Minimal builds retain data/validation/auth/configuration primitives and require an injected transport for requests.

realtime adds a caller WebSocket connector and includes Gateway. ws-transport adds the optional native direct TCP/TLS adapter, currently 64-bit only. It does not inherit HTTP proxy/root configuration. Proxies or other stacks use a custom connector; explicit native PEM/TLS options configure trust. Optional tracing emits fixed metadata fields without a subscriber or worker. See Realtime and Observability.

The matrix also checks each isolated feature, json-unification and gateway-json-unification (serde_json/arbitrary_precision), tracing combinations default-tracing, realtime-tracing, ws-tracing, and the exact native-probes and probe-base combinations. These checker names are defined in scripts/check-rust.py; they are feature sets, not additional Cargo features. Preserve actual phase reports for each executed combination.

Public Rustdoc coverage boundary​

Current required item documentation covers all public items in the handwritten scanner entry module (Region, SyncScanOptions, Scanner and their members), plus the primary constructor of each product facade: ManagementClient, DlpClient, IamScopesClient, ModelSecurityClient, RedTeamClient, AIGatewayClient, RuntimeClient, AccessPoliciesClient and AgentGuardClient. Each product constructor has a short compiled no_run example with its Cargo feature, credential plane and endpoint requirements explained. Examples accept caller-configured clients and use async functions polled by the application; documentation checks perform no service requests or credential lookups. Adding a product entry point requires the same item documentation and compiled example during review.

scanner.rs enables a scoped warn(missing_docs) lint; the normal warnings-denied checks enforce that complete module boundary. The other facade constructor examples are required by code review and compiled doctests.

Workspace-wide missing_docs warnings are deliberately disabled. The generated schema/model namespaces contain thousands of mechanical fields, builders, variants and aliases whose wire contracts come from the frozen schema graph; blanket warnings would require repetitive generated prose without documenting handwritten behavior. Their schema identifiers, validation APIs and model guide provide the contract reference. Generator changes must retain that provenance and the existing structural/round-trip checks.

The entry-point requirement is the present Rustdoc coverage boundary, not a claim that every resource method has individual item documentation. Product guides and the operation ledger cover those resources. As handwritten methods are added or changed, document behavior that affects the caller's decisions: authentication, plane selection, validation, pagination completeness, deadlines/cancellation, replay and uncertain remote outcomes. Review those descriptions against the corresponding independent contract tests.

Rustdoc warnings (including broken links) remain errors in the checker. Doctests compile only the entry points enabled by their enclosing product feature; the default/minimal/all matrix checks the boundary without enabling product features inside examples. To run focused documentation checks directly:

cargo +1.99.0 test --locked --no-default-features --doc
cargo +1.99.0 test --locked --doc
cargo +1.99.0 test --locked --all-features --doc
RUSTDOCFLAGS="-D warnings" cargo +1.99.0 doc --locked --all-features --no-deps

To isolate caches without changing global Cargo configuration:

CARGO_TARGET_DIR=.local/target-msrv python3 scripts/check-rust.py --toolchain 1.89.0 --feature-set all

Frozen contracts and native probes​

The baseline is TypeScript 0.34.0 commit 4a80dbdb3dc14365e1c25d838ac0bd139485d48c. Use the repository-root contract/oracle tooling pins in .node-version and tools/package-lock.json; do not regenerate from uncommitted changes in another checkout.

python3 tools/bootstrap_reference.py
python3 tools/verify-contracts.py --baseline .local/typescript --self-test
.local/typescript/node_modules/.bin/tsx tools/extract-contracts.mts --check
.local/typescript/node_modules/.bin/tsx tools/extract-operations.mts --check
python3 tools/generate_validation.py --check
python3 tools/generate_models.py --check
python3 tools/native_operations.py --check --require-through-phase 8
python3 tools/native_exports.py --check
python3 tools/generate_constants.py --check
python3 tools/verify_native_fixtures.py
.local/typescript/node_modules/.bin/tsx tools/schema-oracle.mts --check
python3 tools/generate_models.py --verify-fixtures
python3 scripts/check-native-exports.py --toolchain 1.89.0
python3 scripts/check-native-exports.py --toolchain 1.99.0

Extractors verify source/compiler provenance before evaluation. The independent oracle executes frozen Zod with network/credential access removed. Rust tests compare request normalization, response evolution and typed round trips; non-JSON boundaries have concrete native adapters. The source-bound operation matrix and export ledger reject missing adapters, unrelated probes and denominator drift. The independent Cargo consumer proves public reachability; behavior and live service acceptance have their own tests.

The official Gateway specification stays excluded from redistribution/generation while its license status is unresolved. Frozen permitted source, hashes, licenses, fixture pointers and deliberate corrections remain in the provenance manifest.

Dependency, package and platform qualification​

python3 scripts/check-dependencies.py --output .local/checks/dependencies.json
python3 scripts/check-cross.py --output .local/checks/cross.json
python3 scripts/check-package.py --toolchain 1.89.0 --output .local/checks/package-1.89.0.json
python3 scripts/check-package.py --toolchain 1.99.0 --output .local/checks/package-1.99.0.json

The dependency checker requires cargo-audit 0.22.2 and cargo-deny 0.20.2, fetches fresh authoritative RustSec HEAD, and enforces complete resolved license/source/checksum policy. Install the exact tools on PATH or use its --tools-dir option. DEPENDENCIES.md describes report scope.

Package checks validate the actual archive and execute minimal/all-feature units, examples/doctests and the external public consumer against its extracted source. The repository's integration corpus remains separate. PACKAGING.md records actual contents and archive proof; RELEASE.md explains the still-pending clean-commit check after final source commit. An allow-dirty smoke check does not close that release obligation.

Platform Support distinguishes Linux x86_64 musl native execution from GNU, ARM Linux, Apple and Windows compile-only checks with caller transports. Cross checks exclude reqwest/native WS/TLS/cryptography and do not run a target binary. Other runtime targets, Wasm and 32-bit native adapters remain unqualified.

Continuous integration​

The configured Forgejo workflow now selects Rust 1.89.0/1.99.0, default/minimal/all and the complete isolated/combination matrix. It configures pinned development tooling, source/oracle checks, dependency policy, compile-only targets and archive/consumer verification. The first reported remote run failed during setup because rustup was absent. Current execution evidence is recorded in phase status; configuration alone is not CI evidence.

Checkout/setup actions are pinned to exact commits and do not retain checkout credentials. No service credentials, registry tokens, publication step or mirror configuration is installed. Every job uses the pinned dtolnay/rust-toolchain action to bootstrap rustup when absent, expose Cargo on subsequent steps' PATH, and install its exact Rust compiler with rustfmt and Clippy. Pinned setup-uv installs uv 0.13.1 with an explicit archive checksum and a fresh owned tool cache. scripts/uv-integrity.cjs selects the host/libc pins from scripts/uv-checksums.json; scripts/bootstrap-python.sh hashes the exact installed executable before invoking it, then installs the portable interpreter selected by .python-version into job-local directories and exports its executables through the runner PATH file. It requires no preinstalled Python or Ubuntu-specific interpreter distribution. Updating uv requires reviewed archive and executable digests for every configured host. Every job uses setup-node to select the pinned development version before the integrity helper. The runner must provide Git, Node 20 for JavaScript actions, Bash, HTTPS/curl support, and a C/C++ compiler. Rust and Python need not be preinstalled. uv is also installed explicitly. The Rust CI action sets the runner's default compiler; project scripts select explicit versions and preserve the developer's default. Additional native platform jobs require registered runner labels and explicit dispatch. Their declarations are not runtime qualification. Local native and cross reports remain independently retained.

Phase acceptance and live evidence​

Use the active phase and current maintainer rubric in Implementation phases. Run python3 tools/check_phase.py --phase N with that phase number and request a fresh actual Claude Code review. Each of implementation, code quality, supportability, architecture and delivery is scored out of 10: every category must reach 8, chunks require 42/50 (aim for 45), and phases require 46/50. At most five attempts are allowed; the documented fifth-attempt exception requires a total strictly above 40, every category still at least 8, and every blocking finding resolved. Preserve every attempt and its limitations. CI can rerun checks with --verification-only without advancing status or requesting review. Source fingerprints and exact reports bind accepted phases.

Ordinary checks do not contact service APIs. Live qualification selects external registration and expected scope explicitly, bounds operations/cost, and records cleanup/recovery. Follow Live Qualification and the current receipt pointer. Service availability, permissions and unverified methods remain separate from implemented parity. Registry publication, a clean final commit/artifact and retained remote CI execution require their own actual proof.

The documentation build uses its own Node pin, docs-site/.node-version, independently of the repository-root contract/oracle tooling pin.