Skip to content

Fix the invalid string literals that keep main red (refs #73) - #76

Merged
hyperpolymath merged 2 commits into
mainfrom
arena/01a10473-investigativejournalism-jl
Oct 4, 2026
Merged

hyperpolymath merged 2 commits into
mainfrom
arena/01a10473-investigativejournalism-jl

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Why

main is still red after #75 was squash-merged: its CI legs fail before a
single test runs.

ERROR: LoadError: ParseError:
# Error @ /home/runner/work/InvestigativeJournalism.jl/InvestigativeJournalism.jl/src/storytelling/timelines.jl:43:28
    println("LEAK_V1:      \_*___*")
#                          └┘ ── invalid escape sequence

Two string literals are parse errors, so using InvestigativeJournalism
raised a LoadError in every job:

  • src/storytelling/timelines.jl:43-44 — \_ is not one of Julia's valid
    escapes (only \\, \", \$, \' and the standard control escapes are).
  • src/storage/verisim_bridge.jl:37 — println("Executing VQL: "$query" ⚡")
    closed the log string before interpolating query.

That is exactly what Julia 1.10 - ubuntu-latest and
Julia 1.11 - macos-latest report on main today, and the third leg
(Julia 1.11 - ubuntu-latest) was previously cancelled mid-install by the
old 15-minute job timeout.

What this does

No continue-on-error and no demotion to a warning: the fix is a green
Julia 1.10 - ubuntu-latest / Julia 1.11 - ubuntu-latest /
Julia 1.11 - macos-latest on main, which is what #73 records as the
acceptance criterion.

Verification

  • A whole-repo escape/interpolation audit of all 24 tracked Julia files
    (including comments and raw literals) finds no other literal of this
    class.
  • The tree-sitter MISSING ] / ERROR report on src/parsers.jl was
    re-checked and is a false positive (regex i flag suffix); the file is
    valid Julia and is left untouched.

Refs #73.

The CI diagnostic (#73) captured the real first failure: precompilation of
InvestigativeJournalism aborts with

    ERROR: LoadError: ParseError:
    # Error @ src/storytelling/timelines.jl:43:28
        println("LEAK_V1:      \_*___*")
    #                          └┘ -- invalid escape sequence

Julia's only single-character escapes are \\ " $ \n \t \r \b \f \v \a \e and the
numeric forms, so the ASCII-art backslashes in visualize_git_timeline are
syntax errors; they now use \\\\_ and print as intended.

src/storage/verisim_bridge.jl had the same shape of defect: the interpolation
in VQL output was written as "Executing VQL: "$query" ...", which the parser
reads as the string "Executing VQL: " followed by a custom string literal
query"..."; it is now a single interpolated string.

Neither file is touched by the citation work that surfaced the red checks;
both predate it and fail identically on main.

Co-authored-by: arena-agent <[email protected]>
@coderabbitai

coderabbitai Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: edbf80a3-ede1-448e-8dbd-5c489538e770
📥 Commits

Reviewing files that changed from the base of the PR and between dc009e2 and 4423c39.

📒 Files selected for processing (4)
  • .github/workflows/diag.yml
  • CHANGELOG.adoc
  • src/storage/verisim_bridge.jl
  • src/storytelling/timelines.jl
💤 Files with no reviewable changes (1)
  • .github/workflows/diag.yml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (11)
  • GitHub Check: Dogfooding compliance summary
  • GitHub Check: scan / rust-secrets
  • GitHub Check: governance / Guix primary / Nix fallback policy
  • GitHub Check: governance / Check Workflow Staleness
  • GitHub Check: scan / gitleaks
  • GitHub Check: hypatia / Hypatia Neurosymbolic Analysis
  • GitHub Check: Julia 1.10 - ubuntu-latest
  • GitHub Check: Julia 1.11 - macos-latest
  • GitHub Check: analyze (actions, none)
  • GitHub Check: Julia 1.11 - ubuntu-latest
  • GitHub Check: semgrep-cloud-platform/scan
⚠️ CI failures not shown inline (9)

GitHub Actions: Governance / 0_governance _ Validate Hypatia Baseline.txt: Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run echo "Scanning repository: hyperpolymath/InvestigativeJournalism.jl (checking baseline)"
 �[36;1mecho "Scanning repository: hyperpolymath/InvestigativeJournalism.jl (checking baseline)"�[0m
 �[36;1m# Move the baseline filter OUT of the scanned tree, then delete the�[0m
 �[36;1m# standards checkout, so `hypatia scan .` only ever sees the CALLER's�[0m
 �[36;1m# own files. Without this, `.standards-checkout/` (the tooling we�[0m
 �[36;1m# checked out to get apply-baseline.sh) is itself scanned, and�[0m
 �[36;1m# standards' own files get reported as the caller's findings (a banned�[0m
 �[36;1m# `.ts`, `shell_download` bootstrap.sh scripts, etc.).�[0m
 �[36;1mcp .standards-checkout/scripts/apply-baseline.sh "$RUNNER_TEMP/apply-baseline.sh"�[0m
 �[36;1mrm -rf .standards-checkout�[0m
 �[36;1m# hypatia's `scan` exits non-zero whenever it finds anything — that is�[0m
 �[36;1m# by design, and under `bash -e` it would abort this step at this line,�[0m
 �[36;1m# before the baseline filter (the real gate) ever runs. Tolerate the�[0m
 �[36;1m# scan's own exit code…�[0m
 �[36;1mHYPATIA_FORMAT=json "$HOME/hypatia/hypatia-cli.sh" scan . > hypatia-findings.raw.json || true�[0m
 �[36;1m# …but never swallow a genuine scanner crash into a false pass: require a�[0m
 �[36;1m# valid JSON array before trusting the output as "the findings".�[0m
 �[36;1mif ! jq -e 'type == "array"' hypatia-findings.raw.json >/dev/null 2>&1; then�[0m
 �[36;1m  echo "::error::hypatia scan did not produce a valid JSON findings array (scanner error, not a baseline result)"�[0m

GitHub Actions: Governance / governance _ Validate Hypatia Baseline: Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run echo "Scanning repository: hyperpolymath/InvestigativeJournalism.jl (checking baseline)"
 �[36;1mecho "Scanning repository: hyperpolymath/InvestigativeJournalism.jl (checking baseline)"�[0m
 �[36;1m# Move the baseline filter OUT of the scanned tree, then delete the�[0m
 �[36;1m# standards checkout, so `hypatia scan .` only ever sees the CALLER's�[0m
 �[36;1m# own files. Without this, `.standards-checkout/` (the tooling we�[0m
 �[36;1m# checked out to get apply-baseline.sh) is itself scanned, and�[0m
 �[36;1m# standards' own files get reported as the caller's findings (a banned�[0m
 �[36;1m# `.ts`, `shell_download` bootstrap.sh scripts, etc.).�[0m
 �[36;1mcp .standards-checkout/scripts/apply-baseline.sh "$RUNNER_TEMP/apply-baseline.sh"�[0m
 �[36;1mrm -rf .standards-checkout�[0m
 �[36;1m# hypatia's `scan` exits non-zero whenever it finds anything — that is�[0m
 �[36;1m# by design, and under `bash -e` it would abort this step at this line,�[0m
 �[36;1m# before the baseline filter (the real gate) ever runs. Tolerate the�[0m
 �[36;1m# scan's own exit code…�[0m
 �[36;1mHYPATIA_FORMAT=json "$HOME/hypatia/hypatia-cli.sh" scan . > hypatia-findings.raw.json || true�[0m
 �[36;1m# …but never swallow a genuine scanner crash into a false pass: require a�[0m
 �[36;1m# valid JSON array before trusting the output as "the findings".�[0m
 �[36;1mif ! jq -e 'type == "array"' hypatia-findings.raw.json >/dev/null 2>&1; then�[0m
 �[36;1m  echo "::error::hypatia scan did not produce a valid JSON findings array (scanner error, not a baseline result)"�[0m

GitHub Actions: Governance / 3_governance _ Code quality + docs.txt: Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c
 with:
   github-***REDACTED_SECRET_ASSIGNMENT***
   version: latest
 ##[endgroup]
 Find 'latest' release
 ##[error]Error: The binary 'ec-linux-amd64*' not found

GitHub Actions: Governance / governance _ Code quality + docs: Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c
 with:
   github-***REDACTED_SECRET_ASSIGNMENT***
   version: latest
 ##[endgroup]
 Find 'latest' release
 ##[error]Error: The binary 'ec-linux-amd64*' not found

GitHub Actions: Governance / 4_governance _ Well-Known (RFC 9116 + RSR).txt: Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run SECTXT=""
 �[36;1mSECTXT=""�[0m
 �[36;1m[ -f ".well-known/security.txt" ] && SECTXT=".well-known/security.txt"�[0m
 �[36;1m[ -f "security.txt" ] && SECTXT="security.txt"�[0m
 �[36;1mif [ -z "$SECTXT" ]; then�[0m
 �[36;1m  echo "::warning::No security.txt found."�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mgrep -q "^Contact:" "$SECTXT" || { echo "::error::Missing Contact field"; exit 1; }�[0m

GitHub Actions: Governance / governance _ Well-Known (RFC 9116 + RSR): Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run SECTXT=""
 �[36;1mSECTXT=""�[0m
 �[36;1m[ -f ".well-known/security.txt" ] && SECTXT=".well-known/security.txt"�[0m
 �[36;1m[ -f "security.txt" ] && SECTXT="security.txt"�[0m
 �[36;1mif [ -z "$SECTXT" ]; then�[0m
 �[36;1m  echo "::warning::No security.txt found."�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mgrep -q "^Contact:" "$SECTXT" || { echo "::error::Missing Contact field"; exit 1; }�[0m

GitHub Actions: Governance / governance _ Well-Known (RFC 9116 + RSR): Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run MIXED=$(grep -rE 'src="http://|href="http://' --include="*.html" --include="*.htm" . 2>/dev/null | grep -vE 'localhost|127\.0\.0\.1|example\.com|lol/|node_modules/|third-party/|vendor/' | head -5 || true)
 �[36;1mMIXED=$(grep -rE 'src="http://|href="http://' --include="*.html" --include="*.htm" . 2>/dev/null | grep -vE 'localhost|127\.0\.0\.1|example\.com|lol/|node_modules/|third-party/|vendor/' | head -5 || true)�[0m
 �[36;1mif [ -n "$MIXED" ]; then�[0m
 �[36;1m  echo "::error::Mixed content (HTTP in HTML)"�[0m

GitHub Actions: Governance / 9_governance _ Security policy checks.txt: Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mDIR=.github/canonical-references�[0m
 �[36;1mif [ ! -d "$DIR" ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] no $DIR/ — skipped (repo has not opted in)"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mif ! command -v python3 >/dev/null 2>&1; then�[0m
 �[36;1m  echo "❌ [R5] python3 missing on runner — required for YAML rule parsing"�[0m
 �[36;1m  exit 2�[0m
 �[36;1mfi�[0m
 �[36;1mpython3 - <<'PY'�[0m
 �[36;1mimport os, sys, glob, subprocess�[0m
 �[36;1mtry:�[0m
 �[36;1m    import yaml�[0m
 �[36;1mexcept ImportError:�[0m
 �[36;1m    sys.exit("❌ [R5] PyYAML not installed on runner; install python3-yaml")�[0m
 �[36;1m�[0m
 �[36;1mdir_ = ".github/canonical-references"�[0m
 �[36;1mfiles = sorted(glob.glob(f"{dir_}/*.yml") + glob.glob(f"{dir_}/*.yaml"))�[0m
 �[36;1mif not files:�[0m
 �[36;1m    print(f"ℹ️  [R5] {dir_}/ has no .yml/.yaml rules — skipped")�[0m
 �[36;1m    sys.exit(0)�[0m
 �[36;1m�[0m
 �[36;1mtotal = 0�[0m
 �[36;1mfor rf in files:�[0m
 �[36;1m    with open(rf, encoding="utf-8") as fh:�[0m
 �[36;1m        cfg = yaml.safe_load(fh)�[0m
 �[36;1m    if not isinstance(cfg, dict):�[0m
 �[36;1m        print(f"❌ [R5] {rf}: top-level must be a mapping"); total += 1; continue�[0m
 �[36;1m    rid  = cfg.get("id", os.path.basename(rf))�[0m
 �[36;1m    desc = cfg.get("description", "")�[0m
 �[36;1m    pats = cfg.get("patterns") or []�[0m
 �[36;1m    canon = cfg.get("canonical_pointer", "")�[0m
 �[36;1m    scope = (cfg.get("scope") or {})�[0m
 �[36;1m    includes = scope.get("include") or []�[0m
 �[36;1m    if not pats or not includes:�[0m
 �[36;1m        print(f"❌ [R5:{rid}] missing patterns or scope.include in {rf}")�[0m
 �[36;1m        total += 1; continue�[0m
 �[36;1m    # exclude self-references�[0m
 �[36;1m    skip = set(["CHANGELOG.md", "CHANGELOG.adoc", rf])�[0m
 �[36;1m    if canon: skip.add(canon)�[0m
 �[36;1m    rule_hits = 0�[0m
 �[36;1m    for f_ in includes:�[0m
 �[36;1m        if f_ in skip or not os...

GitHub Actions: Governance / governance _ Security policy checks: Fix the invalid string literals that keep main red (refs #73)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mDIR=.github/canonical-references�[0m
 �[36;1mif [ ! -d "$DIR" ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] no $DIR/ — skipped (repo has not opted in)"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mif ! command -v python3 >/dev/null 2>&1; then�[0m
 �[36;1m  echo "❌ [R5] python3 missing on runner — required for YAML rule parsing"�[0m
 �[36;1m  exit 2�[0m
 �[36;1mfi�[0m
 �[36;1mpython3 - <<'PY'�[0m
 �[36;1mimport os, sys, glob, subprocess�[0m
 �[36;1mtry:�[0m
 �[36;1m    import yaml�[0m
 �[36;1mexcept ImportError:�[0m
 �[36;1m    sys.exit("❌ [R5] PyYAML not installed on runner; install python3-yaml")�[0m
 �[36;1m�[0m
 �[36;1mdir_ = ".github/canonical-references"�[0m
 �[36;1mfiles = sorted(glob.glob(f"{dir_}/*.yml") + glob.glob(f"{dir_}/*.yaml"))�[0m
 �[36;1mif not files:�[0m
 �[36;1m    print(f"ℹ️  [R5] {dir_}/ has no .yml/.yaml rules — skipped")�[0m
 �[36;1m    sys.exit(0)�[0m
 �[36;1m�[0m
 �[36;1mtotal = 0�[0m
 �[36;1mfor rf in files:�[0m
 �[36;1m    with open(rf, encoding="utf-8") as fh:�[0m
 �[36;1m        cfg = yaml.safe_load(fh)�[0m
 �[36;1m    if not isinstance(cfg, dict):�[0m
 �[36;1m        print(f"❌ [R5] {rf}: top-level must be a mapping"); total += 1; continue�[0m
 �[36;1m    rid  = cfg.get("id", os.path.basename(rf))�[0m
 �[36;1m    desc = cfg.get("description", "")�[0m
 �[36;1m    pats = cfg.get("patterns") or []�[0m
 �[36;1m    canon = cfg.get("canonical_pointer", "")�[0m
 �[36;1m    scope = (cfg.get("scope") or {})�[0m
 �[36;1m    includes = scope.get("include") or []�[0m
 �[36;1m    if not pats or not includes:�[0m
 �[36;1m        print(f"❌ [R5:{rid}] missing patterns or scope.include in {rf}")�[0m
 �[36;1m        total += 1; continue�[0m
 �[36;1m    # exclude self-references�[0m
 �[36;1m    skip = set(["CHANGELOG.md", "CHANGELOG.adoc", rf])�[0m
 �[36;1m    if canon: skip.add(canon)�[0m
 �[36;1m    rule_hits = 0�[0m
 �[36;1m    for f_ in includes:�[0m
 �[36;1m        if f_ in skip or not os...
🧰 Additional context used
📓 Path-based instructions (3)
Source excerpt: Add SPDX header to every source file.

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Files:

  • src/storage/verisim_bridge.jl
  • src/storytelling/timelines.jl
Source excerpt:

📄 CodeRabbit inference engine (.cursorrules)

Files:

  • CHANGELOG.adoc
  • src/storage/verisim_bridge.jl
  • src/storytelling/timelines.jl
Source excerpt: Annotate and document all files.

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Files:

  • CHANGELOG.adoc
  • src/storage/verisim_bridge.jl
  • src/storytelling/timelines.jl
🔇 Additional comments (3)
src/storytelling/timelines.jl (1)

43-44: LGTM!

src/storage/verisim_bridge.jl (1)

37-37: LGTM!

CHANGELOG.adoc (1)

54-57: LGTM!


📝 Summary

Summary by CodeRabbit

  • Bug Fixes
    • Fixed invalid string formatting that could prevent the package from loading.
    • Timeline output now displays literal backslashes correctly.
    • Query execution messages now include the query text as expected, making them clearer to read and helping users identify which query is being run.

Walkthrough

Two Julia string literals are corrected in the source. The temporary CI diagnostic workflow is removed, and the changelog records these changes.

Changes

Julia String Literal Fixes

Layer / File(s) Summary
Correct Julia string literals
src/storytelling/timelines.jl, src/storage/verisim_bridge.jl, CHANGELOG.adoc
The timeline strings now escape backslashes. vql_query now interpolates query in its execution message. The changelog records both fixes.

Diagnostic Workflow Removal

Layer / File(s) Summary
Remove temporary CI diagnostics
.github/workflows/diag.yml, CHANGELOG.adoc
The temporary workflow that captured diagnostic and test output and attempted to commit CI-DIAG.txt is removed. The changelog records its removal.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 4423c

The reported string fixes address package loading, and no actionable merge-blocking risk remains in the reviewed changes.

Architecture Summary

Architecture risk: 🔵 Low · up to 4423c

The change affects 2 systems.

Changed systems: src, CHANGELOG.adoc

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — src (service) was modified; 2 changed files map to changed impact.
  • observed — CHANGELOG.adoc (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in CHANGELOG.adoc: The changelog adds a fix for two parse errors that prevented package loading: the timeline banner now doubles its backslash, and the log line interpolates query using $(query).
  • observed — Modified behavior in CHANGELOG.adoc: The changelog records removal of the temporary .github/workflows/diag.yml diagnostic workflow and describes its prior role.
  • observed — Modified behavior in src/storage/verisim_bridge.jl: vql_query now embeds query in the printed execution message using string interpolation, replacing the previous malformed string expression.
  • observed — Modified behavior in src/storytelling/timelines.jl: The LEAK_V1 and ALT_HIST strings now escape their backslashes, causing the output to include literal backslashes.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description explains the cause, key changes, and verification work. It does not include the required RSR Quality Checklist or report whether the required tests, formatting, and lint checks passed. Add the RSR Quality Checklist from the repository template and mark each applicable item. In the Testing section, report the results of just test or an equivalent test command, formatting, and lint checks. If a check was not run, state th…
✅ Passed checks (4 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly identifies the main change: fixing invalid string literals that prevent the application from loading.
Full details: Description check

Resolution

Add the RSR Quality Checklist from the repository template and mark each applicable item. In the Testing section, report the results of just test or an equivalent test command, formatting, and lint checks. If a check was not run, state that clearly.

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the strings at dawn,
The stray backslashes now hold on.
A query joins its message bright,
The old CI trail takes flight.
Then carrots crunch; the build moves on.

Comment @coderabbitai help to get the list of available commands.

@hyperpolymath
hyperpolymath enabled auto-merge (squash) October 4, 2026 02:27
`using InvestigativeJournalism` raised `LoadError: ParseError` before a
single test ran:

- src/storytelling/timelines.jl:43-44 used `\_` in the ASCII timeline
  banner; `\_` is not a valid Julia escape sequence.
- src/storage/verisim_bridge.jl:37 closed the log string before
  interpolating `query`; `$` cannot follow the closing quote of a
  string literal.

Also removes .github/workflows/diag.yml, the temporary diagnostic
workflow carried into `main` by the previous squash merge.

Refs #73

Co-authored-by: arena-agent <[email protected]>
@hyperpolymath
hyperpolymath force-pushed the arena/01a10473-investigativejournalism-jl branch from 4423c39 to fbabc45 Compare October 4, 2026 02:32
@hyperpolymath
hyperpolymath merged commit 3d5a1df into main Oct 4, 2026
31 of 32 checks passed
@hyperpolymath
hyperpolymath deleted the arena/01a10473-investigativejournalism-jl branch October 4, 2026 02:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant