Repository navigation
Releases: electrohire/applied-epistemic-engineering
Release list
v1.5.3
Standalone agent skill, clarified CLI/agent/Spec Kit guides, input fuzzing and corrected documentation rendering. Scoring semantics remain methodology 2.0 and lexicon 1.0.
Changed
- Group documentation navigation into short tabs so every section remains
accessible at desktop widths. Explain the independent scoring methodology
and lexicon versions without relabeling historical assessments. - Enable Mermaid diagrams in the documentation so flowcharts render rather
than appearing as code blocks. - Add a ClusterFuzzLite/Atheris input-boundary fuzz target and share its corpus
with regression tests across Linux, macOS, and Windows. - Add a standalone agent skill to the engine package source and document CLI,
direct-agent, and Spec Kit skill workflows. Remove retired scaffold migration
and porting pages from the current documentation. - Distinguish the PyPI distribution, Python module, engine CLI, and Spec Kit
extension IDs; explain bounded verification, certification limits, and why
GitHub/RTD development docs can differ from released PyPI metadata. - Refresh this repository's own Spec Kit, AEE, and evaluator setup.
Validation: full Linux/macOS/Windows × Python 3.11/3.12/3.13 CI, CodeQL, dependency review, strict documentation build and ClusterFuzzLite passed before release. OpenSSF Best Practices assessment remains 97% (in progress), not a Passing badge.
aee 1.5.2 — Spec Kit install example pins spec-kit-aee 1.5.1
Released 2026-10-15. Documentation only: engine behavior, scoring, and methodology_version are unchanged from 1.5.1.
Changed
-
The Spec Kit install example in the README (this PyPI page), quickstart, Spec Kit integration, and migration docs now pins spec-kit-aee 1.5.1, the tested extension release with the
draft-claimssetup fix. It previously pinned 1.5.0. The text presents it as a pinned example of an independently versioned extension and links its releases.specify extension add aee --from https://github.com/electrohire/spec-kit-aee/archive/refs/tags/v1.5.1.zip
The engine requirement the extension declares stays
applied-epistemic-engineering>=1.5.0,<2, so its automatic install resolves the latest compatible engine.
Install
pip install applied-epistemic-engineering==1.5.2Testing
- CI on the release commit
e1ad2a9passed: quality checks and the test suite on Ubuntu, Windows, and macOS × Python 3.11, 3.12, and 3.13 (run 38792117327). - Locally,
twine check --strictpassed on both distributions, and the wheel installed in a clean Python 3.11 environment reportsaee 1.5.2.
Full changes: #46 (closes #45). Prepared with Claude Code (autonomous) on behalf of @tbitcs.
aee 1.5.1 — install, platform, and Spec Kit documentation
Released 2026-10-15. Documentation and package metadata only: engine behavior, scoring, and methodology_version are unchanged from 1.5.0.
Changed
-
README (this PyPI page) and quickstart now state the supported platforms: Linux, macOS, and Windows with Python 3.11, 3.12, and 3.13. They also explain that Spec Kit users install the
spec-kit-aeeextension, which installs a compatible engine (>=1.5.0,<2, the latest available) automatically:specify extension add aee --from https://github.com/electrohire/spec-kit-aee/archive/refs/tags/v1.5.0.zip
spec-kit-aeeis a Spec Kit extension distributed as a GitHub release archive, not a PyPI package, and it is versioned independently. -
docs/spec-kit.mddocuments the one-command install and what the extension installs automatically.docs/migration.mdno longer tells Spec Kit users to install the two extensions by hand. -
docs/versioning.md: the extension's engine floor is>=1.5.0,<2(it said>=1.4.0,<2). Catalog updates now follow Spec Kit's current procedure: a new Extension Submission issue after each tested release, never a direct catalog PR. -
Added the
Operating System :: OS Independentclassifier.
Fixed
- The README's documentation links were relative and broke on PyPI; they are now absolute.
Install
pip install applied-epistemic-engineering==1.5.1Testing
- CI on the release commit
4a2ab91passed: quality checks (ruff, mypy, mkdocs strict, build, install, demo) and the test suite on Ubuntu, Windows, and macOS × Python 3.11, 3.12, and 3.13 (run 38787780091). - Locally,
twine check --strictpassed on both distributions, and the wheel installed in a clean Python 3.11 environment reportsaee 1.5.1.
Full changes: #44 (closes #43). Prepared with Claude Code (autonomous) on behalf of @tbitcs.
aee 1.5.0 — claims carry a maturity stage; reports separate machine checks from human acceptance
Applied Epistemic Engineering (AEE) checks a set of claims against the evidence offered for them and reports, claim by claim, how much that evidence actually supports. Version 1.5.0 is the largest change since the first release: a claim's maturity is now tracked explicitly, and several ways a weak claim set could look stronger than it is have been closed.
Claims now carry a stage. Every claim sits at one of five stages — created, checked, explained, accepted, digested. Checking a claim (running the evidence) only moves it to "checked". It cannot be reported as fully supported until people have explained it in their own words and accepted it. Support that comes only from machines (test results and other automatic checks) can never, by itself, move a claim past "checked".
Two lanes, reported separately. Machine verification is fast; human understanding is slow. Assessments now report the two side by side, and the human lane is reported as a state ("how far has this claim got with people?"), never blended into the machine score. Every verdict also states, in a field called not_understood, what remains not understood about the claim.
Credit only counts when it is anchored. A source builds a track record only from observations recorded in the project's tamper-evident ledger — a record the engine can re-verify. A source that simply asserts its own good history gets provisional credit only: capped, labelled as provisional, and never blended into scores.
Ways to look stronger than you are, closed. An empty claim set can no longer "pass". Repeated copies of the same evidence no longer multiply its weight. The release gate recomputes the verdict from the record instead of trusting the file's own claim. Scores are stored unrounded, so a value just below the pass threshold can no longer round up into a pass.
Also in this release: external anchoring of assessment fingerprints (aee anchor, optional), evidence files that escape the project folder through symbolic links are refused by name, the evaluator results contract carries the new stage and lane information, and the full change record — including a plain statement of what was fixed after an adversarial review of the engine — is in CHANGELOG.md.
One known limit, stated plainly: the contradiction check catches direct negations, but it can miss a contradiction where the same point is rewritten in completely different words. This limit is recorded in the release's own spec files rather than hidden.
v1.4.0
CLI wiring for the ported mechanisms — the surface the Spec Kit extension drives.
- aee assess --policy (with --min-independent-sources / --contested-threshold) attaches the policy gates; --reliability <table.json> (--reliability-alpha) blends measured per-source reliability into scoring.
- New aee review subcommand: diffs two serialized assessments into the materiality review queue.
- Fix: the abstain outcome now exits 1 (soft verdict) instead of 2 (hard block/error), per the documented exit-code contract.
118 tests, all green.
v1.3.0
Slice 3 of the epistemic-ledger port, completing the three ported mechanisms (docs/porting-from-epistemic-ledger.md).
- aee.review.build_review_queue(previous, current, materiality=0.05, limit=None): diffs two assessments into the bounded list a reviewer owes attention — propagated-score moves ≥ materiality (largest first, top-k budget), policy verdict flips, added/removed claims, with before/after scores and confidence bands.
- The 0.05 default is the ledger's validated hysteresis point (CHURN-01 / TRIGGER-STRESS-01).
110 tests, all green.
v1.2.0
Slice 2 of the epistemic-ledger port: per-source reliability learned from resolved claims.
- aee.reliability.ReliabilityTable: (propagated score, outcome) per source_id; measured reliability = 1 − Brier, gated by min_observations (default 3) as a cold-start guard. observe_claim credits resolved claims to their distinct supporting sources. Serializable.
- ScoringEngine(reliability=table, reliability_alpha=0.5) — forwarded by AEEEngine — blends a supporting source's static SourceQuality weight toward its measured reliability; substitutions are noted on each score. Contradictions keep static weights.
- No table → scoring bit-identical to 1.1.0. 102 tests, all green.
v1.1.0
Assessment policy gates ported from the epistemic-ledger program (see docs/porting-from-epistemic-ledger.md for the full transfer map).
- aee.policy: opt-in AssessmentPolicy on AEEEngine; per-claim verdicts ACCEPT / CHALLENGE / ABSTAIN with reasons.
- Corroboration gate: fewer than 2 independent supporting sources → CHALLENGE.
- Forced abstention: no supporting evidence, or model self-attestation only → ABSTAIN.
- Contested gate: contradiction penalty ≥ 0.25 → CHALLENGE at best.
- ABSTAIN present → outcome 'abstain' instead of 'pass'; CHALLENGE present → 'iterate'.
- No policy → behavior unchanged. 92 tests, all green.
v1.0.4 — Applied Epistemic Engineering
[1.0.4] - 2026-10-02
Fixed
- Mermaid rendering no longer merges distinct claims: node IDs are encoded injectively (
A-BandA_Bpreviously both becameC_A_B), and labels escape double quotes as"entities and flatten newlines instead of only rewriting quotes in the claim text while interpolating the ID raw. load_claimsrefuses a JSON object without aclaimskey (previously it silently loaded an empty claim set and produced a vacuous assessment), and markdowndepends_onrefs are uppercased to match the uppercased claim IDs (a lowercase ref previously never resolved).- Ledger appends are O(1) after the first verification instead of O(n) each (O(n²) over a session): appends trust a verified-tip cache keyed on the file's size and mtime, and any external change forces a full
verify()before the next append. Chain semantics and the append lock are unchanged.
Documentation
- The mutation contracts are now stated where they happen:
StressTester.runreplaces each claim'sfailureslist wholesale (carried-in failures are not preserved), andScoringEngine.scoreoverwritesclaim.confidencewith the propagated score. Both behaviors are pinned by tests.
v1.0.3 — Applied Epistemic Engineering
[1.0.3] - 2026-10-02
Fixed
- Gap preservation is keyed on the stable
test_id, not the positionalGAP-XXXID: inserting, deleting, or reordering a matrix row no longer moves a preserved closure onto a different test. The register format gains aTestcolumn; legacy registers without it still parse and preserve by ID. - Documented gap statuses
in_progressandblockedsurvive a load/regenerate cycle; the register parser previously reset every open row toopen. aee gaps --closeon a nonexistent gap ID is now an error (exit 2).close_gapraisesKeyError; previously it silently succeeded.- CLI error contract: malformed input, invalid enum values, out-of-range thresholds, and unsupported phases now exit
2with a clean message instead of a traceback with exit1— a code the README defines as a soft outcome, so crashes were indistinguishable from legitimate soft verdicts in CI. - Corrupt evidence JSON files produce a stderr warning instead of being silently treated as "no evidence".
- Failure IDs are unique per failure instance: the same challenge firing against several peers previously produced identical IDs, colliding recovery proposals and evaluator findings.
ClaimGraph.cycles()is iterative; dependency chains beyond ~1,000 claims no longer raiseRecursionErrorinsideassess().- Cyclic dependency graphs now record "propagation skipped" on the affected scores instead of silently leaving them uncapped.
HashChainLedger.append()takes an advisory file lock around verify+append so concurrent appends cannot fork the chain;entries()reports corruption as aValueErrornaming the line, agreeing withverify().
Added
ScoringEngine.score(..., as_of=...)andAEEEngine.assess(..., as_of=...): pin the instant freshness is judged against, making assessments replayable. Previously the freshness penalty read the wall clock, so identical input scored differently on different days. Unparseableobserved_atvalues are now noted on the score instead of silently skipped.--versionreads the package__version__(single source) instead of a third hardcoded copy.
Changed
- Bump version
1.0.2->1.0.3. - Tests: 59 -> 72 passed (gap identity/status/close/evidence regressions, CLI exit contract, freshness pinning, deep-graph, failure-ID uniqueness, ledger lock/corruption).