From 5e9b104f34096d218c0164b0e84c8581bf43e933 Mon Sep 17 00:00:00 2001 From: junixlabs Date: Sat, 12 Sep 2026 02:40:58 +0700 Subject: [PATCH] v0.3: the release that stopped guessing --- CHANGELOG.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- pyproject.toml | 2 +- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6000f7f..beb8721 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,61 @@ # Changelog +## v0.3 — 2026-09-12 + +The release that stopped guessing. Two questions that had governed the roadmap were +measured, three defects an outside user would hit on day one were fixed, and two +false-decay bugs in the week-old extractor were found by the mechanism auditing itself. + +### Measured + +- **What it costs to keep a model current (#10).** Unit: a *re-observation* — a reference + a change invalidated that someone must open and read. Median **11.5 before** + symbol-granular decay, **3.0 after**; a change used to force re-reading ~88% of the + model's references and now forces ~19%. Caveat kept in the open: n=7 after, one + repository, one author who wrote both the model and the code. +- **Whether four impact tiers survive a dense graph (#5).** They do — and the opposite of + the hypothesis. Across synthetic graphs from 61 to 1,201 entities a change reaches a + median 15% down to 5%. They collapse on *small dense* models: 56–61% on the two + reference models. `impact()` now reports `share_reached` and prints **DID NOT + DISCRIMINATE** above 50%, which is a fact about the model rather than a finding about + the change. + +### Fixed — first run + +- **Ids use hyphens, keys use underscores (#41).** The validator printed a regex; it now + says the rule. That misunderstanding cost an outside user 22 errors. +- **Five assertions on one subject produced ten errors and an INVALID model (#40).** + Nothing reads a claim, so "different string" was standing in for "incompatible + proposition". `CONTRADICTION` now requires observations that actually disagree; + differently-worded assertions on one subject raise one `SUBJECT_NOT_DISCRIMINATING` + warning. Measured on the reported case: 10 errors → 1 warning, INVALID → VALID. +- **`integrity: UNCERTAIN` with no reason.** A clean-install walkthrough ended on a verdict + that said something was wrong and nothing about what. The verdict now carries why. + +### Fixed — the extractor shipped a day earlier + +- **`git log -L` reports a symbol's range at the last commit that touched it, not at + HEAD.** A 111-line insertion moved a function from line 717 to 747 and the hash was taken + over the wrong 68 lines. Now `git blame -L : `. +- **git's funcname block includes the blank lines after a symbol**, so adding a function + after one read as an edit to it. Trailing blanks are dropped before hashing. + +Both were false positives in the safe direction. Both were still wrong: a checker that +cries wolf is discharged by rubber stamp. + +### Modelled + +`examples/traceos-itself` gained `flow.account` — the Intent and Outcome layers v0.2 +shipped and did not model. INV-023 maps *files*, and the engine file was already mapped, so +the gate never noticed (#51). Six flows, sixteen assertions, 47 evidence locators. + +### Known and deliberate + +Still unproven: ADR-015's kill condition — three real incidents, would this have caught any +before they became one — has not been run. Still open and not closeable by code: no +mechanism here detects a claim that is simply *wrong* (#42, #45), and the coverage ratchet +is unusable as a gate on a repository whose churn is not the model (#43). + ## v0.2 — 2026-09-12 Behavior becomes accountable in two directions: back to the decision that asked for it, diff --git a/README.md b/README.md index 446377e..f7e2c28 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ traceos/explore.py the HTML view traceos/site.py the Pages site, built from the models traceos/cli.py command line: init, observe, validate, resolve, impact, diff, coverage, explore -tests/run_tests.py 13 stress cases, 9 invariants, 16 tooling groups +tests/run_tests.py 13 stress cases, 12 invariants, 16 tooling groups ``` ## Status diff --git a/pyproject.toml b/pyproject.toml index 95d2ca6..11adbf2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "traceos" -version = "0.2.0" +version = "0.3.0" description = "A semantic reasoning framework that lets AI agents trace semantic impact before a change and reconcile the model with reality after it" readme = "README.md" license = { file = "LICENSE" }