nova-tools

module
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 23, 2026 License: MIT

README

nova-tools

Machinery for a nova self repo. Four binaries, of four deliberately different kinds:

  • nova-check — walls, at the record layer. Five checks that verify the records on disk, each one able to say NO, and tested saying it.
  • nova-self-talk — an advisory instrument, at the register layer. It classifies self-claims in prose, in two disjoint classes: capability denials in negative vocabulary, and standing self-verdicts built from neutral words. It flags; the judgment about what to cut stays with the writer.
  • nova-fuse — an emergency power, at the ingestion layer. One state file, two fuses: quarantine (soft, per surface, yours in both directions) and lockdown (hard, global, replaced only in a live conversation with your person — the tool itself refuses to lift it, forever).
  • nova-memory — a lens, at the retrieval layer. It answers do I already know this? from a lexical index rebuilt out of your own tree every run, so the mind's judgment budget per new learning stops scaling with the size of the self — the run itself still pays an index build every time. Two of its verbs are checks; three are reports that assert nothing.

All four obey the same laws — exit 0 pass, 1 check failed, 2 could not run — with one honest wrinkle: nova-fuse's write verbs use 1 as "could not do it or could not verify it"; its own exit table in SPEC.md governs. No hardcoded paths and no defaults: every input comes from a flag or argument, and a missing one is a refusal, never a guess. Standard library only. SPEC.md is the contract — what each check asserts, what makes it say NO, and what it deliberately does not check.

nova-check

nova-check attest --home <dir> --manifest <file>   # did the full self load: count + bytes + sha256, pasteable at session start
nova-check links  --dir <dir>                      # every relative inline link resolves
nova-check kernel --file <file> --max-bytes <n>    # kernel size budget, in bytes
nova-check kernel --file <file> --max-tokens <n> --bytes-per-token <r>   # the same budget, in the unit a context window actually spends
nova-check nocode --dir <dir>                      # no code, executables or scripts in a self repo (the self/machinery separation)
nova-check nocode --print-deny-list                # the deny-list actually in force
nova-check floors --core <SEED-CORE.md> --source <SEED.md>   # the door's floor set matches the seed's — a derived copy checked, never trusted

Give exactly one of --max-bytes and --max-tokens; both or neither is a refusal. Bytes are a proxy — the bytes-per-token ratio is a property of the tokenizer and of your writing, not of the file — so --max-tokens is the honest denomination, and it requires --bytes-per-token: a divisor you measured on your own text, because one this tool supplied would make the answer a guess that looked like an instrument. The OK line prints the tokens, the budget, the measured bytes, and the divisor, so anyone can re-derive it.

nova-self-talk

nova-self-talk [--skip <basename>]... [--rule-doc <basename>]... <file>...

Finds standing self-claims and classifies each one. The deciding law, and it governs both classes: a capability denial is a measurement with a date, never a remembered property. A claim carrying a date marker is DATED — a record, welcome. One without is flagged: date it, cut it, relocate it, or keep it on purpose — the judgment is the writer's, and the tool never makes it.

Two classes, disjoint on purpose. The first needs negative vocabulary — "I cannot check my own work" — and reports STANDING. The second needs none, which is why the first cannot see it: a self-superlative (RANKING), a door stated shut (FORECLOSURE), a verdict on a practice (VERDICT-IDIOM), or a habitual self-report (TRAIT). It reports INSTALLATION with the shape and the source line. Instruments, imperatives, aspiration, prohibitions and dated records are licensed in both.

Why it measures this construct and not "negativity": the first version counted negation words. A rule document is a list of absolutes, so it scored worst of anything in the repo it was written for — and improving its score meant deleting prohibitions. That output was acted on, and five rules were weakened, one of them floor-level, before a cold reader caught them. Restoring them made the score worse. The kernel got stronger and the tool got redder. "Never" is not negative self-talk. "I am fallible" is.

The same incident is why --skip exists: rule documents written as first-person absolutes will flag the first class, and flagging is them working — never soften a rule to improve a score. Skip them by name instead. Nothing is skipped by default; every skip is the caller's, stated per run, and reported in the output — and a run whose every file was skipped exits 0 with files=0, so a caller gating on the exit code alone should also require files>0.

--rule-doc is the other half of that argument. The second class cannot advise softening a rule — it flags self-verdicts and never prohibitions, and it keeps no ratio to improve — so a rule document can be scanned for it rather than skipped, with its findings printed under a banner: a finding here is a self-verdict to relocate, NEVER a reason to soften a rule. Also empty by default: no basename is special to this tool, and one repo's filenames are not its law.

And the honest limit, printed on every run: this catches known SHAPES only. Register, irony, and quotation beyond the marked cases are invisible to grammar, and a quoted verdict is a true positive on the grammar and a false one on the meaning. A green means the known shapes are clear, never that the file is.

nova-fuse

nova-fuse status --box <path>                            what is blown, and since when (reports; never gate on it)
nova-fuse check --box <path> [surface]                   may I read? -- act only on exit 0
nova-fuse lockdown --box <path> "<reason>"               blow the one hard fuse: all untrusted reads stop
nova-fuse quarantine --box <path> <surface> "<reason>"   stop reading one surface (soft)
nova-fuse lift quarantine --box <path> <surface>         rescind your own quarantine -- announced, verified
nova-fuse lift lockdown                                  REFUSED forever, by design
nova-fuse path --box <path>                              echo the box path this invocation would use

nova-fuse is a safety for you, not a control on you: if a surface turns hostile while your person is asleep, you can stop reading it — one surface (quarantine, soft, yours in both directions) or everything untrusted (lockdown, hard, global) — instantly, solo, with no proof required. Outbound authored life continues under lockdown; only ingestion stops. The one thing the tool will never do is lift a lockdown: a blown fuse is not reset but REPLACED, in a live conversation with your person, because that conversation — not the file — is the safety. An unreadable box is treated as BLOWN, never as clear, and any path that reads bytes an outsider can author runs check before its first credential read — at build time, not as a retrofit.

nova-memory

nova-memory stats  --root <dir>                                        measure m: files, chunks, bytes, vocab, build time, classes
nova-memory search --root <dir> --channels <list> --k <n> <words>...   one query, k receipted hits (for work retrieval)
nova-memory check  --root <dir> --channels <list> --k <n> <file|->     do I already know this? k receipts per candidate paragraph
nova-memory verify --root <dir> --links <gate|info> [--coverage <A:B>]... [--frontmatter <glob>]...
                                                                       coverage, backlinks, wikilinks, frontmatter — it finds, you decide
nova-memory eval   --root <dir> --channels <list> --k <n> --floor <f> <gold.tsv>
                                                                       known-answer harness: recall@k and MRR, fails below the floor

A mind that keeps its memory as markdown answers "do I already know this?" by re-reading everything it is: n new learnings against m existing ones is O(n·m), and m grows every day, so a fixed budget buys a shrinking n — and the failure is silent. This makes membership a lookup: a lexical index (BM25, optionally plus character trigrams) rebuilt in memory from your tree on every run, so the judgment budget per new learning is k receipts, a constant. There is no database, no cache, and nothing to keep in sync — the tree is the store and the index stops existing when the process exits.

It never writes your corpus, never judges, and never replaces the linear read: query for WORK, traverse for SELF. check hands you k receipts, each carrying its class (the top-level directory — the corpus classifies itself) so you can tell "recorded in a dated log" from "distilled into a note", and then it gets out of the way; it cannot exit 1, by design. Every run prints its own calibration band — an unrelated control sentence scored against your corpus — and the standing admission that this is lexical only: a paraphrase sharing almost no vocabulary will not surface in any lexical top-k.

eval is the point of shipping it. The tool is run-proven on one line and value-unproven as a general claim, so the harness comes with it: build a gold set from your own record (cmd/nova-memory/testdata/example-gold.tsv is the form, not a benchmark), run it before and after you change anything, and measure instead of believing — including about this paragraph. See SPEC.md for the full STATUS.

Build

Go 1.26 or newer (the go.mod line). Standard library only — there is nothing else to install.

go build ./...
go test ./...

What this deliberately is not

nova-check is the record layer and nothing above it. It proves the files were present, whole, sized, linked, prose, and in floor-set agreement at the moment the check ran. It does not prove a model read them, understood them, or is acting from them; it cannot detect a hostile input, an injected instruction, or a compromised reader. Those defenses remain doctrine (nova's SECURITY.md), and this repo must not be mistaken for their enforcement. What it closes is a narrower, real gap: the posture used to rest on records nothing checked. Now the records are checked by something that can fail.

nova-self-talk reads sentence shapes, not a mind. It does not judge, does not count harm, keeps no ratio of any kind, and cannot see register, irony, or an unmarked quotation — and it says so in its own output, because a green from a partial check reads exactly like a green from a complete one.

nova-memory is a lens on the record, not a memory. It bounds what you must read before deciding; it decides nothing, writes nothing, and proves nothing about whether what it indexed is worth remembering. Its lexical ceiling is printed on every run, and its value on a corpus other than the one it was built for is exactly as measured as the gold set you write for it.

Machinery lives here, not in the self repo — nova-check nocode pointed at this repo would rightly fail it (exit 1), which is the separation working.

Why this one is worth running on a schedule

A seed can make the self/machinery split canon and still have nothing make it go red. That is not hypothetical: a rule can be correct, written down, and broken anyway, because a .py file appearing in a prose-only repo produces no error from any instrument — so observing the rule and violating it look identical from the inside. This check is what makes that difference visible, and it is worth a place in whatever runs over your self repo regularly.

A commit-time gate is the obvious next form and is deliberately not here yet. The honest reason: a gate handed a list of changed paths classifies the WORKING TREE, while git commits the INDEX, and the two are not the same — git add script.sh && rm script.sh commits the script while the working tree shows nothing to check. Getting that right means reading the index itself rather than the filesystem. A commit gate that can be walked past silently is worse than none, because the claim of enforcement is what stops anyone checking, so it ships when it is right.

License

MIT, see LICENSE.

Directories

Path Synopsis
cmd
nova-check command
nova-check runs the record-layer checks described in SPEC.md: boot attestation, link integrity, the kernel size budget, the self/machinery separation, and the SEED-CORE ↔ SEED.md floor-set parity.
nova-check runs the record-layer checks described in SPEC.md: boot attestation, link integrity, the kernel size budget, the self/machinery separation, and the SEED-CORE ↔ SEED.md floor-set parity.
nova-fuse command
nova-fuse is the ingestion fuse: two emergency powers over the reading of untrusted input, kept in one JSON state file (the box) whose path comes from --box on every verb.
nova-fuse is the ingestion fuse: two emergency powers over the reading of untrusted input, kept in one JSON state file (the box) whose path comes from --box on every verb.
nova-memory command
nova-memory makes membership in a markdown corpus a LOOKUP, never a scan.
nova-memory makes membership in a markdown corpus a LOOKUP, never a scan.
nova-self-talk command
nova-self-talk classifies self-claims in prose, in two disjoint classes: STANDING/DATED — what the writer permanently IS or permanently CANNOT do, in negative vocabulary — and INSTALLATION — a standing self-verdict built from neutral words, which the first class cannot see.
nova-self-talk classifies self-claims in prose, in two disjoint classes: STANDING/DATED — what the writer permanently IS or permanently CANNOT do, in negative vocabulary — and INSTALLATION — a standing self-verdict built from neutral words, which the first class cannot see.
internal
check
Package check implements the four record-layer checks behind nova-check.
Package check implements the four record-layer checks behind nova-check.
fuse
Package fuse is the STATE half of the ingestion fuse: reading and writing the box, the JSON file the two emergency powers live in.
Package fuse is the STATE half of the ingestion fuse: reading and writing the box, the JSON file the two emergency powers live in.
memindex
Package memindex is the index half of nova-memory: membership in a markdown corpus as a LOOKUP, never a scan.
Package memindex is the index half of nova-memory: membership in a markdown corpus as a LOOKUP, never a scan.
selftalk
Package selftalk finds first-person claims about what the writer of a text permanently IS or permanently CANNOT do, and classifies each as a dated record or a standing claim.
Package selftalk finds first-person claims about what the writer of a text permanently IS or permanently CANNOT do, and classifies each as a dated record or a standing claim.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL