feat: records a human can read — digest, overview, unmerged knowledge (v0.13.0) - #6
Merged
Merged
Conversation
… (v0.13.0) - summary.md (templates/summary.md): Problem/Cause/Change/Result/Lesson + Tags, bound by no approval so it stays current while intent.md stays frozen - kb.sh show is a digest: goal, summary, delivery, unmerged harvest candidates, lesson titles, then store-relative paths - kb.sh index: overview table (state, date, tags) newest first, a "Knowledge not merged yet" section, UTF-8-safe truncation, embedded headings demoted - kb.sh harvest [--stale N]: open features whose harvest.md no close merged, with idle time; AGENTS.md rule 4 allows merging a stale harvest without closing - kb.sh index --obsidian / index_style: obsidian: frontmatter + inline #tags, no timestamp so an unchanged page yields no diff; marker read within 12 lines - skills 1-intent/5-ship/6-maintain, SKILL.md routes, templates, both READMEs - knowledge-test.sh section H: 38 assertions (145 total) Validation: knowledge-test 145/0, selftest PASS, e2e 152/0, autotest 195/0.
… mount point on Linux and Git Bash GNU `stat -f %m` succeeds and prints the file system's mount point, so the BSD-first fallback never ran on ubuntu/windows and `kb.sh harvest` reported every idle time as unknown (CI: knowledge-test H22). `stat -c` is an illegal option on BSD, so GNU-first fails over cleanly on macOS.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v0.13.0 — records a human can read: digest, overview, unmerged knowledge
v0.12.0 moved the records out of git and made them retrievable. Retrieval
returned paths:
kb.sh showwas a table of contents, the generated page was aflat slug-ordered list, and a feature's knowledge became visible only when
close.shmerged its harvest — which, in a loop with many open features, israrely. This release changes what a reader gets, not what the loop records.
Gate authority, tamper detection, source binding, the
--jsonschema andlazymode are untouched; nothing under
work/orarchive/is written by anyof it.
Changes
summary.md— the reader's page (templates/summary.md). Five one-linebullets (Problem, Cause, Change, Result, Lesson) and a
Tagsline, in plainlanguage, ten lines at most. It is not a stage artifact and no approval binds
it — deliberately, so it can stay TRUE while
intent.mdstays frozen by itsapproval: written with the intent (skills/1-intent), Result and Lesson set at
ship from what
delivery.mdproves (skills/5-ship).kb.sh showand thecontents page print it before anything else. An older store that wrote a
## Summarysection intointent.mdis still read.kb.sh showis a digest. Goal (falling back to the intent's H1 when anolder intent has no
- Goal:line), Track/Type/Date/Tags/Requested by/Refs onone line, the summary,
Delivered:with its confirmation and handoff,Closed:with its date, the feature's unmergedharvest.mdcandidates,lesson titles with their files — and the document paths last, relative to
the store. Every line comes from a record; the tool selects and bounds, it
never summarizes. Long blocks are cut with a
… N more line(s): <path>line.tags, goal — open features first, newest first (the intent's
Date, elsea
YYMMDD-slug prefix; closed features byclosed_at), then a"Knowledge not merged yet" section listing every open feature whose
harvest.mdholds candidates, with the first lines of each, then one sectionper feature (goal, summary, track, close reason, documents, lesson titles).
Goal cells are bounded in bytes under
LC_ALL=Cand cut at a UTF-8 characterboundary, so a Korean goal is never rendered with a broken glyph. Record
headings embedded in the page are demoted to labels so a harvest's
###cannot hijack the page outline.
kb.sh harvest [--stale <days>]— the trigger the close-only mergelacked. Lists open features whose
harvest.mdno close has merged, with thecandidate line count and the idle time (newest mtime among the feature's own
records, never
scratch/);STALEat or past the threshold (default 30days). Exit
0something is unmerged,1nothing,2usage. It reports andwrites nothing.
An unmerged harvest is readable before close (
show, the page,harvest),and a feature idle 30 days or more may have its harvest merged without
closing — the same procedure, one merge at a time in the owning checkout,
harvest.mddeleted afterwards, the feature stays open.close.shstillblocks on an unmerged harvest exactly as before.
kb.sh index --obsidian, orindex_style: obsidianin the store'sconfig.mdsoinit.shandclose.shkeep the style: YAML frontmatter(
title,sdlc_store,tags) and the feature tags rendered as inline#tagsfor a vault's tag pane. Links stay standard relative markdown, whichObsidian resolves and graphs; only the generated page is touched. No
timestamp is written into the page in either style — a regenerated page
whose records did not change is byte-identical, so a vault under git gets no
diff and no sync conflict from it. The generated-page marker is now
recognized within the first 12 lines (after frontmatter); a page you wrote
yourself is still never overwritten.
skills/1-intent(writesummary.md, read thedigest before opening files),
skills/5-ship(bring Result/Lesson up todate),
skills/6-maintain(kb.sh harvestbefore opening a fix-slug),templates/intent.md(a pointer: the digest lives insummary.md),templates/harvest.md,SKILL.mdroutes,AGENTS.mdrule 4, both READMEs.Usage
Upgrade notes
without
summary.mdshows its goal and harvest, and older intents without a- Goal:line show their title. Addsummary.mdto a feature when you nexttouch it.
init.sh,close.shorkb.sh indexruns under this kit. AREADME.mdyou wrote yourself is stillrefused, not overwritten.
kb.sh showoutput is longer (digest before paths). Scripts that parsedthe old
documents:block should read theDocuments:block, whose paths arenow relative to the store.
agent does the merge under rule 4's guards, then deletes
harvest.md.Validation
Local, on macOS (darwin 25.6.0, arm64, GNU bash 3.2.57, git 2.54.0, APFS
case-insensitive, UTF-8):
bash gates/knowledge-test.sh→KNOWLEDGE-TEST PASS, 145 assertions(38 new in section H: the digest, the overview order, tags, the unmerged
section, UTF-8-safe truncation, byte-identical regeneration,
harvestexitcodes and
--stale,--obsidianandindex_style, and that no record underwork/was written)bash gates/selftest.sh→SELFTEST PASSbash gates/e2e.sh→E2E PASS, 152 assertions, 0 failuresbash gates/autotest.sh→AUTOTEST PASS, 195 assertions, 0 failuresbash -nover every changed shell script: clean.git diff --check: clean.showrenders adigest with the harvest facts;
harvestlists 9 features / 157 lines; thepage's overview table cuts long goals at a character boundary.