Files
ngn-agent/.planning/phases/08-cron-reporting/08-02-SUMMARY.md
Bagas Purwa Sentika 8ef7340108 docs(08-cron-reporting): complete weekly stale summary + archive cron plan
- ngn-weekly-stale-summary: skill-backed cron at Sunday 20:00 SGT
- ngn-weekly-archive: no_agent cron at Sunday 20:05 SGT (5 min after summary)
- Both registered, verified, test-run successful
2026-06-15 22:47:54 +08:00

6.5 KiB

phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, requirements-completed, duration, completed
phase plan subsystem tags requires provides affects tech-stack key-files key-decisions patterns-established requirements-completed duration completed
08-cron-reporting 02 cron
hermes
cron
session
archive
telegram
stale-sessions
phase provides
07-main-session-skill session skill loaded by weekly summary cron for session structure and hysteresis recall of Jira keys
phase plan provides
08-cron-reporting 01 archive-stale-sessions.sh script for deterministic no_agent archive
ngn-weekly-stale-summary cron — skill-backed weekly stale session summary (Sunday 20:00 SGT)
ngn-weekly-archive cron — no_agent deterministic archive (Sunday 20:05 SGT, 5 min after summary)
Phase 9 (tool provisioning) if archive verification requires adjustments
added patterns
Skill-backed cron with --skill session for LLM-guided stale session summary
no_agent cron with --script archive-stale-sessions.sh for deterministic CLI archive
5-minute offset between complementary cron jobs to avoid race conditions
created modified
Hermes cron job
ngn-weekly-stale-summary (skill-backed, Sunday 20:00 SGT)
Hermes cron job
ngn-weekly-archive (no_agent, Sunday 20:05 SGT)
Weekly summary cron is skill-backed (--skill session) for understanding session structure and Jira-session mapping via hysteresis
Weekly archive cron is no_agent (--no-agent --script archive-stale-sessions.sh) for deterministic CLI operations with no LLM cost
Archive runs 5 min AFTER summary (20:05 vs 20:00) to prevent race condition where prune deletes sessions the summary agent is enumerating
Summary cron prompt instructs agent to: use 'hermes sessions export -' (not list --json), discover Jira keys via hysteresis_recall, and report only with no Jira mutations (per D-10/D-15)
Archive runs in DRY_RUN=true mode by default (script from Plan 1) — export-only until user flips to enable pruning
Complementary cron offset: summary at :00, archive at :05 — prevents prune-from-underneath during summary enumeration
no_agent archive: hermes cron create --no-agent --script <name> 'schedule' — deterministic CLI operations registered as cron jobs
CRON-02
CRON-03
~1 min 2026-06-15

Phase 8 Plan 2: Weekly Stale Summary + Archive Cron Summary

Two weekly cron jobs registered: ngn-weekly-stale-summary (Sunday 20:00 SGT, skill-backed) and ngn-weekly-archive (Sunday 20:05 SGT, no_agent with archive-stale-sessions.sh) — completing the stale session lifecycle and Jira-awareness reporting

Performance

  • Duration: ~1 min
  • Started: 2026-06-15T14:46:32Z
  • Completed: 2026-06-15T14:47:26Z
  • Tasks: 2
  • Files modified: 2 (Hermes cron DB entries — outside project repo)

Accomplishments

  • Registered ngn-weekly-stale-summary cron at Sunday 20:00 SGT with --skill session — LLM agent loads session skill to understand session structure, enumerate stale sessions via JSONL export, discover Jira ticket keys via hysteresis_recall, and compose Telegram summary (no Jira mutations per D-10/D-15)
  • Registered ngn-weekly-archive cron at Sunday 20:05 SGT with --no-agent --script archive-stale-sessions.sh — deterministic CLI archive that exports sessions to JSONL and optionally prunes stale ones (DRY_RUN=true default from Plan 1)
  • 5-minute offset between summary (20:00) and archive (20:05) prevents race condition where prune could delete sessions the summary agent is still enumerating
  • Both cron jobs visible in hermes cron list with correct schedules
  • Test-run of both jobs succeeded without CLI errors
  • Requirements CRON-02 (weekly archive) and CRON-03 (Jira-awareness in reports) both addressed

Task Commits

Each task was committed atomically:

  1. Task 1: Register weekly stale session summary cron (Sunday 20:00 SGT, skill-backed)90214dd (feat)
  2. Task 2: Register weekly archive cron (Sunday 20:05 SGT, no_agent)2faeb0a (feat)

Plan metadata: See final metadata commit.

Note: Cron jobs are registered in Hermes internal DB — committed with --allow-empty descriptors.

Files Created/Modified

  • Hermes cron DB: ngn-weekly-stale-summary job (schedule: 0 20 * * 0, skills: session, delivery: telegram, prompt: stale session summary with Jira discovery)
  • Hermes cron DB: ngn-weekly-archive job (schedule: 5 20 * * 0, mode: no-agent, script: archive-stale-sessions.sh, delivery: telegram)

Decisions Made

  • Skill-backed summary vs no_agent archive: The summary cron uses --skill session because it needs LLM reasoning to understand session structure, identify stale sessions, and compose natural-language Telegram messages. The archive cron uses --no-agent because it only runs deterministic CLI commands (export + prune) with no LLM cost.
  • 5-minute offset: Archive at 20:05, 5 minutes after summary at 20:00. This follows RESEARCH.md Anti-Patterns guidance — prevents race condition where the prune could remove sessions the summary agent is still enumerating.
  • Prompt detail: Full 5-step prompt embedded in summary cron — agent receives complete instructions for stale session discovery via JSONL export, Jira key lookup via hysteresis_recall, Telegram composition with 4096-char limit, and explicit prohibition against Jira mutations.

Deviations from Plan

None — plan executed exactly as written.

Issues Encountered

  • None. Both cron registrations succeeded on first attempt.

Threat Flags

None — all threat mitigations from the plan's threat model are satisfied:

  • T-08-06 (Tampering — weekly stale summary cron prompt): Accepted — prompt is authored during plan execution, not user-controllable.
  • T-08-07 (Repudiation — stale session prune): Mitigated — archive script's DRY_RUN=true default means no prune until user flips the flag; timestamped JSONL exports serve as audit trail.
  • T-08-08 (Denial of Service — race condition): Mitigated — archive at 20:05 (5 min after summary at 20:00), preventing prune-from-underneath during summary enumeration.

Next Phase Readiness

  • Stale session lifecycle complete: summary (Sunday 20:00 SGT) + archive (Sunday 20:05 SGT) automated
  • Daily report already running at 09:00 SGT from Plan 1
  • Phase 8 complete — all three cron jobs registered (daily report, weekly summary, weekly archive)
  • User should verify first archive dry-run output and set DRY_RUN=false in archive-stale-sessions.sh to enable pruning

Phase: 08-cron-reporting Completed: 2026-06-15