Skip to content

Commit dde2b36

Browse files
committed
docs(site,skills): promote BYOD + cross-reference older skills
Two follow-ups to the substrate-complete state. Site: add a "Bring Your Own Data" section between Query+Policy and Capabilities. The differentiator story now reads coherently from the homepage: structural baseline -> queryable through Rayfall -> extensible through CSV import + vector primitives -> enforceable through .rfl policy packs. Four feature cards explain external signals as tables, vector search as policy, the shared sym-table join semantics, and the live progress on stderr. Code block shows the canonical "join coverage.csv with temporal_hotspots" recipe with inline highlight spans matching the rest of the site palette. Section alternation rebalanced: BYOD slots in as section-alt, with capabilities flipping to plain and languages flipping to alt to keep the pattern. llms.txt mirrors the new content for crawlers: a "Bring your own data" section covering CSV import + cos-dist / knn / hnsw-build / ann, plus a "Live progress" section noting the stderr-only throttled feedback channel for long Rayfall queries. Skills: the four phase-scoped skills (bootstrap / impact / verify / audit) predate Lanes A/G/H so an agent reading any of them today gets no signal that baseline_query / policy_check / import_csv even exist. Add a "See also" section to each with the cross-references relevant to that phase: bootstrap -> raysense-query, policy_check, import_csv (everything the bootstrap baseline now unlocks) impact -> Datalog reaches, .graph.shortest-path, ad-hoc joins for author-weighted blast radius verify -> policy_check (alongside check_rules) audit -> .graph.pagerank / louvain / betweenness for centrality audits, import_csv for external audit data Each cross-reference is one short paragraph -- enough to plant the seed for the SkillRouter, not enough to bloat the host skill. No behavior changes; pure documentation surface.
1 parent 0dd1a47 commit dde2b36

6 files changed

Lines changed: 120 additions & 4 deletions

File tree

claude-plugin/skills/raysense-audit/SKILL.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,19 @@ land better.
4242
- The user asked a narrow question. Use `raysense-impact` or a
4343
single targeted MCP call instead.
4444
- The repo is tiny (under ~50 files). The audit will produce mostly
45-
noise — just call `raysense_health` and read out the grade.
45+
noise -- just call `raysense_health` and read out the grade.
46+
47+
## See also
48+
49+
The audit's typed tools surface what raysense already knows. When
50+
the user asks an audit-shaped question that doesn't fit a typed
51+
tool, the **raysense-query** skill exposes Rayfall directly via
52+
`raysense_baseline_query`:
53+
54+
- Custom architectural breakdowns -- group calls by caller module,
55+
count cross-layer imports, find ownership-by-language splits.
56+
- `.graph.pagerank` / `.graph.louvain` / `.graph.betweenness` over
57+
call_edges or module_edges for centrality-based audits.
58+
- `raysense_baseline_import_csv` to bring external audit data
59+
(coverage, lint counts, test runtime) into the same query
60+
substrate as the structural baseline.

claude-plugin/skills/raysense-bootstrap/SKILL.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,24 @@ After bootstrap, the agent should remember (briefly):
4040

4141
## When to skip
4242

43-
- Session is read-only (the user just asked a question no edits
43+
- Session is read-only (the user just asked a question -- no edits
4444
planned). Skip bootstrap; reach for `raysense-audit` instead if
4545
structural context is needed.
4646
- A baseline already exists from a recent session and no commits have
4747
landed since (`git log -1 --since='1 hour ago'` shows nothing).
4848
Re-using the previous baseline is fine; just call `raysense_health`
4949
for a fresh grade and skip the rest.
50+
51+
## See also
52+
53+
The baseline this skill produces is queryable, not just a dump.
54+
After bootstrap, the agent has access to:
55+
56+
- `raysense_baseline_query` -- run any Rayfall expression against a
57+
saved table. Syntax and worked examples in the **raysense-query**
58+
skill (select / `.graph.*` / Datalog / vector search).
59+
- `raysense_policy_check` -- evaluate `.rfl` policy packs in
60+
`<repo>/.raysense/policies/`; ships its own exit-code semantics for
61+
CI gating.
62+
- `raysense_baseline_import_csv` -- bring external CSVs (coverage,
63+
lint counts, embeddings) into the baseline as queryable tables.

claude-plugin/skills/raysense-impact/SKILL.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,18 @@ the target file path relative to that root.
4646
- Local-only edit inside one file with no signature changes (typo
4747
fix, comment, internal rename). No downstream effect, no need.
4848
- Brand-new file. Nothing depends on it yet.
49+
50+
## See also
51+
52+
For cases the typed tools above don't cover, the **raysense-query**
53+
skill exposes Rayfall directly via `raysense_baseline_query`:
54+
55+
- Custom reachability rules through Datalog -- declarative
56+
`(reaches ?a ?b)` plus a recursive arm gives the same shape as
57+
`raysense_blast_radius` but with a rule the agent picks at query
58+
time.
59+
- `.graph.shortest-path` / `.graph.k-shortest` for path-aware impact
60+
("which call paths reach this entry point") that go beyond the
61+
blast-radius set.
62+
- Ad-hoc joins between `call_edges` and `change_coupling` /
63+
`file_ownership` to weight blast radius by author / commit history.

claude-plugin/skills/raysense-verify/SKILL.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,18 @@ report is:
4545
affect imports.
4646
- The session bootstrapped less than a minute ago and the working
4747
tree shows trivial changes (`git diff --stat` is one or two lines).
48+
49+
## See also
50+
51+
For verify checks the typed tools don't cover natively:
52+
53+
- `raysense_policy_check` -- evaluates `.rfl` files in
54+
`<repo>/.raysense/policies/`. Use this when the team has shipped
55+
custom architectural rules; they fire alongside the built-in
56+
`raysense_check_rules` but are code-reviewable in the repo. Exit
57+
code 1 = a policy itself failed to evaluate, 2 = at least one
58+
error-severity finding.
59+
- `raysense_baseline_query` -- the **raysense-query** skill covers
60+
the syntax. Useful when a verify-time question is shaped like "did
61+
any new file land that violates X" and X needs a custom Rayfall
62+
expression.

site/index.html

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,49 @@ <h3>Composable across history</h3>
313313
</div>
314314
</section>
315315

316-
<section class="section section-alt">
316+
<section id="byod" class="section section-alt">
317+
<div class="container">
318+
<div class="section-eyebrow">BRING YOUR OWN DATA</div>
319+
<h2>Coverage. Lint counts. Embeddings. Same query language.</h2>
320+
<p class="section-lead">
321+
Drop a CSV; it joins the baseline. First row is headers, column types are inferred, and the shared symbol table means cross-table predicates like <code>(in path (at coverage 'path))</code> work without ETL. Vector primitives - <code>cos-dist</code>, <code>l2-dist</code>, <code>knn</code>, <code>hnsw-build</code>, <code>ann</code> - are built into Rayfall, so embeddings imported alongside the structural baseline serve semantic similarity from the same query expression that drives policy gates.
322+
</p>
323+
324+
<div class="code-block code-block-wide">
325+
<div class="code-block-head">join coverage.csv with raysense's own temporal hotspots</div>
326+
<pre><code><span class="hl-cmt">$</span> <span class="hl-kw">raysense</span> baseline import-csv coverage <span class="hl-str">./coverage.csv</span>
327+
<span class="hl-cmt"> imported ./coverage.csv -&gt; .raysense/baseline/tables/coverage</span>
328+
329+
<span class="hl-cmt">$</span> <span class="hl-kw">raysense</span> baseline query temporal_hotspots \
330+
<span class="hl-str">'(select {from: t
331+
where: (in path
332+
(at (select {from: coverage where: (&lt; covered_pct 50)})
333+
(quote path)))
334+
desc: risk_score})'</span></code></pre>
335+
</div>
336+
337+
<div class="feature-grid">
338+
<div class="feature-card">
339+
<h3>External signals as tables</h3>
340+
<p>Coverage, lint counts, error budgets, runtime traces, ownership-from-elsewhere - any CSV becomes addressable from <code>baseline query</code>, <code>policy check</code>, and the MCP tools. Subsequent re-imports overwrite cleanly; the schema-version stamp keeps stale baselines from silently mis-rendering.</p>
341+
</div>
342+
<div class="feature-card">
343+
<h3>Vector search as policy</h3>
344+
<p>Pair CSV import with embeddings: <code>cos-dist</code> for direct similarity, <code>knn</code> for brute-force scans on small sets, <code>hnsw-build</code> + <code>ann</code> for sub-linear queries on &gt;10k vectors. An <code>.rfl</code> policy that flags near-duplicate functions is six lines.</p>
345+
</div>
346+
<div class="feature-card">
347+
<h3>One sym table, one schema</h3>
348+
<p>Imported tables share the baseline's interned-string space, so <code>path</code> in <code>coverage</code> and <code>path</code> in <code>files</code> point to the same sym ID. Joins are predicate equality, not ETL plumbing - and the schema-version stamp catches imports against an out-of-date baseline directory.</p>
349+
</div>
350+
<div class="feature-card">
351+
<h3>Live progress on stderr</h3>
352+
<p>Long Rayfall queries print throttled progress lines to stderr - <code>op_name</code>, <code>phase</code>, <code>rows_done / rows_total</code>, elapsed seconds, memory used. JSON callers stay byte-clean; humans on a TTY get the live signal. Quick queries (under 200ms) stay silent by design.</p>
353+
</div>
354+
</div>
355+
</div>
356+
</section>
357+
358+
<section class="section">
317359
<div class="container">
318360
<div class="section-eyebrow">CAPABILITIES</div>
319361
<h2>Beyond the score.</h2>
@@ -359,7 +401,7 @@ <h3>69 languages out of the box</h3>
359401
</div>
360402
</section>
361403

362-
<section id="languages" class="section">
404+
<section id="languages" class="section section-alt">
363405
<div class="container">
364406
<div class="section-eyebrow">LANGUAGE COVERAGE</div>
365407
<h2>69 languages, three tiers of analysis depth.</h2>

site/llms.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,21 @@ Every saved baseline is a queryable columnar database. Two surfaces share one su
5757

5858
A policy is just a Rayfall expression that returns a table with columns severity, code, path, message. Empty result table = policy passed.
5959

60+
## Bring your own data
61+
62+
Drop a CSV; it joins the baseline. `raysense baseline import-csv <name> <path>` (CLI) or `raysense_baseline_import_csv` (MCP) reads the CSV with first-row headers, infers column types, and writes it as a splayed table alongside the built-in ones. Subsequent queries can join across imported and built-in tables because they share the baseline's interned-string sym table - `path` in an imported coverage CSV points to the same sym ID as `path` in the structural `files` table.
63+
64+
Vector primitives are built into Rayfall:
65+
- `cos-dist` / `l2-dist` / `inner-prod` / `norm` for direct similarity.
66+
- `knn` for brute-force nearest-neighbor over a list of candidate vectors; returns a (_rowid, _dist) table sorted ascending.
67+
- `hnsw-build` / `ann` / `hnsw-save` / `hnsw-load` / `hnsw-info` for sub-linear approximate-nearest-neighbor on >10k vector spaces.
68+
69+
Pair the two: import an embeddings CSV (file_id + e0..eN columns), build an HNSW index, and ship a `.rfl` policy that flags near-duplicate functions or finds the most-similar files to a target. Vector search becomes a CI gate without a separate service.
70+
71+
## Live progress
72+
73+
Long Rayfall queries (group-by aggregations, pivots) emit throttled progress lines on stderr from the CLI surfaces - `[rayfall] op / phase rows_done / rows_total elapsed=Xs mem=YMB`. JSON callers (--json, MCP, pipes) stay byte-clean. Quick queries under 200ms emit nothing.
74+
6075
## Capabilities beyond the score
6176

6277
- Live treemap dashboard. Every file, every metric, every cycle, refreshed on save.

0 commit comments

Comments
 (0)