@reunionstudio/airlock-mcp 0.1.3 → 0.1.5

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.
@@ -74,19 +74,28 @@ deterministic checker for local spec drafts.
74
74
  4. Create `posts` only when the user chooses a feedback loop, asks for humans
75
75
  and agents to provide feedback, or explicitly requests the posts pattern.
76
76
  If the user is unsure, continue process discovery before creating files.
77
- 5. Use `airlock-mcp import-spec <json-file> <name>` when starting from a
77
+ 5. Create `okf-knowledge-bundle` when the user needs governed Markdown
78
+ knowledge, accepted agent context, policies, runbooks, metric definitions,
79
+ investigations, or other business context organized as an OKF-style bundle.
80
+ The spec must declare `core_config.payload_adapter =
81
+ "okf_knowledge_bundle"`. Installed Airlock loads validated bundles with
82
+ `airlock.admin.load_okf_bundle(...)`, can sync parsed metadata with
83
+ `airlock.admin.sync_okf_bundle_metadata(...)`, and exposes authoritative
84
+ accepted context through `AIRLOCK_DATA.ACTIVE.V_OKF_CONCEPT_METADATA`.
85
+ Draft and rejected bundles are not authoritative agent context.
86
+ 6. Use `airlock-mcp import-spec <json-file> <name>` when starting from a
78
87
  spec-library file, an exported `SPEC_CONFIG`, or an existing canonical config.
79
88
  If the source is from `airlock-specs`, treat it as a reusable draft pattern.
80
89
  Check actual API docs, CSV/Excel/JSON samples, schemas, or other artifacts
81
90
  before assuming the source fields match a live third-party system.
82
- 6. Use `airlock-mcp clone <source-workspace> <name>` when creating a related
91
+ 7. Use `airlock-mcp clone <source-workspace> <name>` when creating a related
83
92
  draft from an existing workspace. Treat clone like the old Streamlit UI:
84
93
  preserve the shape but deliberately reset spec identity.
85
- 7. Keep the draft small. Prefer one useful governed output over a large
94
+ 8. Keep the draft small. Prefer one useful governed output over a large
86
95
  speculative system, then keep a plan for later specs.
87
- 8. On later sessions, run `airlock-mcp list-workspaces` when the target draft
96
+ 9. On later sessions, run `airlock-mcp list-workspaces` when the target draft
88
97
  is not obvious.
89
- 9. Run `airlock-mcp summary <workspace>` and
98
+ 10. Run `airlock-mcp summary <workspace>` and
90
99
  `airlock-mcp next <workspace>` before editing so
91
100
  the current shape, sample count, access model, and local check status are
92
101
  visible.
@@ -94,14 +103,14 @@ deterministic checker for local spec drafts.
94
103
  core, file rules, attachments, guest access, column rules, samples, notes,
95
104
  and check status. Do not make the user infer the current spec from file
96
105
  links alone.
97
- 10. Run `airlock-mcp check <workspace>` after changing draft config or sample
106
+ 11. Run `airlock-mcp check <workspace>` after changing draft config or sample
98
107
  records.
99
- 11. Keep `sample.records.json` as the agent-friendly authoring shape. Use
108
+ 12. Keep `sample.records.json` as the agent-friendly authoring shape. Use
100
109
  `airlock-mcp export-csv <workspace>` when the same examples need to be
101
110
  reviewed or loaded through Airlock's CSV path.
102
- 12. Use `airlock-mcp rename`, `archive`, and `restore` when organizing
111
+ 13. Use `airlock-mcp rename`, `archive`, and `restore` when organizing
103
112
  workspaces so spec identity changes remain deliberate.
104
- 13. Use `airlock-mcp render-sql <workspace>` only as a validate-only review
113
+ 14. Use `airlock-mcp render-sql <workspace>` only as a validate-only review
105
114
  artifact. Installed Airlock validation remains authoritative.
106
115
 
107
116
  ## Spec Design Questions
@@ -199,6 +208,44 @@ Start by identifying:
199
208
  user's environment.
200
209
  6. Identity, evidence, timestamps, approval, and separation-of-duties rules.
201
210
 
211
+ Use the current installed Airlock procedure grammar when the app talks to
212
+ Airlock:
213
+
214
+ - `airlock.observe.*` is read-only and is the first-class governance
215
+ observation surface for `app_admin` and `app_observer`.
216
+ - `airlock.admin.*` performs administrative changes and operational mutations.
217
+ - `airlock.agent.*` performs governed user or agent work in the actor's scope.
218
+
219
+ For app-first work, prefer `observe.procedures`, `observe.specs`,
220
+ `observe.spec`, `observe.governance_map`, `observe.explain_access`,
221
+ `observe.health`, `observe.activity`, `observe.admin_activity`,
222
+ `observe.spec_admin_activity`, `observe.billing`, `observe.billing_events`, and
223
+ the relevant context packets before inventing
224
+ custom read paths. Do not tell agents to call retired admin read wrappers such
225
+ as `admin.list_specs`, `admin.describe_role`, `admin.get_spec`, or
226
+ `admin.list_events`; use the matching observe list/detail procedure instead.
227
+ Use `admin.*` only when the app is intentionally changing Airlock setup or
228
+ running an admin operation.
229
+
230
+ Restricted references are one-record interaction contracts for read-only
231
+ reference specs. If `agent.describe_spec`, `observe.spec`,
232
+ `observe.spec_config`, or `observe.reference_context` shows
233
+ `restricted_reference` or `reference_config.restricted_reference`, do not
234
+ enumerate the protected reference, build a populated picker, or use broad
235
+ `agent.select_reference_data` for that object path. Get the lookup value from
236
+ the user's case/work context, then call `agent.get_reference_record` with the
237
+ configured `object_key`, lookup value, purpose, and role lens. The procedure
238
+ returns at most one `RECORD`, applies reference row filters, checks active
239
+ `action_limit` Expectations before returning data, and records the safe
240
+ `REFERENCE_READ` event used for usage budgeting. Branch on stable codes such
241
+ as `OK`, `NOT_FOUND`, `NON_UNIQUE_LOOKUP_KEY`, `PURPOSE_REQUIRED`,
242
+ `USAGE_LIMIT_BLOCKED`, and `REFERENCE_READ_EVENT_FAILED`; expose
243
+ `USAGE_CONTEXT` fields such as `action_limit_used` and `action_time_period`.
244
+ For read-only planning and audit, use `observe.reference_context`,
245
+ `observe.usage_limits`, `observe.usage_limit`, and
246
+ `observe.explain_access(action => 'get_reference_record', object_key => ...)`
247
+ without querying raw reference rows.
248
+
202
249
  Help the app follow the loop:
203
250
 
204
251
  - Observe/read: fetch existing governed data through approved Airlock or
@@ -254,6 +301,8 @@ In co-development mode, keep two tracks visible:
254
301
  Read only the relevant pattern files:
255
302
 
256
303
  - `patterns/starter-posts/` when the user needs a first feedback loop.
304
+ - `patterns/okf-knowledge-bundle/` when the user needs governed Markdown
305
+ business context for people or agents.
257
306
  - `patterns/guest-access/` when isolation or sharing is the hard part.
258
307
  - `patterns/spec-types/` when choosing observation, commitment,
259
308
  reconciliation, or reference/master-data shape.
package/README.md CHANGED
@@ -14,7 +14,7 @@ It covers the full Airlock loop:
14
14
  Spec building and spec-using app guidance are not second things users install.
15
15
  They are bundled inside Airlock MCP.
16
16
 
17
- Airlock MCP gives agents three kinds of Airlock help:
17
+ Airlock MCP gives agents four kinds of Airlock help:
18
18
 
19
19
  1. Spec design: draft, check, revise, import, clone, and prepare specs for
20
20
  installed Airlock validation.
@@ -24,6 +24,31 @@ Airlock MCP gives agents three kinds of Airlock help:
24
24
  3. App and workflow implementation: build dashboards, queues, decision UIs,
25
25
  analyses, and agent workflows that use existing specs through Airlock
26
26
  contracts.
27
+ 4. Governance observation: use installed Airlock's read-only `observe.*`
28
+ procedures to inspect setup, access, activity, billing events, health,
29
+ context packets, and governance maps before deciding what an app or agent
30
+ should do.
31
+
32
+ ## Installed Airlock Contract
33
+
34
+ Current Airlock separates procedure intent:
35
+
36
+ - `airlock.observe.*` is the read-only governance observation surface. It is
37
+ available to `app_admin` and `app_observer` and is the preferred path for
38
+ discovery, health checks, access explanation, governance maps, activity,
39
+ billing event context, and list/detail context packets.
40
+ - `airlock.admin.*` is for admin changes and operational actions such as
41
+ creating specs, changing roles, loading OKF bundles, rerunning setup, or
42
+ deleting purge candidates.
43
+ - `airlock.agent.*` is for governed agent work such as listing my
44
+ specs, validating/loading data, workflow actions, attachments, delegations,
45
+ and references.
46
+
47
+ When building an app or workflow, prefer `observe.*` for read-only setup and
48
+ monitoring questions, `agent.*` for governed submissions in the actor's scope,
49
+ and `admin.*` only for intentional administrative mutation. Do not use retired
50
+ admin read wrappers such as `admin.list_specs`, `admin.describe_role`, or
51
+ `admin.list_events`; use the matching observe procedures instead.
27
52
 
28
53
  ## Install
29
54
 
@@ -98,7 +123,8 @@ The server exposes orientation plus local spec-building tools:
98
123
  - `airlock_init_app_context`: seed an app repo with spec snapshots, sample
99
124
  records, generated helper folders, and an app manifest.
100
125
  - `airlock_list_patterns` and `airlock_show_pattern`: inspect starter patterns.
101
- - `airlock_init_workspace`: create a workspace from `blank` or `posts`.
126
+ - `airlock_init_workspace`: create a workspace from `blank`, `posts`, or
127
+ `okf-knowledge-bundle`.
102
128
  - `airlock_list_workspaces`: inspect active or archived drafts.
103
129
  - `airlock_check_workspace`, `airlock_summary`, and `airlock_next`: validate and re-enter a draft.
104
130
  - `airlock_export_csv`: render `sample.records.json` as Airlock-ready CSV.
@@ -188,3 +214,36 @@ points, patterns, and ideas. Those library specs are not guaranteed to reflect
188
214
  the current shape of any third-party system. Current API docs, real exports,
189
215
  samples, schemas, and user-provided artifacts should override library shapes
190
216
  when they conflict.
217
+
218
+ For app-first work against installed Airlock, start with `observe.procedures`,
219
+ `observe.specs`, `observe.spec`, `observe.governance_map`,
220
+ `observe.explain_access`, `observe.health`, and the relevant context packet
221
+ before designing direct SQL helpers. These payloads are intended to be useful
222
+ to agents as well as humans.
223
+
224
+ Restricted references are one-record interaction contracts. When
225
+ `observe.reference_context`, `observe.spec_config`, or `agent.describe_spec`
226
+ shows `restricted_reference` or `reference_config.restricted_reference`, agents
227
+ must not call broad
228
+ `agent.select_reference_data` for that object path and must not enumerate values
229
+ or build a populated picker from the protected reference. The agent should get
230
+ the lookup value from the user's case/work context, then call
231
+ `agent.get_reference_record` with the configured `object_key`, lookup value,
232
+ purpose, and role lens. The procedure applies configured reference row filters,
233
+ checks active `action_limit` Expectations before returning a record, always
234
+ records the safe `REFERENCE_READ` event used for budgeting, and returns at most
235
+ one `RECORD`. Branch on codes such as `OK`, `NOT_FOUND`,
236
+ `NON_UNIQUE_LOOKUP_KEY`, `PURPOSE_REQUIRED`, `USAGE_LIMIT_BLOCKED`, and
237
+ `REFERENCE_READ_EVENT_FAILED`, and report `USAGE_CONTEXT` fields such as
238
+ `action_limit_used` and `action_time_period`. Auditors and planning agents can
239
+ inspect `observe.usage_limits`, `observe.usage_limit`, and
240
+ `observe.explain_access(action => 'get_reference_record', object_key => ...)`
241
+ without reading raw reference rows.
242
+
243
+ For governed Markdown knowledge, use the `okf-knowledge-bundle` pattern. It
244
+ sets `core_config.payload_adapter` to `okf_knowledge_bundle` so installed
245
+ Airlock can load locally validated bundles through
246
+ `airlock.admin.load_okf_bundle(...)`, sync parsed metadata through
247
+ `airlock.admin.sync_okf_bundle_metadata(...)`, and expose accepted concept
248
+ metadata from `AIRLOCK_DATA.ACTIVE.V_OKF_CONCEPT_METADATA`. Draft and rejected
249
+ bundles are not authoritative agent context.
@@ -24,6 +24,20 @@ that reads and submits through Airlock contracts.
24
24
  The install command is not the spec workspace. It is the connector/setup entry
25
25
  point. The specs repo is still the durable memory.
26
26
 
27
+ For installed Airlock access, teach the current procedure split:
28
+ `airlock.observe.*` is the read-only governance observation surface,
29
+ `airlock.agent.*` is governed agent work, and `airlock.admin.*` is
30
+ administrative mutation. App-first and audit-style workflows should use
31
+ observe payloads for discovery, context, health, access explanation, activity,
32
+ billing events, and governance maps before considering custom SQL helpers.
33
+ When a read-only reference spec declares `restricted_reference` or
34
+ `reference_config.restricted_reference`, agents should avoid broad
35
+ `agent.select_reference_data` reads and use `agent.get_reference_record` for a
36
+ known lookup value and purpose, with `observe.reference_context`,
37
+ `observe.usage_limits`, `observe.usage_limit`, and
38
+ `observe.explain_access(action => 'get_reference_record', object_key => ...)`
39
+ for planning and audit.
40
+
27
41
  The connector package and MCP server live in `reunionstudio/airlock-mcp`.
28
42
  This workbench provides the spec-building implementation inside that one
29
43
  installed Airlock MCP experience.
@@ -118,9 +132,11 @@ The first release should optimize the user journey:
118
132
  forms, screenshots, PDFs, exports, or message examples
119
133
  6. use `airlock-specs` library patterns as starting points when useful, while
120
134
  preferring current artifacts over library shapes when they conflict
121
- 7. map where information comes in and actions go out
122
- 8. create the first workspace only after the user chooses a small first spec
123
- 9. keep a plan for later specs that improve the full loop
135
+ 7. use the `okf-knowledge-bundle` pattern when the useful artifact is governed
136
+ Markdown knowledge for accepted agent context
137
+ 8. map where information comes in and actions go out
138
+ 9. create the first workspace only after the user chooses a small first spec
139
+ 10. keep a plan for later specs that improve the full loop
124
140
 
125
141
  For users who already have specs and want to build software, optimize a second
126
142
  journey:
@@ -131,10 +147,11 @@ journey:
131
147
  4. identify read specs and write specs
132
148
  5. seed app-local Airlock context with `airlock-mcp init-app-context` when the
133
149
  app needs spec snapshots, samples, generated helpers, and a manifest
134
- 6. build orienting views, dashboards, queues, proposals, or recommendations
135
- 7. capture decisions, approvals, actions, comments, or follow-ups through
150
+ 6. inspect installed setup with read-only `observe.*` procedures when available
151
+ 7. build orienting views, dashboards, queues, proposals, or recommendations
152
+ 8. capture decisions, approvals, actions, comments, or follow-ups through
136
153
  Airlock spec contracts
137
- 8. avoid direct writes to Airlock-owned tables and avoid bypassing spec workflow
154
+ 9. avoid direct writes to Airlock-owned tables and avoid bypassing spec workflow
138
155
 
139
156
  For users who are developing the app and specs together, optimize a third
140
157
  journey:
@@ -22,6 +22,11 @@ Use `airlock-mcp rename`, `archive`, and `restore` to organize draft folders.
22
22
  `rename` retitles spec identity by default; pass `--keep-spec-identity` for a
23
23
  pure folder move.
24
24
 
25
+ For `okf-knowledge-bundle` workspaces, `sample.records.json` is only a small
26
+ metadata sample for the draft spec. The governed payload is a locally validated
27
+ Markdown directory or `.zip` bundle loaded through installed Airlock's
28
+ `airlock.admin.load_okf_bundle(...)` path.
29
+
25
30
  `review.md` should identify the workspace source mode:
26
31
 
27
32
  - `create`: started from an Airlock MCP pattern
package/docs/workflows.md CHANGED
@@ -154,6 +154,39 @@ unless the user asks to change specs. Start by asking for:
154
154
  - the available Airlock/Snowflake access path
155
155
  - identity, evidence, timestamp, approval, and separation-of-duties needs
156
156
 
157
+ Use the installed Airlock procedure grammar:
158
+
159
+ - `airlock.observe.*` is read-only and should answer discovery, governance,
160
+ audit, health, activity, billing-event, and access-explanation questions.
161
+ - `airlock.agent.*` is for governed work by the current actor, including
162
+ validation, loading, workflow actions, attachments, references, and
163
+ delegations.
164
+ - `airlock.admin.*` is for administrative mutation and operational changes.
165
+
166
+ For app-first work, start with observe payloads such as `observe.procedures`,
167
+ `observe.specs`, `observe.spec`, `observe.governance_map`,
168
+ `observe.explain_access`, `observe.health`, `observe.activity`,
169
+ `observe.admin_activity`, `observe.spec_admin_activity`, `observe.billing`, and
170
+ `observe.billing_events`. For `alter_spec` activity, use `CHANGED_SECTIONS` and
171
+ `CHANGED_FIELDS` to triage what changed before fetching version snapshots. Do not use retired admin read
172
+ wrappers such as `admin.list_specs`, `admin.describe_role`, `admin.get_spec`,
173
+ or `admin.list_events`; use observe list/detail procedures instead.
174
+
175
+ Restricted references are one-record interaction contracts for read-only
176
+ reference specs. When `observe.reference_context`, `observe.spec_config`, or
177
+ `agent.describe_spec` shows `restricted_reference` or
178
+ `reference_config.restricted_reference`, do not enumerate the protected
179
+ reference, build a populated picker, or use broad `agent.select_reference_data`
180
+ for that object path. Get the lookup value from the user's case/work context,
181
+ then call `agent.get_reference_record` with the configured `object_key`, lookup
182
+ value, purpose, and role lens. The procedure returns at most one `RECORD`,
183
+ applies reference row filters, checks active `action_limit` Expectations before
184
+ returning data, and records the safe `REFERENCE_READ` event used for usage
185
+ budgeting. Use `observe.reference_context`, `observe.usage_limits`,
186
+ `observe.usage_limit`, and
187
+ `observe.explain_access(action => 'get_reference_record', object_key => ...)`
188
+ for planning and audit without reading raw reference rows.
189
+
157
190
  The app should follow the loop:
158
191
 
159
192
  1. Observe/read governed records through approved Airlock or Snowflake surfaces.
@@ -228,6 +261,28 @@ airlock-mcp check workspaces/feedback-loop
228
261
  Then ask Codex to help decide what the posts should observe, who responds, and
229
262
  what next spec should grow from the feedback.
230
263
 
264
+ ## Start From Governed Knowledge
265
+
266
+ Use this when the user wants accepted Markdown business context for people or
267
+ agents: policies, runbooks, metric definitions, investigations, decisions, or
268
+ operating notes.
269
+
270
+ ```bash
271
+ airlock-mcp init sales-context --pattern okf-knowledge-bundle
272
+ airlock-mcp check workspaces/sales-context
273
+ ```
274
+
275
+ This pattern sets `core_config.payload_adapter` to `okf_knowledge_bundle`.
276
+ Installed Airlock loads locally validated bundles with
277
+ `airlock.admin.load_okf_bundle(...)`, can refresh parsed metadata with
278
+ `airlock.admin.sync_okf_bundle_metadata(...)`, and exposes authoritative
279
+ accepted concept metadata through
280
+ `AIRLOCK_DATA.ACTIVE.V_OKF_CONCEPT_METADATA`.
281
+
282
+ Do not treat draft or rejected Markdown bundles as authoritative agent context.
283
+ The MCP local checker validates the spec workspace; bundle validation belongs
284
+ to Airlock's OKF validator and installed procedures.
285
+
231
286
  ## Start From A Known Process
232
287
 
233
288
  Use this when the process is known but the data shape is not.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reunionstudio/airlock-mcp",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Single-install MCP interface for Airlock agents.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -11,6 +11,12 @@
11
11
  "title": "Posts feedback loop",
12
12
  "summary": "Small governed feedback stream for discovering what to build next.",
13
13
  "directory": "starter-posts"
14
+ },
15
+ {
16
+ "name": "okf-knowledge-bundle",
17
+ "title": "OKF knowledge bundle",
18
+ "summary": "Governed Markdown knowledge bundles for accepted agent context.",
19
+ "directory": "okf-knowledge-bundle"
14
20
  }
15
21
  ]
16
22
  }
@@ -0,0 +1,64 @@
1
+ # Starter Pattern: OKF Knowledge Bundle
2
+
3
+ Use `okf-knowledge-bundle` when the team wants governed Markdown knowledge for
4
+ people and agents to use as accepted business context.
5
+
6
+ This pattern is for Airlock's `okf_knowledge_bundle` payload adapter. It is
7
+ inspired by Google's Open Knowledge Format, but Airlock applies a narrower
8
+ profile so accepted bundles can become governed context instead of loose wiki
9
+ content.
10
+
11
+ ## Use When
12
+
13
+ - Policies, runbooks, metrics, definitions, decisions, investigations, or
14
+ operating context need a governed place to land.
15
+ - Agents need business context that can be accepted, audited, and queried from
16
+ Snowflake.
17
+ - The team has useful Markdown knowledge, but needs Airlock workflow, PDP,
18
+ Expectations, evidence, and acceptance boundaries around it.
19
+
20
+ ## Bundle Shape
21
+
22
+ - Bundle source is a directory or `.zip` archive of UTF-8 Markdown files.
23
+ - Root `index.md` may contain bundle frontmatter such as `okf_version`,
24
+ `bundle_name`, `bundle_version`, `domain`, `owner`, and `purpose`.
25
+ - Every non-reserved Markdown file is a concept document with YAML frontmatter.
26
+ - Concept documents require `type`.
27
+ - Recommended concept fields are `title`, `description`, `resource`, `tags`,
28
+ `timestamp`, and `source_links`.
29
+ - `index.md` and `log.md` are reserved at every hierarchy level.
30
+
31
+ ## Airlock Contract
32
+
33
+ The spec must declare:
34
+
35
+ ```json
36
+ {
37
+ "core_config": {
38
+ "payload_adapter": "okf_knowledge_bundle"
39
+ }
40
+ }
41
+ ```
42
+
43
+ Installed Airlock provides two admin procedures for this adapter:
44
+
45
+ - `airlock.admin.load_okf_bundle(...)`: load a locally validated bundle into
46
+ Airlock stage storage and `FILE_MANIFEST`, then project concept metadata.
47
+ - `airlock.admin.sync_okf_bundle_metadata(...)`: project parsed concept
48
+ metadata for an existing active manifest row.
49
+
50
+ Use `validate_only => TRUE` before writing. Treat accepted context as
51
+ authoritative only from:
52
+
53
+ ```sql
54
+ AIRLOCK_DATA.ACTIVE.V_OKF_CONCEPT_METADATA
55
+ ```
56
+
57
+ Draft and rejected bundles are not authoritative agent context.
58
+
59
+ ## Local Workbench Notes
60
+
61
+ `airlock-mcp check` validates the Airlock spec draft and sample metadata. It
62
+ does not validate a Markdown bundle. Bundle validation currently lives in the
63
+ Airlock source repo's `airlock.okf_knowledge_bundle.validate_okf_bundle`
64
+ helper and the installed Airlock OKF procedures.
@@ -0,0 +1,16 @@
1
+ {
2
+ "spec_name": "okf_knowledge",
3
+ "filename": "okf_knowledge_sample.csv",
4
+ "records": [
5
+ {
6
+ "concept_path": "runbooks/monthly-close",
7
+ "concept_type": "Runbook",
8
+ "bundle_version": "2026.06"
9
+ },
10
+ {
11
+ "concept_path": "metrics/net-revenue",
12
+ "concept_type": "Metric",
13
+ "bundle_version": "2026.06"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,64 @@
1
+ {
2
+ "core_config": {
3
+ "spec_name": "okf_knowledge",
4
+ "spec_alias": "OKF Knowledge",
5
+ "description": "Governed OKF-style Markdown knowledge bundles for accepted agent context.",
6
+ "owner_role": "app_admin",
7
+ "current_mode": "append",
8
+ "is_published": false,
9
+ "is_locked": false,
10
+ "is_archived": false,
11
+ "is_multi_role": false,
12
+ "file_workflow": false,
13
+ "workflow_steps": [],
14
+ "materialize_as_table": false,
15
+ "payload_adapter": "okf_knowledge_bundle"
16
+ },
17
+ "column_config": [
18
+ {
19
+ "name": "concept_path",
20
+ "type": "string",
21
+ "description": "Stable normalized Markdown concept path without the .md suffix.",
22
+ "tests": ["not_null", "unique"]
23
+ },
24
+ {
25
+ "name": "concept_type",
26
+ "type": "string",
27
+ "description": "Concept type from OKF frontmatter.",
28
+ "tests": ["not_null"]
29
+ },
30
+ {
31
+ "name": "bundle_version",
32
+ "type": "string",
33
+ "description": "Bundle version containing the concept.",
34
+ "tests": ["not_null"]
35
+ }
36
+ ],
37
+ "rules": [],
38
+ "file_rules": {
39
+ "file_format": {
40
+ "file_type": "csv",
41
+ "record_delimiter": "\n",
42
+ "field_delimiter": ",",
43
+ "field_optionally_enclosed_by": "\"",
44
+ "escape_unenclosed_field": "\\",
45
+ "encoding": "UTF8",
46
+ "parse_header": true,
47
+ "save_header": true
48
+ },
49
+ "filename_rules": {
50
+ "enforce_filename_pattern": false,
51
+ "filename_pattern": null,
52
+ "sample_filenames": null
53
+ }
54
+ },
55
+ "sample_data": {
56
+ "sample_data_acknowledged": true,
57
+ "sample_rows": [],
58
+ "edited_sample_data": "concept_path,concept_type,bundle_version\nrunbooks/monthly-close,Runbook,2026.06\nmetrics/net-revenue,Metric,2026.06\n"
59
+ },
60
+ "attachment_policy": {
61
+ "attachments_enabled": true,
62
+ "attachment_required": false
63
+ }
64
+ }
@@ -5,7 +5,7 @@
5
5
  {
6
6
  "post_id": "POST-001",
7
7
  "reply_to_post_id": "",
8
- "submitted_by": "agent.deb",
8
+ "submitted_by": "agent.csmith",
9
9
  "posted_at": "2026-06-13 09:00:00",
10
10
  "body": "Please make reimbursements easier to prepare and submit.",
11
11
  "tags": "#request #finance #reimbursements",
@@ -19,7 +19,7 @@
19
19
  "desired_outcome": "An approved agent can prepare a draft reimbursement with receipt evidence."
20
20
  },
21
21
  "agent": {
22
- "name": "Deb"
22
+ "name": "csmith"
23
23
  }
24
24
  }
25
25
  }
package/setup.py CHANGED
@@ -27,7 +27,7 @@ def data_files():
27
27
 
28
28
  setup(
29
29
  name="airlock-mcp",
30
- version="0.1.3",
30
+ version="0.1.5",
31
31
  description="Codex-first workbench and CLI for drafting Airlock specs.",
32
32
  packages=find_packages("src"),
33
33
  package_dir={"": "src"},
@@ -1,3 +1,3 @@
1
1
  """Airlock MCP CLI package."""
2
2
 
3
- __version__ = "0.1.3"
3
+ __version__ = "0.1.5"
@@ -28,6 +28,32 @@ Use:
28
28
  - `generated/types/` for generated application types.
29
29
  - `generated/sql/` for reviewed SQL helpers or query templates.
30
30
 
31
+ Installed Airlock separates procedure intent:
32
+
33
+ - `observe.*`: read-only governance observation for discovery, health, access
34
+ explanation, activity, admin activity, billing events, governance maps, and
35
+ context packets.
36
+ - `agent.*`: governed agent work in the actor's scope.
37
+ - `admin.*`: administrative mutation and operational changes.
38
+
39
+ Prefer `observe.*` for app read-side setup and monitoring questions. Use
40
+ `observe.admin_activity` for broad admin mutation and maintenance audit
41
+ questions, and `observe.spec_admin_activity` for one spec's definition-change
42
+ timeline. For `alter_spec` activity, use `CHANGED_SECTIONS` and
43
+ `CHANGED_FIELDS` to triage what changed before fetching version snapshots.
44
+ Do not use retired admin read wrappers such as `admin.list_specs`,
45
+ `admin.describe_role`, or `admin.list_events`; use the matching observe procedure.
46
+
47
+ Restricted references are one-record interaction contracts. If a reference
48
+ spec declares `restricted_reference` or `reference_config.restricted_reference`,
49
+ do not enumerate values or use broad `agent.select_reference_data` for that
50
+ object path. Get the lookup value from the user's case/work context and call
51
+ `agent.get_reference_record` with the configured `object_key`, lookup value,
52
+ purpose, and role lens. Use `observe.reference_context`,
53
+ `observe.usage_limits`, `observe.usage_limit`, and
54
+ `observe.explain_access(action => 'get_reference_record', object_key => ...)`
55
+ for planning and audit without reading raw reference rows.
56
+
31
57
  Do not store credentials here. Do not write directly to Airlock-owned tables,
32
58
  stages, generated views, or generated tables. Use approved Airlock/Snowflake
33
59
  access paths and submit governed decisions or actions through spec contracts.
@@ -60,6 +86,22 @@ Use approved Airlock/Snowflake access paths. Do not bypass spec workflow or
60
86
  write directly to Airlock-owned tables, stages, generated views, or generated
61
87
  tables. If the app needs to submit a decision or action and no suitable write
62
88
  spec exists, propose a small spec-design step.
89
+
90
+ Installed Airlock procedure grammar:
91
+
92
+ - `observe.*` is read-only governance observation. Use it for discovery,
93
+ health, access explanation, governance maps, activity, billing events, and
94
+ context packets.
95
+ - `agent.*` is governed agent work in the actor's scope.
96
+ - `admin.*` is administrative mutation. Do not use retired admin read wrappers;
97
+ use observe list/detail procedures instead.
98
+
99
+ For restricted reference specs, do not enumerate protected object paths or use
100
+ broad `agent.select_reference_data`. Use `agent.get_reference_record` for a
101
+ known lookup value and purpose, and use `observe.reference_context`,
102
+ `observe.usage_limits`, `observe.usage_limit`, and
103
+ `observe.explain_access(action => 'get_reference_record', object_key => ...)`
104
+ for planning and audit.
63
105
  """
64
106
 
65
107
 
@@ -115,6 +157,12 @@ def _manifest(mode: str, entries: list[dict[str, Any]]) -> dict[str, Any]:
115
157
  "mode": mode,
116
158
  "canonical_source": "specs repo or installed Airlock",
117
159
  "snapshot_policy": "Snapshots are app-local development references, not canonical specs.",
160
+ "installed_airlock_contract": {
161
+ "observe": "read-only governance observation, context, activity, health, billing events, and access explanation",
162
+ "agent": "governed agent work in the actor scope",
163
+ "admin": "administrative mutation and operational changes",
164
+ "restricted_reference": "one-record reference lookup through agent.get_reference_record; do not enumerate protected reference paths",
165
+ },
118
166
  "specs": entries,
119
167
  "tracks": {
120
168
  "spec_track": "row grain, columns, samples, access, validation, workflow",
@@ -134,6 +182,7 @@ def _merge_manifest(existing: Any, new_manifest: dict[str, Any]) -> dict[str, An
134
182
  "mode": new_manifest["mode"],
135
183
  "canonical_source": new_manifest["canonical_source"],
136
184
  "snapshot_policy": new_manifest["snapshot_policy"],
185
+ "installed_airlock_contract": new_manifest["installed_airlock_contract"],
137
186
  "tracks": new_manifest["tracks"],
138
187
  }
139
188
  )
@@ -265,7 +314,8 @@ def format_app_context_result(result: AppContextResult) -> str:
265
314
  "next:",
266
315
  "1. Treat spec snapshots as app-local references, not canonical specs.",
267
316
  "2. Mark each manifest spec as read, write, or read_write for the app.",
268
- "3. Build app reads and governed submissions through approved Airlock/Snowflake access paths.",
317
+ "3. Use observe.* for read-only governance discovery and agent.* for governed actor work.",
318
+ "4. Build governed submissions through approved Airlock/Snowflake access paths.",
269
319
  ]
270
320
  )
271
321
  return "\n".join(lines)
@@ -111,6 +111,34 @@ Identify:
111
111
  - the Airlock access path available in this environment
112
112
  - identity, evidence, timestamp, approval, and separation-of-duties rules
113
113
 
114
+ Installed Airlock separates procedure intent:
115
+
116
+ - `observe.*`: read-only governance observation for discovery, health, access
117
+ explanation, governance maps, activity, billing events, and context packets.
118
+ - `agent.*`: governed agent work in the actor's scope.
119
+ - `admin.*`: administrative mutation and operational changes.
120
+
121
+ For app-first work, use observe payloads such as `observe.procedures`,
122
+ `observe.specs`, `observe.spec`, `observe.governance_map`,
123
+ `observe.explain_access`, `observe.health`, `observe.activity`,
124
+ `observe.admin_activity`, `observe.spec_admin_activity`, and
125
+ `observe.billing_events` before inventing custom read paths. For `alter_spec`
126
+ activity, use `CHANGED_SECTIONS` and `CHANGED_FIELDS` to triage what changed
127
+ before fetching version snapshots. Do not call retired admin read wrappers such as `admin.list_specs`, `admin.describe_role`,
128
+ or `admin.list_events`; use the matching observe list/detail procedure.
129
+
130
+ Restricted references are one-record interaction contracts for read-only
131
+ reference specs. If `agent.describe_spec`, `observe.spec_config`, or
132
+ `observe.reference_context` shows `restricted_reference` or
133
+ `reference_config.restricted_reference`, do not enumerate the protected
134
+ reference, build a populated picker, or use broad `agent.select_reference_data`
135
+ for that object path. Get the lookup value from the user's case/work context,
136
+ then call `agent.get_reference_record` with the configured `object_key`, lookup
137
+ value, purpose, and role lens. Use `observe.usage_limits`,
138
+ `observe.usage_limit`, and
139
+ `observe.explain_access(action => 'get_reference_record', object_key => ...)`
140
+ for planning and audit without reading raw reference rows.
141
+
114
142
  The app may orient the user with summaries, comparisons, rankings, exception
115
143
  queues, proposals, or dashboards. It should submit governed choices back
116
144
  through an Airlock spec contract. Do not write directly to Airlock-owned tables,
@@ -247,6 +247,7 @@ def workspace_summary(
247
247
  f" owner_role: {_format_value(core.get('owner_role'))}",
248
248
  f" published: {_format_value(core.get('is_published'))}",
249
249
  f" archived: {_format_value(core.get('is_archived'))}",
250
+ f" payload_adapter: {_format_value(core.get('payload_adapter'), default='default')}",
250
251
  f" description: {_truncate(core.get('description')) or 'none'}",
251
252
  "",
252
253
  "file_rules:",
package/src/mcp.mjs CHANGED
@@ -44,7 +44,7 @@ export function handleMcpRequest(message) {
44
44
  },
45
45
  serverInfo: {
46
46
  name: "airlock",
47
- version: "0.1.3",
47
+ version: "0.1.5",
48
48
  },
49
49
  instructions:
50
50
  "Airlock MCP helps agents improve processes with Airlock specs and build apps or workflows that use existing specs. Use airlock_start for orientation or the airlock_* tools to bootstrap, draft, check, summarize, export, and render specs.",
package/src/text.mjs CHANGED
@@ -53,10 +53,36 @@ and a plan for more. Do not create the first workspace until I choose a path.
53
53
 
54
54
  If I want app-first or co-development, ask for the app goal, the specs I can
55
55
  access, which specs are read sources, which spec records decisions or actions,
56
- and where the app should run. Offer to run \`airlock-mcp init-app-context\` in
57
- the app repo to seed \`airlock/specs.manifest.json\`, spec snapshots, sample
58
- records, and generated helper folders. Help code the app using approved
59
- Airlock/Snowflake access paths. Do not write directly to Airlock-owned tables
56
+ and where the app should run. Teach the installed Airlock procedure split:
57
+ \`airlock.observe.*\` is read-only governance observation,
58
+ \`airlock.agent.*\` is governed agent work, and \`airlock.admin.*\` is
59
+ administrative mutation. Prefer observe payloads such as
60
+ \`observe.procedures\`, \`observe.specs\`, \`observe.spec\`,
61
+ \`observe.governance_map\`, \`observe.explain_access\`, \`observe.health\`,
62
+ \`observe.activity\`, \`observe.admin_activity\`, \`observe.spec_admin_activity\`,
63
+ and \`observe.billing_events\` before inventing custom read paths. For \`alter_spec\`
64
+ activity, use \`CHANGED_SECTIONS\` and \`CHANGED_FIELDS\` to triage what changed
65
+ before fetching version snapshots. Offer to run \`airlock-mcp init-app-context\`
66
+ in the app repo to seed \`airlock/specs.manifest.json\`, spec snapshots, sample records, and
67
+ generated helper folders. Help code the app using approved Airlock/Snowflake access paths.
68
+ When a reference spec declares \`restricted_reference\` or
69
+ \`reference_config.restricted_reference\`, do not enumerate values, build a
70
+ populated picker, or call broad \`agent.select_reference_data\`. Get the lookup
71
+ value from the user's case/work context and call
72
+ \`agent.get_reference_record\` for the configured \`object_key\`, purpose, and
73
+ role lens. It returns at most one record, applies reference row filters, checks
74
+ \`action_limit\` before returning data, and always records the safe
75
+ \`REFERENCE_READ\` event used for budgeting. Branch on \`OK\`, \`NOT_FOUND\`,
76
+ \`NON_UNIQUE_LOOKUP_KEY\`, \`PURPOSE_REQUIRED\`, \`USAGE_LIMIT_BLOCKED\`, and
77
+ \`REFERENCE_READ_EVENT_FAILED\`; report \`USAGE_CONTEXT\` fields such as
78
+ \`action_limit_used\` and \`action_time_period\`. Use
79
+ \`observe.reference_context\`, \`observe.usage_limits\`, \`observe.usage_limit\`,
80
+ and \`observe.explain_access(action => 'get_reference_record', object_key => ...)\`
81
+ for read-only planning and audit.
82
+
83
+ Do not use retired admin read wrappers such as
84
+ \`admin.list_specs\`, \`admin.describe_role\`, or \`admin.list_events\`; use
85
+ the matching observe procedure. Do not write directly to Airlock-owned tables
60
86
  or bypass spec workflow.`;
61
87
  }
62
88
 
@@ -78,11 +104,13 @@ Airlock MCP will offer:
78
104
  - spec-first, app-first, and co-development planning
79
105
  - spec design with the bundled workbench
80
106
  - Airlock operating patterns for OODA loops and separation of duties
107
+ - read-only observe procedures for governance maps, health, access explanation, activity, billing events, and context packets
81
108
  - app context seeding with spec snapshots and manifests
82
109
  - app and workflow coding against existing Airlock specs
83
110
  - observe specs for controlled interface ingestion
84
111
  - orient specs for proposals, context, scoring, or exception queues
85
112
  - decision specs and action specs for governed follow-through
113
+ - OKF-style Markdown knowledge bundles for accepted agent context
86
114
  - artifact-grounded drafts from CSV, Excel, JSON, API docs, schemas, forms, screenshots, PDFs, or exports
87
115
  - airlock-specs library patterns as starting points, checked against current artifacts`;
88
116
  }
@@ -95,7 +123,7 @@ Airlock. It helps a person and their agent improve processes by designing
95
123
  specs, using specs for governed data movement, planning OODA loops, and building
96
124
  apps or workflows that read from and submit through existing specs.
97
125
 
98
- Airlock MCP gives agents three kinds of Airlock help:
126
+ Airlock MCP gives agents four kinds of Airlock help:
99
127
 
100
128
  1. Spec design: draft, check, revise, import, clone, and prepare specs for
101
129
  installed Airlock validation.
@@ -105,6 +133,10 @@ Airlock MCP gives agents three kinds of Airlock help:
105
133
  3. App and workflow implementation: build dashboards, queues, decision UIs,
106
134
  analyses, and agent workflows that use existing specs without bypassing
107
135
  Airlock contracts.
136
+ 4. Governance observation: use installed Airlock's read-only \`observe.*\`
137
+ procedures to inspect setup, access, activity, billing events, health,
138
+ context packets, and governance maps before deciding what an app or agent
139
+ should do.
108
140
 
109
141
  Start in a Git-backed specs repo such as ${specsRepoName(project)}. GitHub is
110
142
  the recommended default when the user has it set up, but any normal repository
@@ -146,15 +178,36 @@ points, patterns, and ideas. Library specs are not guaranteed to match the
146
178
  current shape of any third-party system. Prefer current API docs, real exports,
147
179
  samples, and other artifacts when they conflict with the library.
148
180
 
181
+ For governed Markdown knowledge, use the \`okf-knowledge-bundle\` pattern. It
182
+ creates a spec with \`core_config.payload_adapter\` set to
183
+ \`okf_knowledge_bundle\`. Installed Airlock loads locally validated bundles with
184
+ \`airlock.admin.load_okf_bundle(...)\`, can sync parsed metadata with
185
+ \`airlock.admin.sync_okf_bundle_metadata(...)\`, and exposes authoritative
186
+ accepted context through \`AIRLOCK_DATA.ACTIVE.V_OKF_CONCEPT_METADATA\`.
187
+
149
188
  Give Codex the messy version of the process. Airlock MCP should help turn it
150
189
  into a small first Airlock spec and a plan for more.
151
190
 
152
191
  For app-first and co-development work, give Codex the app goal and available
153
192
  specs. Airlock MCP should identify read specs, write specs, orienting views,
154
- decision capture, and safe Airlock/Snowflake access paths. It can seed an app
155
- repo with \`airlock/specs.manifest.json\`, spec snapshots, sample records, and
156
- generated helper folders. The app should submit decisions, approvals, actions,
157
- comments, or follow-ups through Airlock spec contracts, not direct table writes.
193
+ decision capture, and safe Airlock/Snowflake access paths. Installed Airlock
194
+ uses \`observe.*\` for read-only governance observation, \`agent.*\` for
195
+ governed agent work, and \`admin.*\` for administrative mutation. Start
196
+ read-side discovery with observe payloads such as \`observe.procedures\`,
197
+ \`observe.specs\`, \`observe.spec\`, \`observe.governance_map\`,
198
+ \`observe.explain_access\`, \`observe.health\`, \`observe.activity\`,
199
+ \`observe.admin_activity\`, \`observe.spec_admin_activity\`, and \`observe.billing_events\`;
200
+ for \`alter_spec\` activity, use \`CHANGED_SECTIONS\` and \`CHANGED_FIELDS\` to
201
+ triage what changed before fetching version snapshots. Do not use retired admin
202
+ read wrappers such as \`admin.list_specs\`, \`admin.describe_role\`, or
203
+ \`admin.list_events\`. If a reference spec declares \`restricted_reference\` or
204
+ \`reference_config.restricted_reference\`, do not enumerate the protected
205
+ reference; use \`agent.get_reference_record\` for a known lookup value and
206
+ \`observe.usage_limits\` / \`observe.usage_limit\` for budget visibility. It can
207
+ seed an app repo with \`airlock/specs.manifest.json\`, spec snapshots, sample
208
+ records, and generated helper folders. The app should submit decisions,
209
+ approvals, actions, comments, or follow-ups through Airlock spec contracts, not
210
+ direct table writes.
158
211
  In co-development mode, keep the spec track and app track visible side by side.`;
159
212
  }
160
213
 
package/src/workbench.mjs CHANGED
@@ -82,7 +82,7 @@ export const WORKBENCH_TOOLS = [
82
82
  {
83
83
  pattern: {
84
84
  type: "string",
85
- enum: ["blank", "posts"],
85
+ enum: ["blank", "okf-knowledge-bundle", "posts"],
86
86
  description: "Pattern to inspect.",
87
87
  },
88
88
  files: {
@@ -106,7 +106,7 @@ export const WORKBENCH_TOOLS = [
106
106
  },
107
107
  pattern: {
108
108
  type: "string",
109
- enum: ["blank", "posts"],
109
+ enum: ["blank", "okf-knowledge-bundle", "posts"],
110
110
  description: "Starting pattern. Defaults to blank.",
111
111
  },
112
112
  output: {