Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions public/sitemap.xml

This file was deleted.

13 changes: 8 additions & 5 deletions src/components/Nav.astro
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
---
import ThemeToggle from './ThemeToggle.astro';

// Section anchors are prefixed with `/` so they resolve to the homepage from
// any route (e.g. /#publications works from /talks); Community is a real page.
const links = [
{ label: 'Publications', href: '#publications' },
{ label: 'Research', href: '#research' },
{ label: 'About', href: '#about' },
{ label: 'Team', href: '#team' },
{ label: 'Publications', href: '/#publications' },
{ label: 'Research', href: '/#research' },
{ label: 'Community', href: '/community' },
{ label: 'About', href: '/#about' },
{ label: 'Team', href: '/#team' },
];
---
<nav id="navbar" class="fixed top-0 inset-x-0 z-50 transition-all duration-200 border-b border-transparent bg-white/0">
<div class="container-site">
<div class="flex items-center justify-between h-14">
{/* Logo */}
<a href="#" aria-label="Redarc Labs" class="flex items-center">
<a href="/" aria-label="Redarc Labs" class="flex items-center">
<img
src="/logo.svg"
alt="Redarc Labs"
Expand Down
49 changes: 49 additions & 0 deletions src/content.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';

// Field-building content. One markdown file per entry — add a file, no code change.
// `draft: true` hides an entry from the live site (still buildable locally).

const talks = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/talks' }),
schema: z.object({
title: z.string(),
date: z.coerce.date(),
venue: z.string(),
location: z.string().optional(),
speaker: z.string().optional(),
tags: z.array(z.string()).default([]),
slides: z.string().url().optional(),
video: z.string().url().optional(),
draft: z.boolean().default(false),
}),
});

const workshops = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/workshops' }),
schema: z.object({
title: z.string(),
date: z.coerce.date(),
cohort: z.string().optional(),
format: z.string().optional(),
location: z.string().optional(),
summary: z.string(),
tags: z.array(z.string()).default([]),
materials: z.string().url().optional(),
draft: z.boolean().default(false),
}),
});

const curriculum = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/curriculum' }),
schema: z.object({
title: z.string(),
order: z.number().default(0),
summary: z.string(),
duration: z.string().optional(),
tags: z.array(z.string()).default([]),
draft: z.boolean().default(false),
}),
});

export const collections = { talks, workshops, curriculum };
26 changes: 26 additions & 0 deletions src/content/curriculum/01-foundations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
title: "Foundations: Activations, Probes & Features"
order: 1
duration: "Week 1–2"
summary: "The groundwork — residual streams, linear probes, and the linear representation hypothesis. Everything later modules build on."
tags: ["foundations", "probes"]
draft: false
---

## Placeholder module — replace with the real syllabus

### Learning goals

- Read and manipulate residual-stream activations.
- Train and interpret a linear probe.
- State the linear representation hypothesis and its limits.

### Readings

- Placeholder reading 1 — swap in the real link.
- Placeholder reading 2 — swap in the real link.

### Exercises

1. Extract activations from an open-weights model and probe for a known concept.
2. Report where the probe succeeds and where it fails.
24 changes: 24 additions & 0 deletions src/content/curriculum/02-steering-and-control.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
title: "Steering & Control Vectors"
order: 2
duration: "Week 3–4"
summary: "From reading features to changing behaviour — constructing steering vectors, applying them, and measuring their effects."
tags: ["steering", "control"]
draft: false
---

## Placeholder module — replace with the real syllabus

### Learning goals

- Construct a steering vector from contrastive activations.
- Apply steering at inference and measure the behavioural change.
- Understand deflection vectors as a special case.

### Readings

- Placeholder reading 1 — swap in the real link.

### Exercises

1. Build a steering vector for a target behaviour and quantify its effect.
25 changes: 25 additions & 0 deletions src/content/curriculum/03-adversarial-settings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
title: "Adversarial Settings: When Models Don't Cooperate"
order: 3
duration: "Week 5–6"
summary: "The core of the field — what breaks when a model is actively non-cooperative, and how to build detection that survives adversarial pressure."
tags: ["adversarial interp", "deception detection"]
draft: false
---

## Placeholder module — replace with the real syllabus

### Learning goals

- Characterise how standard interpretability degrades under adversarial pressure.
- Build a detector and red-team it.
- Reason about evaluation when ground truth is contested.

### Readings

- Placeholder reading 1 — swap in the real link.

### Exercises

1. Take a detector from Module 2 and break it. Document the failure mode.
2. Harden it and re-evaluate.
15 changes: 15 additions & 0 deletions src/content/talks/adversarial-interp-neurips-socal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
title: "When Models Lie: Adversarial Interpretability in Practice"
date: 2026-03-18
venue: "NeurIPS SoCal Meetup"
location: "Los Angeles, CA"
speaker: "Shivam Dubey"
tags: ["adversarial interp", "deception detection"]
slides: "https://example.com/slides/adversarial-interp"
video: "https://example.com/video/adversarial-interp"
draft: false
---

Placeholder abstract — replace with the real talk description. A 45-minute
walkthrough of why standard interpretability methods break when a model is
actively non-cooperative, and what an adversarial-first approach looks like.
14 changes: 14 additions & 0 deletions src/content/talks/deflection-vectors-guest-lecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
title: "Deflection Vectors: Reading What a Model Steers Away From"
date: 2026-01-27
venue: "University Guest Lecture"
location: "Remote"
speaker: "Manan Wadhwa"
tags: ["mech interp", "activation steering"]
slides: "https://example.com/slides/deflection-vectors"
draft: false
---

Placeholder abstract — replace with the real talk description. An
introduction to deflection vectors for a graduate seminar, covering the core
construction and a live demo on an open-weights model.
26 changes: 26 additions & 0 deletions src/content/workshops/cohort-01-intro-adversarial-interp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
title: "Foundations of Adversarial Interpretability"
date: 2026-02-10
cohort: "Cohort 01"
format: "3-session hands-on series"
location: "Remote"
summary: "An introductory series taking the cohort from linear probes to their first working deflection-vector detector on an open-weights model."
tags: ["cohort", "hands-on", "probes"]
materials: "https://github.com/redarc-labs/workshop-materials"
draft: false
---

## Placeholder — replace with the real workshop write-up

A short description of what this workshop covered and who it was for.

### Session breakdown

1. **Linear probes & activation basics** — extracting and reading residual-stream activations.
2. **From probes to steering** — constructing and applying steering vectors.
3. **Building a detector** — a capstone where each participant ships a working deflection-vector detector.

### What participants leave with

- A runnable notebook and reusable tooling.
- A mental model for when interpretability holds and when it breaks.
25 changes: 25 additions & 0 deletions src/content/workshops/cohort-02-deception-detection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
title: "Detecting Deception at the Activation Level"
date: 2026-05-19
cohort: "Cohort 02"
format: "Full-day intensive"
location: "Remote"
summary: "A one-day intensive on activation-level deception detection: building evaluation harnesses, red-teaming your own detectors, and reasoning about non-cooperative models."
tags: ["cohort", "deception detection", "evaluation"]
draft: false
---

## Placeholder — replace with the real workshop write-up

A short description of what this workshop covered and who it was for.

### Session breakdown

1. **Threat modelling** — what "non-cooperative" actually means for interpretability.
2. **Evaluation harnesses** — measuring whether a detector works under adversarial pressure.
3. **Red-teaming** — breaking your own detector, then hardening it.

### What participants leave with

- An evaluation harness they can point at their own models.
- A checklist for stress-testing interpretability claims.
31 changes: 31 additions & 0 deletions src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,39 @@ body {
line-height: 1.3;
color: var(--color-ink);
}

/* Rendered markdown (curriculum modules, workshop write-ups) */
.prose { color: var(--color-ink-sec); font-size: 0.9375rem; line-height: 1.75; }
.prose > :first-child { margin-top: 0; }
.prose h2 {
font-size: 1.25rem; font-weight: 500; letter-spacing: -0.02em;
color: var(--color-ink); margin: 2.5rem 0 0.875rem;
}
.prose h3 {
font-size: 1rem; font-weight: 560; letter-spacing: -0.01em;
color: var(--color-ink); margin: 1.75rem 0 0.625rem;
}
.prose p { margin: 0 0 1rem; }
.prose ul, .prose ol { margin: 0 0 1rem; padding-left: 1.25rem; }
.prose li { margin-bottom: 0.375rem; }
.prose li::marker { color: var(--color-ink-muted); }
.prose a {
color: var(--color-ink); text-decoration: none;
border-bottom: 1px solid var(--color-rule-strong); transition: border-color 120ms ease;
}
.prose a:hover { border-bottom-color: var(--color-ink); }
.prose strong { color: var(--color-ink); font-weight: 600; }
.prose code {
font-family: var(--font-mono); font-size: 0.85em;
background: var(--color-paper-ruled); padding: 0.1rem 0.35rem; border-radius: 3px;
}
}

/* ─── Shared hover states (used across pages) ───────────────────── */
.link-paper:hover { border-color: var(--color-ink) !important; }
.repo-row:hover .repo-icon { color: var(--color-ink) !important; }
.social-link:hover { border-color: var(--color-red) !important; color: var(--color-red) !important; }

/* ─── Nav scroll state ──────────────────────────────────────────── */
.nav-solid {
background: color-mix(in srgb, var(--color-paper) 94%, transparent) !important;
Expand Down
8 changes: 6 additions & 2 deletions src/layouts/Base.astro
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import Footer from '../components/Footer.astro';
interface Props {
title: string;
description: string;
/** Social-card description; falls back to `description` when omitted. */
ogDescription?: string;
keywords?: string;
ogImage?: string;
/** Override the auto-computed canonical (defaults to site + current path). */
Expand All @@ -15,6 +17,7 @@ interface Props {
const {
title,
description,
ogDescription,
keywords,
ogImage,
canonical,
Expand All @@ -23,6 +26,7 @@ const {
// Astro.site is set in astro.config.mjs → canonical/OG URLs are absolute.
const canonicalURL = canonical ?? new URL(Astro.url.pathname, Astro.site).href;
const ogImageURL = new URL(ogImage ?? '/logo.svg', Astro.site).href;
const socialDescription = ogDescription ?? description;
---
<!doctype html>
<html lang="en">
Expand All @@ -34,14 +38,14 @@ const ogImageURL = new URL(ogImage ?? '/logo.svg', Astro.site).href;
{keywords && <meta name="keywords" content={keywords} />}

<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:description" content={socialDescription} />
<meta property="og:url" content={canonicalURL} />
<meta property="og:type" content="website" />
<meta property="og:image" content={ogImageURL} />

<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:description" content={socialDescription} />
<meta name="twitter:image" content={ogImageURL} />

<link rel="canonical" href={canonicalURL} />
Expand Down
10 changes: 10 additions & 0 deletions src/lib/date.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const fmt = new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'short',
day: 'numeric',
});
Comment on lines +1 to +5

/** "Mar 18, 2026" — stable, locale-independent output for content dates. */
export function formatDate(date: Date): string {
return fmt.format(date);
}
Loading