Summary
AI-DLC 2.11.3 ships a native aidlc built with Bun 1.4.4, which fixes CVE-2026-111497 in the Brotli decoder Bun bundles, and rolls up the user-visible changes merged since 2.11.2: team Units work end to end with an agent, from a teammate's clone or the lead's own checkout through publish, pin, one merge question and landing, then a plain pull; your request keeps its quote marks, $ and backticks in the record; after Request Changes the re-review and a second round go through the first time, and ticking the plan or keeping a testing practice no longer asks you to approve the plan again; work parked at Code Generation no longer holds up your other requests in the project; side-by-side builds take a change you ask for in the main checkout and pass over files Git ignores; a system package install nobody asked for waits for your go-ahead; AI-DLC runs on OpenCode 2 and, once set up, works on exFAT drives, and on Windows hands aidlc your arguments as you typed them; the lines that start Kiro CLI name its engine; and corrections on every harness.
Compatibility: breaking for scripts. Only Windows scripts that install an earlier release with that release's own install.ps1, or remove one with that release's aidlc uninstall, on a machine where 2.11.3 has written aidlc.exe, unattended runs whose agent installs system packages for itself, and scripts that run aidlc config runtime --check for opencode with an opencode 1 older than 1.18.29, are affected; see Script compatibility below.
Upgrade
aidlc update
cd /path/to/project
aidlc config --yes
aidlc doctorOpen work carries on through the refresh. When a project contains multiple harnesses, run aidlc config --harness <name> --yes for each harness you want to refresh.
opencode: AI-DLC now asks for opencode 1.18.29 or newer, or OpenCode 2 (earlier releases asked for 1.17); update opencode when you refresh a project. aidlc doctor warns about an older opencode 1 (Harness CLI: opencode <version> is below 1.18.29).
Manual-copy users must copy the complete runtime/<harness>/ tree from aidlc-copy-runtime-2.11.3.tar.gz. Copy it over the project following the copy-channel instructions. This installation path requires Bun 1.4.4 or newer but does not require the native aidlc executable.
Chat commands below use /aidlc; in Codex CLI, use $aidlc instead.
Fresh install
macOS and Linux
curl -fsSL https://github.com/awslabs/aidlc-workflows/releases/download/v2.11.3/install.sh | sh -s -- --version 2.11.3Windows PowerShell
irm https://github.com/awslabs/aidlc-workflows/releases/download/v2.11.3/install.ps1 -OutFile install.ps1
./install.ps1 -Version 2.11.3Highlights
Security
- The native
aidlcis built with Bun 1.4.4, which fixes CVE-2026-111497, an out-of-bounds write in Bun's bundled Brotli decoder that CISA lists as exploited in the wild. A nativeaidlc2.11.2 or earlier has the affected decoder built in (aidlc versionshows this machine's release; in a pinned projectaidlc doctorshows the project's asProject pin: <version> is installed), and upgrading Bun separately does not replace it: runaidlc update, and move any project pinned to an older release withaidlc config --pin 2.11.3. With default settings, AI-DLC hands that decoder nothing but its own release downloads over HTTPS. If your team sends metrics to anhttp://collector (AIDLC_METRICS_ENDPOINT), anyone on that network path could forge the collector's replies, which reach the decoder: update, and move the collector tohttps://. On the copy channel, update your own Bun to 1.4.4 or newer.
Your words and your answers
- Your words reach AI-DLC and its record as you typed them: the plan question and the record of your work keep the quote marks and backslashes in your request (before,
/aidlc slugit "" prints an empty line, ...came back asslugit prints an empty line, ...); a$or a backtick in a reason, a pick or a request (a price such as$0.00, a command in backticks) is recorded as written instead of changed by the shell, and Claude Code no longer asks you to allow AI-DLC's own command for it; a question choice holding both a comma and a price comes back whole; and on Windows with Claude Code's Git Bash, your words keep their apostrophes beside a!,$, quote or backtick ("Don't merge, it's unsafe!" no longer arrives as "Dont merge, its unsafe!") in a step AI-DLC hands on and in a question's choices. - On Claude Code in the Claude desktop app, a message another Claude session sends into your chat no longer counts as your reply, so its "Approve" or "Request Changes" cannot answer your gate; a message you type while the agent reads it is still yours.
- Numbered choices read
1. **Approve** - Continue to ...and**Other** - describe what you want instead, with a plain-instead of a long dash, on Kiro CLI, Kiro IDE, Cursor, opencode and GitHub Copilot, and so do the other lines AI-DLC printed with one, from refusals and doctor rows to the scope list in the slash-command picker and Claude Code's welcome card. - When a summary you confirmed gets another round of questions (after a change you asked for, or a step reopened after its approval), the agent adds them as further numbered questions and rewrites the one summary for you to confirm again, the first time, instead of trying shapes AI-DLC refuses.
aidlc engine audit turnslists each of your turns with what you sent, read from the message record this machine keeps for a day, since the committed audit keeps no words; a turn whose words are not on this machine says so, and the command writes nothing.
Gates, reviews, and plan approval
- After Request Changes: at a reviewed stage's gate the agent is handed the exact review request for its revision, so the re-review is no longer refused first (
Cannot start review iteration 2 ... Retry with --iteration 1) and asked again; under Guard Policy relaxed or off, a second Request Changes in a row at the Code Generation gate hands the agent your new words to revise the plan, as the first does, instead of building the same plan again with your words dropped; and there the revised plan's build keeps its own ticks on the plan instead of having them cleared before every change it makes. - The code plan you approved is asked about again only when it really changed: ticking its steps during the build, when a step's box sits after a label, in a heading or in a table cell (
Step 1. [x]), no longer asks you to approve it again under strict, or says "Your approved plan changed after the build started" under relaxed or off (a plan approved before the update that already held a ticked,[-]or prose box outside a list item's start is asked about once more under strict); and under strict, a testing practice you keep at Code Generation's learnings step applies from the next plan, so the gate the build and its review reached opens instead of the finished build going back to its plan to be approved, built and reviewed again. - Your other requests are not held by work waiting at Code Generation: while your work is parked there ("let's stop here for today"), what else you ask for in the project (a script, a commit, an edit to a file the plan does not name, a fix to a Unit already built) runs under every Guard Policy instead of each being refused with
Code Generation cannot start: .... On Claude Code, Codex CLI, opencode and Kiro CLI in a project set up with--harness kiro, a second chat opened in the same folder for something else is held by your work's checks (the code plan, the review freeze) only from its first AI-DLC step there, so until then a write it makes is not held by them either;/aidlcin it still carries the work on. A shell command the plan check cannot read (python3 -c, a loop) is refused as unread, with how a plain read gets through. - Every gate choice does what it says: the Approval & Handoff and Feedback & Optimization gates no longer offer "Reject Initiative (end workflow)" or "Start New Ideation Cycle", which nothing carried out (say in your own words to end the work or start new work), and Accept as-is reads "Approve it as it is and move on", since nothing is archived.
- A gate check whose run gave no result (a team check whose script is missing, one that timed out, or one that stopped before giving a result) is said once at the gate and recorded as could not run, as a crashed check already was, instead of the gate opening with nothing said.
Plans, jumps, and skips
- Finished work: asking for more stages ("I want to add the operation phase" after a poc) has the agent name the plans that run them after its last stage, what each adds and its recommendation, and on your pick the work switches to that plan and starts its first new stage, keeping everything approved, instead of every way ending on "start a new workflow instead"; and a stage you skip in the same request as a plan switch that reopens it (
/aidlc --scope feature --skip ci-pipelineon a finished poc) is skipped, with one line naming the skip and how to run it on its own, instead of the stage starting and the skip being refused. - Approving a tailored plan from
/aidlc composecreates the plan you were shown, with its depth and settings, even when the agent worked the plan out again after your reply (as on Codex betweencodex execturns), instead of creating a different one as "the plan you approved"; if the plan you saw is lost, the agent says so and shows the new one for your approval. - When a stage's rules come in parts and a part's code starts with a dash, the agent's
continue -- <code>brings the next part, on GitHub Copilot too, instead of sending the load back to part 1, where the stage's question or approval came late or never (on Kiro CLI part 1 was fetched hundreds of times). - Skipping the last stage once it started, through a plan reshape, names
/aidlc --skip <stage>to skip it where it stands; under "Continue automatically" a refused plan or scope change no longer tells you, while you are there, that there is nobody here to approve it (an unattended run still says so); and the Stages to Execute row of your work's state file names each stage (2.3 (requirements-analysis)), as Stages to Skip does (work already open keeps its row until a scope change or a recompose rewrites it).
Construction
- Side-by-side builds: under Guard Policy strict, a change you ask for in the main checkout while the Units are built ("also fix the typo in the README") goes in and is kept when they land, recorded with your words, instead of being held until Code Generation is over; a file a building Unit's plan names still goes through that Unit's checkpoint, and a strict Guard Policy your team locked in memory says where it is set. A file Git ignores and does not track (a test run's log, a dev server's log, a
.env) no longer asks you to approve the plans again, stops a landing or the stage's completion, or is said as your change, and an ignored link to a folder outside the project, or an ignored file beside a submodule, no longer stops the build starting. - With the walking skeleton on and the other Units built side by side, the first landing no longer reads the skeleton you approved at its checkpoint (or a file it deleted) as your change, and approving Code Generation after the skeleton's checkpoint and the batch's goes on to Build and Test instead of a refusal naming the skeleton that nothing got past (work already stuck goes through at its next approval). A nested repository holding a Unit's source with no
.gitmodulesentry is named before any Unit's folder is made, with the step to register it as a Git submodule or build the Unit serially, instead of empty folders and a failure that did not say why; and a plan you approved again that cannot reach a Unit's existing build says what that build holds of its own (uncommitted work, or commits the main code's history lacks), not that you must approve again. - Team Units work end to end with an agent (run that way on Claude Code and GitHub Copilot CLI): a Unit claimed in a teammate's fresh clone or in the lead's own checkout, with either approval rhythm, goes through its stages,
/aidlc unit publish,/aidlc unit pin, one merge question and its landing, and the checkout that claimed it then takes the landed main with a plaingit pull, keeps every row of its record and is free for the next claim. On the way, pin takes the Unit as a real clone holds it (AI-DLC's own stage diaries and review records, the Plan Approval row, a stage the Unit's kind owes nothing or that you approved over an open concern, a record past 1 MiB) instead of refusing it one reason at a time; publish and land are no longer stopped by AI-DLC's own part of.gitignore,AGENTS.mdoropencode.json, a landing finishes on a main with no Unit Progress table yet or with the other approval rhythm, and land says why git refused a commit; committing once AI-DLC says the Unit is done goes through instead of a loop of refusals;/aidlc unit pin <unit>and the otherunitcommands run instead of being read as new work; and AI-DLC claims a Unit only when you ask it to (/aidlc --claim <unit>). - Team Unit gates and board: pin puts the merge question to you once, in the turn that pins the Unit, and your first answer is recorded as yours, with its words or the message it came in, and an Approve lands the Unit in that turn; under the end-of-Unit rhythm the one gate shows each earlier stage's open findings, labelled by stage, and any review that did not finish, and Approve accepts exactly what it showed; a gate shown again after your Request Changes takes your next answer; a step that does not apply to your Unit (Infrastructure Design with nothing to provision) is skipped when you or the agent skip it, instead of refused every turn, and the merge question says so once; "Reopen the approved stage" in the claimed checkout reopens it for your Unit; that checkout shows the Units already merged on main as done; the board says a landed Unit has landed and, while every Unit is claimed, that nothing runs from the main checkout and where each Unit is worked; and the end-of-Unit notice says to publish here, then pin, gate and land from a checkout of the project that holds no Unit claim, and to pull main here once it lands.
- Known gaps in team Units, still open in this release: under the end-of-Unit rhythm a stage your Unit skipped still stops its end-of-Unit approval, which asks for that stage's documents and a review it cannot have; the merge question can say a stage passed review cleanly when you approved it with a finding still open; and a change you ask for to an approved stage, in the checkout that claimed the Unit, reopens it but is recorded as a jump command you did not type, without your words.
- When the agent wants to install a system package nobody asked for (such as
sudo apt-get install -y python3-pytestat Build and Test), at any stage and under every Guard Policy, it tells you the command and what it is for and waits; your go-ahead runs it once, recorded with your words, and an install you ask for in a message of its own, or one a plan you approved names, runs as before. - With the ATDD methodology, the code plan's Acceptance Red step asks to run the acceptance tests before the feature is built and record their failing output, as TDD's Red step does; an ATDD code plan approved before the update, whose build is not yet reviewed, is asked about once more under Guard Policy strict.
Reverse Engineering and many repositories
- A repository folder named with parentheses, brackets, braces,
;,$or a backtick (such aslib (copy)) is part of the work like any other, instead of being left out because its name "stops AI-DLC's commands on Cursor", and on Cursor the Reverse Engineering helper's commands for it run under Guard Policy strict and relaxed; a name with an apostrophe beside!,$or a backtick is still left out.
Setup, configuration, and lifecycle
aidlc versionreports2.11.3on all seven harnesses.- AI-DLC makes no hard links any more, so on an exFAT drive (Linux or Windows)
aidlc config --harness <name> --yes,/aidlc knowledge onboard,aidlc system workspace-syncand/aidlc intent add-repowork as on a local disk, instead of config being refused and workspace sync stopping on a rawEPERMorEISDIRerror (at a terminal, first-run setup on Linux exFAT and WSL/mnt/cstill stops at its file-permissions check, as before). Two AI-DLC commands started together on one project, on any drive, lose nothing: the second saysanother AI-DLC command is still working in <project>.with its next step (two workspace syncs: that a clone appeared while it was staging), and a lock another computer left names the folder to delete. aidlc update --help, and the help ofuse,uninstall,doctorandversion, names every option the command takes with a one-line meaning, andupdate --channelsays it takes one run's release from that channel, whileaidlc config --channelsets the channel this machine follows.- Keeping the models as they are is an answer on Claude Code, Codex, opencode and Kiro CLI: Enter at the models question,
unchangedat first-run setup, or the newaidlc config models --keeprecords it with its undo, so a refresh in a project with no model policy no longer asks about models again (aidlc config models --resetclears it). aidlc doctor: on a machine that never checked for updates, its own quick check failing (a slow or unreachable release site) leaves the update row passing asnot checked yet, namingaidlc update --check, instead of a warning (aidlc doctor --check-updatesstill reports a failed check); and a stale lock doctor cleared itself passes its row instead of failing it and exiting 1.- Turning one of AI-DLC's checks off (sensors, learnings and usage tracking aside) while its variable is set in the environment to anything but 1 (such as
AIDLC_DISABLE_REVIEW_FREEZE_HOOK=0) says the switch is recorded but does not turn the check off while that variable is set, and to start the editor or CLI without it, instead of saying the check is off. - A PDF longer than 50 pages, of which AI-DLC reads the first 50, is no longer recorded as read whole:
/aidlc knowledge showprintstruncated yes after page 50above its text, and when you name such a PDF in your request the agent saysOnly its first 50 pages were read.
Plugins
- Plugin authors on a native install run the compose test with
aidlc plugin test [path] --install <project-root>, besideaidlc plugin validateandaidlc plugin build: it tests the plugin in a throwaway copy of that project, which is never changed, instead ofunknown command 'plugin'; and when the plugin is off in that project, its line names the select for your install (aidlc engine plugin select aidlc,<plugin>on a native install), first saying to install the plugin there when it is not installed yet. - On Kiro IDE a plugin built with this release registers its session-start step with the 1800 seconds AI-DLC's own session-start hook gets, instead of Kiro's 60-second default, which stopped a plugin's compose that waited on another sync or ran on a slow machine without a message; a registration already in a project keeps what an earlier build wrote until the plugin is built and dropped in again.
- After a plugin that adds stages or a scope is synced,
aidlc doctor's AI-DLC files row no longer names the scope and stage tables beside the/aidlcskill (tables.md) as a fileaidlc configkeeps and stops on, or offersaidlc config --forcefor them, on any harness: a refresh renders them again itself, the plugin's rows included.
Harness by harness
- Claude Code: a session started under a named agent (
claude --agent <name>, a background session, or with Claude agents on) runs its first/aidlcstep and proposes a plan, instead of being refused withDelegated agent "<name>" cannot run ...; in a desktop-app session that works in a git worktree of the project, the native install's hooks record the session, your words and its audit in that worktree, instead of in the main checkout's record or failing every hook withthis project's <version> pin is not registered on this machine;aidlc configsets up a project whose.claude/worktreesholds a worktree of yours with a symlink in it (such as a trackedAGENTS.md -> CLAUDE.md), leaving it as it was, instead of stopping withtransaction tree contains a link or special file; and the welcome message's Scopes table lists the stages each plan runs (infra's InceptionPD, RA, security-patch'sRE, RA), says the scope is set from your command or proposed for you to confirm, and no row runs past its table. - GitHub Copilot: on Copilot CLI on Windows every stage's document is written on the first try, since AI-DLC makes each stage's and Unit's record folder, and Reverse Engineering's handoff and code knowledge base folders, when it hands out the step, instead of a refused write and a retry in the chat whenever a stage starts a new folder; and the adapter reads the shapes the Copilot desktop app was reported to send (an
apply_patchwhose patch arrives as plain text or intoolArgs, shell calls namedpowershellorpwsh,grepwith itspaths), so a stage edited that way can be approved after its confirmed summary instead of staying Running; the app is not yet a supported surface. - Kiro CLI and Kiro IDE: Kiro CLI 2.33.0 and later take the engine only from the command line or your own Kiro settings, so in a project set up with
aidlc config --harness kiro-idea plainkiro-clicould open the v2 engine, sayagent "aidlc" not foundand run none of AI-DLC's hooks; every line AI-DLC prints, and its guides give, to start or restart Kiro CLI now names the engine:kiro-cli --v3there (choose Trust, continue when Kiro asks whether you trust the folder), andkiro-cli --v2in a project set up with--harness kiro(Kiro CLI 2.21.4 or later). In a project set up with--harness kiro, a side-by-side build on Kiro CLI no longer asks you to approve each file a worker writes in its Unit's checkout under.aidlc/worktrees/<unit>/(its.git,.gitignoreand other dot files, your project's dot folders and anything outside the project still ask, and on Kiro CLI's v2 engine the checkout's own dot folders go through too; a project whose agent files Kiro upgraded for its 3.0 engine gets this withaidlc config --harness kiro --force, which the refresh names); on Kiro IDE an/aidlcrequest in a chat on Kiro's Default agent hears once in that chat why Kiro asks you to approve each AI-DLC command and that picking aidlc in the agent menu under the chat box stops those cards, and a Unit's reviewer copy (" (this review)" in Kiro's agent list) left when you approved without its verdict is deleted when the next chat in that work starts or the next review is asked for, instead of staying until you delete it; and doctor's ignore-source rows (nowKiro ignore sources:) say Kiro CLI v3 is denied too, and where each file applies: Kiro CLI v3 applies.kiroignorewith no setting and never.gitignore. - opencode: AI-DLC runs on OpenCode 2, so its gates take your replies instead of refusing every one; there
/aidlc --statusstands in for the to-do driven progress sync, which OpenCode 2 has no tool for, and the chat shows the/aidlccommand's template while your typed switches are still kept. On opencode 1 AI-DLC now asks for 1.18.29 or newer (earlier releases asked for 1.17), andaidlc doctorwarns about an older one. - Windows: on a native install
aidlchands your arguments on as you typed them: the install addsaidlc.exeto its bin folder, which PowerShell, CMD and Git Bash run beforeaidlc.cmd, soaidlc use 'R&D',^,|,>and%NAME%are no longer read by cmd.exe first, and each command starts a little sooner (after an update from an earlier release, the first command writes it); and while the work is at Code Generation, AI-DLC's own commands after Git Bash'scd /c/<project>;run instead of being refused withCode Generation cannot start: ..., and a refused step that carries your words keeps them in its way on.
Script compatibility
- on Windows, once 2.11.3 has written
aidlc.exein the native install's bin folder, theinstall.ps1of an earlier release stops at itsexisting aidlc at ... is outside the native install destinationcheck (exit 4) instead of installing that release, and an earlier release'saidlc uninstallleavesaidlc.exebehind and names it. Switch to an earlier release withaidlc use <version>. - a system package install that no plan you approved names is held in unattended runs (
AIDLC_UNATTENDED=1) too, so a CI job whose agent installed its own tools (sudo apt-get install,brew install,winget install) now gets the command named instead of run; install those tools in the job before AI-DLC starts. aidlc config runtime --checkfor opencode now fails with an opencode 1 older than 1.18.29 (opencode <version> is below 1.18.29), where 2.11.2 passed it; update opencode in the job first. A plainaidlc config --harness opencode --yesis not stopped by it, andaidlc doctoronly warns.
Contributors
Thank you to everyone who contributed to this release: @maksymskuibida, @wowzoo, @bekir1184, @anitalewis, @falnyr, @Flolight, @kumachan99, @leandrodamascena, @MaxKramnik, @mdanialqureshi, @tssahota, @XSY-28.
New Contributors
- @MaxKramnik made their first contribution in #2506
- @tssahota made their first contribution in #2910
- @XSY-28 made their first contribution in #2949
- @bekir1184 made their first contribution in #3173
- @Flolight made their first contribution in #3184
- @falnyr made their first contribution in #3194
- @maksymskuibida made their first contribution in #3217
Promoted from v2.11.3-preview.20261103.1, source 63fd2901947ece8c5ad0cd831cdf5934a9666d47.
Full Changelog: v2.11.2...v2.11.3