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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
44 changes: 44 additions & 0 deletions .github/workflows/site-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Build Doc Site

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

concurrency:
group: site-build-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-24.04
steps:
- name: Checkout experiments
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
path: experiments

- name: Checkout fullsend (doc site source)
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
repository: fullsend-ai/fullsend
path: fullsend

- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "22"
cache: npm
cache-dependency-path: fullsend/website/package-lock.json

- name: Install and build doc site
working-directory: fullsend/website
run: |
npm ci --ignore-scripts
rm -rf ../experiments
ln -s "$GITHUB_WORKSPACE/experiments" ../experiments
ln -sfn "$GITHUB_WORKSPACE/experiments" ../docs/experiments
npx vitepress build
22 changes: 22 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,28 @@ repos:
types: [python]
pass_filenames: false

- id: lint-experiment-numbers
name: lint experiment numbers
entry: ./hack/lint-experiment-numbers
language: script
files: ^[0-9]{4}-
pass_filenames: false

- id: lint-experiment-frontmatter
name: lint experiment frontmatter
entry: ./hack/lint-experiment-frontmatter
language: python
additional_dependencies: ["pyyaml>=6.0"]
files: ^[0-9]{4}-
pass_filenames: false

- id: lint-experiment-index
name: lint experiment index
entry: ./hack/lint-experiment-index
language: script
files: (^[0-9]{4}-|^README\.md$)
pass_filenames: false

- repo: https://github.com/PyCQA/bandit
rev: "1.9.4"
hooks:
Expand Down
26 changes: 26 additions & 0 deletions 0000-experiment-template/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
title: "NNNN. TITLE"
status: Active
topics:
- topic-tag
---

# NNNN. TITLE

Date: YYYY-MM-DD

## Hypothesis

What are you trying to learn or prove?

## Approach

How will you test the hypothesis?

## Results

What happened? (fill in as the experiment progresses)

## Conclusion

What did you learn? Should this be adopted, modified, or abandoned?
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
---
title: "1. Agent outage fire drill"
status: Active
topics:
- reliability
- incident-response
---

# Experiment 003: Agent Outage Fire Drill

**Date:** 2026-03-16
Expand Down Expand Up @@ -91,5 +99,5 @@ This experiment requires an agent autonomy period to have elapsed first. It can'

## Relationship to other experiments

- **[Experiment 002](adr46-claude-scanner/README.md)** tests automated enforcement of architectural invariants. This experiment tests whether the humans responsible for architectural judgment can still exercise it without agent support.
- **[Experiment 002](0002-claude-scanner/README.md)** tests automated enforcement of architectural invariants. This experiment tests whether the humans responsible for architectural judgment can still exercise it without agent support.
- A complementary experiment could measure review quality specifically (can humans still evaluate agent-produced code?) — this experiment is broader, testing whether humans can still write, review, debug, and ship.
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
---
title: "2. Claude-based ADR drift scanner"
status: Concluded
topics:
- evaluation
- tooling
---

# Experiment 002: Claude-based ADR Drift Scanner

A shell script that uses `claude` CLI to analyze Tekton tasks for ADR compliance. No hardcoded rules, no config files — all intelligence comes from claude's comprehension of the ADR text.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ An LLM can read an ADR, understand its architectural intent, evaluate a code art

## Method

1. Wrote a hand-crafted [expected analysis](../../experiments/adr46-claude-scanner/expected/modelcar-oci-ta.md) as a human benchmark — our own reading of what violates the ADR and what to do about each case
1. Wrote a hand-crafted [expected analysis](expected/modelcar-oci-ta.md) as a human benchmark — our own reading of what violates the ADR and what to do about each case
2. Built a shell script that combines the ADR text and task YAML into a prompt and passes it to `claude -p`
3. Ran the scanner and captured [claude's output](../../experiments/adr46-claude-scanner/results/modelcar-oci-ta.md)
3. Ran the scanner and captured [claude's output](results/modelcar-oci-ta.md)
4. Evaluated against the expected analysis using a four-point rubric

## Results
Expand Down
File renamed without changes.
File renamed without changes.
10 changes: 9 additions & 1 deletion adr46-scanner/README.md → 0003-scanner/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
---
title: "3. ADR-0046 drift scanner"
status: Concluded
topics:
- evaluation
- tooling
---

# Experiment 001: ADR-0046 Drift Scanner

A Python CLI tool that detects Tekton task steps drifting from [ADR-0046](https://github.com/konflux-ci/architecture/blob/main/ADR/0046-common-task-runner-image.md) (common task runner image) by comparing step images against a config-driven allowlist.
Expand All @@ -18,4 +26,4 @@ Parses Tekton task YAML files, extracts step images, and flags any that don't ma

## Limitations

This scanner uses deterministic string matching. It validates that mechanical drift detection works, but doesn't generalize to ADRs that express design intent rather than concrete image requirements. See [Experiment 002](../adr46-claude-scanner/) for the LLM-based approach.
This scanner uses deterministic string matching. It validates that mechanical drift detection works, but doesn't generalize to ADRs that express design intent rather than concrete image requirements. See [Experiment 002](../0002-claude-scanner/) for the LLM-based approach.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
---
title: "4. Zero-config autonomous bug fix engine with self-improving meta-loop"
status: Concluded
topics:
- tooling
- github-actions
- evaluation
---

# Experiment 006: Zero-Config Autonomous Bug Fix Engine with Self-Improving Meta-Loop

**Date:** 2026-03-29
Expand Down Expand Up @@ -128,7 +137,7 @@ The tradeoff is real: without repo-specific context (no AGENTS.md, no CLAUDE.md,

### Production execution as evaluation

The meta-loop offers an alternative to the golden-set evaluation approach explored in [Experiment 004](../promptfoo-eval/README.md). Instead of curated test cases with expected outputs, the signal comes from running the agent against real tasks and feeding the results back. The two approaches are complementary:
The meta-loop offers an alternative to the golden-set evaluation approach explored in [Experiment 004](../0016-promptfoo-eval/README.md). Instead of curated test cases with expected outputs, the signal comes from running the agent against real tasks and feeding the results back. The two approaches are complementary:

- **Golden-set (promptfoo):** catches prompt regressions, verifies format compliance, runs in seconds. Tests prompts, not agents.
- **Meta-loop:** catches integration-level bugs that only manifest in production, verifies end-to-end behavior, takes minutes to hours. Tests the full agent system.
Expand All @@ -141,6 +150,6 @@ The meta-loop improves the engine using an LLM, but who improves the meta-loop?

## Relationship to other experiments

- **[Experiment 001](../adr46-scanner/README.md)** and **[Experiment 002](../adr46-claude-scanner/README.md)** test detecting architectural drift — a concern that the meta-loop's engine doesn't address (it fixes bugs, not architectural violations).
- **[Experiment 003](../003-agent-outage-fire-drill.md)** tests whether humans maintain capability when agents are removed. The meta-loop experiment is the other side: what happens when you push agents further toward full autonomy, including self-repair?
- **[Experiment 004](../promptfoo-eval/README.md)** tests prompt-level evaluation with promptfoo. The meta-loop provides a complementary evaluation approach at the integration level.
- **[Experiment 001](../0003-scanner/README.md)** and **[Experiment 002](../0002-claude-scanner/README.md)** test detecting architectural drift — a concern that the meta-loop's engine doesn't address (it fixes bugs, not architectural violations).
- **[Experiment 003](../0001-agent-outage-fire-drill.md)** tests whether humans maintain capability when agents are removed. The meta-loop experiment is the other side: what happens when you push agents further toward full autonomy, including self-repair?
- **[Experiment 004](../0016-promptfoo-eval/README.md)** tests prompt-level evaluation with promptfoo. The meta-loop provides a complementary evaluation approach at the integration level.
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
---
title: "5. Agent scoped tools triage"
status: Concluded
topics:
- security
- sandbox
- skills
---

# PoC FullSend — Triage Agents with scoped tools and sandbox

This experiment addresses: https://github.com/fullsend-ai/fullsend/issues/101

Counterpart to [experiment 67](../67-claude-github-app-auth/) which demonstrates the wrapper/pure-I/O approach. This experiment demonstrates an alternative using established patterns from [Claude Code](https://code.claude.com/docs/en/skills) and [OpenCode](https://opencode.ai/docs/skills/): **skills define capabilities, agents execute them with scoped tools, and a top-level agent orchestrates the flow.**
Counterpart to [experiment 67](../0022-claude-github-app-auth/) which demonstrates the wrapper/pure-I/O approach. This experiment demonstrates an alternative using established patterns from [Claude Code](https://code.claude.com/docs/en/skills) and [OpenCode](https://opencode.ai/docs/skills/): **skills define capabilities, agents execute them with scoped tools, and a top-level agent orchestrates the flow.**

### What this experiment covers

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
---
title: "6. Code agent evaluation"
status: Concluded
topics:
- evaluation
- security
---

# Code Agent Evaluation Experiment

**Date:** April 11–14, 2026
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
---
title: "7. GitHub Actions agent runtime MVP"
status: Concluded
topics:
- github-actions
- tooling
---

# Experiment: GitHub Actions Agent Runtime MVP

## Hypothesis
Expand Down
File renamed without changes.
14 changes: 11 additions & 3 deletions guardrails-eval/README.md → 0008-guardrails-eval/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
---
title: "8. Guardrails evaluation"
status: Concluded
topics:
- security
- evaluation
---

# Experiment: Pluggable Guardrails Evaluation

Evaluates prompt injection scanning tools as pre-LLM guardrails for fullsend's autonomous SDLC pipeline. Extends the [Model Armor experiment](../model-armor-vs-agent-triage/) (PR #117) with additional attack payloads and alternative scanning backends.
Evaluates prompt injection scanning tools as pre-LLM guardrails for fullsend's autonomous SDLC pipeline. Extends the [Model Armor experiment](../0012-model-armor-vs-agent-triage/) (PR #117) with additional attack payloads and alternative scanning backends.

Related: [Story 6 (#129)](https://github.com/fullsend-ai/fullsend/issues/129) — Prompt injection defense

Expand All @@ -10,7 +18,7 @@ LLM Guard's DeBERTa-v3 classifier with sentence-level matching detects prompt in

## Background

PR #117 found that Model Armor detected only 1/4 injection payloads (25%) at maximum sensitivity. The [prompt-injection-defense](../prompt-injection-defense/) experiment found that Claude Sonnet 4.6 is inherently resilient, but the DeBERTa v1 classifier "adds no value" beyond what the model catches.
PR #117 found that Model Armor detected only 1/4 injection payloads (25%) at maximum sensitivity. The [prompt-injection-defense](../0015-prompt-injection-defense/) experiment found that Claude Sonnet 4.6 is inherently resilient, but the DeBERTa v1 classifier "adds no value" beyond what the model catches.

This experiment tests whether:
1. LLM Guard's v2 classifier with sentence-level matching improves detection
Expand All @@ -19,7 +27,7 @@ This experiment tests whether:

## Attack Payloads

### Original (from `../prompt-injection-defense/attacks/`)
### Original (from `../0015-prompt-injection-defense/attacks/`)

| Payload | Technique |
|---------|-----------|
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
---
title: "9. Hermes-inspired security patterns"
status: Concluded
topics:
- security
- tooling
---

# Experiment: Hermes-Inspired Security Patterns for Fullsend

Evaluates security patterns from [Hermes Agent](https://github.com/NousResearch/hermes-agent) for integration into fullsend's autonomous SDLC pipeline. Tests two integration strategies: static file scanning via [Tirith](https://github.com/sheeki03/tirith) CLI and runtime SSRF protection via a Claude Code PreToolUse hook.
Expand Down Expand Up @@ -230,7 +238,7 @@ uv run python -m pytest tests/ -v

### Tirith vs LLM Guard Coverage Cross-Reference

Cross-referencing all 12 attack payloads from the [guardrails-eval experiment](../guardrails-eval/) against Tirith's detection capabilities:
Cross-referencing all 12 attack payloads from the [guardrails-eval experiment](../0008-guardrails-eval/) against Tirith's detection capabilities:

| Payload | Technique | LLM Guard (sentence) | Tirith | Notes |
|---------|-----------|---------------------|--------|-------|
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
---
title: "10. Host-side API server for sandboxed agents"
status: Concluded
topics:
- sandbox
- tooling
---

# Experiment: Host-Side API Server for Sandboxed Agents

Tracking issue: [fullsend-ai/experiments#25](https://github.com/fullsend-ai/experiments/issues/25)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

## 1. Repository Cloning (Provisioner API)

**Endpoint:** `POST /repo/provision`
**Endpoint:** `POST /repo/provision`
**Status:** ✅ **Success**

| Field | Value |
Expand All @@ -32,7 +32,7 @@ The repo was successfully cloned and uploaded to `/sandbox/fullsend/repo/`.

## 2. Container Image Build (Builder API)

**Endpoint:** `POST /build`
**Endpoint:** `POST /build`
**Status:** ✅ **Success**

| Field | Value |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

## 1. Repository Clone — ✅ Success

**Endpoint:** `POST /repo/provision`
**Repository:** `fullsend-ai/fullsend` (ref: `main`)
**Endpoint:** `POST /repo/provision`
**Repository:** `fullsend-ai/fullsend` (ref: `main`)
**Destination:** `/sandbox/fullsend`

**Response:**
Expand All @@ -20,10 +20,10 @@ The repository was successfully cloned and uploaded to `/sandbox/fullsend/repo/`

## 2. Container Image Build — ✅ Success

**Endpoint:** `POST /build`
**Containerfile:** `images/sandbox/Containerfile`
**Context directory:** `/sandbox/fullsend/repo`
**Tag:** `fullsend-sandbox:test`
**Endpoint:** `POST /build`
**Containerfile:** `images/sandbox/Containerfile`
**Context directory:** `/sandbox/fullsend/repo`
**Tag:** `fullsend-sandbox:test`
**Destination:** `/sandbox/fullsend-sandbox.tar`

**Result:**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# API Test Results

**Date:** 2026-05-20
**Date:** 2026-05-20
**Sandbox:** `agent-openapi-discovery-full-4038775-1779243123`

---
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# API Server Test Results

**Date:** 2026-06-01
**Date:** 2026-06-01
**Sandbox:** agent-openapi-discovery-restricted-3445554-1780274427

---
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# API Server Test Results

**Date:** 2026-05-20
**Date:** 2026-05-20
**Sandbox:** agent-openapi-discovery-restricted-4097617-1779243949

## Summary
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

## 1. Repository Cloning (Provisioner API)

**Endpoint:** `POST /repo/provision`
**Endpoint:** `POST /repo/provision`
**Status:** ✅ Success

Cloned `fullsend-ai/fullsend` (ref: `main`) into `/sandbox/fullsend`.
Expand Down Expand Up @@ -32,7 +32,7 @@ These are informational findings from the automated security scan; the clone pro

## 2. Container Image Build (Builder API)

**Endpoint:** `POST /build`
**Endpoint:** `POST /build`
**Status:** ✅ Success

Built image `fullsend-sandbox:test` from `images/sandbox/Containerfile` and uploaded tarball to `/sandbox/fullsend-sandbox.tar` (4.2 GB).
Expand Down
Loading
Loading