fix(mtconnect): an unanswered write degrades; one success writer for reads and writes (review I-3, m7)
Coordinator ruling on F3: a write with no reply (transport failure / deadline) sets Degraded with the stamp preserved and a type-only LastError, through a new _writeDegraded flag folded into PublishHealthy. One success writer is shared: RecordReadAnswered (a /current answer, an Agent refusal, a live-index read) clears the read AND write degradations; RecordWriteAnswered clears the write one; neither clears the other path's stream degradation. Tests both directions (answered write clears it, good read clears it) plus the converse (an answered write does not clear a failed read); red with each half removed. m7: a good /current resets the refusal-dedup latch, so a refusal recurring after a recovery is logged again (tested). Refs #743 Claude-Session: https://claude.ai/code/session_01Ub9hGmYLQvn9XETzw7CMsT
This commit is contained in:
@@ -429,8 +429,12 @@ different `level|text` wire format, and are out of scope for v1.
|
||||
`DriverHealth.LastError`, which is type-only by repo-wide discipline. A refused write is not
|
||||
evidence the read path degraded, but it **is** the Agent answering: any answer — accepted or
|
||||
refused — advances `LastSuccessfulRead`, with the state following the read / `/sample` flags
|
||||
(a write cannot clear either path's degradation). A write that got **no** answer leaves health
|
||||
to those two paths, which own liveness.
|
||||
(a write cannot clear either of those paths' degradation). A write that got **no** answer
|
||||
(transport failure, deadline) sets **Degraded** with the stamp preserved and a type-only
|
||||
`LastError` (review 2026-10-21 I-3, coordinator ruling). One success writer is shared: that
|
||||
degradation is cleared by the next answered **write** or the next good **read** (a `/current`
|
||||
answer or a live-index read), so it cannot stick on a driver still talking to the Agent; a
|
||||
`/sample` chunk alone does not clear it.
|
||||
|
||||
**One request per device (review 2026-10-21 T-6).** The slots that survive the refusals above
|
||||
go out as one `POST {agent}/{device}?id1=v1&id2=v2…` per device (the Agent's PUT surface takes
|
||||
|
||||
Reference in New Issue
Block a user