Repository navigation
Releases: laithalsaadoon/symspec
Releases · laithalsaadoon/symspec
Release list
v2.0.0
2.0.0 (2026-10-06)
⚠ BREAKING CHANGES
- waivers: code-only, hash-less single-ref and never-class waivers stop applying. waive, apply and import refuse a waive of a never-class code (verdict, disclosure, triage, hygiene, anchor), of an unpublished code, or with no requirement scope, with ERR_WAIVER_REFUSED; a ref is stored as refs [ref] plus the content hash. Stored waivers in those shapes (and hash-less refs) go inert: check ignores them and discloses each as an info waiver-inert diagnostic carrying its unwaive op and, for a wording or structural code, scoped replacement waive ops; stale-hash waivers are listed in data.ignoredWaivers. A waived blocking lint now demotes waived-blocking-lint, so it never yields verified true.
Features
- config: pin the gate's run settings in symspec.config.json, and init --split (0d0b8a0)
- document: format v4 schema with the vocabulary, intent and policy (38bb6fc)
- numeric: disclose a quantity no read bound covers as FND_NUMERIC_UNCOMPARED (1dcf401)
- ops: op directions and signal classes as data, measured by G-D (4502693)
- waivers: enforce waivability: refuse never-class and unscoped waivers, inert stored ones (7afb20e)
Bug Fixes
- advice: bind the numeric/relational repair waiver to its finding's ids and text (b3a7c03)
- advice: scope a pair demotion's waiver op to its own pair (73f627e)
- advice: scope the numeric/relational waiver repair to its own pair (57a677c)
- atomize: keep a
,or.between two digits inside its number (5f4de78) - check: a run on the stub embedder demotes with run-weakened and discloses data.run (a093538)
- check: disclose FND_REACHABILITY_NOT_CHECKED when no state model is committed (77f03b4)
- cli: every flagged command site carries only shell words (R63, R64) (ae268e3)
- cli: every printed command is shell-safe and names full arguments (R60, R61) (6f7e957)
- config: a git refusal with no config anywhere falls back and discloses (a158480)
- config: a nested .git is a toplevel only when the enclosing repository agrees (5ed7bc9)
- config: find the config with git rev-parse, name it with --config, disclose where it came from (e755084)
- config: recognise the bare refusal by git's form; a dangling config link is present (36bb975)
- config: refuse a committed bare-repository layout as the toplevel (50ea778)
- config: take only git's whole discovery message for "no repository" (86492ea)
- config: trust only a real .git as the toplevel, and make the pin repair converge (ef7e105)
- document: label the v4 vocabulary, intent and policy keys experimental (ca83661)
- document: nested v4 descriptions say what a later release will do (6509f0f)
- engine: a --semantic-threshold above the default demotes as run-weakened (88af88d)
- engine: a glossary alias carries its phrase's contraries (425372e)
- engine: a glossary entry never merges two contraries onto one atom (a170157)
- engine: AC-3-2 demotes contrary pairs under guards no checked group joins (ef3a5e3)
- engine: an exact-set waiver suppresses only the finding over exactly its ids (a702d6b)
- engine: apply the governed-preposition rule to every antonym row (d1dc7de)
- engine: check "shall not only X but also Y" as a positive obligation (8879845)
- engine: coverage prose names the real reason no pair was compared (d8fa1af)
- engine: delete the two preposition guesses that widened a proof (8aeb330)
- engine: demote on an opposite-polarity pair that differs only in inflection or number (f25d6d1)
- engine: demote verified with solver-unknown when the contradiction enumeration hits unknown (8056269)
- engine: demote, never certify, the pairs the antonym split stopped relating (07e66d5)
- engine: demote, never prove, two responses apart only by their prepositions (92e51a2)
- engine: discharge an opposition candidate only by its exact, text-bound pair waiver (661c933)
- engine: disclose opposed numeric bounds under guards never asserted together (8404e95)
- engine: disclose prohibition sets that conflict only all together (12e7ed8)
- engine: each antonym verb drops only its own governed preposition (b765b3f)
- engine: give an unmarked time bound before other text its own role (5a7bbe6)
- engine: govern every preposition that names the place, per verb and per place (361d228)
- engine: govern no
within, and delete the deadline word list (e327e47) - engine: govern no locative, so two different locatives are never one key (cbc9e25)
- engine: keep a bound's trailing condition, and never compare across it (5d9d65c)
- engine: keep a digit separator inside its number in the quantity key (8f3a8b1)
- engine: keep direction prepositions; drop only a class-governed one from the key (3c2617d)
- engine: key a bound response's action too, disclose one behind other words, and read every asserting complement's copula (9cfe844)
- engine: key an action's performance as a bound's subject, in every unit class (4cdbb92)
- engine: key numeric quantities, relational groups and plan systems by the atom scope (54ce198)
- engine: leave a bound in one cell when no clause holds it ([43e378f](43e378f...
v1.2.1
1.2.1 (2026-08-29)
Bug Fixes
- atomize: a scope is never empty, and never eats an article (e0e48ea)
- atomize: a symbolic comparator must survive normalization (282a3b6)
- check: a guard is both EARS slots, so two exclusive states are two contexts (e035458)
- check: an "I don't know" is not a comparison, so it must not certify (ffaad06)
- check: an eligibility-only finding is not a comparison, so it must not certify (c3c5203)
- contradiction: a culprit set is the document's, not the solver's iteration order (cabb8c6)
- numeric: a quantity subject is the whole phrase, not a three-word window (33ece44)
- relational: a discloser wants a COARSER key than the prover it shares one with (6cdcc49)
- subsumption: a degenerate body relates two formulas, not two requirements (8681348)
- three error-severity fabrications, and the gates that were missing (b20e371)
v1.2.0
1.2.0 (2026-08-18)
Features
- check: splice the terminology tier where it cannot reach the verdict (a74d2fe)
- propose-glossary: align GUARD vocabulary, the slot that decides what gets compared (59969d9)
- propose-glossary: offer the NOUN behind a phrase class, with its blast radius (358d8b1)
- propose-glossary: report every opposition, not only the ones a merge threatened (b3b79ba)
- terminology: the dual of the synonym bridge, at a measured floor (c47d20c)
- terms: a committed noun-phrase table, so one entry aligns a noun document-wide (8a38938)
- whole-document vocabulary alignment — guard slots, terms, and the terminology tier (8fcdac7)
Bug Fixes
- formal: a committed table must not invert a state bridge (fbe4e67)
- glossary: a dead withhold reason, and a plan that split what it aligned (473fbc5)
- lint: R37 stops claiming a glossary check it never ran (a296926)
- publish: gate the two code counts that had no gate, and the one that had half (ed9e12f)
v1.1.0
1.1.0 (2026-08-14)
Features
- adversarial: restore the searcher, and close two bug classes with swept gates (0f446e0)
- propose-glossary: design the vocabulary across the whole document, not pair by pair (a0b910e)
Bug Fixes
- engine: the two defects the freeze kept as footnotes, red-first (ed16eb9)
- repair: every command the tool tells you to run, runs — and the README says why (90b8c10)
Performance Improvements
- repair-test: read each source file once, not once per assertion (428d155)
v1.0.1
v1.0.0
1.0.0 (2026-08-12)
⚠ BREAKING CHANGES
- one package at the root, published via release-please + OIDC (#3)
Features
- all the things (df0efdc)
- blah (a49f651)
- cli: add download-model command to pre-warm the semantic model cache (1c3d3d4)
- cli: field-report wishlist (10 items) +
installskill command (1b1fb5e) - embed: replace transformers.js with pure onnxruntime-web WASM (3c3bac4)
- formal: close issue #2 — verified never outruns the numeric tier; loud coverage (fabc156)
- formal: close the 25/30 red-team escapes — lexicon hardening, coverage-demoted verified, embeddings core (ef40962)
- formal: close the atom-matching gap — antonyms, guard-implication closure, coverage gating (08cdc5b)
- formal: close the atom-matching gap — antonyms, guard-implication closure, coverage gating (bfeed93)
- install: bundle with tsdown + migrate to registerTool API (baeaef1)
- install: rename bins to symspec/symspec-mcp + ship installable tarball (0db2f2e)
- one package at the root, published via release-please + OIDC (#3) (13242d9)
- v3.0: deterministic numeric/arithmetic conflict tier (LIA/LRA) (654dddb)
- v3.1,v3.2: ambiguity finding family + deterministic embedding graph/DAG (3d8ab3d)
- v3.3: bounded LTL→SMT temporal contradiction tier (in-process) (e714dc5)
- v3.4: generative-adversarial detection harness + extractor hardening (41899e1)
- v5-agents: AGENTS.md as a kernel projection, with a drift gate that checks BOTH halves (0a29f28)
- v5-budget: data.budgetHint, anchored on the run's OWN clock because a cost table did not survive measurement (75198c8)
- v5-check: the check op — donor pipeline through the Layer, +repair/+progress, exit contract wired (4f9f9f8)
- v5-core: doc store as Layers — atomic write, donor path precedence, disjoint load codes (58d242f)
- v5-core: document format v3 — stateModel + responseKind first-class, V27 unrepresentable (9d0cce9)
- v5-core: ONE op vocabulary and ONE mutation fold — repair.ops can now be real (e41d1ba)
- v5-craft: the authoring-craft corpus, with every claim measured against the live detectors (2ef4b47)
- v5-craft: the craft corpus learns the state model, with a transcript that was RUN not composed (c881853)
- v5-formal: transplant the formal tier + SolverService Layer — 4 files edited, 35 byte-identical (8059a68)
- v5-install: the install op, with all three V11 defects fixed and each fix independently falsifiable (801c8a5)
- v5-kernel: --pretty/--dense/--field as envelope post-processors, exit code untouchable (58741d6)
- v5-kernel: envelope + exit contract, ported as agent API not legacy (394f2da)
- v5-kernel: ERR_* catalog as 21 TaggedErrorClasses, tag IS the code (c65f6ef)
- v5-kernel: ops table + CLI/manifest/help projections, three ops end-to-end (a4c076f)
- v5-lint: transplant the GTWR catalog, publish all 75 codes, and close the oracle's SECOND blind spot (83d32b1)
- v5-ops: init/import/list/show — both hex-bonk docs round-trip exactly (aad6e5d)
- v5-ops: the twelve mutation ops, all folding ONE vocabulary through ONE fold (6202eb8)
- v5-parse: transplant the parse ladder + the
parseop — ONE proposedOps name, and a DONOR BUG fixed (ae23bc3) - v5-reach:
--reachability-timeout-ms, and the bound is the CANCELLABILITY mechanism (03763d3) - v5-reach: the reachability TIER in
check, and the worked fixture found a soundness bug (f40391a) - v5-reach: the Spacer Horn encoder, with polarity pinned and three real bugs found by measuring (6fc7d57)
- v5-reach: the vacuous-initial gate — an unsatisfiable Init makes every proof worthless, and the certificate check provably cannot see it (8c23e26)
- v5-repair: repair.ops become REAL, and the round trip PROVES AC-A-1 + AC-A-2 (4e09200)
- v5-semantic: the EmbedderService Layer — propose-only, fail-closed, and both oracle sides run it (27f93e2)
- v5-state: the state model becomes authorable, with the V14/V21 hazard closed at the FRONT DOOR (6d3f062)
- wave1: close seven verified honesty defects (169af27)
- wave2: close V6 temporal unsoundness, land reproduce-ops, z3 5.0.0 (22e0a04)
- wave2: unify the atomizer (AC-2-7), wire the gates that gated nothing (AC-2-8a) (4b11b8e)
Bug Fixes
- ci: decide the three undecided allowBuilds — a placeholder string is not a decision (6eaaa32)
- ci: let packageManager own the pnpm version — action-setup@v4 errors on a double pin (03fc3e2)
- install: Claude Code reads .claude/skills, not .agents/skills (fdd1f47)
- v5-budget: the hint divided by pairs IDENTIFIED, not solved — a real under-estimate the loaded suite caught (0a5a184)
- v5-explain: the code COUNT becomes a projection too — two surfaces still said 75 after G4 made it 80 (9d2b83f)