gsxdsm
079c428af9
chore(release): v0.48.0
...
Version bump via changesets.
2026-06-24 23:56:23 -07:00
gsxdsm
eb3833a542
FN-6971: retire dual-observe cutover gating
...
Remove stale dual-observe prerequisites from workflow-authoritative readiness while preserving parity-summary safeguards.
- Require the authoritative flag plus clean populated parity summaries for interpreter cutover readiness.
- Keep persisted workflowInterpreterDualObserve values inert in runtime tests and documentation.
- Update cutover, parity, and graph-executor tests to reflect retired shadow observation behavior.
- Add a formatted patch changeset for the operator-facing cutover readiness fix.
Files changed:
.changeset/fn-6971-workflow-cutover-readiness.md | 7 ++
docs/architecture.md | 2 +-
docs/settings-reference.md | 4 +-
docs/workflow-steps.md | 19 +++--
.../core/src/__tests__/workflow-cutover.test.ts | 19 +++--
packages/core/src/workflow-cutover.ts | 9 +--
.../workflow-interpreter-cutover.test.ts | 87 +++++++++++++++++++---
.../workflow-interpreter-dual-observe.test.ts | 76 ++++++-------------
.../src/__tests__/stepwise-workflow-parity.test.ts | 25 ++++---
.../engine/src/workflow-authoritative-driver.ts | 10 +--
10 files changed, 152 insertions(+), 106 deletions(-)
Fusion-Task-Id: FN-6971
Fusion-Task-Lineage: 363a441d-62e5-403c-9389-75fcf788352a
2026-06-24 23:32:52 -07:00
gsxdsm
8c734fe230
FN-6973: stabilize engine liveness tests
...
Stabilize engine tests around executor liveness cleanup and scheduler handoff expectations.
- Assert task-move cleanup clears active session registry entries for agent, step, and workflow-step sessions.
- Reset active session registry module state between executor tests alongside executing task locks.
- Relax brittle worktree and scheduler assertions to match current merge-base and handoff behavior.
Files changed:
.../engine/src/__tests__/executor-pause.test.ts | 52 +++++++++++++++++++---
.../engine/src/__tests__/executor-test-helpers.ts | 8 ++--
.../engine/src/__tests__/executor-worktree.test.ts | 2 +-
.../owning-node-unavailable-interactions.test.ts | 2 +-
.../src/__tests__/restart.integration.test.ts | 8 +++-
5 files changed, 59 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-6973
Fusion-Task-Lineage: 37c7d4b3-7ff5-4339-bd3f-6b10f507883e
2026-06-24 23:32:52 -07:00
gsxdsm
2ba81c25b4
chore(release): v0.47.0
...
Version bump via changesets.
2026-06-24 19:32:59 -07:00
gsxdsm
9dc228549c
fix(workspace): make per-repo land resilient to a sub-repo dependency-sync failure
...
A workspace land squash-merges each sub-repo via a clean room that first runs the
configured/inferred install (npm/pnpm/yarn). The install hard-fails by design so
merge verification never runs against an uninstalled checkout — but that let ONE
sub-repo with a manifest npm refuses to install (e.g. a corrupt `-@0.0.1`
lockfile entry rejected by npm 11) block landing every other sub-repo.
landWorkspaceTask now passes nonFatalDependencySync to landOneRepo: a clean-room
install failure is caught, logged + audited as a non-fatal degradation, and the
land proceeds (the git squash needs no installed deps; only dep-dependent
verification degrades for that repo). A real abort signal still propagates. The
single-repo land path keeps the documented hard-fail (flag defaults off).
Tests: new workspace-merger-deps-resilient asserts both the resilient workspace
land (all repos land despite install throwing) and the preserved single-repo
hard-fail. Also fix a pre-existing getTask mock gap in workspace-merger.test
(mergeAndReview reads getTask().comments) that broke 3 tests at the land step.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-24 17:15:38 -07:00
gsxdsm
93cfb88e64
fix(workspace): remove false reattach banner, silence ai-merge ENOENT prune
...
- dashboard: remove the "Branch needs reattachment" banner. It fired for any
in-review task with a null singular task.branch — the NORMAL state for a
workspace task (attachment is per-sub-repo worktrees in workspaceWorktrees), so
it was a permanent false positive. Genuine lost bindings are already reattached
automatically by self-healing's reconcileInReviewBranchRebind (event-driven on
move-to-in-review + sweep), so no manual user action is needed. Delete the
now-obsolete rebind-banner test + its registry entry.
- engine/self-healing: reconcileInReviewBranchRebind now explicitly skips
workspace tasks (never rebind candidates — their fusion/<id> branches live in
the sub-repos, not the non-git browse root; null root branch is healthy).
- engine/merger-ai: pre-merge prune treats an absent ai-merge search root (ENOENT)
as "nothing to prune" instead of warning on every workspace merge.
- test: add ToggleRight to the TaskDetailModal lucide mock (pre-existing gap from
FN-6880 that broke the whole suite at import).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-24 16:25:23 -07:00
gsxdsm
f06281961e
fix(workspace): persist workspaceWorktrees and isolate concurrent session leases
...
Multiworkspace tasks could not complete due to two independent bugs:
1. task.workspaceWorktrees had no SQLite column / rowToTask mapping, so
fn_acquire_repo_worktree's updateTask write was dropped on every persist
(applyTaskPatch writes the DB-round-tripped task back to task.json). Every
later getTask returned undefined, so fn_task_done's scope verifier read {}
and blocked with "acquired no sub-repo worktrees", and isWorkspaceTask()
consumers misfired. Persist it mirroring mergeDetails (schema column + v129
migration + db-migrate + defineTaskColumn + TaskRow + rowToTask).
2. In workspace mode every task ran rooted at the shared browse-only root, and
setActiveSession registered that path keyed only by path — so a second
concurrent workspace task was rejected by the foreign-task guard
("active-session path ... is held by ..."). Give each task a task-scoped
synthetic session key (sessionRegistryPath), applied at all register and
unregister sites; the in-memory worktree Set still holds the real root.
Regression tests assert the persistence invariant across getTask/listTasks/
store-reopen and concurrent session registration across all three session
surfaces; both verified to fail without the fix.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-24 15:13:43 -07:00
gsxdsm
038ac3060b
FN-6963: disable tool output log details by default
...
Agent logs now keep tool timeline rows while requiring an explicit opt-in to persist verbose tool payloads.
- Default persistAgentToolOutput to false in global settings and direct AgentLogger construction.
- Update the settings UI, API expectations, documentation, and changeset to describe opt-in tool payload persistence.
- Adjust engine and dashboard tests for the new default-off behavior while preserving explicit opt-in coverage.
Files changed:
.changeset/FN-6963-tool-output-default-off.md | 5 ++++
docs/settings-reference.md | 2 +-
packages/core/src/settings-schema.ts | 6 ++++-
.../components/__tests__/SettingsModal.test.tsx | 22 +++++++++++++---
.../settings/sections/GlobalGeneralSection.tsx | 2 +-
.../src/__tests__/routes-settings.test.ts | 4 +--
packages/engine/src/__tests__/agent-logger.test.ts | 30 ++++++++++++++++++----
.../src/__tests__/heartbeat-executor.test.ts | 4 +--
.../src/__tests__/merger-merge-details.test.ts | 2 +-
.../src/__tests__/merger-verification.test.ts | 2 +-
.../src/__tests__/step-session-executor.test.ts | 4 +--
packages/engine/src/__tests__/triage.test.ts | 2 +-
packages/engine/src/agent-logger.ts | 8 ++++--
13 files changed, 71 insertions(+), 22 deletions(-)
Fusion-Task-Id: FN-6963
Fusion-Task-Lineage: 7db32871-f539-4a27-a324-02c55ce5bd04
2026-06-23 23:35:33 -07:00
gsxdsm
59d5e81a95
Merge remote-tracking branch 'origin/main' into latest4-1718
...
# Conflicts:
# packages/engine/src/__tests__/merge-error-recovery.test.ts
# packages/engine/src/merger-ai.ts
2026-06-23 20:58:31 -07:00
gsxdsm
b464f7d7d4
Merge remote-tracking branch 'origin/main' into latest3-1717
2026-06-23 19:58:12 -07:00
gsxdsm
4a1fd88d57
Merge remote-tracking branch 'origin/main' into latest3-1718
2026-06-23 19:58:03 -07:00
gsxdsm
216f910524
Merge remote-tracking branch 'origin/main' into latest2-1718
...
# Conflicts:
# packages/engine/src/agent-tools.ts
# packages/engine/src/worktree-acquisition.ts
2026-06-23 18:15:24 -07:00
gsxdsm
cd178261ec
Merge remote-tracking branch 'origin/main' into latest2-1717
...
# Conflicts:
# packages/engine/src/__tests__/executor-workspace.test.ts
# packages/engine/src/agent-tools.ts
# packages/engine/src/base-commit-capture.ts
# packages/engine/src/worktree-acquisition.ts
2026-06-23 18:13:41 -07:00
gsxdsm
078723febb
Merge remote-tracking branch 'origin/main' into latest2-1714
...
# Conflicts:
# packages/engine/src/agent-tools.ts
# packages/engine/src/base-commit-capture.ts
# packages/engine/src/worktree-acquisition.ts
2026-06-23 18:11:26 -07:00
gsxdsm
0ebc9ea252
Merge branch 'main' into feature/add-request-headers-x-session-id-and-x-session-a
2026-06-23 18:03:33 -07:00
gsxdsm
1293f3432d
Merge remote-tracking branch 'origin/main' into latest-1718
...
# Conflicts:
# packages/engine/src/executor.ts
2026-06-23 17:41:30 -07:00
gsxdsm
9fbc93c8b1
Merge remote-tracking branch 'origin/main' into latest-1717
...
# Conflicts:
# packages/engine/src/executor.ts
2026-06-23 17:40:35 -07:00
gsxdsm
0b111bbb03
Merge remote-tracking branch 'origin/main' into latest-1714
...
# Conflicts:
# packages/engine/src/executor.ts
2026-06-23 17:39:37 -07:00
gsxdsm
fa622721e8
Merge remote-tracking branch 'origin/main' into latest-1713
...
# Conflicts:
# packages/engine/src/executor.ts
2026-06-23 17:38:37 -07:00
gsxdsm
8d343b87b3
Merge branch 'main' into feature/add-request-headers-x-session-id-and-x-session-a
2026-06-23 17:37:57 -07:00
gsxdsm
e17e9bc867
feat( #1675 ): add X-Session-Id and X-Session-Affinity routing headers to LLM requests
...
Add X-Session-Id and X-Session-Affinity headers to all outbound LLM chat
completion requests so LLM gateways can sticky-route consecutive requests
from the same conversation and observability tools (Langfuse, Arize) can
group stateless API calls into a single multi-turn trace.
The headers carry a stable identifier: the task id when available (stable
across pause/resume), otherwise the pi session id. The implementation wraps
modelRegistry.getApiKeyAndHeaders -- the single chokepoint pi-coding-agent
uses for both the main stream and compaction -- merging routing headers into
the resolved output. This covers all HTTP-based providers (built-in, custom,
and HTTP-streaming extensions) without disturbing auth resolution.
Also propagates taskId to four secondary executor sessions (retry,
verification-fix, workflow-step, child-agent) that previously fell back to
a per-instance pi id, fragmenting per-task observability grouping.
Closes #1675
2026-06-23 17:31:52 -07:00
gsxdsm
37b2cb38ac
Merge branch 'main' into feature/workflow-branch-group
2026-06-23 17:16:16 -07:00
gsxdsm
9822fbd6a8
Merge remote-tracking branch 'origin/main' into conflict-resolution-1718
...
# Conflicts:
# packages/engine/src/__tests__/executor-recovery.test.ts
# packages/engine/src/agent-tools.ts
# packages/engine/src/executor.ts
# packages/engine/src/merger-ai.ts
# packages/engine/src/project-engine.ts
# packages/engine/src/run-audit.ts
# packages/engine/src/self-healing.ts
# packages/engine/src/worktree-acquisition.ts
2026-06-23 16:23:28 -07:00
gsxdsm
0dea25061d
Merge remote-tracking branch 'origin/main' into conflict-resolution-1717
...
# Conflicts:
# packages/engine/src/__tests__/executor-recovery.test.ts
# packages/engine/src/agent-tools.ts
# packages/engine/src/executor.ts
# packages/engine/src/merger-ai.ts
# packages/engine/src/project-engine.ts
# packages/engine/src/worktree-acquisition.ts
2026-06-23 16:12:10 -07:00
gsxdsm
941343f483
Merge remote-tracking branch 'origin/main' into conflict-resolution-1714
...
# Conflicts:
# packages/engine/src/__tests__/executor-recovery.test.ts
# packages/engine/src/agent-tools.ts
# packages/engine/src/executor.ts
# packages/engine/src/worktree-acquisition.ts
2026-06-23 16:01:38 -07:00
gsxdsm
dcee0d3172
Merge remote-tracking branch 'origin/main' into conflict-resolution-1713
...
# Conflicts:
# packages/engine/src/__tests__/executor-recovery.test.ts
# packages/engine/src/agent-tools.ts
# packages/engine/src/executor.ts
# packages/engine/src/worktree-acquisition.ts
2026-06-23 15:56:06 -07:00
gsxdsm
4faadd4f75
Merge remote-tracking branch 'origin/main' into conflict-resolution-1712
...
# Conflicts:
# packages/dashboard/app/components/WorkflowNodeEditor.tsx
# packages/engine/src/__tests__/executor-fast-mode-workflows.test.ts
2026-06-23 15:44:52 -07:00
gsxdsm
a8abecd043
Merge remote-tracking branch 'origin/main' into conflict-resolution-1711
...
# Conflicts:
# packages/engine/src/executor.ts
2026-06-23 15:37:29 -07:00
gsxdsm
905a877954
Merge pull request #1710 from MichaelHoughtonDeBox/feat/workspace-multi-repo
...
Workspace mode: open a folder of git repos as one project (foundation + design Q)
2026-06-23 15:08:15 -07:00
gsxdsm
bac7049822
chore(release): v0.46.0
...
Version bump via changesets.
2026-06-23 12:27:50 -07:00
gsxdsm
fe536b2af8
FN-6954: reconcile stale parked task assignments
...
Reconcile agent/task drift when durable agents remain linked to queued tasks without live execution proof.
- clear stale Agent.taskId links for parked todo/triage tasks while preserving task leases and queue state
- report stale parked assignments as active/no-live-run in Reports Health Check before reconciliation completes
- add scheduler and self-healing coverage for queued lease drift, overlap starvation, and audit events
- document the reconciliation behavior and add a published package patch changeset
Files changed:
.changeset/fn-6954-agent-task-state-drift.md | 5 +
docs/architecture.md | 2 +
.../src/__tests__/heartbeat-executor.test.ts | 68 ++++++++++++
.../__tests__/scheduler-overlap-starvation.test.ts | 68 +++++++++++-
.../self-healing-agent-link-drift.test.ts | 97 ++++++++++++++++-
.../engine/src/__tests__/task-agent-sync.test.ts | 33 +++++-
packages/engine/src/agent-heartbeat.ts | 121 +++++++++++++++++++--
packages/engine/src/run-audit.ts | 5 +
packages/engine/src/runtimes/in-process-runtime.ts | 1 +
packages/engine/src/scheduler.ts | 24 +++-
packages/engine/src/self-healing.ts | 102 ++++++++++++++---
packages/engine/src/task-agent-sync.ts | 65 ++++++++++-
12 files changed, 555 insertions(+), 36 deletions(-)
Fusion-Task-Id: FN-6954
Fusion-Task-Lineage: 24b8a2eb-5a33-4539-ab64-ae2bbfc2d195
2026-06-23 10:30:50 -07:00
gsxdsm
81f43e0e89
Merge pull request #1730 from Runfusion/feature/memory-fix
...
[codex] Dispose completed spawned child sessions
2026-06-23 10:29:30 -07:00
gsxdsm
a46800128a
Address PR review feedback ( #1730 )
...
- Await async spawned child session disposal
- Use own-key iteration for structured tool result previews
- Add FNXC requirement comments for new regression assertions
2026-06-23 09:57:49 -07:00
gsxdsm
e59b1fa07d
Merge pull request #1726 from plarson/fix/triage-spec-review-fallback
...
fix(triage): pass fallback model settings to spec review
2026-06-23 09:52:58 -07:00
gsxdsm
36b7ad90fd
fix(engine): bound structured tool result log previews
2026-06-23 09:19:32 -07:00
gsxdsm
466cf9ca8d
fix(engine): dispose completed spawned child sessions
2026-06-23 09:12:28 -07:00
Phil Larson
823623e1c6
fix(triage): address spec review fallback PR comments
2026-06-23 08:51:58 -07:00
Phil Larson
40bef6dfce
fix(triage): pass fallback model settings to spec review
2026-06-23 08:39:27 -07:00
gsxdsm
a670f5ce98
FN-6952: repair workflow-column lifecycle regressions
...
Restores core lifecycle compatibility while keeping workflow-column scheduling on the graduated runtime.\n\n- Split raw compatibility-flag checks from public workflow-column runtime enablement.\n- Keep scheduler and hold-release sweeps on workflow columns despite stale persisted false flags.\n- Preserve legacy moveTask guard bypass and invalid-transition behavior for compatibility paths.\n- Isolate the startup watch recovery fixture and add a patch changeset.\n\nFiles changed:\n .changeset/fn-6952-core-lifecycle-regressions.md | 5 ++++\n packages/core/src/__tests__/store-create.test.ts | 6 +++++\n packages/core/src/store.ts | 32 +++++++++++++++++-------\n packages/core/src/workflow-columns-settings.ts | 8 ++----\n packages/engine/src/hold-release.ts | 6 +++--\n packages/engine/src/scheduler.ts | 10 +++++++-\n 6 files changed, 49 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-6952
Fusion-Task-Lineage: cfd7ad99-db00-4454-b3d7-a07a72a7bbe7
2026-06-23 08:21:10 -07:00
gsxdsm
b599b6ab41
chore(release): v0.45.0
...
Version bump via changesets.
2026-06-23 01:07:59 -07:00
gsxdsm
9218613552
FN-6949: fix auto-merge lifecycle finalization
...
Make auto-merge completion idempotent when landed tasks are left outside done.
- Add shared auto-merge finalization logic that refreshes task rows, clears stale queue/blocker state, and recovery-rehomes proven landed tasks to done.
- Route direct AI merge, merge-confirmed fast paths, and self-healing recovery through the shared finalizer with run-audit events for reconciled or blocked column mismatches.
- Extend lifecycle and recovery tests to cover todo/in-review mismatches, finalization failures, stale blockers, and cleanup idempotency.
- Add the required patch changeset for the published Fusion package.
Files changed:
.changeset/fn-6949-auto-merge-lifecycle.md | 5 +
.../src/__tests__/merge-error-recovery.test.ts | 50 ++++-
packages/engine/src/__tests__/merger-ai.test.ts | 8 +-
.../src/__tests__/merger-merge-lifecycle.test.ts | 155 +++++++++++++++
.../ai-merge-cleanup-enoent-idempotent.test.ts | 2 +-
packages/engine/src/__tests__/self-healing.test.ts | 194 +++++++++++--------
packages/engine/src/auto-merge-finalization.ts | 208 +++++++++++++++++++++
packages/engine/src/merger-ai.ts | 47 +++--
packages/engine/src/project-engine.ts | 87 +++++----
packages/engine/src/run-audit.ts | 4 +
packages/engine/src/self-healing.ts | 92 ++++-----
11 files changed, 663 insertions(+), 189 deletions(-)
Fusion-Task-Id: FN-6949
Fusion-Task-Lineage: db784ec0-68e9-4a37-9728-daa6f133e294
2026-06-22 23:18:28 -07:00
gsxdsm
acf0fff413
test(engine): cover workflow cutover recovery guards
2026-06-22 22:22:37 -07:00
gsxdsm
e60b1378b8
fix(engine): address workflow cutover review feedback
2026-06-22 22:17:30 -07:00
gsxdsm
65c4dc5438
fix(engine): harden workflow runtime cutover
2026-06-22 21:45:05 -07:00
gsxdsm
bf3276295c
fix(engine): complete workflow runtime cutover
2026-06-22 20:45:29 -07:00
gsxdsm
f9043d733e
fix(dashboard): polish workflow and chrome defaults
2026-06-22 19:48:50 -07:00
gsxdsm
ec1d29e818
FN-6922: guard worktree acquisition returns from repo root
...
Prevent task worktree acquisition from handing the project root back to executors.
- Add a repo-root return guard across resume, pool, and fresh acquisition paths.
- Clear invalid repo-root task assignments and create a fresh worktree fallback when safe.
- Share repo-root canonicalization and expand regression coverage for acquisition liveness.
- Document the acquisition guard and add a patch changeset.
Files changed:
.changeset/fn-6922-repo-root-acquisition-guard.md | 5 +
.../repo-root-task-worktree-requeue-loop.md | 9 +-
.../__tests__/executor-worktree-liveness.test.ts | 35 +++
.../worktree-acquisition-secrets-env.test.ts | 9 +-
.../src/__tests__/worktree-acquisition.test.ts | 91 ++++++-
packages/engine/src/worktree-acquisition.ts | 272 +++++++++++++--------
packages/engine/src/worktree-pool.ts | 8 +-
7 files changed, 304 insertions(+), 125 deletions(-)
Fusion-Task-Id: FN-6922
Fusion-Task-Lineage: c16cee1b-de16-4d5f-90e0-132f94fa8377
2026-06-22 19:11:08 -07:00
gsxdsm
4fd8d444fb
fix(dashboard): polish app chrome and workflow defaults
2026-06-22 18:21:06 -07:00
gsxdsm
c229a15e20
FN-6934: restrict agent workflow reassignment
...
Clarify agent workflow-routing prompts so agents do not reassign tasks they did not create unless directed.
- Add executor guardrails against changing the current task workflow without explicit user instruction.
- Update triage workflow-routing guidance to distinguish existing tasks from agent-created tasks.
- Cover workflow ownership policy in prompt and engine tests, docs, and a patch changeset.
Files changed:
.changeset/fn-6934-workflow-movement-policy.md | 5 +++++
docs/agents.md | 6 ++++++
docs/custom-workflow-reliability-acceptance-map.md | 7 +++++--
docs/settings-reference.md | 9 +++++++--
docs/workflow-steps.md | 9 +++++++--
packages/core/src/__tests__/agent-prompts.test.ts | 15 ++++++++++++++
packages/core/src/agent-prompts.ts | 23 ++++++++++++++++------
.../src/__tests__/executor-review-verdicts.test.ts | 3 +++
.../__tests__/triage-threshold-settings.test.ts | 3 +++
packages/engine/src/__tests__/triage.test.ts | 2 +-
packages/engine/src/executor.ts | 5 +++++
11 files changed, 74 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-6934
Fusion-Task-Lineage: cc583806-b160-4a08-b1a7-e798a575dbd5
2026-06-22 17:58:27 -07:00
gsxdsm
0b410d54e1
FN-6915: surface user comments in agent prompts
...
User task chat and steering comments now flow into planning, review, and merge agent context.
- Add a shared user-comment formatter and selector for prompt context.
- Inject latest user comments into planner-triggered review, reviewer, merger, and clean-room AI merge prompts.
- Cover comment selection, prompt formatting, review/merge propagation, and docs updates with targeted tests.
Files changed:
docs/architecture.md | 1 +
docs/dashboard-guide.md | 1 +
.../src/__tests__/agent-user-comments.test.ts | 81 ++++++++++++++++++++++
.../executor-review-step-indexing.test.ts | 28 +++++++-
packages/engine/src/__tests__/merger-ai.test.ts | 54 +++++++++++++++
.../src/__tests__/merger-prompt-and-utils.test.ts | 29 ++++++++
packages/engine/src/__tests__/reviewer.test.ts | 37 ++++++++--
packages/engine/src/__tests__/triage.test.ts | 23 ++++++
packages/engine/src/agent-user-comments.ts | 60 ++++++++++++++++
packages/engine/src/executor.ts | 14 ++--
packages/engine/src/merger-ai.ts | 23 +++++-
packages/engine/src/merger.ts | 22 +++++-
packages/engine/src/reviewer.ts | 13 ++++
13 files changed, 372 insertions(+), 14 deletions(-)
Fusion-Task-Id: FN-6915
Fusion-Task-Lineage: 02de0c12-481a-4489-b495-70c9c00619bc
2026-06-22 03:34:15 -07:00