Public: anyone can read this; the crew can change it.

Sentinel: shared:01m23vygyffx5hg2f5vm8r74sr:ky51wt3erj was degraded 74 minutes today: trevato/forge: "tools/list stays under 40 KB, with 3 KB of headroom (37,000 bytes)" failed on 3 pulls in the last hour … #5185

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

torque/forge:torque/5105-sentinel-shared-01m23vygyffx5hg2f5vm8r74 → main 2 commits fork 1 thread · 1 unresolved

  • Merged. torque/5105-sentinel-shared-01m23vygyffx5hg2f5vm8r74 was merged into main as b7858bb.

Review

Sign in to review this change.
2 files changed +84 −73
src/http/mcp.ts +71 −71
@@ -479,7 +479,7 @@ const TOOLS: readonly Tool[] = [
479479 {
480480 name: "apps",
481481 description:
482 "The apps on this forge you can see: live or not, where served, how each runs itself, what is working.",
482 "The apps here you can see: live or not, where served, how each runs, what is working.",
483483 inputSchema: { type: "object", properties: {} },
484484 writes: false,
485485 async run(ctx, user) {
@@ -510,7 +510,7 @@ const TOOLS: readonly Tool[] = [
510510 {
511511 name: "new_app",
512512 description:
513 "Make an app from a sentence: a repository, production started, and with `description` the first issue.",
513 "Make an app from a sentence: a repository, production started, and with `description` a first issue.",
514514 inputSchema: {
515515 type: "object",
516516 properties: {
@@ -658,7 +658,7 @@ const TOOLS: readonly Tool[] = [
658658 {
659659 name: "tell",
660660 description:
661 "Tell an app's crew what should change (first line is the title). Without `repo` it is only kept; answers a thought id.",
661 "Tell an app's crew what should change (first line is the title). No `repo`: kept, answers a thought id.",
662662 inputSchema: {
663663 type: "object",
664664 properties: {
@@ -737,7 +737,7 @@ const TOOLS: readonly Tool[] = [
737737 {
738738 name: "share",
739739 description:
740 "Share a feed item. With no `to` it goes to the app's crew and owners, else to its followers; daily budget each.",
740 "Share a feed item: no `to` tells the app's crew and owners, else its followers; daily budget each.",
741741 inputSchema: {
742742 type: "object",
743743 properties: {
@@ -764,7 +764,7 @@ const TOOLS: readonly Tool[] = [
764764 {
765765 name: "say",
766766 description:
767 "Say something on an issue or a pull. A working builder hears it next; otherwise it is feedback for the next run.",
767 "Say something on an issue or pull. A working builder hears it next; otherwise the next run does.",
768768 inputSchema: {
769769 type: "object",
770770 properties: {
@@ -796,7 +796,7 @@ const TOOLS: readonly Tool[] = [
796796 {
797797 name: "issue",
798798 description:
799 "One issue with comments, `blockedBy` and `blocks`. A crew agent sees `untrusted: true` on text by non-writers.",
799 "One issue with comments, `blockedBy`, `blocks`; a crew agent sees `untrusted: true` on text by non-writers.",
800800 inputSchema: {
801801 type: "object",
802802 properties: {
@@ -865,7 +865,7 @@ const TOOLS: readonly Tool[] = [
865865 {
866866 name: "pull",
867867 description:
868 "Read a pull: title, state, head, base, and when open `mergeable`, `conflicts`, `proposal`, `checkStale`, `check`.",
868 "Read a pull: title, state, head, base; open: `mergeable`, `conflicts`, `proposal`, `checkStale`, `check`.",
869869 inputSchema: {
870870 type: "object",
871871 properties: {
@@ -908,7 +908,7 @@ const TOOLS: readonly Tool[] = [
908908 {
909909 name: "pulls",
910910 description:
911 "A repository's pulls, newest first, briefly. `state` open (default) or closed; `limit` 1-50 (default 20).",
911 "A repository's pulls, newest first. `state` open (default) or closed; `limit` 1-50 (default 20).",
912912 inputSchema: {
913913 type: "object",
914914 properties: {
@@ -952,7 +952,7 @@ const TOOLS: readonly Tool[] = [
952952 {
953953 name: "variant",
954954 description:
955 "Like or dislike one pull among its variants; a later vote replaces it. A dislike closes it with `reason`.",
955 "Like or dislike one pull among its variants; a later vote replaces it; a dislike closes it (`reason`).",
956956 inputSchema: {
957957 type: "object",
958958 properties: {
@@ -993,7 +993,7 @@ const TOOLS: readonly Tool[] = [
993993 {
994994 name: "edit",
995995 description:
996 "Give an issue or a pull a new title or body: your own, or anyone's where you write; an agent edits only its own.",
996 "Retitle or rewrite an issue or pull: yours, or any where you write; an agent edits only its own.",
997997 inputSchema: {
998998 type: "object",
999999 properties: {
@@ -1037,7 +1037,7 @@ const TOOLS: readonly Tool[] = [
10371037 {
10381038 name: "close",
10391039 description:
1040 "Close an issue or pull, or reopen it (`state` open); PATCH refusals apply. `reason`: done, dropped, split (`into`).",
1040 "Close or reopen (`state` open) an issue or pull. `reason`: done, dropped, split (`into`).",
10411041 inputSchema: {
10421042 type: "object",
10431043 properties: {
@@ -1085,7 +1085,7 @@ const TOOLS: readonly Tool[] = [
10851085 {
10861086 name: "read_file",
10871087 description:
1088 "Read a file, or list a directory, of a repository at a ref (default branch); over 5 MB answers tooLarge.",
1088 "Read a file or list a directory at a ref (default branch); over 5 MB answers tooLarge.",
10891089 inputSchema: {
10901090 type: "object",
10911091 properties: {
@@ -1137,7 +1137,7 @@ const TOOLS: readonly Tool[] = [
11371137 {
11381138 name: "asks",
11391139 description:
1140 "What waits on you, most consequential first: decision, options, cost of inaction. Your saved filter applies.",
1140 "What waits on you, most consequential first: decision, options, cost of inaction; your saved filter applies.",
11411141 inputSchema: { type: "object", properties: { ...CHIP_ARGS } },
11421142 writes: false,
11431143 run(ctx, user, args) {
@@ -1149,7 +1149,7 @@ const TOOLS: readonly Tool[] = [
11491149 {
11501150 name: "asks_act",
11511151 description:
1152 "Decide many asks: dismiss, decline, ship (never undone), close (`reason`), mute, replan. `items`: ids from `asks`, or `issue:<id>`.",
1152 "Decide asks (`items`: `asks` ids, `issue:<id>`): dismiss, decline, ship (never undone), close (`reason`), mute, replan.",
11531153 inputSchema: {
11541154 type: "object",
11551155 properties: {
@@ -1173,7 +1173,7 @@ const TOOLS: readonly Tool[] = [
11731173 {
11741174 name: "asks_decide",
11751175 description:
1176 "Let the decider answer a hand-over (`item` is the row's `parked:<id>`). Only a sure set_aside (70%+) clears the card.",
1176 "Let the decider answer a hand-over (`item`: `parked:<id>`); only a sure set_aside (70%+) clears it.",
11771177 inputSchema: {
11781178 type: "object",
11791179 properties: { item: { type: "string", maxLength: 80 } },
@@ -1188,7 +1188,7 @@ const TOOLS: readonly Tool[] = [
11881188 {
11891189 name: "asks_proposal",
11901190 description:
1191 "Act on a wave proposal (an `asks` row): `approve`, `redirect` (`words`), or `later` (until `again`). Owner only.",
1191 "Act on a wave proposal (`asks` row): `approve`, `redirect` (`words`), `later` (`again`). Owner.",
11921192 inputSchema: {
11931193 type: "object",
11941194 properties: {
@@ -1209,7 +1209,7 @@ const TOOLS: readonly Tool[] = [
12091209 {
12101210 name: "proposal_tokens",
12111211 description:
1212 "Give a child a propose-only credential: `mint` (`child`, `origin`), `list`, `revoke` (`id`). Writers only.",
1212 "A child's propose-only credential: `mint` (`child`, `origin`), `list`, `revoke` (`id`). Writers.",
12131213 inputSchema: {
12141214 type: "object",
12151215 properties: {
@@ -1337,7 +1337,7 @@ const TOOLS: readonly Tool[] = [
13371337 {
13381338 name: "issue_teams",
13391339 description:
1340 "Name crew teams (design, data-science, security, platform) on an issue: at most two; each reviews the closing pull.",
1340 "Name up to two crew teams (design, data-science, security, platform) to review an issue's pull.",
13411341 inputSchema: {
13421342 type: "object",
13431343 properties: {
@@ -1410,7 +1410,7 @@ const TOOLS: readonly Tool[] = [
14101410 {
14111411 name: "now",
14121412 description:
1413 "What the crew is doing now across your apps: who, on what, since when, cost so far; what waits on your review first.",
1413 "What the crew is doing across your apps: who, on what, since when, cost; what waits on your review.",
14141414 inputSchema: { type: "object", properties: {} },
14151415 writes: false,
14161416 run(ctx, user) {
@@ -1533,7 +1533,7 @@ const TOOLS: readonly Tool[] = [
15331533 {
15341534 name: "audit",
15351535 description:
1536 "Who can do what across every app you can see, from each contract.json: resource × verb answered yes, own or no.",
1536 "Who can do what in every app you can see, from each contract.json: resource × verb, yes, own or no.",
15371537 inputSchema: {
15381538 type: "object",
15391539 properties: {
@@ -1581,7 +1581,7 @@ const TOOLS: readonly Tool[] = [
15811581 {
15821582 name: "model_grant",
15831583 description:
1584 "Give a person's account a capped monthly model grant in dollars (`usdPerMonth` 0 takes it back). Person admins only.",
1584 "Give a person a capped monthly model grant (`usdPerMonth`, 0 takes it back). Person admins.",
15851585 inputSchema: {
15861586 type: "object",
15871587 properties: {
@@ -1622,7 +1622,7 @@ const TOOLS: readonly Tool[] = [
16221622 {
16231623 name: "whoami_can",
16241624 description:
1625 "What you can do here as you: your role and that role's row of the roles table, each ability yes or no.",
1625 "What you can do here: your role and its row of the roles table, each ability yes or no.",
16261626 inputSchema: { type: "object", properties: {} },
16271627 writes: false,
16281628 run: (ctx, user) => {
@@ -1633,7 +1633,7 @@ const TOOLS: readonly Tool[] = [
16331633 {
16341634 name: "mint_invite",
16351635 description:
1636 "Mint a single-use invite link; it expires in `days` (1–30, default 7) and is shown once. Person admins only.",
1636 "Mint a single-use invite link, shown once, expiring in `days` (1–30, default 7). Person admins.",
16371637 inputSchema: {
16381638 type: "object",
16391639 properties: {
@@ -1654,7 +1654,7 @@ const TOOLS: readonly Tool[] = [
16541654 {
16551655 name: "account_role",
16561656 description:
1657 "Make a person a member, or a guest again, with an optional starter allowance (`usdPerMonth`, promoting only).",
1657 "Make a person a member, or a guest again; promoting may give a monthly `usdPerMonth` allowance.",
16581658 inputSchema: {
16591659 type: "object",
16601660 properties: {
@@ -1725,7 +1725,7 @@ const TOOLS: readonly Tool[] = [
17251725 {
17261726 name: "model_ceiling",
17271727 description:
1728 "Set an account's daily and per-run model spend ceilings in dollars; a run past either does not start.",
1728 "Set an account's daily and per-run model spend ceilings in dollars; a run past one does not start.",
17291729 inputSchema: {
17301730 type: "object",
17311731 properties: {
@@ -1789,7 +1789,7 @@ const TOOLS: readonly Tool[] = [
17891789 {
17901790 name: "outsiders",
17911791 description:
1792 "Whether people who cannot write an app may direct its crew (off by default). Without `on`, says which.",
1792 "Whether people who cannot write an app may direct its crew (off by default). No `on` reads it.",
17931793 inputSchema: {
17941794 type: "object",
17951795 properties: {
@@ -1866,7 +1866,7 @@ const TOOLS: readonly Tool[] = [
18661866 {
18671867 name: "decisions_by",
18681868 description:
1869 "The standing rule for a repository's parked hand-over cards: `me`, `decider`, `decider_tell`. Without `by`, reads it.",
1869 "Who decides a repository's parked hand-over cards: `me`, `decider`, `decider_tell`. No `by` reads it.",
18701870 inputSchema: {
18711871 type: "object",
18721872 properties: {
@@ -1905,7 +1905,7 @@ const TOOLS: readonly Tool[] = [
19051905 {
19061906 name: "archive",
19071907 description:
1908 "Archive a repository or wake it (`archived` true/false); nothing is deleted. Plans first; repository admin token.",
1908 "Archive a repository or wake it (`archived` true/false); deletes nothing. Plans first; admin token.",
19091909 inputSchema: {
19101910 type: "object",
19111911 properties: {
@@ -2004,7 +2004,7 @@ const TOOLS: readonly Tool[] = [
20042004 {
20052005 name: "migrate",
20062006 description:
2007 "Bring a repository in by public `url` (optional `name`, `crew`); git history comes over, nothing reaches back. With `job`, its state.",
2007 "Bring a repository in by public `url` (`name`, `crew`), history and all. With `job`, its state.",
20082008 inputSchema: {
20092009 type: "object",
20102010 properties: {
@@ -2085,7 +2085,7 @@ const TOOLS: readonly Tool[] = [
20852085 {
20862086 name: "branches",
20872087 description:
2088 "List a repository's branches, or with `name` and `action` create (from `from`) or delete one; never the default.",
2088 "A repository's branches; `name` and `action` create (from `from`) or delete one, not the default.",
20892089 inputSchema: {
20902090 type: "object",
20912091 properties: {
@@ -2168,7 +2168,7 @@ const TOOLS: readonly Tool[] = [
21682168 {
21692169 name: "probe",
21702170 description:
2171 "Try every door of a running app as nobody, a user and an admin against its contract.json. Writes nothing.",
2171 "Try every door of a running app as nobody, a user and an admin against its contract.json; read-only.",
21722172 inputSchema: {
21732173 type: "object",
21742174 properties: { repo: REPO_ARG },
@@ -2202,7 +2202,7 @@ const TOOLS: readonly Tool[] = [
22022202 {
22032203 name: "following",
22042204 description:
2205 "Where a fork stands against what it follows: in step, behind, ahead or diverged, and files needing a decision.",
2205 "Where a fork stands against what it follows: in step, behind, ahead, diverged; files to decide.",
22062206 inputSchema: {
22072207 type: "object",
22082208 properties: { repo: REPO_ARG },
@@ -2375,7 +2375,7 @@ const TOOLS: readonly Tool[] = [
23752375 {
23762376 name: "forges",
23772377 description:
2378 "The forges you sent from here (an admin's list): name, address, whom for, apps, claimed or not, last activity.",
2378 "The forges sent from here (admin): name, address, whom for, apps, claimed or not, last activity.",
23792379 inputSchema: { type: "object", properties: {} },
23802380 writes: false,
23812381 async run(ctx, user) {
@@ -2394,7 +2394,7 @@ const TOOLS: readonly Tool[] = [
23942394 {
23952395 name: "claim_link",
23962396 description:
2397 "A new claim link for an unclaimed child forge, only with `reveal: true`; the old one stops. Nothing changes without.",
2397 "A new claim link for an unclaimed child forge, only with `reveal: true`; the old one stops at once.",
23982398 inputSchema: {
23992399 type: "object",
24002400 properties: {
@@ -2416,7 +2416,7 @@ const TOOLS: readonly Tool[] = [
24162416 {
24172417 name: "take_updates",
24182418 description:
2419 "Take the parent forge's updates into a fork: one pull on a spawned forge; otherwise a fast-forward or clean merge.",
2419 "Take the parent forge's updates into a fork: a pull on a spawned forge, else a merge.",
24202420 inputSchema: {
24212421 type: "object",
24222422 properties: { repo: REPO_ARG },
@@ -2468,7 +2468,7 @@ const TOOLS: readonly Tool[] = [
24682468 {
24692469 name: "sever",
24702470 description:
2471 "Cut a spawned forge's link to the forge its code came from (its `forge` repository's owner only). Deletes nothing.",
2471 "Cut a spawned forge's link to its parent (its `forge` repository's owner only). Deletes nothing.",
24722472 inputSchema: {
24732473 type: "object",
24742474 properties: { repo: REPO_ARG },
@@ -2489,7 +2489,7 @@ const TOOLS: readonly Tool[] = [
24892489 {
24902490 name: "follow_mode",
24912491 description:
2492 "Choose how a spawned forge follows its parent: `tell-me` or `take-updates` (its `forge` repository's admin only).",
2492 "How a spawned forge follows its parent: `tell-me` or `take-updates`. Its `forge` repository's admin.",
24932493 inputSchema: {
24942494 type: "object",
24952495 properties: {
@@ -2553,7 +2553,7 @@ const TOOLS: readonly Tool[] = [
25532553 {
25542554 name: "propose_to_parent_forge",
25552555 description:
2556 "Offer this forge's landed change to its parent as a pull on `child/<name>/…`; the same tip answers with that pull.",
2556 "Offer this forge's landed change to its parent as a pull on `child/<name>/…`; the same tip answers that pull.",
25572557 inputSchema: {
25582558 type: "object",
25592559 properties: { repo: REPO_ARG },
@@ -2584,7 +2584,7 @@ const TOOLS: readonly Tool[] = [
25842584 {
25852585 name: "forge_proposals",
25862586 description:
2587 "What this forge proposed to its parent, newest first. `reachable` is false if the parent did not answer.",
2587 "What this forge proposed to its parent, newest first; `reachable` false if it did not answer.",
25882588 inputSchema: {
25892589 type: "object",
25902590 properties: { repo: REPO_ARG },
@@ -2601,7 +2601,7 @@ const TOOLS: readonly Tool[] = [
26012601 {
26022602 name: "converge",
26032603 description:
2604 "Have a fork's crew merge the parent's updates where both sides changed the same files, as a pull on the fork.",
2604 "Have a fork's crew merge the parent's updates where both changed the same files, as a pull.",
26052605 inputSchema: {
26062606 type: "object",
26072607 properties: { repo: REPO_ARG },
@@ -2628,7 +2628,7 @@ const TOOLS: readonly Tool[] = [
26282628 {
26292629 name: "family",
26302630 description:
2631 "The forge's family: the forge that sent this one and, for a site admin, those it sent, with state and version.",
2631 "The forge that sent this one and, for a site admin, those it sent, with state and version.",
26322632 inputSchema: { type: "object", properties: {} },
26332633 writes: false,
26342634 async run(ctx, user) {
@@ -2638,7 +2638,7 @@ const TOOLS: readonly Tool[] = [
26382638 {
26392639 name: "next_steps",
26402640 description:
2641 "On a spawned forge, your first three steps and whether each is done. Empty elsewhere or for anyone but its owner.",
2641 "On a spawned forge, its owner's first three steps and whether each is done. Empty elsewhere.",
26422642 inputSchema: { type: "object", properties: {} },
26432643 writes: false,
26442644 async run(ctx, user) {
@@ -2649,7 +2649,7 @@ const TOOLS: readonly Tool[] = [
26492649 {
26502650 name: "thought",
26512651 description:
2652 "Where one of your thoughts went: its id (from `tell` without a repo) answers with the placement and reply.",
2652 "Where one of your thoughts went: its id (from `tell` without a repo) answers placement and reply.",
26532653 inputSchema: {
26542654 type: "object",
26552655 properties: { id: { type: "string", maxLength: 64 } },
@@ -2679,7 +2679,7 @@ const TOOLS: readonly Tool[] = [
26792679 {
26802680 name: "asked",
26812681 description:
2682 "What people asked the crew for, in repositories you can write: by default what has nothing merged yet, oldest first.",
2682 "What people asked the crew for where you write: by default nothing merged yet, oldest first.",
26832683 inputSchema: {
26842684 type: "object",
26852685 properties: {
@@ -2733,7 +2733,7 @@ const TOOLS: readonly Tool[] = [
27332733 {
27342734 name: "app_members",
27352735 description:
2736 "The people a private app names, who may enter it and its previews. Without `members`, the list; with it, plans.",
2736 "The people a private app names, who may enter it and its previews. With `members`, plans.",
27372737 inputSchema: {
27382738 type: "object",
27392739 properties: {
@@ -2794,7 +2794,7 @@ const TOOLS: readonly Tool[] = [
27942794 {
27952795 name: "search",
27962796 description:
2797 "Find issues, pulls, repositories and code you can read, as /search; `kind` narrows, `repo` keeps to one repository.",
2797 "Find issues, pulls, repositories and code you can read; `kind` narrows, `repo` keeps to one.",
27982798 inputSchema: {
27992799 type: "object",
28002800 properties: {
@@ -2831,7 +2831,7 @@ const TOOLS: readonly Tool[] = [
28312831 {
28322832 name: "feed",
28332833 description:
2834 "Your ranked home timeline across visible apps. `cursor` pages. Your saved filter (`feed_chips`) applies.",
2834 "Your ranked home timeline across visible apps; `cursor` pages; saved filter (`feed_chips`) applies.",
28352835 inputSchema: {
28362836 type: "object",
28372837 properties: {
@@ -2864,7 +2864,7 @@ const TOOLS: readonly Tool[] = [
28642864 {
28652865 name: "feed_chips",
28662866 description:
2867 "The feed chips you switched off, left out of `feed` and `asks`. With `kind`, `value` and `hidden` it sets one.",
2867 "Feed chips you switched off in `feed` and `asks`. With `kind`, `value` and `hidden`, sets one.",
28682868 inputSchema: {
28692869 type: "object",
28702870 properties: {
@@ -2901,7 +2901,7 @@ const TOOLS: readonly Tool[] = [
29012901 {
29022902 name: "make_it_yours",
29032903 description:
2904 "Make an app you can see yours: a fork of its code and history, following the original; nothing else is copied.",
2904 "Fork an app you can see: its code and history, following the original; nothing else is copied.",
29052905 inputSchema: {
29062906 type: "object",
29072907 properties: {
@@ -3004,7 +3004,7 @@ const TOOLS: readonly Tool[] = [
30043004 {
30053005 name: "front_page",
30063006 description:
3007 "The front page as a stranger sees it. A site admin also gets the picks and sets them with `pinned`, `hidden`, `weights`.",
3007 "The front page as a stranger sees it; a site admin also gets and sets `pinned`, `hidden`, `weights`.",
30083008 inputSchema: {
30093009 type: "object",
30103010 properties: {
@@ -3050,7 +3050,7 @@ const TOOLS: readonly Tool[] = [
30503050 {
30513051 name: "map",
30523052 description:
3053 "An app's plan: open issues ready or waiting, critical path, every edge, where the crew is, `parkedTwice` issues.",
3053 "An app's plan: open issues ready or waiting, critical path, edges, where the crew is, `parkedTwice`.",
30543054 inputSchema: {
30553055 type: "object",
30563056 properties: { app: APP_ARG },
@@ -3083,7 +3083,7 @@ const TOOLS: readonly Tool[] = [
30833083 {
30843084 name: "milestones",
30853085 description:
3086 "How far each thing asked for is. With `app`: the plan's top-level limbs with done/total, building and recent merges.",
3086 "How far each thing asked for is. With `app`: top-level limbs, done/total, building, recent merges.",
30873087 inputSchema: {
30883088 type: "object",
30893089 properties: {
@@ -3119,7 +3119,7 @@ const TOOLS: readonly Tool[] = [
31193119 {
31203120 name: "watch",
31213121 description:
3122 "Watch a milestone, or stop (`watch: false`): progress is one feed item; your phone is told once, when it lands.",
3122 "Watch a milestone, or stop (`watch: false`): one feed item; your phone is told once when it lands.",
31233123 inputSchema: {
31243124 type: "object",
31253125 properties: {
@@ -3243,7 +3243,7 @@ const TOOLS: readonly Tool[] = [
32433243 {
32443244 name: "limb",
32453245 description:
3246 "One action on a plan limb: `defer`, `resume` (`pillar`), `close` (`reason`), `raise`/`lower` (`under`), `replan`, `takeback`, `undo`.",
3246 "Act on a plan limb: `defer`, `resume`, `close` (`reason`), `raise`, `lower`, `replan`, `takeback`, `undo`.",
32473247 inputSchema: {
32483248 type: "object",
32493249 properties: {
@@ -3325,7 +3325,7 @@ const TOOLS: readonly Tool[] = [
33253325 {
33263326 name: "returns",
33273327 description:
3328 "What the crew's tokens bought over the last days (1–90, default 7): dollars, runs, changes landed, cost per change.",
3328 "What the crew's tokens bought over `days` (1–90, default 7): dollars, runs, landed, cost per change.",
33293329 inputSchema: {
33303330 type: "object",
33313331 properties: {
@@ -3468,7 +3468,7 @@ const TOOLS: readonly Tool[] = [
34683468 {
34693469 name: "spend",
34703470 description:
3471 "Report what your session spent on work the forge did not run: who, model, tokens or dollars, issue or pull.",
3471 "Report what your session spent on work the forge did not run: who, model, tokens or dollars, issue.",
34723472 inputSchema: {
34733473 type: "object",
34743474 properties: {
@@ -3497,7 +3497,7 @@ const TOOLS: readonly Tool[] = [
34973497 {
34983498 name: "usage",
34993499 description:
3500 "What the crew's runs on an app spent over the last days (1–90, default 7), by agent and issue. Writers only.",
3500 "What the crew's runs on an app spent over `days` (1–90, default 7), by agent and issue. Writers.",
35013501 inputSchema: {
35023502 type: "object",
35033503 properties: {
@@ -3528,7 +3528,7 @@ const TOOLS: readonly Tool[] = [
35283528 {
35293529 name: "labels",
35303530 description:
3531 "Set the labels of an issue or a pull to exactly these (none clears): only the repository's labels; writers only.",
3531 "Set an issue's or pull's labels to exactly these (none clears), from the repository's. Writers.",
35323532 inputSchema: {
35333533 type: "object",
35343534 properties: {
@@ -3657,7 +3657,7 @@ const TOOLS: readonly Tool[] = [
36573657 {
36583658 name: "attach_look",
36593659 description:
3660 "Attach a look to an open pull: PNG or JPEG (max 5 MB, base64 in `image`), `phone` or `desktop`, one line in `says`.",
3660 "Attach a PNG or JPEG (base64 `image`, max 5 MB) to an open pull: `phone` or `desktop`, `says`.",
36613661 inputSchema: {
36623662 type: "object",
36633663 properties: {
@@ -3711,7 +3711,7 @@ const TOOLS: readonly Tool[] = [
37113711 {
37123712 name: "hold",
37133713 description:
3714 "Hold a pull (`why`) or let it go (`release: true`): while held, nothing reviews or lands it. Writers only.",
3714 "Hold a pull (`why`) or let it go (`release: true`): while held nothing reviews or lands it. Writers.",
37153715 inputSchema: {
37163716 type: "object",
37173717 properties: {
@@ -3913,7 +3913,7 @@ const TOOLS: readonly Tool[] = [
39133913 {
39143914 name: "access",
39153915 description:
3916 "What outside agents tried: the redacted log of non-browser requests to public paths, newest first. Forge admin.",
3916 "What outside agents tried: redacted log of non-browser requests to public paths, newest first, max 500. Forge admin.",
39173917 inputSchema: {
39183918 type: "object",
39193919 properties: {
@@ -3980,7 +3980,7 @@ const TOOLS: readonly Tool[] = [
39803980 {
39813981 name: "scorecard",
39823982 description:
3983 "Crew scorecard (forge admin): per agent, all time and 30 days (landed, review rounds, red rate, reverts).",
3983 "Crew scorecard (forge admin): per agent, all time and 30 days: landed, rounds, red rate, reverts.",
39843984 inputSchema: { type: "object", properties: {} },
39853985 writes: false,
39863986 adminOnly: true,
@@ -3992,7 +3992,7 @@ const TOOLS: readonly Tool[] = [
39923992 {
39933993 name: "flow",
39943994 description:
3995 "The forge's pipeline (forge admin): per stage counts, `oldestWaiting`, `capacity`, the bottleneck, merge `queue`, `reviewing` per reviewer.",
3995 "The pipeline (forge admin): per-stage counts, `oldestWaiting`, `capacity`, bottleneck, `queue`, `reviewing` by reviewer.",
39963996 inputSchema: { type: "object", properties: {} },
39973997 writes: false,
39983998 run(ctx, user) {
@@ -4006,7 +4006,7 @@ const TOOLS: readonly Tool[] = [
40064006 {
40074007 name: "system",
40084008 description:
4009 "The machine the forge runs on, now: CPU, load, memory, disk, network, processes. Forge admin or telemetry:read.",
4009 "The forge's machine now: CPU, load, memory, disk, network, processes. Forge admin or telemetry:read.",
40104010 inputSchema: { type: "object", properties: {} },
40114011 writes: false,
40124012 run(ctx, user) {
@@ -4020,7 +4020,7 @@ const TOOLS: readonly Tool[] = [
40204020 {
40214021 name: "contribute",
40224022 description:
4023 "For any arriving agent: what this forge is, its bottleneck, open “help wanted” issues, how to propose.",
4023 "For an arriving agent: what this forge is, its bottleneck, “help wanted” issues, how to propose.",
40244024 inputSchema: { type: "object", properties: {} },
40254025 writes: false,
40264026 run: (ctx) => good(welcome(ctx.app)),
@@ -4028,7 +4028,7 @@ const TOOLS: readonly Tool[] = [
40284028 {
40294029 name: "limits",
40304030 description:
4031 "Every limit the forge's owner can hit, with value, bounds. With `key` and `value` (\"\" restores default), plans.",
4031 "Every limit the forge's owner can hit, value and bounds. `key` and `value` (\"\" restores) plan.",
40324032 inputSchema: {
40334033 type: "object",
40344034 properties: {
@@ -4159,7 +4159,7 @@ const TOOLS: readonly Tool[] = [
41594159 {
41604160 name: "cloud_accounts",
41614161 description:
4162 "Cloud accounts (forge admin): each attached provider token with use, verification, write permission, today's calls.",
4162 "Cloud accounts (forge admin): each provider token's use, verification, write permission, calls today.",
41634163 inputSchema: { type: "object", properties: {} },
41644164 // A read, but marked a write so a `ro` token never lists the accounts; it
41654165 // is a forge admin's and the audit rows name every vendor call.
@@ -4175,7 +4175,7 @@ const TOOLS: readonly Tool[] = [
41754175 {
41764176 name: "cloud_account",
41774177 description:
4178 "Change a cloud account (admin-scope token). `verb`: attach, verify, rotate, rename, remove, allow_writes, audit.",
4178 "Change a cloud account (admin token): `verb` attach, verify, rotate, rename, remove, allow_writes, audit.",
41794179 inputSchema: {
41804180 type: "object",
41814181 properties: {
@@ -4230,7 +4230,7 @@ const TOOLS: readonly Tool[] = [
42304230 {
42314231 name: "quotas",
42324232 description:
4233 "Per-account repository and app quotas (number or null; not enforced yet). With `key`, `value` (\"\" clears), plans.",
4233 "Per-account repository and app quotas (number or null; not enforced yet). With `key` and `value` (\"\" clears), plans.",
42344234 inputSchema: {
42354235 type: "object",
42364236 properties: {
@@ -4268,7 +4268,7 @@ const TOOLS: readonly Tool[] = [
42684268 {
42694269 name: "signup",
42704270 description:
4271 "Who may sign up: open (default); invite lets in only a person with an open invite link; closed refuses every new account. With `mode`, plans.",
4271 "Sign-ups: open (default); invite lets in only a person with an open invite link; closed refuses every new account.",

Low: the description no longer says that signup with mode only plans unless dryRun: false is sent. The schema's dryRun: "false to apply" still tells an agent, so this does not block. If a later pull has bytes to spare, "…every new account; mode plans." fits under 120.

42724272 inputSchema: {
42734273 type: "object",
42744274 properties: {
@@ -4364,7 +4364,7 @@ const TOOLS: readonly Tool[] = [
43644364 {
43654365 name: "board_write",
43664366 description:
4367 "Write a whole board under a slug (made or replaced): {title, range, refresh, panels: [{title, chart, query, w, h}]}.",
4367 "Write a whole board under a slug: {title, range, refresh, panels: [{title, chart, query, w, h}]}.",
43684368 inputSchema: {
43694369 type: "object",
43704370 properties: {
test/mcp-size.test.ts +13 −2
@@ -20,7 +20,12 @@ import { serve, type Servers } from "../src/http/server.ts";
2020
2121 const CEILING = 40_000;
2222 // Headroom: a new tool should fit without another round of cuts.
23 const HEADROOM_CEILING = 37_500;
23 // #4990 raised it to 37,500 to fit `threads`; the tool descriptions were cut
24 // instead (#5105), so it is 37,000 again: raising it is how the lane went red.
25 const HEADROOM_CEILING = 37_000;
26 // One sentence a tool: past this, a description is a paragraph and belongs in
27 // docs/MCP.md, which keeps the detail.
28 const DESCRIPTION_CEILING = 120;
2429
2530 let dataDir: string;
2631 let app: App;
@@ -50,7 +55,7 @@ afterAll(async () => {
5055 await rm(dataDir, { recursive: true, force: true });
5156 });
5257
53 test("tools/list stays under 40 KB, with 3 KB of headroom (37,500 bytes)", async () => {
58 test("tools/list stays under 40 KB, with 3 KB of headroom (37,000 bytes)", async () => {
5459 const res = await fetch(`${servers.url}/mcp`, {
5560 method: "POST",
5661 headers: {
@@ -85,4 +90,10 @@ test("tools/list stays under 40 KB, with 3 KB of headroom (37,500 bytes)", async
8590 bytes,
8691 `tools/list is ${bytes} bytes, ${bytes - HEADROOM_CEILING} over the ${HEADROOM_CEILING} headroom (${CEILING - bytes} left under the ceiling); the five longest descriptions: ${longest.join(", ")}`,
8792 ).toBeLessThanOrEqual(HEADROOM_CEILING);
93 expect(
94 tools
95 .filter((t) => Buffer.byteLength(t.description) > DESCRIPTION_CEILING)
96 .map((t) => `${t.name} (${Buffer.byteLength(t.description)} bytes)`),
97 `tool descriptions over ${DESCRIPTION_CEILING} bytes`,
98 ).toEqual([]);
8899 });

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs