3405fc4def
loadProgram REPLACES a whole predicate, so adding one clause meant re-sending every existing clause of it through an agent's context window. Measured on the wave-3 batch: ~113KB read and ~113KB written to deliver ~25KB of new text. That sets the behaviour -- writing becomes a thing you batch and do rarely -- and the batch is where a short payload silently drops the rest of a predicate, which has cost this repo 22 decisions and 19 doctrines once already. scripts/kb reads clauses as DATA and never consults them, so the cost of adding a clause is the clause. Canonical form is read_term in, portray_clause out -- measured, not designed: all 495 existing facts round-trip byte-identically and the form is a fixed point in one pass. Rules move to one line, which is why the reformat lands here rather than earlier: the MCP would re-expand them on its next save and the two would thrash. trealla moves into the devShell. Reaching it through `nix shell` per invocation took the tool's first real use past a two-minute timeout for a write that takes 0.42s with tpl on PATH. Four guards, each added because injecting its fault showed the tool accepting what it should refuse. None was found by reading: - an unparseable delta dropped trealla into its REPL, which HANGS with a terminal and EXITS 0 without one -- a refusal that reads as acceptance - `-g main,halt` exits 0 on a throw AND on a failure, because a goal that fails never reaches the halt beside it; halt(2) alone exits 2, so the default is the hazard. The goal now guarantees a halt on every path (0/2/1) - `42.` parses, is not callable, and landed as a fact whose head is a number; kb_consistent has no opinion about stray terms - fmt discarded the merge's exit code and would have committed a failed canonicalization Plus the two that were designed in: the result is read back and required to be the clauses intended (variant equality -- == compares variable identity and reports every rule as different), and kb_consistent runs on the CANDIDATE, so a bad delta leaves the knowledge base untouched rather than needing a revert. scripts/kb-test.sh proves all nine by injection. context/code/kb-tool.md carries the argument, including what it does not reach. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FC2jVn8Au7E9JPkw6bwXXH
81 lines
2.6 KiB
Nix
81 lines
2.6 KiB
Nix
{
|
|
description = "Improvise — Multi-Dimensional Data Modeling Terminal Application";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
beads.url = "github:gastownhall/beads/v1.3.0";
|
|
rust-overlay = {
|
|
url = "github:oxalica/rust-overlay";
|
|
};
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
crate2nix.url = "github:nix-community/crate2nix";
|
|
};
|
|
|
|
outputs = {
|
|
self,
|
|
beads,
|
|
nixpkgs,
|
|
rust-overlay,
|
|
flake-utils,
|
|
crate2nix,
|
|
}:
|
|
flake-utils.lib.eachDefaultSystem (system: let
|
|
pkgs = import nixpkgs {
|
|
inherit system;
|
|
overlays = [(import rust-overlay)];
|
|
};
|
|
|
|
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
|
|
extensions = ["rust-src" "clippy" "rustfmt" "llvm-tools-preview"];
|
|
# The browser deployment targets wasm; without this, the wasm audit
|
|
# (improvise-ywd) and the OPFS backend (improvise-i34) cannot even be
|
|
# checked, let alone fixed.
|
|
targets = ["wasm32-unknown-unknown"];
|
|
};
|
|
|
|
cargoNix = import ./Cargo.nix {
|
|
inherit nixpkgs pkgs;
|
|
};
|
|
in {
|
|
inherit cargoNix;
|
|
devShells.default = pkgs.mkShell {
|
|
nativeBuildInputs = [
|
|
rustToolchain
|
|
pkgs.pkg-config
|
|
pkgs.rust-analyzer
|
|
crate2nix.packages.${system}.default
|
|
pkgs.cargo-expand
|
|
pkgs.cargo-llvm-cov
|
|
pkgs.global
|
|
pkgs.universal-ctags
|
|
beads.packages.${system}.default
|
|
|
|
# `scripts/kb` and the CI knowledge-base check both run trealla. It
|
|
# was reached through `nix shell nixpkgs#trealla` per invocation,
|
|
# which cost more than the work: the tool's first real use took past
|
|
# two minutes for a write that takes half a second on PATH.
|
|
pkgs.trealla
|
|
|
|
# `web/build.sh` — and so the Pages job's local dry run — needs this.
|
|
# The `wasm` CI job only runs `cargo check`, which does not, so the
|
|
# shell was missing the one tool that turns a passing check into a
|
|
# loadable page (improvise-d31).
|
|
pkgs.wasm-pack
|
|
|
|
# Demo recording and release tooling
|
|
pkgs.asciinema
|
|
pkgs.vhs
|
|
pkgs.cargo-dist
|
|
# nixpkgs cargo-dist installs as "dist"; alias so `cargo dist` works
|
|
(pkgs.writeShellScriptBin "cargo-dist" ''exec ${pkgs.cargo-dist}/bin/dist "$@"'')
|
|
];
|
|
RUST_BACKTRACE = "1";
|
|
};
|
|
|
|
packages = {
|
|
improvise = cargoNix.workspaceMembers.improvise.build;
|
|
default = self.packages.${system}.improvise;
|
|
};
|
|
});
|
|
}
|