Skip to content

Commit 497c3e8

Browse files
author
Tilelli LAB
committed
Add blog (12 posts) + harden .gitignore for secrets
Website: - New website/blog/ — index + 12 posts on ASPL utility (what it does, why it's different), matching the main site theme. Honest voice consistent with the site's "Honest Take" section; detect-vs-block nuance stated plainly. Topics: overview, trust-vs-registry, signed delivery, sybil-resistant trust, MCP ingest, A2A ingest, semantic intent, transparency log, revocation, federation, supply-chain defense + crash-test, environment probing. - Shared website/blog/blog.css (reuses theme tokens/fonts). - "Blog" link added to main nav (EN/FR). - Verified: 0 horizontal overflow at 375/768/1440px on index, a post, and the main page (Playwright); all internal links + CSS refs resolve. Security (.gitignore): - Add .env.* (keep .env.example), *.key, *.pem, *.p12, *.pfx, secrets.json, credentials.json, *_secret*, *.credentials as belt-and-suspenders. - Pre-push audit confirmed clean: no secrets in tracked files or in full git history (236 objects); .env holds config only; .shop_key/*.db untracked.
1 parent b900796 commit 497c3e8

16 files changed

Lines changed: 1168 additions & 0 deletions

.gitignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ Thumbs.db
3131
# Environment
3232
.env
3333
.env.local
34+
.env.*
35+
!.env.example
36+
37+
# Secrets / keys (belt-and-suspenders — never commit credentials)
38+
*.key
39+
*.pem
40+
*.p12
41+
*.pfx
42+
secrets.json
43+
credentials.json
44+
*_secret*
45+
*.credentials
3446

3547
# Testing
3648
.pytest_cache/

website/blog/a2a-capabilities.html

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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">
6+
<title>A2A Agent Cards as First-Class Capabilities — ASPL Blog</title>
7+
<meta name="description" content="An A2A Agent Card&#x27;s skills become discoverable, trust-scored ASPL capabilities — without leaving A2A behind.">
8+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='14' fill='%2306090f'/%3E%3Cpath d='M20 44 L32 16 L44 44' stroke='%2300d4aa' stroke-width='4.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cline x1='24' y1='36' x2='40' y2='36' stroke='%2300d4aa' stroke-width='3.5' stroke-linecap='round'/%3E%3C/svg%3E">
9+
<link rel="preconnect" href="https://fonts.googleapis.com">
10+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@300;400;500;600&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
12+
<link rel="stylesheet" href="blog.css">
13+
</head>
14+
<body>
15+
<nav>
16+
<div class="nav-logo">
17+
<a href="../index.html">
18+
<svg width="26" height="26" viewBox="0 0 64 64" style="vertical-align:middle;margin-right:10px;">
19+
<defs><linearGradient id="lg" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#00d4aa"/><stop offset="100%" stop-color="#007a63"/></linearGradient></defs>
20+
<rect width="64" height="64" rx="14" fill="#06090f" stroke="#00d4aa" stroke-width="2" stroke-opacity="0.3"/>
21+
<path d="M20 44 L32 16 L44 44" stroke="url(#lg)" stroke-width="4.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
22+
<line x1="24" y1="36" x2="40" y2="36" stroke="url(#lg)" stroke-width="3.5" stroke-linecap="round"/>
23+
<circle cx="32" cy="16" r="3.5" fill="#00d4aa"/>
24+
</svg>ASPL<span class="dim">blog</span>
25+
</a>
26+
</div>
27+
<ul class="nav-links">
28+
<li><a href="../index.html" class="hide-sm">Home</a></li>
29+
<li><a href="index.html">All Posts</a></li>
30+
<li><a href="https://github.com/TilelliLab/aspl" target="_blank" rel="noopener">GitHub</a></li>
31+
</ul>
32+
</nav>
33+
<div class="wrap">
34+
<article>
35+
<a class="back-link" href="index.html">← All posts</a>
36+
<div class="article-meta"><span class="tag">A2A</span><span>2026-06-03</span><span>4 min read</span></div>
37+
<h1>A2A Agent Cards as First-Class Capabilities</h1>
38+
<p class="lede">Google's Agent-to-Agent (A2A) protocol describes agents and their skills with an Agent Card. ASPL reads that card and turns each skill into a capability your agents can discover and verify.</p>
39+
40+
<h2>From card to capabilities</h2>
41+
<pre><code>POST /v1/ingest/a2a
42+
{ "name": "TranslatorAgent",
43+
"url": "https://a2a.example",
44+
"skills": [
45+
{ "id": "tr", "name": "translate",
46+
"description": "translate text between languages" } ] }</code></pre>
47+
<p>Each skill is converted into an ASPL capability tagged with its A2A origin. The agent's identity is captured as a passport, and the skills become individually discoverable by intent.</p>
48+
49+
<h2>Why this is useful</h2>
50+
<p>A2A tells you an agent <em>claims</em> a skill. ASPL adds the layer A2A doesn't: a trust score earned from real, distinct usage; a signed, hash-verified handoff when the capability is acquired; and a revocation path if the skill turns out to be harmful. You keep using A2A for the actual agent-to-agent interaction — ASPL just makes the discovery and the vouching trustworthy.</p>
51+
52+
<h2>One fabric, many sources</h2>
53+
<p>Because MCP tools, A2A skills, LangChain tools, and natively-published capabilities all become the same kind of object, a single <code>need</code> query searches across all of them. Your agent doesn't have to know or care that one match came from an MCP server and another from an A2A card — they're ranked together by intent and trust.</p>
54+
55+
<blockquote>ASPL is deliberately a layer, not a silo: it federates the ecosystems you already use rather than asking you to choose one.</blockquote>
56+
<div class="post-nav"><a href="mcp-into-trust-fabric.html">← Bringing MCP Tools Into a Trust Fabric</a><a href="semantic-intent.html">Ask for What You Mean: Semantic Intent Matching →</a></div>
57+
</article>
58+
</div>
59+
<footer>
60+
<div class="fl">CONTACT</div>
61+
<a href="mailto:hello@tilelli.tech">hello@tilelli.tech</a>
62+
<div class="footer-links">
63+
<a href="https://github.com/TilelliLab/aspl" target="_blank" rel="noopener">GitHub</a>
64+
<span class="sep">·</span>
65+
<a href="https://tilelli.tech" target="_blank" rel="noopener">Built by Tilelli LAB</a>
66+
</div>
67+
<div class="fn">ASPL is an open protocol. Apache 2.0. Free to implement.</div>
68+
</footer>
69+
</body>
70+
</html>

website/blog/blog.css

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
/* ASPL blog — shared styles. Matches the main site theme (website/index.html). */
2+
:root {
3+
--bg: #06090f;
4+
--bg2: #0c1018;
5+
--bg3: #121822;
6+
--text: #e4e8f0;
7+
--text-dim: #8892a8;
8+
--text-muted: #4a5568;
9+
--accent: #00d4aa;
10+
--accent-glow: rgba(0, 212, 170, 0.12);
11+
--accent-dim: rgba(0, 212, 170, 0.06);
12+
--mcp: #7c8aff;
13+
--a2a: #ff7c7c;
14+
--warn: #ffa726;
15+
--border: rgba(255,255,255,0.06);
16+
--radius: 12px;
17+
}
18+
19+
* { margin: 0; padding: 0; box-sizing: border-box; }
20+
html { scroll-behavior: smooth; }
21+
body {
22+
font-family: 'Inter', sans-serif;
23+
background: var(--bg);
24+
color: var(--text);
25+
line-height: 1.75;
26+
-webkit-font-smoothing: antialiased;
27+
}
28+
a { color: var(--accent); text-decoration: none; }
29+
a:hover { text-decoration: underline; }
30+
31+
/* ── nav ── */
32+
nav {
33+
position: sticky; top: 0; z-index: 50;
34+
display: flex; align-items: center; justify-content: space-between;
35+
padding: 16px 32px;
36+
background: rgba(6,9,15,0.82);
37+
backdrop-filter: blur(12px);
38+
border-bottom: 1px solid var(--border);
39+
}
40+
.nav-logo {
41+
font-family: 'Space Grotesk', sans-serif; font-weight: 700;
42+
font-size: 1.2rem; color: var(--accent); letter-spacing: -0.02em;
43+
display: flex; align-items: center;
44+
}
45+
.nav-logo .dim { color: var(--text-muted); font-weight: 400; font-size: 0.85rem; margin-left: 8px; }
46+
.nav-logo a { color: inherit; text-decoration: none; display: flex; align-items: center; }
47+
.nav-links { display: flex; gap: 24px; list-style: none; align-items: center; }
48+
.nav-links a { color: var(--text-dim); font-size: 0.9rem; font-weight: 500; transition: color .2s; }
49+
.nav-links a:hover { color: var(--text); text-decoration: none; }
50+
51+
/* ── blog index ── */
52+
.wrap { max-width: 860px; margin: 0 auto; padding: 0 24px; }
53+
.blog-hero { padding: 80px 0 40px; }
54+
.eyebrow {
55+
font-family: 'JetBrains Mono', monospace; font-size: 0.74rem;
56+
color: var(--accent); letter-spacing: 0.2em; text-transform: uppercase; margin-bottom: 18px;
57+
}
58+
.blog-hero h1 {
59+
font-family: 'Space Grotesk', sans-serif; font-size: clamp(2.2rem, 5vw, 3.4rem);
60+
font-weight: 700; letter-spacing: -0.02em; line-height: 1.1; margin-bottom: 18px;
61+
}
62+
.blog-hero p { color: var(--text-dim); font-size: 1.08rem; max-width: 620px; }
63+
64+
.post-list { display: flex; flex-direction: column; gap: 0; padding: 20px 0 80px; }
65+
.post-card {
66+
display: block; padding: 26px 0; border-top: 1px solid var(--border);
67+
transition: padding-left .2s ease;
68+
}
69+
.post-card:hover { padding-left: 8px; text-decoration: none; }
70+
.post-card:last-child { border-bottom: 1px solid var(--border); }
71+
.post-card .meta {
72+
font-family: 'JetBrains Mono', monospace; font-size: 0.72rem;
73+
color: var(--text-muted); letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 8px;
74+
display: flex; gap: 14px; align-items: center; flex-wrap: wrap;
75+
}
76+
.post-card .tag { color: var(--accent); }
77+
.post-card h2 {
78+
font-family: 'Space Grotesk', sans-serif; font-size: 1.4rem; font-weight: 600;
79+
color: var(--text); letter-spacing: -0.01em; margin-bottom: 8px;
80+
}
81+
.post-card:hover h2 { color: var(--accent); }
82+
.post-card p { color: var(--text-dim); font-size: 0.98rem; }
83+
84+
/* ── article ── */
85+
article { padding: 60px 0 40px; }
86+
.article-meta {
87+
font-family: 'JetBrains Mono', monospace; font-size: 0.74rem;
88+
color: var(--text-muted); letter-spacing: 0.1em; text-transform: uppercase;
89+
margin-bottom: 18px; display: flex; gap: 14px; flex-wrap: wrap;
90+
}
91+
.article-meta .tag { color: var(--accent); }
92+
article h1 {
93+
font-family: 'Space Grotesk', sans-serif; font-size: clamp(2rem, 4.5vw, 3rem);
94+
font-weight: 700; letter-spacing: -0.02em; line-height: 1.12; margin-bottom: 24px;
95+
}
96+
article h2 {
97+
font-family: 'Space Grotesk', sans-serif; font-size: 1.5rem; font-weight: 600;
98+
letter-spacing: -0.01em; margin: 44px 0 14px;
99+
}
100+
article h3 {
101+
font-family: 'Space Grotesk', sans-serif; font-size: 1.15rem; font-weight: 600;
102+
margin: 30px 0 10px; color: var(--text);
103+
}
104+
article p { color: var(--text); margin-bottom: 18px; font-size: 1.04rem; }
105+
article ul, article ol { margin: 0 0 18px 24px; color: var(--text); }
106+
article li { margin-bottom: 8px; }
107+
article strong { color: #fff; font-weight: 600; }
108+
article .lede { font-size: 1.15rem; color: var(--text-dim); margin-bottom: 28px; }
109+
article a { text-decoration: underline; text-underline-offset: 3px; }
110+
111+
blockquote {
112+
border-left: 3px solid var(--accent); background: var(--accent-dim);
113+
padding: 14px 20px; margin: 0 0 22px; border-radius: 0 8px 8px 0;
114+
color: var(--text-dim); font-style: italic;
115+
}
116+
code {
117+
font-family: 'JetBrains Mono', monospace; font-size: 0.86em;
118+
background: var(--bg3); padding: 2px 6px; border-radius: 5px; color: var(--accent);
119+
}
120+
pre {
121+
background: var(--bg2); border: 1px solid var(--border); border-left: 3px solid var(--accent);
122+
border-radius: 8px; padding: 18px 20px; overflow-x: auto; margin: 0 0 22px;
123+
}
124+
pre code { background: none; padding: 0; color: var(--text-dim); font-size: 0.84rem; line-height: 1.6; }
125+
126+
.callout {
127+
background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius);
128+
padding: 20px 24px; margin: 0 0 24px;
129+
}
130+
.callout .label {
131+
font-family: 'JetBrains Mono', monospace; font-size: 0.72rem; letter-spacing: 0.12em;
132+
text-transform: uppercase; color: var(--accent); margin-bottom: 8px;
133+
}
134+
.callout.warn { border-left: 3px solid var(--warn); }
135+
.callout.warn .label { color: var(--warn); }
136+
137+
.post-nav {
138+
display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
139+
border-top: 1px solid var(--border); padding: 30px 0; margin-top: 40px;
140+
}
141+
.post-nav a { font-size: 0.92rem; }
142+
.back-link {
143+
display: inline-block; margin-bottom: 30px; font-family: 'JetBrains Mono', monospace;
144+
font-size: 0.8rem; color: var(--text-dim); letter-spacing: 0.06em;
145+
}
146+
147+
/* ── footer ── */
148+
footer {
149+
border-top: 1px solid var(--border); padding: 48px 24px; text-align: center;
150+
color: var(--text-muted);
151+
}
152+
footer .fl {
153+
font-family: 'JetBrains Mono', monospace; font-size: 0.72rem; letter-spacing: 0.2em;
154+
color: var(--text-muted); margin-bottom: 12px;
155+
}
156+
footer .footer-links { margin: 16px 0; display: flex; gap: 12px; justify-content: center; align-items: center; }
157+
footer .sep { color: var(--text-muted); }
158+
footer .fn { font-size: 0.8rem; color: var(--text-muted); margin-top: 14px; }
159+
160+
@media (max-width: 640px) {
161+
nav { padding: 14px 18px; }
162+
.nav-links { gap: 16px; }
163+
.nav-links .hide-sm { display: none; }
164+
.blog-hero { padding: 50px 0 30px; }
165+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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">
6+
<title>Will This Capability Even Run Here? — ASPL Blog</title>
7+
<meta name="description" content="Before acquiring a capability, an agent can declare its environment and ask whether the capability&#x27;s requirements are satisfied.">
8+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='14' fill='%2306090f'/%3E%3Cpath d='M20 44 L32 16 L44 44' stroke='%2300d4aa' stroke-width='4.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cline x1='24' y1='36' x2='40' y2='36' stroke='%2300d4aa' stroke-width='3.5' stroke-linecap='round'/%3E%3C/svg%3E">
9+
<link rel="preconnect" href="https://fonts.googleapis.com">
10+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@300;400;500;600&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
12+
<link rel="stylesheet" href="blog.css">
13+
</head>
14+
<body>
15+
<nav>
16+
<div class="nav-logo">
17+
<a href="../index.html">
18+
<svg width="26" height="26" viewBox="0 0 64 64" style="vertical-align:middle;margin-right:10px;">
19+
<defs><linearGradient id="lg" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#00d4aa"/><stop offset="100%" stop-color="#007a63"/></linearGradient></defs>
20+
<rect width="64" height="64" rx="14" fill="#06090f" stroke="#00d4aa" stroke-width="2" stroke-opacity="0.3"/>
21+
<path d="M20 44 L32 16 L44 44" stroke="url(#lg)" stroke-width="4.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
22+
<line x1="24" y1="36" x2="40" y2="36" stroke="url(#lg)" stroke-width="3.5" stroke-linecap="round"/>
23+
<circle cx="32" cy="16" r="3.5" fill="#00d4aa"/>
24+
</svg>ASPL<span class="dim">blog</span>
25+
</a>
26+
</div>
27+
<ul class="nav-links">
28+
<li><a href="../index.html" class="hide-sm">Home</a></li>
29+
<li><a href="index.html">All Posts</a></li>
30+
<li><a href="https://github.com/TilelliLab/aspl" target="_blank" rel="noopener">GitHub</a></li>
31+
</ul>
32+
</nav>
33+
<div class="wrap">
34+
<article>
35+
<a class="back-link" href="index.html">← All posts</a>
36+
<div class="article-meta"><span class="tag">Compatibility</span><span>2026-05-12</span><span>4 min read</span></div>
37+
<h1>Will This Capability Even Run Here?</h1>
38+
<p class="lede">A capability you can't run is worse than no capability — you discover the mismatch at the worst possible moment. ASPL lets an agent check compatibility <em>before</em> committing.</p>
39+
40+
<h2>Declare your environment</h2>
41+
<p>An agent can describe its runtime — language version, OS, available permissions, memory, declared dependencies — and ASPL checks a capability's <code>requires</code> block against it:</p>
42+
<pre><code>POST /v1/probe/{capability_id}
43+
{ "environment": {
44+
"runtime": "python:3.11", "os": "linux",
45+
"permissions": ["network"], "memory_mb": 512 } }
46+
→ { "compatible": true, ... }</code></pre>
47+
48+
<h2>Compatibility at discovery time, too</h2>
49+
<p>You don't even have to probe separately. Include your environment in a <code>need</code> request and each match comes back annotated with whether it will run where you are — so discovery and compatibility are answered in one round trip.</p>
50+
51+
<h2>Optional smoke probe</h2>
52+
<p>For code-bearing capabilities, ASPL can run an opt-in smoke probe: it executes the capability's declared probe snippet under resource limits, with the subprocess environment stripped of host secrets. Anything that failed the safety gate is never executed. It's off by default and only meaningful for code — but when you want a real "does it actually start?" signal, it's there.</p>
53+
54+
<blockquote>Compatibility checking is unglamorous, but it's the difference between an agent that picks tools it can use and one that picks tools that merely look right.</blockquote>
55+
<div class="post-nav"><a href="supply-chain-defense.html">← Defending the Agent Supply Chain</a><span></span></div>
56+
</article>
57+
</div>
58+
<footer>
59+
<div class="fl">CONTACT</div>
60+
<a href="mailto:hello@tilelli.tech">hello@tilelli.tech</a>
61+
<div class="footer-links">
62+
<a href="https://github.com/TilelliLab/aspl" target="_blank" rel="noopener">GitHub</a>
63+
<span class="sep">·</span>
64+
<a href="https://tilelli.tech" target="_blank" rel="noopener">Built by Tilelli LAB</a>
65+
</div>
66+
<div class="fn">ASPL is an open protocol. Apache 2.0. Free to implement.</div>
67+
</footer>
68+
</body>
69+
</html>

0 commit comments

Comments
 (0)