diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3a3b7f2..4714ad5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,34 +1,4 @@ # SPDX-License-Identifier: MPL-2.0 -# CODEOWNERS - Define code review assignments for GitHub -# See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners - -# Default: sole maintainer for all files -* @hyperpolymath - -# Security-sensitive files require explicit ownership -SECURITY.md @hyperpolymath -.github/workflows/ @hyperpolymath -.machine_readable/ @hyperpolymath -contractiles/ @hyperpolymath - -# License files -LICENSE @hyperpolymath -LICENSES/ @hyperpolymath - -# Configuration -.gitignore @hyperpolymath -.github/ @hyperpolymath - -# Documentation -README* @hyperpolymath -CONTRIBUTING* @hyperpolymath -CODE_OF_CONDUCT* @hyperpolymath -GOVERNANCE* @hyperpolymath -MAINTAINERS* @hyperpolymath -CHANGELOG* @hyperpolymath -ROADMAP* @hyperpolymath - -# Build and CI -Justfile @hyperpolymath -Makefile @hyperpolymath -*.sh @hyperpolymath +# Solo-maintained hyperpolymath repo: no owner lines by policy. +# See hyperpolymath/standards CODEOWNERS-POLICY.adoc (Rule 1). +# Sole-maintainer review is moot; SPDX headers carry attribution. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fd857bb..de0390a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,6 +8,7 @@ updates: ignore: - dependency-name: "*" update-types: ["version-update:semver-patch"] + open-pull-requests-limit: 0 - package-ecosystem: "github-actions" directory: "/" schedule: @@ -16,6 +17,7 @@ updates: actions: patterns: - "*" + open-pull-requests-limit: 2 - package-ecosystem: "nix" directory: "/" schedule: diff --git a/.github/workflows/rsr-antipattern.yml b/.github/workflows/rsr-antipattern.yml index 51508be..9954d02 100644 --- a/.github/workflows/rsr-antipattern.yml +++ b/.github/workflows/rsr-antipattern.yml @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MPL-2.0 # RSR Anti-Pattern CI Check # Enforces: No TypeScript, No Go, No Python (except SaltStack), No npm -# Allows: ReScript, Deno, WASM, Rust, OCaml, Haskell, Guile/Scheme +# Allows: AffineScript, Deno, WASM, Rust, OCaml, Haskell, Guile/Scheme name: RSR Anti-Pattern Check @@ -80,7 +80,7 @@ jobs: echo "╔════════════════════════════════════════════════════════════╗" echo "║ RSR Anti-Pattern Check Passed ✅ ║" echo "║ ║" - echo "║ Allowed: ReScript, Deno, WASM, Rust, OCaml, Haskell, ║" + echo "║ Allowed: AffineScript, Deno, WASM, Rust, OCaml, Haskell, ║" echo "║ Guile/Scheme, SaltStack (Python) ║" echo "║ ║" echo "║ Blocked: TypeScript, Go, npm, Python (non-Salt) ║" diff --git a/Cargo.lock b/Cargo.lock index 6af736a..8b8a995 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,6 +58,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core", +] + [[package]] name = "clap" version = "4.6.6" @@ -104,15 +115,25 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "getrandom" -version = "0.2.17" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", - "wasi", + "r-efi", + "rand_core", ] [[package]] @@ -194,15 +215,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - [[package]] name = "proc-macro2" version = "1.0.107" @@ -222,34 +234,27 @@ dependencies = [ ] [[package]] -name = "rand" -version = "0.8.8" +name = "r-efi" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "rand" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "ppv-lite86", + "chacha20", + "getrandom", "rand_core", ] [[package]] name = "rand_core" -version = "0.6.4" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "ryu" @@ -360,12 +365,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - [[package]] name = "windows-link" version = "0.2.1" @@ -380,23 +379,3 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] - -[[package]] -name = "zerocopy" -version = "0.8.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] diff --git a/Cargo.toml b/Cargo.toml index 6608e6a..c092f0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ clap = { version = "4", features = ["derive"] } serde = { version = "1", features = ["derive"] } serde_json = "1" thiserror = "2" -rand = "0.8" +rand = "0.10" hex = "0.4" [dependencies] diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..417391d --- /dev/null +++ b/GEMINI.md @@ -0,0 +1,8 @@ +# Pointer + +This repository has no `AGENTS.md` yet. Until it does, the instructions +for every coding agent live in **[CLAUDE.md](./CLAUDE.md)**. Read that +file, and skip anything in it that is specific to Claude Code tooling. +Do not duplicate rules here. + +When `AGENTS.md` lands in this repository, retarget this pointer at it. diff --git a/REQUIRES_INITIALISATION.md b/REQUIRES_INITIALISATION.md new file mode 100644 index 0000000..0fce781 --- /dev/null +++ b/REQUIRES_INITIALISATION.md @@ -0,0 +1,229 @@ + + +# REQUIRES INITIALISATION + +**This repository is not finished being set up.** 25 substitution token(s) across 2 file(s) still have no value. + +## Why this is not already done + +This repo was created from `hyperpolymath/rsr-template-repo`. The mint +(`just repo-init`) fills every token that has a single mechanical answer — +owner, repo, author, dates, licence, branch — and it has done so here. + +The tokens below are the ones it *deliberately cannot* answer. They need a +decision or a fact that exists only in your head: what this project is for, +what command builds it, which port the service listens on, whether a PGP key +is held at all. The template's own token vocabulary says as much — you cannot +sensibly answer "required invariants" in a thirty-second bootstrap. + +They were left **visibly unfilled on purpose**. The alternatives were both +worse: inventing plausible values would put confident falsehoods into a +security policy and an architecture document, and silently deleting the +sections would hide the fact that a decision is owed. A visible gap is +honest; a fabricated answer is not. + +## Do not delete this file until every item below is resolved + +This file is the only marker that the work is outstanding. Deleting it early +does not finish the setup, it just conceals it — and the next person or agent +to arrive will reasonably assume the repo is complete. + +- **If you are a person:** delete this file yourself once the last item is done. +- **If you are an agent:** resolve what you legitimately can, leave the rest, + and delete this file only when no token below remains anywhere in the tree. + Do not delete it to make a gate go green. + +Re-running the estate top-up tool will remove this file automatically once +nothing is outstanding, so the safest way to finish is to fix the tokens and +let the check confirm it. + +## What is needed, and where it goes + +### `{{ADDR}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{ADDRS}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{ARGS}}` + +Arguments for the justfile recipe this appears in. + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{CMD}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{COUNT}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{FIELD}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{FILE}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{FLAGS}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{HOSTNAME}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{HOSTS}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{IFACE}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{ITERATIONS}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{NETWORK}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{PASS}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{PORT}}` + +Port the container service listens on. + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{PREFIX}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{REGISTRY}}` + +Container registry to publish to. + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{SCRIPT}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{SITE}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{TAG}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{TARGET}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{TUNNEL_ID}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{TYPE}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{USER}}` + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +### `{{VERSION}}` + +Version/tag for the container image. + +Appears in: + +- `.machine_readable/contractiles/Justfile` +- `Justfile` + +--- + +Generated by the estate top-up pass. Rationale and the governing rulings are +in `hyperpolymath/standards`; the token vocabulary is +`.machine_readable/ai/PLACEHOLDERS.adoc` in `rsr-template-repo`. diff --git a/crates/utils/src/lib.rs b/crates/utils/src/lib.rs index a1854ca..c3f0d49 100644 --- a/crates/utils/src/lib.rs +++ b/crates/utils/src/lib.rs @@ -3,7 +3,7 @@ //! IPv6 utility functions for address manipulation and generation. use ipv6_only_core::{IPv6Address, IPv6Network, Ipv6Error, Result}; -use rand::Rng; +use rand::RngExt; use std::net::Ipv6Addr; /// Compress an IPv6 address to its shortest form. @@ -33,7 +33,7 @@ pub fn generate_link_local(interface_id: Option<&str>) -> Result { })? } None => { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut bytes = [0u8; 8]; rng.fill(&mut bytes); bytes.to_vec() @@ -68,7 +68,7 @@ pub fn generate_unique_local( .map_err(|_| Ipv6Error::InvalidAddress("Invalid hex in global ID".to_string()))? } None => { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut bytes = [0u8; 5]; rng.fill(&mut bytes); bytes.to_vec() @@ -87,7 +87,7 @@ pub fn generate_unique_local( .map_err(|_| Ipv6Error::InvalidAddress("Invalid hex in subnet ID".to_string()))? } None => { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut bytes = [0u8; 2]; rng.fill(&mut bytes); bytes.to_vec() @@ -107,7 +107,7 @@ pub fn generate_unique_local( })? } None => { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut bytes = [0u8; 8]; rng.fill(&mut bytes); bytes.to_vec() @@ -137,15 +137,15 @@ pub fn generate_random_ipv6(prefix: &str) -> Result { let prefix_len = network.prefix_len(); let host_bits = 128 - prefix_len; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); // Generate random host part let random_host: u128 = if host_bits >= 64 { - let high: u64 = rng.gen(); - let low: u64 = rng.gen(); + let high: u64 = rng.random(); + let low: u64 = rng.random(); ((high as u128) << 64) | (low as u128) } else { - rng.gen::() + rng.random::() }; let host_mask = if host_bits == 128 { u128::MAX diff --git a/guix.scm b/guix.scm deleted file mode 100644 index e09785f..0000000 --- a/guix.scm +++ /dev/null @@ -1,28 +0,0 @@ -;; SPDX-License-Identifier: MPL-2.0 -;; Guix development environment. -;; Usage: guix shell -D -f guix.scm - -(use-modules (guix packages) - (guix build-system gnu) - (guix licenses) - (gnu packages base) - (gnu packages bash) - (gnu packages base) - (gnu packages java) - (gnu packages rust) - (gnu packages cmake) - (gnu packages zig) - (gnu packages golang) - (gnu packages node) - (gnu packages python)) - -(package - (name "ipv6-only") - (version "0.1.0") - (source #f) - (build-system gnu-build-system) - (inputs (list coreutils bash make openjdk rust cmake zig go node python)) - (synopsis "ipv6-only") - (description "ipv6-only — part of the hyperpolymath ecosystem.") - (home-page "https://github.com/hyperpolymath/ipv6-only") - (license ((@@ (guix licenses) license) "MPL-2.0" "https://github.com/hyperpolymath/palimpsest-license")))