AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Worklog

skill-dgilford-ai-science-toolkit-worklog · by dgilford

Capture a work-log entry to the Notion Work Journal, a remote server cache, and a local mirror. Use whenever the user asks to log, note, record, or journal progress, a decision, or what they just did — and as the capture step invoked by /handoff.

No reviews yet
0 installs
32 views
0.0% view→install

Install

$ agentstack add skill-dgilford-ai-science-toolkit-worklog

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-dgilford-ai-science-toolkit-worklog)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Worklog? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Capture one work-log entry into three targets. Distinguish two failure kinds:

  • Misconfiguration is loud. If a target's env var is unset, that is a setup

error — report it prominently so it gets fixed, don't skip it quietly.

  • Transient failure is best-effort. If a configured target is momentarily

unreachable (server down, Notion MCP disconnected), never block the caller — note it and move on. The local mirror is the source of truth.

An end-of-day cloud routine summarizes the Notion raw entries into narrative sections, so this skill only appends; it never summarizes.

Compose the entry

Determine what to log:

  • If the caller (e.g. /handoff) or the user supplied text or a summary, use it.
  • Otherwise, summarize the current thread of work yourself: what got done, key

decisions, and the top next action.

Keep it tight: summary is 3-5 short bullets; next is the top 1-3 next actions. Redact secrets — never put tokens, keys, passwords, or PII in the entry.

Configuration

Two targets are configured via env vars (set in the env block of ~/.claude/settings.json, alongside the ZOTERO_* keys) — no personal infrastructure is hardcoded in this skill. If a var is unset, surface it loudly as a setup error (worklog: unset — this target is not configured; set it in ~/.claude/settings.json) so the gap gets fixed, rather than silently dropping the target:

  • WORKLOG_SSH_TARGETuser@host for the server cache (e.g. a Tailscale host).
  • WORKLOG_NOTION_HOME — the Notion "Work Journal" home page id (raw entries are

appended to weekly sub-pages under it).

1 + 2 — Local mirror and server cache

Fill the two arrays with the composed content, then run:

DAY=$(date +%F)
PROJECT=$(basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)")
ENTRY=$(printf '{"ts":"%s","project":"%s","cwd":"%s","summary":%s,"next":%s}' \
  "$(date -Iseconds)" "$PROJECT" "$PWD" \
  '["bullet one","bullet two"]' \
  '["next action one"]')
# durable local mirror (.ai/ is gitignored) — always written
mkdir -p .ai && printf '%s\n' "$ENTRY" >> ".ai/worklog-$DAY.jsonl"
# best-effort ship to server cache (non-fatal; skipped if WORKLOG_SSH_TARGET unset)
if [ -n "${WORKLOG_SSH_TARGET:-}" ]; then
  printf '%s\n' "$ENTRY" | ssh -o ConnectTimeout=6 -o BatchMode=yes \
    "$WORKLOG_SSH_TARGET" \
    "mkdir -p ~/worklog/inbox && cat >> ~/worklog/inbox/$DAY.jsonl" \
    && echo "worklog: shipped to server" \
    || echo "worklog: server unreachable — kept local copy at .ai/worklog-$DAY.jsonl"
else
  echo "worklog: WORKLOG_SSH_TARGET unset — server cache not configured; set it in ~/.claude/settings.json (kept local copy at .ai/worklog-$DAY.jsonl)" >&2
fi

3 — Append to the Notion weekly page

Use the Notion MCP tools. If WORKLOG_NOTION_HOME is unset, report it loudly as a setup error (worklog: WORKLOG_NOTION_HOME unset — Notion journal not configured; set it in ~/.claude/settings.json) — the local + server copies still captured the entry. If the var is set but the Notion MCP is not connected, that is a transient failure: note it and move on.

  • Work Journal home page id: the value of $WORKLOG_NOTION_HOME.
  • Weekly page title convention: Week of YYYY-MM-DD (…), dated to the

Monday of the current week.

Steps:

  1. Compute this week's Monday:

``! python3 -c "import datetime; t=datetime.date.today(); print((t-datetime.timedelta(days=t.weekday())).isoformat())" 2>/dev/null || echo "(compute Monday manually)" ``

  1. notion-search for Week of . If no matching page exists, create it

under the Work Journal home page (notion-create-pages, parent page_id above) with this content — keep Raw entries as the last section (the append relies on it being last): ``` Daily summaries appear below, newest at top. Raw per-session entries collect under Raw entries at the bottom until the end-of-day routine summarizes them.

---

## 🗂️ Raw entries (unprocessed)

Session entries land here via /handoff. Cleared nightly after summarization. ```

  1. Append the entry with notion-update-page (command: insert_content,

position: {"type":"end"}) as a single bullet: - **HH:MM · ** — . **Next:**

Anti-Rationalization

| Excuse | Reality | |---|---| | "The server was down, so the log failed." | A transiently down server or disconnected Notion MCP is a non-event — the local .ai/ mirror is the source of truth. Report which targets succeeded and move on. (An unset env var is different: report it loudly so config gets fixed.) | | "This is minor, no need to log it." | If the user asked to log it, log it. Terse is fine; skipping is not. | | "I'll summarize the whole day into one entry." | This skill only appends a single raw entry. The nightly routine does summarization — don't pre-empt it. | | "I'll just write to Notion, the JSON mirror is redundant." | The mirror and server copy are the durable/offline record; Notion is the readable view. Write all reachable targets. |

Verification

  • [ ] A JSON line was appended to .ai/worklog-.jsonl locally.
  • [ ] The server push reported success, or its failure was reported (not swallowed) — including a loud setup error if WORKLOG_SSH_TARGET is unset.
  • [ ] The bullet appears under 🗂️ Raw entries on the current weekly page; or a loud setup error was reported if WORKLOG_NOTION_HOME is unset; or a transient MCP-disconnected note if the var is set but Notion is unreachable.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.