All notable changes to Valence Shell will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
Note: Versions 0.x.x are pre-release. Breaking changes may occur between minor versions.
-
Glob expansion (.txt, ?.rs, [a-z])
-
Quote processing (proper escaping, single/double quotes)
-
Full POSIX shell compliance (subset)
-
RMO (Remove-Match-Obliterate) proofs for GDPR compliance
-
obliterateis now wired into the shell and reachable from the REPL and scripts. It was previously implemented incommands/secure_deletion.rsbut never dispatched (noCommandvariant, parser case, or executor arm), so it was unreachable dead code. AddedCommand::Obliterate { path, force, .. }, the"obliterate"parser case (with--force/-f), and the executor arm routing tosecure_deletion::obliterate_path(file/dir dispatch). Proof reference:OBLITERATE_IRREVERSIBLE. -
Audit residue: obliterate now appends an append-only record to
<sandbox-root>/.vsh-audit.log— the MAA attestation that survives the data destruction (GDPR Article 17 evidence). Data is destroyed; proof-of-deletion persists. -
Tests:
impl/rust-cli/tests/obliterate_rmo_tests.rs(6 tests) — dispatch wiring, missing-operand error, end-to-end destruction, audit residue, irreversibility (undo cannot resurrect), and no-old-plaintext-remains. Full suite green; verified through the real binary in script mode. -
Honest scope: best-effort 3-pass overwrite (random/0x00/0xFF + fsync) on in-place filesystems only. CoW (btrfs/ZFS/APFS)/SSD FTL defeat overwrite (use
secure_erasefor hardware NIST SP 800-88 Purge); audit-log HMAC signing is still pending. NOT a complete GDPR compliance framework. Status docs reconciled from "RMO stubs only" accordingly.
-
proofs/lean4/ModelOracle.lean+lean_exe model_oracle— compiles the proven Lean model definitions (mkdir/rmdir/createFile/deleteFile/fsUpdate) into a standalone oracle that reports the node type at probe paths. -
impl/rust-cli/tests/model_oracle_correspondence.rs— differential test that generates precondition-respecting operation sequences, applies them to the real RustShellState, runs the same sequence through the compiled Lean model, and asserts they agree at every touched path. 1218 probes agree across 200 sequences. This makes the proof artifact itself the test oracle (stronger than hand-transcribed property tests); it remains differential testing, not a full refinement proof — the latter is still the v1.0 blocker. The test skips cleanly when the oracle is not built. -
just build-model-oracle/just test-correspondence-model; wired intolean-verification.ymlCI. -
docs/LEAN4_RUST_CORRESPONDENCE.mddocuments the harness, why the Coq extraction is not executable (function-typed filesystem + classical axioms; needsFMaps.t FSNodemigration), and the roadmap to full mechanization.
-
launch.sh— a standard-conformant launcher implementing the Hyperpolymath E-Grade Launcher Standard mode surface:--auto(default),--start,--stop,--status,--browser/--web,--integ,--disinteg,--help,--version. Version output matches the requiredvsh <version> (<sha>) [<platform>]format. Desktop integration (Linux first-class) is idempotent, copies rather than symlinks, setsTerminal=true, writes the.desktopat 0444, and--disintegpreserves config and logs. Sourceskeepopen.sh/soft-attach.sh/gui-error.shvia the published resolution ladder with graceful no-op degradation when the desktop-tools are absent. PID/log paths use XDG dirs (never/tmp). Server-oriented clauses (nohup daemon,wait_for_serverURL polling, browser launch) are honestly declared deferred in thea2ml-metadata-blockheader, sincevshis a foreground terminal shell with no HTTP server. Seedocs/LAUNCHER.md. -
scripts/run.sh— the canonical startup command the standard searches for ({repo-dir}/scripts/run.sh); builds the release binary on first use and execs the shell. -
just run/just launchnow delegate to./launch.sh --auto.
-
just run(aliasjust launch) — the user-facing launcher for thevshshell, previously missing. Builds and starts the interactive REPL; passes extra arguments through to the binary (just run --version,just run script.vsh). Verified end-to-end:--versionprintsvsh 0.9.0(exit 0), the REPL banner starts interactively, and script execution runs and exits 0. -
QUICKSTART-USER.adocrewritten from the unfilled RSR template to the real, working flow — it no longer references non-existent recipes (just setup,just uninstall,just stapeln-run,just install --portable); everyjustcommand it now cites is a real recipe (verified viajust --show). Uninstall documents the honestcargo uninstall vshpath.
-
Coq proof-debt re-verified to 0 admits / 0 real gaps under Coq 8.18.0. The full
_CoqProject(11 files) compiles with noadmit/Admitted/Axiommarkers.Print Assumptionson the load-bearing theorems:obliterate_overwrites_all_blocksandoverwrite_pass_equalizes_storageare Closed under the global context (zero axioms);single_op_reversible,operation_sequence_reversible,copy_file_reversible,mkdir_two_dirs_reversible,obliterate_not_injectivedepend only on the standardfunctional_extensionality_dep. The historically-tracked "1 real gap" (obliterate_overwrites_all_blocks) and the three 2026-06-02 admits (#56/#57/#58) are all closed. Remaining assumptions are standard/justified: Coqfunctional_extensionality(stdlib)
is_empty_dir_dec(justified classical), Agdafunext(structural). Docs reconciled:PROOF_HOLES_AUDIT.md,README.adoc,FAQ.adoc,CLAUDE.md,docs/wiki/,ROADMAP*.{adoc,md},.machine_readable/6a2/STATE.a2ml,bot_directives/methodology.a2ml.
-
just build-coqandscripts/verify-proofs.shnow succeed from a clean checkout. Both previously compiled an incomplete file subset (missingfilesystem_composition.vand others), soposix_errors.vfailed with "Cannot find a physical path bound to logical path filesystem_composition"; both now compile the full_CoqProjectchain in dependency order andmkdir -p extractedbeforeextraction.v(the gitignored output dir), matching the CI oracle invalidation.yml. -
scripts/verify-proofs.sh: fixed two latentset -ebugs that aborted the script before any test ran —VAR++counters (post-increment returns the pre-value, so the first bump from 0 yields exit status 1) replaced with assignment form; and per-testcdside effects that leaked between tests are now isolated by running each test command in a subshell.
-
O_NOATIMEdiscipline for pure-read theorems (#94 Gap 9). Newsrc/fs_pure.rsmodule exposesopen_pure/read_to_end/read_to_stringhelpers that setlibc::O_NOATIMEon Linux (viaOpenOptionsExt::custom_flags) with a gracefulEPERMfallback to vanillaFile::openwhen the calling process is not the file owner and lacksCAP_FOWNER. Eight call sites converted: script load (main.rs),sourcecommand (executable.rs), audit-log replay (audit_log.rs), state load (state.rs), input redirection (redirection.rs+external.rs), truncate-redirection backup read (redirection.rs), pre-deletion undo backup (commands.rs). Reads from character-special / sysfs paths (e.g./dev/urandom,/sys/block/…/rotational) are intentionally untouched — atime is not tracked there andO_NOATIMEmay be rejected by those subsystems. macOS / non-Linux paths transparently fall through toFile::openand rely on mount-levelnoatime/relatime. Six new unit tests cover round-trip (Vec<u8>+String), open-position, large-file (200 KB), missing-file, and EPERM-fallback parity. Test total: 757 → 764 (+7 incl. doctest).
-
Idris2: RMO theorem-shape redesigns landed via PR #105 —
secureDeleteNotInjective(mirrors Coqobliterate_not_injective, closes #60) +gdprDeletionCompliantstructural redesign (closes #61). NewremoveEntryDeterminedByFilter+keepIfNotPhelpers inFilesystem.Model. Drive-byDecEq Pathfix +equivReflhole unblock the build past Model. -
Idris2: 8 remaining
partialmarkers inComposition.idrcleared via PR #109 —applyOpnow calls underlyingaddEntry/removeEntry/updateEntryprimitives directly. Theorem-shape fixes forAllimport, Maybe-monadic undo-redo chain,LTElength predicate, and reverseConcat hole. Closes #89. -
Idris2: 2 misleading
partialmarkers inRMO.idr(secureDelete + gdprDelete IO computations) dropped via PR #108 — IO does not introduce partiality. -
Total Idris2
partialcount is now zero, down from 10 at the start of the session. Hole count 21 + 8 partial → 22 + 0 partial. -
Idris2 0.8.0 parse fixes —
AuditEntry.proofreserved-token clash renamed toobliterated(PR #112);hardwareEraseIrreversiblemulti-line signature converted to single-line viaUnit(PR #113). -
reverseConcathole closed viaData.List.revAppendfrom base stdlib (PR #115). One fewer Composition.idr hole.
-
Idris2 build oracle merged via PR #106 —
idris-verification.ymlworkflow + Justfile recipes (build-idris2,verify-idris2). Non-blocking initially (pre-existing build issues athardwareEraseIrreversible— resolved same day by PR #113). Closes #70.
-
Stale sweep: 4
claude/issue-*branches deleted post-merge (#105/#106/#108/#109 squash-merge cleanup) + 1 orphanclaude/safedom-res-stale-sweepbranch removed (PR #34 merged 2026-05-27; 3 subsequent campaign commits were superseded). Salvaged.github/copilot/coding-agent.ymldecision filed as #111. -
PROOF-NEEDS.md +
proofs/idris2/README.md+ ROADMAP.adoc refreshed to reflect zeropartialcount + 3-admit Coq state. -
State refresh after the 2026-06-02 post-merge sweep (PR #114).
-
Doc followup gathering PRs #112 / #113 / #115 into a single coherent note (PR #116).
-
Inherited governance reds cleared on 4 open PRs (PR #110).
-
RMO.idr
overwriteIrreversible+auditTrailCompletenesstype fixes (PR #117). -
Idris2 build oracle flipped to strict (PR #118, closes #70 follow-up).
-
Implementation:
O_NOATIMEdiscipline landed via PR #120 (merge of the #94 Gap 9 work cited above). -
Idris2 Category A non-theorem redesigns (PR #121, closes #119A).
-
CI:
idris-verificationinstall chez symlink for Ubuntu’s chezscheme (PR #122). -
Proof:
equivSymclosed viaData.Bool.andCommutative(PR #123, 1/5 Cat B). -
4 admits annotated in
rmo_operations.vwith explicit obligations; Idris2 keyword/parse fixes accompany.
-
Coq:
single_op_reversibleQed-closed viaOpMkdirWithPerms+OpCreateFileWithPermsconstructor-variant approach; zero new axioms (PR #67) -
Lean 4:
crash_atomic_within_op_mkdirkeystone theorem + 280-linedocs/THEORY-CRASH-CONSISTENCY.adocdesign doc (PR #62, closes #45 keystone) -
Idris2:
Filesystem/Model.idrtypecheck fixed viaData.Maybeimport +Eq Path+Eq FSEntryinstances (PR #69) -
Idris2: RMO theorem-shape redesigns closing #60 + #61.
secureDeleteIrreversible(non-theorem:recovery fs = fs → Voidrefuted byrecovery = id) →secureDeleteNotInjectivemirroring Coq’sobliterate_not_injective;gdprDeletionCompliant(non-theorem:recovery = idrefuted byrecovery = const empty) → structural witness mirroring Coq’sobliterate_leaves_no_trace. NewremoveEntryDeterminedByFilter+keepIfNotPhelpers inFilesystem.Model. Drive-by Model.idr fixes (DecEq Path impossible-pattern + equivRefl hole) unblock the Idris2 build past Model. -
Cross-system witness matrix + open-frontier docs (PRs #47/#62)
-
Real
secure_delete(3-pass overwrite with/dev/urandom/zeros/0xFF+ fsync + unlink) replacing the stub (PR #72) -
Real
audit_log(XDG_STATE_HOME, JSON-lines, append-only) replacing the stub (PR #72) -
6
unreachable!incommands.rsconverted to typedCommandErrorvariants (PR #72) -
20 new property-correspondence tests bringing total to 757 passing / 0 failing (PR #72)
-
Clippy
-D warningssweep: 86 errors → 0 across 34 files inimpl/rust-cli/(PR #74) -
cargo fmtsweep acrossimpl/rust-cli/(PR #73) -
SHA-pin
standards/governance-reusable.ymlfrom floating@main(PR #103) -
5 GH Action SHA bumps (
checkout→ 1cce339,cache→ 27d5ce7,upload-artifact→ 043fb46,rust-cache→ 8ba370a,scorecard-action→ af76153) + 30 cargo dep bumps (PR #68) -
Add Idris2 build oracle: Justfile recipes +
idris-verification.ymlworkflow + README docs (PR #106 — closes #70) -
Drop
codeql.yml: the JS/TS leg failed under newer codeql-action SHAs (empty-source rejection) and the repo is Rust-primary; Hypatia Neurosymbolic Analysis covers semantic analysis (closes #71)
-
LICENSE: drop Palimpsest preamble + FALLBACK framing → plain MPL-2.0 (PR #101)
-
SPDX-FileCopyrightText sweep across the codebase: 267 files in 7 language-batched PRs (PRs #95-#100, #102):
-
105 Markdown · 70 Rust · 44 AsciiDoc · 22 Zig+C+H · 11 Elixir · 10 Idris2 + LICENSE + anchor taxonomy
-
-
RSR-template gap fill: 188
{{project}}/valence-shell/BUILD_CMDplaceholders replaced across 10 files (PR #59) -
Anchor taxonomy migration:
.machine_readable/anchors/ANCHOR.a2ml→.machine_readable/6a2/anchor/ANCHOR.a2ml+0-AI-MANIFEST.a2ml+README.adoc(PR #102) -
ROADMAP refreshed with landed-PR cross-refs (M2 + M3 + M4 sweep, PR #68)
-
Wiki bootstrapped (Home + Session-Log-2026-06-01)
-
Remove accidentally-tracked runtime artifacts
impl/rust-cli/$FILE+.vsh_state.jsonfrom PR #73’s test session; add both to.gitignore(PR #75)
-
#60, #61 — RMO.idr theorem-shape redesigns CLOSED via PR #105 (Idris2
?holeswere non-theorems by type signature; signatures redesigned to mirror Coq) -
#63-#66 — 4 crash-consistency sub-frontiers (POSIX 2024 edges / concurrency-multi-process / Idris2-via-typed-WASM / hardware barriers)
-
#70 — Idris2 build oracle infra CLOSED via PR #106 (Justfile target + CI job + README docs)
-
#71 — CodeQL JS/TS regression CLOSED (workflow dropped — Hypatia covers semantic analysis)
-
#76-#94 — 17 sub-issues under #41/#42/#43/#45 for Option-2 full-closure work
-
Phase 6 M7-M10: Advanced Shell Features
-
Process substitution (<(cmd) and >(cmd)) with FIFO-based implementation
-
Arithmetic expansion ($expr with +, -, , /, %, * operators)
-
Here documents (<<DELIMITER with expansion, <←DELIMITER with tab stripping)
-
Here strings (<<<word for single-line input)
-
Full job control implementation:
-
Background execution with & operator
-
Job table with specifications (%1, %+, %-, %name, %?pattern)
-
fg command with terminal control (tcsetpgrp)
-
bg command with SIGCONT for resuming stopped jobs
-
kill command with signal parsing (numbers and names)
-
Process group management for job control
-
Job signal handling (SIGTERM, SIGKILL, SIGCONT)
-
Phase 6 M11: Shell Variables (Discovered Complete)
-
Variable storage in ShellState (HashMap, export tracking, positional params)
-
Variable tokenization (
$VAR, $ {VAR}, special params) -
Variable expansion with environment fallback
-
Assignment parsing and execution (VAR=value)
-
Export command (export VAR=value)
-
Integration with commands, arithmetic, command/process substitution
-
Fuzzing Infrastructure
-
Comprehensive fuzzing with cargo-fuzz
-
4 fuzz targets: parser, arithmetic, job specs, signal parsing
-
FUZZING.md documentation guide
-
CI-ready fuzzing configuration
-
Phase 4: Rust-Lean Correspondence
-
Created correspondence design document (PHASE4_CORRESPONDENCE_DESIGN.md, 400+ lines)
-
Created detailed correspondence mapping (PHASE4_CORRESPONDENCE.md, 600+ lines)
-
15 correspondence tests covering Lean theorems
-
State, operation, precondition, effect, and reversibility correspondence
-
85% confidence in Rust-Lean equivalence (informal argument + tests)
-
All tests passing (177 total: 131 unit + 27 integration + 19 property)
-
Added 17 job control tests
-
Added 15 correspondence tests
-
Background job execution verified
-
Signal handling verified
-
Phase 6 progress: 11/14 milestones complete (78%)
-
Overall completion: 82%
-
Rust CLI: 95% feature-complete (advanced research prototype — NOT production-ready; extraction gap not formally closed)
-
Phase 6 M3: Unix Pipelines
-
Pipeline operator (|)
-
Multi-stage pipeline execution (cmd1 | cmd2 | cmd3)
-
Stdio chaining via Stdio::piped()
-
Exit code from last stage (POSIX behavior)
-
Pipeline error handling with undo support
-
SIGINT handling for entire pipeline
-
Final redirections tracked for undo
-
7 pipeline integration tests
-
Phase 0: Sealing (Foundation Hardening)
-
SIGINT handling (Ctrl+C interrupts commands, not shell)
-
Error recovery (no silent state persistence failures)
-
Transaction rollback error reporting
-
Test fixtures migration (modern test_sandbox)
-
Getting Started guide and examples
-
GitHub Actions CI pipeline
-
Comprehensive API documentation (rustdoc)
-
Phase 6 M2: I/O Redirections
-
Output redirection (>)
-
Input redirection (<)
-
Append redirection (>>)
-
Error redirection (2>, 2>>)
-
Combined redirection (&>, 2>&1)
-
Redirection undo support (file modifications reversible)
-
Redirection parser with proper precedence
-
File truncate/append tracking for undo
-
Phase 6 M1: Simple Command Execution
-
Parser extension for external commands
-
External command execution via std::process::Command
-
PATH lookup and executable discovery
-
Exit code tracking in ShellState
-
stdio inheritance (stdin/stdout/stderr)
-
Updated REPL with new parser and external execution
-
Architecture Documentation
-
LEAN4_RUST_CORRESPONDENCE.md
-
ECHIDNA_INTEGRATION.md
-
ARCHITECTURE.md
-
POSIX_COMPLIANCE.md with 14-milestone roadmap
-
OCaml Extraction Pipeline
-
Designed Lean 4 → C → OCaml/Zig extraction pipeline
-
Created proofs/lean4/Extraction.lean (270 lines)
-
Created impl/ocaml/lean_wrapper.c (300 lines)
-
Created impl/ocaml/valence_lean.ml (200 lines)
-
Created impl/zig/src/lean_bindings.zig (400 lines)
-
Architecture: Lean 4 → C → liblean_vsh.so → OCaml/Zig FFI
-
2,820 lines of code + 1,400 lines of documentation
-
Design 85% complete (C wrapper marshaling TODO)
-
All tests passing (27/27: 13 unit + 14 integration)
-
Manual testing successful (ls, echo, pwd working)
-
Phase 3 Initial: File Content Operations
-
File content read/write operations in Coq (~330 lines)
-
File content operations in Lean 4 (~210 lines)
-
File content operations in Agda (~180 lines)
-
Proven reversibility:
write(old, write(new, fs)) = fs -
Proven independence: operations on different paths don’t interfere
-
State capture/restore for undo/redo
-
FileModificationRecord for MAA audit trail
-
Equivalence Theory Completion
-
Mizar equivalence proofs (~190 lines)
-
All 5 manual proof assistants now have complete equivalence theory
-
CNO = identity element proven in 5 systems
-
Proof files: 23 → 27
-
Proof lines: ~3,180 → ~4,280
-
Total theorems: ~217 → ~256
-
Systems with equivalence: 4/5 → 5/5 ✅
-
Systems with content ops: 0 → 3
-
Phase 2: Composition & Equivalence Theory
-
Composition theorems in Coq, Lean 4, Agda, Isabelle
-
Equivalence relations in Coq
-
Z3 SMT encoding for automated verification
-
CNO (Certified Null Operations) connection
-
Mizar composition framework
-
Infrastructure
-
Containerfile for reproducible builds
-
Complete Justfile with 25+ recipes
-
scripts/verify-proofs.sh multi-prover orchestration
-
Proof files: 19 → 23 (+4)
-
Proof lines: ~2,280 → ~3,180 (+900)
-
Total proofs: ~130 → ~217 (+87)
-
Isabelle/HOL and Mizar Support
-
Filesystem model in Isabelle/HOL
-
File operations in Isabelle/HOL
-
Filesystem model in Mizar
-
File operations in Mizar
-
Cross-validation across 5 proof systems
-
Lean 4 and Agda Support
-
Complete filesystem model in Lean 4
-
Complete file operations in Lean 4
-
Complete filesystem model in Agda
-
Complete file operations in Agda
-
Cross-validation between dependent type theories
-
Initial Coq Proofs
-
Filesystem model with paths, nodes, permissions
-
mkdir/rmdir operations with reversibility proof
-
create_file/delete_file operations with reversibility proof
-
POSIX error modeling (EEXIST, ENOENT, EACCES, etc.)
-
Extraction framework to OCaml
-
OCaml Implementation
-
FFI to POSIX syscalls
-
Audit logging hooks for MAA
-
Path resolution and sandboxing
-
Elixir Reference Implementation
-
Matches Coq specification
-
POSIX error handling
-
Reversible operations (RMR primitives)
-
Core Theorems (Coq only)
-
mkdir_rmdir_reversible -
create_delete_file_reversible -
operation_independence -
path_preservation -
Error code correctness
-
CLAUDE.md (AI assistant context)
-
docs/PROGRESS_REPORT.md
-
docs/ARCHITECTURE.adoc
-
proofs/README.md
Current status: Pre-1.0 (Research Prototype)
-
0.x.x: Research and development
-
Breaking changes allowed
-
Formal proofs stable
-
Implementation unstable
-
1.0.0: Production-grade target (future — not yet attempted)
-
Extraction gap closed
-
FFI verified
-
Security audit complete
-
Breaking changes follow semver
New capabilities: - File content operations available - Can now read/write file contents with proven reversibility
Breaking changes: - None (additive only)
Migration: - No migration needed - New features are opt-in
-
❏ Glob expansion (.txt, ?.rs, [a-z])
-
❏ Quote processing (proper escaping, single/double quotes)
-
❏ Variables in redirections (edge case fix)
-
❏ Expanded correspondence tests (15 → 25+ property tests)
-
❏ Echidna validation pipeline integration
-
❏ Property-based build validation
-
❏ Continuous fuzzing in CI/CD
-
❏ RMO (obliterative deletion) proofs
-
❏ GDPR compliance primitives
-
❏ Secure overwrite guarantees
See [CONTRIBUTING.md](CONTRIBUTING.md) for how to contribute to future releases.
Maintained by: See [MAINTAINERS.adoc](MAINTAINERS.adoc) License: Palimpsest-MPL 1.0 or later (see LICENSE)