NousResearch/hermes-agent

Redact false positives on code files fix

Cluster 15934. Data as of

Nothing open on GitHub. Fix merged in #19715 on 4 May 2026. Check it covers your case.

The short answer

0open issues
0open PRs
4items grouped
Known?
Yes. 4 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #19715. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this resolved, deciding PR #19715. That is separate from the fix event.
Still open
Nothing open on GitHub.

A bug was identified where ENV/JSON regex patterns in secret redaction caused false positives on source code files. These members address adding a code_file parameter and restricting redaction logic to avoid corrupting code output.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #19715 fix(redact): add code_file param to skip false-positive ENV/JSON patterns

    merged to main

    files: agent/redact.py, tools/file_tools.py

    Show the diff
    • agent/redact.py
      @@ -305,13 +305,18 @@ def _redact_form_body(text: str) -> str:
           return _redact_query_string(text.strip())
       
       
      -def redact_sensitive_text(text: str, *, force: bool = False) -> str:
      +def redact_sensitive_text(text: str, *, force: bool = False, code_file: bool = False) -> str:
           """Apply all redaction patterns to a block of text.
       
           Safe to call on any string -- non-matching text passes through unchanged.
           Disabled by default — enable via security.redact_secrets: true in config.yaml.
           Set force=True for safety boundaries that must never return raw secrets
           regardless of the user's global logging redaction preference.
      +
      +    Set code_file=True to skip the ENV-assignment and JSON-field regex
      +    patterns when the text is known to be source code (e.g. MAX_TOKENS=***
      +    constants, "apiKey": "test" fixtures). Prefix patterns, auth headers,
      +    private keys, DB connstrings, JWTs, and URL secrets are still redacted.
           """
           if text is None:
               return None
      @@ -325,17 +330,18 @@ def redact_sensitive_text(text: str, *, force: bool = False) -> str:
           # Known prefixes (sk-, ghp_, etc.)
           text = _PREFIX_RE.sub(lambda m: _mask_token(m.group(1)), text)
       
      -    # ENV assignments: OPENAI_API_KEY=[redacted:secret-assignment]
      -    def _redact_env(m):
      -        name, quote, value = m.group(1), m.group(2), m.group(3)
      -        return f"{name}={quote}{_mask_token(value)}{quote}"
      -    text = _ENV_ASSIGN_RE.sub(_redact_env, text)
      -
      -    # JSON fields: "apiKey": "value"
      -    def _redact_json(m):
      -        key, value = m.group(1), m.group(2)
      -        return f'{key}: "{_mask_token(value)}"'
      -    text = _JSON_FIELD_RE.sub(_redact_json, text)
      +    # ENV assignments: OPENAI_API_KEY=***  (skip for code files — false positives)
      +    if not code_file:
      +        def _redact_env(m):
      +            name, quote, value = m.group(1), m.group(2), m.group(3)
      +            return f"{name}={quote}{_mask_token(value)}{quote}"
      +        text = _ENV_ASSIGN_RE.sub(_redact_env, text)
      +
      +        # JSON fields: "apiKey": "***"  (skip for code files — false positives)
      +        def _redact_json(m):
      +            key, value = m.group(1), m.group(2)
      +            return f'{key}: "{_mask_token(value)}"'
      +        text = _JSON_FIELD_RE.sub(_redact_json, text)
       
           # Authorization headers
           text = _AUTH_HEADER_RE.sub(
    • tools/file_tools.py
      @@ -570,7 +570,7 @@ def read_file_tool(path: str, offset: int = 1, limit: int = 500, task_id: str =
       
               # ── Redact secrets (after guard check to skip oversized content) ──
               if result.content:
      -            result.content = redact_sensitive_text(result.content)
      +            result.content = redact_sensitive_text(result.content, code_file=True)
                   result_dict["content"] = result.content
       
               # Large-file hint: if the file is big and the caller didn't ask
      @@ -993,7 +993,7 @@ def search_tool(pattern: str, target: str = "content", path: str = ".",
               if hasattr(result, 'matches'):
                   for m in result.matches:
                       if hasattr(m, 'content') and m.content:
      -                    m.content = redact_sensitive_text(m.content)
      +                    m.content = redact_sensitive_text(m.content, code_file=True)
               result_dict = result.to_dict()
       
               if count >= 3:

2 PRs closed without merging

From the close comments: closed without comment 1 · merged via another change 1

  • #15923 fix(redact): skip ENV/JSON patterns on code files to avoid false positives · closed without comment
  • #16127 fix(redact): add code_file param to skip false-positive ENV/JSON patterns · merged via another change → #19715
Closed issues · 1
  • Closed#15934bug(redact): ENV/JSON regex patterns cause false positives on source code files
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.50: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Merged PRs
#19715
Closed issues
1
Attempts
2 PRs closed without merging
Fix link checked
4 May 2026

For your agent

The same facts, typed.