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.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.okf/contract/containment-directions.md +107 -0
  3. data/.okf/contract/exit-codes.md +42 -0
  4. data/.okf/contract/gates-only-at-the-hook-door.md +39 -0
  5. data/.okf/contract/index.md +10 -0
  6. data/.okf/contract/silent-skips.md +78 -0
  7. data/.okf/contract/telemetry-does-not-lie.md +218 -0
  8. data/.okf/contract/the-contract.md +43 -0
  9. data/.okf/design/a-comment-is-not-an-implementation.md +85 -0
  10. data/.okf/design/a-rule-you-can-walk-past.md +68 -0
  11. data/.okf/design/derivation-that-writes.md +161 -0
  12. data/.okf/design/failure-modes.md +43 -0
  13. data/.okf/design/index.md +18 -0
  14. data/.okf/design/lineage.md +95 -0
  15. data/.okf/design/structure-laws.md +46 -0
  16. data/.okf/design/the-residue.md +44 -0
  17. data/.okf/design/three-laws.md +71 -0
  18. data/.okf/design/three-pillars.md +48 -0
  19. data/.okf/index.md +31 -0
  20. data/.okf/log.md +74 -0
  21. data/.okf/scaffold/collisions-and-refusals.md +76 -0
  22. data/.okf/scaffold/index.md +8 -0
  23. data/.okf/scaffold/no-date-ships.md +41 -0
  24. data/.okf/scaffold/ownership-not-subject.md +63 -0
  25. data/.okf/scaffold/the-adopters-manual.md +114 -0
  26. data/.okf/seam/bundler-scoping.md +45 -0
  27. data/.okf/seam/identity-not-existence.md +67 -0
  28. data/.okf/seam/index.md +8 -0
  29. data/.okf/seam/the-wrapper.md +42 -0
  30. data/.okf/seam/three-fail-opens.md +44 -0
  31. data/.okf/testing/drills-over-units.md +41 -0
  32. data/.okf/testing/fixture-is-a-client.md +35 -0
  33. data/.okf/testing/index.md +4 -0
  34. data/.okf/trust/index.md +7 -0
  35. data/.okf/trust/read-owed-rule.md +45 -0
  36. data/.okf/trust/scalar-verified.md +48 -0
  37. data/CHANGELOG.md +187 -0
  38. data/LICENSE.txt +201 -0
  39. data/NOTICE +10 -0
  40. data/README.md +383 -0
  41. data/lib/okf/plugin.rb +148 -0
  42. data/lib/okf/pro/attestation.rb +62 -0
  43. data/lib/okf/pro/audit.rb +161 -0
  44. data/lib/okf/pro/board/edit.rb +201 -0
  45. data/lib/okf/pro/board.rb +291 -0
  46. data/lib/okf/pro/budget.rb +144 -0
  47. data/lib/okf/pro/bundle_root.rb +241 -0
  48. data/lib/okf/pro/cli.rb +914 -0
  49. data/lib/okf/pro/closing.rb +206 -0
  50. data/lib/okf/pro/conformance.rb +127 -0
  51. data/lib/okf/pro/conserve.rb +94 -0
  52. data/lib/okf/pro/event.rb +95 -0
  53. data/lib/okf/pro/friction.rb +262 -0
  54. data/lib/okf/pro/guards.rb +92 -0
  55. data/lib/okf/pro/log/edit.rb +68 -0
  56. data/lib/okf/pro/log.rb +162 -0
  57. data/lib/okf/pro/pairing.rb +271 -0
  58. data/lib/okf/pro/reconcile.rb +76 -0
  59. data/lib/okf/pro/records.rb +90 -0
  60. data/lib/okf/pro/scaffold.rb +258 -0
  61. data/lib/okf/pro/shell_guard.rb +164 -0
  62. data/lib/okf/pro/snapshot.rb +156 -0
  63. data/lib/okf/pro/state.rb +174 -0
  64. data/lib/okf/pro/target.rb +91 -0
  65. data/lib/okf/pro/template/gem/.claude/hooks/run +119 -0
  66. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/SKILL.md +233 -0
  67. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/attribution.md +46 -0
  68. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/board.md +55 -0
  69. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/closing.md +21 -0
  70. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/frontmatter.md +73 -0
  71. data/lib/okf/pro/template/gem/.claude/skills/okf-pro/guides/okf-rules.md +25 -0
  72. data/lib/okf/pro/template/gem/.githooks/pre-commit +68 -0
  73. data/lib/okf/pro/template/gem/.github/workflows/okf-pro.yml +69 -0
  74. data/lib/okf/pro/template/seed/.claude/settings.json +24 -0
  75. data/lib/okf/pro/template/seed/.okf/areas/corpus.md +73 -0
  76. data/lib/okf/pro/template/seed/.okf/areas/index.md +6 -0
  77. data/lib/okf/pro/template/seed/.okf/board.md +21 -0
  78. data/lib/okf/pro/template/seed/.okf/glossary/index.md +13 -0
  79. data/lib/okf/pro/template/seed/.okf/index.md +30 -0
  80. data/lib/okf/pro/template/seed/.okf/journal/index.md +11 -0
  81. data/lib/okf/pro/template/seed/.okf/learnings/index.md +13 -0
  82. data/lib/okf/pro/template/seed/.okf/log.md +10 -0
  83. data/lib/okf/pro/template/seed/.okf/projects/index.md +23 -0
  84. data/lib/okf/pro/template/seed/.okf/reference/index.md +16 -0
  85. data/lib/okf/pro/template/seed/.okf/roadmap.md +33 -0
  86. data/lib/okf/pro/template/seed/.tmp/.gitkeep +0 -0
  87. data/lib/okf/pro/template/seed/CLAUDE.md +61 -0
  88. data/lib/okf/pro/template/seed/README.md +488 -0
  89. data/lib/okf/pro/template/seed/gitignore +17 -0
  90. data/lib/okf/pro/version.rb +7 -0
  91. data/lib/okf/pro/writes.rb +560 -0
  92. data/lib/okf/pro.rb +198 -0
  93. 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
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OKF
4
+ module Pro
5
+ VERSION = "1.0.0"
6
+ end
7
+ end