@panaversity/ksor 0.0.44 → 0.0.46

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,113 @@
1
1
  # @panaversity/ksor
2
2
 
3
+ ## 0.0.46
4
+
5
+ ### Patch Changes
6
+
7
+ - a28fac9: **The Auth0 recipe now names the trap that costs the afternoon it warns about.**
8
+ Walked end to end against a live Auth0 tenant and a deployed door for the first
9
+ time (2026-08-26), and the recipe was right about what to type and silent about
10
+ the two things that actually go wrong.
11
+
12
+ The API **Identifier** must equal `KSOR_MCP_RESOURCE_URL` character for
13
+ character, `/mcp` path included — and **Auth0 does not let you edit it after the
14
+ API is created**, so a wrong one is fixed by making a new API, not by correcting
15
+ the field. Neither fact was written down.
16
+
17
+ Two Auth0 errors now have a table, because both arrive as a failed token request
18
+ and they mean opposite things: `Service not enabled within domain` is no API
19
+ with that Identifier, while `Client "…" is not authorized to access resource
20
+ server` means the Identifier is right and the grant from step 5 is missing.
21
+ Moving from the first to the second is progress.
22
+
23
+ And "Verify it" gains a step 0: ask the PROVIDER for a token before touching the
24
+ door. Half of these failures never reach ksor, and one `curl` at the token
25
+ endpoint separates the halves — which is how this diagnosis was actually made,
26
+ after several rounds of reasoning about dashboard toggles that turned out not to
27
+ be the cause.
28
+
29
+ **And it now says you need more than one Application.** The recipe never
30
+ mentioned the site's own sign-in control, never said its Application is a
31
+ different TYPE from an assistant's, and never said the two cannot be the same
32
+ registration — a public client with no secret and a confidential client that
33
+ sends one are different things, and using one for both returns a bare `401` at
34
+ the token endpoint that names nothing. A table at the top of the recipe now
35
+ gives one row per caller: what type, what token-endpoint auth, what callback,
36
+ and whether it needs the grant from step 5.
37
+
38
+ ## 0.0.45
39
+
40
+ ### Patch Changes
41
+
42
+ - 1875d06: **`pnpm preview` — somewhere for `pnpm build` to land.**
43
+
44
+ The site is a static export, so there is no server to start; that is what makes
45
+ the record hostable anywhere. But it also means the natural thing to try after a
46
+ build — `pnpm start` — answers `ERR_PNPM_NO_SCRIPT_OR_SERVER`, which explains
47
+ none of that. `pnpm preview` serves `system/site/out` on the same bytes a host
48
+ would. It is `node:http` and nothing else: no dependency, no network fetch, works
49
+ offline and behind a firewall, for the same reason the build downloads nothing.
50
+ Run before a build, it says so and exits `3`.
51
+
52
+ **And the Vercel dashboard import now says what actually goes wrong.** Vercel
53
+ auto-detects a root directory by looking for a framework, finds the Next app, and
54
+ fills the field with `system/site`. The build then reads
55
+ `system/site/vercel.json`, which does not exist, and fails with
56
+ `Project framework is set to "services", but no services are declared` — even
57
+ though the import screen just listed both services, because that step reads the
58
+ root file and the build step uses the Root Directory override. The fix is one
59
+ field: set Root Directory to the repository root. `docs/deploying.md` now names
60
+ the error, the cause and the fix, plus the site-only fallback.
61
+
62
+ Found by an adopter, and it will recur on every dashboard import until Vercel's
63
+ detection changes — the layout that triggers it is decision 8 and is not moving.
64
+
65
+ **And the intake interview asks three questions, not seven.** Seven did not
66
+ survive contact: an agent running the skill decided five were too many,
67
+ defaulted them, and reported "answered: all seven" — including the one that
68
+ decides who may approve a document, which it filled from a git handle. A
69
+ process the tool executing it shortcuts is too long.
70
+
71
+ Scope, Boundary and Authority are asked, because none can be defaulted: the
72
+ first two give the abstention gate an edge to be outside of, and the third is
73
+ a governance act, which never gets guessed (decision 21). The other four are
74
+ STATED as defaults in one block — read by both, declines firmly, one `public`
75
+ audience, no sources yet — written only if the owner does not object, and the
76
+ write-back must name which were answered and which were defaulted. Reporting a
77
+ default as an answer is now called out in the skill as the thing not to do.
78
+
79
+ **The scaffold README no longer tells you to uncomment something that ships
80
+ uncommented.** 0.0.42 filled in `instance.md`'s `database:` block; the README
81
+ kept instructing the adopter to uncomment it, and named a refusal
82
+ (`instance.md declares no database: block`) they could no longer reach. The
83
+ emitted `AGENTS.md` had already been corrected and the README had not — two
84
+ documents describing one file, and only one of them updated. Vercel is three
85
+ steps ending in the Root Directory fix, `preview` sits beside `build`, and a
86
+ "When something refuses you" table maps every refusal an adopter meets to what
87
+ to do about it.
88
+
89
+ **The scaffold README is restructured around what the record is FOR.** It now
90
+ opens on the agent interface — an MCP door that answers with citations and
91
+ declines what the record does not cover — rather than on an architecture
92
+ diagram, because a reader classifies the project in the first fifteen seconds
93
+ and "governed markdown plus a site" puts it in the wrong bucket.
94
+
95
+ `ksor calibrate` moves into the main command path, between `refresh` and
96
+ `serve`. It was a parenthetical and a remedy-after-the-fact, which meant the
97
+ README's own three-question test failed at exactly the question it says
98
+ matters. Verified on the five-document starter: calibrate needs an ingested
99
+ corpus but NO running server, produces `vector_floor: 0.609`, and with it
100
+ applied the test passes as written — the paraphrased in-corpus question is
101
+ answered at 0.701 while an adjacent miss abstains at 0.550 and a far-outside
102
+ one at 0.512. The "expect answers, not refusals" note moves from postscript to
103
+ precondition, where it prevents the disappointment instead of explaining it.
104
+
105
+ Also: Neon is named for hosted Postgres rather than leaving it abstract (it is
106
+ already what this project's own docs are measured against, and pgvector is on
107
+ its free tier), the deploy section ends at the Root Directory fix, and a
108
+ "When something refuses you" table maps every refusal an adopter meets to the
109
+ one thing to do about it.
110
+
3
111
  ## 0.0.44
4
112
 
5
113
  ### Patch Changes
package/dist/cli.mjs CHANGED
@@ -11329,6 +11329,7 @@ function transformManifest(source, manager) {
11329
11329
  const SCRIPT_NAMES = [
11330
11330
  "dev",
11331
11331
  "build",
11332
+ "preview",
11332
11333
  "check",
11333
11334
  "serve",
11334
11335
  "provision",
@@ -298,6 +298,25 @@ Nothing else in this recipe makes sense until that lands. You are not building
298
298
  an API; you are describing the one you already have so Auth0 can mint tokens
299
299
  aimed at it.
300
300
 
301
+ **You will need MORE THAN ONE Application, and they are different types.** This
302
+ is the single thing most likely to waste your afternoon, because one application
303
+ configured for one caller returns a plain `401` to the other with nothing
304
+ naming the mismatch (found the hard way, 2026-08-26). One API, one caller per
305
+ row:
306
+
307
+ | The caller | Auth0 Application Type | Token endpoint auth | Callback | Needs step 5 |
308
+ | ------------------------------------------------- | --------------------------- | -------------------------- | ------------------------------------------------------------------- | ------------ |
309
+ | the SITE's sign-in control (`NEXT_PUBLIC_KSOR_*`) | **Single Page Application** | **None** — PKCE, no secret | `https://your-site/auth/callback` | no |
310
+ | an assistant a person logs into (Claude, an IDE) | **Regular Web Application** | client secret | the assistant's own, e.g. `https://claude.ai/api/mcp/auth_callback` | **yes** |
311
+ | a script, worker or backend agent | **Machine to Machine** | client secret | none | **yes** |
312
+
313
+ The site row is a different flow and not really part of this page: it requests
314
+ `openid profile email` and **no audience**, so it never touches your API and
315
+ needs no grant. It is here only so you do not try to serve it and an assistant
316
+ from one application — a public client with no secret and a confidential client
317
+ that sends one cannot be the same registration, and the failure is a `401` at
318
+ the token endpoint that says nothing about why.
319
+
301
320
  ### 1. Describe the door
302
321
 
303
322
  **Applications → APIs → Create API.** The **Identifier** you type becomes the
@@ -309,6 +328,24 @@ Name: my-record
309
328
  Identifier: https://your-host.example.com/mcp
310
329
  ```
311
330
 
331
+ **Type the whole URL, `/mcp` included, and get it right the first time.** The
332
+ Identifier must equal `KSOR_MCP_RESOURCE_URL` character for character — the host
333
+ alone is not enough, because that is not what the door will compare against. And
334
+ **Auth0 does not let you edit an Identifier after the API is created**: a wrong
335
+ one is fixed by creating a NEW API with the right string and granting your
336
+ application access to that one instead.
337
+
338
+ Two Auth0 errors tell you exactly where you are, and they are easy to confuse
339
+ because both arrive as a failed token request (reported by an adopter,
340
+ 2026-08-26):
341
+
342
+ | Auth0 says | Means |
343
+ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
344
+ | `Service not enabled within domain: https://…/mcp` | **no API has that Identifier.** Yours was created with a different string — make a new one |
345
+ | `Client "…" is not authorized to access resource server "https://…/mcp"` | the API is right and the **grant** is missing — step 5 |
346
+
347
+ Moving from the first message to the second is progress, not a new problem.
348
+
312
349
  Creating it also creates a machine-to-machine **test application** named
313
350
  `<API> (Test Application)`. That is your first caller — you do not need to make
314
351
  one.
@@ -447,9 +484,25 @@ Use the commands below when it did NOT work, or when the caller is a script
447
484
  rather than a person. A token from your provider proves the provider works; it
448
485
  does not prove the door does. Both halves matter, and the refusal matters more.
449
486
 
487
+ **0. Ask the provider for a token FIRST, before you touch the door.** Half the
488
+ failures on this page never reach ksor at all, and this one command separates
489
+ the two halves in a second:
490
+
491
+ ```sh
492
+ curl -s -X POST https://YOUR_TENANT.us.auth0.com/oauth/token \
493
+ -H 'content-type: application/json' \
494
+ -d '{"grant_type":"client_credentials","client_id":"…","client_secret":"…",
495
+ "audience":"https://your-host.example.com/mcp"}'
496
+ ```
497
+
498
+ An `error` here is the PROVIDER refusing, and no amount of ksor configuration
499
+ will change it — see the table in step 1 for what each message means. An
500
+ `access_token` here means the provider works, and anything still failing is the
501
+ door or the token's contents, which is what the rest of this section is for.
502
+
450
503
  **1. Decode the token before using it.** This is the single most useful
451
- debugging step on this page, because a valid token audienced at the wrong thing
452
- looks identical to a broken one:
504
+ debugging step once you have one, because a valid token audienced at the wrong
505
+ thing looks identical to a broken one:
453
506
 
454
507
  ```sh
455
508
  echo "$TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null | jq '{iss, aud, exp}'
package/docs/deploying.md CHANGED
@@ -113,6 +113,34 @@ What the image deliberately does NOT contain (see `.dockerignore`):
113
113
 
114
114
  ## Deploying both surfaces to Vercel
115
115
 
116
+ > **Importing from the Vercel dashboard: clear the Root Directory first.**
117
+ > Vercel auto-detects a root directory by looking for a framework, finds the
118
+ > Next app, and fills the field with **`system/site`**. The build then reads
119
+ > `system/site/vercel.json`, which does not exist, and fails with:
120
+ >
121
+ > ```
122
+ > Error: Project framework is set to "services", but no services are declared.
123
+ > ```
124
+ >
125
+ > The services ARE declared — in `vercel.json` at the repository root, which is
126
+ > the only place they can be, because one of them builds the site and the other
127
+ > builds a container from the root `Dockerfile`. The import screen even lists
128
+ > both, because that step reads the root file; the BUILD step uses the Root
129
+ > Directory override instead.
130
+ >
131
+ > **Set Root Directory to the repository root (`./`) and redeploy.** Nothing in
132
+ > the record changes. Found by an adopter on 2026-08-26, and it will happen on
133
+ > every dashboard import until Vercel's detection changes — the layout that
134
+ > triggers it, code under `system/`, is decision 8 and is not moving.
135
+ >
136
+ > Also confirm **Application Preset is `Services`**; with any other preset the
137
+ > `services` key is ignored and `/mcp` never exists. Vercel Services is in Beta.
138
+ >
139
+ > **If it still argues, deploy the site alone** — it needs no preset and no
140
+ > services: build command `pnpm -C system/site build`, output directory
141
+ > `system/site/out`. That is the stricter posture decision 29 describes, and
142
+ > the door can be deployed separately.
143
+
116
144
  The emitted `vercel.json` declares both services and routes between them:
117
145
 
118
146
  ```json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panaversity/ksor",
3
- "version": "0.0.44",
3
+ "version": "0.0.46",
4
4
  "description": "Knowledge System of Record — compile governed markdown into a static site for people and an MCP server for AI agents, with citations and measured abstention.",
5
5
  "keywords": [
6
6
  "abstention",
@@ -12,49 +12,75 @@ prose IS the agent surface's system prompt (`ksor serve` wires it into the MCP
12
12
  server's instructions). Do not draft it from guesses — interview the owner, one
13
13
  question at a time, and write down what they actually say.
14
14
 
15
- ## The first six questions
16
-
17
- Ask these one at a time; follow up until each answer is concrete enough to
18
- act on:
19
-
20
- 1. **Authority** "What should this record be the _final word_ on? Finish
21
- the sentence: when someone here disagrees with this corpus, the corpus
22
- wins about ___."
23
- 2. **Boundary** — "What is explicitly _outside_ it — near-miss topics people
24
- will ask about that this record should refuse rather than guess at?"
25
- 3. **Audience** "Who reads it people, agents, both? In what situations,
26
- making what decisions?"
27
- 4. **Sources** — "Which existing materials are authoritative inputs (name
28
- the actual documents, systems, people), and which are explicitly _not_
29
- trusted?"
30
- 5. **Strictness** — "When the record doesn't cover a question, how firmly
31
- should it decline? ('Not in this corpus' is a correct answer here —
32
- confirm the owner wants that behavior and where they want it softened.)"
33
- 6. **Audiences** "Does every reader of this record see every document? If
34
- not, what are the audiences?" A yes is the common answer and the whole
35
- answer: register none, and every document says `ksor.audience: [public]`.
36
- Anything else means registering each audience in
37
- `.ksor/governance.yaml` under `audiences:`, with a one-line
38
- `description:` of who is in it — `public` is reserved and never
39
- registered. There is no ranking and no default: a document lists the
40
- audiences that may read it, a reader holds a list that always includes
41
- `public`, and the document is visible when the two lists OVERLAP. Tell
42
- the owner what this does and does not do: builds are made per audience,
43
- but anyone who can clone the repository reads everything in it — if
44
- someone must not read a document and can clone, that document belongs in
45
- a different repository.
46
-
47
- ## Then ask the seventh, because a policy cannot be guessed
48
-
49
- 7. **Authority** — "Who may approve a document for publication, and who may
50
- withdraw one?" Names, not roles-in-the-abstract: they become
51
- `approval_authorities` and `takedown_authorities` in
52
- `.ksor/governance.yaml`, and the checker refuses an approval or a
53
- takedown by anyone the policy does not name. The scaffold ships
54
- `human:you` in both a placeholder that must not survive this
55
- conversation. An actor is `human:<handle>`, `process:<name>` or
56
- `<producer>/<version>`; handles are published with the record, so use the
57
- handle the owner would put in a commit, never an email address.
15
+ ## Ask THREE questions, one at a time
16
+
17
+ Seven questions is where this skill used to start, and it did not survive
18
+ contact: an agent running it decided five were too many, defaulted them, and
19
+ reported "answered: all seven" — including the one that decides who may
20
+ approve a document. A process the tool executing it shortcuts is too long.
21
+
22
+ So three are asked, and they are the three that cannot be defaulted:
23
+
24
+ 1. **Scope** "What should this record be the _final word_ on? Finish the
25
+ sentence: when someone here disagrees with this corpus, the corpus wins
26
+ about ___."
27
+ 2. **Boundary** — "What is just _outside_ that the near-miss topics people
28
+ will ask about here that the record should refuse rather than guess at?"
29
+ 3. **Authority** — "Who may approve a document for publication, and who may
30
+ withdraw one?"
31
+
32
+ Scope and Boundary are asked because the abstention gate is meaningless
33
+ without an edge: a record authoritative for everything has no outside, so an
34
+ agent asked something the owner never wrote about reaches for its training
35
+ instead of declining. Authority is asked because a governance act names its
36
+ actor and the tool never guesses one — the scaffold ships `human:you` in
37
+ both authority lists, and a placeholder that survives this conversation is a
38
+ person who was never there.
39
+
40
+ Follow up until each is concrete. "Our engineering docs" is not yet an
41
+ answer; "our leave, expense and conduct policies the current ones, not
42
+ historical versions" is.
43
+
44
+ ## Then STATE the defaults; do not ask them
45
+
46
+ Show these as a block, say they are defaults, and invite a correction. Do not
47
+ walk them one at a time they are near-constant, and asking makes the
48
+ interview feel like a form.
49
+
50
+ | | default |
51
+ | --------- | ------------------------------------------------- |
52
+ | read by | people and agents both |
53
+ | declines | firmly "not in this corpus" is a correct answer |
54
+ | audiences | one, `public` every reader sees every document |
55
+ | sources | none yet — the corpus is still the samples |
56
+
57
+ Each is written only if the owner does not object, and the write-back names
58
+ which were answered and which were defaulted. **Never report a default as an
59
+ answer.** Two answered and four defaulted is an honest sentence; "all seven
60
+ answered" is not, and it is what happened the first time this skill ran.
61
+
62
+ **If the owner says NOT every reader sees every document**, then and only
63
+ then: register each audience in `.ksor/governance.yaml` under `audiences:`
64
+ with a one-line `description:` of who is in it — `public` is reserved and
65
+ never registered. There is no ranking and no default: a document lists the
66
+ audiences that may read it, a reader holds a list that always includes
67
+ `public`, and the document is visible when the two lists OVERLAP. Tell them
68
+ what this does and does not do: builds are made per audience, but anyone who
69
+ can clone the repository reads everything in it — if someone must not read a
70
+ document and can clone, that document belongs in a different repository.
71
+
72
+ ## What the answers become
73
+
74
+ Scope and Boundary become the BODY of `instance.md`, which `ksor serve` wires
75
+ into the MCP server's instructions — so it is read by every agent that
76
+ connects, and vague prose there is vague instructions everywhere.
77
+
78
+ Authority becomes `approval_authorities` and `takedown_authorities` in
79
+ `.ksor/governance.yaml`. Names, not roles-in-the-abstract: the checker refuses
80
+ an approval or a takedown by anyone the policy does not name. An actor is
81
+ `human:<handle>`, `process:<name>` or `<producer>/<version>`; handles are
82
+ published with the record, so use the handle the owner would put in a commit,
83
+ never an email address.
58
84
 
59
85
  ## Then write
60
86
 
@@ -12,49 +12,75 @@ prose IS the agent surface's system prompt (`ksor serve` wires it into the MCP
12
12
  server's instructions). Do not draft it from guesses — interview the owner, one
13
13
  question at a time, and write down what they actually say.
14
14
 
15
- ## The first six questions
16
-
17
- Ask these one at a time; follow up until each answer is concrete enough to
18
- act on:
19
-
20
- 1. **Authority** "What should this record be the _final word_ on? Finish
21
- the sentence: when someone here disagrees with this corpus, the corpus
22
- wins about ___."
23
- 2. **Boundary** — "What is explicitly _outside_ it — near-miss topics people
24
- will ask about that this record should refuse rather than guess at?"
25
- 3. **Audience** "Who reads it people, agents, both? In what situations,
26
- making what decisions?"
27
- 4. **Sources** — "Which existing materials are authoritative inputs (name
28
- the actual documents, systems, people), and which are explicitly _not_
29
- trusted?"
30
- 5. **Strictness** — "When the record doesn't cover a question, how firmly
31
- should it decline? ('Not in this corpus' is a correct answer here —
32
- confirm the owner wants that behavior and where they want it softened.)"
33
- 6. **Audiences** "Does every reader of this record see every document? If
34
- not, what are the audiences?" A yes is the common answer and the whole
35
- answer: register none, and every document says `ksor.audience: [public]`.
36
- Anything else means registering each audience in
37
- `.ksor/governance.yaml` under `audiences:`, with a one-line
38
- `description:` of who is in it — `public` is reserved and never
39
- registered. There is no ranking and no default: a document lists the
40
- audiences that may read it, a reader holds a list that always includes
41
- `public`, and the document is visible when the two lists OVERLAP. Tell
42
- the owner what this does and does not do: builds are made per audience,
43
- but anyone who can clone the repository reads everything in it — if
44
- someone must not read a document and can clone, that document belongs in
45
- a different repository.
46
-
47
- ## Then ask the seventh, because a policy cannot be guessed
48
-
49
- 7. **Authority** — "Who may approve a document for publication, and who may
50
- withdraw one?" Names, not roles-in-the-abstract: they become
51
- `approval_authorities` and `takedown_authorities` in
52
- `.ksor/governance.yaml`, and the checker refuses an approval or a
53
- takedown by anyone the policy does not name. The scaffold ships
54
- `human:you` in both a placeholder that must not survive this
55
- conversation. An actor is `human:<handle>`, `process:<name>` or
56
- `<producer>/<version>`; handles are published with the record, so use the
57
- handle the owner would put in a commit, never an email address.
15
+ ## Ask THREE questions, one at a time
16
+
17
+ Seven questions is where this skill used to start, and it did not survive
18
+ contact: an agent running it decided five were too many, defaulted them, and
19
+ reported "answered: all seven" — including the one that decides who may
20
+ approve a document. A process the tool executing it shortcuts is too long.
21
+
22
+ So three are asked, and they are the three that cannot be defaulted:
23
+
24
+ 1. **Scope** "What should this record be the _final word_ on? Finish the
25
+ sentence: when someone here disagrees with this corpus, the corpus wins
26
+ about ___."
27
+ 2. **Boundary** — "What is just _outside_ that the near-miss topics people
28
+ will ask about here that the record should refuse rather than guess at?"
29
+ 3. **Authority** — "Who may approve a document for publication, and who may
30
+ withdraw one?"
31
+
32
+ Scope and Boundary are asked because the abstention gate is meaningless
33
+ without an edge: a record authoritative for everything has no outside, so an
34
+ agent asked something the owner never wrote about reaches for its training
35
+ instead of declining. Authority is asked because a governance act names its
36
+ actor and the tool never guesses one — the scaffold ships `human:you` in
37
+ both authority lists, and a placeholder that survives this conversation is a
38
+ person who was never there.
39
+
40
+ Follow up until each is concrete. "Our engineering docs" is not yet an
41
+ answer; "our leave, expense and conduct policies the current ones, not
42
+ historical versions" is.
43
+
44
+ ## Then STATE the defaults; do not ask them
45
+
46
+ Show these as a block, say they are defaults, and invite a correction. Do not
47
+ walk them one at a time they are near-constant, and asking makes the
48
+ interview feel like a form.
49
+
50
+ | | default |
51
+ | --------- | ------------------------------------------------- |
52
+ | read by | people and agents both |
53
+ | declines | firmly "not in this corpus" is a correct answer |
54
+ | audiences | one, `public` every reader sees every document |
55
+ | sources | none yet — the corpus is still the samples |
56
+
57
+ Each is written only if the owner does not object, and the write-back names
58
+ which were answered and which were defaulted. **Never report a default as an
59
+ answer.** Two answered and four defaulted is an honest sentence; "all seven
60
+ answered" is not, and it is what happened the first time this skill ran.
61
+
62
+ **If the owner says NOT every reader sees every document**, then and only
63
+ then: register each audience in `.ksor/governance.yaml` under `audiences:`
64
+ with a one-line `description:` of who is in it — `public` is reserved and
65
+ never registered. There is no ranking and no default: a document lists the
66
+ audiences that may read it, a reader holds a list that always includes
67
+ `public`, and the document is visible when the two lists OVERLAP. Tell them
68
+ what this does and does not do: builds are made per audience, but anyone who
69
+ can clone the repository reads everything in it — if someone must not read a
70
+ document and can clone, that document belongs in a different repository.
71
+
72
+ ## What the answers become
73
+
74
+ Scope and Boundary become the BODY of `instance.md`, which `ksor serve` wires
75
+ into the MCP server's instructions — so it is read by every agent that
76
+ connects, and vague prose there is vague instructions everywhere.
77
+
78
+ Authority becomes `approval_authorities` and `takedown_authorities` in
79
+ `.ksor/governance.yaml`. Names, not roles-in-the-abstract: the checker refuses
80
+ an approval or a takedown by anyone the policy does not name. An actor is
81
+ `human:<handle>`, `process:<name>` or `<producer>/<version>`; handles are
82
+ published with the record, so use the handle the owner would put in a commit,
83
+ never an email address.
58
84
 
59
85
  ## Then write
60
86