Skip to content

feat(macos): preserve async corpus packaging lane - #391

Closed
KooshaPari wants to merge 8 commits into
mainfrom
feat/preserve-async-corpus-load-20260729
Closed

feat(macos): preserve async corpus packaging lane#391
KooshaPari wants to merge 8 commits into
mainfrom
feat/preserve-async-corpus-load-20260729

Conversation

@KooshaPari

Copy link
Copy Markdown
Owner

Preserve the local async corpus/viewer and macOS packaging changes as a reviewable remote packet.

Validation: git diff --cached --check. Workspace Cargo validation remains in progress.

@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b7d777a3-c900-484c-80f0-02249de9284c

📥 Commits

Reviewing files that changed from the base of the PR and between 6abc79d and 3842446.

📒 Files selected for processing (1)
  • packaging/macos/package-app.sh
📜 Recent review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: prepare
  • GitHub Check: browser e2e · axe · responsive · visual
  • GitHub Check: prepare
  • GitHub Check: browser e2e · axe · responsive · visual
⚠️ CI failures not shown inline (2)

GitHub Check: Summary: The current Mergify configuration is invalid

Conclusion: failure

View job details

* Invalid condition 'author=dependabot[bot] | renovate[bot]' @ root → pull_request_rules → item 1 → conditions → item 0 → author=dependabot[bot] | renovate[bot]
```
Invalid GitHub login
```
* Invalid condition 'author=trunk-io[bot] | mergify[bot] | github-actions[bot]' @ root → pull_request_rules → item 2 → conditions → item 0 → author=trunk-io[bot] | mergify[bot] | github-actions[bot]
```
Invalid GitHub login
```
* Invalid condition 'age>=30d' @ root → pull_request_rules → item 8 → conditions → item 2 → age>=30d
```
Invalid attribute
```
* Extra inputs are not permitted @ root → pull_request_rules → item 0 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 1 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 3 → actions → request_reviews → github_accounts

GitHub Check: Mergify Merge Queue: The current Mergify configuration is invalid

Conclusion: failure

View job details

* Invalid condition 'author=dependabot[bot] | renovate[bot]' @ root → pull_request_rules → item 1 → conditions → item 0 → author=dependabot[bot] | renovate[bot]
```
Invalid GitHub login
```
* Invalid condition 'author=trunk-io[bot] | mergify[bot] | github-actions[bot]' @ root → pull_request_rules → item 2 → conditions → item 0 → author=trunk-io[bot] | mergify[bot] | github-actions[bot]
```
Invalid GitHub login
```
* Invalid condition 'age>=30d' @ root → pull_request_rules → item 8 → conditions → item 2 → age>=30d
```
Invalid attribute
```
* Extra inputs are not permitted @ root → pull_request_rules → item 0 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 1 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 3 → actions → request_reviews → github_accounts
🔇 Additional comments (2)
packaging/macos/package-app.sh (2)

26-40: LGTM!


58-72: LGTM!


📝 Walkthrough

Summary

The PR fixes async session selection in HistoryTimeline and MemoryWiki by tracking session IDs instead of list indexes. It adds reactivity tests. It improves root session loading error handling and task diagnostics. It preserves existing macOS backups and adds optional icon generation and application metadata. It adds Trunk Check automation and updates the visual font-token test. Cached diff validation passed. Workspace validation remains incomplete, so the PR is not ready to merge.

Must Fix

  • Complete cargo fmt, cargo clippy --workspace -- -D warnings, and cargo test --workspace.
  • Resolve all validation failures before merge.

Should Fix

  • Add checks for backup preservation and optional iconutil behavior.
  • Verify the generated Info.plist in a packaged macOS application.
  • Verify the new Trunk workflow on pull requests and scheduled runs.

Consider

  • Document that existing .previous backups remain preserved.

Request Changes

No blocking implementation issue is evident from the provided changes. Request changes until workspace validation passes.

Walkthrough

The viewer updates session loading, reactive selection, tests, and acceptance badges. macOS installation preserves existing backups. Packaging can embed the app icon and adds application metadata. Trunk Check and a visual typography assertion are updated.

Changes

Viewer updates

Layer / File(s) Summary
Viewer loading and error state
crates/sl-viewer/src/app.rs
The viewer stores load errors in error_signal, logs failures, classifies task outcomes, and updates the error banner.
Viewer derived state and reactivity tests
crates/sl-viewer/src/memory_tab.rs, crates/sl-viewer/src/history_tab.rs, crates/sl-viewer/tests/session_context_reactivity.rs
MemoryWiki and HistoryTimeline use memoized session data and session-ID selection. Tests verify rerendering after session updates.
Viewer acceptance badge
crates/sl-viewer/src/app.rs
Acceptance badges display ✓ AC.

macOS packaging

Layer / File(s) Summary
macOS backup preservation
packaging/macos/install-local.sh
The installer creates .previous only when the backup does not already exist.
macOS bundle icon and metadata
packaging/macos/package-app.sh
Packaging optionally converts the iconset with iconutil and adds icon and application metadata to Info.plist.

Validation updates

Layer / File(s) Summary
Trunk Check workflow
.github/workflows/trunk-check.yml
The workflow runs Trunk Check for pull requests, selected branch pushes, and weekly scheduled runs.
Visual typography assertion
tests/visual/harness/visual.spec.js
The display font assertion now expects system-ui.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately identifies the async corpus and macOS packaging changes in the pull request.
Description check ✅ Passed The description directly relates to preserving the async corpus/viewer and macOS packaging changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches 💡 2
⚔️ Resolve merge conflicts 💡
  • Resolve merge conflict in branch feat/preserve-async-corpus-load-20260729
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/preserve-async-corpus-load-20260729
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feat/preserve-async-corpus-load-20260729

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

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

Copilot AI review requested due to automatic review settings August 1, 2026 00:44
@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Preserves and packages macOS viewer changes by enhancing the local .app packaging/installation scripts and adjusting sl-viewer session loading/UI to better support desktop responsiveness.

Changes:

  • Add macOS app icon embedding and additional Info.plist keys in the packaging script.
  • Adjust the local installer’s backup behavior for existing /Applications/SessionLedger.app.
  • Update sl-viewer to load sessions via tokio::task::spawn_blocking on desktop, rename the corpus error signal, and tweak the acceptance badge label.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
packaging/macos/package-app.sh Generates an .icns from the repo iconset and adds icon-related + extra macOS Info.plist keys.
packaging/macos/install-local.sh Changes how the installer archives an existing app bundle before replacing it.
crates/sl-viewer/src/app.rs Moves desktop session loading onto Tokio’s blocking pool and updates related UI/error state naming.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +31 to +36
# Rotate the previous archive: only archive the currently-installed app when
# no prior .previous exists, so Spotlight sees at most one SessionLedger.app
# bundle and a single .previous (the previous-previous is dropped).
if [[ ! -e "$backup" ]]; then
ditto "$APP_DEST" "$backup"
fi
# Rotate the previous archive: only archive the currently-installed app when
# no prior .previous exists, so Spotlight sees at most one SessionLedger.app
# bundle and a single .previous (the previous-previous is dropped).
if [[ ! -e "$backup" ]]; then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CRITICAL: Backup rotation is broken — .previous is never updated after the first install

The if [[ ! -e "$backup" ]] guard means the backup is only created on the very first run when no .previous exists. On every subsequent install, the currently-running app is replaced without being archived, so .previous remains stale (containing the version from before the first install, not the version just replaced). If the new install is broken, there is no valid rollback path.

The original code always archived the current app before replacing it, ensuring .previous always held the immediately preceding version.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment thread packaging/macos/package-app.sh Outdated
if [[ -d "$ICONSET_DIR" ]]; then
ICONUTIL_BIN="$(command -v iconutil || true)"
if [[ -n "$ICONUTIL_BIN" ]]; then
"$ICONUTIL_BIN" -c icns "$ICONSET_DIR" -o "$APP/Contents/Resources/AppIcon.icns" 2>/dev/null || true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: iconutil errors are silently swallowed and no validation is performed on the generated icon

2>/dev/null || true discards all stderr output from iconutil, including malformed iconset errors, missing PNGs, or conversion failures. There is no check that AppIcon.icns was actually created before the Info.plist references it. If the icon generation fails, the app will be built with a missing icon and no indication of why.

Consider at minimum checking that the output file exists after the iconutil call, or removing || true so the build fails loudly on icon errors.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

// Load sessions once at the root; propagate via context.
// Load sessions once at the root; propagate the live signal via context.
// Desktop corpus discovery runs on Tokio's blocking pool so the window
// renders immediately. The web build keeps its synchronous mock path and

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Comment claims web build uses a "synchronous mock path" but the code calls load_sessions directly

The comment states "The web build keeps its synchronous mock path," but the #[cfg(not(feature = "desktop"))] branch calls load_sessions(&source) synchronously — it does not check whether it is a mock or a real data source. Whether the web path is a mock depends on the load_sessions implementation for the wasm32 target, not on this code. The comment overstates what the code guarantees.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

<key>NSSupportsAutomaticGraphicsSwitching</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2026 SessionLedger. All rights reserved.</string>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Hardcoded copyright year 2026 will be outdated next year

Consider using a build-time variable (e.g., $(date +%Y)) or deriving the year from a CARGO_PKG_VERSION/build script so the copyright stays current without manual updates each year.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

<string>11.0</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSPrincipalClass</key>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: NSPrincipalClass set to NSApplication is redundant

NSApplication is the default principal class for macOS applications. Including it explicitly adds no functional value and adds a maintenance point that could drift from the actual default.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

span { class: "meta-bundles", "{s.bundle_count} slices" }
if s.has_acceptance {
span { class: "badge badge-ok", "AC" }
span { class: "badge badge-ok", "AC" }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Unicode character may not render consistently across all fonts and terminals

The other badges in this component use ASCII ("AC", "◎ CT"). Switching to the Unicode checkmark could render as a tofu character or blank in some terminal/font configurations. If the intent is a visual improvement, consider using an ASCII alternative or verifying font coverage.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packaging/macos/package-app.sh`:
- Around line 26-34: Update the macOS packaging flow to remove CFBundleIconName
from Info.plist and only set CFBundleIconFile after iconutil successfully
creates AppIcon.icns. In the icon generation block, replace the unconditional
failure suppression with success-gated metadata handling so failed or
unavailable icon conversion does not declare a nonexistent resource.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c884c04e-dbc1-4304-8ece-a1bbfedefb6d

📥 Commits

Reviewing files that changed from the base of the PR and between a22420c and 46cbe8d.

📒 Files selected for processing (3)
  • crates/sl-viewer/src/app.rs
  • packaging/macos/install-local.sh
  • packaging/macos/package-app.sh
📜 Review details
⏰ Context from checks skipped due to timeout. (37)
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: Dependency Review
  • GitHub Check: prepare
  • GitHub Check: copilot-pull-request-reviewer
  • GitHub Check: sl-daemon · repository builder image offline build / sl-daemon · repository builder image offline build
  • GitHub Check: sl-daemon · locked offline build
  • GitHub Check: fuzz blocking · sustained 30s
  • GitHub Check: sandbox boundary smoke
  • GitHub Check: Socket posture SelfCheck
  • GitHub Check: cargo audit
  • GitHub Check: cargo deny check
  • GitHub Check: soft fuzz · SelfCheck
  • GitHub Check: loom permutation · hermetic wrappers
  • GitHub Check: loom permutation · daemon pipeline
  • GitHub Check: load macro gate · macro routes smoke
  • GitHub Check: daemon graph hard · tokio graph
  • GitHub Check: visual contract · WCAG AA
  • GitHub Check: miri permutation · race_model
  • GitHub Check: update check hard · root SelfCheck wrapper
  • GitHub Check: update check hard · sl-daemon tests
  • GitHub Check: sl-viewer help · unit tests
  • GitHub Check: jemalloc default-on · windows default build
  • GitHub Check: jemalloc default-on · unix default build
  • GitHub Check: soft loom · daemon mpsc
  • GitHub Check: soft loom · loom_model core
  • GitHub Check: soft loom · daemon broadcast
  • GitHub Check: session-ledger build · ubuntu-latest
  • GitHub Check: sl-daemon build · windows-latest
  • GitHub Check: race smoke + channel/cancel model · windows-latest
  • GitHub Check: session-ledger build · windows-latest
  • GitHub Check: exotic check · aarch64-unknown-linux-gnu
  • GitHub Check: prepare
  • GitHub Check: sl-viewer macOS app · artifact
  • GitHub Check: browser e2e · axe · responsive · visual
  • GitHub Check: Kilo Code Review
  • GitHub Check: prepare
  • GitHub Check: browser e2e · axe · responsive · visual
⚠️ CI failures not shown inline (8)

GitHub Actions: Trunk Check / 0_Lint & Format.txt: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]GITHUB_TOKEN Permissions
 Contents: read
 Metadata: read
 Packages: read
 ##[endgroup]
 Secret source: Actions
 Prepare workflow directory
 Prepare all required actions
 Getting action download info
 ##[error]Unable to resolve action `trunk-io/trunk-action@d90b9166660d5e5afae248a58172a3a0e99d56d5`, unable to find version `d90b9166660d5e5afae248a58172a3a0e99d56d5`

GitHub Actions: Trunk Check / Lint & Format: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]GITHUB_TOKEN Permissions
 Contents: read
 Metadata: read
 Packages: read
 ##[endgroup]
 Secret source: Actions
 Prepare workflow directory
 Prepare all required actions
 Getting action download info
 ##[error]Unable to resolve action `trunk-io/trunk-action@d90b9166660d5e5afae248a58172a3a0e99d56d5`, unable to find version `d90b9166660d5e5afae248a58172a3a0e99d56d5`

GitHub Actions: signing hard / 0_signing hard · SelfCheck.txt: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/signing-readiness-check.ps1 -SelfCheck
 �[36;1m./scripts/signing-readiness-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Platform signing readiness check (C11 L112 hard evidence)
 Mode: SelfCheck (ADR + release.yml unsigned anchors + blocking hard CI; no secrets / no network)
 ADR 0003 anchors:
   [PASS] ADR deferral title
   [PASS] ADR portable SHA256SUMS trust path
   [PASS] ADR Authenticode deferral
   [PASS] ADR notarization deferral
   [PASS] ADR reconsider triggers
   [PASS] ADR cross-link to signing readiness checklist
 Signing readiness checklist anchors:
   [PASS] checklist heading
   [PASS] unsigned current state section
   [PASS] unsigned MSI artifact naming
   [PASS] unsigned PKG artifact naming
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] soft vs hard gates matrix section
   [PASS] blocking hard CI gate marked done
   [PASS] signing-hard workflow path documented
   [PASS] signing_hard test wrapper documented
   [PASS] unpaid Apple credential gate
   [PASS] unpaid Windows credential gate
   [PASS] signed clean-host smoke unpaid gate
   [PASS] ADR 0001 auto-update unpaid gate
   [PASS] no fake secrets policy
   [PASS] no false platform signing claim
 release.yml unsigned path anchors:
   [PASS] release.yml deferral header comment
   [PASS] unsigned Windows MSI packaging step
   [PASS] unsigned macOS PKG packaging step
   [PASS] package-msi.ps1 invocation
   [PASS] smoke-windows job
   [PASS] smoke-macos-pkg job
   [PASS] MSI silent install smoke anchor
   [PASS] ADR 0003 reference in release workflow
   [PASS] release signing-readiness job
   [PASS] release invokes signing-readiness SelfCheck
   [PASS] release.yml smoke + signing-readiness job definitions present
 signing-hard workflow blocking-gate anchors:
   [PASS] hard workflow has no continue-on-error
   [PASS] hard workflow triggers on pull_request
   [PASS] hard workflow runs signing-readiness-check....

GitHub Actions: signing hard / signing hard · SelfCheck: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/signing-readiness-check.ps1 -SelfCheck
 �[36;1m./scripts/signing-readiness-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Platform signing readiness check (C11 L112 hard evidence)
 Mode: SelfCheck (ADR + release.yml unsigned anchors + blocking hard CI; no secrets / no network)
 ADR 0003 anchors:
   [PASS] ADR deferral title
   [PASS] ADR portable SHA256SUMS trust path
   [PASS] ADR Authenticode deferral
   [PASS] ADR notarization deferral
   [PASS] ADR reconsider triggers
   [PASS] ADR cross-link to signing readiness checklist
 Signing readiness checklist anchors:
   [PASS] checklist heading
   [PASS] unsigned current state section
   [PASS] unsigned MSI artifact naming
   [PASS] unsigned PKG artifact naming
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] soft vs hard gates matrix section
   [PASS] blocking hard CI gate marked done
   [PASS] signing-hard workflow path documented
   [PASS] signing_hard test wrapper documented
   [PASS] unpaid Apple credential gate
   [PASS] unpaid Windows credential gate
   [PASS] signed clean-host smoke unpaid gate
   [PASS] ADR 0001 auto-update unpaid gate
   [PASS] no fake secrets policy
   [PASS] no false platform signing claim
 release.yml unsigned path anchors:
   [PASS] release.yml deferral header comment
   [PASS] unsigned Windows MSI packaging step
   [PASS] unsigned macOS PKG packaging step
   [PASS] package-msi.ps1 invocation
   [PASS] smoke-windows job
   [PASS] smoke-macos-pkg job
   [PASS] MSI silent install smoke anchor
   [PASS] ADR 0003 reference in release workflow
   [PASS] release signing-readiness job
   [PASS] release invokes signing-readiness SelfCheck
   [PASS] release.yml smoke + signing-readiness job definitions present
 signing-hard workflow blocking-gate anchors:
   [PASS] hard workflow has no continue-on-error
   [PASS] hard workflow triggers on pull_request
   [PASS] hard workflow runs signing-readiness-check....

GitHub Actions: rootless no-net / rootless_no-net · SelfCheck: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/rootless-nonet-check.ps1 -SelfCheck
 �[36;1m./scripts/rootless-nonet-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Hard rootless / no-net CI evidence check (C04 L40)
 Mode: SelfCheck (docs + workflow + security/ci anchors; no build / no network)
 Hard rootless / no-net doc anchors:
   [PASS] hard rootless/no-net section heading
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] blocking workflow gate marked done
   [PASS] rootless-nonet workflow path documented
   [PASS] cargo test wrapper documented
   [PASS] hard rootless runner matrix remains unpaid
   [PASS] hard no-net cargo-fetch enforcement remains unpaid
   [PASS] no false hard enforcement claim
 rootless-nonet workflow blocking-gate anchors:
   [PASS] workflow has no continue-on-error
   [PASS] workflow triggers on pull_request
   [PASS] workflow runs rootless-nonet-check.ps1
 security.yml / ci.yml cross-reference anchors:
   [PASS] security.yml references rootless-nonet workflow
   [PASS] security.yml references rootless-nonet SelfCheck script
   [FAIL] ci.yml references rootless-nonet workflow
 �[31;1mException: �[0m/home/runner/work/SessionLedger/SessionLedger/scripts/rootless-nonet-check.ps1:64�[0m
 �[31;1m�[0m�[36;1mLine |�[0m
 �[31;1m�[0m�[36;1m�[36;1m  64 | �[0m         �[36;1mthrow "$Context missing required anchor: '$Needle'"�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m     | �[31;1m         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m�[31;1m�[31;1m�[36;1m     | �[31;1m.github/workflows/ci.yml missing required anchor: 'rootless-nonet.yml'�[0m
 ##[error]Process completed with exit code 1.

GitHub Actions: rootless no-net / 0_rootless_no-net · SelfCheck.txt: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/rootless-nonet-check.ps1 -SelfCheck
 �[36;1m./scripts/rootless-nonet-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Hard rootless / no-net CI evidence check (C04 L40)
 Mode: SelfCheck (docs + workflow + security/ci anchors; no build / no network)
 Hard rootless / no-net doc anchors:
   [PASS] hard rootless/no-net section heading
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] blocking workflow gate marked done
   [PASS] rootless-nonet workflow path documented
   [PASS] cargo test wrapper documented
   [PASS] hard rootless runner matrix remains unpaid
   [PASS] hard no-net cargo-fetch enforcement remains unpaid
   [PASS] no false hard enforcement claim
 rootless-nonet workflow blocking-gate anchors:
   [PASS] workflow has no continue-on-error
   [PASS] workflow triggers on pull_request
   [PASS] workflow runs rootless-nonet-check.ps1
 security.yml / ci.yml cross-reference anchors:
   [PASS] security.yml references rootless-nonet workflow
   [PASS] security.yml references rootless-nonet SelfCheck script
   [FAIL] ci.yml references rootless-nonet workflow
 �[31;1mException: �[0m/home/runner/work/SessionLedger/SessionLedger/scripts/rootless-nonet-check.ps1:64�[0m
 �[31;1m�[0m�[36;1mLine |�[0m
 �[31;1m�[0m�[36;1m�[36;1m  64 | �[0m         �[36;1mthrow "$Context missing required anchor: '$Needle'"�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m     | �[31;1m         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m�[31;1m�[31;1m�[36;1m     | �[31;1m.github/workflows/ci.yml missing required anchor: 'rootless-nonet.yml'�[0m
 ##[error]Process completed with exit code 1.

GitHub Actions: rootless matrix / rootless-only matrix · SelfCheck: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/rootless-matrix-check.ps1 -SelfCheck
 �[36;1m./scripts/rootless-matrix-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Rootless-only OCI runner matrix scaffold check (C04 L40)
 Mode: SelfCheck (docs + workflow + security/ci anchors; no OCI build / no network)
 Rootless-only runner matrix doc anchors:
   [PASS] rootless-only matrix section heading
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] blocking workflow gate marked done
   [PASS] rootless-matrix workflow path documented
   [PASS] cargo test wrapper documented
   [PASS] runner capability matrix documented
   [PASS] live rootless runner matrix remains unpaid
   [PASS] OCI build/smoke in matrix remains unpaid
   [PASS] no false OCI build claim
   [PASS] no false live-runner enforcement claim
 rootless-matrix workflow blocking-gate anchors:
   [PASS] workflow has no continue-on-error
   [PASS] workflow triggers on pull_request
   [PASS] workflow runs rootless-matrix-check.ps1
 security.yml / ci.yml cross-reference anchors:
   [PASS] security.yml references rootless-matrix workflow
   [PASS] security.yml references rootless-matrix SelfCheck script
   [FAIL] ci.yml references rootless-matrix workflow
 �[31;1mException: �[0m/home/runner/work/SessionLedger/SessionLedger/scripts/rootless-matrix-check.ps1:65�[0m
 �[31;1m�[0m�[36;1mLine |�[0m
 �[31;1m�[0m�[36;1m�[36;1m  65 | �[0m         �[36;1mthrow "$Context missing required anchor: '$Needle'"�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m     | �[31;1m         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m�[31;1m�[31;1m�[36;1m     | �[31;1m.github/workflows/ci.yml missing required anchor: 'rootless-matrix.yml'�[0m
 ##[error]Process completed with exit code 1.

GitHub Actions: rootless matrix / 0_rootless-only matrix · SelfCheck.txt: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/rootless-matrix-check.ps1 -SelfCheck
 �[36;1m./scripts/rootless-matrix-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Rootless-only OCI runner matrix scaffold check (C04 L40)
 Mode: SelfCheck (docs + workflow + security/ci anchors; no OCI build / no network)
 Rootless-only runner matrix doc anchors:
   [PASS] rootless-only matrix section heading
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] blocking workflow gate marked done
   [PASS] rootless-matrix workflow path documented
   [PASS] cargo test wrapper documented
   [PASS] runner capability matrix documented
   [PASS] live rootless runner matrix remains unpaid
   [PASS] OCI build/smoke in matrix remains unpaid
   [PASS] no false OCI build claim
   [PASS] no false live-runner enforcement claim
 rootless-matrix workflow blocking-gate anchors:
   [PASS] workflow has no continue-on-error
   [PASS] workflow triggers on pull_request
   [PASS] workflow runs rootless-matrix-check.ps1
 security.yml / ci.yml cross-reference anchors:
   [PASS] security.yml references rootless-matrix workflow
   [PASS] security.yml references rootless-matrix SelfCheck script
   [FAIL] ci.yml references rootless-matrix workflow
 �[31;1mException: �[0m/home/runner/work/SessionLedger/SessionLedger/scripts/rootless-matrix-check.ps1:65�[0m
 �[31;1m�[0m�[36;1mLine |�[0m
 �[31;1m�[0m�[36;1m�[36;1m  65 | �[0m         �[36;1mthrow "$Context missing required anchor: '$Needle'"�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m     | �[31;1m         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m�[31;1m�[31;1m�[36;1m     | �[31;1m.github/workflows/ci.yml missing required anchor: 'rootless-matrix.yml'�[0m
 ##[error]Process completed with exit code 1.
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{rs,toml}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,toml}: Use the Rust toolchain pinned in rust-toolchain.toml; the workspace MSRV is Rust 1.85.
Validate Rust workspace changes with the prescribed locked build, all-features test suite, Clippy, and rustfmt checks where applicable.

Files:

  • crates/sl-viewer/src/app.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Fix Clippy warnings; do not add #[allow] unless it includes a tracking-issue comment.

Files:

  • crates/sl-viewer/src/app.rs
crates/sl-viewer/**/*.{rs,toml}

📄 CodeRabbit inference engine (AGENTS.md)

crates/sl-viewer/**/*.{rs,toml}: The sl-viewer crate uses Dioxus 0.6; use the Dioxus CLI/toolchain for desktop development and bundling.
Use cargo check -p sl-viewer as the fast inner-loop check for viewer changes.

Files:

  • crates/sl-viewer/src/app.rs
crates/sl-viewer/**/*

📄 CodeRabbit inference engine (AGENTS.md)

When packaging the macOS viewer, account for the documented Electrobun/Dioxus code-signing requirements.

Files:

  • crates/sl-viewer/src/app.rs
🔇 Additional comments (4)
crates/sl-viewer/src/app.rs (2)

185-190: LGTM!

Also applies to: 211-214, 832-832, 1123-1123


185-190: 🎯 Functional Correctness

Confirm the pinned Dioxus version and run the required checks.

The path instructions state that crates/sl-viewer uses Dioxus 0.6, but the supplied library context states Dioxus 0.7.0. Verify the manifest and lockfile. Compile this Signal/use_signal/read usage with the pinned toolchain.

Before merge, run cargo check -p sl-viewer, the prescribed locked workspace build, all-features tests, Clippy, and rustfmt checks.

Source: Coding guidelines

packaging/macos/install-local.sh (1)

31-36: LGTM!

packaging/macos/package-app.sh (1)

62-69: LGTM!

Comment thread packaging/macos/package-app.sh
@kilo-code-bot

kilo-code-bot Bot commented Aug 1, 2026

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 file)
  • tests/visual/harness/visual.spec.js
Previous Review Summaries (5 snapshots, latest commit 6abc79d)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 6abc79d)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 file)
  • tests/visual/harness/visual.spec.js

Previous review (commit 75ee144)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 file)
  • .github/workflows/trunk-check.yml

Previous review (commit 766913d)

Status: 5 Issues Found | Recommendation: Address before merge

Overview

Severity Count
WARNING 1
SUGGESTION 4
Issue Details (click to expand)

WARNING

File Line Issue
crates/sl-viewer/src/app.rs 216 Misleading "load task panicked" message when JoinError can also indicate task cancellation

SUGGESTION

File Line Issue
crates/sl-viewer/src/app.rs 211 Redundant eprintln! duplicates user-visible error output in Ok(Err) branch
crates/sl-viewer/src/app.rs 215 Redundant eprintln! duplicates user-visible error output in Err branch
crates/sl-viewer/tests/session_context_reactivity.rs 35 Hardcoded string assertion makes test fragile to mock data changes
crates/sl-viewer/tests/session_context_reactivity.rs 61 Hardcoded string assertion makes test fragile to mock data changes
Files Reviewed (2 files)
  • crates/sl-viewer/src/app.rs — 3 issues
  • crates/sl-viewer/tests/session_context_reactivity.rs — 2 issues

Fix these issues in Kilo Cloud

Previous review (commit 8eb6219)

Status: 5 Issues Found | Recommendation: Address before merge

Overview

Severity Count
WARNING 1
SUGGESTION 4
Issue Details (click to expand)

WARNING

File Line Issue
crates/sl-viewer/src/app.rs 216 Misleading "load task panicked" message when JoinError can also indicate task cancellation

SUGGESTION

File Line Issue
crates/sl-viewer/src/app.rs 211 Redundant eprintln! duplicates user-visible error output in Ok(Err) branch
crates/sl-viewer/src/app.rs 215 Redundant eprintln! duplicates user-visible error output in Err branch
crates/sl-viewer/tests/session_context_reactivity.rs 35 Hardcoded string assertion makes test fragile to mock data changes
crates/sl-viewer/tests/session_context_reactivity.rs 61 Hardcoded string assertion makes test fragile to mock data changes
Files Reviewed (2 files)
  • crates/sl-viewer/src/app.rs — 3 issues
  • crates/sl-viewer/tests/session_context_reactivity.rs — 2 issues

Fix these issues in Kilo Cloud

Previous review (commit 46cbe8d)

Status: 6 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 2
SUGGESTION 3
Issue Details (click to expand)

CRITICAL

File Line Issue
packaging/macos/install-local.sh 34 Backup rotation is broken — .previous is never updated after the first install, leaving no valid rollback path on subsequent installs

WARNING

File Line Issue
packaging/macos/package-app.sh 31 iconutil errors silently swallowed with `2>/dev/null
crates/sl-viewer/src/app.rs 187 Comment claims web build uses a "synchronous mock path" but the code calls load_sessions directly without checking if it is a mock

SUGGESTION

File Line Issue
packaging/macos/package-app.sh 69 Hardcoded copyright year 2026 will be outdated next year
packaging/macos/package-app.sh 62 NSPrincipalClass set to NSApplication is redundant (macOS default)
crates/sl-viewer/src/app.rs 1123 Unicode checkmark may not render consistently across all fonts/terminals; other badges use ASCII
Files Reviewed (3 files)
  • crates/sl-viewer/src/app.rs — 2 issues
  • packaging/macos/install-local.sh — 1 issue
  • packaging/macos/package-app.sh — 3 issues

Note: The PR contains two commits where the SessionContext type change (SignalVecSignal) and async loading restructuring were introduced in commit 1 and reverted in commit 2, leaving only the rename (corpus_error_signalerror_signal), the badge change ("AC""✓ AC"), and the macOS packaging changes as net diffs. The commit history is confusing and suggests intermediate work that was abandoned mid-PR.

Fix these issues in Kilo Cloud


Reviewed by laguna-s-2.1:free · Input: 76.3K · Output: 12.9K · Cached: 41.2K

}
Ok(Err(e)) => {
corpus_error_signal.set(Some(e));
eprintln!("[sl-viewer] failed to load corpus: {e}");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Redundant eprintln! duplicates user-visible error output

The Ok(Err(e)) branch already surfaces the load failure to the user via error_signal. Printing the same error to stderr is redundant and inconsistent with a structured logging approach.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment thread crates/sl-viewer/src/app.rs Outdated
}
Err(e) => {
corpus_error_signal.set(Some(format!("Internal error: {e}")));
eprintln!("[sl-viewer] load task panicked: {e}");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Redundant eprintln! duplicates user-visible error output

The Err(e) branch already surfaces the load failure to the user via error_signal. Printing the same error to stderr is redundant and inconsistent with a structured logging approach.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment thread crates/sl-viewer/src/app.rs Outdated
Err(e) => {
corpus_error_signal.set(Some(format!("Internal error: {e}")));
eprintln!("[sl-viewer] load task panicked: {e}");
error_signal.set(Some(format!("load task panicked: {e}")));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Misleading error message claims "panicked" when JoinError can also indicate task cancellation

The Err(e) branch is reached when spawn_blocking(...).await returns an error. In Tokio, this is a JoinError, which can occur from a panic or task cancellation. Labeling every such failure as "panicked" is inaccurate and will mislead debugging when the task was cancelled rather than panicked. Consider checking e.is_panic() or using a more generic message like "load task failed: {e}".


Reply with @kilocode-bot fix it to have Kilo Code address this issue.


let update = dom.render_immediate_to_vec();
assert!(
format!("{update:?}").contains("Login timeout fix"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Hardcoded string assertion makes test fragile to mock data changes

The assertion format!("{update:?}").contains("Login timeout fix") couples the test to a specific fixture string. If the mock corpus data changes or is regenerated, this test will break even though the reactivity behavior is correct. Consider asserting on a structural property (e.g., rendered node count, non-empty output) or documenting the fixture dependency explicitly.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.


let update = dom.render_immediate_to_vec();
assert!(
format!("{update:?}").contains("Login timeout fix"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Hardcoded string assertion makes test fragile to mock data changes

The assertion format!("{update:?}").contains("Login timeout fix") couples the test to a specific fixture string. If the mock corpus data changes or is regenerated, this test will break even though the reactivity behavior is correct. Consider asserting on a structural property (e.g., rendered node count, non-empty output) or documenting the fixture dependency explicitly.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/sl-viewer/src/app.rs`:
- Around line 211-216: Update the load-task join handling around the outer Err
branch to preserve the typed tokio::task::JoinError until classification. Use
is_panic to report actual panics as “load task panicked,” and handle
cancellation separately without labeling it a panic; only convert the error to a
string when constructing the displayed error message or storing it through
error_signal.

In `@crates/sl-viewer/src/memory_tab.rs`:
- Around line 62-65: Replace index-based selection in memory_tab.rs lines 62-65
with the selected session ID, and resolve the selected page by matching that ID
after pages recompute. Apply the same session-ID selection and ID-based
resolution in history_tab.rs lines 111-114. Add a reactivity test in
crates/sl-viewer/tests/session_context_reactivity.rs lines 23-64 that selects a
session, replaces or reorders the context collection, and verifies the same
session remains selected.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: ff1b704f-d2f6-4057-ab4c-8987f1a67cfd

📥 Commits

Reviewing files that changed from the base of the PR and between 46cbe8d and 8eb6219.

📒 Files selected for processing (4)
  • crates/sl-viewer/src/app.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/memory_tab.rs
  • crates/sl-viewer/tests/session_context_reactivity.rs
📜 Review details
⏰ Context from checks skipped due to timeout. (31)
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: race smoke + channel/cancel model · macos-latest
  • GitHub Check: race smoke + channel/cancel model · windows-latest
  • GitHub Check: race smoke + channel/cancel model · ubuntu-latest
  • GitHub Check: cargo deny check
  • GitHub Check: sl-daemon build · windows-latest
  • GitHub Check: sl-daemon build · macos-latest
  • GitHub Check: sl-viewer macOS app · artifact
  • GitHub Check: cargo audit
  • GitHub Check: session-ledger build · windows-latest
  • GitHub Check: exotic check · aarch64-unknown-linux-gnu
  • GitHub Check: fuzz blocking · sustained 30s
  • GitHub Check: sl-viewer help · unit tests
  • GitHub Check: sl-daemon build · ubuntu-latest
  • GitHub Check: exotic check · x86_64-unknown-linux-musl
  • GitHub Check: alloc profile hard · dhat smoke
  • GitHub Check: loom permutation · SelfCheck
  • GitHub Check: loom permutation · daemon shutdown
  • GitHub Check: pipeline perf regression gate
  • GitHub Check: soft loom · daemon broadcast
  • GitHub Check: miri permutation · SelfCheck
  • GitHub Check: soft loom · loom_model core
  • GitHub Check: jemalloc default-on · windows default build
  • GitHub Check: jemalloc default-on · unix default build
  • GitHub Check: browser e2e · axe · responsive · visual
  • GitHub Check: tsan permutation · SelfCheck
  • GitHub Check: prepare
  • GitHub Check: Kilo Code Review
  • GitHub Check: Summary
  • GitHub Check: browser e2e · axe · responsive · visual
  • GitHub Check: prepare
⚠️ CI failures not shown inline (6)

GitHub Actions: Trunk Check / 0_Lint & Format.txt: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]GITHUB_TOKEN Permissions
 Contents: read
 Metadata: read
 Packages: read
 ##[endgroup]
 Secret source: Actions
 Prepare workflow directory
 Prepare all required actions
 Getting action download info
 ##[error]Unable to resolve action `trunk-io/trunk-action@d90b9166660d5e5afae248a58172a3a0e99d56d5`, unable to find version `d90b9166660d5e5afae248a58172a3a0e99d56d5`

GitHub Actions: Trunk Check / Lint & Format: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]GITHUB_TOKEN Permissions
 Contents: read
 Metadata: read
 Packages: read
 ##[endgroup]
 Secret source: Actions
 Prepare workflow directory
 Prepare all required actions
 Getting action download info
 ##[error]Unable to resolve action `trunk-io/trunk-action@d90b9166660d5e5afae248a58172a3a0e99d56d5`, unable to find version `d90b9166660d5e5afae248a58172a3a0e99d56d5`

GitHub Actions: signing hard / signing hard · SelfCheck: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/signing-readiness-check.ps1 -SelfCheck
 �[36;1m./scripts/signing-readiness-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Platform signing readiness check (C11 L112 hard evidence)
 Mode: SelfCheck (ADR + release.yml unsigned anchors + blocking hard CI; no secrets / no network)
 ADR 0003 anchors:
   [PASS] ADR deferral title
   [PASS] ADR portable SHA256SUMS trust path
   [PASS] ADR Authenticode deferral
   [PASS] ADR notarization deferral
   [PASS] ADR reconsider triggers
   [PASS] ADR cross-link to signing readiness checklist
 Signing readiness checklist anchors:
   [PASS] checklist heading
   [PASS] unsigned current state section
   [PASS] unsigned MSI artifact naming
   [PASS] unsigned PKG artifact naming
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] soft vs hard gates matrix section
   [PASS] blocking hard CI gate marked done
   [PASS] signing-hard workflow path documented
   [PASS] signing_hard test wrapper documented
   [PASS] unpaid Apple credential gate
   [PASS] unpaid Windows credential gate
   [PASS] signed clean-host smoke unpaid gate
   [PASS] ADR 0001 auto-update unpaid gate
   [PASS] no fake secrets policy
   [PASS] no false platform signing claim
 release.yml unsigned path anchors:
   [PASS] release.yml deferral header comment
   [PASS] unsigned Windows MSI packaging step
   [PASS] unsigned macOS PKG packaging step
   [PASS] package-msi.ps1 invocation
   [PASS] smoke-windows job
   [PASS] smoke-macos-pkg job
   [PASS] MSI silent install smoke anchor
   [PASS] ADR 0003 reference in release workflow
   [PASS] release signing-readiness job
   [PASS] release invokes signing-readiness SelfCheck
   [PASS] release.yml smoke + signing-readiness job definitions present
 signing-hard workflow blocking-gate anchors:
   [PASS] hard workflow has no continue-on-error
   [PASS] hard workflow triggers on pull_request
   [PASS] hard workflow runs signing-readiness-check....

GitHub Actions: signing hard / 0_signing hard · SelfCheck.txt: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/signing-readiness-check.ps1 -SelfCheck
 �[36;1m./scripts/signing-readiness-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Platform signing readiness check (C11 L112 hard evidence)
 Mode: SelfCheck (ADR + release.yml unsigned anchors + blocking hard CI; no secrets / no network)
 ADR 0003 anchors:
   [PASS] ADR deferral title
   [PASS] ADR portable SHA256SUMS trust path
   [PASS] ADR Authenticode deferral
   [PASS] ADR notarization deferral
   [PASS] ADR reconsider triggers
   [PASS] ADR cross-link to signing readiness checklist
 Signing readiness checklist anchors:
   [PASS] checklist heading
   [PASS] unsigned current state section
   [PASS] unsigned MSI artifact naming
   [PASS] unsigned PKG artifact naming
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] soft vs hard gates matrix section
   [PASS] blocking hard CI gate marked done
   [PASS] signing-hard workflow path documented
   [PASS] signing_hard test wrapper documented
   [PASS] unpaid Apple credential gate
   [PASS] unpaid Windows credential gate
   [PASS] signed clean-host smoke unpaid gate
   [PASS] ADR 0001 auto-update unpaid gate
   [PASS] no fake secrets policy
   [PASS] no false platform signing claim
 release.yml unsigned path anchors:
   [PASS] release.yml deferral header comment
   [PASS] unsigned Windows MSI packaging step
   [PASS] unsigned macOS PKG packaging step
   [PASS] package-msi.ps1 invocation
   [PASS] smoke-windows job
   [PASS] smoke-macos-pkg job
   [PASS] MSI silent install smoke anchor
   [PASS] ADR 0003 reference in release workflow
   [PASS] release signing-readiness job
   [PASS] release invokes signing-readiness SelfCheck
   [PASS] release.yml smoke + signing-readiness job definitions present
 signing-hard workflow blocking-gate anchors:
   [PASS] hard workflow has no continue-on-error
   [PASS] hard workflow triggers on pull_request
   [PASS] hard workflow runs signing-readiness-check....

GitHub Actions: rootless no-net / rootless_no-net · SelfCheck: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/rootless-nonet-check.ps1 -SelfCheck
 �[36;1m./scripts/rootless-nonet-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Hard rootless / no-net CI evidence check (C04 L40)
 Mode: SelfCheck (docs + workflow + security/ci anchors; no build / no network)
 Hard rootless / no-net doc anchors:
   [PASS] hard rootless/no-net section heading
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] blocking workflow gate marked done
   [PASS] rootless-nonet workflow path documented
   [PASS] cargo test wrapper documented
   [PASS] hard rootless runner matrix remains unpaid
   [PASS] hard no-net cargo-fetch enforcement remains unpaid
   [PASS] no false hard enforcement claim
 rootless-nonet workflow blocking-gate anchors:
   [PASS] workflow has no continue-on-error
   [PASS] workflow triggers on pull_request
   [PASS] workflow runs rootless-nonet-check.ps1
 security.yml / ci.yml cross-reference anchors:
   [PASS] security.yml references rootless-nonet workflow
   [PASS] security.yml references rootless-nonet SelfCheck script
   [FAIL] ci.yml references rootless-nonet workflow
 �[31;1mException: �[0m/home/runner/work/SessionLedger/SessionLedger/scripts/rootless-nonet-check.ps1:64�[0m
 �[31;1m�[0m�[36;1mLine |�[0m
 �[31;1m�[0m�[36;1m�[36;1m  64 | �[0m         �[36;1mthrow "$Context missing required anchor: '$Needle'"�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m     | �[31;1m         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m�[31;1m�[31;1m�[36;1m     | �[31;1m.github/workflows/ci.yml missing required anchor: 'rootless-nonet.yml'�[0m
 ##[error]Process completed with exit code 1.

GitHub Actions: rootless no-net / 0_rootless_no-net · SelfCheck.txt: feat(macos): preserve async corpus packaging lane

Conclusion: failure

View job details

##[group]Run ./scripts/rootless-nonet-check.ps1 -SelfCheck
 �[36;1m./scripts/rootless-nonet-check.ps1 -SelfCheck�[0m
 shell: /usr/bin/pwsh -command ". '{0}'"
 ##[endgroup]
 Hard rootless / no-net CI evidence check (C04 L40)
 Mode: SelfCheck (docs + workflow + security/ci anchors; no build / no network)
 Hard rootless / no-net doc anchors:
   [PASS] hard rootless/no-net section heading
   [PASS] SelfCheck script reference
   [PASS] SelfCheck gate marked done
   [PASS] blocking workflow gate marked done
   [PASS] rootless-nonet workflow path documented
   [PASS] cargo test wrapper documented
   [PASS] hard rootless runner matrix remains unpaid
   [PASS] hard no-net cargo-fetch enforcement remains unpaid
   [PASS] no false hard enforcement claim
 rootless-nonet workflow blocking-gate anchors:
   [PASS] workflow has no continue-on-error
   [PASS] workflow triggers on pull_request
   [PASS] workflow runs rootless-nonet-check.ps1
 security.yml / ci.yml cross-reference anchors:
   [PASS] security.yml references rootless-nonet workflow
   [PASS] security.yml references rootless-nonet SelfCheck script
   [FAIL] ci.yml references rootless-nonet workflow
 �[31;1mException: �[0m/home/runner/work/SessionLedger/SessionLedger/scripts/rootless-nonet-check.ps1:64�[0m
 �[31;1m�[0m�[36;1mLine |�[0m
 �[31;1m�[0m�[36;1m�[36;1m  64 | �[0m         �[36;1mthrow "$Context missing required anchor: '$Needle'"�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m     | �[31;1m         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[0m
 �[31;1m�[0m�[36;1m�[36;1m�[0m�[36;1m�[0m�[36;1m�[31;1m�[31;1m�[36;1m     | �[31;1m.github/workflows/ci.yml missing required anchor: 'rootless-nonet.yml'�[0m
 ##[error]Process completed with exit code 1.
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{rs,toml}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,toml}: Use the Rust toolchain pinned in rust-toolchain.toml; the workspace MSRV is Rust 1.85.
Validate Rust workspace changes with the prescribed locked build, all-features test suite, Clippy, and rustfmt checks where applicable.

Files:

  • crates/sl-viewer/tests/session_context_reactivity.rs
  • crates/sl-viewer/src/app.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/memory_tab.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Fix Clippy warnings; do not add #[allow] unless it includes a tracking-issue comment.

Files:

  • crates/sl-viewer/tests/session_context_reactivity.rs
  • crates/sl-viewer/src/app.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/memory_tab.rs
crates/sl-viewer/**/*.{rs,toml}

📄 CodeRabbit inference engine (AGENTS.md)

crates/sl-viewer/**/*.{rs,toml}: The sl-viewer crate uses Dioxus 0.6; use the Dioxus CLI/toolchain for desktop development and bundling.
Use cargo check -p sl-viewer as the fast inner-loop check for viewer changes.

Files:

  • crates/sl-viewer/tests/session_context_reactivity.rs
  • crates/sl-viewer/src/app.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/memory_tab.rs
crates/sl-viewer/**/*

📄 CodeRabbit inference engine (AGENTS.md)

When packaging the macOS viewer, account for the documented Electrobun/Dioxus code-signing requirements.

Files:

  • crates/sl-viewer/tests/session_context_reactivity.rs
  • crates/sl-viewer/src/app.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/memory_tab.rs
🔇 Additional comments (5)
crates/sl-viewer/tests/session_context_reactivity.rs (1)

3-8: 📐 Maintainability & Code Quality

Validate the resolved Dioxus version and the viewer cohort.

The supplied library context reports Dioxus 0.7.0. The repository guidance requires Dioxus 0.6 for sl-viewer. Confirm that the workspace dependency resolves to 0.6.

Before merge, use rust-toolchain.toml and run the prescribed locked workspace build, all-features test suite, Clippy, rustfmt, and cargo check -p sl-viewer.

Source: Coding guidelines

crates/sl-viewer/src/app.rs (4)

185-190: Keep the web-path comment conditional on DataSource::Mock.

load_sessions(&source) is synchronous for every non-desktop source. resolve_data_source() is not shown to guarantee DataSource::Mock, while crates/sl-viewer/src/corpus_loader.rs supports DataSource::Auto and DataSource::ForgeDb. If web can resolve either source, this branch can block the UI. State the comment conditionally or enforce DataSource::Mock for web.


1125-1125: Verify the glyph in supported viewer fonts.

This repeats the existing concern. Verify the visual fixtures on supported web and desktop targets, or use an icon with a defined fallback.


185-190: 🎯 Functional Correctness

Verify the pinned Dioxus and Rust toolchain before merge.

Confirm that Cargo.toml and Cargo.lock use Dioxus 0.6. Run cargo check -p sl-viewer with rust-toolchain.toml. Complete the prescribed locked build, all-features tests, Clippy, and rustfmt checks.

As per coding guidelines, crates/sl-viewer/**/*.{rs,toml} uses Dioxus 0.6, Rust 1.85, and requires cargo check -p sl-viewer for viewer changes.

Source: Coding guidelines


834-834: LGTM!

Comment thread crates/sl-viewer/src/app.rs Outdated
Comment thread crates/sl-viewer/src/memory_tab.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/sl-viewer/src/app.rs (1)

189-209: 📐 Maintainability & Code Quality | 🔵 Trivial

Complete the required Rust validation before merge.

The PR status says workspace Cargo validation remains in progress. Run the pinned-toolchain locked build, cargo check -p sl-viewer, the all-features test suite, Clippy, and rustfmt checks. The cached diff check does not validate these viewer paths or desktop/non-desktop feature combinations.

As per coding guidelines, **/*.{rs,toml} requires the pinned rust-toolchain.toml, MSRV Rust 1.85, and the prescribed locked build, all-features test suite, Clippy, and rustfmt checks; crates/sl-viewer/**/*.{rs,toml} also requires cargo check -p sl-viewer for viewer changes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/sl-viewer/src/app.rs` around lines 189 - 209, Complete the required
Rust validation for the sl-viewer changes using the pinned rust-toolchain.toml
and locked dependencies: run the prescribed locked build, cargo check -p
sl-viewer, the all-features test suite, Clippy, and rustfmt checks. Verify both
desktop and non-desktop feature combinations are covered and ensure all checks
pass before merge.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/trunk-check.yml:
- Around line 31-32: Update the “Trunk Check” workflow step’s action cache
configuration so its cache key tracks the checked-in trunk.yaml configuration
file; add trunk.yaml to the existing key inputs or remove the cache until it
covers the active configuration, while preserving the pinned Trunk action.
- Around line 31-32: Update the Trunk Check workflow step to use a
trunk-io/trunk-action release that embeds actions/upload-artifact v4 or newer,
replacing the pinned v1.0.5 reference; only retain the current release if this
workflow is explicitly restricted to GHES.
- Around line 31-32: Update the workflow steps before the “Trunk Check” action
to provision the environments required by the enabled project-dependent linters:
configure the Rust toolchain/cache for clippy, install Python dependencies for
mypy, and set up Go for golangci-lint; ensure the existing ESLint and Biome
checks also have their required project dependencies available, or disable any
linter that cannot run self-contained.
- Around line 34-38: The scheduled “Trunk Upgrade (on schedule only)” step
incorrectly passes trunk-args to trunk-action and reruns checks instead of
upgrading. Replace its action-based invocation with a scheduled command that
runs trunk upgrade using the supported arguments mechanism, then commit and
upload the resulting trunk.yaml when automatic upgrades are enabled.

In `@crates/sl-viewer/src/memory_tab.rs`:
- Line 138: Remove the unused enumerate indices from the viewer list loops: in
crates/sl-viewer/src/memory_tab.rs at lines 138-138, update the pages loop to
iterate directly over pages; in crates/sl-viewer/src/history_tab.rs at lines
196-196, update the entries loop to iterate directly over entries. Preserve each
loop’s existing body behavior.

---

Outside diff comments:
In `@crates/sl-viewer/src/app.rs`:
- Around line 189-209: Complete the required Rust validation for the sl-viewer
changes using the pinned rust-toolchain.toml and locked dependencies: run the
prescribed locked build, cargo check -p sl-viewer, the all-features test suite,
Clippy, and rustfmt checks. Verify both desktop and non-desktop feature
combinations are covered and ensure all checks pass before merge.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 7f12221d-0a33-404f-946f-18f2d7c3e44a

📥 Commits

Reviewing files that changed from the base of the PR and between 8eb6219 and 6abc79d.

📒 Files selected for processing (5)
  • .github/workflows/trunk-check.yml
  • crates/sl-viewer/src/app.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/memory_tab.rs
  • tests/visual/harness/visual.spec.js
📜 Review details
⏰ Context from checks skipped due to timeout. (6)
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: Summary
  • GitHub Check: prepare
  • GitHub Check: browser e2e · axe · responsive · visual
  • GitHub Check: browser e2e · axe · responsive · visual
  • GitHub Check: prepare
⚠️ CI failures not shown inline (2)

GitHub Check: Summary: The current Mergify configuration is invalid

Conclusion: failure

View job details

* Invalid condition 'author=dependabot[bot] | renovate[bot]' @ root → pull_request_rules → item 1 → conditions → item 0 → author=dependabot[bot] | renovate[bot]
```
Invalid GitHub login
```
* Invalid condition 'author=trunk-io[bot] | mergify[bot] | github-actions[bot]' @ root → pull_request_rules → item 2 → conditions → item 0 → author=trunk-io[bot] | mergify[bot] | github-actions[bot]
```
Invalid GitHub login
```
* Invalid condition 'age&gt;=30d' @ root → pull_request_rules → item 8 → conditions → item 2 → age>=30d
```
Invalid attribute
```
* Extra inputs are not permitted @ root → pull_request_rules → item 0 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 1 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 3 → actions → request_reviews → github_accounts

GitHub Check: Mergify Merge Queue: The current Mergify configuration is invalid

Conclusion: failure

View job details

* Invalid condition 'author=dependabot[bot] | renovate[bot]' @ root → pull_request_rules → item 1 → conditions → item 0 → author=dependabot[bot] | renovate[bot]
```
Invalid GitHub login
```
* Invalid condition 'author=trunk-io[bot] | mergify[bot] | github-actions[bot]' @ root → pull_request_rules → item 2 → conditions → item 0 → author=trunk-io[bot] | mergify[bot] | github-actions[bot]
```
Invalid GitHub login
```
* Invalid condition 'age&gt;=30d' @ root → pull_request_rules → item 8 → conditions → item 2 → age>=30d
```
Invalid attribute
```
* Extra inputs are not permitted @ root → pull_request_rules → item 0 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 1 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 3 → actions → request_reviews → github_accounts
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{rs,toml}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,toml}: Use the Rust toolchain pinned in rust-toolchain.toml; the workspace MSRV is Rust 1.85.
Validate Rust workspace changes with the prescribed locked build, all-features test suite, Clippy, and rustfmt checks where applicable.

Files:

  • crates/sl-viewer/src/memory_tab.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/app.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Fix Clippy warnings; do not add #[allow] unless it includes a tracking-issue comment.

Files:

  • crates/sl-viewer/src/memory_tab.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/app.rs
crates/sl-viewer/**/*.{rs,toml}

📄 CodeRabbit inference engine (AGENTS.md)

crates/sl-viewer/**/*.{rs,toml}: The sl-viewer crate uses Dioxus 0.6; use the Dioxus CLI/toolchain for desktop development and bundling.
Use cargo check -p sl-viewer as the fast inner-loop check for viewer changes.

Files:

  • crates/sl-viewer/src/memory_tab.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/app.rs
crates/sl-viewer/**/*

📄 CodeRabbit inference engine (AGENTS.md)

When packaging the macOS viewer, account for the documented Electrobun/Dioxus code-signing requirements.

Files:

  • crates/sl-viewer/src/memory_tab.rs
  • crates/sl-viewer/src/history_tab.rs
  • crates/sl-viewer/src/app.rs
🪛 zizmor (1.28.0)
.github/workflows/trunk-check.yml

[warning] 28-29: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🔇 Additional comments (8)
tests/visual/harness/visual.spec.js (1)

94-94: LGTM!

crates/sl-viewer/src/app.rs (2)

187-188: Use a code-accurate description of the non-desktop branch.

#[cfg(not(feature = "desktop"))] selects synchronous loading for every non-desktop build. It does not force DataSource::Mock; resolve_data_source() supplies source, and load_sessions also accepts DataSource::Auto and optional DataSource::ForgeDb. Replace “synchronous mock path” with “synchronous non-desktop loading path,” unless the web resolver is proven to return DataSource::Mock.


221-226: LGTM!

Also applies to: 844-844, 1135-1135

crates/sl-viewer/src/memory_tab.rs (2)

62-68: LGTM!

Also applies to: 139-143, 158-158


182-182: 🎯 Functional Correctness

No change needed for the click handlers

page.session_id.clone() and entry.summary.id.clone() only clone the session ID into the click payload; the rendered ID fields still receive borrowed references from the original values.

			> Likely an incorrect or invalid review comment.
crates/sl-viewer/src/history_tab.rs (1)

111-117: LGTM!

Also applies to: 197-201, 216-223

.github/workflows/trunk-check.yml (2)

1-26: LGTM!


28-29: 🔒 Security & Privacy

Verify the checkout credential policy.

actions/checkout persists the checkout token by default. The static analyzer flags this pattern. Trunk v1.0.5 also fetches origin refs during PR and push checks. Set persist-credentials: false if the repository is public or Trunk has another fetch credential. Verify this before changing it for a private repository. (github.com)

Source: Linters/SAST tools

Comment on lines +31 to +32
- name: Trunk Check
uses: trunk-io/trunk-action@274409d390f23841b19a1b84b55339196b56453d # v1.0.5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'Tracked Trunk configuration paths:\n'
git ls-files -- 'trunk.yaml' '.trunk/trunk.yaml'

printf '\nPinned action cache expression:\n'
curl -fsSL \
  https://raw.githubusercontent.com/trunk-io/trunk-action/v1.0.5/action.yaml |
  rg -n 'hashFiles'

Repository: KooshaPari/SessionLedger

Length of output: 318


🌐 Web query:

github.com/trunk-io/trunk-action v1.0.5 action.yaml run command config cache key

💡 Result:

In the trunk-io/trunk-action GitHub Action (including version v1.0.5), the cache-key input is defined in action.yaml as a string used to create a unique identifier for the GitHub Actions cache [1][2][3]. The action internally constructs the cache key using a combination of the cache-key input, the runner's operating system, and a hash of the configuration file [3]. Specifically, the internal shell implementation generates the key as follows [3]: INPUT_CACHE_KEY=trunk-${{ inputs.cache-key }}-${{ runner.os }}-${{ hashFiles('.trunk/trunk.yaml') }} This key is subsequently used by the internal actions/cache step to persist or restore the contents of the Trunk cache path (~/.cache/trunk) between workflow runs on ephemeral CI runners [4][3][5]. The cache-key input allows users to provide a custom segment to this identifier, typically representing the repository name and/or branch, to ensure cache isolation and prevent collisions [2][6][3].

Citations:


Make the Trunk action cache track the checked-in configuration file.

The repository tracks trunk.yaml, but this action hash path is .trunk/trunk.yaml. Custom Trunk files can invalidate this key and recreate the cache even when the active configuration remains unchanged. Add trunk.yaml to the key or remove the action cache until the key covers the actual config.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/trunk-check.yml around lines 31 - 32, Update the “Trunk
Check” workflow step’s action cache configuration so its cache key tracks the
checked-in trunk.yaml configuration file; add trunk.yaml to the existing key
inputs or remove the cache until it covers the active configuration, while
preserving the pinned Trunk action.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

curl -fsSL \
  https://raw.githubusercontent.com/trunk-io/trunk-action/v1.0.5/action.yaml |
  rg -n 'upload-artifact@|save-annotations|TRUNK_UPLOAD_ANNOTATIONS'

Repository: KooshaPari/SessionLedger

Length of output: 453


🌐 Web query:

actions/upload-artifact v3 GitHub support January 30 2025 GitHub Actions retirement

💡 Result:

As of January 30, 2025, version 3 (v3) of the actions/upload-artifact and actions/download-artifact GitHub Actions reached their end-of-life and are no longer supported on GitHub.com [1][2][3]. Key details regarding this retirement: 1. Retirement Status: Attempting to use v3 of these actions in workflows on GitHub.com results in workflow failures [1][2]. 2. Reason for Change: GitHub transitioned to v4 (and subsequent versions) of these artifact actions to provide performance improvements, including upload and download speeds that are up to 98% faster [1][3]. 3. GitHub Enterprise Server (GHES): This deprecation applies specifically to GitHub.com [3]. It does not impact versions of these actions used within GitHub Enterprise Server environments, where v3 continues to be supported [1][2][3]. 4. Migration: Users were advised to update their workflows to v4 or later versions of the artifact actions to avoid disruptions [1][4]. While v3 releases may still exist in repositories for GHES compatibility, they are explicitly marked as deprecated for use on GitHub.com [5].

Citations:


Update the Trunk action release for fork pull requests.

The pinned trunk-io/trunk-action v1.0.5 upload step for saved annotations calls actions/upload-artifact@v3. GitHub stopped supporting artifact action v3 on January 30, 2025, so fork pull request runs on GitHub.com can fail after Trunk completes. Use a Trunk action release that embeds artifact v4+ for GitHub.com, or confirm this workflow runs only on GHES.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/trunk-check.yml around lines 31 - 32, Update the Trunk
Check workflow step to use a trunk-io/trunk-action release that embeds
actions/upload-artifact v4 or newer, replacing the pinned v1.0.5 reference; only
retain the current release if this workflow is explicitly restricted to GHES.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

rg -n -C2 \
  'cargo (fetch|build|check|test)|rustup|pip(3)? (install|sync)|poetry install|uv (sync|pip)|npm (ci|install)|pnpm (install|i)|yarn install|go mod (download|tidy)' \
  .github/workflows --glob '*.yml' --glob '*.yaml' || true

Repository: KooshaPari/SessionLedger

Length of output: 21344


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "== trunk-check workflow =="
cat -n .github/workflows/trunk-check.yml | sed -n '1,80p'

echo
echo "== trunk config files =="
for f in trunk.yaml trunk.yml .trunk.yaml .trunk.yml; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    cat -n "$f" | sed -n '1,220p'
  fi
done

echo
echo "== repo dependency manifests =="
for f in pyproject.toml Cargo.toml Cargo.lock go.mod package.json pnpm-lock.yaml yarn.lock poetry.lock; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    sed -n '1,80p' "$f"
  fi
done

echo
echo "== workflow dependency setup absence for trunk-check =="
python3 - <<'PY'
from pathlib import Path
import re, yaml

path = Path('.github/workflows/trunk-check.yml')
yaml_text = path.read_text()
try:
    data = yaml.safe_load(yaml_text)
except Exception as e:
    print('YAML parse error:', e)
    raise

patterns = [
    r'actions/(setup-java|setup-node|setup-python|setup-go)\b',
    r'cargo (fetch|build|check|test|--locked|\b)',
    r'(pip|pip3|poetry|uv)( /usr/local/bin/)?(?:\s+install|sync)',
    r'go (mod|get)\b',
    r'npm (ci|install)\b',
    r'pnpm (install|i)\b',
    r'([A-Za-z_][A-Za-z0-9_]*/)?yarn (install|i)\b',
]
combined = re.compile('|'.join(p for p in patterns if '^' not in p))

print('steps:')
for idx, step in enumerate(data.get('steps', []), 1):
    print(f'{idx}: {step.get("name", step.get("run", "uses"))}')

for idx, step in enumerate(data.get('steps', []), 1):
    txt = ' '.join(str(v) for v in step.values())
    if any(p.search(txt) for p in patterns if p[0] != '^'):
        print(f'MATCH step {idx}: {step.get("name", step.get("run", "uses"))}')
PY

Repository: KooshaPari/SessionLedger

Length of output: 11606


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "== manifests present =="
git ls-files 'Cargo.toml' 'pyproject.toml' 'poetry.lock' 'Pipfile' 'requirements*.txt' 'go.mod' 'go.sum' 'package.json' 'package-lock.json' 'pnpm-lock.yaml' 'yarn.lock' | sort

echo
echo "== relevant project configs =="
for f in pyproject.toml .eslintrc.js .eslintrc.json .golangci.yml .golangci.yaml biome.json package.json; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    cat -n "$f"
  fi
done

echo
echo "== root go module files =="
find . -maxdepth 4 -name 'go.mod' -print | sort
for f in $(find . -maxdepth 4 -name 'go.mod' -print | sort); do
  echo "--- $f ---"
  sed -n '1,160p' "$f"
done

echo
echo "== package manifest dependency snippets =="
if [ -f package.json ]; then
  echo "package.json scripts/deps:"
  python3 - <<'PY'
import json
from pathlib import Path
d=json.loads(Path('package.json').read_text())
for k in ['scripts','dependencies','devDependencies']:
    print(f'[{k}]')
    v=d.get(k,{})
    for line in json.dumps(v, indent=2, sort_keys=True).splitlines():
        src='pyproject.toml'
        print(line)
PY
fi

echo
echo "== trunk-config-relevant linter config files present =="
for f in pyproject.toml mypy.ini setup.cfg ruff.toml clippy.toml .clippy.toml rustfmt.toml .rustfmt.toml biome.json .eslintrc.js .eslintrc.json .eslintrc.yml eslint.config.js .prettierrc .prettierrc.json .prettierrc.yml prettier.config.js .golangci.yml .golangci.yaml golangci-lint.yaml; do
  if [ -f "$f" ]; then
    echo "$f"
  fi
done

Repository: KooshaPari/SessionLedger

Length of output: 488


Run Trunk Check with the language environments Trunk needs.

This workflow installs no Rust cache/toolchain setup, no Python dependency installation, and no Go setup even though trunk.yaml enables project-dependent linters such as clippy, mypy, golangci-lint, eslint, and biome. Add the minimal setup before the Trunk step for each enabled self-check path, or disable non-self-contained linters until the environment is prepared.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/trunk-check.yml around lines 31 - 32, Update the workflow
steps before the “Trunk Check” action to provision the environments required by
the enabled project-dependent linters: configure the Rust toolchain/cache for
clippy, install Python dependencies for mypy, and set up Go for golangci-lint;
ensure the existing ESLint and Biome checks also have their required project
dependencies available, or disable any linter that cannot run self-contained.

Comment on lines +34 to +38
- name: Trunk Upgrade (on schedule only)
if: github.event_name == 'schedule'
uses: trunk-io/trunk-action@274409d390f23841b19a1b84b55339196b56453d # v1.0.5
with:
trunk-args: --upgrade

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

base='https://raw.githubusercontent.com/trunk-io/trunk-action/v1.0.5'

curl -fsSL "$base/action.yaml" | rg -n 'arguments:|trunk-args' || true
curl -fsSL "$base/all.sh" | rg -n 'TRUNK_PATH|INPUT_ARGUMENTS'
curl -fsSL "$base/readme.md" | rg -n 'trunk upgrade'

Repository: KooshaPari/SessionLedger

Length of output: 528


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo '--- workflow excerpt ---'
sed -n '1,80p' .github/workflows/trunk-check.yml

echo '--- action inputs excerpt ---'
base='https://raw.githubusercontent.com/trunk-io/trunk-action/v1.0.5'
sed -n '1,35p' "$base/action.yaml"

echo '--- action scripts excerpt ---'
for f in "$base/audit-pr.sh" "$base/pr.sh" "$base/schedule.sh"; do
  echo "### $f"
  sed -n '1,50p' "$f"
done

echo '--- package action files list ---'
curl -fsSL "$base/action.yaml" | sed -n '1,80p'

Repository: KooshaPari/SessionLedger

Length of output: 1528


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo '--- workflow excerpt ---'
sed -n '1,90p' .github/workflows/trunk-check.yml

echo '--- current repo files ---'
git ls-files .github/workflows/trunk-check.yml .github/workflows | sed -n '1,120p'

echo '--- workflow references to trunk-action/trunk args ---'
rg -n 'trunk-action|trunk-args|arguments:' .github/workflows/trunk-check.yml .github/workflows 2>/dev/null || true

Repository: KooshaPari/SessionLedger

Length of output: 3768


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo '--- pinned action files ---'
tmp="$PWD/.tmp-verify-pinned-trunk-action"
rm -rf "$tmp"
mkdir -p "$tmp"
cd "$tmp"

git init --quiet
git remote add origin https://github.com/trunk-io/trunk-action
git fetch --depth=1 origin 274409d390f23841b19a1b84b55339196b56453d --no-tags --quiet
git checkout --quiet FETCH_HEAD

echo '--- action.yaml inputs ---'
sed -n '1,45p' action.yaml

echo '--- action scripts summary ---'
for f in audit-pr.sh all.sh pr.sh schedule.sh; do
  echo "### $f"
  sed -n '1,80p' "$f"
done

echo '--- direct references in pinned action ---'
rg -n 'trunk-args|trunk upgrade|TRUNK_PATH|INPUT_ARGUMENTS|trunk check' -S . || true

echo '--- local action.yaml from pinned checkout ---'
sed -n '1,45p' "$tmp/action.yaml"

echo '--- local scripts from pinned checkout ---'
for f in "$tmp/audit-pr.sh" "$tmp/all.sh" "$tmp/pr.sh" "$tmp/schedule.sh"; do
  echo "### $f"
  sed -n '1,80p' "$f"
done

Repository: KooshaPari/SessionLedger

Length of output: 1725


Run trunk upgrade outside the check-only action.

trunk-args is not a valid input for trunk-io/trunk-action@v1.0.5; the action exposes arguments. This step also runs the Trunk Check step again, and checks are not upgrades. Add a separate scheduled step that runs trunk upgrade and commits/uploads trunk.yaml if automatic upgrades are intended.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/trunk-check.yml around lines 34 - 38, The scheduled “Trunk
Upgrade (on schedule only)” step incorrectly passes trunk-args to trunk-action
and reruns checks instead of upgrading. Replace its action-based invocation with
a scheduled command that runs trunk upgrade using the supported arguments
mechanism, then commit and upload the resulting trunk.yaml when automatic
upgrades are enabled.

div { class: "sidebar",
h2 { "Distilled Memory" }
for (i, page) in pages.iter().enumerate() {
for (_i, page) in pages.iter().enumerate() {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Rust toolchain / workspace files:"
git ls-files | rg '(^|/)rust-toolchain\.toml$|Cargo\.toml$|clippy|sl-viewer/src/(memory_tab|history_tab)\.rs$' || true

echo
echo "Relevant file sections:"
for f in crates/sl-viewer/src/memory_tab.rs crates/sl-viewer/src/history_tab.rs; do
  echo "--- $f lines 120-235 ---"
  sed -n '120,235p' "$f" | cat -n -v
done

echo
echo "Current Clippy/lint config references:"
rg -n "unused_enumerate_index|clippy|#![|allow\(" Cargo.toml crates/sl-viewer Cargo.lock rust-toolchain.toml 2>/dev/null || true

Repository: KooshaPari/SessionLedger

Length of output: 154


🏁 Script executed:

#!/bin/bash
set -eu a pipefail

# Check whether the local environment has the toolchain/lint targets needed for a deterministic local probe.
# This does not run repository code; it only reports rustc/cargo/toolchain availability and project file paths.
echo
echo "Toolchain availability:"
command -v rustup || true
command -v cargo || true
command -v rustc || true
rustup show 2>&1 | sed -n '1,20p' || true

echo
echo "Project Cargo lint-related config:"
if [ -f rust-toolchain.toml ]; then echo "rust-toolchain.toml"; cat rust-toolchain.toml; fi
python3 - <<'PY'
import os, pathlib, re
for p in pathlib.Path('.').glob('**/Cargo.toml'):
    if 'target' in os.path.relpath(p,'.') and '.git' in os.path.relpath(p,'/'):
        continue
    text=p.read_text(errors='ignore')
    if any(s in text for s in ['clippy', 'lints']):
        print(f'--- {p}')
        for i,line in enumerate(text.splitlines(),1):
            if 'clippy' in line or 'lints' in line or 'warn' in line or 'deny' in line or 'allow' in line:
                print(f'{i}: {line}')
PY

Repository: KooshaPari/SessionLedger

Length of output: 154


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Files:\n'
git ls-files -- 'crates/sl-viewer/src/memory_tab.rs' 'crates/sl-viewer/src/history_tab.rs' 'rust-toolchain.toml' 'Cargo.toml' 'Cargo.lock' | sed -n '1,120p'

printf '\nRelevant loop sections:\n'
for f in crates/sl-viewer/src/memory_tab.rs crates/sl-viewer/src/history_tab.rs; do
  echo "--- $f ---"
  wc -l "$f"
  sed -n '110,245p' "$f" | cat -n
done

printf '\nLint/clippy config references:\n'
rg -n --hidden --glob '!target/**' --glob '!**/*.svg' 'unused_enumerate_index|clippy|lints|WARNING|deny|allow' \
  'rust-toolchain.toml' 'Cargo.toml' 'crates/sl-viewer/Cargo.toml' 'Cargo.lock' 2>/dev/null || true

printf '\nDirect index usage around relevant lines:\n'
python3 - <<'PY'
import pathlib, re
for path in ['crates/sl-viewer/src/memory_tab.rs', 'crates/sl-viewer/src/history_tab.rs']:
    p=pathlib.Path(path)
    if not p.exists():
        print(f'MISSING {path}')
        continue
    lines=p.read_text(errors='ignore').splitlines()
    for i,line in enumerate(lines,1):
        if '_i' in line or 'enumerate()' in line or f'for (_, ' in line:
            print(f'{path}:{i}: {line.strip()}')
PY

Repository: KooshaPari/SessionLedger

Length of output: 154


🏁 Script executed:

#!/bin/bash
set -u

printf 'Repository files (limited):\n'
if command -v git >/dev/null 2>&1; then
  timeout 30 git ls-files -- 'crates/sl-viewer/src/memory_tab.rs' 'crates/sl-viewer/src/history_tab.rs' 'rust-toolchain.toml' 'Cargo.toml' 'Cargo.lock' 2>/dev/null | sed -n '1,120p'
else
  printf 'git not available\n'
fi

printf '\nRelevant loop sections:\n'
for f in crates/sl-viewer/src/memory_tab.rs crates/sl-viewer/src/history_tab.rs; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    wc -l "$f"
    sed -n '110,245p' "$f" | cat -n
  else
    echo "MISSING $f"
  fi
done

Repository: KooshaPari/SessionLedger

Length of output: 13115


Remove the discarded enumerate() indices in the viewer list loops.

The _i value is never used. Use for page in pages.iter() in crates/sl-viewer/src/memory_tab.rs and for entry in entries.iter() in crates/sl-viewer/src/history_tab.rs to satisfy Clippy’s unused-enumerate-index warning.

📍 Affects 2 files
  • crates/sl-viewer/src/memory_tab.rs#L138-L138 (this comment)
  • crates/sl-viewer/src/history_tab.rs#L196-L196
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/sl-viewer/src/memory_tab.rs` at line 138, Remove the unused enumerate
indices from the viewer list loops: in crates/sl-viewer/src/memory_tab.rs at
lines 138-138, update the pages loop to iterate directly over pages; in
crates/sl-viewer/src/history_tab.rs at lines 196-196, update the entries loop to
iterate directly over entries. Preserve each loop’s existing body behavior.

Source: Coding guidelines

@KooshaPari

Copy link
Copy Markdown
Owner Author

Closed as stale. The async corpus loading that this PR packages is now on main (commit 6bee35d — see /Applications/SessionLedger.app opening in ~1s with daemon). Branch feat/preserve-async-corpus-load retained for reference.

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.

3 participants