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 & 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 & 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 — 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 — 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’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# & 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> — <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> — <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 → Features → 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 & 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 & 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>“Log this like we usually do.”</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>“Add TN logging to this file.”</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>“Is this record tampered?”</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>“Give the auditor access to the amount field.”</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>“Show me the last ten payment errors.”</h3> 896 <p>The agent reads your tables with <code>tn.read(…)</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>“Run tn.lint on payments/.”</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 — drop it in as a pre-commit hook.</p> 902 </div> 903 <div class="skill"> 904 <div class="slug">tn-policy</div> 905 <h3>“Draft an agents policy for order.created.”</h3> 906 <p>Authors and maintains <code>.tn/config/agents.md</code> — 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’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 “the card data”. 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", …)</code>, 1018 <code>tn.info("payment.refunded", …)</code>, and 1019 <code>tn.error("payment.failed", …)</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’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’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’t write with TN? Know Your Exhaust (KYE) 1067 is a local MCP server that analyzes your application’s runtime 1068 exhaust — existing log files, telemetry, traces — 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 — 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>“classify my exhaust”</em> or 1089 <em>“what’s in my logs.”</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: “what 1097 does this log say”, “who can read it”, 1098 “prove it has not changed”. Answers come back in the 1099 same chat window. 1100 </p> 1101 </div> 1102 1103 <a href="/" class="back-link">← 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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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);">·</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.