Skip to content

Analysis feed B4: entitlement visibility — a lapse must not read as market quiet #575

Description

@eaitbrahim

Phase B · PRD §4.4, SRD §5. Blocked by #574.

The counterpart built entitlement.paid_through and entitlement.grace into every frame specifically so an unattended subscriber can see its own expiry rather than meet it as unexplained silence. keel should use that.

The failure mode this prevents

A lapsed entitlement does not error. The frames keep arriving — they just lose the signal block, so every one drops for "no ticker" and the shortlist comes back empty. An empty shortlist looks exactly like a quiet market. An operator could go a fortnight reading "no candidates" as "nothing is happening".

Surface it three places

  • keel analysis status — last-seen entitlement, paid_through, grace, and the age of the last frame
  • keel status — one line, only when a feed is configured, in the same shape as the withdrawal attestation's expiry line. That is the existing precedent for "a credential with a clock on it" and this should not invent a second vocabulary.
  • The browser's Status view — through the existing payload.moment / flag helpers. No new display vocabulary.

Absent configuration, none of this appears. A deployment that does not subscribe sees nothing new anywhere.

Fail-closed, everywhere

Unreachable feed, stale frames, lapsed entitlement — all degrade to no analysis input and normal keel behaviour. Never block, never retry into the trading loop, never treat a stale assessment as fresh (PRD §4.4).

Done when

  • keel analysis status prints entitlement and last-frame age
  • keel status gains exactly one line when configured, zero when not — with a test for the zero case
  • The Status view renders it via existing helpers; no new JS vocabulary
  • A test covers "entitlement lapsed": frames arrive without signal, the report says so and names paid_through, rather than reporting a quiet feed

Metadata

Metadata

Assignees

Labels

featureNew capability (groups under Features)

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions