`cargo test --workspace` could not run at all: dependency resolution failed with "aws-types@1.3.16 requires rustc 1.91.1" on the 1.91.0 default toolchain, so the gate the project documents was dead. Making it run exposed a compile break and two wrong tests that had been invisible for months. Now green end to end: 143 suites, 3155 tests, exit 0. Toolchain - rust-toolchain.toml pins the DEV toolchain to 1.91.1. The published MSRV stays `rust-version = "1.91"` (the engine builds on 1.91.0); only tidalctl's AWS SDK chain needs the patch release, and it now declares that itself. Consumer crates migrated to the current engine API (clean cutover) - iknowyou-engine: `AgentPolicy` gained five m10 read/profile-override fields; the literal now spreads `..AgentPolicy::default()` as the engine's own doc example does, so future fields do not break it again. - forage-engine: `RetrieveResult` gained p1 `reasons`. The app builds its own candidate pool, so it now tags what it knows: PreferenceMatch for the preference-vector blend, SemanticMatch (with the seed item) for similar-to-saved, ExplorationBudget for pinned discoveries. - forage-engine: `url_to_item_id` folded into the u32 item universe. The engine narrows item IDs to a u32 slot in durable per-user state and rejects anything above u32::MAX rather than alias two items forever, so every add_item with a 64-bit FNV hash failed. 9 of 28 smoke tests were failing on this alone. - forage-engine: bridge items read the top-2 preference CLUSTERS via `query_vectors`, not the single centroid from `preference_vectors().get()`. Since m12 that accessor returns only the strongest cluster, so a tech+jazz user whose interests split into two clusters looked single-interest and never bridged. Falls back to top-2 dimensions when a user has one cluster. Reconcile tests corrected to the shipped contract - tidal/tests/m8p3_reconcile_production.rs asserted `3 + 5 == 8` for a windowed count after heal. `take_crdt_snapshot` deliberately keys signal contributions to ONE canonical contributor (ShardId::SINGLE) because signals are relayed from a single writer, so per-node attribution double-counted every replicated event on every reconcile. Merge is therefore LWW on (last_update_ns, score) plus PN-counter per-node max: nodes converge on the more complete accumulator. The old expectation was asserting the bug that fix removed. - Rewrote to assert convergence, count survival (not 0), and no inflation, and added `repeated_reconcile_of_converged_nodes_does_not_creep` - the regression guard for the creep itself, which nothing covered. Pre-commit hook unified - hooks/pre-commit dropped `-D warnings`: each crate's `[lints]` table is the source of truth (`clippy::all`/`unwrap_used` deny, `pedantic` warn), and the flag promoted ~58 deliberate pedantic warnings in integration tests to errors, making every Rust commit impossible. - It now lints all five tidal crates instead of path-matching `tidal/`, which silently skipped tidal-server, tidal-net, tidal-stress, tidalctl and applications/ - the rot above lived in exactly those crates. Ported the CODING_GUIDELINES file-length, println, and unsafe-SAFETY checks from the divergent untracked copy that this replaces. - CONTRIBUTING.md now documents the real commands and the toolchain/MSRV split. Fleet recovery and soak - scripts/restore-fleet.sh: the fail-closed selective restore, promoted out of an ignored tmp/ directory into the repository. Preflights retained storage, digest-pinned images, parked state, and aggregate plus per-PV-node scheduler headroom before the first scale; writes a durable transcript under tmp/restore-logs/ with structured start/error/rollback/complete events. - k8s manifests park the standalone store, the RF3 cluster, and the soak monitor at zero replicas with restore-fleet.sh as the only supported scale-up path. - soak-eval/soak-watch and the nightly CronJob fail closed on stale or missing restart evidence instead of silently skipping the restart-aware half of the gate. - docs/ops/capacity-planning.md corrects the RAM envelope to the real hot-tier formula and separates analytic totals from the measured process envelope.
102 lines
3.9 KiB
Bash
Executable File
102 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# tidalDB pre-commit hook (tracked). Activate per-clone with:
|
|
# git config core.hooksPath hooks
|
|
# or run scripts/install-hooks.sh once.
|
|
#
|
|
# Gates: Rust fmt/clippy/test (only when Rust is staged), the CODING_GUIDELINES
|
|
# source checks, the documentation consolidation guard (always), and site eslint
|
|
# (when node_modules exist).
|
|
#
|
|
# Two rules this file learned the hard way, 2026-08-16:
|
|
#
|
|
# * Clippy runs WITHOUT `-D warnings`. Every tidal crate declares its own
|
|
# posture in `[lints]` (`clippy::all = deny`, `unwrap_used = deny`,
|
|
# `pedantic = warn`), and that table is the single source of truth. Adding
|
|
# `-D warnings` here promoted ~58 deliberate pedantic warnings in the
|
|
# integration tests to errors and made every Rust commit impossible.
|
|
# * The Rust gates key off ALL crates, not a `tidal/` path match. An earlier
|
|
# untracked copy of this hook tested `grep -q 'tidal/'`, which silently
|
|
# skipped `tidal-server/`, `tidal-net/`, `tidal-stress/`, `tidalctl/`, and
|
|
# `applications/` - the workspace was left to rot until a workspace-wide
|
|
# `cargo test` was attempted months later.
|
|
|
|
set -uo pipefail
|
|
ROOT="$(git rev-parse --show-toplevel)"
|
|
cd "$ROOT" || exit 2
|
|
|
|
staged() { git diff --cached --name-only --diff-filter=ACM; }
|
|
rust_staged=$(staged | grep -E '\.rs$' || true)
|
|
site_staged=$(staged | grep -E '^site/.*\.(ts|tsx|js|jsx|mjs)$' || true)
|
|
|
|
# --- Rust -------------------------------------------------------------------
|
|
if [ -n "$rust_staged" ]; then
|
|
echo "pre-commit: cargo fmt"
|
|
cargo fmt || { echo "cargo fmt failed" >&2; exit 1; }
|
|
# re-stage any files fmt rewrote
|
|
echo "$rust_staged" | while IFS= read -r f; do [ -f "$f" ] && git add "$f"; done
|
|
|
|
echo "pre-commit: cargo clippy -p tidaldb -p tidal-net -p tidal-server -p tidal-stress -p tidalctl"
|
|
cargo clippy -p tidaldb -p tidal-net -p tidal-server -p tidal-stress -p tidalctl \
|
|
--all-targets || exit 1
|
|
|
|
echo "pre-commit: cargo test -p tidaldb --lib"
|
|
cargo test -p tidaldb --lib || exit 1
|
|
|
|
# ── CODING_GUIDELINES source checks (engine sources only) ─────────────────
|
|
engine_src=$(echo "$rust_staged" | grep -E '^tidal/src/' || true)
|
|
if [ -n "$engine_src" ]; then
|
|
fail=0
|
|
|
|
# §9 file length: 600 lines max.
|
|
while IFS= read -r f; do
|
|
[ -z "$f" ] && continue
|
|
lines=$(wc -l < "$f" 2>/dev/null || echo 0)
|
|
if [ "$lines" -gt 600 ]; then
|
|
echo " FAIL: $f is $lines lines (max 600) - split it (CODING_GUIDELINES §9)" >&2
|
|
fail=1
|
|
fi
|
|
done <<< "$engine_src"
|
|
|
|
# §11 no println!/eprintln! in engine sources - use tracing::.
|
|
while IFS= read -r f; do
|
|
[ -z "$f" ] && continue
|
|
case "$f" in */benches/*) continue ;; esac
|
|
hits=$(grep -n 'println!\|eprintln!' "$f" 2>/dev/null | grep -vE '^[0-9]+:[[:space:]]*//' || true)
|
|
if [ -n "$hits" ]; then
|
|
echo " FAIL: println!/eprintln! in $f - use tracing:: (CODING_GUIDELINES §11)" >&2
|
|
awk '{print " " $0}' <<< "$hits" >&2
|
|
fail=1
|
|
fi
|
|
done <<< "$engine_src"
|
|
|
|
# §10 every unsafe block carries a // SAFETY: comment.
|
|
while IFS= read -r f; do
|
|
[ -z "$f" ] && continue
|
|
hits=$(awk '
|
|
/\/\/ SAFETY:/ { had_safety=1; next }
|
|
/unsafe \{/ { if (!had_safety) print NR": "$0; had_safety=0; next }
|
|
{ had_safety=0 }
|
|
' "$f" 2>/dev/null || true)
|
|
if [ -n "$hits" ]; then
|
|
echo " FAIL: unsafe block without // SAFETY: in $f (CODING_GUIDELINES §10)" >&2
|
|
awk '{print " " $0}' <<< "$hits" >&2
|
|
fail=1
|
|
fi
|
|
done <<< "$engine_src"
|
|
|
|
[ "$fail" -eq 0 ] || exit 1
|
|
fi
|
|
fi
|
|
|
|
# --- Documentation consolidation guard (always) -----------------------------
|
|
bash scripts/check-docs.sh || exit 1
|
|
|
|
# --- Marketing site ---------------------------------------------------------
|
|
if [ -n "$site_staged" ] && [ -d site/node_modules ]; then
|
|
echo "pre-commit: eslint (site)"
|
|
( cd site && npx --no-install eslint . ) || exit 1
|
|
fi
|
|
|
|
exit 0
|