Inspiration

I built Basement because I wanted a place to practise talking off the cuff without anyone watching. There is no account and no saved history. You spin a topic, talk, and get feedback about filler words, pace, and pauses.

The original app worked, but its two most important promises were not delivery gates. I could not prove that speech stayed out of logs, and I could not tell whether a prompt change made the coaching less honest. As a solo builder, I wanted the delivery system to check both promises every time.

What it does

Basement Autopilot adds a supervised GitLab issue-to-evidence loop around the existing app:

  • unit, syntax, parity, and protected-path checks
  • six explicitly synthetic coaching evaluations, including prompt injection and garbled input
  • GitLab SAST, Secret Detection, Dependency Scanning, static privacy rules, and an isolated runtime canary
  • a Privacy Guard that creates exact-line findings and a bounded Fixer path that cannot edit protected gates or tests
  • deterministic releases with a privacy receipt, hash-chained evidence ledger, CycloneDX SBOM, and coaching report
  • a production-stage deploy:vercel job that checks the existing Vercel application without deploying it
  • a governance job that posts the issue-to-production evidence and applies autopilot::shipped to the linked issue

A custom Duo Conductor flow is implemented for Triage and Builder. The demonstrated CH-01 repair uses the documented catalog-only fallback.

How I built it

The app remains Node.js and Express. GitLab CI separates Verify, Secure, Package, Release, Configure, Monitor, and Govern. Agents can propose findings or bounded edits, but deterministic jobs own every pass/fail decision.

The privacy canary builds the real app with fake Gemini, Deepgram, and Groq endpoints inside an isolated Docker network. It uses synthetic values, stores only hashes and counts, checks the container filesystem, and scans logs for a unique canary. The evaluation cache stores redacted scoring summaries rather than transcripts or raw provider output.

Production remains at basement.cefo.dev. GitLab's deploy:vercel job checks that existing application, its privacy headers, and its cookie contract. It does not deploy, promote, or roll back Vercel.

Before and after

At the original GitHub commit, Basement had no GitHub or GitLab CI workflow. Tests ran only when I invoked them, privacy promises were prose, and there was no coaching regression suite.

The current main pipeline 2984574204 passed all 18 jobs across Verify, Secure, Package, Release, Configure, and Govern. Together with issue #4, MR !11, and its evidence comment, that proves eight lifecycle stages. A scheduled Monitor pipeline then ran the synthetic production check against basement.cefo.dev and passed, completing all nine stages.

Challenges

The first challenge was keeping agents away from their own guardrails. Builder and Fixer cannot edit CI, privacy rules, evidence code, prompts, fixtures, baselines, or gate tests. Their output is untrusted and rechecked by deterministic scripts.

The second challenge was making evaluation stable enough to explain. Layer B runs three times, accepts a two-of-three majority, compares anchor scores with a protected baseline, and uses a redacted cache. The planned Gemini model was retired for new users, so a minimal experiment selected gemini-3.1-flash-lite and recorded the deviation.

The third challenge was making the writable repair loop work in real CI. Early runs exposed missing CA certificates and the wrong Git authentication scheme. After those factory fixes, the disclosed CH-01 drill produced a PG-LOG-01 thread, a bounded catalog-only Fixer commit, a green rerun, and a merged MR.

Accomplishments

What I learned

Autonomy is easier to trust when the model does not own the final decision. Agents are useful for bounded review and repair, while deterministic jobs decide whether a secret leaked, a privacy promise broke, a score regressed, or evidence is complete.

I also learned to separate implementation evidence from run evidence. A YAML file is not a green pipeline, and a URL check is not a deployment. That distinction kept the submission honest and made failures much easier to debug.

Built With

Share this project:

Updates

Submission history