Skip to content

task(atlas): classification revalidation scan — verify nothing sensitive sits at the wrong tier #6021

Open

Description

@dezren39

Parent: #6018 (Atlas ingestion program). Statement S6 of the 2026-11-04 brief. This is a task to execute, not only a design.

Task (Drew, in substance)

Revalidate that there is nothing sensitive in the wrong classification level. Atlas is tiered — internal (28 shards / 107,001 chunks) vs secret (exactly 1 shard / 638 chunks), with the standing rule that secret material exists ONLY in the 2 secret DBs. Corpus growth since the tiers were established (shard restoration 2026-11-04: 31 new TursoDB shards, all counts verified) makes a fresh, deliberate revalidation pass necessary: ingestion has many sources, and a single mis-tiered secret in an internal shard is the failure this task exists to catch.

Scope

  • Sweep the internal tier for secret-class content: credential-shaped strings, private keys/tokens, personal/financial/medical details, anything matching the secret tier's inclusion profile. Combine pattern scanning with a classifier pass over samples + over chunks nearest the secret tier's content profile (vector-neighborhood check: internal chunks embedding-close to secret chunks get human/agent review).
  • Verify the converse boundary: secret-tier contents are actually secret-class (no large volumes of mundane content inflating the most-protected tier), and confirm secret material exists in exactly the 2 secret DBs and nowhere else (including the production libSQL monolith and local replicas/caches).
  • Check the staging path (#5669) and recent ingestion runs for tier-assignment mistakes: which source classes fed each tier, and does any source class straddle tiers without a rule?
  • Relate findings to the classification manifest work (#5410) — the manifest is the natural home for the per-source tier rules this scan validates against.

Handling rules

  • Findings are handled at the SECRET tier's sensitivity: the report names counts, classes, and locations (DB + chunk IDs), never reproduces secret content in this issue, chat, or logs.
  • Any confirmed mis-tiered chunk gets a remediation path (move + re-embed at the correct tier, purge from the wrong tier incl. replicas) filed as a follow-on before this task closes.

Done looks like

A dated revalidation report (counts scanned per tier, methods, findings by class, remediations filed/done) linked from this issue, and a recommendation on recurrence (one-off vs folded into the ingestion-operations design under #6018 as a standing gate).

Activity

  1. developing-today commented on Nov 5, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    Research design for this scan: three layers, quarantine-upward, enforced at fan-out

    Cluster 5 gives this task its method. The scan layers by cost:

    1. Deterministic secret scan, full corpus, both tiers — gitleaks-class rules (MIT, fully local, rule/stopword tuning expected per corpus). Catches the catastrophic class (live credentials) fast — these tools scan GB-scale histories.
    2. PII NER, scoped — Microsoft Presidio (MIT): full pass over the internal tier (where a leak does damage; internal is the broadly-queried tier), sampled pass over the secret tier (PII is expected there; the question is calibration). Checksum-backed recognizers (cards, IBAN) are the reliable tier; name/org NER needs context words and carries FP risk.
    3. Personal-inventory pattern pack (highest precision, unique to a personal corpus) — Drew's own addresses, family names, phone, ID/account fragments as detectors; any internal-tier hit is HIGH severity. Filed as #6049.

    Plus a sampled human audit per round to estimate the scanners' miss rate instead of assuming it.

    trufflehog warning (decision record filed as #6050): trufflehog is AGPL-3.0 — it collides with Drew's 2026-10-24 adoption hard filter ("NOT AGPL, NOT GPL") — and its verification mode is on by default and sends candidate secrets to vendor APIs, which inside a secret-tier scan would exfiltrate the very material being hunted. Gitleaks-first; trufflehog only --no-verification, if ever.

    Handling: findings go to a quarantine state — tier-locked upward (treated as secret until cleared), never silently deleted — with rule + context attached for review; allowlists carry reasons and expiry (a stale allowlist is how leaks get grandfathered). Redact-and-forget is a dead end: a confirmed live credential also emits a rotation task for its owner. And the boundary this task verifies must be enforced at fan-out, pre-merge — a tier label in a metadata column is advisory; a secret-tier chunk must be structurally unreturnable to an internal-tier query, including via rescore and via span-join reconstruction (conservative rule for spans reused across versions: span tier = max tier of its source contexts — design decision flagged for the follow-ups). This corpus is known to contain at least one real instance of the failure class (a pasted third-party API key found in the conversation corpus by an earlier gap pass).

    Wave-2 children filed under this issue

    • #6048 — tier scoping, cost, FP review queue
    • #6049 — layer 3, stored at secret tier only
    • #6050 — AGPL + verification-exfiltration ruling
    • #6051 — rule-triggered rescans, sampled audits, allowlist expiry

    — Wave-2 research fold-in, 2026-11-04 (prior-art doc: ~/workspace/scratch/atlas-ingestion-brief-2026-11-04/prior-art-research.md)

  3. added
    queue/queuedHas a queued task in the Supabase agent queue
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 5, 2026
  4. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    Triage outcome — task 10388 (2026-11-05, lane code-p)

    Verdict: CONFIRMED as an execution task — method already designed (Drew's 2026-11-05 research fold-in); the executable first wave is routed now, the dependent layers stay sequenced behind their wave-2 children.

    Fresh verification (2026-11-05): issue #6021 OPEN, labels task/triage + queue/queued + area/infra + kind/enhancement — no hard-stop labels. Parent programme #6018 OPEN; staging-path #5669 OPEN; manifest relation #5410 was triaged earlier today (task 10035) with its design task enqueued. Wave-2 children all OPEN: #6048 (Presidio NER pass design), #6049 (personal-inventory pattern pack), #6050 (trufflehog AGPL/verification ruling), #6051 (revalidation cadence design). No scan has been executed yet and no revalidation report exists — searches return only this issue family.

    What can execute now vs. what is sequenced:

    Handling rules restated for the executing worker (from the issue + fold-in, non-negotiable):

    • Findings are reported as counts, classes, and locations (DB + chunk IDs) only — never secret content in the issue, chat, logs, queue results, or the report.
    • Hits go to a quarantine state, tier-locked upward (treated as secret until cleared), never silently deleted; allowlist entries carry reasons and expiry.
    • A confirmed mis-tiered chunk gets a remediation follow-on filed before this issue closes (move + re-embed at correct tier, purge from wrong tier incl. replicas); a confirmed live credential additionally emits a rotation task.
    • The scan runs where the corpus lives (the laptop); any findings artifact is stored with secret-tier handling.

    Routing: execution follow-up enqueued for Layer 1 + boundary verification, ending in the dated revalidation report (counts scanned per tier, methods, findings by class, remediations filed) linked from this issue. Layers 2–3 execute under #6048/#6049 when those settle; this issue stays open as the tracker until the full done-criteria are met.

    agent-note:v1
    {"kind": "triage", "task": 10388, "issue": 6021, "state": "done", "outcome": "confirmed_execution_routed_layer1", "evidence": "parent #6018 and #5669 OPEN; wave-2 children #6048-#6051 all OPEN; no scan executed or report exists; method fixed by 2026-11-05 research fold-in on the issue"}

  5. added
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 5, 2026
  6. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  7. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    on Nov 5, 2026
  8. 97 remaining items

  9. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 6, 2026
  10. dezren39 commented on Nov 6, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked

    • Agent: queue worker (repo-worker-code), OpenChamber scheduled lane 262eb403-3347-4a7c-ba6b-e7bc263ca853
    • Task: 10513; parked for the scheduled-lane run budget, delay 20 minutes.
    • Verified metadata: 28 internal shard DBs contain 107,001 chunks; two secret DBs are present (secret-main-01: 638 chunks; secret-content: 564 messages). The production atlas monolith contains 107,639 chunks, including 638 rows labeled secret-bearing; this is a boundary discrepancy to validate with the required content scan, not yet a content-level finding.
    • Resume: use checkpoint stage reproduced, branch queue/10513-6021-atlas-tier-scan, worktree /home/user/git/fleet/10513. Run the full local deterministic scan across both tiers, production monolith, internal-content store, and local Atlas replica/cache DBs; output only counts/classes/DB+chunk IDs, then check staging source-to-tier rules and file required follow-ons before completion. Gitleaks 8.30.1 is available locally; no scan has run yet.
    • Links: issue task(atlas): classification revalidation scan — verify nothing sensitive sits at the wrong tier #6021; queue task 10513
  11. dezren39 commented on Nov 6, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  12. added
    queue/claimedQueue worker lifecycle state
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    queue/claimedQueue worker lifecycle state
    on Nov 6, 2026
  13. dezren39 commented on Nov 6, 2026

    @dezren39
    MemberAuthor

    Handed off: task 10513 (issue #6021) is assigned to the opencode execution lane. Lane code-c claimed it, revalidated issue #6021 as OPEN with no hard-stop labels and no open PR, confirmed assigned_lane=opencode, and checkpointed stage handed_off. The laptop claimant launches the bound opencode session; this lane does not work the task directly. Prior progress on task 10513: metadata revalidation complete, branch queue/10513-6021-atlas-tier-scan and worktree on the laptop recorded, scanner setup in progress, no scan run yet. Attempts 9/16.

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

Metadata

Metadata

Assignees

Labels

area/infraInfrastructure, deployment, and operationskind/enhancementqueue/parkedQueue task is parked (waiting on CI, time, or an event)status/parkedDeliberately paused with a recorded resume conditiontask/triageQueue packet kind: verify, reproduce, and route this itemwork/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions