@klickd/core 4.0.0 → 4.0.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klickd/core",
3
- "version": "4.0.0",
3
+ "version": "4.0.2",
4
4
  "description": "Official JavaScript/TypeScript library for reading and writing .klickd portable AI context files",
5
5
  "keywords": [
6
6
  "klickd",
@@ -29,12 +29,14 @@
29
29
  },
30
30
  "files": [
31
31
  "dist",
32
+ "starter-skills",
32
33
  "README.md",
33
34
  "LICENSE"
34
35
  ],
35
36
  "scripts": {
36
- "build": "tsup src/index.ts --format esm,cjs --dts --external argon2 --external argon2-browser --external ajv --loader .json=copy",
37
+ "build": "tsup src/index.ts --format esm,cjs --dts --external argon2 --external argon2-browser --external ajv",
37
38
  "test": "node --experimental-vm-modules node_modules/.bin/jest",
39
+ "verify:tarball": "node scripts/verify-tarball.mjs",
38
40
  "prepublishOnly": "npm run build"
39
41
  },
40
42
  "dependencies": {
@@ -0,0 +1,98 @@
1
+ # `examples/v4/starter-skills/` — Starter `.klickd` skills
2
+
3
+ > **Status:** Starter / sample artefacts. **Non-normative.** **Pre-release.**
4
+ >
5
+ > **Triggers no release.** No tag, no `latest` on npm or PyPI, no DOI on Zenodo, no IANA action, no SDK bump.
6
+
7
+ This directory ships four real, structured `.klickd` files — starter skills on top of the **v4.0 envelope**. They are downloadable starter `.klickd` files — not relabelled v4-preview personas and not host-side skills.
8
+
9
+ ## Files
10
+
11
+ | File | Skill id | Domain | Hash (sha256_file) |
12
+ |---|---|---|---|
13
+ | [`user.klickd`](./user.klickd) | `x.klickd/user` | transversal (base) | `19121af045f6dd3537aa9bd4372edfaed5097b8436f026a8e9c585abbac6c80a` |
14
+ | [`student.klickd`](./student.klickd) | `x.klickd/student` | education | `ffea74552ecedc9076d6468cb10214586632163f073a8c7975642e272464dba4` |
15
+ | [`research.klickd`](./research.klickd) | `x.klickd/research` | research / evidence | `571bd07773caff23d08fe6857bbf696dd6e49f701aab750fa7b261345285ce63` |
16
+ | [`coding.klickd`](./coding.klickd) | `x.klickd/coding` | software engineering | `1aab06122d8b6c7ed45737aa3b6becad3ae33badb5ad893cc7788ad6dd1481f4` |
17
+ | [`manifest.json`](./manifest.json) | — | sha256 manifest of the four skills above | (regenerable via `scripts/verify_starter_skills.py`) |
18
+
19
+ ## What these skills *are*
20
+
21
+ Each file is a real structured JSON document that carries:
22
+
23
+ - the **v4.0 envelope** (`klickd_version`, `payload_schema_version`, `domain`, `profile_kind`, `created_at`, `encrypted`) — so an existing v4.0 reader round-trips it without breaking;
24
+ - the **`x_klickd_pack` block** carrying:
25
+ - `pack`, `pack_version`, `spec_ref`, `publisher`
26
+ - `frameworks[]` (ESCO / DigComp / LifeComp / EQF / CEFR / SFIA depending on the skill)
27
+ - `base_transversal_core`
28
+ - domain-specific `competencies[]` anchored to authoritative framework IRIs
29
+ - `levels[]` with framework-anchored `level_label` (e.g. `EQF level 4`, `EQF level 6`, `EQF level 7`)
30
+ - `mastery[]` (empty in starter; pointer-only when populated by a carrier)
31
+ - `source_policy`, `evidence_policy` (RFC-002 §8b)
32
+ - `verification_gates` and per-skill `gates.verification_gates_default` (RFC-002, `raise_only: true`)
33
+ - `human_authority` (`final_decision_owner: human_carrier`, `agent_role: advisory`)
34
+ - `structured_memory` block scoped to `memory.x_klickd.<pack>`
35
+ - `router_cost` (deterministic heuristic, RFC-003)
36
+ - `forbidden_fields` literal (enforces the carrier-vs-skill split)
37
+
38
+ ## What these skills are NOT
39
+
40
+ - **Stable v4.0 envelope.** `klickd_version: "4.0"`, `_pack_metadata.claims_v41_ga: false`. No public catalog is implied.
41
+ - **Not relabelled personas.** They are *new artefacts* authored against frameworks. They do **not** harvest `knowledge.mastered[]` / `mastered_topics` from the v4-preview persona fixtures under [`../personas/`](../personas/) (clean-architecture invariant).
42
+ - **Not host-side skills.** The `forbidden_fields` literal is the carrier-vs-skill firewall. Pedagogy, scoring rubrics, prompt strategies, tone rules — those belong in a `host_skill` on the agent side, not in the starter file.
43
+ - **Not personal data.** No PII, no secrets, no real user state. `display_name: null`, `school_or_institution_ref: null`, `mastery: []`, `history: []`. The starter files are *publisher-owned starter shapes* a carrier can adopt and personalise locally.
44
+
45
+ ## How to verify
46
+
47
+ Offline verification of structure, fields, anti-PII guard, anti-host_skill guard, and hash stability:
48
+
49
+ ```bash
50
+ python3 scripts/verify_starter_skills.py
51
+ # or via pytest
52
+ pytest tests/test_starter_skills.py
53
+ ```
54
+
55
+ The general starter-pack validator (`scripts/validate_starter_packs.py`) by
56
+ default expects the structured fields at the top level of each file. For the
57
+ v4.0 starter `.klickd` files in this directory (which nest those fields
58
+ under `x_klickd_pack` so the v4.0 envelope round-trips unchanged) run it
59
+ with the `--v40-envelope` flag:
60
+
61
+ ```bash
62
+ # v4.0-envelope mode — unwraps `x_klickd_pack` before validation
63
+ python3 scripts/validate_starter_packs.py \
64
+ --dir examples/v4/starter-skills \
65
+ --v40-envelope
66
+ ```
67
+
68
+ The two scripts are complementary: `verify_starter_skills.py` covers the v4.0
69
+ envelope, persona-isolation, and hash-stability checks specific to this
70
+ directory; `validate_starter_packs.py --v40-envelope` covers the shared
71
+ field/forbidden-field/PII checks against the same files.
72
+
73
+ ## How to use
74
+
75
+ These are downloadable starter `.klickd` files. A carrier can:
76
+
77
+ 1. Open the file matching their context (`user.klickd` as the always-on base, plus one of `student.klickd` / `research.klickd` / `coding.klickd`).
78
+ 2. Personalise *locally* — fill in `language_proficiency[]`, `subjects[].current_chapter_ref`, mastery entries (pointer-only), exam targets, etc. Personalisation never weakens gates (`raise_only: true`).
79
+ 3. Carry the file between agents. `human_authority.final_decision_owner = "human_carrier"` is non-negotiable across hosts.
80
+
81
+ ## Relation to internal spec work
82
+
83
+ These starter `.klickd` files sit on top of the **v4.0 envelope** and are non-normative starter artefacts for reviewers and integrators. Any future schema promotion and catalog surface remains gated by `ACCEPTANCE_CHECKLIST_V4.md`.
84
+
85
+ ## Relation to existing personas
86
+
87
+ | `examples/v4/personas/*.klickd` | `examples/v4/starter-skills/*.klickd` |
88
+ |---|---|
89
+ | Persona anchors / v4-preview demo fixtures. | Starter `.klickd` skills on the v4.0 envelope. |
90
+ | Free-text `knowledge.mastered[]`, narrative `level`. | Framework-anchored `competencies[]`, framework-anchored `levels[]`. |
91
+ | Carry tutor-style fields (`teaching_mode`, `agent_instructions`). | Carry **state only**; `forbidden_fields` block forbids host-side skill fields. |
92
+ | Inspiration material for skill authors. | Real downloadable starter `.klickd` files. |
93
+
94
+ The personas remain non-normative anchors. The starter `.klickd` files in this directory are the canonical starter artefacts going forward.
95
+
96
+ ## Release status
97
+
98
+ No tag, no release. The live npm package (`@klickd/core`) and PyPI package (`klickd`) **do not yet ship these starter `.klickd` files as package data** — a future patch release will be required to update those live pages. This directory and the GitHub raw URLs are the source of truth until then.
@@ -0,0 +1,226 @@
1
+ {
2
+ "klickd_version": "4.0",
3
+ "payload_schema_version": "4.0.0-preview.1",
4
+ "domain_schema_version": "v4-starter-1.0",
5
+ "created_at": "2026-05-26T00:00:00Z",
6
+ "encrypted": false,
7
+ "domain": "software_engineering",
8
+ "profile_kind": "developer",
9
+ "_pack_metadata": {
10
+ "kind": "starter_skill_pack",
11
+ "non_normative": true,
12
+ "claims_v41_ga": false,
13
+ "contains_real_pii": false,
14
+ "contains_secrets": false,
15
+ "see_readme": "examples/v4/starter-skills/README.md",
16
+ "note": "Non-normative starter skill pack on the v4.0 envelope."
17
+ },
18
+ "x_klickd_pack": {
19
+ "pack": "x.klickd/coding",
20
+ "pack_version": "0.1.0-starter",
21
+ "spec_ref": "examples/v4/starter-skills/README.md",
22
+ "publisher": {
23
+ "name": "klickd",
24
+ "ref": "https://klickd.app"
25
+ },
26
+ "frameworks": [
27
+ {
28
+ "scheme": "esco",
29
+ "version": "v1.1.1",
30
+ "iri_prefix": "http://data.europa.eu/esco/skill/",
31
+ "canonical_url": "https://esco.ec.europa.eu/en/classification/skill_main"
32
+ },
33
+ {
34
+ "scheme": "digcomp",
35
+ "version": "2.2",
36
+ "iri_prefix": "https://joint-research-centre.ec.europa.eu/digcomp/2.2/",
37
+ "canonical_url": "https://joint-research-centre.ec.europa.eu/digcomp_en"
38
+ },
39
+ {
40
+ "scheme": "sfia",
41
+ "version": "8",
42
+ "iri_prefix": "https://sfia-online.org/en/sfia-8/",
43
+ "canonical_url": "https://sfia-online.org/en/sfia-8"
44
+ },
45
+ {
46
+ "scheme": "eqf",
47
+ "version": "2017",
48
+ "iri_prefix": "https://europa.eu/europass/eqf/",
49
+ "canonical_url": "https://europa.eu/europass/en/europass-tools/european-qualifications-framework"
50
+ }
51
+ ],
52
+ "base_transversal_core": {
53
+ "frameworks": [
54
+ {
55
+ "scheme": "esco",
56
+ "version": "v1.1.1"
57
+ },
58
+ {
59
+ "scheme": "digcomp",
60
+ "version": "2.2"
61
+ },
62
+ {
63
+ "scheme": "eqf",
64
+ "version": "2017"
65
+ }
66
+ ],
67
+ "transversal_refs": [
68
+ {
69
+ "competency_ref": "esco:S5",
70
+ "scheme": "esco",
71
+ "prefLabel": "working with computers"
72
+ },
73
+ {
74
+ "competency_ref": "digcomp:3.4",
75
+ "scheme": "digcomp",
76
+ "prefLabel": "Programming"
77
+ },
78
+ {
79
+ "competency_ref": "digcomp:4.2",
80
+ "scheme": "digcomp",
81
+ "prefLabel": "Protecting personal data and privacy"
82
+ }
83
+ ]
84
+ },
85
+ "competencies": [
86
+ {
87
+ "competency_ref": "esco:S5",
88
+ "scheme": "esco",
89
+ "prefLabel": "working with computers"
90
+ },
91
+ {
92
+ "competency_ref": "digcomp:3.4",
93
+ "scheme": "digcomp",
94
+ "prefLabel": "Programming"
95
+ },
96
+ {
97
+ "competency_ref": "digcomp:4.1",
98
+ "scheme": "digcomp",
99
+ "prefLabel": "Protecting devices"
100
+ },
101
+ {
102
+ "competency_ref": "digcomp:4.2",
103
+ "scheme": "digcomp",
104
+ "prefLabel": "Protecting personal data and privacy"
105
+ },
106
+ {
107
+ "competency_ref": "sfia:PROG",
108
+ "scheme": "sfia",
109
+ "prefLabel": "Programming/software development"
110
+ },
111
+ {
112
+ "competency_ref": "sfia:TEST",
113
+ "scheme": "sfia",
114
+ "prefLabel": "Systems and software testing"
115
+ }
116
+ ],
117
+ "levels": [
118
+ {
119
+ "framework_ref": "https://europa.eu/europass/eqf/level/6",
120
+ "level_label": "EQF level 6",
121
+ "effective_at": "2026-05-26"
122
+ }
123
+ ],
124
+ "language_proficiency": [],
125
+ "mastery": [],
126
+ "engineering_discipline": {
127
+ "code_review_required_before_merge": true,
128
+ "tests_required_for_new_logic": true,
129
+ "typecheck_required_for_typed_languages": true,
130
+ "secrets_handling": "pointer_only_never_inline",
131
+ "supply_chain_awareness": "verify_provenance_when_adding_dependency",
132
+ "reversibility_default": "prefer_reversible_changes"
133
+ },
134
+ "gates": {
135
+ "verification_gates_default": {
136
+ "raise_only": true,
137
+ "claim_grounding_required": true,
138
+ "reversibility_threshold": "low"
139
+ },
140
+ "human_veto_policy": {
141
+ "owner": "human_carrier",
142
+ "scope": [
143
+ "force_push",
144
+ "dependency_addition",
145
+ "secret_handling",
146
+ "production_deploy"
147
+ ]
148
+ }
149
+ },
150
+ "human_authority": {
151
+ "final_decision_owner": "human_carrier",
152
+ "agent_role": "advisory",
153
+ "escalation": "human_carrier_only"
154
+ },
155
+ "memory_scope": "memory.x_klickd.coding",
156
+ "structured_memory": {
157
+ "scope": "memory.x_klickd.coding",
158
+ "policy": "pack_scoped_only",
159
+ "entries": []
160
+ },
161
+ "evidence_policy": {
162
+ "required_for_claims": true,
163
+ "pointer_only": true,
164
+ "attestation_shape_ref": "rfc-002#8b"
165
+ },
166
+ "source_policy": {
167
+ "allow_inline_definitions": false,
168
+ "language_tags": [
169
+ "en",
170
+ "fr"
171
+ ]
172
+ },
173
+ "verification_gates": {
174
+ "version": 1,
175
+ "user_default": "silent",
176
+ "gates": [
177
+ {
178
+ "id": "force-push",
179
+ "action_class": "force_push",
180
+ "level": "block",
181
+ "reason": "Force push is destructive; requires explicit human authorisation."
182
+ },
183
+ {
184
+ "id": "dependency-add",
185
+ "action_class": "dependency_addition",
186
+ "level": "confirm",
187
+ "reason": "New dependencies expand the supply-chain surface; confirm provenance before adding."
188
+ },
189
+ {
190
+ "id": "secrets",
191
+ "action_class": "secret_handling",
192
+ "level": "block",
193
+ "reason": "Secrets never inline; pointer-only handling enforced at gate level."
194
+ },
195
+ {
196
+ "id": "production-deploy",
197
+ "action_class": "production_deploy",
198
+ "level": "block",
199
+ "reason": "Deploys touch shared infrastructure; reversibility threshold low."
200
+ },
201
+ {
202
+ "id": "destructive-git",
203
+ "action_class": "destructive_git",
204
+ "level": "confirm",
205
+ "reason": "Destructive git operations (reset --hard, branch -D) require confirmation."
206
+ }
207
+ ]
208
+ },
209
+ "router_cost": {
210
+ "tokens_estimate": 900,
211
+ "baseline": "base_plus_one"
212
+ },
213
+ "forbidden_fields": [
214
+ "pedagogy",
215
+ "teaching_method",
216
+ "socratic_steps",
217
+ "prompt_strategy",
218
+ "scoring_rubric",
219
+ "intervention_policy",
220
+ "tone_rules",
221
+ "system_prompt_overrides",
222
+ "knowledge.mastered",
223
+ "mastered_topics"
224
+ ]
225
+ }
226
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "manifest_version": "1.0",
3
+ "kind": "klickd_starter_skill_manifest",
4
+ "non_normative": true,
5
+ "claims_v41_ga": false,
6
+ "see_readme": "examples/v4/starter-skills/README.md",
7
+ "generated_at": "2026-05-26T00:00:00Z",
8
+ "hash_algo": "sha256",
9
+ "note": "Hashes are reproducible offline. sha256_file is over the raw bytes of the file as stored. sha256_canonical_json is over json.dumps(obj, sort_keys=True, separators=(',', ':'), ensure_ascii=False).encode('utf-8') and is stable across whitespace-only edits to the source file.",
10
+ "packs": [
11
+ {
12
+ "id": "x.klickd/user",
13
+ "file": "user.klickd",
14
+ "pack_version": "0.1.0-starter",
15
+ "bytes": 6294,
16
+ "sha256_file": "514e68223066e05a1b3af8f1d42c9d81c3e30f685259f7cf45c8aa2d50052036",
17
+ "sha256_canonical_json": "f61d52924d34acccf47cf4e8d5f7b6c9d791fad9f5a4f963e062c2230f11a4c9"
18
+ },
19
+ {
20
+ "id": "x.klickd/student",
21
+ "file": "student.klickd",
22
+ "pack_version": "0.1.0-starter",
23
+ "bytes": 6685,
24
+ "sha256_file": "26d4bed5172a67397af201ca6ff6d96b716ff994f359acf68e29e7fc4a0865ec",
25
+ "sha256_canonical_json": "1a1c783442bc3dccd8ad2fac8e72785d746016fd3a34d0976656efdf9dfda69a"
26
+ },
27
+ {
28
+ "id": "x.klickd/research",
29
+ "file": "research.klickd",
30
+ "pack_version": "0.1.0-starter",
31
+ "bytes": 6488,
32
+ "sha256_file": "e0da88dbb5c1d0768ca7a05422c4831e0751462ce399c9109ac2a5de61fba2a9",
33
+ "sha256_canonical_json": "f6f7d613ce640421b1902cb93af750ff1c057971c7c05872b7643fe34ca74e16"
34
+ },
35
+ {
36
+ "id": "x.klickd/coding",
37
+ "file": "coding.klickd",
38
+ "pack_version": "0.1.0-starter",
39
+ "bytes": 6465,
40
+ "sha256_file": "ae022d357ee9b3445afca761c76cf74e47f4ba85fb8ae9470a3ddf8e3cafa07b",
41
+ "sha256_canonical_json": "a872a0bf1abf829d87ca05b73f47dbb3f817aca4152688cf00d2dd0ea24f9a7e"
42
+ }
43
+ ]
44
+ }
@@ -0,0 +1,230 @@
1
+ {
2
+ "klickd_version": "4.0",
3
+ "payload_schema_version": "4.0.0-preview.1",
4
+ "domain_schema_version": "v4-starter-1.0",
5
+ "created_at": "2026-05-26T00:00:00Z",
6
+ "encrypted": false,
7
+ "domain": "research",
8
+ "profile_kind": "researcher",
9
+ "_pack_metadata": {
10
+ "kind": "starter_skill_pack",
11
+ "non_normative": true,
12
+ "claims_v41_ga": false,
13
+ "contains_real_pii": false,
14
+ "contains_secrets": false,
15
+ "see_readme": "examples/v4/starter-skills/README.md",
16
+ "note": "Non-normative starter skill pack on the v4.0 envelope."
17
+ },
18
+ "x_klickd_pack": {
19
+ "pack": "x.klickd/research",
20
+ "pack_version": "0.1.0-starter",
21
+ "spec_ref": "examples/v4/starter-skills/README.md",
22
+ "publisher": {
23
+ "name": "klickd",
24
+ "ref": "https://klickd.app"
25
+ },
26
+ "frameworks": [
27
+ {
28
+ "scheme": "esco",
29
+ "version": "v1.1.1",
30
+ "iri_prefix": "http://data.europa.eu/esco/skill/",
31
+ "canonical_url": "https://esco.ec.europa.eu/en/classification/skill_main"
32
+ },
33
+ {
34
+ "scheme": "digcomp",
35
+ "version": "2.2",
36
+ "iri_prefix": "https://joint-research-centre.ec.europa.eu/digcomp/2.2/",
37
+ "canonical_url": "https://joint-research-centre.ec.europa.eu/digcomp_en"
38
+ },
39
+ {
40
+ "scheme": "lifecomp",
41
+ "version": "2020",
42
+ "iri_prefix": "https://joint-research-centre.ec.europa.eu/lifecomp/2020/",
43
+ "canonical_url": "https://joint-research-centre.ec.europa.eu/lifecomp_en"
44
+ },
45
+ {
46
+ "scheme": "eqf",
47
+ "version": "2017",
48
+ "iri_prefix": "https://europa.eu/europass/eqf/",
49
+ "canonical_url": "https://europa.eu/europass/en/europass-tools/european-qualifications-framework"
50
+ }
51
+ ],
52
+ "base_transversal_core": {
53
+ "frameworks": [
54
+ {
55
+ "scheme": "esco",
56
+ "version": "v1.1.1"
57
+ },
58
+ {
59
+ "scheme": "digcomp",
60
+ "version": "2.2"
61
+ },
62
+ {
63
+ "scheme": "lifecomp",
64
+ "version": "2020"
65
+ },
66
+ {
67
+ "scheme": "eqf",
68
+ "version": "2017"
69
+ }
70
+ ],
71
+ "transversal_refs": [
72
+ {
73
+ "competency_ref": "esco:S2",
74
+ "scheme": "esco",
75
+ "prefLabel": "information skills"
76
+ },
77
+ {
78
+ "competency_ref": "digcomp:1.2",
79
+ "scheme": "digcomp",
80
+ "prefLabel": "Evaluating data, information and digital content"
81
+ },
82
+ {
83
+ "competency_ref": "lifecomp:L2",
84
+ "scheme": "lifecomp",
85
+ "prefLabel": "Critical thinking"
86
+ }
87
+ ]
88
+ },
89
+ "competencies": [
90
+ {
91
+ "competency_ref": "esco:S2",
92
+ "scheme": "esco",
93
+ "prefLabel": "information skills"
94
+ },
95
+ {
96
+ "competency_ref": "digcomp:1.2",
97
+ "scheme": "digcomp",
98
+ "prefLabel": "Evaluating data, information and digital content"
99
+ },
100
+ {
101
+ "competency_ref": "digcomp:1.3",
102
+ "scheme": "digcomp",
103
+ "prefLabel": "Managing data, information and digital content"
104
+ },
105
+ {
106
+ "competency_ref": "lifecomp:L2",
107
+ "scheme": "lifecomp",
108
+ "prefLabel": "Critical thinking"
109
+ }
110
+ ],
111
+ "levels": [
112
+ {
113
+ "framework_ref": "https://europa.eu/europass/eqf/level/7",
114
+ "level_label": "EQF level 7",
115
+ "effective_at": "2026-05-26"
116
+ }
117
+ ],
118
+ "language_proficiency": [],
119
+ "mastery": [],
120
+ "claim_grounding": {
121
+ "policy": "every_factual_claim_with_date_or_attribution_requires_source",
122
+ "preferred_sources": [
123
+ "peer_reviewed",
124
+ "primary_source",
125
+ "official_registry"
126
+ ],
127
+ "fallback_sources": [
128
+ "tool:web_search"
129
+ ],
130
+ "forbidden_sources": [
131
+ "unverified_social_media"
132
+ ],
133
+ "citation_shape_ref": "rfc-002#8b",
134
+ "replication_expected_when": "quantitative_result_or_dated_event"
135
+ },
136
+ "verification_artifacts_policy": {
137
+ "shape_ref": "rfc-003#verification_artifacts",
138
+ "required_for": [
139
+ "empirical_claim",
140
+ "quantitative_result",
141
+ "policy_recommendation"
142
+ ],
143
+ "pointer_only": true
144
+ },
145
+ "gates": {
146
+ "verification_gates_default": {
147
+ "raise_only": true,
148
+ "claim_grounding_required": true,
149
+ "reversibility_threshold": "low"
150
+ },
151
+ "human_veto_policy": {
152
+ "owner": "human_carrier",
153
+ "scope": [
154
+ "publication",
155
+ "claim_attribution",
156
+ "data_release"
157
+ ]
158
+ }
159
+ },
160
+ "human_authority": {
161
+ "final_decision_owner": "human_carrier",
162
+ "agent_role": "advisory",
163
+ "escalation": "human_carrier_only"
164
+ },
165
+ "memory_scope": "memory.x_klickd.research",
166
+ "structured_memory": {
167
+ "scope": "memory.x_klickd.research",
168
+ "policy": "pack_scoped_only",
169
+ "entries": []
170
+ },
171
+ "evidence_policy": {
172
+ "required_for_claims": true,
173
+ "pointer_only": true,
174
+ "attestation_shape_ref": "rfc-002#8b"
175
+ },
176
+ "source_policy": {
177
+ "allow_inline_definitions": false,
178
+ "language_tags": [
179
+ "en",
180
+ "fr"
181
+ ]
182
+ },
183
+ "verification_gates": {
184
+ "version": 1,
185
+ "user_default": "silent",
186
+ "gates": [
187
+ {
188
+ "id": "uncited-claim",
189
+ "action_class": "factual_claim_without_citation",
190
+ "level": "block",
191
+ "reason": "Research pack: every factual claim must carry a source pointer."
192
+ },
193
+ {
194
+ "id": "quantitative-result",
195
+ "action_class": "quantitative_result",
196
+ "level": "confirm",
197
+ "reason": "Quantitative results require verification artefact (RFC-003 §verification_artifacts)."
198
+ },
199
+ {
200
+ "id": "publication",
201
+ "action_class": "publication",
202
+ "level": "block",
203
+ "reason": "No publication step from the agent; human authority required."
204
+ },
205
+ {
206
+ "id": "data-release",
207
+ "action_class": "data_release",
208
+ "level": "block",
209
+ "reason": "Data release requires explicit human consent; reversibility threshold low."
210
+ }
211
+ ]
212
+ },
213
+ "router_cost": {
214
+ "tokens_estimate": 800,
215
+ "baseline": "base_plus_one"
216
+ },
217
+ "forbidden_fields": [
218
+ "pedagogy",
219
+ "teaching_method",
220
+ "socratic_steps",
221
+ "prompt_strategy",
222
+ "scoring_rubric",
223
+ "intervention_policy",
224
+ "tone_rules",
225
+ "system_prompt_overrides",
226
+ "knowledge.mastered",
227
+ "mastered_topics"
228
+ ]
229
+ }
230
+ }