Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
332 lines (320 loc) · 21.3 KB
/
Copy pathindex.html
File metadata and controls
332 lines (320 loc) · 21.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
---
layout: null
---
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Provasign — Prism 1.0 and Shale: take the guesswork out of your coding agent</title>
<meta name="description" content="Prism gives your coding agent the compiler's map of what a change affects: 32/32 change tasks solved at 24% lower cost. Shale puts intent, checks and gaps on the pull request.">
<link rel="canonical" href="{{ '/' | absolute_url }}">
<meta property="og:site_name" content="Provasign">
<meta property="og:title" content="Prism 1.0 and Shale: take the guesswork out of your coding agent">
<meta property="og:description" content="Prism gives your coding agent the compiler's map of what a change affects. Shale puts intent, checks and gaps on the pull request.">
<meta property="og:image" content="{{ '/assets/images/og-provasign.png' | absolute_url }}">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Prism 1.0 and Shale: take the guesswork out of your coding agent">
<meta property="og:url" content="{{ '/' | absolute_url }}">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="{{ '/assets/images/og-provasign.png' | absolute_url }}">
<link rel="icon" type="image/svg+xml" href="{{ '/assets/images/logo-icon.svg' | relative_url }}">
<link rel="stylesheet" href="{{ '/assets/css/site.css' | relative_url }}">
<style>
.wrap { width: min(100%, 1120px); margin: 0 auto; padding: 0 28px; }
.hero { padding: 88px 0 78px; }
.eyebrow { margin-bottom: 18px; color: var(--accent); font: 13px var(--mono); }
h1 { max-width: 940px; margin: 0; font-size: 72px; line-height: 1.02; letter-spacing: 0; }
.lead { max-width: 760px; margin: 28px 0 0; color: var(--muted); font-size: 20px; line-height: 1.6; }
.cta { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 34px; }
.btn { display: inline-flex; min-height: 42px; padding: 0 18px; align-items: center; justify-content: center; border: 1px solid var(--line); border-radius: 7px; color: var(--text); font-size: 15px; font-weight: 700; text-decoration: none; }
.btn.primary { color: #042014; background: var(--accent); border-color: var(--accent); }
.section { padding: 68px 0; border-top: 1px solid var(--line); }
.section-title { max-width: 760px; margin: 0; font-size: 36px; line-height: 1.15; letter-spacing: 0; }
.section-lead { max-width: 780px; margin: 16px 0 0; color: var(--muted); font-size: 17px; line-height: 1.7; }
.core-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin-top: 34px; }
.product { padding: 26px; background: var(--panel); border: 1px solid var(--line); border-radius: 8px; }
.product.prism { border-top: 3px solid var(--accent2); }
.product.shale { border-top: 3px solid var(--accent); }
.tag { display: inline-block; margin-bottom: 14px; color: var(--accent); font: 12px var(--mono); }
.product h3 { margin: 0 0 10px; font-size: 26px; letter-spacing: 0; }
.product p { margin: 0; color: var(--muted); line-height: 1.65; }
.product .proof { margin: 16px 0 0; padding-left: 18px; color: var(--text); line-height: 1.7; }
.product .install { display: block; margin-top: 18px; padding: 10px 12px; overflow-x: auto; color: var(--accent2); background: #0b1320; border-radius: 6px; font: 13px var(--mono); white-space: nowrap; }
.product .cta { margin-top: 18px; }
.more { display: inline-block; margin-top: 20px; color: var(--accent2); font-weight: 700; text-decoration: none; }
.reference-row { display: grid; grid-template-columns: 180px 1fr auto; gap: 24px; align-items: center; margin-top: 24px; padding: 22px 0; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
.reference-row strong { font-size: 20px; }
.reference-row p { margin: 0; color: var(--muted); line-height: 1.6; }
.prism-demo { display: grid; grid-template-columns: 1.1fr .9fr; gap: 28px; margin-top: 34px; align-items: stretch; }
.terminal { overflow: hidden; background: #070b10; border: 1px solid var(--line); border-radius: 8px; }
.terminal-head { padding: 10px 14px; color: var(--dim); background: var(--panel2); border-bottom: 1px solid var(--line); font: 12px var(--mono); }
.terminal pre { margin: 0; padding: 20px; overflow-x: auto; color: #d1fae5; font: 13px/1.75 var(--mono); }
.cyan { color: var(--accent2); }
.green { color: var(--accent); }
button.operation { display: block; width: 100%; text-align: left; background: none; border: 0; border-bottom: 1px solid var(--line); color: inherit; font: inherit; cursor: pointer; padding: 17px 12px; border-left: 3px solid transparent; }
button.operation:hover, button.operation:focus-visible { background: var(--panel); outline: none; }
button.operation[aria-pressed="true"] { border-left-color: var(--accent2); background: var(--panel); }
.op-pane[hidden] { display: none; }
.terminal .op-pane { min-height: 320px; }
.operations { border-top: 1px solid var(--line); }
.operation { padding: 17px 0; border-bottom: 1px solid var(--line); }
.operation code { color: var(--accent2); font: 13px var(--mono); }
.operation p { margin: 7px 0 0; color: var(--muted); line-height: 1.55; }
.demo-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: 22px; margin-top: 34px; align-items: start; }
.termimg { width: 100%; height: auto; border-radius: 8px; }
.ghcard { overflow: hidden; background: var(--panel); border: 1px solid var(--line); border-radius: 8px; font-size: 13.5px; }
.ghhead { padding: 9px 14px; background: var(--panel2); border-bottom: 1px solid var(--line); }
.ghbot { color: var(--text); font-weight: 700; }
.ghdim { color: var(--dim); }
.ghbody { padding: 14px 16px 16px; color: var(--muted); line-height: 1.55; }
.ctitle { color: var(--text); font-size: 15.5px; font-weight: 750; }
.cmeta { margin: 6px 0 2px; color: var(--dim); font-size: 12.5px; }
.csub { margin: 14px 0 6px; color: var(--text); font-weight: 700; }
.ghbody blockquote { margin: 8px 0; padding: 6px 12px; color: var(--muted); border-left: 3px solid var(--accent); }
.ghbody table { width: 100%; margin: 4px 0; border-collapse: collapse; }
.ghbody td { padding: 5px 9px; border: 1px solid var(--line); }
.ghbody code { padding: 2px 5px; color: var(--accent2); background: #0b1320; border-radius: 4px; font: 12px var(--mono); }
.note { margin-top: 22px; color: var(--dim); font-size: 14px; }
.note a { color: var(--accent); }
.principles { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; margin-top: 34px; }
.principle { padding-top: 16px; border-top: 2px solid var(--line); }
.principle strong { display: block; margin-bottom: 8px; }
.principle p { margin: 0; color: var(--muted); line-height: 1.6; }
.foundation { margin-top: 38px; padding-top: 20px; color: var(--muted); border-top: 1px solid var(--line); line-height: 1.65; }
.foundation strong { color: var(--text); }
.foundation a { color: var(--accent2); }
@media (max-width: 900px) {
.prism-demo, .demo-grid { grid-template-columns: 1fr; }
.principles { grid-template-columns: 1fr; gap: 18px; }
}
@media (max-width: 700px) {
.wrap { padding: 0 20px; }
.hero { padding: 58px 0 54px; }
h1 { font-size: 44px; }
.lead { font-size: 18px; }
.section { padding: 54px 0; }
.section-title { font-size: 30px; }
.core-grid { grid-template-columns: 1fr; }
.reference-row { grid-template-columns: 1fr; gap: 10px; }
.reference-row .more { margin-top: 0; }
}
</style>
</head>
<body>
{% include site-nav.html %}
<main>
<section class="hero">
<div class="wrap">
<div class="eyebrow">Prism before the edit · Shale after it</div>
<h1>Complete context before your agent edits. Honest evidence after.</h1>
<p class="lead">
Two local tools for AI-written code. Prism gives the agent the
compiler's map of what a change affects. Shale puts what the agent was
asked, touched and checked on the pull request.
</p>
<div class="core-grid">
<article class="product prism">
<span class="tag">before the edit · v1.0</span>
<h3>Prism</h3>
<p>Every caller, override, implementation and test a change affects, resolved by the language's own compiler, not grep. Prism answers; the agent edits.</p>
<ul class="proof">
<li>Change work, 32 tasks: all solved (native 31), 24% lower task cost, 35% fewer agent steps</li>
<li>Bug fixes, 40 real issues: same results, 8% lower task cost, 15% fewer agent steps</li>
<li>Claude Code, Codex, Cursor, Copilot, Gemini CLI, OpenCode, Windsurf</li>
</ul>
<code class="install">brew install provasign/tap/prism</code>
<div class="cta">
<a class="btn primary" href="{{ '/prism/' | relative_url }}">Get started with Prism</a>
<a class="btn" href="{{ '/benchmarks/' | relative_url }}">See the benchmark</a>
</div>
</article>
<article class="product shale">
<span class="tag">after the edit</span>
<h3>Shale</h3>
<p>Records the agent session (intent, files touched, checks run, model and cost) and renders it as a card reviewers read before the diff. Gaps are shown, never hidden.</p>
<ul class="proof">
<li>Five minutes to set up: no account, no server</li>
<li>Works across coding agents</li>
<li>A real card on a <a href="https://github.com/provasign/shale-test-bed/pull/1">live demo PR</a></li>
</ul>
<code class="install">brew install provasign/tap/shale</code>
<div class="cta">
<a class="btn primary" href="{{ '/shale/' | relative_url }}">Get started with Shale</a>
<a class="btn" href="https://github.com/provasign/shale-test-bed/pull/1">See a PR card</a>
</div>
</article>
</div>
<div class="reference-row">
<strong>Mason</strong>
<p>The incubating reference agent. It puts Prism change intelligence and Shale evidence into the harness so the complete loop can be measured end to end.</p>
<a class="more" href="{{ '/mason/' | relative_url }}">View Mason</a>
</div>
</div>
</section>
<section class="section">
<div class="wrap">
<h2 class="section-title">Know the whole change before you touch it.</h2>
<p class="section-lead">Prism turns the multi-step investigations developers and agents repeat every day into task-shaped operations with explicit completeness. It works with Claude Code, Codex, Cursor, Copilot (VS Code), Gemini CLI, OpenCode, and Windsurf, as an MCP server or as a <code>prism</code> command the agent runs in its shell.</p>
<div class="prism-demo">
<div class="terminal" aria-label="Real Prism output on gin">
<div class="terminal-head">prism · <span class="op-name">change-impact</span> · real output on gin</div>
<pre class="op-pane" data-op="lookup" hidden><span class="green">$</span> prism lookup responseWriter.Status responseWriter.WriteHeader
<span class="cyan">// method responseWriter.Status response_writer.go:98-100</span>
98 func (w *responseWriter) Status() int {
99 return w.status
100 }
<span class="cyan">// method responseWriter.WriteHeader response_writer.go:67-75</span>
67 func (w *responseWriter) WriteHeader(code int) {
68 if code > 0 && w.status != code {
69 if w.Written() {
...
73 w.status = code</pre>
<pre class="op-pane" data-op="search" hidden><span class="green">$</span> prism search WriteHeaderNow --scope text
<span class="cyan">// COMPLETE — 26 exact matches across 5 files</span>
// 2 different symbols share the name: ResponseWriter.WriteHeaderNow,
// responseWriter.WriteHeaderNow
response_writer.go:
43 WriteHeaderNow() [ResponseWriter.WriteHeaderNow]
77 func (w *responseWriter) WriteHeaderNow() {
85 w.WriteHeaderNow() [responseWriter.Write]
context.go:
215 c.Writer.WriteHeaderNow() [Context.AbortWithStatus]
gin.go:
723 c.writermem.WriteHeaderNow() [Engine.handleHTTPRequest]
...
// test files: 15 hits in 2 files</pre>
<pre class="op-pane" data-op="read" hidden><span class="green">$</span> prism read response_writer.go --from 77 --to 82
<span class="cyan">// response_writer.go lines 77-82 of 148</span>
77 func (w *responseWriter) WriteHeaderNow() {
78 if !w.Written() {
79 w.size = 0
80 w.ResponseWriter.WriteHeader(w.status)
81 }
82 }</pre>
<pre class="op-pane" data-op="query" hidden><span class="green">$</span> prism query --terms WriteHeaderNow
<span class="cyan">Anchors — callers</span>
WriteHeaderNow response_writer.go:77 16 callers
tested by TestContextBadAutoBind, TestContextBindRequestTooLarge, +3
AbortWithStatus context.go:213 14 callers
tested by TestContextAbortWithStatus, TestMiddlewareAbort, +3
Render context.go:1179 21 callers
handleHTTPRequest gin.go:690 2 callers
<span class="cyan">Source</span> context.go, gin.go, response_writer.go windows</pre>
<pre class="op-pane" data-op="change-impact"><span class="green">$</span> prism change-impact ResponseWriter.Status
completeness: <span class="green">closed</span> (compiler-backed go)
<span class="cyan">editSites (14)</span>
response_writer.go:30:2 Status() int
response_writer.go:98:26 func (w *responseWriter) Status() int
gin.go:770:17 if c.writermem.Status() == code
logger.go:301:31 param.StatusCode = c.Writer.Status()
... 10 more in tests
<span class="cyan">not this change</span> 17 lines calling Context.Status
9 comments and docs</pre>
<pre class="op-pane" data-op="verify" hidden># after deleting WriteHeaderNow from response_writer.go
<span class="green">$</span> prism verify --removed WriteHeaderNow
<span class="cyan">exact identifier mentions remain (0/1 clean)</span>
WriteHeaderNow: 22 mentions
context.go:215 c.Writer.WriteHeaderNow()
context.go:1184 c.Writer.WriteHeaderNow()
gin.go:723 c.writermem.WriteHeaderNow()
gin.go:778 c.writermem.WriteHeaderNow()
...</pre>
</div>
<div class="operations" role="group" aria-label="Prism operations: choose one to see its output">
<button type="button" class="operation" data-op="lookup" aria-pressed="false"><code>lookup</code><p>The source of symbols the agent can name, up to ten in one call.</p></button>
<button type="button" class="operation" data-op="search" aria-pressed="false"><code>search</code><p>Text or symbol search where every hit names its enclosing function, with complete file inventories.</p></button>
<button type="button" class="operation" data-op="read" aria-pressed="false"><code>read</code><p>A known file range, without a separate open-and-scroll step.</p></button>
<button type="button" class="operation" data-op="query" aria-pressed="false"><code>query</code><p>Callers, implementations and tests around the names the agent already has.</p></button>
<button type="button" class="operation" data-op="change-impact" aria-pressed="true"><code>change-impact</code><p>Every declaration, override, implementation and caller a change touches, with edit sites and an explicit completeness verdict.</p></button>
<button type="button" class="operation" data-op="verify" aria-pressed="false"><code>verify</code><p>Optional: after a removal, every remaining mention of the removed names.</p></button>
</div>
</div>
<div class="cta">
<a class="btn primary" href="https://github.com/provasign/prism">Get Prism</a>
<a class="btn" href="{{ '/benchmarks/' | relative_url }}">See the benchmarks</a>
</div>
</div>
</section>
<section class="section">
<div class="wrap">
<h2 class="section-title">Measured against native Claude Code.</h2>
<p class="section-lead">Prism 1.0 (measured on v0.87.39) against Claude Code's own tools, Sonnet 5.5, on two task sets: 32 change tasks and 40 real bug-fix issues. The tasks, run records, transcripts, and limits are public.</p>
<div class="principles">
<div class="principle"><strong>Change work: 0.76× cost</strong><p>32 renames and signature changes in Python, Java, TypeScript and Go. Prism solved all 32 (native 31) with 0.65× the tool calls. About 22% cheaper over a working session.</p></div>
<div class="principle"><strong>Bug fixes: 0.92× cost</strong><p>40 GitHub issues filed after the model's training cutoff. Same results as native (25 vs 23 solved, within noise) with 0.85× the tool calls. About 8% cheaper over a session.</p></div>
<div class="principle"><strong>Open evidence</strong><p>Tasks, raw agent records, and transcripts live in the public Research repository.</p></div>
</div>
<div class="cta">
<a class="btn primary" href="{{ '/benchmarks/' | relative_url }}">Review the evidence</a>
<a class="btn" href="https://github.com/provasign/research">Open the research repository</a>
</div>
</div>
</section>
<section class="section">
<div class="wrap">
<h2 class="section-title">Make the result explain itself in review.</h2>
<p class="section-lead">Shale turns the agent session into a compact evidence card that travels with the code. It shows what is known and what is missing.</p>
<div class="demo-grid">
<img class="termimg" src="{{ '/assets/images/shale-demo.svg' | relative_url }}" alt="A Shale session: intent, edits, checks, completion, and evidence publication" width="720" loading="lazy">
<div class="ghcard">
<div class="ghhead"><span class="ghbot">github-actions</span> <span class="ghdim">bot commented</span></div>
<div class="ghbody">
<div class="ctitle">Shale · 1 session · claude-code</div>
<div class="cmeta">60k tokens · 2 iterations · < 1 min</div>
<div class="csub">Intent</div>
<blockquote><strong>Add rate limiting to the login endpoint</strong><br>Token bucket per client IP. Return 429 with Retry-After.</blockquote>
<div class="csub">Changed files (3) · all with evidence</div>
<table>
<tr><td><code>ratelimit.go</code></td><td>verified</td></tr>
<tr><td><code>ratelimit_test.go</code></td><td>verified</td></tr>
<tr><td><code>main.go</code></td><td>verified</td></tr>
</table>
<div class="csub">Checks recorded locally</div>
<table><tr><td><code>go test ./...</code></td><td>passed</td></tr></table>
<div class="cmeta"><em>Advisory · CI is authoritative.</em></div>
</div>
</div>
</div>
<p class="note">The evidence format is real. See the <a href="https://github.com/provasign/shale-test-bed/pulls?q=is%3Apr">live demo pull requests</a>.</p>
<div class="cta">
<a class="btn primary" href="https://github.com/provasign/shale">Get Shale</a>
<a class="btn" href="{{ '/shale/' | relative_url }}">Read the Shale guide</a>
</div>
</div>
</section>
<section class="section">
<div class="wrap">
<h2 class="section-title">Local tools. Open evidence.</h2>
<p class="section-lead">Each project works on its own and fits the tools developers already use. There is no shared account or hosted control plane.</p>
<div class="principles">
<div class="principle"><strong>Local first</strong><p>Code analysis and session capture stay with the repository and developer workflow.</p></div>
<div class="principle"><strong>Measured claims</strong><p>Correctness results are tied to published tasks, independent oracles, and raw runs.</p></div>
<div class="principle"><strong>Honest boundaries</strong><p>Unsupported analysis and missing evidence are labeled instead of silently promoted to certainty.</p></div>
</div>
<div class="foundation"><strong>Under Prism: Grove.</strong> Prism embeds Grove's code graph. <a href="{{ '/grove/' | relative_url }}">Grove remains available to tool builders</a>, but Prism users do not install or configure it separately.</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="site-footer-inner">Prism before the edit. Shale after it. Mason proves the loop.</div>
</footer>
<script>
(function () {
var buttons = document.querySelectorAll('button.operation');
var panes = document.querySelectorAll('.op-pane');
var name = document.querySelector('.op-name');
buttons.forEach(function (b) {
b.addEventListener('click', function () {
var op = b.getAttribute('data-op');
buttons.forEach(function (x) { x.setAttribute('aria-pressed', x === b ? 'true' : 'false'); });
panes.forEach(function (p) { p.hidden = p.getAttribute('data-op') !== op; });
if (name) name.textContent = op;
});
});
})();
</script>
</body>
</html>