Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .devostasis/targets.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
{
"id": "B3",
"title": "Durable revision history across bundles",
"state": "open"
"state": "closed"
},
{
"id": "B4",
Expand All @@ -45,6 +45,11 @@
{
"id": "v0.2",
"title": "Release 0.2: phases A and B closed, one outside consumer, no unadopted research unit",
"state": "closed"
},
{
"id": "v0.3",
"title": "Release 0.3: phases A and B closed, one outside consumer, no unadopted research unit (the bar 0.2.0 shipped before)",
"state": "open"
},
{
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/observe-self.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
# jobs:
# vitals:
# uses: drevendev/devostasis/.github/workflows/observe-self.yml@v0.1.9
# uses: drevendev/devostasis/.github/workflows/observe-self.yml@v0.2.0
# with:
# debt-labels: "type:debt"
#
Expand All @@ -24,7 +24,7 @@ on:
devostasis-ref:
description: Git ref of Devostasis to install (tag, branch or commit)
type: string
default: v0.1.9
default: v0.2.0
planning-source:
description: milestones, file or none
type: string
Expand Down
119 changes: 119 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,125 @@
All notable changes to this project are documented here. Semantic changes to a
contract or a policy always come with a version bump of that contract.

## 0.2.0 (2026-10-01)

The adoption release. Every accepted research contract about the Vitals and
their history that this repository had not adopted, and that needs no owner
decision, is adopted: the repairs of Direction, Horizon and Debt that issue
#33 listed, the final T9 reconciliation, and target B3, durable Integrity
revision history (`PV-HIST-002`, #34). The owner asked for a large next
release on 2026-09-30 (#47); the candidate specification written for that
request (`PV-RELEASE-020-001`, "Evidence Observatory") has not been accepted
yet, so 0.2.0 is the part of that ambition that rests on accepted contracts.
No threshold, window, gauge constant or demand mapping changed. Four rule ids
moved, each with the judgement that moved it, so the first 0.2.0 bundle of
every project compares `INCOMPARABLE` (`RULE_VERSION_BOUNDARY`) on Horizon,
Direction, Integrity and Debt and stays comparable on the rest.

- **Direction `direction.bands.v2`: state-neutral linkage, and incomplete
linkage without failing the project.** `PV-REV-DIRECTION-CLOSED-TARGET-001`
(cases `DIR-CLOSED-01..09`): an active change request linked to a declared
target stays linked when the target closes. Calibration finding 9 is
repaired: closing a delivered target used to un-link the work that
delivered it, so never closing targets kept the band higher than finishing
them. Measured on a copy of the fleet store: this repository reads `MIXED`,
9 of 18 active change requests traced to a declared target, where the
open-target count said 4 of 18, `SCATTERED`. That count is still derived,
for presentation only. `PV-DIRECTION-INCOMPLETE-001` (accepted by
`PV-REV-DIRECTION-INCOMPLETE-001`, cases `DIR-INCOMPLETE-01..16`): every
active change request is `LINKED`, `UNLINKED` or `UNRESOLVED`. A reference
the complete register lacks is a broken reference, unlinked and diagnosed
`DIRECTION_TARGET_REFERENCE_MISSING`; a reference nobody could resolve, or a
title, body or milestone of the wrong type, is unresolved. Over
`L + U + R = N` the completions `k = L..L+R` go through the unchanged
predicates: one reachable band is `DEGRADED / <band> / EXACT`, several are
`UNKNOWN` with the reachable set in `derived`. Unreadable linkage evidence no
longer fails the whole project: `LinkageEvidenceError` is gone, and a change
request names what it could not read in `linkage_unresolved`. A partial
target list no longer blocks Direction when every referenced target resolves
on its own, as a milestone embedded in the change request does.
- **Target markers are standalone tokens** (`PV-AUDIT-TARGET-MARKER-SYNTAX-001`).
`SubTarget: B1`, `NotTarget: B1` and `PreTarget:B1` linked their change
request to B1, because the configured marker was matched as a substring.
The marker now starts the text or follows a character that cannot continue
a word, and a marker ending in a letter needs a boundary after it too. The
audit's regressions `LINK-MARKER-01..08` reached this repository only as
categories; the tests cover each category and say so.
- **Horizon `horizon.bands.v2`: partial target enumeration**
(`PV-HORIZON-PARTIAL-001`, accepted by `PV-REV-HORIZON-PARTIAL-001`, cases
`HOR-PARTIAL-01..16`). A partial enumeration that returned a target proves
the capability; its counts are observed-subset lower bounds with the proof
#39 asked for; only an open target already beyond the frame forces a band,
`DEGRADED / EXTENDED / EXACT`. Every other partial shape stays `UNKNOWN`,
because Horizon declares no order to pick a representative by, and a
partial zero is never `UNDECLARED`.
- **Debt `debt.bands.v2`: partial register** (`PV-DEBT-PARTIAL-001`, accepted
by `PV-REV-DEBT-PARTIAL-001`, cases `DEBT-PARTIAL-01..16`). A confirmed open
item under a partial enumeration is `DEGRADED / PRESENT / EXACT`, the band
exact and the count a lower bound, none confirmed is `UNKNOWN`, and a
`PARTIAL` count is read as a lower bound only with its
`OBSERVED_SUBSET_COUNT` proof (the Debt part of #39). Before, a partial
positive count was `CONSERVATIVE_LOWER_BOUND` on its status alone, so an
estimate could prove `PRESENT`.
- **Integrity `integrity.bands.v1+ci-unit-004+hist-002`: durable revision
history** (`PV-HIST-002`, accepted by `PV-REV-HIST-002`, target B3). History
was reconstructed from whatever the provider still showed, so a failure
hidden behind a passing re-request of a check suite, or dropped by
retention, vanished from the counts. The union of every attempt observed per
parent per revision is now carried from bundle to bundle: a build adds its
immediate predecessor's union as `ci.revision_history_carried`, Integrity
merges it with what the provider shows now and emits the result as
`derived.revision_history`, on every path, so history also crosses a bundle
whose verification evidence could not be read. A missing, unverifiable,
foreign or later predecessor is an explicit gap (`REVISION_HISTORY_GAP`);
nothing older is ever carried in its place, and `verify` checks that the
source a bundle names is the bundle its manifest follows
(`HISTORY_SOURCE_MISMATCH`). Favorable evidence proves `PASS_ONLY_OBSERVED`
only when every attempt of every parent is observed, so a check-suite pass,
or a run whose earlier attempts are not all known, is `UNKNOWN_HISTORY`
(R52), and unknown history makes the Vital `UNKNOWN`: T9 puts it above every
conservative branch. On the stored corpus every active revision is
attempt-complete, so no fleet project loses its band to that rule. The first
0.2.0 bundle of a project replays the revision records of its 0.1.9
predecessor (lineage `devostasis.ci-history.v1`) instead of starting empty.
The band table and every 0.1.9 judgement are unchanged. Cases `HIST-01..07`,
`09..11`, `13`, `15`, `16` and `19` are vectors, `08`, `12`, `17`, `18` and
`20` store tests; `HIST-14` has no accepted migration to execute.
- **T9 is adopted** (`PV-TEST-004`, generator `PV-T9-GEN-003`, accepted by
`PV-REV-TEST-004`). With the repairs above, every obligation T9 consumes is
implemented; a finite generator of about 1,270 cells over the nine former
gap families holds each cell to the accepted table. The T9v2 cell-key
vectors are still the research process's to deliver.
- **Contradictory counts are refused as input.** Counts no population can
produce (`L + U + R != N`, a beyond-28-day count above the future-boundary
count) are `InadmissibleEvidence` before classification, as both totality
contracts require, and `evaluate` and `build` report an input error (exit
status 2) instead of a band.
- **The vector format learned two things.** `given.derive` runs the derivation
over stated inventories, so a case about how a change request becomes
linked, or how a partial target list is counted, is executed where that
happens; `expect.rejected` states a refusal (`HOR-PARTIAL-15`). Seventy-one
new vectors: `DIR-CLOSED`, `DIR-INCOMPLETE`, `HOR-PARTIAL`, `DEBT-PARTIAL`,
`HIST`.

Upgrading: the first 0.2.0 bundle of every project carries four
`RULE_VERSION_BOUNDARY` rows. Durable history starts from the predecessor's
in-window records; after the fleet's pause since 2026-09-10 (#32) none are
left, so the first carried history is effectively empty, and a project whose
predecessor kept no observations member starts with one explained gap. A
saved 0.1.x observation set under file planning recorded a reference outside
the register as `UNKNOWN`; replayed, that change request is unresolved rather
than unlinked, and a fresh observation tells the two apart. The change-request
record gains `linkage_unresolved` and the reference state `MISSING`; the
revision record gains `history_complete`. The snapshot carries the durable
history, stored grouped by parent shape: 91 KB for the busiest project of the
fleet, whose 834 dispatched workflow runs in two weeks #40 already asks about.

Not in this release: the fifth identity move (#19, the owner's decision), the
Phase C contracts of #34 (after B7 and the compatibility policy), the Pulse
part of #39 (a question for the research side), and the "Evidence
Observatory" candidate of #47, which awaits its review.

## 0.1.9 (2026-09-30)

Four things in one release. First, the adoption of the research judgements
Expand Down
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,10 @@ Devostasis is built against those failures:
configuration or provider access.
- **Anti-gaming rules are part of the contract.** A revision that failed
verification keeps its failure in the history window even if a retry later
passes. A zero queue is not "good flow". Full milestone linkage is a fact,
not a compliment.
passes, and even after the provider stops showing the failed attempt: the
history is carried from one bundle to the next. Closing the target a change
delivered does not un-link the change. A zero queue is not "good flow".
Full milestone linkage is a fact, not a compliment.

## The seven Vitals

Expand Down Expand Up @@ -153,7 +155,7 @@ comes first is the consumer's policy, and no accepted contract defines it.
Requires Python 3.12 or newer. The runtime uses the standard library only.

```bash
pip install git+https://github.com/drevendev/devostasis@v0.1.9
pip install git+https://github.com/drevendev/devostasis@v0.2.0
```

Observe one repository (a GitHub token is read from `DEVOSTASIS_GITHUB_TOKEN`,
Expand Down Expand Up @@ -212,7 +214,7 @@ permissions:

jobs:
vitals:
uses: drevendev/devostasis/.github/workflows/observe-self.yml@v0.1.9
uses: drevendev/devostasis/.github/workflows/observe-self.yml@v0.2.0
decide:
needs: vitals
runs-on: ubuntu-latest
Expand Down
Loading
Loading