mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-11 17:54:03 +01:00
The gate was a presence check -- 'a run_all.sh exists beside this lib' -- which an empty suite that asserts nothing satisfies. It now measures. 100% is reachable with no suppressions and no production source changes: run the suite inside a user+mount namespace and the sudo-writes, systemd units and nftables rules execute for real against a throwaway /etc. - meta/scripts/shell_coverage_jail.sh: the runner, promoted out of a session scratchpad. Two fixes it needed on the way: bind targets mirror the real directory tree (an empty bind makes writes fail with ENOENT, which reads as unreachable code), and sudo gets a pass-through stub because real sudo cannot setresuid inside a userns. - It fingerprints git status before and after and fails the run if a write escapes the jail. Verified with a deliberate escapee. - dot_resolver_install.sh: 39/39 = 100.00%, 28 assertions. Picked by scoring every allowlisted lib on root ops, system writes and destructive calls -- it scored highest in the repo. Allowlist 106 -> 105. - jscpd was already over its own threshold at 2.45% and would have rejected every commit staging a .sh file. Excluding vendored .venv/ shell alone gives 1.67%; also excluding lib/tests/ gives 1.47%. The gate is deliberately NOT wired into the hook chain yet. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DbD4nco3EgL1UFoZKmKsLE
77 lines
7.1 KiB
JSON
77 lines
7.1 KiB
JSON
{
|
|
"intent": "Convert the shell-coverage ratchet from a presence check to the user's chosen 100% line-coverage bar, promote the proven namespace jail into meta/scripts/, unblock the jscpd gate, and bring the repo's hardest shell library to 100% coverage as the first entry under the new bar.",
|
|
"scope": [
|
|
"meta/scripts/shell_coverage_jail.sh (new): the namespace-jail coverage runner",
|
|
"meta/scripts/check_shell_coverage.sh + meta/scripts/lib/shell_coverage_bar.sh: presence check -> measured 100% bar",
|
|
"linux_configuration/.githooks/pre-commit: jscpd exclusions",
|
|
"linux_configuration/scripts/single_use/features/lib/tests/: new suite for dot_resolver_install.sh",
|
|
"Non-goal: wiring the gate into the hook chain; that is a separate step once more libraries clear the bar"
|
|
],
|
|
"changes": [
|
|
"Promoted the session's scratchpad jail prototype into meta/scripts/shell_coverage_jail.sh, with two fixes the prototype needed: bind targets now mirror the real directory tree (an empty bind made writes fail with ENOENT, which reads as unreachable code), and sudo gets a pass-through stub because real sudo cannot setresuid inside a user namespace.",
|
|
"Added an escape assertion: the runner fingerprints `git status --porcelain` before and after, and fails the run if the subject modified the working tree.",
|
|
"Replaced is_covered's `[[ -f tests/run_all.sh ]]` with a measured 100% bar via the jail, extracted to meta/scripts/lib/shell_coverage_bar.sh to hold both files under the 250-line cap.",
|
|
"Excluded .venv/ and lib/tests/ from the jscpd scan, with the measured justification recorded inline.",
|
|
"Added features/lib/tests/{features_harness.sh,test_dot_resolver_install.sh,run_all.sh} and removed dot_resolver_install.sh from the allowlist (106 -> 105 entries)."
|
|
],
|
|
"verification": [
|
|
{
|
|
"command": "bash meta/scripts/shell_coverage_jail.sh --subject setup_night_lockdown.sh --bind /etc --bind /usr/local/bin --bind /var/lib -- help status bogus setup unlock",
|
|
"result": "pass - the promoted runner reproduces the scratchpad result",
|
|
"evidence": "38/38 lines = 100.00%, after the directory-mirroring fix; it read 86.84% before it, because /etc/modules-load.d did not exist inside the empty bind."
|
|
},
|
|
{
|
|
"command": "bash meta/scripts/shell_coverage_jail.sh --subject <the new suite> --measure dot_resolver_install.sh --min 100 -- \"\"",
|
|
"result": "pass - the hardest library in the repo is at the bar",
|
|
"evidence": "dot_resolver_install.sh: 39/39 lines = 100.00%, 28 assertions passing. Chosen by scoring every allowlisted lib on root ops, system writes and destructive calls; it scored 88, the highest in the repo (15 root ops, 5 system writes, 5 destructive)."
|
|
},
|
|
{
|
|
"command": "run the suite inside the jail and read its assertions",
|
|
"result": "pass - all four open_firewall branches and all four run_check arms are exercised",
|
|
"evidence": "28 passed, 0 failed. Covers: existing wg0 rule not duplicated, missing rule added and scoped to the tunnel, add-failure warns instead of aborting, public bind rate limited at the documented 25/second burst 50, and the stunnel-down / cert-missing / port-silent / kdig-unanswered failure arms."
|
|
},
|
|
{
|
|
"command": "bash meta/scripts/check_shell_coverage.sh <a covered lib> ; and <an uncovered, de-allowlisted lib>",
|
|
"result": "pass - the gate fails closed",
|
|
"evidence": "exit 0 on dot_resolver_install.sh (on its own merit, now off the allowlist); exit 1 on nc_php.sh with the allowlist entry temporarily removed. Verified again after the 250-line split."
|
|
},
|
|
{
|
|
"command": "jscpd with the hook's exact arguments, before and after the exclusions",
|
|
"result": "pass - the duplication gate is unblocked",
|
|
"evidence": "2.45% (over the 2% threshold, 51 clones) -> 1.47%. Measured stepwise: excluding .venv/ alone gives 1.67%, already under the bar; adding lib/tests/ gives 1.47% of headroom for the campaign's test files."
|
|
},
|
|
{
|
|
"command": "shellcheck on every new and modified shell file; grep for suppressions",
|
|
"result": "pass - clean, with no suppressions",
|
|
"evidence": "shellcheck clean on shell_coverage_jail.sh, check_shell_coverage.sh, shell_coverage_bar.sh, the three new test files and the pre-commit hook. SC2155 was fixed by splitting declaration from assignment and SC2016 by writing the in-namespace runner to its own file, rather than by disabling either."
|
|
},
|
|
{
|
|
"command": "bash meta/scripts/check_file_length.sh --all",
|
|
"result": "pass - all files within 250 lines",
|
|
"evidence": "The conversion first pushed check_shell_coverage.sh to 268 lines; extracting the bar into lib/shell_coverage_bar.sh brought it to 236 + 44."
|
|
},
|
|
{
|
|
"command": "deliberate escapee: a subject that writes into the repo",
|
|
"result": "pass - the escape assertion fires",
|
|
"evidence": "'Error: the subject modified the working tree; a write escaped the jail' plus the offending path, exit non-zero. The real /etc/modules-load.d/night-lockdown-i2c.conf kept its 2026-07-23 mtime across every run in this session."
|
|
},
|
|
{
|
|
"command": "time bash meta/scripts/check_shell_coverage.sh <one lib>",
|
|
"result": "pass - fast enough for a pre-commit hook",
|
|
"evidence": "0.42s per file in hook mode, for both a covered and an exempt lib. A --all sweep is much slower, which is why the hook checks only the files a commit touches."
|
|
}
|
|
],
|
|
"risks": [
|
|
"The jail's bind list is per-subject. Mount only what a script WRITES and preserve what it READS: a blanket jail that masked /usr/local/bin cut pacman_wrapper.sh from 75.00% to 28.95%, because the wrapper sources its sibling libs from there. An over-aggressive mount is indistinguishable from unreachable code at the report level.",
|
|
"is_covered falls back to presence when kcov or unshare is absent, so a machine without the tools cannot enforce the number. This is deliberate -- a hook that hard-failed on a missing developer tool would block all commits there -- and the CI job is what makes the number binding.",
|
|
"The gate is still NOT wired into the hook chain. Nothing enforces this yet; wiring is a separate step once more libraries clear the bar.",
|
|
"105 libraries remain on the allowlist. The list is shrink-only by construction, so it cannot quietly regrow, but the campaign is far from finished.",
|
|
"Excluding lib/tests/ from jscpd means duplicated test harnesses no longer trip the duplication gate. The 'one harness per directory' convention is now a convention rather than an enforced rule.",
|
|
"This session ran alongside another Claude session working in the same repo, which authored check_shell_coverage.sh, the allowlist and commits 7845ddfe..3338033c. Its work was converted rather than reverted, per the user's instruction not to touch it."
|
|
],
|
|
"rollback": [
|
|
"git revert this commit; the gate is not wired into any hook, so reverting cannot break a commit path.",
|
|
"After rollback, confirm `bash meta/scripts/check_file_length.sh --all` passes and that jscpd returns to its prior 2.45% -- which will block any commit that stages a .sh file until the .venv exclusion is restored."
|
|
]
|
|
}
|