okf-pro 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.okf/contract/containment-directions.md +107 -0
- data/.okf/contract/exit-codes.md +42 -0
- data/.okf/contract/gates-only-at-the-hook-door.md +39 -0
- data/.okf/contract/index.md +10 -0
- data/.okf/contract/silent-skips.md +78 -0
- data/.okf/contract/telemetry-does-not-lie.md +218 -0
- data/.okf/contract/the-contract.md +43 -0
- data/.okf/design/a-comment-is-not-an-implementation.md +85 -0
- data/.okf/design/a-rule-you-can-walk-past.md +68 -0
- data/.okf/design/derivation-that-writes.md +161 -0
- data/.okf/design/failure-modes.md +43 -0
- data/.okf/design/index.md +18 -0
- data/.okf/design/lineage.md +95 -0
- data/.okf/design/structure-laws.md +46 -0
- data/.okf/design/the-residue.md +44 -0
- data/.okf/design/three-laws.md +71 -0
- data/.okf/design/three-pillars.md +48 -0
- data/.okf/index.md +31 -0
- data/.okf/log.md +74 -0
- data/.okf/scaffold/collisions-and-refusals.md +76 -0
- data/.okf/scaffold/index.md +8 -0
- data/.okf/scaffold/no-date-ships.md +41 -0
- data/.okf/scaffold/ownership-not-subject.md +63 -0
- data/.okf/scaffold/the-adopters-manual.md +114 -0
- data/.okf/seam/bundler-scoping.md +45 -0
- data/.okf/seam/identity-not-existence.md +67 -0
- data/.okf/seam/index.md +8 -0
- data/.okf/seam/the-wrapper.md +42 -0
- data/.okf/seam/three-fail-opens.md +44 -0
- data/.okf/testing/drills-over-units.md +41 -0
- data/.okf/testing/fixture-is-a-client.md +35 -0
- data/.okf/testing/index.md +4 -0
- data/.okf/trust/index.md +7 -0
- data/.okf/trust/read-owed-rule.md +45 -0
- data/.okf/trust/scalar-verified.md +48 -0
- data/CHANGELOG.md +187 -0
- data/LICENSE.txt +201 -0
- data/NOTICE +10 -0
- data/README.md +383 -0
- data/lib/okf/plugin.rb +148 -0
- data/lib/okf/pro/attestation.rb +62 -0
- data/lib/okf/pro/audit.rb +161 -0
- data/lib/okf/pro/board/edit.rb +201 -0
- data/lib/okf/pro/board.rb +291 -0
- data/lib/okf/pro/budget.rb +144 -0
- data/lib/okf/pro/bundle_root.rb +241 -0
- data/lib/okf/pro/cli.rb +914 -0
- data/lib/okf/pro/closing.rb +206 -0
- data/lib/okf/pro/conformance.rb +127 -0
- data/lib/okf/pro/conserve.rb +94 -0
- data/lib/okf/pro/event.rb +95 -0
- data/lib/okf/pro/friction.rb +262 -0
- data/lib/okf/pro/guards.rb +92 -0
- data/lib/okf/pro/log/edit.rb +68 -0
- data/lib/okf/pro/log.rb +162 -0
- data/lib/okf/pro/pairing.rb +271 -0
- data/lib/okf/pro/reconcile.rb +76 -0
- data/lib/okf/pro/records.rb +90 -0
- data/lib/okf/pro/scaffold.rb +258 -0
- data/lib/okf/pro/shell_guard.rb +164 -0
- data/lib/okf/pro/snapshot.rb +156 -0
- data/lib/okf/pro/state.rb +174 -0
- data/lib/okf/pro/target.rb +91 -0
- data/lib/okf/pro/template/gem/.claude/hooks/run +119 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/SKILL.md +233 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/attribution.md +46 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/board.md +55 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/closing.md +21 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/frontmatter.md +73 -0
- data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/okf-rules.md +25 -0
- data/lib/okf/pro/template/gem/.githooks/pre-commit +68 -0
- data/lib/okf/pro/template/gem/.github/workflows/okf-pro.yml +69 -0
- data/lib/okf/pro/template/seed/.claude/settings.json +24 -0
- data/lib/okf/pro/template/seed/.okf/areas/corpus.md +73 -0
- data/lib/okf/pro/template/seed/.okf/areas/index.md +6 -0
- data/lib/okf/pro/template/seed/.okf/board.md +21 -0
- data/lib/okf/pro/template/seed/.okf/glossary/index.md +13 -0
- data/lib/okf/pro/template/seed/.okf/index.md +30 -0
- data/lib/okf/pro/template/seed/.okf/journal/index.md +11 -0
- data/lib/okf/pro/template/seed/.okf/learnings/index.md +13 -0
- data/lib/okf/pro/template/seed/.okf/log.md +10 -0
- data/lib/okf/pro/template/seed/.okf/projects/index.md +23 -0
- data/lib/okf/pro/template/seed/.okf/reference/index.md +16 -0
- data/lib/okf/pro/template/seed/.okf/roadmap.md +33 -0
- data/lib/okf/pro/template/seed/.tmp/.gitkeep +0 -0
- data/lib/okf/pro/template/seed/CLAUDE.md +61 -0
- data/lib/okf/pro/template/seed/README.md +488 -0
- data/lib/okf/pro/template/seed/gitignore +17 -0
- data/lib/okf/pro/version.rb +7 -0
- data/lib/okf/pro/writes.rb +560 -0
- data/lib/okf/pro.rb +198 -0
- metadata +169 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# What this repo is
|
|
2
|
+
|
|
3
|
+
`.okf/` is a personal knowledge bundle, not a codebase. Nothing in it
|
|
4
|
+
compiles, ships, or has users. The only target is that knowledge stays
|
|
5
|
+
**accurate and retrievable** — that a claim can be found by someone who has
|
|
6
|
+
forgotten it exists, and that when it is found it is not sitting next to its
|
|
7
|
+
own contradiction. A reorganisation that improves nothing findable is waste;
|
|
8
|
+
speed of writing is worth almost nothing, cost of retrieval is worth almost
|
|
9
|
+
everything.
|
|
10
|
+
|
|
11
|
+
Everything else at the repository root — this file, `README.md`, `.claude/`,
|
|
12
|
+
`.githooks/`, `.github/` — is instruction or plumbing. None of it is a concept,
|
|
13
|
+
none of it carries frontmatter, and `okf` never sees it.
|
|
14
|
+
|
|
15
|
+
# The rules live in the skill
|
|
16
|
+
|
|
17
|
+
All bundle work — filing a concept, editing the board, journaling, the
|
|
18
|
+
snapshot, closing work, anything that touches `.okf/` — follows the
|
|
19
|
+
**okf-pro** skill:
|
|
20
|
+
[.claude/skills/okf-pro/SKILL.md](.claude/skills/okf-pro/SKILL.md). Use it
|
|
21
|
+
before reading from or writing into the bundle. The hooks enforce the
|
|
22
|
+
countable half of those rules mechanically; the skill is the whole of them.
|
|
23
|
+
|
|
24
|
+
It assumes the **okf** skill is also installed, and does not repeat it. That one
|
|
25
|
+
teaches the format — what a concept is, what frontmatter it carries, how links
|
|
26
|
+
resolve, which verb answers which question — and this one teaches the rules on
|
|
27
|
+
top. If it is missing, install it with `okf skill ~/.claude` before filing
|
|
28
|
+
anything: the alternative is guessing at a file shape the gates will then refuse.
|
|
29
|
+
|
|
30
|
+
Scratch work goes under `.tmp/` at the repository root — outside the bundle
|
|
31
|
+
entirely.
|
|
32
|
+
|
|
33
|
+
# The three doors
|
|
34
|
+
|
|
35
|
+
The same invariants are asked three times, because each door sees edits the
|
|
36
|
+
others never do:
|
|
37
|
+
|
|
38
|
+
* **agent-time** — `.claude/hooks/` fire at the tool boundary, before and
|
|
39
|
+
after every write into the bundle;
|
|
40
|
+
* **commit-time** — `.githooks/pre-commit` audits the *staged* tree. It needs
|
|
41
|
+
one setup per clone, because git hooks do not travel with a checkout:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
git config core.hooksPath .githooks
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
* **push-time** — `.github/workflows/okf-pro.yml`, for the edit made on a
|
|
48
|
+
machine that never configured the hook, or committed with `--no-verify`.
|
|
49
|
+
|
|
50
|
+
All three fail **closed**: a gate that cannot run refuses rather than passing.
|
|
51
|
+
A gate that waved things through because its checker was missing would have
|
|
52
|
+
converted "unchecked" into "checked and fine", which is worse than having no
|
|
53
|
+
gate at all.
|
|
54
|
+
|
|
55
|
+
# This file is yours
|
|
56
|
+
|
|
57
|
+
`okf pro upgrade` rewrites the four governance files it owns — the hook
|
|
58
|
+
wrapper, the pre-commit hook, the workflow, the skill — and never touches this
|
|
59
|
+
one, `README.md`, `.gitignore`, `.claude/settings.json`, or anything under
|
|
60
|
+
`.okf/`. Those were seeded once and are yours from that moment. Add to this file whatever
|
|
61
|
+
else an agent working in this repository needs to know.
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
# Knowledge base
|
|
2
|
+
|
|
3
|
+
**Being good at something has a shape, and it is the same shape in every
|
|
4
|
+
craft.**
|
|
5
|
+
|
|
6
|
+
You know what you are committed to, and what you are not. You can tell what you
|
|
7
|
+
actually know from what you have merely read about. You do not relearn the same
|
|
8
|
+
lesson twice, because you wrote it down the first time. You can say where a
|
|
9
|
+
claim came from. When you take something new on, you know what it displaced.
|
|
10
|
+
|
|
11
|
+
Almost nobody is taught that shape. People arrive at it after ten years, by
|
|
12
|
+
accident and at their own expense, and plenty of very capable people never do —
|
|
13
|
+
not for lack of talent, but because nothing in an ordinary week ever forces the
|
|
14
|
+
question.
|
|
15
|
+
|
|
16
|
+
**You get there by structuring the way you work, not by trying harder.** That is
|
|
17
|
+
the whole method here: a small number of shapes — what you are committed to,
|
|
18
|
+
what you learned, what you read and who says so — each with one place it lives
|
|
19
|
+
and one form it takes, and a set of gates that refuse the edits that break them.
|
|
20
|
+
Give the practice a structure and the discipline stops being something you have
|
|
21
|
+
to remember to have.
|
|
22
|
+
|
|
23
|
+
It hands someone starting out the structure a professional already works inside,
|
|
24
|
+
and hands the professional a memory that does not quietly rot. It works the same
|
|
25
|
+
whether your craft is code, law, medicine, research, design or running a team,
|
|
26
|
+
because none of the four habits below is about any of those.
|
|
27
|
+
|
|
28
|
+
You work by talking to your agent, the way you already do. The difference is
|
|
29
|
+
that the agent is now held to those habits, and so are you.
|
|
30
|
+
|
|
31
|
+
> **This file is yours** — `okf pro upgrade` rewrites the governance files it
|
|
32
|
+
> owns and never touches this one. Rewrite the heading and the paragraphs above
|
|
33
|
+
> it the day this repository has its own story to tell. Everything below is your
|
|
34
|
+
> operating manual, and worth keeping until you know it by heart: your agent
|
|
35
|
+
> reads `.claude/skills/okf-pro/SKILL.md`, and this is the copy written for you.
|
|
36
|
+
|
|
37
|
+
## The four habits it structures
|
|
38
|
+
|
|
39
|
+
Each one is a thing good practitioners do and nobody does reliably from memory.
|
|
40
|
+
Here each is a shape with a place, a form, and a gate that refuses to let it
|
|
41
|
+
drift.
|
|
42
|
+
|
|
43
|
+
**You find out you are overloaded on the day it happens, not in hindsight.**
|
|
44
|
+
Five things in flight is a hard ceiling. Taking on a sixth means looking at five
|
|
45
|
+
existing commitments and saying which is worth less — which is the actual work
|
|
46
|
+
of prioritisation, and the thing nobody does voluntarily. Without a ceiling you
|
|
47
|
+
do not prioritise, you only add. A system where everything is in progress is a
|
|
48
|
+
school where everyone gets an A: the grade has stopped carrying information.
|
|
49
|
+
|
|
50
|
+
**You stop confusing what you read with what was generated near you.** Your
|
|
51
|
+
agent can summarise forty papers in an afternoon and cannot tell you that *you*
|
|
52
|
+
read them. Here it is allowed to write the summary and not allowed to write down
|
|
53
|
+
that you read it. Six months on, that distinction is the whole difference
|
|
54
|
+
between a knowledge base and a pile of plausible text.
|
|
55
|
+
|
|
56
|
+
**You notice a thing has gone quiet before it costs you.** A commitment nobody
|
|
57
|
+
has journaled in five working days gets asked about. Something you are blocked
|
|
58
|
+
on that went silent gets counted. A deadline landing Wednesday with nothing
|
|
59
|
+
pointed at it shows up on Monday — not because you configured a reminder, but
|
|
60
|
+
because it is an arithmetic consequence of the board being honest.
|
|
61
|
+
|
|
62
|
+
**You get a record that can contradict your memory of the quarter.** One line of
|
|
63
|
+
counters a day, computed rather than typed. "Inbox 14" tells you nothing; "+8
|
|
64
|
+
inbox, oldest now six days" tells you what your week did to you.
|
|
65
|
+
|
|
66
|
+
Everything stays on your machine. `.okf/` is files in this repository; nothing
|
|
67
|
+
is uploaded, and no part of the enforcement calls out anywhere.
|
|
68
|
+
|
|
69
|
+
## What you need
|
|
70
|
+
|
|
71
|
+
Git, Ruby, and a coding agent. The gates are written for
|
|
72
|
+
[Claude Code](https://claude.com/claude-code) and fire at its tool boundary.
|
|
73
|
+
Without an agent you keep the commit-time and CI doors — the bundle still cannot
|
|
74
|
+
go structurally wrong — but you lose the attestation gate, which is the most
|
|
75
|
+
valuable thing here. Worth knowing now rather than in week two.
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
okf skill ~/.claude # teach your agent the format
|
|
79
|
+
git config core.hooksPath .githooks # arm this clone's commit door
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Both are one-time and neither is optional. The first installs the **okf** skill,
|
|
83
|
+
which teaches your agent the *format* — what a concept is, what frontmatter it
|
|
84
|
+
carries, how links resolve. The **okf-pro** skill already sits in
|
|
85
|
+
`.claude/skills/okf-pro/` and teaches the *rules on top of it*; it deliberately
|
|
86
|
+
does not repeat the format, so skipping the install leaves your agent held to
|
|
87
|
+
invariants about something nobody taught it. Put it in your home directory and
|
|
88
|
+
every bundle on the machine is covered.
|
|
89
|
+
|
|
90
|
+
The second is per clone, because git hooks do not travel with a checkout.
|
|
91
|
+
Anyone cloning this later runs `gem install okf-pro` first, then both lines.
|
|
92
|
+
|
|
93
|
+
## A week with it
|
|
94
|
+
|
|
95
|
+
One ordinary week. Nothing is configured and nothing is automated away — the
|
|
96
|
+
system interrupts four times, and each interruption is the product working.
|
|
97
|
+
|
|
98
|
+
### Monday — something arrives
|
|
99
|
+
|
|
100
|
+
Someone drops a link in a group chat. You have eleven seconds before the
|
|
101
|
+
conversation moves on, so you tell your agent, in the words you actually saw:
|
|
102
|
+
|
|
103
|
+
> *"capture: link from the group about incremental static regen"*
|
|
104
|
+
|
|
105
|
+
One line lands in the Inbox, dated. No filename, no folder, no decision about
|
|
106
|
+
whether it matters. **Capture has no bar** — if it crossed your mind, five
|
|
107
|
+
seconds, in your own words. That is deliberate, and it is the part people get
|
|
108
|
+
wrong: capture that costs more than five seconds stops happening on exactly the
|
|
109
|
+
days it matters most, which are the busy ones.
|
|
110
|
+
|
|
111
|
+
By Tuesday afternoon two more have gone in the same way, unedited and unjudged.
|
|
112
|
+
The Inbox is allowed to be a mess. That is its job.
|
|
113
|
+
|
|
114
|
+
```markdown
|
|
115
|
+
## Inbox
|
|
116
|
+
- 2026-06-29 — link from the group about incremental static regen
|
|
117
|
+
- 2026-06-30 — Ana asked me to look at the pricing sheet before Thu
|
|
118
|
+
- 2026-06-30 — the Rust course — am I actually doing this or not
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Wednesday — the bar
|
|
122
|
+
|
|
123
|
+
Once a day, end of the afternoon is fine, you read the Inbox. Not to file it —
|
|
124
|
+
to decide what survives. This is the question everyone asks about a system like
|
|
125
|
+
this, and the answer has two halves:
|
|
126
|
+
|
|
127
|
+
**Capture has no bar. Triage is the bar.** Most Inbox lines never become
|
|
128
|
+
anything: they were noise, or already handled. A few are facts and get filed as
|
|
129
|
+
concepts. Only the remainder is work, and work has to fit five slots.
|
|
130
|
+
|
|
131
|
+
Four minutes of reading, three decisions. The group-chat link is a fact worth
|
|
132
|
+
keeping rather than work, so you ask your agent to file it in `reference/` and
|
|
133
|
+
it leaves the board. Ana's pricing sheet is real work with a real date, so it
|
|
134
|
+
gets promoted. The Rust course is the interesting one: read back on a Wednesday,
|
|
135
|
+
the honest answer is no — not "no forever", but to Backlog, where it costs
|
|
136
|
+
nothing and stops pretending to be active. That small act, repeated, is most of
|
|
137
|
+
what this does for you.
|
|
138
|
+
|
|
139
|
+
```markdown
|
|
140
|
+
**In flight: 5/5** · updated 2026-07-01
|
|
141
|
+
|
|
142
|
+
## In flight
|
|
143
|
+
- Q3 pricing model — next: send Ana the draft
|
|
144
|
+
- migration runbook — next: dry-run on staging
|
|
145
|
+
- hiring loop — next: write the take-home brief
|
|
146
|
+
- conference talk — next: outline section 3
|
|
147
|
+
- Ana's pricing sheet — next: read it, comment by Thu
|
|
148
|
+
|
|
149
|
+
## Backlog
|
|
150
|
+
- the Rust course
|
|
151
|
+
|
|
152
|
+
## Inbox
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
The board is full. Not "getting busy" — full, as a number, in a place you look
|
|
156
|
+
every day. Nothing has gone wrong yet, but the next thing that arrives has to
|
|
157
|
+
displace something, and you find that out the moment you try.
|
|
158
|
+
|
|
159
|
+
### Thursday — the first refusal
|
|
160
|
+
|
|
161
|
+
New work lands, it feels urgent, and you go to promote it:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
RULE 3: 5 in flight against a cap of 5, so promoting makes 6. Promotion
|
|
165
|
+
requires demotion (`okf pro demote`), or a visible renegotiation of the cap —
|
|
166
|
+
which is journal-worthy, and yours to make.
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Three things are true about that message and all three matter.
|
|
170
|
+
|
|
171
|
+
**It is not a suggestion.** The edit does not land. You cannot proceed by
|
|
172
|
+
ignoring it, which is what separates it from every tool that shows an amber
|
|
173
|
+
warning you learn to skip inside a fortnight.
|
|
174
|
+
|
|
175
|
+
**It offers you the escape.** You are allowed to work on six things. Change the
|
|
176
|
+
cap — it is your cap. The rule is not that five is correct; the rule is that
|
|
177
|
+
going to six is an act you performed, written in a header, mentioned in your
|
|
178
|
+
journal, and visible in December when you are working out why autumn felt like
|
|
179
|
+
that.
|
|
180
|
+
|
|
181
|
+
**It forces the comparison you were avoiding.** To promote the new thing you
|
|
182
|
+
have to look at five commitments and say which is worth less.
|
|
183
|
+
|
|
184
|
+
You demote the conference talk. Back to 5/5, with a different five.
|
|
185
|
+
|
|
186
|
+
### Thursday — the gate that matters most
|
|
187
|
+
|
|
188
|
+
You ask your agent to summarise a long paper into the bundle. Forty seconds
|
|
189
|
+
later there is a competent briefing in `reference/`, carrying `generated:`, and
|
|
190
|
+
a new line on the board:
|
|
191
|
+
|
|
192
|
+
```markdown
|
|
193
|
+
## To read
|
|
194
|
+
- /reference/consistency-models.md — summarised, not read
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Here is the failure that prevents. In a normal setup that summary is now
|
|
198
|
+
indistinguishable from something you read and understood. Three months later you
|
|
199
|
+
cite it in an argument, and you have no way to know — not from the file, not
|
|
200
|
+
from memory — whether the claim passed through a human brain or was assembled by
|
|
201
|
+
a language model at 16:20 on a Thursday while you were doing something else.
|
|
202
|
+
|
|
203
|
+
So the agent is allowed to write the summary. It is not allowed to write down
|
|
204
|
+
that you read it.
|
|
205
|
+
|
|
206
|
+
Friday morning you actually read the paper. Twenty minutes, properly. Then you
|
|
207
|
+
tell the agent to mark it verified, and this is what happens:
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
This edit writes 'verified:' — owner attestation. The agent is the scribe;
|
|
211
|
+
your approval is the attestation. Approve ONLY if you have actually reviewed
|
|
212
|
+
this content yourself. If you have not, deny — unverified is the truth.
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
You approve, because you did read it. The block is written, the To-read line
|
|
216
|
+
comes off the board, and the concept carries a durable, checkable claim: a
|
|
217
|
+
person stood behind this, on this date. Deny it and nothing is written —
|
|
218
|
+
unverified stays the truth, which is not a defect to tidy away. And in an
|
|
219
|
+
unattended run, with nobody there to ask, the write is refused rather than waved
|
|
220
|
+
through.
|
|
221
|
+
|
|
222
|
+
### Friday — the day will not close
|
|
223
|
+
|
|
224
|
+
You try to end the session. It will not let you:
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
RULE 2 — before stopping:
|
|
228
|
+
— log.md has no Snapshot line under 2026-07-03. Append it before stopping —
|
|
229
|
+
computed from the bundle as it stands:
|
|
230
|
+
* **Snapshot**: inbox 0 (oldest 0d) · in flight 5/5 · waiting 2 (1 past chase)
|
|
231
|
+
· backlog 4 · to read 0 · unverified briefings 1 · conflicts open 0
|
|
232
|
+
· deadlines within 7d not in flight 1 · projects with 0 concepts 2
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
The gate computes the line and hands it over, so the fix is a paste. It is
|
|
236
|
+
numbers, not a reflection — judgment is kept out of it deliberately, because the
|
|
237
|
+
moment an opinion leaks into the counter it stops being comparable with
|
|
238
|
+
yesterday's. Your agent appends it, you write two sentences in the journal about
|
|
239
|
+
what the week meant, and the session closes.
|
|
240
|
+
|
|
241
|
+
A session where you read the bundle and changed nothing closes in silence. You
|
|
242
|
+
are not billed a ritual for opening a file.
|
|
243
|
+
|
|
244
|
+
## The following Monday — the return
|
|
245
|
+
|
|
246
|
+
Everything above was cost. Here is the return, and it exists only because last
|
|
247
|
+
week's line was recorded honestly. Your session opens with this, before you have
|
|
248
|
+
done anything and without your agent spending a call to fetch it:
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
Bundle state at session start — in flight 5/5 · backlog 4 · waiting 2 (1 past chase) · inbox 0 (oldest 0d) · to read 0 · conflicts open 0
|
|
252
|
+
Read the delta, not the status: a number that moved the wrong way is today's first signal.
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
And the numbers only mean something beside the previous ones:
|
|
256
|
+
|
|
257
|
+
| Counter | Mon 29th | Fri 3rd | What it says |
|
|
258
|
+
|---|---|---|---|
|
|
259
|
+
| inbox | 0 | 0 | Triage kept up. It did not accumulate. |
|
|
260
|
+
| in flight | 3/5 | 5/5 | You took on two more things and are at the ceiling. |
|
|
261
|
+
| waiting past chase | 0 | 1 | Something you are blocked on went quiet and nobody noticed. |
|
|
262
|
+
| unverified briefings | 0 | 1 | One summary is still unread. It is not knowledge yet. |
|
|
263
|
+
| deadlines <7d unclaimed | 0 | 1 | A date lands Wednesday and nothing in flight points at it. |
|
|
264
|
+
|
|
265
|
+
That last row earns the whole system. A deadline on Wednesday with nothing
|
|
266
|
+
pointed at it is a collision you can see three days out, and nobody had to
|
|
267
|
+
remember to check.
|
|
268
|
+
|
|
269
|
+
A standing count is wallpaper — a warning always on screen carries no
|
|
270
|
+
information and trains you to stop seeing it. The value is the comparison, which
|
|
271
|
+
is why the line is mechanical.
|
|
272
|
+
|
|
273
|
+
## Where things go
|
|
274
|
+
|
|
275
|
+
Most of a bundle is concepts, and one question routes them: **does it outlive
|
|
276
|
+
the work that produced it?** No → it belongs to a project. Yes, and someone else
|
|
277
|
+
wrote it → `reference/`. Yes, and you concluded it → `learnings/`. Yes, and it
|
|
278
|
+
is what a word means here → `glossary/`.
|
|
279
|
+
|
|
280
|
+
You do not write these by hand. You ask, and your agent files the Markdown:
|
|
281
|
+
|
|
282
|
+
```markdown
|
|
283
|
+
---
|
|
284
|
+
type: Briefing
|
|
285
|
+
title: Incremental static regeneration
|
|
286
|
+
description: What ISR actually guarantees about staleness, and where that breaks.
|
|
287
|
+
generated: { by: claude/opus-5, at: 2026-07-01T09:12:00Z }
|
|
288
|
+
stale_after: 2026-09-29
|
|
289
|
+
sources:
|
|
290
|
+
- id: nextjs-isr
|
|
291
|
+
resource: https://nextjs.org/docs/app/guides/incremental-static-regeneration
|
|
292
|
+
title: Next.js docs — Incremental Static Regeneration
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
# What it guarantees
|
|
296
|
+
...
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
`generated:` says a machine wrote it and nobody has checked. `verified:` is the
|
|
300
|
+
one field your agent cannot set on its own.
|
|
301
|
+
|
|
302
|
+
| Where | What it holds |
|
|
303
|
+
|---|---|
|
|
304
|
+
| `reference/` | what other people produced — their claim, your summary, the source recorded |
|
|
305
|
+
| `learnings/` | conclusions of yours that outlive the work that produced them |
|
|
306
|
+
| `glossary/` | a word that needs one fixed meaning here because it means three elsewhere |
|
|
307
|
+
| `projects/` | work with a definition of done; one directory each |
|
|
308
|
+
| `areas/` | a standard held indefinitely — a level, not a finish line |
|
|
309
|
+
| `board.md` | the whole commitment surface, on one bounded page |
|
|
310
|
+
| `journal/` | one entry per working day: what happened, what it meant |
|
|
311
|
+
| `log.md` | what changed, and the day's counter line |
|
|
312
|
+
| `roadmap.md` | the quarter's intent, sparsely, linking out |
|
|
313
|
+
|
|
314
|
+
The first five are rooms for concepts. The last four are the running record —
|
|
315
|
+
`journal/` is prose, `log.md` is arithmetic, and keeping them apart is what makes
|
|
316
|
+
a counter comparable with yesterday's.
|
|
317
|
+
|
|
318
|
+
Everything else at the root — `CLAUDE.md`, `.claude/`, `.githooks/`, `.github/`
|
|
319
|
+
— is instruction or plumbing, and `okf` never looks at it. Scratch goes in
|
|
320
|
+
`.tmp/`, outside the bundle entirely.
|
|
321
|
+
|
|
322
|
+
If `projects/ areas/ reference/` looks familiar, it should: that is Tiago
|
|
323
|
+
Forte's PARA, and capture-then-triage owes a great deal to GTD. What is not
|
|
324
|
+
borrowed is the enforcement. PARA tells you where things go and nothing in it
|
|
325
|
+
stops you running eleven active projects or citing a summary you never read.
|
|
326
|
+
|
|
327
|
+
### The board's six sections
|
|
328
|
+
|
|
329
|
+
That is the board a few days in. This is the one you actually open today:
|
|
330
|
+
|
|
331
|
+
```markdown
|
|
332
|
+
---
|
|
333
|
+
type: Board
|
|
334
|
+
title: Board
|
|
335
|
+
description: The single page of forward state — every commitment, in six sections, on one page you can read at a glance.
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
# Board
|
|
339
|
+
|
|
340
|
+
**In flight: 0/5** · updated never
|
|
341
|
+
|
|
342
|
+
## In flight
|
|
343
|
+
|
|
344
|
+
## Backlog
|
|
345
|
+
|
|
346
|
+
## Waiting
|
|
347
|
+
|
|
348
|
+
## Inbox
|
|
349
|
+
|
|
350
|
+
## To read
|
|
351
|
+
|
|
352
|
+
## Deadlines
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Only **In flight** is capped. How a line reaches each:
|
|
356
|
+
|
|
357
|
+
| Section | How something gets there |
|
|
358
|
+
|---|---|
|
|
359
|
+
| **Inbox** | you capture it. Rule 1's unsettled conflicts land here too — an unresolved contradiction is undifferentiated work until someone triages it |
|
|
360
|
+
| **In flight** | promoted from Inbox or Backlog, refused over the cap |
|
|
361
|
+
| **Backlog** | demoted from In flight, or moved across in triage |
|
|
362
|
+
| **Waiting** | you write it, when the next move belongs to someone else: who, what, when asked, and a literal `chase YYYY-MM-DD`. This is the section that rots silently — nothing here fails loudly, it just never arrives |
|
|
363
|
+
| **To read** | whoever files a briefing writes the line. Reading is what removes it, and only reading: a briefing your agent summarised is not read |
|
|
364
|
+
| **Deadlines** | you write it, date first — `- YYYY-MM-DD — what lands`. Outside the pipeline and outside the cap, because they arrive whether or not anyone acts |
|
|
365
|
+
|
|
366
|
+
## Why the rules cannot just be rules
|
|
367
|
+
|
|
368
|
+
Everything above depends on the refusals actually firing. A rule you can walk
|
|
369
|
+
past is a preference, and every knowledge system that has ever failed you failed
|
|
370
|
+
exactly that way: the discipline was real for three weeks, then it was optional,
|
|
371
|
+
then it was gone.
|
|
372
|
+
|
|
373
|
+
So the checks sit at three places, because each catches what the one before it
|
|
374
|
+
structurally cannot see.
|
|
375
|
+
|
|
376
|
+
| Door | Fires | Catches |
|
|
377
|
+
|---|---|---|
|
|
378
|
+
| `.claude/hooks/` | your agent's tool boundary | the agent editing a file |
|
|
379
|
+
| `.githooks/pre-commit` | `git commit` | what you edited yourself, where no hook fired |
|
|
380
|
+
| `.github/workflows/` | push | a clone that never ran the one-line setup |
|
|
381
|
+
|
|
382
|
+
All three fail **closed**. A gate that cannot run refuses rather than passing,
|
|
383
|
+
because a gate that waved edits through while its checker was missing would have
|
|
384
|
+
converted "unchecked" into "checked and fine" — and there is no later moment at
|
|
385
|
+
which anyone finds out.
|
|
386
|
+
|
|
387
|
+
## The commands, when you want them
|
|
388
|
+
|
|
389
|
+
Mostly you will not. Your agent runs these; the session banner tells it to, and
|
|
390
|
+
the point of the verbs is that shapes with exactly one correct form get written
|
|
391
|
+
correctly without anyone reconstructing the grammar from prose.
|
|
392
|
+
|
|
393
|
+
They are here because sometimes you want to look without opening a session:
|
|
394
|
+
|
|
395
|
+
```sh
|
|
396
|
+
okf pro state . # the counts and the questions — "where am I?"
|
|
397
|
+
okf pro board . # the lines themselves, one row each
|
|
398
|
+
okf pro audit . # every invariant at once — the same check CI runs
|
|
399
|
+
okf pro unverified . # what still awaits your read
|
|
400
|
+
okf validate .okf # conformance — is this a legal OKF bundle?
|
|
401
|
+
okf lint .okf # curation — is it a well-kept one?
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
The `okf pro` verbs take the repository root, because they reason about the
|
|
405
|
+
bundle, the git history and the hooks together. The kernel's two take the bundle
|
|
406
|
+
itself. There are writers as well — `capture`, `promote`, `demote`,
|
|
407
|
+
`journal open`, `close` — and those are the ones your agent uses on your behalf.
|
|
408
|
+
`okf pro --help` lists them all.
|
|
409
|
+
|
|
410
|
+
**What the day costs you.** Capture is five seconds a line. Triage is ten
|
|
411
|
+
minutes, once. The closing sitting is another ten. Twenty to twenty-five minutes
|
|
412
|
+
of *your* time on a day you worked, nothing at all on a day you did not, and
|
|
413
|
+
your agent pays none of it.
|
|
414
|
+
|
|
415
|
+
## Tuning
|
|
416
|
+
|
|
417
|
+
Three numbers ship as defaults, and all three are probably wrong for you:
|
|
418
|
+
|
|
419
|
+
| Number | Default | Where it lives |
|
|
420
|
+
|---|---|---|
|
|
421
|
+
| In-flight cap | 5 | the `**In flight: 0/5**` header at the top of `.okf/board.md` |
|
|
422
|
+
| Dormancy window | 5 working days | Rule 3 in [the okf-pro skill](.claude/skills/okf-pro/SKILL.md) |
|
|
423
|
+
| Staleness windows | briefings +90d, terms +180d, measured external figures +90d | the frontmatter guide in the skill, owned by [`.okf/areas/corpus.md`](.okf/areas/corpus.md) |
|
|
424
|
+
|
|
425
|
+
They are visible-and-wrong by design. A default wrong in plain sight gets
|
|
426
|
+
corrected in week two; a hidden one gets worked around forever, and the
|
|
427
|
+
workaround becomes the system. **Change the number, never hide it** — and for
|
|
428
|
+
the staleness windows, record the decision in `areas/corpus.md` first, then the
|
|
429
|
+
skill, then a dated `log.md` line, so the standard never lags the rule.
|
|
430
|
+
|
|
431
|
+
## Turning it off, and leaving
|
|
432
|
+
|
|
433
|
+
A system built out of refusals owes you a way to stop being refused. There is no
|
|
434
|
+
secret flag, and that is deliberate — a gate with an off switch an agent can
|
|
435
|
+
reach is not a gate. Everything here is you editing a file.
|
|
436
|
+
|
|
437
|
+
**One gate, off.** Delete its entry from `.claude/settings.json`. Six are listed
|
|
438
|
+
there by name — `guard-verified`, `journal-guard`, `shell-guard`, `post-edit`,
|
|
439
|
+
`stop-gate`, `session-context` — one command each, and removing one has no
|
|
440
|
+
effect on the others.
|
|
441
|
+
|
|
442
|
+
**All the agent-time gates, off.** Remove the `hooks` block from
|
|
443
|
+
`.claude/settings.json`. You keep the commit and CI doors, so the bundle still
|
|
444
|
+
cannot go structurally wrong; you have only stopped being interrupted while you
|
|
445
|
+
work.
|
|
446
|
+
|
|
447
|
+
**The commit door, off.** `git config --unset core.hooksPath`, or
|
|
448
|
+
`git commit --no-verify` for a single commit you need through right now.
|
|
449
|
+
|
|
450
|
+
**All of it, off.** Do both of the above.
|
|
451
|
+
|
|
452
|
+
**Leaving entirely.** Delete `.claude/`, `.githooks/`, `.github/` and
|
|
453
|
+
`CLAUDE.md`. What remains is `.okf/` — Markdown with YAML frontmatter, readable
|
|
454
|
+
by anything, portable to any editor, and still a valid OKF bundle that
|
|
455
|
+
`okf validate` passes on its own. Nothing you wrote is trapped in this
|
|
456
|
+
repository's machinery, and nothing about the format depends on the enforcement.
|
|
457
|
+
That is the point of building on a spec rather than a schema of someone's own.
|
|
458
|
+
|
|
459
|
+
One thing you cannot do is turn a gate off with an environment variable. There
|
|
460
|
+
is none to set: the enforcement layer reads no environment variable to decide
|
|
461
|
+
whether a check runs. A gate a stray `export` could disable is one you would
|
|
462
|
+
have no reason to trust.
|
|
463
|
+
|
|
464
|
+
## Honest limits
|
|
465
|
+
|
|
466
|
+
**This is a passport, not a lie detector.** It can prove where a claim came
|
|
467
|
+
from, who summarised it, and whether a human ever checked it. It cannot tell you
|
|
468
|
+
whether the claim is true. What it buys you is that a well-sourced mistake stays
|
|
469
|
+
*catchable* — traceable, dateable, and you can find everything downstream of it.
|
|
470
|
+
That is the best honest promise a knowledge system can make, and anything
|
|
471
|
+
promising more is selling something.
|
|
472
|
+
|
|
473
|
+
**Reconciliation is only as good as your vocabulary.** When you file something
|
|
474
|
+
new, the system makes you search for what it collides with — and that search is
|
|
475
|
+
only as good as the words you thought to look for, which is why naming things
|
|
476
|
+
well is load-bearing here rather than cosmetic.
|
|
477
|
+
|
|
478
|
+
**The counters can drift between sessions.** A number changed by hand in your
|
|
479
|
+
editor stays uncorrected until the next session closes, because the day's gate
|
|
480
|
+
checks that a snapshot is *present*, not that yesterday's was current. A
|
|
481
|
+
late-and-trusted gate beats a punctual one nobody reads.
|
|
482
|
+
|
|
483
|
+
**It is built for one person.** Every rule here — your cap, your approval, your
|
|
484
|
+
day — assumes a single owner. Two people sharing one board is not a supported
|
|
485
|
+
arrangement, and nothing stops you trying it.
|
|
486
|
+
|
|
487
|
+
*The week shown above illustrates the mechanics; it is not a record of a real
|
|
488
|
+
week.*
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Scratch. The dot prefix is load-bearing: okf walks every .md under the bundle
|
|
2
|
+
# root and skips only dot-paths, so scratch lives behind a dot or it fails
|
|
3
|
+
# validation. The directory ships; its contents never do.
|
|
4
|
+
.tmp/*
|
|
5
|
+
!.tmp/.gitkeep
|
|
6
|
+
|
|
7
|
+
# What `okf pro setup` writes when a file it wanted was already yours. They
|
|
8
|
+
# are yours to merge and then delete — and they are invisible to `okf validate`
|
|
9
|
+
# and `okf lint` inside .okf/, because they are not `.md`, so without this line
|
|
10
|
+
# they get committed and nothing ever says so.
|
|
11
|
+
*.okf-pro-new
|
|
12
|
+
|
|
13
|
+
# macOS finder droppings. Not knowledge, not code, and they appear inside .okf/
|
|
14
|
+
# the moment anyone opens the bundle in Finder. Ignored here rather than in a
|
|
15
|
+
# personal global config, because this tree gets cloned by other people and
|
|
16
|
+
# their git does not carry yours.
|
|
17
|
+
.DS_Store
|