One requirement, one Spring Boot repo, every step spelled out.
This page runs AWS AI-DLC on a small Java API with the express profile (10 of the 33 stages). For each of the 17 steps you see exactly what you type, what Claude returns, and what appears on disk, with every folder explained. The code, the tests, their output and the API's JSON are real. You start from the public starter repo varasrinivas/aidlc-priorauth-api (the API at v1.0.2, before the change); the finished workspace, record included, is the java-workspace/ folder next to this page.
audit/.What you are going to change, before any AI is involved
The requirement in one sentence: every request in the pending list should say how many working days it has been waiting, and get a flag once it has waited more than 5.
Nurses review prior-authorization requests (a doctor asking the insurer "may we do this MRI?"). Their screen gets the list from GET /requests/pending. Today that list says when each request arrived, but not how long it has waited, so nobody sees the old ones. The rule for "how long", in four lines:
- The day it arrived is day 0. Counting starts the next day.
- Count up to and including today, or the date you pass as
?asOf=YYYY-MM-DD(that makes the answer testable: it doesn't change tomorrow). - Skip Saturdays, Sundays and the tenant's holidays. Tenant TX-01 has a holiday on Mon 12 Oct 2026.
- More than 5 working days means over the limit. Exactly 5 is still fine; 6 is flagged. The 5 comes from configuration, not from the code.
Worked example. Request PA-10231 arrived Thu 1 Oct; we ask on Tue 13 Oct:
Grey = not counted (weekend, or hol. = TX-01 holiday). 7 working days, more than 5, so it is flagged. The API should say so in three new fields on every row: ageBusinessDays, overLimit, ageLabel.
$ curl "localhost:8080/requests/pending?asOf=2026-10-13"
[
{
"id": "PA-10231",
"tenantId": "TX-01",
"service": "MRI lumbar spine",
"status": "PENDED",
"receivedAt": "2026-10-01"
},
{ "id": "PA-10244", ... "receivedAt": "2026-10-06" },
{ "id": "PA-10263", ... "receivedAt": "2026-10-09" }
]
# ?asOf is ignored; nothing says how long anything has waited$ curl "localhost:8080/requests/pending?asOf=2026-10-13"
[
{
"id": "PA-10231",
"tenantId": "TX-01",
"service": "MRI lumbar spine",
"status": "PENDED",
"receivedAt": "2026-10-01",
"ageBusinessDays": 7,
"overLimit": true,
"ageLabel": "7 bd OVER 5"
},
{ "id": "PA-10244", ... "ageBusinessDays": 4, "overLimit": false, ... },
{ "id": "PA-10263", ... "ageBusinessDays": 1, "overLimit": false, ... }
]?asOf works; mvn test runs 10 tests (3 old + 7 new), 0 failures.pom.xml changes only its version.cd priorauth-api; mvn spring-boot:runcd priorauth-api && mvn spring-boot:run, then the curl above in a second window. Stop it with Ctrl+C before step 2.v1.1.0, the code as this run left it. git -C priorauth-api diff v1.0.2 v1.1.0 --stat lists the twelve files; use it to check your own run, not to skip it. Claude may find the tag too, before it writes code: step 12 says what to answer.Before you start: three things on your laptop, once
New to AI-DLC workspaces? Set up an AI-DLC workspace explains every command used in steps 1–2 below and every file they create.
AI-DLC is a set of workflow files that Claude Code runs; the aidlc command installs and configures them. Java and Maven are for the repo, not for AI-DLC.
java -version mvn -version
openjdk version "21.0.x" 2026-xx-xx LTS
Apache Maven 3.9.x
Java version: 21.0.x # the JDK Maven uses: this is the line that must say 21aidlc command; v2.11 at the time of writing)
irm https://github.com/awslabs/aidlc-workflows/releases/latest/download/install.ps1 | iex aidlc --version
curl -fsSL https://github.com/awslabs/aidlc-workflows/releases/latest/download/install.sh | sh aidlc --version
aidlc installed aidlc 2.11.x
claude opens, /help answers. Install it from docs.claude.com.
/aidlc".The two folders you will be looking at
AI-DLC never runs inside the code repo. It runs from a folder around it, the workspace, and writes its own notes next to the code, never into it. Below, both folders before anything happens.
The workspace (yours)
java-workspace/ the folder you start Claude in CLAUDE.md house rules Claude reads first (ours) repos.json which repos belong here (ours) scripts/verify.sh the one test command (ours) scripts/verify.cmd same, for Windows (ours) docs-in/request.md the Slack message, saved as a file priorauth-api/ the code repo: a git clone
| Entry | What it is for |
|---|---|
CLAUDE.md | Two paragraphs Claude Code loads automatically: which repo owns what, how to test, how to name branches. Your team writes it once. |
repos.json | The list of code repos that belong to this workspace, so a teammate can clone them all with aidlc system workspace-sync. Each name is the folder; url overrides the default clone source (git@github.com:<org>/<name>.git), and here points at the public starter repo. "Disk wins": a repo that is listed but not cloned is not part of the run. |
scripts/ | Your own scripts. verify.sh runs mvn -q test in the repo; CLAUDE.md tells Claude to test only through it. |
docs-in/ | Inputs you hand to the run: the request, a brief, an exported page. Anything Claude should read rather than hear. |
priorauth-api/ | The repo, cloned from GitHub. AI-DLC finds it because it has a .git folder. |
The Java repo (Maven layout)
priorauth-api/ pom.xml Maven's recipe: name, Java 21, two Spring starters README.md .gitignore target/ is never committed src/main/java/com/acmehealth/priorauth/ code that ships PriorAuthApiApplication.java the main() Spring Boot starts from api/PendingRequestsController.java GET /requests/pending api/PendingRequestResponse.java one JSON row model/PriorAuthRequest.java the domain record store/RequestStore.java loads the export, oldest first src/main/resources/ config and data packed into the jar application.yml name, port 8080 data/requests.sample.json 4 requests, 3 pending src/test/java/com/acmehealth/priorauth/ tests; never shipped store/RequestStoreTest.java 2 tests api/PendingRequestsControllerTest.java 1 test, starts the app in-process target/ appears when you build; generated, ignored
| Folder | What goes there |
|---|---|
pom.xml | The build file. Every Maven command reads it: which Java, which libraries (here only two "starters"), how to package. Version numbers live here. |
src/main/java | The application. The folder path mirrors the package name: com.acmehealth.priorauth → com/acmehealth/priorauth. |
src/main/resources | Non-code files the app reads at runtime: application.yml settings, data files. They end up inside the jar. |
src/test/java | JUnit tests, same package layout. mvn test compiles and runs them; they are not shipped. |
target/ | Maven's scratch space: compiled classes, test reports, the jar. Delete it any time; never commit it. |
aidlc/, is the order book: every order, every question asked, every decision, and who signed it. The kitchen never keeps the order book.express runs the stages in colour; the rest are for work whose requirements are not yet understood. If Ravi's message had been vague, you would start the run with feature instead of express at step 5. In this run the three Operation stages were skipped too: they run only when the workspace has a pipeline to work against (step 15).Make the workspace folder and put the repo in it
AI-DLC runs from the folder around the repo, so its record and your code never mix.
mkdir C:\work\java-workspace
cd C:\work\java-workspace
git init -b main
git clone https://github.com/varasrinivas/aidlc-priorauth-api.git priorauth-api
# the team's files (CLAUDE.md, repos.json, scripts\), written from scratch:
mkdir scripts | Out-Null
[IO.File]::WriteAllText("$PWD\CLAUDE.md", (@'
# java-workspace
Run AI-DLC from this folder. One code repo, `priorauth-api/`, a Spring Boot 4.1 REST API on Java 21, built with Maven.
| Repo | Owns | Verify with | Branch pattern |
|---------------|----------------------------------------|------------------|----------------------|
| priorauth-api | the API the reviewer screen reads | `mvn -q test` | request-age/<slug> |
Rules: the record in `aidlc/` is the source of truth for requirements and decisions; commit it after every gate.
One unit = one branch = one PR. Tests through `./scripts/verify.sh` (`scripts\verify.cmd` on Windows), never ad hoc.
Never add a dependency to pom.xml inside a unit without saying so in the plan.
'@ -replace "`r", "") + "`n")
[IO.File]::WriteAllText("$PWD\repos.json", (@'
{
"org": "acme-health",
"repos": [
{ "name": "priorauth-api", "branch": "main", "url": "https://github.com/varasrinivas/aidlc-priorauth-api.git" }
]
}
'@ -replace "`r", "") + "`n")
[IO.File]::WriteAllText("$PWD\scripts\verify.sh", (@'
#!/usr/bin/env bash
# The one verification command for this workspace (approved at Code Generation, run after every unit).
set -uo pipefail
cd "$(dirname "$0")/../priorauth-api"
mvn -q test
'@ -replace "`r", "") + "`n")
[IO.File]::WriteAllText("$PWD\scripts\verify.cmd", (@'
@echo off
rem The one verification command for this workspace (Windows twin of verify.sh).
cd /d "%~dp0..\priorauth-api" && mvn -q test
'@ -replace "`r", "") + "`n")mkdir -p ~/work/java-workspace
cd ~/work/java-workspace
git init -b main
git clone https://github.com/varasrinivas/aidlc-priorauth-api.git priorauth-api
# the team's files (CLAUDE.md, repos.json, scripts/), written from scratch:
mkdir -p scripts
cat > CLAUDE.md <<'EOF'
# java-workspace
Run AI-DLC from this folder. One code repo, `priorauth-api/`, a Spring Boot 4.1 REST API on Java 21, built with Maven.
| Repo | Owns | Verify with | Branch pattern |
|---------------|----------------------------------------|------------------|----------------------|
| priorauth-api | the API the reviewer screen reads | `mvn -q test` | request-age/<slug> |
Rules: the record in `aidlc/` is the source of truth for requirements and decisions; commit it after every gate.
One unit = one branch = one PR. Tests through `./scripts/verify.sh` (`scripts\verify.cmd` on Windows), never ad hoc.
Never add a dependency to pom.xml inside a unit without saying so in the plan.
EOF
cat > repos.json <<'EOF'
{
"org": "acme-health",
"repos": [
{ "name": "priorauth-api", "branch": "main", "url": "https://github.com/varasrinivas/aidlc-priorauth-api.git" }
]
}
EOF
cat > scripts/verify.sh <<'EOF'
#!/usr/bin/env bash
# The one verification command for this workspace (approved at Code Generation, run after every unit).
set -uo pipefail
cd "$(dirname "$0")/../priorauth-api"
mvn -q test
EOF
cat > scripts/verify.cmd <<'EOF'
@echo off
rem The one verification command for this workspace (Windows twin of verify.sh).
cd /d "%~dp0..\priorauth-api" && mvn -q test
EOF
chmod +x scripts/verify.shInitialized empty Git repository in C:/work/java-workspace/.git//Users/you/work/java-workspace/.git/
Cloning into 'priorauth-api'...
Receiving objects: 100% (64/64), 11.97 KiB | 2.99 MiB/s, done.
Resolving deltas: 100% (7/7), done.java-workspace/ .git/ the workspace's own repo (git init): Claude commits the record here after the gates; you add the rest at step 17 priorauth-api/ the clone, branch main = tag v1.0.2 (before) · its .git folder is how AI-DLC finds it CLAUDE.md written by the commands above: house rules (repo map, test command, branch pattern) repos.json written by the commands above: the repos that belong here (one entry) scripts/verify.sh written by the commands above: runs mvn -q test inside priorauth-api scripts/verify.cmd the Windows twin
Tell AI-DLC that your assistant is Claude Code, then let it check the folder
The aidlc command writes the files Claude Code needs (the /aidlc slash command and its agents) into a .claude/ folder. doctor confirms the folder is usable.
aidlc config --harness claude aidlc system workspace-sync aidlc doctor
configured ...\java-workspace for Claude Code 2.11.0; next: open Claude Code in this project ... aidlc workspace-sync: reconciling ...\java-workspace against repos.json (1 repo(s)) ✓ priorauth-api already on disk - leaving untouched ✓ .gitignore managed block → 1 child dir(s) ✓ aidlc.code-workspace → 1 child root(s) ✓ workspace in sync AI-DLC doctor Machine ok 11 checks passed Project (.claude, Claude Code) ok 47 checks passed Framework integrity ok all 12 checks passed 0 problems, 3 warnings. # expected now: no update cache yet, hooks not run yet, aidlc/ not committed yet
java-workspace/ .claude/ generated: the /aidlc command, agents, hooks. Never edit; re-run `aidlc config` after `aidlc update` aidlc/ the record's folder, started: spaces/default/memory/ (team and project memory files) .gitignore two managed blocks: runtime scratch (from config) and /priorauth-api/ (from workspace-sync: the repo has its own history) aidlc.code-workspace from workspace-sync: a VS Code multi-root file, workspace + repo
workspace-sync reads repos.json: it clones any listed repo that is missing and writes the .gitignore line that keeps the repo out of the workspace's git. A teammate who clones the workspace runs the same three commands on their machine. The tool's files are generated; your team's files (CLAUDE.md, repos.json, scripts/) are not.Save the requirement as a file
Claude should read the request, not be told it in a chat that scrolls away. The record will quote this file.
docs-in/request.md and paste Ravi's message into it, with who sent it and when. That is the whole step.(Claude is not involved yet)java-workspace/ docs-in/request.md the input of the run. One file, five lines.
Start Claude Code in the workspace folder
Start it here, not inside priorauth-api/: the /aidlc command and the record belong to the workspace.
claude
╭──────────────────────────────────────────────╮ │ Welcome to Claude Code │ │ cwd: C:\work\java-workspace ~/work/java-workspace │ │ CLAUDE.md loaded · /aidlc available │ ╰──────────────────────────────────────────────╯ > _
/ are slash commands (/aidlc is one). Lines that start with ! run in your shell and show the output (you will use that for git). Everything else is a message to Claude, including the one-character answers at the gates.Start the run: one command creates the record and goes straight on to the first real stage
express names the scope; "Build what ./docs-in/request.md describes" is the request. Naming the scope in the command is the decision: express asks no scope question. Claude creates the record folder, looks at the repo, writes the state file, and starts Reverse Engineering in the same turn.
/aidlc express Build what ./docs-in/request.md describes
Setting up an express workflow for this: 7 stages, 7 approval gates; no reviewers, sensors,
learnings ritual, summary confirmation, or plan approval; lead agent only.
Intent created: 261013-request-age-api (space: default)
State initialized: express scope, 10 stages, Minimal depth
Project type: Brownfield
Languages: Java
Frameworks: Spring Boot
Build System: maven (pom.xml)
First post-init stage: reverse-engineering (INCEPTION)
Choose Yes when Claude Code asks to change this project's settings, then answer the question below.
▸ Claude Code asks to create .claude/settings.local.jsonjava-workspace/ aidlc/ the order book. Everything AI-DLC writes lives under here. spaces/default/ a "space" groups runs; one is enough for a team intents/intents.json the registry of runs in this space: one row, status in-flight intents/261013-request-age-api/ this run. The id is the date (26-10-13) plus a label Claude picked aidlc-state.md where the run is: scope, stages to run, a checkbox per stage. Read it to resume. project-description.json your request, verbatim, kept exactly as you typed it audit/ who answered what, when. This course keeps one small file per answer: 0001-scope.md the scope you named in the command, with time and name
261014-request-age-api, and the label may differ too. Everything else on this page still applies; read 261013-request-age-api as "your intent folder".project-description.json keeps only your words. What the tool detected (brownfield, Java, Spring Boot, Maven) and decided (scope express, the 10 stages to run, the 23 to skip) is written into aidlc-state.md; you can see the finished file at step 16. "request" in the registry row (and Question Id in the state file) points to your request as the engine saved it. When the run completes, the row's status becomes complete./aidlc feature … instead, and the tool would add the design and units stages. "7 approval gates" counts the stages that end with a question to you: 2.1, 2.3, 3.5, 3.6, 4.1, 4.3, 4.4. In this run you answer four of them; the three Operation stages are skipped at step 15.Choose Yes if Claude Code asks to change the project's settings. Claude reads the repo and writes nine short files about it
Before anything is designed, the tool writes down what exists: the layers, the endpoint, the libraries, the tests, the rules it can see. Those nine files are reused by every later run in this workspace. This is the same turn as step 5; the one thing you may have to do is allow a settings change.
Yes
Bringing in the developer to work on Reverse Engineering.
codekb priorauth-api: NO_STORE, first scan → full scan of ./ at commit 976ab66
The developer takes a look at the API code and writes up what it finds.
Reverse Engineering complete
I've finished reading through priorauth-api. It's small: 2 test classes and 3 tests. I read every file in full.
business-overview.md Serves the pending prior-auth list that the reviewer screen reads
api-documentation.md GET /requests/pending returns id, tenantId, service, status, receivedAt
technology-stack.md Java 21, Spring Boot 4.1, Maven, JUnit 5, AssertJ, MockMvc
…six more
What matters for this change: no business-day or holiday logic exists in this repo. Requirements will
need to settle whether the received day counts, whether "over 5" means more than 5, and where the
holidays come from.
Review: aidlc/spaces/default/codekb/priorauth-api/
▸ Reverse Engineering is done. How would you like to proceed?
1. Approve: continue to Requirements Analysis 2. Request Changes 3. Otherjava-workspace/aidlc/spaces/default/ codekb/priorauth-api/ what the tool knows about the repo; reused by the next run business-overview.md what the service is for, in two sentences architecture.md layers: api, store, model; no database in this cut code-structure.md the folder map with one line per file api-documentation.md the one endpoint and its JSON component-inventory.md each class and what it does technology-stack.md Java 21, Spring Boot 4.1, Maven; the dependency policy dependencies.md the two starters, nothing else code-quality-assessment.md what is clean; "date arithmetic belongs in its own package" reverse-engineering-timestamp.md when, which commit, and a fingerprint of what was scanned and in java-workspace/.claude/ settings.local.json your "Yes" wrote "disableAllHooks": false here (this machine only)
"disableAllHooks": false in .claude/settings.local.json (your machine's settings, not the team's), and Claude Code asks you first. Choose Yes. If Claude Code shows no prompt, the hooks were already seen and there is nothing to do. Your codekb wording will differ from the files below; the nine names and the fingerprint will not.Meena skimmed the nine files in three minutes. The one that matters later is technology-stack.md: "no dependency without a reason" becomes requirement NFR1 without anyone typing it. code-quality-assessment.md's last line decides where the new code goes.
Approved at step 7 by Meena Iyer (tech lead) · 09:41
Approve the scan. Before writing any requirement, Claude writes down what the message did not say, as four questions with lettered answers
A test can check "FR1.1: Saturday and Sunday are not business days". It cannot check "weekends should not count". This stage makes that translation, and it starts by asking instead of guessing: the questions go into a file, each with options A, B, C and "X. Other".
1
Before I write the requirements, I need four things pinned down. The nightly report that already
computes AGE isn't in this workspace, so I can't copy its exact rule from the code. The four questions
are in aidlc/spaces/default/intents/261013-request-age-api/inception/requirements-analysis/requirements-analysis-questions.md:
- how the age is counted: whether the day a request arrived counts
- whether "over-5" means more than 5, or 5 and over
- where the holiday list comes from
- which time zone decides what "today" is
▸ How would you like to answer them?
1. Guide me: I'll walk you through each question here
2. I'll edit the file: you fill in the answers in the file yourself
3. Chat: we talk it through and I pull the decisions out of the conversation
4. Otherjava-workspace/aidlc/spaces/default/intents/261013-request-age-api/ inception/ the Inception phase's folder; one sub-folder per stage that ran reverse-engineering/developer-scan-priorauth-api.md the scan's notes for this run (the codekb is the reusable part) requirements-analysis/ requirements-analysis-questions.md four questions, lettered options, an empty [Answer]: line under each audit/0002-2-1-reverse-engineering.md your "1" java-workspace/.git a commit of aidlc/, if you allowed it (see below)
git add aidlc/ && git commit …, choose Yes. Your CLAUDE.md says "commit it after every gate", so Claude commits the record in the workspace repo after approvals; the first time, Claude Code asks you. Some commits wait: while a code plan waits for approval (steps 11–12), AI-DLC blocks commands that change files outside the record, git included, so that commit lands once the plan is approved. If you say No, Claude tells you and carries on; step 17 commits whatever is left.Pick 3 (Chat), then answer the four questions in one message, with the names of the people who decided
AI-DLC records one reply per question, and "how would you like to answer?" is a question too. Answer it first, on its own, then send all four answers together: one letter per question, plus anything Claude should know.
3
1 A: the received day is day 0, same as the report. 2 A: over means more than 5; the threshold is 5, from configuration. 3 B: the same TX-01 list the report uses, as a JSON file in the API resources for now. 4 C: the server's zone; callers can pass asOf. The API returns a flag and never refuses or alerts. (Ravi, Meena)
I've written your four answers into the questions file. Two follow-ups came out of them, and you can
answer them in the same reply.
Follow-up 1: the TX-01 holiday dates. You chose the TX-01 list the nightly report uses, but its dates
aren't anywhere in this workspace. This affects the results straight away, because Monday 12 Oct 2026
falls inside the sample data's date range.
1. I'll paste the TX-01 holiday dates here
2. I'll point you to a file in the workspace that has them
3. Ship the file with no dates for now (only weekends are skipped) and add the dates later
4. Other
Follow-up 2: other tenants. TX-01 is a tenant id, and every sample request belongs to TX-01. What
should happen to a request from any other tenant?
1. Use the TX-01 list for every tenant for now (one org-wide holiday list)
2. Key the holiday file by tenant. Only TX-01 has dates, so other tenants skip weekends only
3. Other
▸ Reply with each question's number and the number of your choice (for example F1: 1, F2: 2), or just tell me.3 first. In our real run we sent the answers straight away, without picking from the menu. Claude wrote them into the file, but AI-DLC refused to record them, and Claude said "Your answer didn't reach AI-DLC. Please give it once more." That message had already been used up answering the menu. Sending the answers again ("same as before") worked. Picking 3 on its own first avoids the round trip; we took the long way, so Claude's short reply to 3 is not shown. 1 walks you through one question at a time; 2 lets you type after each [Answer]: in the file and then say "done".Answer the two follow-ups. Claude writes the requirements and lists what it still had to assume
Only now does requirements.md appear. Read the assumptions at the end of Claude's reply first: each is a gap Claude filled on its own, and some of them other people's code will depend on.
F1: 1, the 2026 TX-01 holidays are 2026-01-01, 2026-01-19, 2026-02-16, 2026-05-25, 2026-07-03, 2026-09-07, 2026-10-12, 2026-11-11, 2026-11-26, 2026-11-27, 2026-12-25. F2: 2, one file per tenant; a shared calendar service is a separate intent. (Meena)
Requirements Analysis complete
FR1 business-day age: each pending row gets its age. The day a request was received is day 0.
Weekends and the tenant's holidays are skipped. Optional asOf; without it, today (server's zone)
FR2 over-limit flag: true only when the age is more than the threshold. The threshold is 5 by
default and is set in configuration. The API never refuses or alerts on it.
FR3 the new values are only added: existing fields and the oldest-first order are unchanged
NFR1 no new dependencies
Worked check against the sample data as of Tue 2026-10-13:
PA-10231 is age 7 and flagged. PA-10244 is age 4 and not flagged. Mon 12 Oct is a TX-01 holiday.
I made four assumptions you may want to change now:
Field names: businessDayAge and overAgeThreshold. The request doesn't name them.
Config key and files: the threshold is priorauth.age.threshold-business-days, and the files are
holidays/<tenant>-<year>.json.
Before the received date: if the as-of date is earlier than the received date, the age is 0.
Ages that cross a year: each year uses its own holiday file.
Review: aidlc/spaces/default/intents/261013-request-age-api/inception/requirements-analysis/
▸ Requirements Analysis is done. How would you like to proceed?
1. Approve: continue to Code Generation 2. Request Changes: tell me what to revise 3. Otherjava-workspace/aidlc/spaces/default/intents/261013-request-age-api/inception/requirements-analysis/ requirements.md FR1…FR3, NFR1, assumptions, out of scope. One page: Minimal depth. requirements-analysis-questions.md every [Answer]: line filled in, with the names you gave
Request Changes with 2: the names the screen team already uses, and one rule
2 does not mean "wrong". It means "change the artifact, then ask me again". Everything after the 2 is the correction; Claude rewrites requirements.md and comes back to the same gate. Now, a field name is one line in a markdown file; after step 12 it is a rename across code and tests.
2 The screen team already named the fields: ageBusinessDays (integer), overLimit (boolean) and ageLabel (text such as "7 bd OVER 5"). Config key priorauth.aging.threshold-days. Holiday files at data/holidays-<tenant>-2026.json. An as-of date before the received date is a caller error, not age 0. (Meena)
Requirements Analysis revised
I made these changes in requirements.md:
Fields: they're now ageBusinessDays (integer), overLimit (boolean) and ageLabel (text) (FR3)
Config key: priorauth.aging.threshold-days (FR2)
Holiday files: data/holidays-<tenant>-2026.json, for example data/holidays-TX-01-2026.json (FR1.2)
As-of date before the received date: this is now a caller error (FR1). Before, I had assumed an age of 0.
I had to assume one thing. You gave the label for an over-limit request ("7 bd OVER 5") but not the
label for one under the limit. I've used "<age> bd" for those, for example "4 bd".
id (as of 2026-10-13) ageBusinessDays overLimit ageLabel
PA-10231 7 true 7 bd OVER 5
PA-10244 4 false 4 bd
PA-10263 1 false 1 bd
▸ How would you like to proceed?
1. Approve: continue to Code Generation 2. Request Changes: tell me what to revise 3. OtherEvery line in requirements.md now says where it came from: the message, a question, a follow-up or the repo. FR1…FR3 and NFR1 are the names the tests and the traceability file will use. Nothing about how yet.
Approved at step 11 by Ravi Menon and Meena Iyer · 09:56
Approve the requirements and turn plan approval on. Inception is done; Claude writes the plan and stops for it
Express skips design and unit decomposition, so the plan is the design: which files, created or changed, covering which requirement, and the branch they go on. Reading it is the cheapest moment to change your mind, but express does not stop there by default, so you ask it to.
1, and turn plan approval on: Meena reads every plan before code is written
Plan Approval changed: off (from scope express) to on (set by a command) Each code plan is now shown for approval before it is built. Progress: 2/7 in-scope stages complete | 2/2 INCEPTION. Next: Code Generation … Claude reads the code-generation rules and the repo, then writes the plan … The code plan is ready for Meena to review. Approve the code plan? Builds: business-day age, over-limit flag and age label on each row of GET /requests/pending, with an optional asOf date and a holiday file per tenant Touches: priorauth-api/src/main/java/com/acmehealth/priorauth/{api,aging}/, application.yml, new data/holidays-TX-01-2026.json, pom.xml (version only), README.md, tests under src/test/java/... Tests: 7 new tests (4 for the age rule, 1 for the flag, 2 endpoint tests); the 3 existing tests stay green Plan: aidlc/spaces/default/intents/261013-request-age-api/construction/code-generation/code-generation-plan.md Test instructions: aidlc/spaces/default/intents/261013-request-age-api/construction/code-generation/unit-test-instructions.md - It adds no new dependencies; pom.xml changes its version only. - The work goes on a branch called request-age/u1-age-api, and the last step commits there. Pushing and opening the PR are left to the team. ▸ 1. Approve Plan 2. Request Changes 3. I'll edit the files
java-workspace/aidlc/spaces/default/intents/261013-request-age-api/ construction/ the Construction phase's folder code-generation/ code-generation-plan.md four steps; the file table below; requirement → step unit-test-instructions.md how the tests run, and how many to expect code-generation-questions.md the same question as a file: answer after [Answer]: and say done aidlc-state.md Plan Approval: off (from scope express) → on (set by a command) audit/0003-2-3-requirements-analysis.md the menu, the answers, the follow-ups, your "2 …" and your "1", with names
aidlc-state.md said Plan Approval: off (from scope express)). Left off, Claude writes the plan, says it is starting code generation, asks whether you want to look at the plan first, and starts building without waiting. Your team reviews every plan (CLAUDE.md: a new dependency must be named in the plan), so you switch it on in plain words. Claude runs aidlc engine config set plan-approval on for you, which is why the state line reads on (set by a command), and the plan stop below exists.src/main/java/.../store or model is touched, which is what "nothing else changes" meant. The new code gets its own package, aging, because code-quality-assessment.md said date arithmetic does not belong in the controller. Steps 1 and 4 are the git work: Claude makes the branch your CLAUDE.md pattern asks for (request-age/<slug>) and commits on it.Meena read the plan on her screen while Kiran waited: four steps, twelve file rows, every one with a requirement, the branch name, no new dependency. She did not have to ask for the plan: turning plan approval on made Claude stop here.
Plan approved at step 12 by Meena Iyer · 10:03
Approve the plan. Claude makes the branch, writes the twelve files, runs the team's script, and commits
This is the step where code appears. Claude follows the plan's four steps: a branch from main with one baseline test run, the files, ./scripts/verify.sh, a commit. The gate question only arrives after the script has passed and the commit exists; if a test had failed, Claude would fix and re-run before asking.
1
Yes # to run scripts/verify.sh (scripts\verify.cmd on Windows) and git in priorauth-apiSwitched to a new branch 'request-age/u1-age-api' (from main) · baseline: ./scripts/verify.sh, 3 tests, 0 failures create src/main/java/com/acmehealth/priorauth/aging/BusinessDays.java create src/main/java/com/acmehealth/priorauth/aging/AgeBadge.java create src/main/java/com/acmehealth/priorauth/aging/HolidayCalendar.java create src/main/resources/data/holidays-TX-01-2026.json modify src/main/java/com/acmehealth/priorauth/api/PendingRequestResponse.java modify src/main/java/com/acmehealth/priorauth/api/PendingRequestsController.java modify src/main/resources/application.yml create src/test/java/com/acmehealth/priorauth/aging/BusinessDaysTest.java create src/test/java/com/acmehealth/priorauth/aging/AgeBadgeTest.java modify src/test/java/com/acmehealth/priorauth/api/PendingRequestsControllerTest.java modify pom.xml (version 1.0.2 → 1.1.0, nothing else) modify README.md Running ./scripts/verify.sh … Tests run: 10, Failures: 0, Errors: 0, Skipped: 0 · BUILD SUCCESS (exit 0) [request-age/u1-age-api b477c4e] request age and over-limit flag on the pending list (intent 261013-request-age-api, U1) 12 files changed, 230 insertions(+), 10 deletions(-) Code Generation complete The feature is built and committed as b477c4e on request-age/u1-age-api in priorauth-api/. It hasn't been pushed. The full test run passed 10 of 10: the 3 existing tests and 7 new ones. pom.xml changes its version only. Review: aidlc/spaces/default/intents/261013-request-age-api/construction/code-generation/ (start with code-summary.md) ▸ How would you like to proceed? 1. Approve: continue to Build and Test 2. Request Changes: tell me what to revise 3. Other
v1.1.0, the answer key. In our real run Claude found it before writing any code, saw that it holds this very change (PR #58, not on main), and asked whether to rebuild from main, build on that code, or stop. Answer 1, rebuild from main: the tag is the course's answer key, not your team's history.java-workspace/priorauth-api/ on branch request-age/u1-age-api · commit b477c4e · 12 files touched pom.xml changed: version only README.md changed: usage line src/main/java/com/acmehealth/priorauth/ aging/BusinessDays.java new: the arithmetic. 36 lines, no Spring in it aging/AgeBadge.java new: days + over-limit flag + label, as a record aging/HolidayCalendar.java new: @Service; reads holidays-<tenant>-2026.json once api/PendingRequestResponse.java changed: three new JSON fields api/PendingRequestsController.java changed: ?asOf (400 if too early), holiday calendar, threshold src/main/resources/ application.yml changed: priorauth.aging.threshold-days: 5 data/holidays-TX-01-2026.json new: the 11 dates from follow-up 1 src/test/java/com/acmehealth/priorauth/ aging/BusinessDaysTest.java new: 4 tests (FR1, FR1.1, FR1.2, the error case) aging/AgeBadgeTest.java new: 1 test (FR2: 5 is not flagged, 6 is) api/PendingRequestsControllerTest.java changed: 2 new tests (FR3: the JSON carries the fields; FR1: asOf too early → 400) target/ appeared when Maven ran; ignored by git java-workspace/aidlc/.../261013-request-age-api/construction/code-generation/ code-summary.md traceability.json
New files (the whole file, runs as shown):
Changed files (the diff: red lines went away, green lines arrived):
The record Claude wrote beside the code:
BusinessDayAgeCalculator, an injectable Clock) and 14 new tests instead of 7, and its API answered the curl at step 13 with the same numbers. What you check is the same: every requirement has a test, the script passed, the diff matches the plan.git -C priorauth-api show --stat; read traceability.json against the plan.between, the default in @Value.The question arrived with the proof attached: the script's result and the commit. Approving means "this commit is the change". Request Changes would send Claude back to the files with your comment; it would run the script again and commit again before the next question. Express has no units: Code Generation runs once, for the whole change. "U1" in the branch and the commit is the team's name for it, from CLAUDE.md's "one unit = one branch = one PR".
Approved at step 13 by Meena Iyer, after reading the diff · 10:45
Approve Code Generation. A separate agent builds and tests the whole repo again and checks that every requirement has a test
With one change this looks like a repeat. It is the stage that would catch two pieces of work disagreeing, and it writes the one table the gate signs: which test proves which requirement.
1
Build and Test complete The build succeeds and the full suite passes 10 of 10 on request-age/u1-age-api at b477c4e: the 3 existing tests plus 7 new ones. test-results.md per-class results from the test reports, plus the target check cross-unit-traceability.md PASS: FR1–FR3 and NFR1 are all covered, each mapped to a test build-and-test-summary.md build, test and code-review readiness; known limitations build-instructions.md JDK 21 + Maven, ./scripts/verify.sh, run notes integration / performance / security instructions the Minimal test strategy needs no extra suites; each file says what already covers that area and what doesn't Still open: - Holiday data covers TX-01 2026 only, so each later year needs its own file. - The branch isn't pushed and no PR is open. The team needs to push request-age/u1-age-api and open one PR. Review: aidlc/spaces/default/intents/261013-request-age-api/construction/build-and-test/ ▸ How would you like to proceed? 1. Approve: continue to Deployment Pipeline 2. Request Changes: tell me what to revise 3. Other
The manual check, in a second terminal. Both outputs below are real: they come from the repo at tag v1.1.0.
cd ~/work/java-workspace/priorauth-api mvn test mvn spring-boot:run
cd C:\work\java-workspace\priorauth-api mvn test mvn spring-boot:run
curl "http://localhost:8080/requests/pending?asOf=2026-10-13"Then this, in a third window: spring-boot:run keeps the second one busy until Ctrl+C. In PowerShell, curl.exe if curl is the alias.$ mvn test
...
[INFO] T E S T S
[INFO] Running com.acmehealth.priorauth.aging.AgeBadgeTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 -- in com.acmehealth.priorauth.aging.AgeBadgeTest
[INFO] Running com.acmehealth.priorauth.aging.BusinessDaysTest
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 -- in com.acmehealth.priorauth.aging.BusinessDaysTest
[INFO] Running com.acmehealth.priorauth.api.PendingRequestsControllerTest
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 -- in com.acmehealth.priorauth.api.PendingRequestsControllerTest
[INFO] Running com.acmehealth.priorauth.store.RequestStoreTest
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 -- in com.acmehealth.priorauth.store.RequestStoreTest
[INFO] Results:
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
[INFO] Total time: 7.4 s
$ echo $?
0
$ curl "http://localhost:8080/requests/pending?asOf=2026-10-13"
[
{
"id": "PA-10231",
"tenantId": "TX-01",
"service": "MRI lumbar spine",
"status": "PENDED",
"receivedAt": "2026-10-01",
"ageBusinessDays": 7,
"overLimit": true,
"ageLabel": "7 bd OVER 5"
},
{
"id": "PA-10244",
"tenantId": "TX-01",
"service": "Physical therapy x12",
"status": "IN_REVIEW",
"receivedAt": "2026-10-06",
"ageBusinessDays": 4,
"overLimit": false,
"ageLabel": "4 bd"
},
{
"id": "PA-10263",
"tenantId": "TX-01",
"service": "CT abdomen",
"status": "PENDED",
"receivedAt": "2026-10-09",
"ageBusinessDays": 1,
"overLimit": false,
"ageLabel": "1 bd"
}
]overLimit is true and the label reads 7 bd OVER 5. PA-10244 arrived Tue 6 Oct: 7, 8, 9, 13 = 4.java-workspace/aidlc/spaces/default/intents/261013-request-age-api/construction/build-and-test/ test-results.md 10 tests, which test proves which requirement, the manual check cross-unit-traceability.md PASS: every requirement in traceability.json has a test build-and-test-summary.md readiness, the target matrix, known limitations build-instructions.md build, run, package integration-test-instructions.md why no extra suite: the endpoint test already covers it performance-test-instructions.md no target set; the one known risk security-test-instructions.md what is covered, what is not (no auth, unchanged)
Every requirement has a passing test or an inspection note, and cross-unit-traceability.md says PASS. This is the last question of the run: Meena approves it at step 15, after the PR is open.
Approved at step 15 by Meena Iyer · 10:55
Push the branch and open the pull request, with the code summary as its description
Claude committed on the branch at step 12, but pushing and the pull request are the team's: AI-DLC has no PR stage. Your CLAUDE.md applies: one unit, one branch, one PR. The PR body is the file Claude already wrote.
! git -C priorauth-api push -u origin request-age/u1-age-api ! gh pr create --repo acme-health/priorauth-api --base main --head request-age/u1-age-api --title "Request age and over-limit flag on the pending list (U1)" --body-file aidlc/spaces/default/intents/261013-request-age-api/construction/code-generation/code-summary.md
To github.com:acme-health/priorauth-api.git * [new branch] request-age/u1-age-api -> request-age/u1-age-api Creating pull request for request-age/u1-age-api into main in acme-health/priorauth-api https://github.com/acme-health/priorauth-api/pull/58
acme-health and PR #58 are the story's GitHub: your origin is the public starter repo, which you cannot push to. Claude's commit is already on your branch; ! git -C priorauth-api log --oneline -2 shows it above v1.0.2.* 49fe266 (HEAD -> main, tag: v1.1.0) Merge pull request #58 from acme-health/request-age/u1-age-api |\ | * b477c4e (request-age/u1-age-api) request age and over-limit flag on the pending list (intent 261013-request-age-api, U1) |/ * d9aa178 (tag: v1.0.2) priorauth-api 1.0.2: pending list for the reviewer screen
| From plan to merge, in this run | Whose step | Where it is recorded | |
|---|---|---|---|
| 1 | Plan approval (steps 11–12). The plan names the branch, and the engine stops until it is approved. | the engine stops; Meena answers | code-generation-plan.md, audit shard 0004 |
| 2 | Branch, code, scripts/verify, commit (step 12). | Claude, because your CLAUDE.md says so | request-age/u1-age-api, code-summary.md |
| 3 | The 3.5 and 3.6 gates (steps 13, 15). Express has no units, so no unit checkpoint. | the engine; Meena answers | aidlc-state.md, audit shards 0005, 0006 |
| 4 | Push and open the PR (this step). | Kiran | GitHub |
| 5 | Review and merge (11:02). | Meena | main, tag v1.1.0 |
/aidlc feature …) goes through rows 1–5 once per unit, and row 3 becomes a unit checkpoint: the engine runs scripts/verify itself, then asks “Approve this completed <unit>?”. Three units, three branches, three PRs: the feature-scope page, step 11 walks through that loop.Approve build and test. Claude skips the three Operation stages, and the run is complete
Express plans three Operation stages, but each one runs only when there is something to work on. This workspace has no pipeline, no container or infrastructure files and no deployment target, so Claude skips them without asking, and the engine records each skip.
1
Progress: 4/7 in-scope stages complete (7/33 overall) | 2/2 CONSTRUCTION. Next: Deployment Pipeline Now working on Deployment Pipeline, wearing the release engineer hat. Deployment Pipeline doesn't apply here, so I skipped it. The repo has no CI or CD configuration, no container or infrastructure files, and no deployment target to design against. Now working on Deployment Execution, wearing the release engineer hat. Deployment Execution doesn't apply here either, so I skipped it. There's no environment in the workspace to deploy to. Now working on Observability Setup, wearing the operations engineer hat. Observability Setup does not apply here, so I skipped it. The work is finished. The reviewer screen's API now returns a business-day age and an over-5 flag on every pending request. I skipped the last three stages (Deployment Pipeline, Deployment Execution, Observability Setup) because priorauth-api has no pipeline, environment or deployment setup in this workspace to work against. Code: priorauth-api/ on branch request-age/u1-age-api, commit b477c4e. All 10 tests pass. Record: aidlc/spaces/default/intents/261013-request-age-api/, committed in the workspace repo.
java-workspace/aidlc/spaces/default/intents/261013-request-age-api/ aidlc-state.md Status: Completed · the three Operation stages marked [S], skipped audit/0006-3-6-build-and-test.md your "1" audit/0007-4-operation-skipped.md the three skips and why; no prompt, nobody asked (no operation/ folder: a skipped stage writes nothing)
v1.1.0.Check the status: 7 of 10 stages, 3 skipped. This is what you have on disk, every file explained
aidlc engine status reads the state file the run wrote. The intent is complete: /aidlc tomorrow would start from a clean slate.
! aidlc engine status
AI-DLC Workflow Status ============================== Project: Build what ./docs-in/request.md describes Scope: express Project Type: existing code Depth: Minimal (from scope express) Phase: OPERATION Current Stage: Observability Setup (4.4) Status: Completed Active Agent: Operations Agent Guard Policy: off (from scope express) Sensors: off (from scope express) Learnings: off (from scope express) Summary Confirmation: off (from scope express) Plan Approval: on (set by a command) Collaborators: off (from scope express) Completion: 7/10 stages (70%) - 3 skipped Phase Progress: INITIALIZATION ███ 3/3 INCEPTION ██ 2/2 CONSTRUCTION ██ 2/2 OPERATION SSS 0/3 Last Completed: Build and Test
java-workspace/ the folder you start Claude Code in ├─ aidlc/ the order book: everything AI-DLC writes │ └─ spaces/ spaces group runs │ └─ default/ the one space this team uses │ ├─ codekb/ code knowledge base, one folder per repo │ │ └─ priorauth-api/ what 2.1 learned about the repo; reused by every run │ │ ├─ api-documentation.md the endpoint and its JSON │ │ ├─ architecture.md layers and what is absent (no database) │ │ ├─ business-overview.md what the service is for │ │ ├─ code-quality-assessment.md what is clean; where new code should go │ │ ├─ code-structure.md folder map, one line per file │ │ ├─ component-inventory.md each class and its job │ │ ├─ dependencies.md the two starters │ │ ├─ reverse-engineering-timestamp.md when, which commit, and the fingerprint the next run compares │ │ └─ technology-stack.md Java 21, Spring Boot 4.1, Maven; dependency policy │ ├─ intents/ one folder per run │ │ ├─ intents.json the registry: one row per run, status complete │ │ └─ 261013-request-age-api/ this run: 13 Oct 2026, label request-age-api │ │ ├─ audit/ one shard per gate answer: who, when, prompt, answer │ │ │ ├─ 0001-scope.md express, named in the command │ │ │ ├─ 0002-2-1-reverse-engineering.md 1 │ │ │ ├─ 0003-2-3-requirements-analysis.md 3, the answers, the follow-ups, 2 with names, then 1 │ │ │ ├─ 0004-3-5-code-generation-plan-approval.md 1 (Approve Plan) │ │ │ ├─ 0005-3-5-code-generation.md 1, after the script passed and the commit │ │ │ ├─ 0006-3-6-build-and-test.md 1 │ │ │ └─ 0007-4-operation-skipped.md 4.1, 4.3, 4.4 skipped; no prompt │ │ ├─ construction/ phase 3 artifacts │ │ │ ├─ build-and-test/ stage 3.6 │ │ │ │ ├─ build-and-test-summary.md readiness, target matrix, known limitations │ │ │ │ ├─ build-instructions.md build, run, package │ │ │ │ ├─ cross-unit-traceability.md PASS: every requirement has a test │ │ │ │ ├─ integration-test-instructions.md why no extra suite │ │ │ │ ├─ performance-test-instructions.md no target; the one known risk │ │ │ │ ├─ security-test-instructions.md what is covered, what is not │ │ │ │ └─ test-results.md which test proves which requirement │ │ │ └─ code-generation/ stage 3.5 │ │ │ ├─ code-generation-plan.md four steps, 12 files; approved first │ │ │ ├─ code-generation-questions.md the plan question as a file, answered A │ │ │ ├─ code-summary.md what changed; became the PR description │ │ │ ├─ traceability.json requirement -> file │ │ │ └─ unit-test-instructions.md how to run the tests │ │ ├─ inception/ phase 2 artifacts │ │ │ ├─ requirements-analysis/ stage 2.3 │ │ │ │ ├─ requirements-analysis-questions.md 4 questions, 2 follow-ups, answers and names │ │ │ │ └─ requirements.md FR1-FR3, NFR1, assumptions, out of scope │ │ │ └─ reverse-engineering/ stage 2.1, this run's part │ │ │ └─ developer-scan-priorauth-api.md the scan's notes; the codekb is the reusable part │ │ ├─ aidlc-state.md Status: Completed, 7/10 stages, 3 skipped │ │ └─ project-description.json the request, verbatim, as one JSON string │ ├─ knowledge/ onboarded documents (none in this run) │ │ └─ .gitkeep keeps the empty folder in git │ └─ memory/ rules the tool reads at every stage; written by aidlc config │ ├─ org.md AI-DLC's defaults: trunk-based, squash-merge, test posture per scope │ ├─ project.md this project's rules and corrections (empty sections) │ ├─ team.md the team's affirmed practices (empty until practices-discovery) │ ├─ phases/ guardrails per phase, AI-DLC's defaults │ │ ├─ construction.md complete files, error handling, test and security floors │ │ ├─ ideation.md problem before solution (not run by express) │ │ ├─ inception.md testable requirements, traceability │ │ └─ operation.md rollback steps, smoke checks, quantified alarms │ └─ templates/ artifact-format overrides a team may add (none) │ └─ .gitkeep keeps the empty folder in git ├─ docs-in/ inputs you hand to a run │ └─ request.md the Slack message, saved as a file ├─ priorauth-api/ the code repo: main at v1.1.0, history in .git │ ├─ .git/ v1.0.2 (before), the branch, the merge, v1.1.0 │ ├─ src/ Maven layout │ │ ├─ main/ what ships │ │ │ ├─ java/com/acmehealth/priorauth/ the package; folders mirror the dots │ │ │ │ ├─ aging/ the new package │ │ │ │ │ ├─ AgeBadge.java new days, flag, label │ │ │ │ │ ├─ BusinessDays.java new the arithmetic │ │ │ │ │ └─ HolidayCalendar.java new reads the tenant's holiday file │ │ │ │ ├─ api/ the REST layer │ │ │ │ │ ├─ PendingRequestResponse.java changed + ageBusinessDays, overLimit, ageLabel │ │ │ │ │ └─ PendingRequestsController.java changed + ?asOf (400 if too early), calendar, threshold │ │ │ │ ├─ model/ domain │ │ │ │ │ └─ PriorAuthRequest.java the record; untouched │ │ │ │ ├─ store/ data access │ │ │ │ │ └─ RequestStore.java loads the export; untouched │ │ │ │ └─ PriorAuthApiApplication.java main(); untouched │ │ │ └─ resources/ config and data packed into the jar │ │ │ ├─ data/ data files │ │ │ │ ├─ holidays-TX-01-2026.json new the tenant's holidays │ │ │ │ └─ requests.sample.json 4 requests, 3 pending; untouched │ │ │ └─ application.yml changed + priorauth.aging.threshold-days: 5 │ │ └─ test/ tests, never shipped │ │ └─ java/com/acmehealth/priorauth/ same package layout as main │ │ ├─ aging/ tests for the new package │ │ │ ├─ AgeBadgeTest.java new 1 test: FR2 boundary │ │ │ └─ BusinessDaysTest.java new 4 tests: FR1, FR1.1, FR1.2, error case │ │ ├─ api/ endpoint tests │ │ │ └─ PendingRequestsControllerTest.java changed + 2 tests: FR3, FR1 (400) │ │ └─ store/ store tests │ │ └─ RequestStoreTest.java 2 tests; untouched │ ├─ .gitignore target/ and IDE files │ ├─ pom.xml changed Maven: parent 4.1.1, two starters; version 1.1.0 │ └─ README.md changed how to run; usage line updated ├─ scripts/ your scripts │ ├─ verify.cmd the Windows twin │ └─ verify.sh the verification command: mvn -q test in the repo ├─ .gitignore AI-DLC's two managed blocks: runtime scratch, and /priorauth-api/ ├─ aidlc.code-workspace VS Code multi-root file: workspace + repo (from workspace-sync) ├─ CLAUDE.md house rules Claude Code reads first (ours) ├─ README.md how to run and replay this workspace ├─ repos.json which repos belong here (ours) └─ WALKTHROUGH.md the 17 steps as text: you type / Claude returns
BusinessDays.isBusinessDay and HolidayCalendar → weekendIsNotCounted, tenantHolidayIsNotCounted → traceability.json → cross-unit-traceability.md: PASS → PR #58 → "ageBusinessDays": 7 in the JSON the screen will read. Every hop is a file you can open.Commit the team's own files, so the team has the whole workspace tomorrow
Claude committed the record after each gate, because your CLAUDE.md says to. The files you added yourself (the request, CLAUDE.md, repos.json, the scripts) and the two that aidlc generated (.gitignore, the VS Code file) are not part of the record: you commit them once. The code repo stays ignored because it has its own history. .claude/ is left out on purpose: every machine regenerates it with aidlc config.
! git log --oneline ! git add aidlc docs-in CLAUDE.md repos.json scripts .gitignore aidlc.code-workspace ! git commit -m "intent 261013-request-age-api: complete (PR #58, v1.1.0)"
$ git log --oneline Claude's commits, one per approval 429671d aidlc: request-age-api workflow complete (operation stages skipped: no deploy target) 7d6aa46 aidlc: request-age-api build and test approved fb77798 aidlc: request-age-api code generation approved a80d256 aidlc: request-age-api record through code plan approval … [main 5c2e0b9] intent 261013-request-age-api: complete (PR #58, v1.1.0) 7 files changed, 76 insertions(+) create mode 100644 CLAUDE.md create mode 100644 docs-in/request.md ...
git add aidlc above picks it up, and the counts are larger.claude then /aidlc with nothing after it resumes the active intent from aidlc-state.md. /aidlc park pauses one./aidlc express Build what ./docs-in/next.md describes creates a second folder under intents/; the codekb is reused, not rescanned.aidlc config --harness claude, then aidlc system workspace-sync (clones the repos from repos.json). aidlc doctor warns when aidlc/ has uncommitted changes.Run it yourself
The course's java-workspace/ folder is the workspace exactly as the page shows it after the run, with the repo's git history (tag v1.0.2 before, branch request-age/u1-age-api, tag v1.1.0 after). The starter repo carries the same two tags, so git -C priorauth-api switch --detach v1.1.0 in your own run shows the answer. JDK 21 and Maven 3.9 on the path; the first mvn downloads the libraries, about a minute.
cd java-workspace\priorauth-api; mvn test10 tests, 7 from this run (Windows PowerShell).cd java-workspace/priorauth-api && mvn test10 tests, 7 from this run (macOS Terminal).mvn spring-boot:runStarts the API on port 8080. Leave it running and open a second window.curl "http://localhost:8080/requests/pending?asOf=2026-10-13"The JSON above, with "ageBusinessDays": 7, "overLimit": true on PA-10231. In PowerShell, curl.exe if curl is the alias.git -C priorauth-api diff v1.0.2 v1.1.0 --statThe twelve files the run touched, from the workspace folder.Replay the run with the tool
git clone https://github.com/varasrinivas/aidlc-priorauth-api.git priorauth-apiReplay in a new, empty workspace folder: steps 1 to 5 of this page (this clone is step 1). Don't replay inside the course's java-workspace/: its repo already has the branch request-age/u1-age-api, which Claude creates at step 12./aidlc express Build what ./docs-in/request.md describesAnswer the gates as the page shows. Your artifacts will differ in wording; the shape, the stage list and the questions will not.Eleven words, in the order you met them
- workspace
- The folder around the repo(s) that you start Claude Code in. Holds the record, the team files and the clones.
- intent
- One run of AI-DLC for one request. Its folder is
intents/<date>-<label>/; the id here is 261013-request-age-api. - space
- A group of intents that share a codekb, knowledge and memory.
defaultis enough until you have teams that must not see each other's runs. - profile / scope
- Which of the 33 stages run.
expressruns 10;bugfix9,poc8,mvp23,featureall 33. Named in the command at step 5. - depth, test strategy
- How long the artifacts are (Minimal: one or two pages, key decisions only) and how many tests (Minimal: one per requirement). Express sets both to Minimal.
- gate
- A question at the end of a stage that a person must answer: Approve, or Request Changes with a comment. The answer becomes an audit shard.
- audit shard
- One small file per gate answer under
audit/, numbered: who, when, which prompt, what answer. - codekb
- The nine files reverse engineering writes about a repo. Lives under the space, not the intent, so every run reuses it.
- unit
- A piece of the change that one branch and one PR can carry. Express does not split the work ("zero Units"): Code Generation runs once for the whole change; the team calls it U1.
- verification command
- The command that proves the code works: here the team's
./scripts/verify.sh, named in CLAUDE.md. Claude runs it before asking the Code Generation question. "Done" means it exited 0. - traceability
- The file that maps each requirement to the files that implement it and the tests that prove it. Build and Test checks it is complete (cross-unit-traceability.md).
What is real here, and what is not
The code, the tests, Maven's output and the API's JSON are real (the repo at tag v1.1.0, and java-workspace/); the repo's git history is real, including the commit Claude makes at step 12. Steps 5 to 16 were checked against a real AI-DLC 2.11.0 run on Claude Code (14–15 Oct 2026, same starter repo, same request): the order of the questions, their options, the follow-ups, the plan stop, the commits and the three skipped Operation stages happened as shown, and Claude's lines are quoted from that run with this story's names, dates and numbers put back in. That run's code was not the code at v1.1.0 (other class names, 14 new tests instead of 7); its API answered the step 13 curl with the same numbers. The record files under aidlc/ follow that run's file set and formats, filled with this story; the files the tool reads pass its own checks: aidlc-state.md and intents/intents.json (aidlc engine status: Completed, 7/10 stages, 3 skipped), project-description.json, the codekb's scope block (codekb-scope-diff --check: VALID) and memory/, which aidlc config generated. The audit shards are the course's, one per gate: 2.11 writes one audit log per machine. The people, the clock, the acme-health GitHub organization and PR #58 are a story. Pushing and the pull request are the team's own steps: the tool has no pull-request stage.
Companion pages: the Python run of the same rule on the nightly report ("AI-DLC in One Morning"), the full 33-stage run across five repos ("Gold Card"), and the sharing model for the workspace folder ("The Workspace Repo").