Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

PARTIAL values are lower bounds in Pulse and Debt without the subset proof Clutter now requires, and the derivation rewrites their cause

Aperta
#39 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 9 giorni

@drevendev ci sta già lavorando.

Dal 30/9/2026.

  • #53 di @drevendev — aperta

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
python
Ambito
backend, testing

Direzione di ricerca

Start with src/devostasis/vitals/pulse.py and _partial_lower_bound, then read src/devostasis/vitals/debt.py and normalize._derived; the issue also points to Clutter's observations.subset_count_problem as the existing proof check. Reproduce the listed cases with missing coverage and value_semantics=ESTIMATE, then inspect the accepted contracts and PROVENANCE.md for rule version decisions. Done means partial lower bounds require subset proof, provenance reasons and value-less partials are preserved correctly, and the release version question is recorded.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

for:researcher

Found by the review of 2026-09-30, while repairing PV-REV-PR-031-003 in #31.

What happens

The research review of #31 (run 408, PV-REV-PR-031-003, CLU-PARTIAL-TRUST-01..08) found that clutter.bands.v1 read any fresh value-bearing PARTIAL count as an observed subset on its status alone. #31 now repairs that for Clutter: the derivation declares a count over an incomplete inventory an OBSERVED_SUBSET_COUNT in its coverage, and Clutter admits a PARTIAL count as a floor only with that proof.

Two more Vitals make the same inference and were outside that review's scope:

  • Pulse (pulse.bands.v1, _partial_lower_bound in src/devostasis/vitals/pulse.py): a required input that is PARTIAL, fresh and value-bearing is a lower bound for the bounded inference of PV-PULSE-REQUIRED-LOWER-BOUND-001, which the accepted contract grants only "because a newest-first enumeration was capped".
  • Debt (src/devostasis/vitals/debt.py): a PARTIAL debt.items.open_count greater than zero is DEGRADED / PRESENT / CONSERVATIVE_LOWER_BOUND.

Neither looks at what the value is. Reproduced on the head of #31, where the proof now exists but is not asked for:

pulse  [no coverage at all]: STEADY DEGRADED CONSERVATIVE_LOWER_BOUND ['REQUIRED_INPUT_PARTIAL:git.default_branch.commits.count_28d:PAGINATION_CAPPED', ...]
debt   [no coverage at all]: PRESENT DEGRADED CONSERVATIVE_LOWER_BOUND ['PARTIAL_REGISTER:debt.items.open_count']
pulse  [value_semantics=ESTIMATE]: STEADY DEGRADED CONSERVATIVE_LOWER_BOUND [...]
debt   [value_semantics=ESTIMATE]: PRESENT DEGRADED CONSERVATIVE_LOWER_BOUND ['PARTIAL_REGISTER:debt.items.open_count']

A PARTIAL value that says outright it is an estimate is still a floor.

Two related provenance defects of normalize._derived, found by the same review:

  • the reason of a PARTIAL aggregate is replaced by SOURCE_COVERAGE_INCOMPLETE whatever the source said (PAGINATION_CAPPED, REQUEST_BUDGET_EXHAUSTED, a cause that is not a cap), so Pulse diagnoses REQUIRED_INPUT_PARTIAL:…:SOURCE_COVERAGE_INCOMPLETE and cannot tell the capped enumeration its contract covers from anything else;
  • a value-less PARTIAL inventory becomes an UNAVAILABLE aggregate, which means "the source does not exist": Clutter then reads the branch component as explicitly unavailable (COMPONENT_UNAVAILABLE:branches:REQUEST_BUDGET_EXHAUSTED) instead of unresolved.

Why it is not repaired in the release

On the live path nothing changes: every count observe derives from an incomplete inventory now carries the proof, so a live PARTIAL input to Pulse or Debt is always a proven subset. The difference is only for saved or hand-written observation sets. But pulse.bands.v1 has been released since 0.1.2, and whether a hardening that changes no live output moves the rule id (one RULE_VERSION_BOUNDARY per project in the fleet) is a question for the research side. Debt also has its own accepted repair pending (PV-DEBT-PARTIAL-001, #33) on the same branch of debt.py. The review PR does fix Debt's missing freshness check (a stale partial register was a PRESENT lower bound, which vitals.md never allowed).

Proposal

  • Apply the Clutter check (observations.subset_count_problem) to every PARTIAL value Pulse and Debt read as a lower bound, with the fail-closed outcome each Vital already has for an unusable input (Pulse: UNKNOWN for a required input; Debt: UNKNOWN).
  • Carry the source's reason onto a PARTIAL aggregate, and never turn a value-less PARTIAL source into UNAVAILABLE (a value-less PARTIAL, or ERROR).
  • Do the Debt part together with the PV-DEBT-PARTIAL-001 adoption of #33, so Debt's rule version moves once; give Horizon's accepted partial repair (PV-HORIZON-PARTIAL-001, #33) the same proof from the start.
  • For the research side: does a fail-closed check that changes no live output need a Pulse rule version? If not, record the judgement in PROVENANCE.md.

🤖 Generated with Claude Code

Lingua principale
Python
Stelle
4
Fork
1
Merge medio
5g 12h
PR unite (30g)
3

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di drevendev/Devostasis

Tutte le issue di drevendev/Devostasis

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.