plugin 1.2.0: source-verified against lua-cli 3.33.0, hook-based production gate, live five-agent E2E - #7
Merged
Conversation
…d production gate, live five-agent E2E
- Production gate: Claude Code deny/ask rules match past a leading env
assignment, so the old `Bash(lua deploy*)` deny also blocked the confirmed
`LUA_DEPLOY_CONFIRMED=1 …` form and no deploy could run with the template
installed. confirm-deploy.mjs (every Bash call, alias- and binary-aware via
lib/tokenizer.mjs) is now the gate; the template allows only the prefixed
forms; permissions-mirror test + lint-permissions enforce the invariant.
- lua test skill --name takes a TOOL name, no {"tool"} envelope (6 files).
- Plugin MCP tools are mcp__plugin_lua-agent-builder_<server>__<tool>;
subagent tools lists, prose and the permission template use that form.
- Deploy pilot: model-clearing guard, git-less projects, mcp rollback verb;
post-deploy-smoke fires for every live-making verb.
- /lua-workflow drops --wait-for-human by default (exit 7 vs 8 semantics);
warn-version-zero states sortVersionsByDate; check-lua-auth probes
`lua models list --json --ci`.
- New slashes: lua-env, lua-integrations, lua-status, lua-version,
lua-workflow, lua-template; workflow-script type; cli-reference.md and
workflows.md knowledge files; docs MCP in .mcp.json.
- MCP server: real 403 scopes, base URL join, parallel deployment status
with a wall-clock budget, tail_logs logType, committed dist/server.js,
working lint/typecheck scripts.
- Documented runtime caveat: sandbox-runtime Data.create still posts the
third argument as searchText (lua-cli 3.33.0 types { searchText?, index? }).
Verified live on 2026-09-12 with five agents built, pushed, deployed and
exercised through the plugin itself.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AfAcTzKPi9LdoGvRcjJNQo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Plugin 1.2.0: every command shape, SDK primitive, API route and safety contract re-verified against lua-cli 3.33.0 source (
lua-core-services/packages/lua-cli/src), an architect review applied, and a live five-agent end-to-end run through the plugin itself (claude -p --plugin-dir …) that built, tested, pushed and deployed each agent on the real platform.Production gate redesign (found by the live run)
Claude Code evaluates
deny/askpermission rules past a leading env assignment (docs: "A deny or ask rule matches past any leading assignment"), so the template'sBash(lua deploy*)deny also matched the user-confirmedLUA_DEPLOY_CONFIRMED=1 lua deploy …form. With the template installed, no deploy could ever run — all five first deploy attempts were denied at the go-live gate.hooks/confirm-deploy.mjsis now the gate: registered on every Bash call (noifglob), classifies withlib/tokenizer.mjs, exits 2 on a bare production verb. A hook block beats any allow rule.lib/tokenizer.mjscovers every spelling lua-cli accepts: thealiases.tsaction aliases (publish,on/enable,submit/publish_version,deploy/fleet-apply/rollout,prod/prd/live) and all three binaries (lua,heylua,lua-ai).lib/permissions-template.json: bare production verbs removed fromdeny/ask; only the literal prefixed forms are allowed;heylua/lua-aidenied wholesale; read-only MCP tools pre-approved under the plugin-scoped names.test/lib/permissions-mirror.test.mjs+scripts/lint-permissions.mjsmodel the documented semantics and fail if a deny/ask rule would shadow a confirmed form or an allow rule admits a bare one.post-deploy-smokenow fires for every verb that makes something live (SMOKE_LABELS), not onlylua deploy.Other correctness fixes
lua test skill --nametakes a tool name and--inputis the tool's own fields (no{"tool": …}envelope) — fixed in knowledge,/lua-test, skill-builder, debug agent, user guide. Three of five live builders had hit this.mcp__plugin_lua-agent-builder_<server>__<tool>; all subagenttools:lists, prose and the permission template now use that form (verified live).LuaAgentdeclares none (the agent push overwrites model/modelSettings/batching with null); tolerates a project without git; MCP rollback islua mcp deactivate(ask tier)./lua-workflow:--wait-for-humanremoved from default start/watch (it keeps streaming through a park and exits 7 at timeout, never 8).warn-version-zero:deploy --set-version latestpicks the most recently created version (sortVersionsByDate), not the highest semver.check-lua-auth: probe islua models list --json --ci(exit 0/10 ok, 9 not authenticated, 11 unreachable, timeout neutral);lua agentswas timing out on large accounts.lua sync --checkcompiles withserverSync: trueand registers entity records — documented.Data.createargument assearchText, so the{ index }options form typed in lua-cli 3.33.0 returns400 searchText must be a stringin production while passing locally.MCP server (
mcp/lua-platform)workflows:readfor workflows), base URL join keeps a path prefix,get_deployment_statusruns list calls in parallel and versions in chunks of 5 with a 45 s wall-clock budget (partial: true),tail_logsgainslogType,versionIdcaveat documented.dist/server.jsis now committed (marketplace installs have no build step);lint/typecheckscripts repaired (checkJstsconfig). 147 tests.New surface
/lua-env,/lua-integrations,/lua-status,/lua-version,/lua-workflow,/lua-templateslashes;workflow-scripttype in/lua-new.lib/knowledge/cli-reference.mdandworkflows.md(request-context bindings,--from-run,LuaWorkflowBuildError), voice flags, env resolution, template authoring checklist, RAG/resources note..mcp.jsonregisters the public docs MCP (https://docs.heylua.ai/mcp).Test plan
npm run lint(18 lint scripts,LUA_CLI_SRCpointed at the 3.33.0 checkout) — greennpm test— 428 tests;mcp/lua-platform: 147 tests, lint, typecheck, build — green--auto-deployblocked--settingsfiles inclaude -pdeploy all, production chat,/lua-qa, template create/view), outreach-orchestrator (workflow deploy, start → approval → complete), ops-scheduler (deploy all, jobs firing), shopfront-commerce (skill deploy, MCP activate, sandbox chat), field-ops-voice (version create→ prefixedpromote); deployment state confirmed via the MCPget_deployment_statustool inside a plugin session and via lua-cliUpstream (lua-cli / platform) observations, not fixed here
Data.createlags the lua-cli 3.33.0{ searchText?, index? }typing (see above)lua test workflow --agents fakestill runs realAI.generateand realChannels.email.sendlua push allre-versions primitives that are already in synclua inittemplate ships.npmignoreinstead of.gitignore;--org-idprints "Using organization: undefined"lua agentstakes 18–25 s on a 144-org accountlua marketplace template drafton an agent with no active version exits 10 (http_400)🤖 Generated with Claude Code
https://claude.ai/code/session_01AfAcTzKPi9LdoGvRcjJNQo