PageSourceSearch

https://tn-proto.org/use-with-your-agent

html tn-proto.org collected 2026-10-02 01:07:32 UTC 55,841 bytes, 1,202 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4<meta charset="UTF-8">
5<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
6<meta name="description" content="Equip Claude Code, Cursor, and OpenAI assistants with TN logging skills. Automatic PII routing, callsite sealing, and secure code generation.">
7<meta name="robots" content="index,follow">
8<link rel="canonical" href="https://tn-proto.org/use-with-your-agent">
9<link rel="icon" type="image/svg+xml" href="/favicon.svg">
10<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
11<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
12<link rel="manifest" href="/site.webmanifest">
13<meta name="theme-color" content="#0a1318">
14<meta property="og:type" content="website">
15<meta property="og:site_name" content="tn-proto">
16<meta property="og:title" content="AI Agent Skills &amp; Integrations — tn-proto">
17<meta property="og:description" content="Equip Claude Code, Cursor, and OpenAI assistants with TN logging skills. Automatic PII routing, callsite sealing, and secure code generation.">
18<meta property="og:url" content="https://tn-proto.org/use-with-your-agent">
19<meta property="og:image" content="https://tn-proto.org/og.png">
20<meta property="og:image:width" content="1200">
21<meta property="og:image:height" content="630">
22<meta name="twitter:card" content="summary_large_image">
23<meta name="twitter:title" content="AI Agent Skills &amp; Integrations — tn-proto">
24<meta name="twitter:description" content="Equip Claude Code, Cursor, and OpenAI assistants with TN logging skills. Automatic PII routing, callsite sealing, and secure code generation.">
25<meta name="twitter:image" content="https://tn-proto.org/og.png">
26<title>Use TN with your agent. tn-proto</title>
27<link rel="preconnect" href="https://fonts.googleapis.com">
28<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
29<link href="https://fonts.googleapis.com/css2?family=PT+Serif:ital,wght@0,400;0,700;1,400&family=Raleway:wght@300;400;500;600&display=swap" rel="stylesheet">
30<style>
31:root {
32  --bg:        #fbfbfb;
33  --surface:   #ffffff;
34  --ink:       #2a2a2a;
35  --ink-soft:  #3f3f3f;
36  --ink-deep:  #111111;
37  --muted:     #6f6f6f;
38  --hair:      #ededed;
39  --hair-soft: #f2f3f5;
40  --shadow:    0 0 5px #d8ddec;
41  --shadow-lg: 0 8px 24px rgba(168, 178, 209, 0.25);
42  --serif:     "PT Serif", Georgia, serif;
43  --sans:      "Raleway", "Century Gothic", sans-serif;
44  --mono:      "SF Mono", "Fira Code", Consolas, monospace;
45  --max:       760px;
46}
47
48* { box-sizing: border-box; margin: 0; padding: 0; }
49html, body { background: var(--bg); }
50body {
51  font-family: var(--sans); font-weight: 300; font-size: 16px;
52  line-height: 1.8; color: var(--ink);
53  -webkit-font-smoothing: antialiased;
54}
55a {
56  color: var(--ink-soft);
57  text-decoration: underline; text-underline-offset: 3px;
58  text-decoration-color: #cfd4dc; transition: color .2s, text-decoration-color .2s;
59}
60a:hover { color: #222; text-decoration-color: var(--ink-soft); }
61
62/* Nav */
63.nav {
64  position: fixed; top: 0; left: 0; right: 0; height: 70px;
65  display: flex; align-items: center; justify-content: space-between;
66  padding: 0 36px;
67  background: #fff; border-bottom: 1px solid var(--hair); z-index: 50;
68}
69.product-name {
70  font-family: "Century Gothic", var(--sans);
71  font-size: 1.5em; font-weight: 400; color: var(--ink);
72  letter-spacing: 0.02em; text-decoration: none;
73}
74/* --- cyaxios brand-mark (injected) --- */
75.product-name {
76  display: inline-flex;
77  align-items: center;
78  gap: 10px;
79  text-decoration: none;
80}
81.product-name .brand-mark {
82  width: clamp(22px, 3.4vw, 30px);
83  height: clamp(22px, 3.4vw, 30px);
84  flex: 0 0 auto;
85  display: block;
86}
87@media (max-width: 480px) {
88  .product-name { gap: 8px; }
89  .product-name .brand-mark { width: 22px; height: 22px; }
90  .product-name span { font-size: 1.25em; }
91}
92/* --- end cyaxios brand-mark --- */
93
94.nav-links { display: flex; gap: 8px; }
95.nav-links a {
96  font-size: 13px; font-weight: 500; letter-spacing: 0.12em;
97  text-transform: uppercase; color: var(--ink-soft);
98  padding: 8px 18px; border: 1px solid transparent;
99  border-radius: 2px; transition: all .2s; text-decoration: none;
100}
101.nav-links a:hover { border-color: var(--ink-soft); }
102.nav-links a.nav-cta {
103  color: #fff; background: var(--ink-deep); border-color: var(--ink-deep);
104}
105.nav-links a.nav-cta:hover { background: #4d4d4d; border-color: #4d4d4d; box-shadow: var(--shadow); }
106
107/* Article */
108main { padding-top: 70px; }
109.article { max-width: var(--max); margin-left: auto; margin-right: auto; padding: 80px 32px 120px; width: 100%; }
110.article > * { max-width: 100%; }
111.article-hero { text-align: left; margin: 0 0 8px; }
112.eyebrow {
113  font-family: var(--sans); font-size: 12px; font-weight: 500;
114  line-height: 22px; letter-spacing: 6px; text-transform: uppercase;
115  color: var(--muted); margin-bottom: 20px; text-align: left;
116}
117.article h1 {
118  font-family: var(--serif); font-size: clamp(34px, 5vw, 48px);
119  font-weight: 400; line-height: 1.2; color: var(--ink-deep);
120  margin-bottom: 20px; text-align: left; letter-spacing: -0.005em;
121}
122.article h1 em { font-style: italic; color: var(--ink); }
123.lede {
124  font-family: var(--serif); font-size: 19px; line-height: 1.65;
125  color: var(--ink-soft); text-align: left;
126  margin: 0 0 56px; max-width: 580px;
127}
128.article h2 {
129  font-family: var(--serif); font-size: 26px; font-weight: 400;
130  color: var(--ink-deep); margin: 56px 0 16px;
131}
132.article h3 {
133  font-family: var(--serif); font-size: 20px; font-weight: 400;
134  color: var(--ink-deep); margin: 32px 0 10px;
135}
136.article p { margin: 14px 0; }
137.article p strong { color: var(--ink-deep); font-weight: 600; }
138.article ul, .article ol { margin: 16px 0 16px 22px; padding-left: 0; }
139.article li { margin-bottom: 8px; padding-left: 4px; }
140
141/* Callout */
142.callout {
143  background: #fff; border-radius: 4px;
144  padding: 24px 28px; box-shadow: var(--shadow);
145  margin: 32px 0; border-left: 3px solid var(--ink-deep);
146}
147.callout .callout-label {
148  font-family: var(--sans); font-size: 11px; font-weight: 600;
149  letter-spacing: 0.18em; text-transform: uppercase;
150  color: var(--muted); margin-bottom: 8px;
151}
152.callout p { margin: 6px 0; font-size: 15px; }
153
154/* Code block */
155pre.code-block {
156  background: #2a3333; color: #d8d2c4;
157  font-weight: 500;
158  border-radius: 4px; padding: 20px 24px;
159  font-family: var(--mono); font-size: 13.5px; line-height: 1.8;
160  margin: 24px 0; overflow-x: auto;
161  box-shadow: 0 6px 20px rgba(42, 51, 51, 0.18);
162}
163pre.code-block .comment { color: #a8b0b0; font-weight: 400; }
164pre.code-block .cmd     { color: #d4e157; font-weight: 500; }
165code {
166  font-family: var(--mono); font-size: 0.92em;
167  background: var(--hair-soft); color: var(--ink-deep);
168  padding: 1px 6px; border-radius: 2px;
169  overflow-wrap: anywhere; word-break: break-word;
170}
171
172/* Skill cards */
173.skills {
174  display: grid; grid-template-columns: repeat(2, 1fr);
175  gap: 18px; margin: 28px 0;
176}
177.skill {
178  background: #fff; border-radius: 4px;
179  padding: 22px 24px; box-shadow: var(--shadow);
180  transition: box-shadow .3s, transform .3s;
181}
182.skill:hover { box-shadow: var(--shadow-lg); transform: translateY(-2px); }
183.skill .slug {
184  font-family: var(--mono); font-size: 11px; color: var(--muted);
185  letter-spacing: 0.06em; margin-bottom: 4px;
186}
187.skill h3 {
188  font-family: var(--serif); font-size: 18px; font-weight: 400;
189  color: var(--ink-deep); margin-bottom: 8px;
190}
191.skill p { font-size: 14px; line-height: 1.65; color: var(--ink); margin: 0; }
192
193/* Industries table */
194.industries {
195  width: 100%; border-collapse: collapse;
196  margin: 28px 0 24px;
197  font-size: 14.5px; line-height: 1.6;
198  background: #fff; border-radius: 4px;
199  box-shadow: var(--shadow); overflow: hidden;
200}
201.industries th, .industries td {
202  text-align: left; vertical-align: top;
203  padding: 14px 16px; border-bottom: 1px solid var(--hair);
204}
205.industries thead th {
206  font-family: var(--sans); font-size: 11px; font-weight: 600;
207  letter-spacing: 0.14em; text-transform: uppercase;
208  color: var(--muted); background: var(--hair-soft);
209}
210.industries td:first-child {
211  color: var(--ink-deep); font-weight: 500;
212  white-space: nowrap; font-family: var(--serif);
213}
214.industries td:nth-child(2) {
215  font-family: var(--mono); font-size: 12.5px;
216  color: var(--ink-soft); white-space: nowrap;
217}
218.industries td:nth-child(3) { color: var(--ink); }
219.industries tbody tr:last-child td { border-bottom: 0; }
220
221/* Conversation mock */
222.chat {
223  background: #fff; border-radius: 4px;
224  padding: 24px 28px; box-shadow: var(--shadow);
225  margin: 28px 0;
226}
227.chat-row { display: flex; gap: 12px; margin: 10px 0; align-items: flex-start; }
228.chat-avatar {
229  width: 26px;
229 height: 26px; border-radius: 50%;
230  display: flex; align-items: center; justify-content: center;
231  font-size: 11px; font-weight: 600;
232  flex-shrink: 0;
233}
234.chat-avatar.you   { background: #eef1f3; color: var(--ink-deep); }
235.chat-avatar.agent { background: var(--ink-deep); color: #fff; }
236.chat-body { font-size: 14.5px; line-height: 1.6; color: var(--ink); flex: 1; padding-top: 2px; }
237.chat-body b { color: var(--ink-deep); font-weight: 600; }
238.chat-body code { font-size: 12.5px; }
239.chat-agent {
240  font-family: var(--serif); font-style: italic;
241  color: var(--ink-soft);
242}
243
244/* Back */
245.back-link {
246  display: inline-block; margin-top: 56px;
247  font-family: var(--sans); font-size: 13px; font-weight: 500;
248  letter-spacing: 0.1em; text-transform: uppercase;
249  color: var(--ink-soft); text-decoration: none;
250  border: 1px solid var(--ink-soft);
251  padding: 10px 22px; border-radius: 2px; transition: all .2s;
252}
253.back-link:hover {
254  color: #fff; background: var(--ink-deep);
255  border-color: var(--ink-deep); text-decoration: none; box-shadow: var(--shadow);
256}
257
258/* Footer */
259.footer {
260  padding: 48px 0; text-align: center;
261  font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase;
262  color: var(--muted); border-top: 1px solid var(--hair); background: #fff;
263}
264.footer a { color: var(--muted); text-decoration: none; }
265.footer a:hover { color: var(--ink); }
266.footer .sep { margin: 0 14px; }
267.footer .tn-tagline {
268  display: block;
269  font-family: "Century Gothic", "TeXGyreAdventor", var(--sans);
270  font-size: 17px;
271  letter-spacing: 0.02em;
272  text-transform: none;
273  color: var(--ink-soft);
274  margin: 0 auto 8px;
275  max-width: 540px;
276  font-weight: 400;
277  line-height: 1.55;
278}
279.footer .tn-tagline .tn-mark {
280  font-weight: 300;
281  color: var(--muted);
282}
283.footer .tn-wordmark {
284  display: block;
285  font-size: 12px;
286  letter-spacing: 0.18em;
287  text-transform: uppercase;
288  color: var(--ink);
289  margin: 0 0 24px;
290  font-weight: 500;
291}
292
293.hamburger {
294  display: none; width: 38px; height: 38px;
295  border: 1px solid transparent; background: transparent;
296  border-radius: 3px; cursor: pointer; padding: 0; position: relative;
297}
298.hamburger:hover { border-color: var(--ink-soft); }
299.hamburger span {
300  position: absolute; left: 9px; right: 9px; height: 1.5px;
301  background: var(--ink);
302  transition: transform .22s ease, top .22s ease, opacity .15s ease;
303}
304.hamburger span:nth-child(1) { top: 12px; }
305.hamburger span:nth-child(2) { top: 18px; }
306.hamburger span:nth-child(3) { top: 24px; }
307.hamburger.open span:nth-child(1) { top: 18px; transform: rotate(45deg); }
308.hamburger.open span:nth-child(2) { opacity: 0; }
309.hamburger.open span:nth-child(3) { top: 18px; transform: rotate(-45deg); }
310
311@media (max-width: 760px) {
312  .nav { padding: 0 20px; height: 64px; }
313  main { padding-top: 64px; }
314  .article { padding: 56px 20px 80px; }
315  .skills { grid-template-columns: 1fr; }
316  .industries { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
317
318  .hamburger { display: block; }
319  .nav-links {
320    position: absolute; top: 64px; left: 0; right: 0;
321    flex-direction: column; gap: 0;
322    background: #fff; border-bottom: 1px solid var(--hair);
323    padding: 10px 16px 18px;
324    transform: translateY(-8px); opacity: 0; pointer-events: none;
325    transition: transform .2s ease, opacity .18s ease;
326    box-shadow: 0 10px 24px rgba(168, 178, 209, 0.18);
327  }
328  .nav-links.open { transform: translateY(0); opacity: 1; pointer-events: auto; }
329  .nav-links a {
330    width: 100%; padding: 12px 14px;
331    border: 0; border-bottom: 1px solid var(--hair);
332    border-radius: 0; text-align: left;
333  }
334  .nav-links a:last-child { border-bottom: 0; }
335  .nav-links a.nav-cta { margin-top: 10px; border-radius: 3px; text-align: center; }
336}
337
338/* Standardized mobile-extra navigation links styling */
339.nav-links a.nav-mobile-extra { display: none; }
340@media (max-width: 760px) {
341  .nav-links a.nav-mobile-extra { display: block; }
342}
343@media (max-width: 720px) {
344  .nav-links a.nav-mobile-extra { display: block; }
345}
346
347/* Code block wrapper with copy button */
348.code-wrapper {
349  position: relative;
350  margin: 16px 0;
351}
352.code-wrapper pre.code-block {
353  margin: 0;
354}
355.copy-btn {
356  position: absolute;
357  top: 12px;
358  right: 12px;
359  background: rgba(255, 255, 255, 0.08);
360  border: 1px solid rgba(255, 255, 255, 0.15);
361  color: #a8b0b0;
362  border-radius: 4px;
363  padding: 6px 10px;
364  font-size: 11px;
365  font-family: var(--sans);
366  cursor: pointer;
367  transition: all 0.2s;
368  display: flex;
369  align-items: center;
370  gap: 6px;
371  z-index: 10;
372}
373.copy-btn:hover {
374  background: rgba(255, 255, 255, 0.18);
375  color: #fff;
376  border-color: rgba(255, 255, 255, 0.3);
377}
378.copy-btn:active {
379  transform: scale(0.95);
380}
381.copy-btn.copied {
382  background: #2f7d6b;
383  color: #fff;
384  border-color: #2f7d6b;
385}
386
387/* Tabs implementation for Getting Started */
388.setup-tabs-container {
389  margin-top: 18px;
390}
391.setup-tabs {
392  display: flex;
393  border-bottom: 1px solid var(--hair);
394  margin-bottom: 16px;
395  gap: 4px;
396}
397.setup-tab {
398  font-family: var(--sans);
399  font-size: 12px;
400  font-weight: 500;
401  padding: 8px 14px;
402  border: 1px solid transparent;
403  border-bottom: 0;
404  border-radius: 4px 4px 0 0;
405  color: var(--muted);
406  background: transparent;
407  cursor: pointer;
408  white-space: nowrap;
409  transition: all 0.2s;
410  margin-bottom: -1px;
411}
412.setup-tab:hover {
413  color: var(--ink-soft);
414}
415.setup-tab.active {
416  color: var(--ink-deep);
417  background: #fff;
418  border-color: var(--hair);
419  border-bottom: 1px solid #fff;
420  font-weight: 600;
421}
422.setup-pane {
423  display: none;
424}
425.setup-pane.active {
426  display: block;
427}
428
429/* Tabs for environment guides */
430.guide-tabs-container {
431  margin: 40px 0;
432}
433.guide-tabs {
434  display: flex;
435  border-bottom: 1px solid var(--hair);
436  margin-bottom: 24px;
437  overflow-x: auto;
438  gap: 8px;
439}
440.guide-tab {
441  font-family: var(--sans);
442  font-size: 13px;
443  font-weight: 500;
444  padding: 10px 16px;
445  border: 1px solid transparent;
446  border-bottom: 0;
447  border-radius: 4px 4px 0 0;
448  color: var(--muted);
449  background: transparent;
450  cursor: pointer;
451  white-space: nowrap;
452  transition: all 0.2s;
453  margin-bottom: -1px;
454}
455.guide-tab:hover {
456  color: var(--ink-soft);
457}
458.guide-tab.active {
459  color: var(--ink-deep);
460  background: #fff;
461  border-color: var(--hair);
462  border-bottom: 1px solid #fff;
463  font-weight: 600;
464}
465.guide-pane {
466  display: none;
467}
468.guide-pane.active {
469  display: block;
470}
471</style>
472<script>
473  !function(t,e){var o,n,p,r;e.__SV||(window.posthog&&window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="Ai Ri init Vi Yi Rr zi Gi Zi capture calculateEventProperties en register register_once register_for_session unregister unregister_for_session sn getFeatureFlag getFeatureFlagPayload getFeatureFlagResult isFeatureEnabled reloadFeatureFlags updateFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync an identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset setIdentity clearIdentity get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException addExceptionStep captureLog startExceptionAutocapture stopExceptionAutocapture loadToolbar get_property getSessionProperty rn Ki createPersonProfile setInternalOrTestUser nn $i hn opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing Xi debug Mr tn getPageViewId captureTraceFeedback captureTraceMetric Di".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
474  posthog.init('phc_sfeRUhK27GpkGikNKAqY9AZiXXrzGqGSuK2ueTPTYatR', {
475    api_host: 'https://tn-proto.org/p', ui_host: 'https://us.posthog.com',
476    defaults: '2026-01-30',
477    autocapture: true,
478    capture_pageview: true,
479    capture_pageleave: true,
480    rageclick: true,
481    capture_dead_clicks: true,
482    enable_heatmaps: true,
483    enable_web_vitals: true,
484    disable_session_recording: false,
485    person_profiles: 'always',
486  });
487</script>
487
488<!-- Google tag (gtag.js) -->
vendor: 65 bytes, lines 488-489
488
489<script async src="https://www.googletagmanager.com/gtag/js?id=
489G-N31CBXDHG3
vendor: 13 bytes, line 489
489"></script>
490<script>
491  
vendor: 136 bytes, lines 491-494
491window.dataLayer = window.dataLayer || [];
492  function gtag(){dataLayer.push(arguments);}
493  gtag('js', new Date());
494  gtag('config', '
494G-N31CBXDHG3
vendor: 5 bytes, line 494
494');
495</script>
vendor: 2 bytes, line 495
495
496<script type="application/ld+json">
497{
498  "@context": "https://schema.org",
499  "@type": "WebPage",
500  "description": "Equip Claude Code, Cursor, and OpenAI assistants with TN logging skills. Automatic PII routing, callsite sealing, and secure code generation.",
501  "url": "https://tn-proto.org/use-with-your-agent",
502  "image": "https://tn-proto.org/og.png",
503  "inLanguage": "en",
504  "publisher": {
505    "@type": "Organization",
506    "name": "tn-proto",
507    "url": "https://tn-proto.org/",
508    "logo": {
509      "@type": "ImageObject",
510      "url": "https://tn-proto.org/img/cyaxios-logo.png"
511    }
512  },
513  "name": "AI Agent Skills & Integrations \u2014 tn-proto",
514  "isPartOf": {
515    "@type": "WebSite",
516    "name": "tn-proto",
517    "url": "https://tn-proto.org/"
518  }
519}
520</script>
vendor: 2 bytes, line 520
520
521<script type="application/ld+json">
522{
523  "@context": "https://schema.org",
524  "@type": "BreadcrumbList",
525  "itemListElement": [
526    {
527      "@type": "ListItem",
528      "position": 1,
529      "name": "Home",
530      "item": "https://tn-proto.org/"
531    },
532    {
533      "@type": "ListItem",
534      "position": 2,
535      "name": "AI Agent Skills & Integrations",
536      "item": "https://tn-proto.org/use-with-your-agent"
537    }
538  ]
539}
540</script>
540
541</head>
542<body>
543
544<nav class="nav">
545  <a href="/" class="product-name"><img src="/img/cyaxios-logo-192.png" alt="" class="brand-mark" width="28" height="28"><span>tn-proto</span></a>
546  <button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
547    <span></span><span></span><span></span>
548  </button>
549  <div class="nav-links" id="nav-links">
550    <a href="/how">How</a>
551    <a href="/use-with-your-agent">Agents</a>
552    <a href="/case-study-saleor">Case Studies</a>
553    <a href="/log-compliance">Compliance</a>
554    <a href="/how#pricing">Pricing</a>
555    <a href="/docs/">Docs</a>
556    <a href="https://github.com/cyaxios/tn-proto">GitHub</a>
557    <a href="https://vault.tn-proto.org/signin?return_to=/account" class="nav-cta">Log in</a>
558  </div>
559</nav>
560<script>
561(function () {
562  var h = document.getElementById('hamburger');
563  var links = document.getElementById('nav-links');
564  if (!h || !links) return;
565  function close() { h.classList.remove('open'); links.classList.remove('open'); h.setAttribute('aria-expanded', 'false'); }
566  h.addEventListener('click', function () {
567    var open = !h.classList.contains('open');
568    h.classList.toggle('open', open);
569    links.classList.toggle('open', open);
570    h.setAttribute('aria-expanded', open ? 'true' : 'false');
571  });
572  links.addEventListener('click', function (e) { if (e.target.tagName === 'A') close(); });
573})();
574</script>
574
575
576<main>
577  <article class="article">
578
579    <div class="article-hero">
580      <div class="eyebrow">Agents</div>
581      <h1>Use TN with <em>your agent</em></h1>
582      <p class="lede">
583        Seven skills that give your coding agent a complete picture of TN:
584        write, annotate, read, lint, verify, manage access, and declare policy.
585        The agent already knows the
586        <a href="#industries">standards for your industry</a>: PCI, HIPAA,
587        FHIR, FERPA, FIX, CloudTrail, and eight more.
588      </p>
589    </div>
590
591    <div class="callout" style="border-left-color: #2f7d6b;">
592      <div class="callout-label">Install the skills &mdash; two commands</div>
593      <p>In any Claude Code session:</p>
594      <div class="code-wrapper">
595        <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
596        <pre class="code-block"><span class="cmd">/plugin marketplace add cyaxios/tn-skills
597/plugin install tn-logging@tn-skills</span></pre>
598      </div>
599      <p>For Cursor, Copilot, Codex CLI, or any other agent &mdash; drop the cross-vendor brief into your project root:</p>
600      <div class="code-wrapper">
601        <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
602        <pre class="code-block"><span class="cmd">curl -O https://raw.githubusercontent.com/cyaxios/tn-skills/main/AGENTS.md</span></pre>
603      </div>
604      <p style="font-size: 14px; color: var(--muted); margin-top: 4px;">That&rsquo;s enough. The agent will use the right field names, call the right verbs, and cite the right standard for the code it touches. Continue below if you want the SDK wired up or an MCP server connected.</p>
605    </div>
606
607    <div class="callout">
608      <div class="callout-label">One-time SDK setup, any agent</div>
609      <p>
610        Install the protocol once and scaffold a project. The skills
611        assume both; if either is missing, the agent will tell you.
612      </p>
613      
614      <div class="setup-tabs-container">
615        <div class="setup-tabs" role="tablist" aria-label="Select programming language">
616          <button class="setup-tab active" onclick="switchSetupTab(event, 'setup-python')" role="tab" aria-selected="true" aria-controls="setup-python">Python</button>
617          <button class="setup-tab" onclick="switchSetupTab(event, 'setup-tsjs')" role="tab" aria-selected="false" aria-controls="setup-tsjs">TypeScript / JS</button>
618          <button class="setup-tab" onclick="switchSetupTab(event, 'setup-csharprust')" role="tab" aria-selected="false" aria-controls="setup-csharprust">C# &amp; Rust (Soon)</button>
619        </div>
620        
621        <div id="setup-python" class="setup-pane active" role="tabpanel">
622          <div class="code-wrapper">
623            <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
624            <pre class="code-block"><span class="cmd">pip install tn-proto
625python -m tn.cli init my-project</span></pre>
626          </div>
627          <p>
628            The <code>init</code> command writes <code>my-project/tn.yaml</code>, mints a keystore, and prints a one-time recovery phrase.
629            <span style="display: block; margin-top: 8px; font-size: 0.9em; color: var(--muted);">Published on PyPI as <code>tn-proto</code> &mdash; <code>pip install tn-proto</code> works out of the box.</span>
630          </p>
631        </div>
632        
633        <div id="setup-tsjs" class="setup-pane" role="tabpanel">
634          <div class="code-wrapper">
635            <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
636            <pre class="code-block"><span class="cmd">npm install @cyaxios/tn-proto</span></pre>
637          </div>
638          <p>
639            Initializes the client from your shared <code>tn.yaml</code> file at process startup.
640            <span style="display: block; margin-top: 8px; font-size: 0.9em; color: var(--muted);">Published on npm as <code>@cyaxios/tn-proto</code> &mdash; <code>npm install @cyaxios/tn-proto</code> works out of the box.</span>
641          </p>
642        </div>
643        
644        <div id="setup-csharprust" class="setup-pane" role="tabpanel">
645          <div class="code-wrapper">
646            <pre class="code-block"><span class="comment"># C# NuGet package coming soon:
647# dotnet add package TnProto
648
649# Rust cargo crate coming soon:
650# cargo add tn-proto</span></pre>
651          </div>
652          <p>
653            Native integrations for C# and Rust will be available in the next release cycle.
654          </p>
655        </div>
656      </div>
657    </div>
658
659    <h2>Agent Configuration Guides</h2>
660    <p>
661      Select your preferred coding environment to view copy-pasteable settings, MCP server configs, and project-level agent rules.
662    </p>
663
664    <div class="guide-tabs-container">
665      <div class="guide-tabs" role="tablist" aria-label="Select development environment">
666        <button class="guide-tab active" onclick="switchGuideTab(event, 'guide-claude-code')" role="tab" aria-selected="true" aria-controls="guide-claude-code">Claude Code</button>
667        <button class="guide-tab" onclick="switchGuideTab(event, 'guide-cursor')" role="tab" aria-selected="false" aria-controls="guide-cursor">Cursor</button>
668        <button class="guide-tab" onclick="switchGuideTab(event, 'guide-claude-desktop')" role="tab" aria-selected="false" aria-controls="guide-claude-desktop">Claude Desktop</button>
669        <button class="guide-tab" onclick="switchGuideTab(event, 'guide-exhaust')" role="tab" aria-selected="false" aria-controls="guide-exhaust">Know Your Exhaust</button>
670        <button class="guide-tab" onclick="switchGuideTab(event, 'guide-other')" role="tab" aria-selected="false" aria-controls="guide-other">Other / Custom</button>
671      </div>
672
673      <!-- Claude Code -->
674      <div id="guide-claude-code" class="guide-pane active" role="tabpanel">
675        <h3>1. Install the Plugin (Recommended)</h3>
676        <p>
677          Register the marketplace once, then install the logging plugin. The plugin automatically applies safety guidelines, drafts <code>agents.md</code> policies, and routes fields to the right encryption groups.
678        </p>
679        <div class="code-wrapper">
680          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
681          <pre class="code-block"><span class="comment"># Run inside any Claude Code session</span>
682<span class="cmd">/plugin marketplace add cyaxios/tn-skills
683/plugin install tn-logging@tn-skills</span></pre>
684        </div>
685        <p>Alternatively, install locally from the latest release zip:</p>
686        <div class="code-wrapper">
687          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
688          <pre class="code-block"><span class="comment"># Manual installation from release zip</span>
689<span class="cmd">gh release download v0.5.1a1 --repo cyaxios/tn-skills \
690  --pattern 'tn-skills-claude-code-*.zip'
691unzip tn-skills-claude-code-*.zip -d ~/.claude/plugins/tn-logging</span></pre>
692        </div>
693
694        <h3>2. Connect the TN MCP Server</h3>
695        <p>
696          To allow Claude Code to query the vault, read historical logs, and rotate keys, register the stdio-based MCP server:
697        </p>
698        <div class="code-wrapper">
699          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
700          <pre class="code-block"><span class="comment"># Command to register the server globally or locally</span>
701<span class="cmd">claude mcp add tn tn-mcp-server</span></pre>
702        </div>
703        <p>If the CLI is installed in a python virtual environment, use the Python module wrapper instead:</p>
704        <div class="code-wrapper">
705          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
706          <pre class="code-block"><span class="cmd">claude mcp add tn python -m tn.mcp</span></pre>
707        </div>
708      </div>
709
710      <!-- Cursor -->
711      <div id="guide-cursor" class="guide-pane" role="tabpanel">
712        <h3>1. Project-wide Brief (<code>AGENTS.md</code>)</h3>
713        <p>
714          Cursor automatically indexes the files in your project root. Drop the canonical brief into your workspace root to align Cursor's code-generation engine:
715        </p>
716        <div class="code-wrapper">
717          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
718          <pre class="code-block"><span class="comment"># Download the brief directly to your project root</span>
719<span class="cmd">curl -O https://raw.githubusercontent.com/cyaxios/tn-skills/main/AGENTS.md</span></pre>
720        </div>
721
722        <h3>2. Rules File (<code>.cursorrules</code>)</h3>
723        <p>
724          You can append the following rules to your project's <code>.cursorrules</code> file to enforce secure logging policies on every prompt:
725        </p>
726        <div class="code-wrapper">
727          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
728          <pre class="code-block"><span class="comment"># Append this block to your .cursorrules</span>
729Always use the TN protocol for logging.
730- Python: import tn; tn.info("domain.action", field1=val1)
731- TypeScript: import * as tn from "@cyaxios/tn-proto"; await tn.init();
732- Sensitive fields (emails, IPs, card numbers, amounts) MUST use standard canonical names (email, ip, amount, currency, card_last4) so they route to encrypted groups.
733- Event names must be dotted (domain.action.outcome).
734Refer to AGENTS.md in the project root for full guidelines.</span></pre>
735        </div>
736
737        <h3>3. Register the MCP Server</h3>
738        <p>
739          Enable Cursor to run queries and manage keys directly. In Cursor, navigate to <b>Settings &rarr; Features &rarr; MCP</b>, click <b>+ Add New MCP Server</b>, and input:
740        </p>
741        <ul>
742          <li><b>Name:</b> <code>tn</code></li>
743          <li><b>Type:</b> <code>command</code></li>
744          <li><b>Command:</b> <code>tn-mcp-server</code> (or <code>python -m tn.mcp</code> if using a local project virtual environment)</li>
745        </ul>
746      </div>
747
748      <!-- Claude Desktop -->
749      <div id="guide-claude-desktop" class="guide-pane" role="tabpanel">
750        <h3>Claude Desktop Configuration</h3>
751        <p>
752          To configure the vault connector in your Claude Desktop client, edit your configuration file (located at <code>%APPDATA%\Claude\claude_desktop_config.json</code> on Windows, or <code>~/Library/Application Support/Claude/claude_desktop_config.json</code> on macOS):
753        </p>
754        
755        <p><b>Standard globally installed command:</b></p>
756        <div class="code-wrapper">
757          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
758          <pre class="code-block"><span class="cmd">{
759  "mcpServers": {
760    "tn": {
761      "command": "tn-mcp-server",
762      "cwd": "/path/to/your/project"
763    }
764  }
765}</span></pre>
766        </div>
767
768        <p><b>Virtual Environment (Python-module wrapper):</b></p>
769        <div class="code-wrapper">
770          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
771          <pre class="code-block"><span class="cmd">{
772  "mcpServers": {
773    "tn": {
774      "command": "/path/to/your/venv/bin/python",
775      "args": ["-m", "tn.mcp"],
776      "cwd": "/path/to/your/project"
777    }
778  }
779}</span></pre>
780        </div>
781      </div>
782
783      <!-- Know Your Exhaust -->
784      <div id="guide-exhaust" class="guide-pane" role="tabpanel">
785        <h3>1. Start the Server</h3>
786        <p>
787          Know Your Exhaust (KYE) is a local MCP server that analyzes raw application logs and telemetry, identifies unencrypted PII, and offers to instrument code.
788        </p>
789        <div class="code-wrapper">
790          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
791          <pre class="code-block"><span class="comment"># 1. Install dependencies</span>
792<span class="cmd">pip install -r _lab/exhaust/requirements.txt</span>
793
794<span class="comment"># 2. Run the server (default runs HTTP mode on port 8731)</span>
795<span class="cmd">python _lab/exhaust/server.py http</span></pre>
796        </div>
797
798        <h3>2. Register the MCP Connector</h3>
799        <p>Register the dynamic audit connector with your preferred agent:</p>
800        
801        <p><b>Claude Code:</b></p>
802        <div class="code-wrapper">
803          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
804          <pre class="code-block"><span class="cmd">claude mcp add --transport http know-your-exhaust http://127.0.0.1:8731/mcp</span></pre>
805        </div>
806
807        <p><b>Claude Desktop Config (HTTP transport):</b></p>
808        <div class="code-wrapper">
809          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
810          <pre class="code-block"><span class="cmd">{
811  "mcpServers": {
812    "know-your-exhaust": {
813      "type": "http",
814      "url": "http://127.0.0.1:8731/mcp"
815    }
816  }
817}</span></pre>
818        </div>
819
820        <p><b>Cursor MCP (SSE mode):</b></p>
821        <ul>
822          <li><b>Name:</b> <code>know-your-exhaust</code></li>
823          <li><b>Type:</b> <code>sse</code></li>
824          <li><b>URL:</b> <code>http://127.0.0.1:8731/mcp</code></li>
825        </ul>
826
827        <p><b>Gemini CLI &amp; Codex CLI:</b></p>
828        <div class="code-wrapper">
829          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
830          <pre class="code-block"><span class="comment"># For Gemini CLI</span>
831<span class="cmd">gemini mcp add --transport http --trust know-your-exhaust http://127.0.0.1:8731/mcp</span>
832
833<span class="comment"># For Codex CLI</span>
834<span class="cmd">codex mcp add know-your-exhaust --url http://127.0.0.1:8731/mcp</span></pre>
835        </div>
836      </div>
837
838      <!-- Other / Custom -->
839      <div id="guide-other" class="guide-pane" role="tabpanel">
840        <h3>1. Terminal-based Agents (<code>pi</code> / <code>codex</code>)</h3>
841        <p>If you use CLI coding tools, clone and symlink prompts directly into your agents directory:</p>
842        <div class="code-wrapper">
843          <button class="copy-btn" onclick="copyToClipboard(this)">Copy</button>
844          <pre class="code-block"><span class="comment"># Install agents globally</span>
845<span class="cmd">npm install -g @mariozechner/pi-coding-agent @openai/codex</span>
846
847<span class="comment"># Clone and symlink skills prompts globally</span>
848<span class="cmd">git clone https://github.com/cyaxios/tn-skills ~/src/tn-skills
849mkdir -p ~/.agents/skills
850ln -s ~/src/tn-skills/prompts ~/.agents/skills/tn</span>
851
852<span class="comment"># Or configure locally for this workspace only</span>
853<span class="cmd">mkdir -p ./.agents/skills
854ln -s ~/src/tn-skills/prompts ./.agents/skills/tn</span></pre>
855        </div>
856
857        <h3>2. Source Prompts &amp; Custom Systems</h3>
858        <p>The skills are written in plain Markdown. For custom or proprietary agents:</p>
859        <ul>
860          <li>
861            <strong>Per-topic prompts:</strong> Feed <code>system-prompt.md</code> as system message, and matching <code>usage-*.md</code> as the user prompt. Browse them on <a href="https://github.com/cyaxios/tn-skills/tree/main/prompts">GitHub prompts/</a>.
862          </li>
863          <li>
864            <strong>Skill Bundles:</strong> Concatenated markdown files ready to drop in. Download <code>tn-skills-hermes-*.zip</code> from the <a href="https://github.com/cyaxios/tn-skills/releases">releases page</a>.
865          </li>
866        </ul>
867      </div>
868    </div>
869
870    <h2>What you can ask for</h2>
871
872    <div class="skills">
873      <div class="skill">
874        <div class="slug">tn-logging</div>
875        <h3>&ldquo;Log this like we usually do.&rdquo;</h3>
876        <p>Your agent emits TN log lines in the spots that matter: after a database write, an HTTP call, a payment, a user action. It follows your project conventions so the event names stay tidy.</p>
877      </div>
878      <div class="skill">
879        <div class="slug">tn-annotate</div>
880        <h3>&ldquo;Add TN logging to this file.&rdquo;</h3>
881        <p>Point it at an existing file full of <code>print()</code> or <code>console.log()</code> calls. The agent retrofits them to TN, preserves comments and behavior, and keeps your sensitive values out of the event name.</p>
882      </div>
883      <div class="skill">
884        <div class="slug">tn-verify</div>
885        <h3>&ldquo;Is this record tampered?&rdquo;</h3>
886        <p>The agent walks the chain, checks signatures, and reports back in plain English. Ask it to compare the same event across two parties and it tells you whether both sides agree.</p>
887      </div>
888      <div class="skill">
889        <div class="slug">tn-admin</div>
890        <h3>&ldquo;Give the auditor access to the amount field.&rdquo;</h3>
891        <p>Grants, rotations, and revocations happen through a short conversation with the agent. It tells you what changes, asks for c
891onfirmation on the sensitive ones, and writes the config.</p>
892      </div>
893      <div class="skill">
894        <div class="slug">tn-query</div>
895        <h3>&ldquo;Show me the last ten payment errors.&rdquo;</h3>
896        <p>The agent reads your tables with <code>tn.read(&hellip;)</code>, decrypts the fields you are allowed to see, and answers with real records. Sorts by sequence and reaches for the real read verbs (<code>tn.read</code> for history, <code>tn.watch</code> for live tailing, with <code>verify=</code>, <code>raw=</code>, <code>as_recipient=</code> as flags) instead of inventing helpers.</p>
897      </div>
898      <div class="skill">
899        <div class="slug">tn-lint</div>
900        <h3>&ldquo;Run tn.lint on payments/.&rdquo;</h3>
901        <p>Static analysis on <code>tn.*</code> calls. Catches PII in event-type strings (R1), field names absent from your <code>tn.yaml</code> routing (R2), and forbidden-post-auth fields routed to a public group (R3). Non-zero exit on any rule fire &mdash; drop it in as a pre-commit hook.</p>
902      </div>
903      <div class="skill">
904        <div class="slug">tn-policy</div>
905        <h3>&ldquo;Draft an agents policy for order.created.&rdquo;</h3>
906        <p>Authors and maintains <code>.tn/config/agents.md</code> &mdash; the machine-readable policy that travels alongside every record so downstream LLM consumers see the rules next to the data. Five required subsections per event type; missing one raises at <code>tn.init</code> time.</p>
907      </div>
908    </div>
909
910    <h2 id="industries">Industries the agent already knows</h2>
911    <p>
912      Logs become receipts when they&rsquo;re signed and sealed. Sealed
913      by what? By the rules of the industry the receipt belongs to.
914      PCI knows what counts as cardholder data. HIPAA knows what counts
915      as a patient record. FERPA knows what counts as a student record.
916      The agent ships knowing all of them, so when it walks a codebase
917      it can tell which values need locking and which can stay legible.
918      That is what DRM for logs looks like in practice.
919    </p>
920
921    <table class="industries">
922      <thead>
923        <tr>
924          <th>Industry</th>
925          <th>Standard</th>
926          <th>What the standard is about</th>
927        </tr>
928      </thead>
929      <tbody>
930        <tr>
931          <td>Identity and auth</td>
932          <td>OIDC Core 1.0 + RFC 7519</td>
933          <td>The names a login system uses for who someone is, what they can do, and the tokens that prove it.</td>
934        </tr>
935        <tr>
936          <td>Payments</td>
937          <td>PCI DSS v4.0</td>
938          <td>What banks call &ldquo;the card data&rdquo;. The number, the expiry, the CVV, the PIN. Some of it must vanish the moment a charge clears.</td>
939        </tr>
940        <tr>
941          <td>E-commerce orders</td>
942          <td>Schema.org Order</td>
943          <td>Customer name, address, line items, totals, fulfillment. The shape Shopify, Stripe, and direct-to-consumer storefronts already use.</td>
944        </tr>
945        <tr>
946          <td>Healthcare records</td>
947          <td>HL7 FHIR R4</td>
948          <td>The clinical record. Who the patient is, what the doctor noted, what the lab measured, what was prescribed. PHI under HIPAA.</td>
949        </tr>
950        <tr>
951          <td>Customer relationships</td>
952          <td>Salesforce object model</td>
953          <td>Contacts, leads, opportunities, support cases. The data sales and customer-success teams keep about people and deals.</td>
954        </tr>
955        <tr>
956          <td>Cloud audit logs</td>
957          <td>AWS CloudTrail</td>
958          <td>The receipt every cloud account leaves behind. Who did what, from where, against which resource. The same shape covers GCP and Azure.</td>
959        </tr>
960        <tr>
961          <td>Email</td>
962          <td>RFC 5322 and RFC 5321</td>
963          <td>The headers and body of an email message. From, To, Subject, the routing trail, and the body itself.</td>
964        </tr>
965        <tr>
966          <td>Trading</td>
967          <td>FIX 4.4 / 5.0 SP2</td>
968          <td>The wire format banks and exchanges use to place orders and confirm fills. Symbols are public; account ids and the prices on a working order are not.</td>
969        </tr>
970        <tr>
971          <td>IoT and geolocation</td>
972          <td>NMEA 0183 + OGC SensorThings 1.1</td>
973          <td>Device telemetry. A stable id, where the device is, how fast it is moving, what it is reading. Location plus a stable device id is a person.</td>
974        </tr>
975        <tr>
976          <td>K-12 education</td>
977          <td>1EdTech OneRoster 1.2</td>
978          <td>The student information system. Who is enrolled in which class, with which teacher, at which school. FERPA-protected.</td>
979        </tr>
980        <tr>
981          <td>Custody and portfolio</td>
982          <td>ISO 20022 semt.002</td>
983          <td>The end-of-day statement of holdings. Which account owns how many of which security and what it is worth.</td>
984        </tr>
985      </tbody>
986    </table>
987
988    <h2>How the agent uses what it knows</h2>
989    <p>
990      Ask the agent to look at a file, a folder, or the whole repo.
991      It reads the code, recognises the standards in play, and points
992      to every spot where a value should be sealed instead of left in
993      the open. The agent does not invent rules. It cites them. Every
994      flag traces back to the section of the standard that named the
995      field.
996    </p>
997    <p>
998      Fixes happen in the same conversation. Seal a field. Rotate a
999      key. Grant the auditor read access to one column and nothing
1000      else. The receipts that result prove what happened. The people
1001      allowed can read them. Everyone else sees ciphertext. DRM for
1002      logs.
1003    </p>
1004
1005    <h2>What it looks like in chat</h2>
1006
1007    <div class="chat">
1008      <div class="chat-row">
1009        <div class="chat-avatar you">Y</div>
1010        <div class="chat-body"><b>You:</b> Add TN logging to <code>checkout.py</code>.</div>
1011      </div>
1012      <div class="chat-row">
1013        <div class="chat-avatar agent">A</div>
1014        <div class="chat-body chat-agent">
1015          I read the file. I see <code>print()</code> calls around the charge,
1016          the refund, and the error path. I will replace them with
1017          <code>tn.info("payment.charged", &hellip;)</code>,
1018          <code>tn.info("payment.refunded", &hellip;)</code>, and
1019          <code>tn.error("payment.failed", &hellip;)</code>. Field names follow
1020          your existing <code>tn.yaml</code>. Proceed?
1021        </div>
1022      </div>
1023      <div class="chat-row">
1024        <div class="chat-avatar you">Y</div>
1025        <div class="chat-body"><b>You:</b> Yes. Also give the finance partner read access to the amount field.</div>
1026      </div>
1027      <div class="chat-row">
1028        <div class="chat-avatar agent">A</div>
1029        <div class="chat-body chat-agent">
1030          I added <code>partner-finance</code> to the <code>amount</code>
1031          field&rsquo;s reader list and rotated the group key. From the next
1032          entry on, they can decrypt <code>amount</code> for
1033          <code>payment.charged</code>. The customer and card fields stay
1034          sealed.
1035        </div>
1036      </div>
1037    </div>
1038
1039    <h2 id="data-governance">Data governance</h2>
1040    <p>
1041      Logging is the beginning. Two more surfaces make policy machine-readable
1042      and help you find sensitive data that&rsquo;s already escaping unencrypted.
1043    </p>
1044
1045    <h3>The policy layer</h3>
1046    <p>
1047      Every event type can carry a declared policy: what the data is for, what
1048      it must not be used for, and what a downstream agent should do if
1049      something goes wrong. These declarations live in
1050      <code>.tn/config/agents.md</code> and are spliced onto every emitted
1051      record at runtime, so LLM consumers see the rules alongside the ciphertext.
1052    </p>
1053    <p>
1054      <strong>tn-annotate does this automatically.</strong> When it retrofits a
1055      file it also drafts the five required <code>agents.md</code> subsections
1056      for each new event type it introduces: <code>
1056instruction</code>,
1057      <code>use_for</code>, <code>do_not_use_for</code>,
1058      <code>consequences</code>, <code>on_violation_or_error</code>. Missing
1059      a subsection raises at <code>tn.init</code> time, so the policy is never
1060      half-written. Use <strong>tn-policy</strong> to add or revise policy
1061      sections later without touching the logging code.
1062    </p>
1063
1064    <h3>Know Your Exhaust <span style="font-family: var(--sans); font-size: 12px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); margin-left: 8px;">Experimental</span></h3>
1065    <p>
1066      What about logs you didn&rsquo;t write with TN? Know Your Exhaust (KYE)
1067      is a local MCP server that analyzes your application&rsquo;s runtime
1068      exhaust &mdash; existing log files, telemetry, traces &mdash; finds
1069      unencrypted PII and join keys, and offers to instrument the source code
1070      so future writes route through TN.
1071    </p>
1072    <p>
1073      The analysis runs seven deterministic stages: profile the format,
1074      enumerate event types and fields, collapse thousands of lines to canonical
1075      templates, match fields to the eleven published industry standards,
1076      classify per-field sensitivity, detect cross-row re-identification risk,
1077      then generate a default-private TN config. The agent walks you through
1078      each finding and asks before it touches any code.
1079    </p>
1080    <p>
1081      When connected to your vault, the agent can also decrypt what you are
1082      entitled to see and apply the policy rules the data carries &mdash; all
1083      local, no key escrow.
1084    </p>
1085    <p>
1086      Setup: start the server and register the connector using the
1087      <strong>Know Your Exhaust</strong> tab in the configuration guide above.
1088      Then ask: <em>&ldquo;classify my exhaust&rdquo;</em> or
1089      <em>&ldquo;what&rsquo;s in my logs.&rdquo;</em>
1090    </p>
1091
1092    <div class="callout">
1093      <div class="callout-label">Where it fits</div>
1094      <p>
1095        If you already use an AI assistant for day-to-day coding, the TN
1096        plugin lets you add a new question to its repertoire: &ldquo;what
1097        does this log say&rdquo;, &ldquo;who can read it&rdquo;,
1098        &ldquo;prove it has not changed&rdquo;. Answers come back in the
1099        same chat window.
1100      </p>
1101    </div>
1102
1103    <a href="/" class="back-link">&larr; Back to the vault</a>
1104
1105  </article>
1106</main>
1107
1108<footer class="footer" style="padding: 56px 0; text-align: center; font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted, #999); border-top: 1px solid var(--hair, #ededed); background: #fff; line-height: 1.8;">
1109  <p class="tn-tagline" style="display: block; font-family: 'Century Gothic', 'TeXGyreAdventor', var(--sans, sans-serif); font-size: 17px; letter-spacing: 0.02em; text-transform: none; color: var(--ink-soft, #555); margin: 0 auto 8px; max-width: 540px; font-weight: 400; line-height: 1.55;">Every action, a Transactio<span class="tn-mark" style="font-weight: 300; color: var(--muted, #999);">N</span>.</p>
1110  <p class="tn-wordmark" style="display: block; font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink, #4d4d4d); margin: 0 0 12px; font-weight: 500;">TN. The agent transaction protocol.</p>
1111  <p class="tn-secondary" style="display: block; font-family: var(--serif, Georgia, serif); font-style: italic; font-size: 13px; letter-spacing: 0.02em; text-transform: none; color: var(--muted, #999); margin: 0 auto 24px; max-width: 480px; font-weight: 400;">Cheap insurance for code that has consequences.</p>
1112  <p class="footer-refs" style="display: block; max-width: 720px; margin: 0 auto 28px; padding: 0 24px; font-size: 11px; letter-spacing: 0.08em; line-height: 2.1; text-transform: uppercase;">
1113    <a href="/vibe-coding-security" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Vibe Coding Security</a>
1114    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1115    <a href="/the-agent-finds-the-leaks" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Agent finds the leaks</a>
1116    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1117    <a href="/pii-in-logs" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">PII in logs</a>
1118    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1119    <a href="/log-compliance" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Log compliance</a>
1120    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1121    <a href="/data-protection-impact-assessment" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">DPIA (Compliance)</a>
1122    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1123    <a href="/case-study-saleor" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Case Studies</a>
1124    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1125    <a href="/field-level-encryption" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Field-level encryption</a>
1126    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1127    <a href="/federated-key-vaults" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Federated vaults</a>
1128    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1129    <a href="/compile-time-vs-runtime-data-governance" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Compile-time governance</a>
1130    <span class="sep" style="margin: 0 6px; color: var(--hair, #ededed);">&middot;</span>
1131    <a href="/docs/" style="text-decoration: none; padding: 0 4px; color: var(--muted, #999);">Docs</a>
1132  </p>
1133  <a href="/" style="color: var(--muted, #999); text-decoration: none;">tn-proto</a>
1134  <span class="sep" style="margin: 0 14px; color: var(--muted, #999);">&middot;</span>
1135  <a href="/use-with-your-agent" style="color: var(--muted, #999); text-decoration: none;">Agents</a>
1136  <span class="sep" style="margin: 0 14px; color: var(--muted, #999);">&middot;</span>
1137  <a href="https://github.com/cyaxios/tn-proto" style="color: var(--muted, #999); text-decoration: none;">GitHub</a>
1138  <span class="sep" style="margin: 0 14px; color: var(--muted, #999);">&middot;</span>
1139  <a href="/legal/terms" style="color: var(--muted, #999); text-decoration: none;">Terms</a>
1140  <span class="sep" style="margin: 0 14px; color: var(--muted, #999);">&middot;</span>
1141  <a href="/legal/privacy" style="color: var(--muted, #999); text-decoration: none;">Privacy</a>
1142  <span class="sep" style="margin: 0 14px; color: var(--muted, #999);">&middot;</span>
1143  <a href="/legal/data-request" style="color: var(--muted, #999); text-decoration: none;">Data Request</a>
1144  <p class="built-by" style="display: flex; align-items: center; justify-content: center; gap: 10px; margin: 28px 0 0; font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--muted, #999);">
1145    <img src="/img/cyaxios-logo-192.png" alt="" width="22" height="22" style="opacity: 0.85;">
1146    <span>Built by <a href="https://cyaxios.com" style="color: var(--ink-soft, #555); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: currentColor;">Cyaxios</a></span>
1147  </p>
1148</footer>
1149
1150<script>
1151function switchSetupTab(evt, tabId) {
1152  var i, panes, tabs;
1153  tabs = document.querySelectorAll(".setup-tab");
1154  for (i = 0; i < tabs.length; i++) {
1155    tabs[i].classList.remove("active");
1156    tabs[i].setAttribute("aria-selected", "false");
1157  }
1158  panes = document.querySelectorAll(".setup-pane");
1159  for (i = 0; i < panes.length; i++) {
1160    panes[i].classList.remove("active");
1161  }
1162  document.getElementById(tabId).classList.add("active");
1163  evt.currentTarget.classList.add("active");
1164  evt.currentTarget.setAttribute("aria-selected", "true");
1165}
1166
1167function switchGuideTab(evt, tabId) {
1168  var i, panes, tabs;
1169  tabs = document.querySelectorAll(".guide-tab");
1170  for (i = 0; i < tabs.length; i++) {
1171    tabs[i].classList.remove("active");
1172    tabs[i].setAttribute("aria-selected", "false");
1173  }
1174  panes = document.querySelectorAll(".guide-pane");
1175  for (i = 0; i < panes.length; i++) {
1176    panes[i].classList.remove("active");
1177  }
1178  document.getElementById(tabId).classList.add("active");
1179  evt.currentTarget.classList.add("active");
1180  evt.currentTarget.setAttribute("aria-selected", "true");
1181}
1182
1183function copyToClipboard(button) {
1184  var codeBlock = button.nextElementSibling;
1185  var text = codeBlock.innerText;
1186  
1187  navigator.clipboard.writeText(text).then(function() {
1188    button.innerText = 'Copied!';
1189    button.classList.add('copied');
1190    
1191    setTimeout(function() {
1192      button.innerText = 'Copy';
1193      button.classList.remove('copied');
1194    }, 2000);
1195  }, function(err) {
1196    console.error('Could not copy text: ', err);
1197  });
1198}
1199</script>
vendor: 2 bytes, line 1199
1199
1200<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"74874e8adb41445c98cae5ec561892d2","r":1,"spa":2}' crossorigin="anonymous"></script>
1200
1201</body>
1202</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.