feat(linkedin-studio): RE-R3c — autonomous trigger (scheduler + headless entry) [skip-docs]
Closes research-engine hulls (1) no autonomous trigger + (6) no headless entry. Makes the daily research loop closed + headless: deterministic-brief-only (C1), print-first (C2 — the tool never runs launchctl or the cron table; --install writes only the inert launchd plist file). - NEW scripts/trends/src/schedule.ts — pure string emitters (launchd plist + cron-line + install/uninstall instructions + defaultLabel). No clock/fs/env/AI; byte-deterministic. - NEW scripts/trends/run-daily.sh — bash-3.2 headless wrapper: resolves node, cd's into the package so tsx resolves, logs via the data-path twin seam; runs the deterministic brief and appends one compact cron.log line per fire. The (e) AI-capture seam is documented, not built. - EDIT cli.ts — schedule --pillars <a,b> [--at HH:MM] [--fresh-days N] [--platform auto|launchd|cron] [--install|--uninstall] [--store <p>]; print-first, no new exit code; logPath anchored to dirname(defaultStorePath()) (not the --store override). - WIRE trend-spotter.md (one prose line) + README (scheduler + wrapper + the C1 boundary). - Gate: TRENDS_TESTS_FLOOR 171->192, ASSERT_BASELINE_FLOOR 105->111, new UNCONDITIONAL Section 16l (6 deps-absent greps + non-vacuity self-test), header-enum + floor-history append. TDD two-phase RED -> GREEN. trends 192/192, gate 126/0, hook-suite 139/0 (untouched), plutil -lint OK. No schema change (SCHEMA_VERSION 4 / BRIEF_SCHEMA_VERSION 1). Counts 29/19/27 unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011vmzxpsFpc8q19LaogAWLD
This commit is contained in:
parent
b43757462b
commit
3276e44dbf
9 changed files with 768 additions and 9 deletions
|
|
@ -100,6 +100,12 @@ node --import tsx src/cli.ts brief --pillars "agents,engineering" \
|
|||
node --import tsx src/cli.ts act --id <id> # wrote about it
|
||||
node --import tsx src/cli.ts skip --id <id> # decided to pass on it
|
||||
node --import tsx src/cli.ts reset --id <id> # return it to the queue
|
||||
|
||||
# Autonomous trigger (RE-R3c) — emit/install a daily headless brief. PRINT-FIRST: the tool never runs
|
||||
# launchctl or the cron table; --install writes only the inert launchd plist file. Deterministic
|
||||
# (no AI capture — a later slice). Default 07:00; --platform auto → launchd on macOS, cron on Linux.
|
||||
node --import tsx src/cli.ts schedule --pillars "agents,engineering" \
|
||||
[--at 07:00] [--fresh-days 7] [--platform auto|launchd|cron] [--install|--uninstall] [--store <path>]
|
||||
```
|
||||
|
||||
Both `capture` and `add` dedupe on normalized title+url — re-capturing the same trend
|
||||
|
|
@ -124,8 +130,27 @@ a scored entry shows `· <priority> (<mode>)` and the summary names the top entr
|
|||
As of **RE-R3b** the brief is a **work queue**: it **excludes** `acted`/`skipped` trends, shows
|
||||
each entry's `id` in backticks (copy-paste-ready for `act`/`skip --id`), flags a re-surfaced item
|
||||
with `· sett Nx` (prior-day count, ≥2), and — unless `--no-mark` — **records surfacing** on the
|
||||
store (`surfacedCount`/`lastSurfacedAt`, per-day idempotent) after the pure render. An autonomous
|
||||
nightly trigger and a brief-history diff remain later slices.
|
||||
store (`surfacedCount`/`lastSurfacedAt`, per-day idempotent) after the pure render.
|
||||
|
||||
## Autonomous trigger + headless entry (RE-R3c)
|
||||
|
||||
`schedule` makes the daily loop **closed**: it emits — print-first — a launchd plist (macOS) or cron
|
||||
line (Linux) firing the brief every morning, plus the exact activation command. `--install` writes only
|
||||
the **inert** launchd plist file under `~/Library/LaunchAgents/`; the tool **never** runs `launchctl`
|
||||
or the cron table — you run the one printed command. `--uninstall` prints the removal recipe (and
|
||||
removes the plist file if present).
|
||||
|
||||
Both schedulers invoke one tested headless wrapper, `run-daily.sh`, which runs the **deterministic**
|
||||
brief from a scheduler's profile-less environment: it resolves node (baked `NODE_BIN`, else
|
||||
`command -v`, else common locations), `cd`s into the package so `tsx` resolves, and appends one compact
|
||||
line `<ISO-ts> exit=<code> <json>` to `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/trends/cron.log`.
|
||||
|
||||
The nightly run is **deterministic-brief-only (C1)**: it re-renders the brief from the current store
|
||||
— freshness-aging drops stale trends, `surfacedCount` accumulates day-over-day — but does **not** poll
|
||||
new sources. A double-fire on the same day is a safe no-op (RE-R3b per-day idempotency: byte-identical
|
||||
`.md`, `surfacedCount` not double-counted). The autonomous AI capture step (poll → score → capture
|
||||
before the brief) plugs into the documented seam in `run-daily.sh` as a later slice (e); a
|
||||
brief-history diff is also a later slice.
|
||||
|
||||
## Tests
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue