nx_d001census.nx
buildroot/runtime/nx_d001census.nx
about
nx_d001census.nx -- SIZE THE D001 POPULATION INSTEAD OF DISCOVERING IT ONE REFUSED PROMOTE AT A TIME.
/api/promote REFUSES a gate that rolls its own verdict (D001): nx_gate_green cannot judge it and it
records no harness.jrnl frame, so flake and erosion stay invisible for it. Correct guard. But it fires
at PROMOTE time, one gate at a time, so the only way to learn the size of the problem is to keep
bouncing off it -- I hit it four times before asking how many there are.
*A GUARD THAT ONLY SPEAKS AT THE MOMENT OF ACTION TEACHES YOU THE POPULATION ONE REFUSAL AT A TIME.*
This partitions every gate in the tree into the three states that have DIFFERENT REMEDIES, which is the
whole point -- "D001" as one bucket is not actionable:
OK inherits_base=1 -- nothing to do
MIGRATABLE inherits=0, emits_verdict=1 -- nx_gate_dry_apply CAN rewrite it, automatable
NEEDS-ANCHOR inherits=0, emits_verdict=0 -- dry_apply SKIPs it ("no verdict=GREEN tail");
needs the anchor rung, a source edit in the
gate-owner lane. MEASURED: all 4 I hit are here.
PROBE-FAIL is its own bucket: *AN UNPARSED PROBE MUST NEVER FALL INTO A KNOWN STATE*, because the
bucket it lands in becomes the number somebody plans a migration campaign against.
COMPOSES nx_gate_migrate probe -- never re-derives "is this compliant", because a second implementation
of that judgement would drift from the one /api/promote actually enforces, and would disagree exactly
when it mattered.
⚠ the probe BUILDS each gate (`builds=1`), so this contends for per-target build leases like any other
sweep: bounded by an explicit max, resumable by skip, deadline per probe.
nx_d001census <max> [skip] [timeout_ms] [dir]
license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
dependencies 1 imports · 0 importers
imports: nx_tool_run.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 29 | const DC_HOST: *u8 = "/volume1/homes/elderwesto/nishihost" |
| 30 | const DC_PROBE: *u8 = "/volume1/homes/elderwesto/nishihost/nx_gate_migrate.elf" |
| 31 | const DC_DRY: *u8 = "/volume1/homes/elderwesto/nishihost/nx_gate_dry_apply.elf" |
| 32 | const DC_DIR: *u8 = "/volume1/homes/elderwesto/nishihost/buildroot/runtime" |
| 33 | const DC_DIRBUF: i64 = 262144 |
| 34 | const DC_RECLEN_OFF: i64 = 16 |
| 35 | const DC_NAME_OFF: i64 = 19 |
| 36 | const DC_CAP: i64 = 65536 |
| 37 | const DC_DEF_TMO: i64 = 180000 |
functions
| 39 | func dcp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } |
| 40 | func dce(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(2,s,n); return 0 } called by 1: main |
| 41 | func dcn(v: i64) -> i64 |
| 54 | func dc_atoi(s: *u8) -> i64 called by 1: main |
| 61 | func dc_ends(nm: *u8, sfx: *u8) -> i64 called by 1: main |
| 73 | func agmig(d: *u8, o: i64, s: *u8) -> i64 { var x: i64=o; var i: i64=0; while s[i]!=(0 as u8){d[x]=s[i];x=x+1;i=i+1} return x } called by 1: main |
| 75 | func dc_has(buf: *u8, n: i64, ndl: *u8) -> i64 called by 1: main |
| 90 | func dc_flag(buf: *u8, n: i64, key: *u8) -> i64 called by 1: main |
| 105 | func main(argc: i64, argv: *i64) -> i64 |