jidoseal 0.1.1__tar.gz

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.
@@ -0,0 +1,290 @@
1
+ Metadata-Version: 2.4
2
+ Name: jidoseal
3
+ Version: 0.1.1
4
+ Summary: JidoSeal local scan runner — certify your knowledge base on your own machine. 100% local, zero content egress.
5
+ Author-email: JidoSeal <support@jidoseal.com>
6
+ License: Proprietary
7
+ Keywords: okf,knowledge-base,governance,markdown,frontmatter,local-first
8
+ Classifier: Environment :: Console
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Documentation
13
+ Requires-Python: >=3.9
14
+ Description-Content-Type: text/markdown
15
+ Requires-Dist: PyYAML>=6.0
16
+
17
+ # JidoSeal CLI
18
+
19
+ Run JidoSeal's Self-Check over a folder of markdown, from your terminal, on your own machine.
20
+
21
+ ```
22
+ Exactly what leaves your machine: nothing — 100% local, zero content egress.
23
+ Your files, their names, and their contents never leave your device.
24
+ ```
25
+
26
+ That is not a slogan bolted onto the docs — it is the first thing the command prints, on every
27
+ run, before it reads a single file. The rest of this page explains exactly what the tool does,
28
+ and just as importantly what it does not do.
29
+
30
+ ---
31
+
32
+ ## Install
33
+
34
+ **One-liner:**
35
+
36
+ ```bash
37
+ pipx install jidoseal && jidoseal --root .
38
+ ```
39
+
40
+ `pipx` is the recommended install because it puts JidoSeal in its own isolated environment, so
41
+ it can neither shadow nor be shadowed by anything else on your system. If you would rather use
42
+ pip, a virtual environment does the same job:
43
+
44
+ ```bash
45
+ python3 -m venv ~/.venvs/jidoseal
46
+ ~/.venvs/jidoseal/bin/pip install jidoseal
47
+ ~/.venvs/jidoseal/bin/jidoseal --root /path/to/your/notes
48
+ ```
49
+
50
+ **From a local wheel:**
51
+
52
+ ```bash
53
+ python3 -m pip wheel . --no-deps -w dist-cli # from a checkout of this repo
54
+ pipx install ./dist-cli/jidoseal-0.1.1-py3-none-any.whl
55
+ ```
56
+
57
+ **From a checkout, with no install at all:**
58
+
59
+ ```bash
60
+ python3 engine/local_runner.py --root /path/to/your/notes
61
+ ```
62
+
63
+ Requires Python 3.9 or newer. Developed and exercised on 3.14.
64
+
65
+ ---
66
+
67
+ ## Usage
68
+
69
+ ```bash
70
+ jidoseal --root /path/to/your/notes
71
+ ```
72
+
73
+ ```
74
+ Exactly what leaves your machine: nothing — 100% local, zero content egress.
75
+ Your files, their names, and their contents never leave your device.
76
+
77
+ scanned 747 files in 1.42s — $0 · 100% local · nothing left this machine
78
+ Bronze coverage: 98.1%
79
+ Silver coverage: 84.3%
80
+ Gold coverage: 61.0%
81
+ manifest: /path/to/your/notes/.jidoseal/manifest.json
82
+ progress: /path/to/your/notes/.jidoseal/progress.ndjson (run scan-20260918-143012-a1b2c3)
83
+ ```
84
+
85
+ | Flag | What it does |
86
+ | --- | --- |
87
+ | `--root <dir>` | **Required.** The folder to scan. Every `*.md` beneath it, recursively. |
88
+ | `--include-machine` | Ignore the machine/transient excludes your `.jidoseal/config.yaml` declares, and scan every `*.md` under `--root`. With no config file there is nothing to ignore, so the flag changes nothing. |
89
+ | `--version` | Print the version and exit. |
90
+ | `--help` | Print usage and exit. |
91
+
92
+ `python3 -m jidoseal --root <dir>` is identical to `jidoseal --root <dir>` — same entry point,
93
+ same output, same banner.
94
+
95
+ ### A caution about `--include-machine`
96
+
97
+ **The certified path does not use it.** When you buy a certificate, JidoSeal scans with your
98
+ configured machine excludes applied — that is the corpus definition a certificate is issued
99
+ against. `--include-machine` is a diagnostic: useful for seeing your whole tree, but the coverage
100
+ percentages it prints are **not** the percentages your certificate would be based on. For a
101
+ number that matches, run without the flag.
102
+
103
+ ### What it writes
104
+
105
+ Two files, both inside `<root>/.jidoseal/`, both on your machine:
106
+
107
+ - **`manifest.json`** — per file: a content hash, its current tier, which governance fields are
108
+ present, and exactly what is missing for Silver and Gold. This is the same artifact, in the
109
+ same format, that the certified engine path produces.
110
+ - **`progress.ndjson`** — an append-only progress log, one JSON object per line, flushed to disk
111
+ as each file is scanned. Append-only on purpose: a new run adds to it rather than erasing the
112
+ history of previous ones.
113
+
114
+ Nothing else is written, and nothing in your corpus is modified. This command **reads only**.
115
+
116
+ ---
117
+
118
+ ## Telling JidoSeal about your corpus — `.jidoseal/config.yaml`
119
+
120
+ **Out of the box, nothing is excluded and nothing is assumed.** Every `*.md` file under
121
+ `--root` is scanned, apart from OKF v0.2's two reserved filenames (`index.md` and `log.md`),
122
+ which the standard itself puts outside a concept corpus. No folder name is special, no owner is
123
+ invented, and no document type is inferred from a directory JidoSeal has never seen.
124
+
125
+ That is deliberate. A scanner that silently drops files because their path matched somebody
126
+ else's folder convention is reporting coverage over a corpus you did not choose — and the
127
+ number it shows you would be wrong in a way you cannot see.
128
+
129
+ If your corpus *does* have conventions, tell JidoSeal about them in an optional
130
+ `<root>/.jidoseal/config.yaml`. Every key is optional; leaving the file out is exactly the
131
+ default above. The config file itself is never part of the corpus (JidoSeal only ever reads
132
+ `*.md`), and it is read by the scan engine itself — so the CLI, the local UI and the
133
+ certificate-issuing path all see the same corpus definition.
134
+
135
+ ```yaml
136
+ # Paths excluded as machine-generated or synced mirrors. Python regexes, matched against the
137
+ # path relative to --root. `--include-machine` ignores this list for one run.
138
+ machine_extra_excludes:
139
+ - "^Scratch/" # transient working notes
140
+ - "/_drive/" # a sync mirror — remediating it just fights the sync
141
+ - "(?i)-autogen-" # generated files, by filename
142
+
143
+ # Who owns a file when its frontmatter does not say. First match wins.
144
+ owner_map:
145
+ - pattern: "^Accounts/"
146
+ owner: "dept:finance"
147
+
148
+ # The owner for everything no rule above claims. With no `default_owner`, JidoSeal will not
149
+ # invent one — and an apply refuses rather than writing an audit line it cannot attribute.
150
+ default_owner: "human:jane-doe"
151
+
152
+ # Optional: the identity recorded on each audit-log line. Defaults to `default_owner`.
153
+ authority: "self:jane-doe"
154
+
155
+ # Extra `type` inference for your own folders, applied AFTER JidoSeal's built-in conventions
156
+ # (so a more specific built-in rule always still wins). Suggested at MEDIUM confidence, and
157
+ # never written without your explicit Apply.
158
+ propose_type_rules:
159
+ - pattern: "^Accounts/"
160
+ type: "finance-reference"
161
+ ```
162
+
163
+ A malformed config is an error, not a shrug: an unknown key or a bad regex stops the run with
164
+ a message naming the file, rather than quietly scanning a different corpus than you described.
165
+
166
+ ### Your config is recorded with the scan — and on the certificate
167
+
168
+ Every scan prints one more line:
169
+
170
+ ```
171
+ config: sha256:9f2c…c41d
172
+ ```
173
+
174
+ That is a SHA-256 of your `.jidoseal/config.yaml`, exactly as `sha256sum` computes it — check it
175
+ yourself:
176
+
177
+ ```bash
178
+ sha256sum .jidoseal/config.yaml
179
+ ```
180
+
181
+ With no config file, the line reads `config: absent:no-config-file`: running on the shipped
182
+ neutral defaults is recorded as such, rather than left blank.
183
+
184
+ Why it exists: this file decides which documents are in your corpus at all, so it is part of what
185
+ a tier means. A certificate is bound to a Merkle root of your files, which says WHICH files were
186
+ certified but not which definition selected them — so the same digest travels onto the
187
+ certificate, inside its signature. It records your corpus definition; it does not restrict it.
188
+ Nothing here leaves your machine on the free path, and the digest is one-way: it carries no
189
+ folder name, no path and no rule text.
190
+
191
+ ---
192
+
193
+ ## What the tiers mean
194
+
195
+ Tiers are objective, deterministic and pass/fail. There is no judgement call and no model
196
+ involved anywhere in this path — a file either has a populated field or it does not, and the
197
+ same corpus scanned twice gives the same answer.
198
+
199
+ | Tier | Requires |
200
+ | --- | --- |
201
+ | **Bronze** | `type` |
202
+ | **Silver** | Bronze, plus `title`, `description`, `timestamp`, `owner` |
203
+ | **Gold** | Silver, plus `status`, `review_policy`, `reviewed_at`, `next_review_at` |
204
+
205
+ "Populated" means carrying real content. A bare `title:` with nothing after it earns nothing.
206
+
207
+ A file whose frontmatter fence exists but whose YAML will not parse is reported with
208
+ `frontmatter_ok: false`. Those gaps cannot be closed by adding fields — the block has to be
209
+ fixed by hand first.
210
+
211
+ ---
212
+
213
+ ## Honest scope — what JidoSeal does and does not certify
214
+
215
+ **It does:**
216
+
217
+ - Certify **presence and integrity of governance fields** — that the metadata your documents are
218
+ supposed to carry is actually there and actually populated, measured the same way every time.
219
+ - Provide **hash provenance** — every file's content is hashed, so the manifest is bound to the
220
+ exact bytes on disk at scan time, and a later change is detectable.
221
+
222
+ **It does not:**
223
+
224
+ - **Attribute which change broke a spec.** JidoSeal will tell you that a document's governance
225
+ state is what it is now, and that its content hash differs from before. It does not diff your
226
+ documents or identify which edit — by you, by an agent, by anything else — was responsible.
227
+ - **Judge whether your content is any good.** Tiers measure governance-field presence, not
228
+ quality, accuracy or usefulness of what you wrote.
229
+ - **Read your prose.** The scan reads frontmatter to determine fields, and hashes file bytes. No
230
+ content is sent anywhere, because nothing is sent anywhere at all.
231
+
232
+ ---
233
+
234
+ ## Exactly what leaves your machine
235
+
236
+ Nothing.
237
+
238
+ ```
239
+ Exactly what leaves your machine: nothing — 100% local, zero content egress.
240
+ Your files, their names, and their contents never leave your device.
241
+ ```
242
+
243
+ This is enforced structurally, not by policy:
244
+
245
+ - **The installed package does not contain networking code.** The wheel ships seven Python
246
+ modules — the complete set the scan needs and nothing more. The engine's network-capable
247
+ modules are not merely unused by this command; they are not in the distribution. You can
248
+ confirm that yourself with `unzip -l` on the wheel, or by listing the installed files.
249
+ - **Its one dependency is PyYAML**, a YAML parser, used to read frontmatter. It has no network
250
+ capability. See "Dependencies" below.
251
+ - **Static analysis enforces it in the test suite** — the modules on this path are AST-inspected
252
+ for any import of `socket`, `ssl`, `http`, `urllib`, `requests`, `httpx`, `aiohttp` and
253
+ friends, and the check fails the build if one appears.
254
+ - **A runtime guard proves it on a real scan** — a full scan is executed inside a harness that
255
+ raises on any outbound connection or DNS lookup to a non-loopback address. It does not raise.
256
+
257
+ If you would rather trust your own eyes than our test suite: run it with a network monitor on.
258
+ That is the point of a local tool.
259
+
260
+ Buying a certificate is a separate step that happens on jidoseal.com, not through this command.
261
+ This CLI has no purchase path, no account, no telemetry, and no way to send anything anywhere.
262
+
263
+ ---
264
+
265
+ ## Dependencies
266
+
267
+ One: **PyYAML**.
268
+
269
+ We would rather it were zero, and it is worth being precise about why it is not. JidoSeal's
270
+ frontmatter parser has always used PyYAML — it is the engine's single hard requirement, and the
271
+ certified engine path uses the very same parser. Replacing it would mean writing a second YAML
272
+ implementation, and a second implementation is a second set of edge cases: the day it disagrees
273
+ with the first about a quoted date or a multi-line string, the CLI and your certificate disagree
274
+ about your corpus. A pure parser with no network capability is a much better trade than a parity
275
+ risk in the thing being certified.
276
+
277
+ Everything else on the path is the Python standard library.
278
+
279
+ ---
280
+
281
+ ## Same engine as the certificate
282
+
283
+ This is the point of the CLI, so it is worth stating plainly: `jidoseal --root <dir>` runs the
284
+ **same code** the certified issuance path runs. Both call `okf_manifest.build_manifest()`; both
285
+ tier files through the same `tier_of()`; both hash content the same way. The CLI is not a
286
+ preview, a re-implementation or an approximation of the certified scoring — it is that scoring,
287
+ invoked locally.
288
+
289
+ The practical consequence: the tiers you see in your terminal are the tiers a certificate would
290
+ attest to, for the same corpus, scanned the same way (that is, without `--include-machine`).
@@ -0,0 +1,274 @@
1
+ # JidoSeal CLI
2
+
3
+ Run JidoSeal's Self-Check over a folder of markdown, from your terminal, on your own machine.
4
+
5
+ ```
6
+ Exactly what leaves your machine: nothing — 100% local, zero content egress.
7
+ Your files, their names, and their contents never leave your device.
8
+ ```
9
+
10
+ That is not a slogan bolted onto the docs — it is the first thing the command prints, on every
11
+ run, before it reads a single file. The rest of this page explains exactly what the tool does,
12
+ and just as importantly what it does not do.
13
+
14
+ ---
15
+
16
+ ## Install
17
+
18
+ **One-liner:**
19
+
20
+ ```bash
21
+ pipx install jidoseal && jidoseal --root .
22
+ ```
23
+
24
+ `pipx` is the recommended install because it puts JidoSeal in its own isolated environment, so
25
+ it can neither shadow nor be shadowed by anything else on your system. If you would rather use
26
+ pip, a virtual environment does the same job:
27
+
28
+ ```bash
29
+ python3 -m venv ~/.venvs/jidoseal
30
+ ~/.venvs/jidoseal/bin/pip install jidoseal
31
+ ~/.venvs/jidoseal/bin/jidoseal --root /path/to/your/notes
32
+ ```
33
+
34
+ **From a local wheel:**
35
+
36
+ ```bash
37
+ python3 -m pip wheel . --no-deps -w dist-cli # from a checkout of this repo
38
+ pipx install ./dist-cli/jidoseal-0.1.1-py3-none-any.whl
39
+ ```
40
+
41
+ **From a checkout, with no install at all:**
42
+
43
+ ```bash
44
+ python3 engine/local_runner.py --root /path/to/your/notes
45
+ ```
46
+
47
+ Requires Python 3.9 or newer. Developed and exercised on 3.14.
48
+
49
+ ---
50
+
51
+ ## Usage
52
+
53
+ ```bash
54
+ jidoseal --root /path/to/your/notes
55
+ ```
56
+
57
+ ```
58
+ Exactly what leaves your machine: nothing — 100% local, zero content egress.
59
+ Your files, their names, and their contents never leave your device.
60
+
61
+ scanned 747 files in 1.42s — $0 · 100% local · nothing left this machine
62
+ Bronze coverage: 98.1%
63
+ Silver coverage: 84.3%
64
+ Gold coverage: 61.0%
65
+ manifest: /path/to/your/notes/.jidoseal/manifest.json
66
+ progress: /path/to/your/notes/.jidoseal/progress.ndjson (run scan-20260918-143012-a1b2c3)
67
+ ```
68
+
69
+ | Flag | What it does |
70
+ | --- | --- |
71
+ | `--root <dir>` | **Required.** The folder to scan. Every `*.md` beneath it, recursively. |
72
+ | `--include-machine` | Ignore the machine/transient excludes your `.jidoseal/config.yaml` declares, and scan every `*.md` under `--root`. With no config file there is nothing to ignore, so the flag changes nothing. |
73
+ | `--version` | Print the version and exit. |
74
+ | `--help` | Print usage and exit. |
75
+
76
+ `python3 -m jidoseal --root <dir>` is identical to `jidoseal --root <dir>` — same entry point,
77
+ same output, same banner.
78
+
79
+ ### A caution about `--include-machine`
80
+
81
+ **The certified path does not use it.** When you buy a certificate, JidoSeal scans with your
82
+ configured machine excludes applied — that is the corpus definition a certificate is issued
83
+ against. `--include-machine` is a diagnostic: useful for seeing your whole tree, but the coverage
84
+ percentages it prints are **not** the percentages your certificate would be based on. For a
85
+ number that matches, run without the flag.
86
+
87
+ ### What it writes
88
+
89
+ Two files, both inside `<root>/.jidoseal/`, both on your machine:
90
+
91
+ - **`manifest.json`** — per file: a content hash, its current tier, which governance fields are
92
+ present, and exactly what is missing for Silver and Gold. This is the same artifact, in the
93
+ same format, that the certified engine path produces.
94
+ - **`progress.ndjson`** — an append-only progress log, one JSON object per line, flushed to disk
95
+ as each file is scanned. Append-only on purpose: a new run adds to it rather than erasing the
96
+ history of previous ones.
97
+
98
+ Nothing else is written, and nothing in your corpus is modified. This command **reads only**.
99
+
100
+ ---
101
+
102
+ ## Telling JidoSeal about your corpus — `.jidoseal/config.yaml`
103
+
104
+ **Out of the box, nothing is excluded and nothing is assumed.** Every `*.md` file under
105
+ `--root` is scanned, apart from OKF v0.2's two reserved filenames (`index.md` and `log.md`),
106
+ which the standard itself puts outside a concept corpus. No folder name is special, no owner is
107
+ invented, and no document type is inferred from a directory JidoSeal has never seen.
108
+
109
+ That is deliberate. A scanner that silently drops files because their path matched somebody
110
+ else's folder convention is reporting coverage over a corpus you did not choose — and the
111
+ number it shows you would be wrong in a way you cannot see.
112
+
113
+ If your corpus *does* have conventions, tell JidoSeal about them in an optional
114
+ `<root>/.jidoseal/config.yaml`. Every key is optional; leaving the file out is exactly the
115
+ default above. The config file itself is never part of the corpus (JidoSeal only ever reads
116
+ `*.md`), and it is read by the scan engine itself — so the CLI, the local UI and the
117
+ certificate-issuing path all see the same corpus definition.
118
+
119
+ ```yaml
120
+ # Paths excluded as machine-generated or synced mirrors. Python regexes, matched against the
121
+ # path relative to --root. `--include-machine` ignores this list for one run.
122
+ machine_extra_excludes:
123
+ - "^Scratch/" # transient working notes
124
+ - "/_drive/" # a sync mirror — remediating it just fights the sync
125
+ - "(?i)-autogen-" # generated files, by filename
126
+
127
+ # Who owns a file when its frontmatter does not say. First match wins.
128
+ owner_map:
129
+ - pattern: "^Accounts/"
130
+ owner: "dept:finance"
131
+
132
+ # The owner for everything no rule above claims. With no `default_owner`, JidoSeal will not
133
+ # invent one — and an apply refuses rather than writing an audit line it cannot attribute.
134
+ default_owner: "human:jane-doe"
135
+
136
+ # Optional: the identity recorded on each audit-log line. Defaults to `default_owner`.
137
+ authority: "self:jane-doe"
138
+
139
+ # Extra `type` inference for your own folders, applied AFTER JidoSeal's built-in conventions
140
+ # (so a more specific built-in rule always still wins). Suggested at MEDIUM confidence, and
141
+ # never written without your explicit Apply.
142
+ propose_type_rules:
143
+ - pattern: "^Accounts/"
144
+ type: "finance-reference"
145
+ ```
146
+
147
+ A malformed config is an error, not a shrug: an unknown key or a bad regex stops the run with
148
+ a message naming the file, rather than quietly scanning a different corpus than you described.
149
+
150
+ ### Your config is recorded with the scan — and on the certificate
151
+
152
+ Every scan prints one more line:
153
+
154
+ ```
155
+ config: sha256:9f2c…c41d
156
+ ```
157
+
158
+ That is a SHA-256 of your `.jidoseal/config.yaml`, exactly as `sha256sum` computes it — check it
159
+ yourself:
160
+
161
+ ```bash
162
+ sha256sum .jidoseal/config.yaml
163
+ ```
164
+
165
+ With no config file, the line reads `config: absent:no-config-file`: running on the shipped
166
+ neutral defaults is recorded as such, rather than left blank.
167
+
168
+ Why it exists: this file decides which documents are in your corpus at all, so it is part of what
169
+ a tier means. A certificate is bound to a Merkle root of your files, which says WHICH files were
170
+ certified but not which definition selected them — so the same digest travels onto the
171
+ certificate, inside its signature. It records your corpus definition; it does not restrict it.
172
+ Nothing here leaves your machine on the free path, and the digest is one-way: it carries no
173
+ folder name, no path and no rule text.
174
+
175
+ ---
176
+
177
+ ## What the tiers mean
178
+
179
+ Tiers are objective, deterministic and pass/fail. There is no judgement call and no model
180
+ involved anywhere in this path — a file either has a populated field or it does not, and the
181
+ same corpus scanned twice gives the same answer.
182
+
183
+ | Tier | Requires |
184
+ | --- | --- |
185
+ | **Bronze** | `type` |
186
+ | **Silver** | Bronze, plus `title`, `description`, `timestamp`, `owner` |
187
+ | **Gold** | Silver, plus `status`, `review_policy`, `reviewed_at`, `next_review_at` |
188
+
189
+ "Populated" means carrying real content. A bare `title:` with nothing after it earns nothing.
190
+
191
+ A file whose frontmatter fence exists but whose YAML will not parse is reported with
192
+ `frontmatter_ok: false`. Those gaps cannot be closed by adding fields — the block has to be
193
+ fixed by hand first.
194
+
195
+ ---
196
+
197
+ ## Honest scope — what JidoSeal does and does not certify
198
+
199
+ **It does:**
200
+
201
+ - Certify **presence and integrity of governance fields** — that the metadata your documents are
202
+ supposed to carry is actually there and actually populated, measured the same way every time.
203
+ - Provide **hash provenance** — every file's content is hashed, so the manifest is bound to the
204
+ exact bytes on disk at scan time, and a later change is detectable.
205
+
206
+ **It does not:**
207
+
208
+ - **Attribute which change broke a spec.** JidoSeal will tell you that a document's governance
209
+ state is what it is now, and that its content hash differs from before. It does not diff your
210
+ documents or identify which edit — by you, by an agent, by anything else — was responsible.
211
+ - **Judge whether your content is any good.** Tiers measure governance-field presence, not
212
+ quality, accuracy or usefulness of what you wrote.
213
+ - **Read your prose.** The scan reads frontmatter to determine fields, and hashes file bytes. No
214
+ content is sent anywhere, because nothing is sent anywhere at all.
215
+
216
+ ---
217
+
218
+ ## Exactly what leaves your machine
219
+
220
+ Nothing.
221
+
222
+ ```
223
+ Exactly what leaves your machine: nothing — 100% local, zero content egress.
224
+ Your files, their names, and their contents never leave your device.
225
+ ```
226
+
227
+ This is enforced structurally, not by policy:
228
+
229
+ - **The installed package does not contain networking code.** The wheel ships seven Python
230
+ modules — the complete set the scan needs and nothing more. The engine's network-capable
231
+ modules are not merely unused by this command; they are not in the distribution. You can
232
+ confirm that yourself with `unzip -l` on the wheel, or by listing the installed files.
233
+ - **Its one dependency is PyYAML**, a YAML parser, used to read frontmatter. It has no network
234
+ capability. See "Dependencies" below.
235
+ - **Static analysis enforces it in the test suite** — the modules on this path are AST-inspected
236
+ for any import of `socket`, `ssl`, `http`, `urllib`, `requests`, `httpx`, `aiohttp` and
237
+ friends, and the check fails the build if one appears.
238
+ - **A runtime guard proves it on a real scan** — a full scan is executed inside a harness that
239
+ raises on any outbound connection or DNS lookup to a non-loopback address. It does not raise.
240
+
241
+ If you would rather trust your own eyes than our test suite: run it with a network monitor on.
242
+ That is the point of a local tool.
243
+
244
+ Buying a certificate is a separate step that happens on jidoseal.com, not through this command.
245
+ This CLI has no purchase path, no account, no telemetry, and no way to send anything anywhere.
246
+
247
+ ---
248
+
249
+ ## Dependencies
250
+
251
+ One: **PyYAML**.
252
+
253
+ We would rather it were zero, and it is worth being precise about why it is not. JidoSeal's
254
+ frontmatter parser has always used PyYAML — it is the engine's single hard requirement, and the
255
+ certified engine path uses the very same parser. Replacing it would mean writing a second YAML
256
+ implementation, and a second implementation is a second set of edge cases: the day it disagrees
257
+ with the first about a quoted date or a multi-line string, the CLI and your certificate disagree
258
+ about your corpus. A pure parser with no network capability is a much better trade than a parity
259
+ risk in the thing being certified.
260
+
261
+ Everything else on the path is the Python standard library.
262
+
263
+ ---
264
+
265
+ ## Same engine as the certificate
266
+
267
+ This is the point of the CLI, so it is worth stating plainly: `jidoseal --root <dir>` runs the
268
+ **same code** the certified issuance path runs. Both call `okf_manifest.build_manifest()`; both
269
+ tier files through the same `tier_of()`; both hash content the same way. The CLI is not a
270
+ preview, a re-implementation or an approximation of the certified scoring — it is that scoring,
271
+ invoked locally.
272
+
273
+ The practical consequence: the tiers you see in your terminal are the tiers a certificate would
274
+ attest to, for the same corpus, scanned the same way (that is, without `--include-machine`).