@rosthq/cli 0.7.20 → 0.7.22

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.
@@ -1 +1 @@
1
- {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAqN3D,CAAC"}
1
+ {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAwN3D,CAAC"}
package/dist/index.js CHANGED
@@ -38895,6 +38895,21 @@ var aicosSessionSchema = external_exports.object({
38895
38895
  updatedAt: external_exports.string().datetime({ offset: true }),
38896
38896
  createdAt: external_exports.string().datetime({ offset: true })
38897
38897
  }).strict();
38898
+ var AICOS_ATTACHMENT_CONTENT_TYPES = ["image/png", "image/jpeg", "image/webp", "image/gif"];
38899
+ var AICOS_ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024;
38900
+ var AICOS_MAX_ATTACHMENTS_PER_TURN = 4;
38901
+ var aicosAttachmentContentTypeSchema = external_exports.enum(AICOS_ATTACHMENT_CONTENT_TYPES);
38902
+ var aicosAttachmentSchema = external_exports.object({
38903
+ id: uuidSchema4,
38904
+ contentType: aicosAttachmentContentTypeSchema,
38905
+ sizeBytes: external_exports.number().int().positive(),
38906
+ width: external_exports.number().int().positive().nullable(),
38907
+ height: external_exports.number().int().positive().nullable(),
38908
+ filename: external_exports.string().max(255).nullable()
38909
+ }).strict();
38910
+ var aicosAttachmentUploadResultSchema = external_exports.object({
38911
+ attachment: aicosAttachmentSchema
38912
+ }).strict();
38898
38913
  var aicosMessageSchema = external_exports.object({
38899
38914
  id: uuidSchema4,
38900
38915
  sessionId: uuidSchema4,
@@ -38907,6 +38922,7 @@ var aicosMessageSchema = external_exports.object({
38907
38922
  linkedRunId: uuidSchema4.nullable(),
38908
38923
  linkedWorkOrderId: uuidSchema4.nullable(),
38909
38924
  sourceCount: external_exports.number().int().nonnegative().default(0),
38925
+ attachments: external_exports.array(aicosAttachmentSchema).default([]),
38910
38926
  createdAt: external_exports.string().datetime({ offset: true })
38911
38927
  }).strict();
38912
38928
  var aicosSourceSchema = external_exports.object({
@@ -38922,7 +38938,11 @@ var aicosSourceSchema = external_exports.object({
38922
38938
  var aicosTurnRequestSchema = external_exports.object({
38923
38939
  sessionId: uuidSchema4.nullable().optional(),
38924
38940
  purpose: aicosConversationPurposeSchema.default("general"),
38925
- message: external_exports.string().trim().min(1).max(12e3),
38941
+ // Empty is permitted only when attachments are present (an image-only turn);
38942
+ // runAicosTurn enforces the "message or attachment required" invariant so the
38943
+ // schema stays a plain object for downstream `.shape`/`.extend` consumers.
38944
+ message: external_exports.string().trim().max(12e3).default(""),
38945
+ attachmentIds: external_exports.array(uuidSchema4).max(AICOS_MAX_ATTACHMENTS_PER_TURN).default([]),
38926
38946
  routeContext: aicosRouteContextSchema,
38927
38947
  model: aicosModelRequestSchema.optional()
38928
38948
  }).strict();
@@ -42552,7 +42572,15 @@ var softwareDeveloperTeamInstallInputSchema = external_exports.object({
42552
42572
  // rejects (→ "Command input failed schema validation"). Matches the sibling
42553
42573
  // software-factory schemas that already use `.nullable().optional()`.
42554
42574
  software_project_id: uuid10.nullable().optional(),
42555
- assign_skills: external_exports.boolean().default(true)
42575
+ assign_skills: external_exports.boolean().default(true),
42576
+ // DER-1264: the install auto-staffs live agents at a pr_only, observe-first
42577
+ // posture. If the tenant's company autonomy ceiling (`agent_policy`) is MORE
42578
+ // permissive than this design's envelope (resolved `max_autonomous_risk` >= high,
42579
+ // i.e. `high_autonomy` or a custom high/critical ceiling), the install refuses to
42580
+ // auto-activate unless the owner explicitly acknowledges that posture. Never
42581
+ // silently inherit a more-permissive-than-designed ceiling (invariant #10). A
42582
+ // tenant within the envelope (locked_down/balanced) never needs this.
42583
+ acknowledge_autonomy_ceiling: external_exports.boolean().default(false)
42556
42584
  }).strict();
42557
42585
  var softwareDeveloperTeamSeatSummarySchema = external_exports.object({
42558
42586
  role: softwareDeveloperTeamRoleSchema,
@@ -42580,12 +42608,45 @@ var softwareDeveloperTeamAuthorityGrantSummarySchema = external_exports.object({
42580
42608
  grant_id: uuid10,
42581
42609
  created: external_exports.boolean()
42582
42610
  });
42611
+ var softwareDeveloperTeamOccupancySummarySchema = external_exports.object({
42612
+ role: softwareDeveloperTeamRoleSchema,
42613
+ seat_id: uuid10,
42614
+ agent_id: uuid10,
42615
+ template_slug: external_exports.string(),
42616
+ status: external_exports.literal("live"),
42617
+ // false when a live agent already occupied the seat (idempotent re-install).
42618
+ created: external_exports.boolean()
42619
+ });
42620
+ var softwareDeveloperTeamAgentPolicySummarySchema = external_exports.object({
42621
+ profile: agentPolicyProfileSchema,
42622
+ enforcement: agentPolicyEnforcementSchema,
42623
+ max_autonomous_risk: autonomousRiskLevelSchema,
42624
+ // true when the resolved ceiling is more permissive than this design's envelope
42625
+ // (max_autonomous_risk >= high) and the owner acknowledged it to activate.
42626
+ more_permissive_than_envelope: external_exports.boolean()
42627
+ });
42628
+ var softwareDeveloperTeamTokenBudgetSummarySchema = external_exports.object({
42629
+ hard_cap_usd: external_exports.string().nullable(),
42630
+ soft_cap_usd: external_exports.string().nullable(),
42631
+ set_by_install: external_exports.boolean()
42632
+ });
42633
+ var softwareDeveloperTeamGithubPolicySummarySchema = external_exports.object({
42634
+ software_project_id: uuid10,
42635
+ automation_mode_ceiling: softwareAutomationModeSchema,
42636
+ // false when a pre-existing policy was preserved (not created by this install).
42637
+ created: external_exports.boolean()
42638
+ });
42583
42639
  var softwareDeveloperTeamInstallOutputSchema = external_exports.object({
42584
42640
  installed: external_exports.boolean(),
42585
42641
  seats: external_exports.array(softwareDeveloperTeamSeatSummarySchema),
42586
42642
  skills: external_exports.array(softwareDeveloperTeamSkillSummarySchema),
42587
42643
  authority_profiles: external_exports.array(softwareDeveloperTeamAuthorityProfileSummarySchema),
42588
- authority_grants: external_exports.array(softwareDeveloperTeamAuthorityGrantSummarySchema)
42644
+ authority_grants: external_exports.array(softwareDeveloperTeamAuthorityGrantSummarySchema),
42645
+ // DER-1264 auto-staffing additions.
42646
+ occupancies: external_exports.array(softwareDeveloperTeamOccupancySummarySchema),
42647
+ agent_policy: softwareDeveloperTeamAgentPolicySummarySchema,
42648
+ token_budget: softwareDeveloperTeamTokenBudgetSummarySchema,
42649
+ github_policy: softwareDeveloperTeamGithubPolicySummarySchema.nullable()
42589
42650
  });
42590
42651
  var forgeArtifactText = external_exports.string().trim().min(1).max(4e3);
42591
42652
  var forgeArtifactList = external_exports.array(forgeArtifactText).max(50).default([]);
@@ -42642,8 +42703,7 @@ var softwareGithubAutomationPolicyInputSchema = external_exports.object({
42642
42703
  message: "production deploy must remain human-gated"
42643
42704
  })
42644
42705
  }).strict();
42645
- var softwareGithubRepositoryBindingInputSchema = external_exports.object({
42646
- software_project_id: uuid10,
42706
+ var softwareGithubConnectedRepositoryInputSchema = external_exports.object({
42647
42707
  repository_id: external_exports.number().int().positive(),
42648
42708
  repository_name: external_exports.string().trim().min(1).max(255),
42649
42709
  repository_full_name: external_exports.string().trim().min(1).max(500),
@@ -42651,18 +42711,65 @@ var softwareGithubRepositoryBindingInputSchema = external_exports.object({
42651
42711
  default_branch: external_exports.string().trim().min(1).max(255).default("main"),
42652
42712
  permissions: external_exports.record(external_exports.string().min(1), external_exports.enum(["read", "write"])).default({})
42653
42713
  }).strict();
42654
- var softwareGithubInstallationBindInputSchema = external_exports.object({
42714
+ var softwareGithubInstallationConnectInputSchema = external_exports.object({
42655
42715
  app_slug: external_exports.string().trim().min(1).max(120).default("rost-forge"),
42656
42716
  installation_id: external_exports.number().int().positive(),
42657
42717
  account_login: external_exports.string().trim().min(1).max(255),
42658
42718
  account_id: external_exports.number().int().positive(),
42659
42719
  account_type: external_exports.string().trim().min(1).max(80),
42660
- repositories: external_exports.array(softwareGithubRepositoryBindingInputSchema).min(1).max(100)
42720
+ repositories: external_exports.array(softwareGithubConnectedRepositoryInputSchema).min(1).max(200)
42721
+ }).strict();
42722
+ var softwareGithubInstallationConnectOutputSchema = external_exports.object({
42723
+ github_installation_id: uuid10,
42724
+ repositories_connected: external_exports.number().int().nonnegative()
42725
+ });
42726
+ var softwareGithubRepositoryBindMappingSchema = external_exports.object({
42727
+ repository_id: external_exports.number().int().positive(),
42728
+ software_project_id: uuid10
42729
+ }).strict();
42730
+ var softwareGithubInstallationBindInputSchema = external_exports.object({
42731
+ app_slug: external_exports.string().trim().min(1).max(120).default("rost-forge"),
42732
+ installation_id: external_exports.number().int().positive(),
42733
+ bindings: external_exports.array(softwareGithubRepositoryBindMappingSchema).min(1).max(100)
42661
42734
  }).strict();
42662
42735
  var softwareGithubInstallationBindOutputSchema = external_exports.object({
42663
42736
  github_installation_id: uuid10,
42664
42737
  repositories_bound: external_exports.number().int().nonnegative()
42665
42738
  });
42739
+ var softwareGithubRepositoryUnbindInputSchema = external_exports.object({
42740
+ app_slug: external_exports.string().trim().min(1).max(120).default("rost-forge"),
42741
+ installation_id: external_exports.number().int().positive(),
42742
+ repository_id: external_exports.number().int().positive(),
42743
+ disconnect: external_exports.boolean().default(false)
42744
+ }).strict();
42745
+ var softwareGithubRepositoryUnbindOutputSchema = external_exports.object({
42746
+ repository_id: external_exports.number().int().positive(),
42747
+ status: external_exports.enum(["connected", "revoked"])
42748
+ });
42749
+ var softwareGithubInstallationListInputSchema = external_exports.object({ app_slug: external_exports.string().trim().min(1).max(120).default("rost-forge") }).strict();
42750
+ var softwareGithubInstallationRepositoryViewSchema = external_exports.object({
42751
+ repository_id: external_exports.number().int().positive(),
42752
+ repository_name: external_exports.string(),
42753
+ repository_full_name: external_exports.string(),
42754
+ private: external_exports.boolean(),
42755
+ default_branch: external_exports.string(),
42756
+ status: external_exports.enum(["connected", "active"]),
42757
+ software_project_id: uuid10.nullable(),
42758
+ software_project_name: external_exports.string().nullable(),
42759
+ software_project_slug: external_exports.string().nullable()
42760
+ });
42761
+ var softwareGithubInstallationViewSchema = external_exports.object({
42762
+ id: uuid10,
42763
+ installation_id: external_exports.number().int().positive(),
42764
+ account_login: external_exports.string(),
42765
+ account_id: external_exports.number().int().positive(),
42766
+ account_type: external_exports.string(),
42767
+ status: external_exports.enum(["active", "suspended", "revoked"]),
42768
+ repositories: external_exports.array(softwareGithubInstallationRepositoryViewSchema)
42769
+ });
42770
+ var softwareGithubInstallationListOutputSchema = external_exports.object({
42771
+ installations: external_exports.array(softwareGithubInstallationViewSchema)
42772
+ });
42666
42773
  var softwareGithubAutomationPolicyUpsertOutputSchema = external_exports.object({
42667
42774
  policy_id: uuid10,
42668
42775
  software_project_id: uuid10,
@@ -43533,7 +43640,7 @@ The Compass is drafted, then activated by a human through supersession.
43533
43640
  order: 15,
43534
43641
  title: "AICOS chat guide",
43535
43642
  summary: "How the AI Chief of Staff chat works in the authenticated app shell and what it can safely do today.",
43536
- version: "2026-07-04.10",
43643
+ version: "2026-07-04.11",
43537
43644
  public: true,
43538
43645
  audiences: ["human", "in_app_agent"],
43539
43646
  stages: ["company_setup", "operating_rhythm"],
@@ -43601,6 +43708,8 @@ Model behavior is now explicit in the AICOS session contract. A thread can run i
43601
43708
 
43602
43709
  Assistant answers render safe Markdown for headings, short lists, emphasis, code, tables, and in-app links. User messages remain plain escaped text. Links only become clickable when they target same-origin app routes such as \`/inbox\` or \`/settings\`; external, protocol, script, API-style, or traversal targets are stripped to plain text before transcript storage. When an answer includes a validated app route, the chat can surface one consent-required navigation suggestion and, if the user has enabled the local preference, open that route automatically. Navigation is never authorization; destination pages still enforce their own tenant, role, and seat checks.
43603
43710
 
43711
+ You can attach images to a message from the composer. {{brand}} accepts PNG, JPEG, WebP, and GIF up to 10 MB each, and up to four per message. Images are held in a tenant-scoped private store, stripped of embedded metadata such as EXIF on upload, and shown as thumbnails in your message; the panel loads each thumbnail through a short-lived signed link rather than a public URL. In the cloud lane the agent can view the image directly. Runner and MCP viewing of attached images is a scoped follow-up; today the agent still reads the accompanying text on those lanes.
43712
+
43604
43713
  AICOS can also retrieve bounded summaries from prior sessions owned by the same tenant user and surface them as session-memory read models. Setup-limited users do not retrieve sensitive historical run or company-memory summaries through this path. This is a practical memory seam for AICOS continuity; it is not yet the future Company Brain, and it does not make unaccepted knowledge authoritative.
43605
43714
 
43606
43715
  Platform allowance and BYOK state are checked before routing; an exhausted included allowance keeps AICOS in guided mode and points the user toward BYOK/manual continuation. Because the DER-1068 implementation still uses the deterministic harness, it does not create fake llm_calls rows or settle fake allowance usage; reservation/settlement belongs to the real provider call path.
@@ -44416,7 +44525,7 @@ External connectors are being rolled out provider by provider, conservatively (r
44416
44525
  order: 48,
44417
44526
  title: "CLI and MCP installation guide",
44418
44527
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
44419
- version: "2026-07-04.1",
44528
+ version: "2026-07-04.14",
44420
44529
  public: true,
44421
44530
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44422
44531
  stages: ["company_setup", "staffing"],
@@ -45144,17 +45253,18 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
45144
45253
  | \`rost_create_a_forge_authority_profile\` | \`software_factory.authority_profile.create\` | Define a Forge authority profile (a named seat capability preset). Owner-only; defaults to the read_only preset. | Tenant-admin | Call with \`{"name":"Builder","preset":"contributor"}\`. |
45145
45254
  | \`rost_grant_forge_seat_authority\` | \`software_factory.authority.grant\` | Grant a seat a Forge authority profile on a project (seat \u2192 project \u2192 profile). Owner-only and human-gated; emits a durable authority-change event. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","seat_id":"<seat-id>","authority_profile_id":"<profile-id>"}\`; non-interactive callers receive a confirmation handoff. |
45146
45255
  | \`rost_revoke_forge_seat_authority\` | \`software_factory.authority.revoke\` | Revoke a Forge authority grant (teardown). Owner-only and human-gated. | Tenant-admin | Call with \`{"grant_id":"<grant-id>"}\`; non-interactive callers receive a confirmation handoff. |
45147
- | \`rost_install_forge_developer_team\` | \`software_factory.developer_team.install\` | Install the governed Forge Developer Team template: Forge Lead, Planner, Builder, plan reviewer, security reviewer, QA/release, and Fold/Memory seats with draft Charters, first-party Forge Skills, and authority presets. Entitlement-gated and human-gated; it creates no live agent occupancy by itself. | Tenant-admin | Call with \`{"steward_seat_id":"<human-steward-seat-id>"}\` \u2014 \`software_project_id\` is optional (when supplied it scopes authority grants to that project; the template installs tenant-wide either way). Non-interactive callers receive a confirmation handoff. |
45256
+ | \`rost_install_forge_developer_team\` | \`software_factory.developer_team.install\` | Install AND activate the governed Forge Developer Team: Forge Lead (human) plus Planner, Builder, plan reviewer, security reviewer, QA/release, and Fold/Memory seats with draft Charters, first-party Forge Skills, and authority presets. Approving ALSO auto-staffs the 6 agent seats as live occupancies at a pull-request-only, observe-first posture (open pull requests, never merge/deploy without a human), steward-chained to the human lead, each with a signed manifest + passed sandbox dry-run; it sets a conservative default token budget (only if none) and, for a supplied project, a default pr_only GitHub automation policy (only if none \u2014 never widening a stricter one). Entitlement-gated and human-gated. | Tenant-admin | Call with \`{"steward_seat_id":"<human-steward-seat-id>"}\` \u2014 \`software_project_id\` is optional (when supplied it scopes authority grants to that project; the team installs tenant-wide either way). If the company autonomy ceiling is more permissive than the observe-first envelope, add \`{"acknowledge_autonomy_ceiling":true}\` to activate. Non-interactive callers receive a confirmation handoff. |
45148
45257
  | \`rost_list_forge_config\` | \`software_factory.config.list\` | List active Forge configuration entries. Plain values may be returned only when they passed the non-secret guard; secret refs appear as metadata and never include the ref value. | Tenant | Call with \`{}\` or \`{"software_project_id":"<project-id>","environment":"preview"}\`. |
45149
45258
  | \`rost_set_forge_config\` | \`software_factory.config.set\` | Human-gated config create/rotation for plain values or secret refs. Secret refs store only a vault pointer and raw secret-shaped plain values are rejected. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","environment":"preview","key_name":"PUBLIC_BASE_URL","value_kind":"plain","plain_value":"https://preview.example.com"}\`. |
45150
45259
  | \`rost_list_forge_secret_requests\` | \`software_factory.secret_request.list\` | List missing-secret requests and their approval Task ids/statuses. It returns request metadata only \u2014 no secret values and no vault refs. | Tenant | Call with \`{}\` or \`{"status":"pending"}\`. |
45151
45260
  | \`rost_grant_a_forge_secret\` | \`software_factory.secret.grant\` | A human grants a seat scoped access to a project secret by vault ref (Postgres stores only the pointer, never secret material). Owner-only and human-gated. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","environment":"production","seat_id":"<seat-id>","action":"vercel.env.sync","key_name":"OPENAI_API_KEY","vault_ref":"infisical://prod/OPENAI_API_KEY"}\`. |
45152
45261
  | \`rost_revoke_a_forge_secret_grant\` | \`software_factory.secret.revoke\` | Revoke a Forge secret grant (teardown \u2014 cut a compromised seat's access immediately). Owner-only and human-gated. | Tenant-admin | Call with \`{"grant_id":"<grant-id>"}\`; non-interactive callers receive a confirmation handoff. |
45153
- | \`rost_set_a_forge_github_automation_policy\` | \`software_factory.github.policy.upsert\` | Set the server-side GitHub automation policy: allowed actions, automation-mode ceiling, and operations requiring humans. Owner-only and human-gated. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","automation_mode_ceiling":"pr_only","allowed_actions":["webhook_intake","installation_token"],"requires_human_for":["deploy_production"]}\`. |
45262
+ | \`rost_set_a_forge_github_automation_policy\` | \`software_factory.github.policy.upsert\` | Set the server-side GitHub automation policy: allowed actions, automation-mode ceiling, and operations requiring humans. The allowed-actions and human-gated-actions lists are stored server-side as structured JSON arrays. Owner-only and human-gated. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","automation_mode_ceiling":"pr_only","allowed_actions":["webhook_intake","installation_token"],"requires_human_for":["deploy_production"]}\`. |
45154
45263
  | \`rost_create_a_forge_github_installation_token\` | \`software_factory.github.installation_token.create\` | Mint a short-lived GitHub App installation token for one bound repository after policy evaluation. The token is returned once and never stored. | Tenant | Call with \`{"software_project_id":"<project-id>","repository_id":789,"requested_actions":["read"],"requested_automation_mode":"plan_only"}\`. |
45264
+ | \`rost_list_forge_github_installations\` | \`software_factory.github.installation.list\` | List connected GitHub App installations and each repository's bind state (connected or active) with the Forge project it maps to. Read-only. | Tenant | Call with \`{}\`; a \`connected\` repository is verified but not yet bound to a project. |
45155
45265
  | \`rost_list_forge_runner_capacity\` | \`software_factory.capacity.list\` | List Forge runner capacity observations (advisory scheduling input only, never an authority input). Read-only; requires the Forge add-on. | Tenant | Call with \`{}\` or \`{"runner_id":"<runner-id>"}\`. |
45156
45266
 
45157
- The web Forge control room at \`/forge\` uses the same command path for project selection, build request creation/list/detail reads, runner capacity, configuration status, and Developer Team template install. The template install button deliberately stages a pending confirmation before durable seats, Skills, or authority grants are applied.
45267
+ The web Forge control room at \`/forge\` uses the same command path for project selection, build request creation/list/detail reads, runner capacity, configuration status, and Developer Team install. The install button deliberately stages a pending confirmation before durable seats, Skills, authority grants, or live agent activation are applied; the install page states plainly that approving activates the 6 agents at a pull-request-only, observe-first posture and surfaces the company autonomy ceiling.
45158
45268
 
45159
45269
  #### Forge GitHub App access
45160
45270
 
@@ -45162,7 +45272,7 @@ Forge repository access is through a tenant-bound GitHub App installation, not t
45162
45272
 
45163
45273
  Installation tokens are short lived and are not stored. The durable record is audit metadata: installation id, repository id, requested action, policy decision, reason, and related Forge request when one exists. GitHub issue titles, labels, and bodies are treated as untrusted source content; labels may request an automation mode, but only server-side Forge automation policy can allow \`pr_only\`, \`merge_after_checks\`, \`deploy_preview\`, or \`deploy_production\`. Production deploy remains human-gated.
45164
45274
 
45165
- Tenant GitHub App installation binding is intentionally not a CLI or MCP tool. Start at \`/forge/settings/github\`: the settings flow preserves the signed GitHub setup state, performs user-scoped GitHub App authorization, verifies admin repositories server-side, and then submits the governed bind command from the UI.
45275
+ Tenant GitHub App connect and bind are intentionally not CLI or MCP mutation tools; only the read \`software_factory.github.installation.list\` is exposed. Start at \`/forge/settings/github\`. Connect and bind are decoupled (DER-1281): user-scoped GitHub App authorization verifies the repositories you administer server-side and records them as **connected** (unbound, no project) via \`software_factory.github.installation.connect\` \u2014 this persists on any successful ownership proof, not only the one-shot post-install redirect, so a missed setup redirect is no longer fatal (a persistent "Verify ownership & add repositories" action re-runs it any time). Binding is a separate, always-available step: \`software_factory.github.installation.bind\` maps a connected repository to a Forge project (no GitHub re-authorization), and \`software_factory.github.repository.unbind\` returns a repository to connected/unbound (re-bindable) or disconnects it. Token minting and issue intake only ever see \`active\` (bound) repositories, so an unbound repository never enters automation.
45166
45276
 
45167
45277
  The Forge GitHub App itself is org-owned. App private key, webhook secret, and client secret values are platform-owned ROST operator credentials stored through the vault's reserved ROST system namespace, not through a customer tenant namespace or a tenant UUID deployment variable. Manifest conversion and manual secret storage also require the app-level \`GITHUB_APP_OPERATOR_EMAILS\` allowlist, which should contain only approved ROST platform operator emails. Deployment config carries only refs (\`GITHUB_APP_PRIVATE_KEY_REF\`, \`GITHUB_APP_WEBHOOK_SECRET_REF\`, \`GITHUB_APP_CLIENT_SECRET_REF\`); raw secret env vars are local/legacy compatibility only. The dogfood app is \`ROST Forge\` under \`agenticoperatingsystem\` with App ID \`4208495\` and Client ID \`Iv23liImH7qlBvXYQ0Wx\`. The base app omits \`administration\` and \`workflows\`; elevated repo creation or workflow mutation needs a separate human-approved power path.
45168
45278
 
@@ -45746,7 +45856,7 @@ Agents can suggest commitments and report progress. They should not create a new
45746
45856
  order: 61,
45747
45857
  title: "Signal guide",
45748
45858
  summary: "How to define and read measurables so the company runs on evidence instead of status theater.",
45749
- version: "2026-07-02.4",
45859
+ version: "2026-07-04.1",
45750
45860
  public: true,
45751
45861
  audiences: ["human", "cli", "mcp", "in_app_agent"],
45752
45862
  stages: ["operating_rhythm"],
@@ -45802,7 +45912,7 @@ Avoid vanity numbers, manual-only status fields, and metrics nobody can act on.
45802
45912
 
45803
45913
  - Read: \`{{cli}} signal list --json\` / \`signal.list\` / \`rost_list_signals\` returns measurables with their latest reading and on/off-track state. \`signal.get\` / \`rost_get_signal\` returns one measurable's full reading history.
45804
45914
  - Add a measurable: \`measurable.create\` (scope: seat) defines a measurable a seat owns \u2014 name, unit, direction, target, cadence. The seat owns it; readings attach to it afterward.
45805
- - Record a reading: \`{{cli}} status record --measurable-id <id> --value <n>\` (\`status.record\`, scope: seat) writes a status event with the reading. This is not gated.
45915
+ - Record a reading: \`{{cli}} status record --measurable-id <id> --value <n>\` (\`status.record\`, scope: seat) writes a status event with the reading. This is not gated. An agent's \`status.record\` never downgrades a human-confirmed reading: a routine agent read that lands on a period a human already confirmed leaves the confirmed value and its confirmation intact (invariants #7/#8 \u2014 agents recommend; humans decide).
45806
45916
  - Confirm a reading: \`{{cli}} signal confirm\` / \`signal.confirm_reading\` / \`rost_confirm_signal_reading\` marks a reading human-verified. \`signal.correct_reading\` / \`rost_correct_signal_reading\` overwrites a reading with a human-confirmed value.
45807
45917
 
45808
45918
  ## Run Signal without an agent
@@ -48334,11 +48444,14 @@ var COMMAND_MANIFEST = [
48334
48444
  { "id": "software_factory.capacity.list", "namespace": "software_factory", "action": "capacity.list", "title": "List Forge runner capacity", "description": "List the tenant's Forge runner capacity observations (OS, CPU, memory, active sessions, usage-limit telemetry). Advisory scheduling input only, never an authority input. Read-only, entitlement-gated.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "runner_id", "flag": "runner-id", "type": "string", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List Forge runner capacity observations (advisory scheduling input only, never an authority input). Read-only; requires the Forge add-on." },
48335
48445
  { "id": "software_factory.config.list", "namespace": "software_factory", "action": "config.list", "title": "List Forge config", "description": "List active Forge config metadata for project environments. Plain config values may be returned; secret refs are represented only as has_secret_ref.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "environment", "flag": "environment", "type": "enum", "required": false, "enumValues": ["development", "preview", "production"] }], "hasComplexInput": false, "help": "List active Forge config entries. Plain config may be shown; secret refs are represented only as metadata." },
48336
48446
  { "id": "software_factory.config.set", "namespace": "software_factory", "action": "config.set", "title": "Set Forge config", "description": "Create or rotate a Forge project config entry. Secret config stores only a vault ref pointer; raw values are never accepted for secret_ref entries.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "environment", "flag": "environment", "type": "enum", "required": true, "enumValues": ["development", "preview", "production"] }, { "name": "key_name", "flag": "key-name", "type": "string", "required": true }, { "name": "value_kind", "flag": "value-kind", "type": "enum", "required": true, "enumValues": ["plain", "secret_ref"] }, { "name": "plain_value", "flag": "plain-value", "type": "string", "required": false }, { "name": "vault_ref", "flag": "vault-ref", "type": "string", "required": false }], "hasComplexInput": false, "help": "Set or rotate a Forge project config key. Secret entries store only vault refs and are human-gated." },
48337
- { "id": "software_factory.developer_team.install", "namespace": "software_factory", "action": "developer_team.install", "title": "Install Forge Developer Team", "description": "Install the governed Forge Developer Team template: seats, draft Charters, first-party skill assignments, and authority presets. Entitlement-gated and human-confirmed.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": true }, { "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "assign_skills", "flag": "assign-skills", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Install the governed Forge Developer Team template with seats, draft Charters, skills, project authority grants, and audit records. Tenant-admin and human-gated; creates no live agent occupancy." },
48447
+ { "id": "software_factory.developer_team.install", "namespace": "software_factory", "action": "developer_team.install", "title": "Install Forge Developer Team", "description": "Install AND activate the governed Forge Developer Team: 7 seats (1 human lead + 6 agents), first-party skills, authority presets, and a conservative token budget. Approving this ACTIVATES the 6 agents as live occupancies at a pr_only, observe-first posture: they open pull requests but never merge or deploy without a human. Entitlement-gated and human-confirmed.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": true }, { "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "assign_skills", "flag": "assign-skills", "type": "boolean", "required": false }, { "name": "acknowledge_autonomy_ceiling", "flag": "acknowledge-autonomy-ceiling", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Install the governed Forge Developer Team template with seats, draft Charters, skills, project authority grants, and audit records. Tenant-admin and human-gated; creates no live agent occupancy." },
48338
48448
  { "id": "software_factory.gate.decide", "namespace": "software_factory", "action": "gate.decide", "title": "Decide a Forge gate", "description": "A human approves or rejects a Forge gate. The resolver is recorded (never an agent \u2014 invariant #7); sensitive gates (security sign-off, merge/deploy, authority change, production deploy) also write a linked human decision. Requires confirmation.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "gate_id", "flag": "gate-id", "type": "string", "required": true }, { "name": "decision", "flag": "decision", "type": "enum", "required": true, "enumValues": ["approve", "reject"] }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "A human approves or rejects a Forge gate; an agent caller routes to /approvals and can never self-approve. Sensitive gates record a human decision." },
48339
48449
  { "id": "software_factory.github.installation_token.create", "namespace": "software_factory", "action": "github.installation_token.create", "title": "Create a Forge GitHub installation token", "description": "Mint a short-lived GitHub App installation token for one bound repository after server-side policy evaluation. The token is returned once and never persisted.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "repository_id", "flag": "repository-id", "type": "integer", "required": true }, { "name": "requested_actions", "flag": "requested-actions", "type": "array", "required": true, "itemType": "string" }, { "name": "requested_automation_mode", "flag": "requested-automation-mode", "type": "enum", "required": false, "enumValues": ["plan_only", "pr_only", "merge_after_checks", "deploy_preview", "deploy_production"] }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Mint a short-lived GitHub App installation token for one bound repository after policy evaluation; token material is returned once and never stored." },
48340
- { "id": "software_factory.github.installation.bind", "namespace": "software_factory", "action": "github.installation.bind", "title": "Bind a Forge GitHub installation", "description": "Bind a GitHub App installation and selected repositories to Forge projects from the authenticated Forge GitHub settings flow. Owner-only and human-gated; webhook payloads never supply tenant authority.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": false, "fields": [{ "name": "app_slug", "flag": "app-slug", "type": "string", "required": false }, { "name": "installation_id", "flag": "installation-id", "type": "integer", "required": true }, { "name": "account_login", "flag": "account-login", "type": "string", "required": true }, { "name": "account_id", "flag": "account-id", "type": "integer", "required": true }, { "name": "account_type", "flag": "account-type", "type": "string", "required": true }], "hasComplexInput": true, "help": "Bind a GitHub App installation and selected repositories to Forge projects from the authenticated Forge GitHub settings flow. Owner-only and human-gated." },
48450
+ { "id": "software_factory.github.installation.bind", "namespace": "software_factory", "action": "github.installation.bind", "title": "Bind Forge GitHub repositories to projects", "description": "Bind already-connected GitHub repositories to Forge projects. Owner-only and human-gated; operates on repositories already verified and connected in this tenant, so no GitHub re-authorization is required. Available any time, add or re-map bindings.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": false, "fields": [{ "name": "app_slug", "flag": "app-slug", "type": "string", "required": false }, { "name": "installation_id", "flag": "installation-id", "type": "integer", "required": true }], "hasComplexInput": true, "help": "Bind already-connected GitHub repositories to Forge projects from the Forge GitHub settings flow. Owner-only and human-gated; no GitHub re-authorization required." },
48451
+ { "id": "software_factory.github.installation.connect", "namespace": "software_factory", "action": "github.installation.connect", "title": "Connect a Forge GitHub installation", "description": "Record a proven GitHub App installation and its verified repositories as connected (unbound) so they can be bound to Forge projects later. Owner-only and human-gated; starts from the authenticated Forge GitHub settings flow. Idempotent \u2014 re-connecting reconciles metadata and never unbinds an already-bound repository.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": false, "fields": [{ "name": "app_slug", "flag": "app-slug", "type": "string", "required": false }, { "name": "installation_id", "flag": "installation-id", "type": "integer", "required": true }, { "name": "account_login", "flag": "account-login", "type": "string", "required": true }, { "name": "account_id", "flag": "account-id", "type": "integer", "required": true }, { "name": "account_type", "flag": "account-type", "type": "string", "required": true }], "hasComplexInput": true, "help": "Record a verified GitHub App installation and its repositories as connected (unbound) so they can be bound to Forge projects later. Owner-only and human-gated." },
48452
+ { "id": "software_factory.github.installation.list", "namespace": "software_factory", "action": "github.installation.list", "title": "List Forge GitHub installations", "description": "List connected GitHub App installations and their repositories with bind state (connected or active) and the Forge project each bound repository maps to. Read-only; requires the Forge add-on.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "app_slug", "flag": "app-slug", "type": "string", "required": false }], "hasComplexInput": false, "help": "List connected GitHub App installations and each repository's bind state (connected or active) with the Forge project it maps to. Read-only." },
48341
48453
  { "id": "software_factory.github.policy.upsert", "namespace": "software_factory", "action": "github.policy.upsert", "title": "Set a Forge GitHub automation policy", "description": "Set the server-side policy for GitHub actions and automation-mode ceilings. Owner-only and human-gated; production deploy remains human-gated.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "authority_profile_id", "flag": "authority-profile-id", "type": "string", "required": false }, { "name": "automation_mode_ceiling", "flag": "automation-mode-ceiling", "type": "enum", "required": false, "enumValues": ["plan_only", "pr_only", "merge_after_checks", "deploy_preview", "deploy_production"] }, { "name": "allowed_actions", "flag": "allowed-actions", "type": "array", "required": true, "itemType": "string" }, { "name": "requires_human_for", "flag": "requires-human-for", "type": "array", "required": true, "itemType": "string" }], "hasComplexInput": false, "help": "Set Forge's server-side GitHub automation policy for actions, mode ceilings, and human-gated operations." },
48454
+ { "id": "software_factory.github.repository.unbind", "namespace": "software_factory", "action": "github.repository.unbind", "title": "Unbind a Forge GitHub repository", "description": "Remove a GitHub repository's Forge project binding. By default the repository stays connected (unbound) and can be re-bound later; pass disconnect to remove it entirely. Owner-only and human-gated.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": false, "fields": [{ "name": "app_slug", "flag": "app-slug", "type": "string", "required": false }, { "name": "installation_id", "flag": "installation-id", "type": "integer", "required": true }, { "name": "repository_id", "flag": "repository-id", "type": "integer", "required": true }, { "name": "disconnect", "flag": "disconnect", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Remove a GitHub repository's Forge project binding; the repository stays connected for re-binding unless disconnect is set. Owner-only and human-gated." },
48342
48455
  { "id": "software_factory.phase.advance", "namespace": "software_factory", "action": "phase.advance", "title": "Advance a Forge build request phase", "description": "Advance a build request to the next phase, enforcing the closed phase state machine server-side (an illegal transition is rejected). Writes a phase-run row and updates the current phase. Entitlement-gated.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "build_request_id", "flag": "build-request-id", "type": "string", "required": true }, { "name": "to_phase", "flag": "to-phase", "type": "enum", "required": true, "enumValues": ["intake", "discovery_scoping", "plan_review", "implementation", "plan_conformance_review", "security_review", "qa_verification", "release_preview", "merge_or_deploy_gate", "closeout"] }, { "name": "owning_seat_id", "flag": "owning-seat-id", "type": "string", "required": false }, { "name": "note", "flag": "note", "type": "string", "required": false }], "hasComplexInput": false, "help": "Advance a build request to its next phase; the server enforces the closed phase state machine and rejects an illegal transition." },
48343
48456
  { "id": "software_factory.project.create", "namespace": "software_factory", "action": "project.create", "title": "Create a Forge project", "description": "Create an active Forge software project before binding repositories or opening build requests. Tenant-admin, human-gated, and entitlement-gated.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "name", "flag": "name", "type": "string", "required": true }, { "name": "slug", "flag": "slug", "type": "string", "required": false }, { "name": "base_branch", "flag": "base-branch", "type": "string", "required": false }, { "name": "repo_ref", "flag": "repo-ref", "type": "string", "required": false }], "hasComplexInput": false, "help": "Create an active Forge software project before binding repositories or opening build requests. Tenant-admin and human-gated; requires the Forge add-on." },
48344
48457
  { "id": "software_factory.project.list", "namespace": "software_factory", "action": "project.list", "title": "List Forge projects", "description": "List active Forge software projects so a tenant can choose a project for build requests, GitHub repository bindings, and config. Read-only and entitlement-gated.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "List active Forge software projects so a tenant can choose a project for build requests, GitHub repository bindings, and config. Read-only; requires the Forge add-on." },