@rubytech/create-maxy-code 0.1.559 → 0.1.560

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,12 +3,37 @@ export interface RosterCensusInput {
3
3
  agentsMdPath: string;
4
4
  /** `<accountDir>/specialists/agents` — the directory spawn-context reads. */
5
5
  specialistsAgentsDir: string;
6
+ /** Directories whose own `*.md` files are durable copies. Today just
7
+ * `$PLATFORM_ROOT/templates/specialists/agents`. Required, not optional:
8
+ * a caller that omitted them would report every live specialist as
9
+ * undurable. */
10
+ durableDirs: string[];
11
+ /** Plugin-tree roots. For each, every `<root>/<plugin>/agents/*.md` is a
12
+ * durable copy: the account tree (`store-skill`'s home for authored
13
+ * agents), the platform tree, and premium-plugins. A premium agent's only
14
+ * copy lives in its bundle and a reinstall re-delivers it, so omitting that
15
+ * root would report five standing false positives on beacons alone. */
16
+ durablePluginRoots: string[];
17
+ /** `<installRoot>/premium-plugins`. Omitted, missing, or holding no bundle
18
+ * directory yields an empty `bundleOrphans`: none of those states is
19
+ * evidence that the account's whole premium set is orphaned. */
20
+ premiumPluginsDir?: string;
6
21
  }
7
22
  export interface RosterCensusResult {
8
23
  declared: number;
9
24
  dispatchable: number;
10
25
  /** Declared names with no `<name>.md` in the dispatch directory. */
11
26
  orphaned: string[];
27
+ /** Live specialist filenames, `.md` included, absent from every durable
28
+ * root. Filenames rather than roster names because the durable copy is
29
+ * stored under the filename, and a `--` agent's two differ. */
30
+ undurable: string[];
31
+ /** Task 2418 — basenames of `*--*.md` in the dispatch directory with no file
32
+ * of that name under `<premiumPluginsDir>/<bundle>/agents/`. Dispatchable
33
+ * today, with no bundle behind them. Walks the directory rather than the
34
+ * roster, because dispatchability is a property of the directory
35
+ * `spawn-context.ts` reads, not of what AGENTS.md advertises. */
36
+ bundleOrphans: string[];
12
37
  }
13
38
  export declare function runRosterCensus(input: RosterCensusInput): RosterCensusResult;
14
39
  //# sourceMappingURL=roster-census.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roster-census.d.ts","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAgB5E"}
1
+ {"version":3,"file":"roster-census.d.ts","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;qBAGiB;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;4EAIwE;IACxE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;;qEAEiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;oEAEgE;IAChE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;sEAIkE;IAClE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAyCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAgC5E"}
@@ -1,5 +1,40 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ /** `*.md` entries directly in `dir`. A missing directory is normal — not every
4
+ * install carries premium-plugins — and contributes nothing. An unreadable one
5
+ * is not: the throw propagates to the emit point, which reports
6
+ * `[roster-census] error` rather than a short durable set, because a partial
7
+ * set would name durable specialists as undurable. */
8
+ function markdownIn(dir) {
9
+ if (!existsSync(dir))
10
+ return [];
11
+ return readdirSync(dir).filter((entry) => entry.endsWith(".md"));
12
+ }
13
+ function subdirs(dir) {
14
+ if (!existsSync(dir))
15
+ return [];
16
+ return readdirSync(dir, { withFileTypes: true })
17
+ .filter((entry) => entry.isDirectory())
18
+ .map((entry) => entry.name);
19
+ }
20
+ function findBundleOrphans(specialistsAgentsDir, premiumPluginsDir) {
21
+ if (!premiumPluginsDir)
22
+ return [];
23
+ const bundles = subdirs(premiumPluginsDir);
24
+ // No bundle resolvable, whether the root is missing or merely empty, is not
25
+ // evidence of a fleet of orphans: both are indistinguishable from a brand
26
+ // that legitimately ships none (paths.ts bundleMode defaults to 'none').
27
+ // Provisioning applies the identical guard, so the two surfaces never
28
+ // disagree. An unreadable root throws, the same doctrine as markdownIn.
29
+ if (bundles.length === 0)
30
+ return [];
31
+ // Any bundle's agents/ dir: `--` names are already bundle-unique, so this
32
+ // asks the same question as parsing the prefix without deriving meaning from
33
+ // a filename.
34
+ return markdownIn(specialistsAgentsDir)
35
+ .filter((file) => file.includes("--"))
36
+ .filter((file) => !bundles.some((b) => existsSync(join(premiumPluginsDir, b, "agents", file))));
37
+ }
3
38
  export function runRosterCensus(input) {
4
39
  const body = existsSync(input.agentsMdPath)
5
40
  ? readFileSync(input.agentsMdPath, "utf8")
@@ -9,10 +44,24 @@ export function runRosterCensus(input) {
9
44
  declared.push(match[1]);
10
45
  }
11
46
  const orphaned = declared.filter((name) => !existsSync(join(input.specialistsAgentsDir, `${name}.md`)));
47
+ const durable = new Set();
48
+ for (const dir of input.durableDirs) {
49
+ for (const filename of markdownIn(dir))
50
+ durable.add(filename);
51
+ }
52
+ for (const root of input.durablePluginRoots) {
53
+ for (const plugin of subdirs(root)) {
54
+ for (const filename of markdownIn(join(root, plugin, "agents")))
55
+ durable.add(filename);
56
+ }
57
+ }
58
+ const undurable = markdownIn(input.specialistsAgentsDir).filter((filename) => !durable.has(filename));
12
59
  return {
13
60
  declared: declared.length,
14
61
  dispatchable: declared.length - orphaned.length,
15
62
  orphaned,
63
+ undurable,
64
+ bundleOrphans: findBundleOrphans(input.specialistsAgentsDir, input.premiumPluginsDir),
16
65
  };
17
66
  }
18
67
  //# sourceMappingURL=roster-census.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"roster-census.js","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA+BjC,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;QACvE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CACtE,CAAC;IACF,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,MAAM;QACzB,YAAY,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;QAC/C,QAAQ;KACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"roster-census.js","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"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"}
@@ -96,18 +96,23 @@ Show the operator the complete file and ask them to review.
96
96
  ## Step 6: Install through specialist-management
97
97
 
98
98
  The agent persists as part of an admin-managed plugin: the same durable home `store-skill` uses,
99
- so it survives a reinstall and the agent and its skills stay together. `store-skill` already
100
- created that plugin when you built the agent's skills (canonical under the account, mirrored
101
- under the platform plugins tree). Write the composed file, named `{plugin}--{name}.md`, into the
102
- plugin's `agents/` directory in both places, so it is durable under the account and immediately
103
- visible in the platform mirror that `specialist-management` reads. Then follow
104
- `specialist-management`'s "Activate premium plugin agents" path to copy it into
105
- `specialists/agents/` and append the `- **specialists:{name}**: {description}` line to the admin
106
- `AGENTS.md`. Do not invent install logic; drive that existing path. If the agent bundles only
107
- existing skills, so no plugin was created, scaffold the plugin first the way `store-skill` does
108
- (a `PLUGIN.md` and the `.user-mirror` marker in both the account and mirror trees) before
99
+ so it survives a reinstall and the agent and its skills stay together. That home is the account's
100
+ own plugin tree, and it is the only one: operator plugins never live under
101
+ `$PLATFORM_ROOT/plugins`, which is immutable.
102
+
103
+ Write the composed file to `plugins/{plugin}/agents/{plugin}--{name}.md`. That copy is the
104
+ durable one, and the live copy is only ever made by copying it, so no order of operations leaves
105
+ a dispatchable agent that nothing can restore. `store-skill` already created the plugin when you
106
+ built the agent's skills; if the agent bundles only existing skills, so no plugin was created,
107
+ scaffold it first the way `store-skill` does — a `PLUGIN.md` under `plugins/{plugin}/` — before
109
108
  writing the agent file.
110
109
 
110
+ Then follow `specialist-management`'s "Install an account-authored agent" path, which copies the
111
+ durable file into `specialists/agents/` and appends the `- **specialists:{name}**: {description}`
112
+ line to the admin `AGENTS.md`. Do not invent install logic, and never write an agent file
113
+ straight into `specialists/agents/`: a live file with no durable copy behind it is exactly what
114
+ this step exists to prevent.
115
+
111
116
  ## Step 7: Confirm
112
117
 
113
118
  Tell the operator:
@@ -16,9 +16,12 @@ The roster splits along one line: what an agent is *for*.
16
16
  writing, data, coding. It owns a capability surface, not a single artefact. These ship in
17
17
  `platform/templates/specialists/agents/` and resolve as `specialists:<name>`.
18
18
  - **Vertical bundle agent.** A job title that owns one deliverable and the skills that produce
19
- it: a negotiator owns the buyer-pipeline package, a quoter owns the priced quote. These ship
20
- inside a premium plugin's `agents/` directory, named `{plugin}--{agent}.md`, and resolve as
21
- `specialists:<name>`.
19
+ it: a negotiator owns the buyer-pipeline package, a quoter owns the priced quote. Named
20
+ `{plugin}--{agent}.md` and resolving as `specialists:<name>`, these have two homes. A
21
+ bundle-shipped one lives in its premium plugin's `agents/` directory. An operator-authored one
22
+ lives in the account's own `plugins/{plugin}/agents/`, the durable home `store-skill` uses;
23
+ that copy is what a reinstall preserves and what the live copy in `specialists/agents/` is
24
+ made from.
22
25
 
23
26
  `agent-builder` authors vertical bundle agents. The forcing question is "what one thing does
24
27
  this agent hand back?" If the honest answer is "several unrelated things", that is several
@@ -9,6 +9,11 @@ Invoked by the admin agent directly.
9
9
 
10
10
  Manage specialist subagents at any time via conversation.
11
11
 
12
+ Authoring a *new* agent from scratch is `agent-builder`, not this skill. That skill decides the
13
+ deliverable, the model, the skills it owns and its tool allowlist, composes the file, and writes
14
+ the durable copy; it then hands the finished agent back here to install. This skill installs,
15
+ removes, and activates agents whose files already exist.
16
+
12
17
  ## Install a specialist
13
18
 
14
19
  1. Use Bash: `cp $PLATFORM_ROOT/templates/specialists/agents/{name}.md specialists/agents/{name}.md`
@@ -45,3 +50,24 @@ For each `.md` file in `$PLATFORM_ROOT/plugins/{plugin-name}/agents/`:
45
50
  4. Confirm removal to the user.
46
51
 
47
52
  Core specialists (files without `--` in the name) are never affected by premium plugin operations.
53
+
54
+ ## Account-authored plugin agents
55
+
56
+ An agent authored through `agent-builder` lives in the account's own plugin tree at
57
+ `plugins/{plugin-name}/agents/{plugin-name}--{agent-name}.md`. That copy is the durable one: it
58
+ is what survives a reinstall, and it is the only source the live copy is made from. A file in
59
+ `specialists/agents/` with nothing behind it in a durable tree cannot be restored by anything —
60
+ the boot-time `[roster-census]` line names those in its `undurable=` field.
61
+
62
+ ### Install an account-authored agent
63
+
64
+ For each `.md` file in `plugins/{plugin-name}/agents/`:
65
+
66
+ 1. Check whether `specialists/agents/{filename}` already exists — skip if so (idempotent).
67
+ 2. Use Bash: `cp plugins/{plugin-name}/agents/{filename} specialists/agents/{filename}`
68
+ 3. Extract the `name` and `description` fields from the copied file's YAML frontmatter.
69
+ 4. Read `agents/admin/AGENTS.md`. If it already contains `specialists:{name}`, skip. Otherwise append: `- **specialists:{name}**: {description}` using Edit.
70
+ 5. Confirm each installed specialist to the user — active from next session start.
71
+
72
+ The copy source is always the durable file. Never compose an agent directly into
73
+ `specialists/agents/`: that produces a dispatchable agent nothing can restore.
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bash
2
+ # Task 2417 — the two admin skills that document specialist authoring must
3
+ # never document a live copy that is not made from a durable one.
4
+ #
5
+ # Task 1962 (ba626832b) dropped the platform mirror. agent-builder was never
6
+ # updated: it kept telling the agent to write the composed file "in both
7
+ # places" and to scaffold a `.user-mirror` marker in a mirror tree that no
8
+ # longer exists, then handed install to a specialist-management flow sourcing
9
+ # from $PLATFORM_ROOT/plugins/{plugin}/agents/ — a root an account-authored
10
+ # plugin never occupies. Every documented step after "compose the file" named a
11
+ # directory that was not there, so the agent improvised a bare Write into
12
+ # specialists/agents/ and the durable copy was never made. These are the four
13
+ # checkable shapes of that regression.
14
+ set -u
15
+ ROOT="$(cd "$(dirname "$0")/../../.." && pwd)"
16
+ AB="$ROOT/platform/plugins/admin/skills/agent-builder/SKILL.md"
17
+ SM="$ROOT/platform/plugins/admin/skills/specialist-management/SKILL.md"
18
+ # agent-builder Step 0 declares this reference authoritative and forbids
19
+ # paraphrasing it, so a wrong home here overrides Step 6 rather than merely
20
+ # duplicating it.
21
+ AP="$ROOT/platform/plugins/admin/skills/agent-builder/references/agent-pattern.md"
22
+ PASS=0; FAIL=0
23
+
24
+ for f in "$AB" "$SM" "$AP"; do
25
+ [[ -f "$f" ]] || { echo "FAIL: missing $f" >&2; exit 1; }
26
+ done
27
+
28
+ # 1. Every documented `cp` into specialists/agents/ sources from a durable root.
29
+ bad=$(grep -hoE 'cp [^`]*specialists/agents/[^`]*' "$AB" "$SM" "$AP" \
30
+ | grep -vE 'cp \$PLATFORM_ROOT/templates/specialists/agents/' \
31
+ | grep -vE 'cp \$PLATFORM_ROOT/plugins/\{plugin-name\}/agents/' \
32
+ | grep -vE 'cp plugins/\{plugin-name\}/agents/' || true)
33
+ if [[ -z "$bad" ]]; then
34
+ echo "PASS: every documented cp into specialists/agents/ sources from a durable root"; PASS=$((PASS+1))
35
+ else
36
+ echo "FAIL: cp into specialists/agents/ from a non-durable source:" >&2
37
+ printf ' %s\n' "$bad" >&2; FAIL=$((FAIL+1))
38
+ fi
39
+
40
+ # 2. The account-authored install flow exists. Without this, check 1 passes
41
+ # vacuously once the flow is deleted.
42
+ if grep -qE 'cp plugins/\{plugin-name\}/agents/' "$SM"; then
43
+ echo "PASS: specialist-management documents the account-authored install flow"; PASS=$((PASS+1))
44
+ else
45
+ echo "FAIL: specialist-management has no cp from plugins/{plugin-name}/agents/" >&2; FAIL=$((FAIL+1))
46
+ fi
47
+
48
+ # 3. No platform mirror. 1962 removed it; a reference to it here is stale by
49
+ # construction and sends the agent to a tree that is not there. Matched by
50
+ # the three shapes the stale text actually used, not by the bare word:
51
+ # "mirrors the reference agent.yaml" is ordinary English and must pass.
52
+ MIRROR='\.user-mirror|platform mirror|mirror tree|mirrored under'
53
+ if ! grep -qiE "$MIRROR" "$AB" "$SM" "$AP"; then
54
+ echo "PASS: no skill in the authoring path references a platform mirror"; PASS=$((PASS+1))
55
+ else
56
+ echo "FAIL: a platform-mirror reference survives (1962 removed the mirror):" >&2
57
+ grep -inE "$MIRROR" "$AB" "$SM" "$AP" >&2; FAIL=$((FAIL+1))
58
+ fi
59
+
60
+ # 4. agent-builder names the account plugin tree as the durable home.
61
+ if grep -qE 'plugins/\{plugin\}/agents/' "$AB"; then
62
+ echo "PASS: agent-builder names the account plugin tree as the durable home"; PASS=$((PASS+1))
63
+ else
64
+ echo "FAIL: agent-builder does not name plugins/{plugin}/agents/ as the durable home" >&2; FAIL=$((FAIL+1))
65
+ fi
66
+
67
+ # 5. So does the reference Step 0 defers to. Without this, agent-pattern.md can
68
+ # say an authored agent lives in a premium bundle — a tree the account cannot
69
+ # write — and that overrides Step 6, because Step 0 forbids paraphrasing it.
70
+ if grep -qE 'plugins/\{plugin\}/agents/' "$AP"; then
71
+ echo "PASS: agent-pattern names the account plugin tree for an authored agent"; PASS=$((PASS+1))
72
+ else
73
+ echo "FAIL: agent-pattern does not name plugins/{plugin}/agents/ as an authored agent's home" >&2; FAIL=$((FAIL+1))
74
+ fi
75
+
76
+ echo "---"
77
+ echo "authored-agent-durable-copy: $PASS passed, $FAIL failed"
78
+ [[ $FAIL -eq 0 ]]
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env bash
2
+ # Task 2418 — a `--` agent whose premium bundle is no longer on the install tree
3
+ # stays dispatchable forever.
4
+ #
5
+ # 2415's retirement loop deletes only what its manifest claims, and the manifest
6
+ # names only files copied from $TEMPLATES_DIR, so a premium `--` file is never in
7
+ # it. Nothing noticed when the bundle behind it left the tree: on beacons,
8
+ # writer-craft--manuscript-reviewer.md was dispatchable from May 13 onward with
9
+ # no writer-craft bundle under premium-plugins/.
10
+ set -uo pipefail
11
+ SCRIPT_DIR_T="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+ PLAT_SCRIPTS="$SCRIPT_DIR_T/.."
13
+ REAL_PROJECT="$(cd "$PLAT_SCRIPTS/.." && pwd)"
14
+ PASS=0; FAIL=0; FAILED=()
15
+ assert_absent() { if [ ! -e "$1" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); FAILED+=("$2: expected absent [$1]"); fi; }
16
+ assert_present() { if [ -e "$1" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); FAILED+=("$2: expected present [$1]"); fi; }
17
+ assert_eq() { if [ "$1" = "$2" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); FAILED+=("$3: expected [$2] got [$1]"); fi; }
18
+
19
+ . "$PLAT_SCRIPTS/lib/provision-account-dir.sh"
20
+ export SCRIPT_DIR="$PLAT_SCRIPTS"
21
+ export USERS_FILE="/nonexistent/users.json"
22
+
23
+ # A temp platform/ whose sibling premium-plugins/ this test controls. plugins and
24
+ # config are symlinked: provisioning reads both, and neither is under test here.
25
+ T=$(mktemp -d)
26
+ mkdir -p "$T/platform" "$T/premium-plugins/present-bundle/agents"
27
+ cp -R "$REAL_PROJECT/templates" "$T/platform/templates"
28
+ ln -s "$REAL_PROJECT/plugins" "$T/platform/plugins"
29
+ ln -s "$REAL_PROJECT/config" "$T/platform/config"
30
+ export PROJECT_DIR="$T/platform"
31
+ export TEMPLATES_DIR="$T/platform/templates"
32
+
33
+ ACCT="$T/acct"
34
+ ACCT_ID="24182418-2418-2418-2418-241824182418"
35
+ ORPHANED="$ACCT/specialists/agents-orphaned"
36
+
37
+ # One `--` agent whose bundle ships it, one whose bundle is gone.
38
+ mkdir -p "$ACCT/specialists/agents"
39
+ printf -- '---\nname: keeper\n---\nShipped by a bundle that is still installed.\n' \
40
+ > "$T/premium-plugins/present-bundle/agents/present-bundle--keeper.md"
41
+ cp "$T/premium-plugins/present-bundle/agents/present-bundle--keeper.md" \
42
+ "$ACCT/specialists/agents/present-bundle--keeper.md"
43
+ printf -- '---\nname: orphan\n---\nIts bundle is no longer on the tree.\n' \
44
+ > "$ACCT/specialists/agents/gone-bundle--orphan.md"
45
+
46
+ # --- Run 1 — the orphan is reconciled, the keeper is not. --------------------
47
+ OUT1="$(provision_account_dir "$ACCT" "$ACCT_ID" "house" 2>&1)"
48
+
49
+ assert_present "$ACCT/specialists/agents/present-bundle--keeper.md" "run1:bundle-present-survives"
50
+ assert_absent "$ACCT/specialists/agents/gone-bundle--orphan.md" "run1:orphan-undispatchable"
51
+ assert_present "$ORPHANED/gone-bundle--orphan.md" "run1:orphan-preserved"
52
+ assert_absent "$ACCT/specialists/agents-disabled/gone-bundle--orphan.md" "run1:not-in-disable-quarantine"
53
+ assert_eq "$(printf '%s' "$OUT1" | grep -c 'op=specialist-orphaned name=gone-bundle--orphan.md reason=bundle-absent')" "1" "run1:orphan-named"
54
+ assert_eq "$(printf '%s' "$OUT1" | grep -c 'op=specialist-orphan-reconcile orphaned=1')" "1" "run1:count-one"
55
+
56
+ # --- Run 2 — nothing left to reconcile: zero is still logged. ----------------
57
+ OUT2="$(provision_account_dir "$ACCT" "$ACCT_ID" "house" 2>&1)"
58
+ assert_eq "$(printf '%s' "$OUT2" | grep -c 'op=specialist-orphan-reconcile orphaned=0')" "1" "run2:zero-count-logged"
59
+ assert_eq "$(printf '%s' "$OUT2" | grep -c 'op=specialist-orphaned name=')" "0" "run2:nothing-reconciled"
60
+ assert_present "$ACCT/specialists/agents/present-bundle--keeper.md" "run2:keeper-still-dispatchable"
61
+
62
+ # --- An orphan of a name already quarantined replaces it. -------------------
63
+ # The copy leaving the dispatch directory is the one that was live, so it is the
64
+ # copy worth keeping. Pinned because a later change to `mv -n` would silently
65
+ # keep the stale one and contradict the contract doc.
66
+ printf -- '---\nname: orphan\n---\nSTALE QUARANTINED COPY\n' > "$ORPHANED/gone-bundle--orphan.md"
67
+ printf -- '---\nname: orphan\n---\nLIVE COPY\n' \
68
+ > "$ACCT/specialists/agents/gone-bundle--orphan.md"
69
+ provision_account_dir "$ACCT" "$ACCT_ID" "house" >/dev/null 2>&1
70
+ assert_eq "$(grep -c 'LIVE COPY' "$ORPHANED/gone-bundle--orphan.md")" "1" "requarantine:live-copy-kept"
71
+ assert_eq "$(grep -c 'STALE' "$ORPHANED/gone-bundle--orphan.md")" "0" "requarantine:stale-copy-replaced"
72
+
73
+ # --- Run 3 — premium root present but holding no bundles. -------------------
74
+ # Indistinguishable from a brand that ships none (paths.ts bundleMode defaults
75
+ # to 'none') and from a partial install. Reconciling here would strip the whole
76
+ # premium set off the account, so it reconciles nothing, exactly as 2415 refuses
77
+ # to read zero templates as twelve simultaneous retirements.
78
+ rm -rf "$T/premium-plugins/present-bundle"
79
+ OUT3="$(provision_account_dir "$ACCT" "$ACCT_ID" "house" 2>&1)"
80
+ assert_present "$ACCT/specialists/agents/present-bundle--keeper.md" "run3:empty-premium-root-moves-nothing"
81
+ assert_eq "$(printf '%s' "$OUT3" | grep -c 'op=specialist-orphan-reconcile orphaned=0 reason=no-premium-bundles')" "1" "run3:loud-line"
82
+ assert_eq "$(printf '%s' "$OUT3" | grep -c 'op=specialist-orphaned name=')" "0" "run3:no-reconciliations"
83
+
84
+ # --- Run 4 — premium root missing entirely. Same answer, same reason. --------
85
+ rm -rf "$T/premium-plugins"
86
+ OUT4="$(provision_account_dir "$ACCT" "$ACCT_ID" "house" 2>&1)"
87
+ assert_present "$ACCT/specialists/agents/present-bundle--keeper.md" "run4:no-premium-root-moves-nothing"
88
+ assert_eq "$(printf '%s' "$OUT4" | grep -c 'op=specialist-orphan-reconcile orphaned=0 reason=no-premium-bundles')" "1" "run4:loud-line"
89
+ assert_eq "$(printf '%s' "$OUT4" | grep -c 'op=specialist-orphaned name=')" "0" "run4:no-reconciliations"
90
+
91
+ rm -rf "$T"
92
+
93
+ # --- The install path runs under `set -euo pipefail`; this suite does not. ---
94
+ # setup-account.sh:17 sets all three and calls provision_account_dir at :63, so
95
+ # an `&&` list whose test fails could abort a real install where it cannot abort
96
+ # here. Both new branches end in one: the `[ -d "$_b" ]` bundle count and the
97
+ # `[ "$_found" = 1 ] && continue` miss. A subshell running the real options is
98
+ # the only place that difference is visible.
99
+ set_e_case() {
100
+ local premium_state="$1" expect_moved="$2" label="$3"
101
+ local out rc
102
+ out="$(
103
+ set -euo pipefail
104
+ . "$PLAT_SCRIPTS/lib/provision-account-dir.sh"
105
+ export SCRIPT_DIR="$PLAT_SCRIPTS" USERS_FILE="/nonexistent/users.json"
106
+ S=$(mktemp -d)
107
+ mkdir -p "$S/platform"
108
+ cp -R "$REAL_PROJECT/templates" "$S/platform/templates"
109
+ ln -s "$REAL_PROJECT/plugins" "$S/platform/plugins"
110
+ ln -s "$REAL_PROJECT/config" "$S/platform/config"
111
+ export PROJECT_DIR="$S/platform" TEMPLATES_DIR="$S/platform/templates"
112
+ [ "$premium_state" = "with-bundle" ] && {
113
+ mkdir -p "$S/premium-plugins/present-bundle/agents"
114
+ printf -- '---\n' > "$S/premium-plugins/present-bundle/agents/present-bundle--keeper.md"
115
+ }
116
+ A="$S/acct"; mkdir -p "$A/specialists/agents"
117
+ printf -- '---\nname: orphan\n---\n' > "$A/specialists/agents/gone-bundle--orphan.md"
118
+ provision_account_dir "$A" "24182418-2418-2418-2418-241824182418" "house" >/dev/null 2>&1
119
+ [ -f "$A/specialists/agents-orphaned/gone-bundle--orphan.md" ] && printf 'moved' || printf 'kept'
120
+ rm -rf "$S"
121
+ )"; rc=$?
122
+ assert_eq "$rc" "0" "$label:no-set-e-abort"
123
+ assert_eq "$out" "$expect_moved" "$label:outcome"
124
+ }
125
+
126
+ # No premium root: the guard branch, where the bundle count test never matches.
127
+ set_e_case "bare" "kept" "set-e:no-premium-root"
128
+ # A bundle present but not shipping this file: the `_found=0` reconcile branch.
129
+ set_e_case "with-bundle" "moved" "set-e:orphan-moved"
130
+
131
+ echo "PASS=$PASS FAIL=$FAIL"
132
+ if [ "$FAIL" -gt 0 ]; then printf '%s\n' "${FAILED[@]}"; exit 1; fi
@@ -373,6 +373,53 @@ for n in names:
373
373
  fi
374
374
  fi
375
375
 
376
+ # Task 2418 — a `--` agent whose bundle has left the install tree stays
377
+ # dispatchable forever. The retirement loop above deletes only what the
378
+ # manifest claims, and the manifest names only files copied from
379
+ # $TEMPLATES_DIR, so a premium `--` file is never in it and nothing notices
380
+ # when its bundle goes. Measured on beacons: writer-craft--manuscript-reviewer
381
+ # dispatchable since May 13 with no writer-craft bundle under premium-plugins/.
382
+ #
383
+ # MOVE, never delete. The bundle is gone, so unlike a retired template there is
384
+ # nothing to restore from and this may be the only copy on the machine. It does
385
+ # NOT go to agents-disabled/: that directory is paired with agents-disabled.json
386
+ # and a file there with no store entry is exactly the drift described above.
387
+ #
388
+ # Runs AFTER the disabled block so that in the drift state (store names it,
389
+ # file still live) the disable wins and the store and its directory agree.
390
+ local _premium_root="$PROJECT_DIR/../premium-plugins"
391
+ local _bundle_count=0 _b
392
+ for _b in "$_premium_root"/*/; do
393
+ [ -d "$_b" ] && _bundle_count=$((_bundle_count + 1))
394
+ done
395
+ if [ "$_bundle_count" -eq 0 ]; then
396
+ # No bundle resolvable, whether the root is missing or merely empty. Both
397
+ # make every `--` file test as orphaned, and both are indistinguishable from
398
+ # a brand that legitimately ships none (paths.ts bundleMode defaults to
399
+ # 'none'). Acting would strip the account's whole premium set. Same doctrine
400
+ # as no-templates-on-disk above.
401
+ echo " op=specialist-orphan-reconcile orphaned=0 reason=no-premium-bundles"
402
+ else
403
+ local _orphaned=0 _cand _base _twin _found
404
+ for _cand in "$ACCOUNT_DIR/specialists/agents/"*--*.md; do
405
+ [ -f "$_cand" ] || continue
406
+ _base="$(basename "$_cand")"
407
+ # Any bundle's agents/ dir. `--` names are already bundle-unique, so this
408
+ # answers the same question as parsing the prefix, without reintroducing a
409
+ # filename-derived predicate.
410
+ _found=0
411
+ for _twin in "$_premium_root"/*/agents/"$_base"; do
412
+ [ -f "$_twin" ] && { _found=1; break; }
413
+ done
414
+ [ "$_found" = 1 ] && continue
415
+ mkdir -p "$ACCOUNT_DIR/specialists/agents-orphaned"
416
+ mv -f "$_cand" "$ACCOUNT_DIR/specialists/agents-orphaned/$_base"
417
+ echo " op=specialist-orphaned name=$_base reason=bundle-absent"
418
+ _orphaned=$((_orphaned + 1))
419
+ done
420
+ echo " op=specialist-orphan-reconcile orphaned=$_orphaned"
421
+ fi
422
+
376
423
  rm -f "$ACCOUNT_DIR/.claude/agents/"*.md 2>/dev/null || true
377
424
 
378
425
  # SOUL.md — user-controlled. Only create if missing. Never overwrite.
@@ -1 +1 @@
1
- {"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}
@@ -1177,8 +1177,27 @@ export async function spawnClaudeSession(deps, args) {
1177
1177
  // session_<id> RC URL, so the flag is dead weight (one idle outbound
1178
1178
  // WebSocket per visitor). Admin interactive sessions now run under the
1179
1179
  // per-account `claude rc` daemon, not per-spawn --remote-control.
1180
+ // Task 2420 — a CHANNEL-BOUND public spawn is the exception to Task 500. The
1181
+ // flag is not dead weight there: without it a notifications/claude/channel
1182
+ // message reaches the agent and never becomes a turn, so every public webchat,
1183
+ // WhatsApp and Telegram session received its inbound and answered nothing.
1184
+ // Measured on the laptop 2026-08-04 by driving the real webhook with synthetic
1185
+ // senders — the identical public argv replied with the flag (op=reply bytes=32,
1186
+ // 75,360-byte transcript) and produced no turn at all without it, across three
1187
+ // sessions, against the admin path which carries the flag and has always
1188
+ // worked. A public spawn with NO channel keeps Task 500's saving.
1180
1189
  const headless = isSpecialistSpawn && HEADLESS_ROLES.has(args.specialist);
1181
- const remoteControl = !headless && args.role !== 'public';
1190
+ const channelBound = Boolean(args.webchatChannel || args.waChannel || args.telegramChannel);
1191
+ const remoteControl = !headless && (args.role !== 'public' || channelBound);
1192
+ // Task 2420 — the flag widened; the OPERATOR surface did not. Two other things
1193
+ // keyed off the old predicate: `CLAUDE_CODE_REMOTE_ENVIRONMENT_TYPE` below,
1194
+ // which Task 1724 documents as enabling SendUserFile, and URL capture, which
1195
+ // exists to give an operator an iframe URL. Neither belongs to a visitor: the
1196
+ // first would put a file-sending tool inside the Task 615 ringfence, whose
1197
+ // whole premise is that a public spawn's surface is its channel reply tool or
1198
+ // nothing, and the second captures a URL Task 500 established no visitor ever
1199
+ // opens. They keep the narrow predicate.
1200
+ const remoteOperatorSurface = !headless && args.role !== 'public';
1182
1201
  const argv = ['--verbose'];
1183
1202
  if (remoteControl)
1184
1203
  argv.push('--remote-control');
@@ -1827,7 +1846,7 @@ export async function spawnClaudeSession(deps, args) {
1827
1846
  // happens on every spawn whose bridge DID bind — this makes it unconditional
1828
1847
  // rather than new in kind. An upload failure is recorded on the attachment
1829
1848
  // (`upload_error`) and never thrown, so it cannot fail the delivery itself.
1830
- if (remoteControl)
1849
+ if (remoteOperatorSurface)
1831
1850
  spawnEnv.CLAUDE_CODE_REMOTE_ENVIRONMENT_TYPE = 'remote';
1832
1851
  // Task 207 — specialist spawns inherit per-account env explicitly so
1833
1852
  // plugin-system MCP children get a deterministic context without the
@@ -2081,8 +2100,10 @@ export async function spawnClaudeSession(deps, args) {
2081
2100
  // Task 171 — headless spawns never emit the `/remote-control is active`
2082
2101
  // banner (the flag is absent), so the handler is not attached and no
2083
2102
  // PTY bytes are consumed by a regex that will never match. Task 500 —
2084
- // same for public spawns (remoteControl is false), so the gate keys off
2085
- // `remoteControl`, not `headless`.
2103
+ // same for public spawns, so the gate keys off the operator-surface
2104
+ // predicate, not `headless`. Task 2420 — and not off `remoteControl`
2105
+ // either, now that a channel-bound public spawn carries the flag: the
2106
+ // banner it emits names a URL no visitor opens.
2086
2107
  //
2087
2108
  // Task 260 — `capturedUrl` is the value SpawnedSession returns to the
2088
2109
  // caller (the route includes it in the immediate /spawn response when
@@ -2093,7 +2114,7 @@ export async function spawnClaudeSession(deps, args) {
2093
2114
  // Mutable holder so the URL callback can find the row once sessionId
2094
2115
  // is known. The PID-file event below sets sessionIdRef.current.
2095
2116
  const sessionIdRef = { current: null };
2096
- if (remoteControl) {
2117
+ if (remoteOperatorSurface) {
2097
2118
  startUrlCapture({
2098
2119
  pty,
2099
2120
  timeoutMs: deps.urlCaptureTimeoutMs,