docs: update documentation to OKF v0.1 format
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
---
|
||||
type: guide
|
||||
title: Daily Run Guide
|
||||
description: Operator- and tester-focused walkthrough of one daily cron tick — startup, pipeline pass, silent-on-no-matches, and retry behaviour.
|
||||
description: Operator- and tester-focused walkthrough of one daily cron tick — repository synchronization, anniversary matching, deduplication, logging, and retry behaviour.
|
||||
tags: [guide, run, daily, tester]
|
||||
timestamp: 2026-08-04T17:51:00Z
|
||||
---
|
||||
@@ -24,6 +24,15 @@ This is the same command the container's cron entry issues once per
|
||||
day at `RUN_AT`. Use it to verify behaviour without waiting for the
|
||||
scheduled tick.
|
||||
|
||||
# What the Run Does
|
||||
|
||||
Before scanning, the process ensures the configured blog repository exists
|
||||
under `/app/data/blog` and is fast-forwarded from `BLOG_REPO_URL`. It then
|
||||
walks `_posts/blog/**/*.md`, finds posts whose date is exactly ten years
|
||||
before today, skips IDs already present in `posted.json`, and records new
|
||||
relative paths. The current implementation records matching IDs only;
|
||||
Mastodon publication is not yet wired.
|
||||
|
||||
# What You Should See
|
||||
|
||||
The bot uses a **JSON-per-line** logger that writes to
|
||||
@@ -45,8 +54,10 @@ this is the **only** line you should see — the runner emits no
|
||||
|
||||
| Scenario | Lines in `cron.log` | Container exit |
|
||||
|-------------------------------------------|----------------------------------------------------------------|------------------|
|
||||
| Config valid, zero candidates (scaffold) | 1× `startup` | `0` |
|
||||
| Config valid, future blog step posts N≥1 | 1× `startup`, then 1× `run_complete` with `posted=N` | `0` |
|
||||
| Config valid, no anniversary matches | 1× `startup` | `0` |
|
||||
| Blog clone or pull fails | 1× `blog_repo_error` | `1` |
|
||||
| Config valid, matching IDs are new | 1× `startup`, then 1× `run_complete` with `posted=N` | `0` |
|
||||
| Config valid, all matches already posted | 1× `startup`, then 1× `run_complete` with `posted=0` | `0` |
|
||||
| Pipeline raises once, recovers | 1× `pipeline_error`, then 1× `run_complete` | `0` |
|
||||
| Pipeline keeps raising (budget exhausted) | `MAX_RETRIES + 1` × `pipeline_error`, then 1× `pipeline_failed` | `1` |
|
||||
| Config invalid | 1× `configuration_error` (extras describe what failed) | `2` |
|
||||
@@ -61,7 +72,7 @@ this is the **only** line you should see — the runner emits no
|
||||
| Path (inside container) | When it appears |
|
||||
|-------------------------|--------------------------------------------|
|
||||
| `/app/data/cron.log` | Always (cron appends stdout/stderr here). |
|
||||
| `/app/data/posted.json` | Created on first persist; only rewritten when a new id is posted. The scaffold run does **not** create this file. |
|
||||
| `/app/data/posted.json` | Created when the matcher or a state check first loads the store; rewritten only when a new ID is posted. The file contains relative Jekyll paths under a `posted` list. |
|
||||
|
||||
To verify these from the host:
|
||||
|
||||
@@ -77,6 +88,7 @@ This is a server-side bot, so there is no UI. The "UI" consists of:
|
||||
* **Log lines on stdout** — one JSON object per `INFO`/`ERROR` event.
|
||||
* **Exit code** — `0` (healthy), `1` (pipeline exhausted), or `2` (config).
|
||||
* **`posted.json`** — JSON state file; its mtime changes whenever a new id is persisted.
|
||||
* **`/app/data/blog`** — synchronized local clone containing the Jekyll posts scanned for anniversaries.
|
||||
|
||||
# Examples
|
||||
|
||||
|
||||
Reference in New Issue
Block a user