fix(redaction): keep timestamped Actions job logs visible - #1038
fix(redaction): keep timestamped Actions job logs visible#1038cursor[bot] wants to merge 3 commits into
Conversation
Replay unique #929 source onto current origin/main. Skip shared ARCHITECTURE/CLAUDE/AGENTS trees and stale materialize files.
Treat only plausible JSON openers as span starts and score a failed parse against the window until the next opener. A ##[group] marker or prose [timeout] no longer fail-closes a later pretty-printed password object. Cite RFC 8259, ECMA-404, and ISO/IEC 21778 for duplicate-member layout. Co-authored-by: Seongho Bae <[email protected]>
Skip RFC 3339 runner timestamps inside raw JSON spans and open '[' only for a real JSON value so a downloaded pretty-printed password dump keeps ##[group] and [INFO] text instead of fail-closing the entire log. Co-authored-by: Seongho Bae <[email protected]>
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
There was a problem hiding this comment.
Next action
Do not merge this head. A downloaded pretty-printed password dump still collapses to [REDACTED] when the per-line prefix uses RFC 3339 time-numoffset (+00:00, -07:00) or a following HTAB instead of Z plus SPACE.
Finding
ACTIONS_JOB_LOG_TIMESTAMP_RE only matches YYYY-MM-DDTHH:MM:SS[.frac]Z .
RFC 3339 §5.6, which this head already cites, defines time-offset as Z or time-numoffset. Collectors and re-exports also emit HTAB after the timestamp. In both shapes { after the unrecognized prefix is a plausible opener, the next timestamp breaks the parse, and _looks_like_sensitive_json_candidate fail-closes the entire job log.
Reproduced locally against 40e2139f:
2026-08-16T15:22:12.0012340+00:00 {plus a later"password"object → whole buffer[REDACTED]2026-08-16T15:22:12.0012340Z\t{plus the same object → whole buffer[REDACTED]
The Z plus SPACE path, [INFO] guard, and argv/object fixtures on this head stay correct. Focused 168 tests passed here with 100% statement/branch on the three owned modules.
Landing vehicle
The offset/HTAB skip is on successor cursor/bc-f7a56233-973b-4875-8395-c453b26f5bde-841c (opened from this run). Merge that successor instead of #929, #1031, or this PR.
Developer experience
Operators downloading job logs from a collector that keeps RFC 3339 offsets or TSV-style tabs still lose group markers and status text.
User experience
A buyer reading review evidence still cannot tell a real secret from a timestamp-grammar miss.
Sent by Cursor Automation: Fix Issues
| MAX_RAW_JSON_WORK = 262_144 | ||
| RAW_JSON_SPAN_PREFIXES = frozenset(" \t\r\n{[:,=()]") | ||
| ACTIONS_JOB_LOG_TIMESTAMP_RE = re.compile( | ||
| r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z " |
There was a problem hiding this comment.
This pattern requires a literal Z and SPACE. RFC 3339 §5.6 time-numoffset (+00:00, -07:00) and a following HTAB both fail to skip, so the next { starts a doomed span and a later "password" fail-closes the whole log. Accept (?:Z|[+-]\d{2}:\d{2})[ \t] and keep the [INFO] opener guard.


Next action
Merge this successor instead of #1031 and #929. Those heads treat a downloaded per-line-timestamped pretty-printed password dump as one failed
{window and fail-close the entire job log to[REDACTED].What changed
YYYY-MM-DDTHH:MM:SS.nnnnnnnZ) inside raw JSON spans the same way JSON whitespace is skipped, then rewrite credential leaves in place.[only when the next significant token can start a JSON value (true/false/null/ number / string / container /]), so line-start[INFO]/[timeout]diagnostics stay visible.[INFO], and literal array controls.Verification
Focused redaction selection: 168 passed. Owned modules
redact_sensitive_log.py,sandboxed_verify.py, andsandboxed_web_e2e.pyreport 100% statement and branch coverage (1,094 statements, 444 branches).Acceptance
Do not merge #929 or #1031. After this head is green, treat
[REDACTED]as evidence suppression and rerun the exact-head sandbox redaction quality job before closing #908.