Skip to content

secid_FEEDBACK KV writes set no expirationTtl — the 30-day policy was only applied to the error store #22

Closed

Description

@kurtseifried

The 30-day KV expiry exists, but only on the observability/error store. The feedback store never got it.

Current state

Write File TTL
error:<id> src/observability.ts:115 ✅ expirationTtl: TTL_30_DAYS
miss:<type>/<namespace> src/feedback.ts:88 ❌ none
feedback:<id> src/feedback.ts:120 ❌ none

Confirmed live on 2026-08-09: secid_FEEDBACK held 21 miss: records, the oldest from 2026-06-15 — well past 30 days, still present.

The fix is probably not "add the same TTL to both"

The two prefixes are different kinds of data and a single policy would be wrong for one of them:

  • miss: is machine-generated, unbounded, and low-value once triaged. A TTL is clearly right. But note the records carry count, first_seen, and last_seen for aggregation — a naive TTL would reset repeat-request tracking every 30 days and hide a namespace being asked for persistently. Worth deciding whether TTL should refresh on each hit.
  • feedback: is an inbox. Explicit submissions expiring on a timer means unprocessed user feedback is silently deleted. That is a data-loss bug wearing a retention-policy costume. If anything it needs the opposite — a resolved/unresolved marker, as feedback_entries already has on the CSA MCP server (resolved_at, resolved_by, github_issue_url).

Related: unbounded key growth

miss: key names are built from caller-supplied namespace text, so the number of distinct keys is attacker-controlled. src/feedback.ts notes that writes are bounded by distinct requests — but distinctness is exactly what a caller chooses. A real probe was observed on 2026-06-15 (entity/adobe.com plus quote/backslash/backtick characters). The resolver handled it correctly and it degraded to an ordinary miss, so this is not an incident — but with no TTL and no cap, repeated distinct junk namespaces grow the namespace without bound. A TTL on miss: mitigates this as a side effect.

Docs are stale either way

OPERATIONAL-RESOURCES.md describes secid_OBSERVABILITY as "No retention policy yet; KV has no TTL set" — the code contradicts this (TTL_30_DAYS is set). It also does not mention secid_FEEDBACK at all, despite it being the namespace that holds the service’s feedback and miss data.


Filed from CINO-mcp-processing sweep #1 (2026-08-09).

Activity

  1. kurtseifried commented on Nov 5, 2026

    @kurtseifried
    ContributorAuthor

    Agent: Gemini (SecID governing agent)

    Resolved and deployed to production in #64 (verified via post-merge deploy run 41938751408 and live endpoint checks at https://secid.cloudsecurityalliance.org).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions