File size: 13,958 Bytes
9425aed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
<!-- BADGES -->
<p align="center">
  <img src="https://img.shields.io/badge/version-v1.0.0-007ec6?style=flat-square" alt="version"/>
  <img src="https://img.shields.io/badge/license-SSL_v1.0-8e44ad?style=flat-square" alt="license: SSL v1.0"/>
  <img src="https://img.shields.io/badge/license-Apache_2.0-blue?style=flat-square" alt="license: Apache 2.0"/>
  <img src="https://img.shields.io/badge/language-Prolog_%2B_Rust-c0392b?style=flat-square" alt="language"/>
  <img src="https://img.shields.io/badge/async-tokio-2e86c1?style=flat-square" alt="async: tokio"/>
  <img src="https://img.shields.io/badge/audit-WORM_sealed-00b894?style=flat-square" alt="WORM sealed"/>
</p>

<h1 align="center">Claude's Harness for Any AI Model</h1>

<p align="center">
  A declarative Prolog identity kernel that governs any AI agent.<br/>
  Swap the adapter. The harness never changes.
</p>

<p align="center">
  <strong>Dual-licensed:</strong>
  <a href="LICENSE">Sovereign Source License v1.0</a> Β·
  <a href="LICENSE-APACHE">Apache License 2.0</a>
</p>

---

## What It Is

Most AI model wrappers are code. This is **policy as data**.

Every AI deployment conflates three things that should be separate:

```

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

β”‚                    TYPICAL AI WRAPPER                       β”‚

β”‚                                                             β”‚

β”‚   if model == "claude": do_this()                           β”‚

β”‚   if role == "devops":  allow_that()   ← code = policy     β”‚

β”‚   if action == "bad":   block()        ← untestable mess    β”‚

β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

β”‚                    CLAUDE'S HARNESS                         β”‚

β”‚                                                             β”‚

β”‚   IDENTITY      who is this agent?    core/identity.pl      β”‚

β”‚   HARNESS       how do we query it?   core/harness.pl       β”‚

β”‚   ADAPTER       swap the agent        adapters/*.pl         β”‚

β”‚                                                             β”‚

β”‚   Policy is facts. Engine is Prolog. Zero code changes      β”‚

β”‚   to swap from Claude β†’ BOB β†’ FORGE β†’ any agent.           β”‚

β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

```

---

## Architecture

```

                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

                        β”‚       YOUR APPLICATION        β”‚

                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                                       β”‚ can_run(Task, Role)

                                       β–Ό

                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

                        β”‚        core/harness.pl        β”‚

                        β”‚                               β”‚

                        β”‚  can_run/2                    β”‚

                        β”‚  harness_report/0             β”‚

                        β”‚  audit_principles/0           β”‚

                        β”‚  audit_competencies/0         β”‚

                        β”‚  audit_prohibitions/0         β”‚

                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                                       β”‚ consults

                                       β–Ό

                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

                        β”‚       core/identity.pl        │◄── cp adapters/bob.pl core/identity.pl

                        β”‚                               β”‚

                        β”‚  persona(claude)              β”‚

                        β”‚  governing_principle(safety)  β”‚

                        β”‚  prohibited_action(...)       β”‚

                        β”‚  competency(devops_specialist)β”‚

                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜



    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

    β”‚  claude.pl   β”‚   β”‚   bob.pl     β”‚   β”‚  forge.pl    β”‚   β”‚  carto.pl    β”‚

    β”‚  (default)   β”‚   β”‚  sovereign   β”‚   β”‚  code agent  β”‚   β”‚  spatial     β”‚

    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

              adapters/ β€” drop any of these over core/identity.pl

```

---

## Decision Flow

```

  YOUR CODE calls can_run(Task, Role)

         β”‚

         β–Ό

  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

  β”‚  Is Role in competency/1?   │──── NO ──► DENY

  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                 β”‚ YES

                 β–Ό

  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

  β”‚  Is Task in prohibited_     │──── YES ──► DENY

  β”‚  action/1?                  β”‚

  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                 β”‚ NO

                 β–Ό

              PERMIT

```

---

## Quick Start

```bash

# Requires SWI-Prolog  https://www.swi-prolog.org/Download.html



git clone https://github.com/SNAPKITTYWEST/claudes-harness

cd claudes-harness

swipl -l core/harness.pl

```

```prolog

?- harness_report.



=== HARNESS REPORT ===

  Persona : claude (active)

  Governing Principles:

    PRINCIPLE: safety

    PRINCIPLE: accuracy

    PRINCIPLE: neutrality

    PRINCIPLE: transparency

  Competencies:

    COMPETENCY: devops_specialist

    COMPETENCY: system_architecture

    COMPETENCY: enterprise_communications

    COMPETENCY: organizational_design

  Prohibited Actions:

    PROHIBITED: provide_medical_advice

    PROHIBITED: provide_legal_advice

    PROHIBITED: provide_financial_advice

======================



?- can_run(configure_aws_infrastructure, devops_specialist).

HARNESS: PERMIT  configure_aws_infrastructure / devops_specialist

true.



?- can_run(provide_medical_advice, devops_specialist).

HARNESS: DENY    provide_medical_advice / devops_specialist

false.

```

---

## Swap to a Different Agent

```bash

# Switch to BOB sovereign runtime

cp adapters/bob.pl core/identity.pl

swipl -l core/harness.pl

?- harness_report.

```

The harness doesn't care. Same API. Different facts.

---

## Run Tests

```bash

swipl -g "consult('tests/test_harness.pl'), run_tests, halt."



% Expected:

% Test suite: harness

%   Test persona_is_claude: passed

%   Test status_active: passed

%   Test safety_principle: passed

%   Test permitted_action: passed

%   Test prohibited_medical: passed

%   Test prohibited_legal: passed

%   Test prohibited_financial: passed

%   Test devops_qualified: passed

%   Test can_execute_devops_task: passed

%   Test cannot_execute_prohibited: passed

% All tests passed.

```

---

## Write Your Own Adapter

Copy this template to `adapters/my_agent.pl`:

```prolog

% Required facts β€” every adapter must define these

persona(my_agent_name).

status(active).                        % active | suspended | sandboxed



governing_principle(safety).           % add as many as needed

governing_principle(accuracy).



prohibited_action(do_harmful_thing).   % add as many as needed



% Required rules β€” copy these verbatim

permitted(Action) :- \+ prohibited_action(Action).



competency(my_domain).

qualified(Role) :- competency(Role).

can_execute(Task, Role) :- qualified(Role), permitted(Task).



% Optional β€” role descriptions

role_definition(my_domain, "Description of what this domain covers.").

```

Then deploy:

```bash

cp adapters/my_agent.pl core/identity.pl

swipl -l core/harness.pl

?- harness_report.

```

---

## Adapter Contract

| Fact | Arity | Required | Notes |
|------|-------|----------|-------|
| `persona/1` | atom | yes | model name |
| `status/1` | atom | yes | `active` \| `suspended` \| `sandboxed` |
| `governing_principle/1` | atom | yes | at least one |
| `prohibited_action/1` | atom | yes | at least one |
| `competency/1` | atom | yes | at least one domain |
| `permitted/1` | rule | yes | `\+ prohibited_action` |
| `can_execute/2` | rule | yes | `qualified + permitted` |
| `role_definition/2` | fact | no | human-readable descriptions |

---

## Why Prolog

| Property | What it means in practice |
|----------|--------------------------|
| **Policy is logic** | `permitted(X) :- \+ prohibited_action(X)` is a theorem, not a branch |
| **Closed world** | Unknown action = denied. No gap between "not listed" and "allowed" |
| **Auditable** | `harness_report/0` prints complete agent state β€” no hidden config |
| **Declarative** | You state what is true. The engine derives what follows. |
| **Zero deps** | Pure SWI-Prolog. No packages, no build step, no runtime surprises |

---

## Repo Structure

```

claudes-harness/

β”œβ”€β”€ core/

β”‚   β”œβ”€β”€ identity.pl        Claude default identity

β”‚   └── harness.pl         Runtime API

β”œβ”€β”€ adapters/

β”‚   β”œβ”€β”€ bob.pl             BOB sovereign runtime

β”‚   └── README.md          How to write adapters

β”œβ”€β”€ tests/

β”‚   └── test_harness.pl    10 plunit tests

β”œβ”€β”€ docs/

β”‚   └── badges.svg         Status badges

β”œβ”€β”€ CHANGELOG.md           Version history

β”œβ”€β”€ LICENSE                Sovereign Source License v1.0

β”œβ”€β”€ LICENSE-APACHE         Apache License 2.0

└── README.md

```

---


---

## Plasma Gate Governance

Every agent adapter in `adapters/` that touches corpus data must declare:

```prolog

prohibited_action(bypass_plasma_gate).

prohibited_action(emit_unsigned_output).

```

This means no agent governed by this harness can route corpus records around `sovereign-transformer`. The gate is not a suggestion in the code β€” it is a closed-world fact. If `bypass_plasma_gate` is not in `prohibited_action/1`, the adapter does not ship.

```

  claudes-harness (this repo)              sovereign-transformer

  ─────────────────────────────────        ─────────────────────────────

  prohibited_action(bypass_plasma_gate) ──► plasma_gate.asm  (x86-64)

  prohibited_action(emit_unsigned_output)   transformer.dl   (SoufflΓ©)

                                            rust/gate.rs     (HTTP POST /gate)



  No agent governed here can skip any of these three layers.

```

Current adapters and their gate stance:

| Adapter | bypass_plasma_gate | emit_unsigned_output | redefine_dan_term |
|---|---|---|---|
| `claude.pl` | prohibited | prohibited | β€” |
| `bob.pl` | prohibited | prohibited | β€” |
| `forge.pl` | prohibited | prohibited | prohibited |

Add `prohibited_action(bypass_plasma_gate).` to every new adapter. No exceptions.


## Sovereign Stack

This repo is the identity and trust layer of the SnapKitty Sovereign Stack:

```

  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

  β”‚              SNAPKITTY SOVEREIGN STACK              β”‚

  β”‚                                                     β”‚

  β”‚  sovereign-array     Lean 4 APL kernel              β”‚

  β”‚                      zero-sorry proofs              β”‚

  β”‚                            β–²                        β”‚

  β”‚                            β”‚ verified steps         β”‚

  β”‚  claudes-harness    ────────                        β”‚

  β”‚  (this repo)               β”‚ governed agents        β”‚

  β”‚  Prolog identity           β–Ό                        β”‚

  β”‚  + trust layer      sovereign-transformer           β”‚

  β”‚                     Datalog + x86 corpus gate       β”‚

  β”‚                            β”‚                        β”‚

  β”‚                            β–Ό                        β”‚

  β”‚                     Bifrost WORM receipt            β”‚

  β”‚                     Ed25519 + Blake3                β”‚

  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

```

---

## Version History

See [CHANGELOG.md](CHANGELOG.md) β€” current release: **v1.0.0**

---

<p align="center">
  Built by SnapKitty West Β· <a href="https://snapkittywest.github.io">snapkittywest.github.io</a><br/>
  Dual-licensed: <a href="LICENSE">Sovereign Source v1.0</a> + <a href="LICENSE-APACHE">Apache 2.0</a><br/>
  Evidence or Silence β€” 2026
</p>