ckb/workload/2026-09-01_summary.md
Michał Kopeć 65b1e422b3 Add decision log, scriptify OKF export and lint detection
Decision log (VERSION 1.6.0, kb_schema_version 1.4):
- wiki/decisions/ scaffold — numbered NNNN-slug.md records, own index
  (with status vocabulary) and log
- type: decision adds status/decided_on/decided_by/affects/review_on;
  supersedes/superseded_by carry history and must be set on both sides
- New ckb-decide skill: records decisions and answers what/why/who/when,
  what superseded what, and what is still open. Decision pages are
  append-only — a changed mind is a new superseding decision
- Graph gains decided_by and affects edge types
- ckb-ingest routes decisions found in raw material to this format;
  ckb-retrieve gains the decisions index as a cascade step

Scriptified the mechanical skills:
- ckb-export-okf/scripts/export_okf.py does the whole OKF transform
  (frontmatter remap, link rewriting, index/log regeneration, conformance
  validation); --check validates without writing
- ckb-lint/scripts/lint_report.py does the read-only detection half
  (conformance, freshness, confidence, retention, decisions, orphans,
  graph, index/log, source.yaml); judgment calls stay with the model

Also: removed the duplicate personal quiz skill, fixed stale cbk-quiz
doc paths, gitignored __pycache__.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 20:50:36 +02:00

7.7 KiB

2026-09-01 20:25 CEST

  • Ran ckb-sync-changes: committed a local workload/2026-07-29_summary.md edit, merged 4 commits from origin/main (one conflict in that file, resolved by keeping the remote superset), pushed; origin/main now at 8174a54.
  • Updated .agents/skills/ckb-init/SKILL.md so init can pull the template repo into a scratch folder instead of only copying from the local working tree:
    • New Step 3 "Resolve the template source" (shallow clone of the canonical repo or a user-supplied fork/mirror URL vs. the local working tree), with scratch-path guidance and an explicit rule against cloning into the target itself.
    • New Step 11 "Initialize the new KB's own git history (ask first)"; report step now names the template source and git-init outcome.
    • Fixed drift while there: skill list (ckb-quiz typo, added ckb-retrieve/ckb-index-external), kb_schema_version no longer hard-coded to 1.1, wiki/projects/ and wiki/query-gaps.md added to the scaffold, .gitignore snapshot refreshed with the connector libs/ rules.
    • Added clone-related edge cases (clone failure with no local fallback, clone-in-place request, target already a git repo, stale scratch dir).
  • Propagated the change to AGENTS.md skill routing table and MANUAL.md/MANUAL.pl.md (prose + "say this" tables).
  • Bumped root VERSION 1.3.0 → 1.4.0 (template/tooling layer); wiki/index.md kb_schema_version stays 1.3 — no wiki content contract change.

2026-09-01 20:35 CEST

  • User asked for a review of the skill set with a proposed model per skill.
  • Reviewed all 13 .agents/skills/ckb-* skills (plus the 7 personal skills under ~/.claude/skills/) and classified each by reasoning load vs. mechanical load.
  • Proposal: Opus 5 for ckb-ingest, ckb-retrieve, ckb-upgrade, ckb-project-summary, ckb-teach-me; Sonnet 5 for ckb-index-external, ckb-lint, ckb-init, ckb-sync-changes, ckb-export-okf, ckb-onboard-me, ckb-quiz; Haiku 4.5 for ckb-export-starlight (script-driven).
  • Noted that SKILL.md frontmatter carries only name/description here and Claude Code skills have no model field — model choice is per-session (/model) or per-subagent, so applying the proposal means either switching model before invoking or wrapping a skill in a subagent definition with model: frontmatter.
  • Also flagged: ckb-export-okf does its page transform by hand while ckb-export-starlight delegates to a Python script — the OKF one is the obvious candidate to scriptify (and would then drop to Haiku).
  • No files changed by this review.

2026-09-01 20:45 CEST

  • User asked to remove the duplicate personal quiz skill and to scriptify the skills whose work is mechanical.
  • Deleted ~/.claude/skills/quiz/ (byte-identical to ckb-quiz apart from the name: field and the license footer); a copy was kept in the session scratchpad only.
  • Scriptified ckb-export-okf: added .agents/skills/ckb-export-okf/scripts/export_okf.py (stdlib-only, read-only outside its output dir) doing the whole transform — frontmatter remap, wikilink stripping, /wiki/ link rewriting, index and log regeneration from the tree, plus an OKF conformance pass over its own output. --check validates into a temp dir without writing. Verified byte-identical across two runs.
  • Rewrote ckb-export-okf/SKILL.md around the script (run it, relay the report, distinguish SOURCE ISSUE: = fix the wiki from NONCONFORMANT: = fix the script), keeping the mapping table as reference documentation.
  • Scriptified the detection half of ckb-lint: added .agents/skills/ckb-lint/scripts/lint_report.py — strictly read-only, covering checks 1/2/3/4/6/7/8/10 across wiki/ and every connector-backed libs/<name>/ (reporting each one's access: level). Supersession (5), error-book (9), and every auto-fix-vs-report decision deliberately stay with the model. Added Step 0 to ckb-lint/SKILL.md and rewrote the mechanical checks to describe what the findings mean rather than how to detect them.
  • Tested the checker against a synthetic tree covering unparseable frontmatter, missing type, stale/low-confidence/archive-candidate pages, orphans, dangling graph edges, missing index entries, a change double-logged in root and subdirectory logs, and an invalid source.yaml. Against the real wiki it finds one genuine issue: wiki/query-gaps.md is 4 days past its 30-day freshness window.
  • Propagated to README.md/README.pl.md (OKF section now describes the script), MANUAL.md/MANUAL.pl.md (Lint section notes the read-only checker), and ckb-init (skill-set copy now names all three support scripts).
  • Bumped root VERSION 1.4.0 → 1.5.0 (template/tooling layer); wiki kb_schema_version stays 1.3 — no content contract change.
  • Decided against scriptifying anything else: ckb-init/ckb-upgrade are interactive and decision-heavy, and the rest (ingest, retrieve, project-summary, teach-me, onboard-me, quiz) are judgment work with no fixed ruleset to encode.

2026-09-01 21:10 CEST

  • User asked for a decision-log feature: record decisions with who/when/supersession and query them back.
  • Designed decisions as their own page kind rather than entity pages, because a decision is a point-in-time record with a lifecycle, not a description that gets rewritten as understanding improves. Core rule: decision pages are append-only — a changed mind is a new decision superseding the old one, with the old page's context and rationale left intact.
  • Wiki layer: created wiki/decisions/ with index.md (status vocabulary: proposed / accepted / rejected / superseded / reversed) and its own log.md. Pages are NNNN-slug.md, numbered from 0001, numbers never reused.
  • Schema: type: decision adds status, decided_on, decided_by, and optional affects / review_on; the existing supersedes/superseded_by pair carries decision history (must be set on both sides). Bumped kb_schema_version 1.3 → 1.4 (additive) and root VERSION 1.5.0 → 1.6.0.
  • New skill ckb-decide owns both halves: recording (collect facts, ask for gaps in one round rather than an interview, check for a decision it supersedes, allocate the number, write page, update index + graph edges + logs) and lookup (index first, read superseded chains as history, answer with who/when/status attached, never reconstruct an unrecorded decision).
  • ckb-lint now checks decision structure mechanically via lint_report.py: status vocabulary, decided_on where the status implies one, decided_by present (unknown counts), resolvable affects targets, two-sided supersession, superseded/reversed matched by a superseded_by, unique four-digit numbers, and overdue review_on. The semantic call — whether one decision genuinely replaces another — stays with the model.
  • ckb-ingest now routes decisions found in raw material to ckb-decide's format, with explicit guardrails against filing a proposal as accepted or guessing a decider. ckb-retrieve gained wiki/decisions/index.md as cascade step 4 with a handoff rule.
  • Graph gained decided_by (decision → person) and affects (decision → constrained entity) edge types.
  • Docs updated in both languages (README/README.pl feature + skill sections, MANUAL/MANUAL.pl new §2.D walkthrough and "say this" table rows, ownership table row noting the append-only convention), plus ckb-init (scaffold + skill list). Also fixed five stale cbk-quiz path references left from the upstream rename.
  • End-to-end tested on a scratch copy: a sample decision record passes lint clean and exports to OKF conformantly. That test surfaced a real bug in export_okf.py — a Rule B log line naming a directory (wiki/decisions/ (directory)) was being turned into a broken intra-bundle link; files_to_links now only linkifies entries that name an actual .md file.