Skip to content

feat(framework): redact again on the upload path #655

Description

@blafourcade

Outcome

Per-step attribution is available without any prompt, command or tool input leaving the machine.

Scope

This exists because of a measured trade with no upstream setting to resolve it.

Per-step cost requires OTEL_LOG_TOOL_DETAILS=1, which is what makes skill_activated carry the real skill name instead of a placeholder. That flag is not selective: it also logs Bash commands, MCP tool names and tool inputs. There is no vendor option that separates the skill name from the rest.

Dropping those attributes before anything is stored is therefore the only place the separation can occur.

  • Includes: an ingest-time attribute allowlist — what is kept is enumerated, never what is dropped.
  • Includes: the same filter applied before upload, not only before local storage.
  • Includes: a verifiable assertion that redacted attributes never reach disk.
  • Excludes: any attempt to redact after storage. Data that landed is data that leaked.

Done When

  • A session run with the flag on stores no Bash command and no tool input, asserted on the stored payload.
  • The allowlist is enumerated in one place, and an attribute absent from it is dropped by default.
  • Adding a new attribute to the allowlist is a reviewed change, not a configuration accident.
  • The upload path applies the same filter, verified independently of the storage path.

Relations

Field Value
depends_on #647
parent #652

Activity

  1. added this to the milestone on Aug 14, 2026
  2. added theissue type on Aug 14, 2026
  3. blafourcade commented on Aug 15, 2026

    @blafourcade
    ContributorAuthor

    Re-scoped, 2026-08-15

    Ingest-time redaction moved to #647, which owns the sink and is where the separation physically happens. Keeping the allowlist here created a loop: #647 could not satisfy its own criterion without a definition this issue held.

    This issue is now the upload path only — a different boundary, and a stricter one. What may sit on a developer's own disk is not what may leave their machine, and the two lists should be allowed to differ. Applying the ingest list by default and requiring an explicit widening for upload is the shape to aim for.

  4. changed the title [-]feat(framework): redact tool inputs before anything is stored[/-] [+]feat(framework): redact again on the upload path[/+] on Aug 15, 2026
  5. blafourcade commented on Aug 28, 2026

    @blafourcade
    ContributorAuthor

    Premise stale

    Found by a backlog audit on 2026-08-28. This issue argues from "per-step cost requires OTEL_LOG_TOOL_DETAILS=1". That is no longer how per-step cost is obtained — cli/src/domain/tools/ai/claude-telemetry.ts:59 states it plainly: "Per-step cost comes from the run journal, not from this export."

    The ingest allowlist this issue scopes also already ships (telemetry-sink-record.ts:133, fifteen fields, with user.id, prompt and response deliberately excluded).

    Worth re-reading before any work starts here: what remains may be nothing, and the body no longer says.

  6. blafourcade commented on Aug 31, 2026

    @blafourcade
    ContributorAuthor

    Closing — it redacts a path that no longer exists

    This issue asks for redaction on the upload path. There is no upload path. The OTLP export route was deleted: nothing in the system opens a port or writes a destination into a tool's settings, and grep -rn "OTEL_LOG_TOOL_DETAILS|skill_activated" over cli/src, plugins, docs and aidd_docs returns nothing — the attributes it argues about are not produced anywhere.

    Storage-side redaction, the half that was real, already holds. The record contract in aidd_docs/product/metrics-contract.md is a closed allowlist, verified against every stored record on the machine that built this: 20 flat scalar keys, no prompt, no code, no diff.

    The remaining clause — the same filter applied before anything leaves — moves to #662, which is where sending is now designed. It is not lost; it becomes a condition of the thing that will actually send, rather than a separate issue about a path that was removed.

    Closed rather than rewritten: an issue whose subject was deleted is not a smaller version of itself.

  7. moved this from Ideation to Done in AIDD Roadmapon Aug 31, 2026
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

    Fields

    Priority

    Low

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions