fabro/lib/foundation
Scott Werner 0e670e9234 Exempt ULIDs from entropy-based secret redaction
Fabro's run, session, turn, message and pair IDs are ULIDs. A ULID
occasionally has enough distinct characters to cross the secret
scanner's 4.5-bit entropy threshold, and the stream redaction then
rewrites the Web UI link to `/runs/REDACTED` and the run branch to
`fabro/run/REDACTED`. Two nightly releases in the last week failed on
`attach_replays_completed_detached_run` this way, and each fix so far
protected one field at a time.

Teach the entropy scanner the format instead: a token that is exactly
26 uppercase Crockford base32 characters and decodes to a timestamp
between 2020 and 2100 is an identifier, not a secret, and is left
alone wherever it appears. Trailing `-ULID`, `_ULID` and `=ULID`
segments are stripped before measuring, so `20261020-<id>` and
`<secret>-<id>` are handled, and the secret in the latter is still
found. The gitleaks credential patterns run on every token as before.

This mirrors detect-secrets' built-in UUID filter. A secret would have
to take exactly this shape and land in the date window to be missed,
which is about one in a hundred of the already rare tokens encoded as
26 uppercase base32 characters.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-20 14:51:14 -04:00
..
build-support refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-api Merge pull request #905 from fabro-sh/petri-no-jump 2026-10-07 10:50:46 -04:00
fabro-auth Scope run model clients with session headers 2026-10-14 12:44:52 -04:00
fabro-client Merge pull request #788 from chunga-ict/fix/schema-mismatch-error-message 2026-10-07 16:33:03 -04:00
fabro-config Fail the umask permissions test when its child runs no tests 2026-10-12 15:49:46 -04:00
fabro-db Drop the run_events table and narrow the runs row 2026-09-18 14:37:18 -04:00
fabro-dev Fix the Mintlify docs deployment 2026-09-28 17:26:49 -04:00
fabro-http Depend on lithos-llm and the published twin-openai crate 2026-09-09 17:26:57 -06:00
fabro-macros refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-oauth refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-options-metadata refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-proc Simplify the store-fault handling 2026-10-06 16:07:36 -04:00
fabro-redact Exempt ULIDs from entropy-based secret redaction 2026-10-20 14:51:14 -04:00
fabro-static refactor: tidy the in-process sandbox provider wiring 2026-09-25 11:29:29 -04:00
fabro-telemetry refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-template Read workflow graphs through Petri's DOT parser 2026-09-19 12:23:57 -04:00
fabro-test fix: address review of the in-process sandbox providers 2026-09-25 12:31:37 -04:00
fabro-types Merge remote-tracking branch 'origin/main' into codex/restore-configured-artifact-storage 2026-09-28 16:27:30 -04:00
fabro-util Resume a Petri run whose store failed, as after a crash 2026-10-06 12:29:34 -04:00
fabro-vault refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00