@rosthq/cli 0.7.99 → 0.7.101

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.
package/dist/index.js CHANGED
@@ -44318,6 +44318,14 @@ var syncBriefScopeGetOutputSchema = external_exports.object({
44318
44318
  var syncBriefScopeUpdateInputSchema = external_exports.object({
44319
44319
  sync_brief_scope: syncBriefScopeSchema
44320
44320
  }).strict();
44321
+ var memberVisibilityModeSchema = external_exports.enum(["all", "seat_subtree"]);
44322
+ var memberVisibilityGetInputSchema = external_exports.object({}).strict();
44323
+ var memberVisibilityGetOutputSchema = external_exports.object({
44324
+ member_visibility_mode: memberVisibilityModeSchema
44325
+ }).strict();
44326
+ var memberVisibilityUpdateInputSchema = external_exports.object({
44327
+ member_visibility_mode: memberVisibilityModeSchema
44328
+ }).strict();
44321
44329
  var productLearningModeSchema = external_exports.enum(["enabled", "disabled", "enterprise_contract"]);
44322
44330
  var tenantProductLearningPolicySchema = external_exports.object({
44323
44331
  mode: productLearningModeSchema,
@@ -44399,6 +44407,7 @@ var settingsGetOutputSchema = external_exports.object({
44399
44407
  has_anthropic_key: external_exports.boolean(),
44400
44408
  notifications: notificationSettingsSchema,
44401
44409
  sync_brief_scope: syncBriefScopeSchema,
44410
+ member_visibility_mode: memberVisibilityModeSchema,
44402
44411
  product_learning: tenantProductLearningPolicySchema,
44403
44412
  integrations: external_exports.array(integrationSummarySchema)
44404
44413
  }).strict();
@@ -44767,6 +44776,28 @@ var signalReadingProposalSchema = external_exports.object({
44767
44776
  }
44768
44777
  });
44769
44778
 
44779
+ // ../../packages/protocol/src/signal-draft-first-readings.ts
44780
+ var uuidSchema17 = external_exports.string().uuid();
44781
+ var signalDraftFirstReadingsInputSchema = external_exports.object({
44782
+ measurable_id: uuidSchema17
44783
+ }).strict();
44784
+ var signalDraftFirstReadingsOutputSchema = external_exports.object({
44785
+ measurable_id: uuidSchema17,
44786
+ // The live pull outcome, surfaced verbatim so the UI can explain a no-datapoint
44787
+ // result honestly ("source polled, nothing came back") rather than silently.
44788
+ outcome: external_exports.enum(["ok", "blocked", "error"]),
44789
+ // 0 or 1: a single-value recipe pull yields at most one current-period reading.
44790
+ // Never fabricates back-dated history the source cannot actually produce.
44791
+ drafted: external_exports.number().int().min(0).max(1),
44792
+ // Present only when drafted === 1.
44793
+ reading_id: uuidSchema17.optional(),
44794
+ value: external_exports.number().finite().optional(),
44795
+ period_start: external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/, "expected YYYY-MM-DD").optional(),
44796
+ // Present only when drafted === 0: a short, non-secret machine reason
44797
+ // (e.g. "non_numeric", "blocked", "error") the UI maps to guidance.
44798
+ reason: external_exports.string().min(1).max(200).optional()
44799
+ }).strict();
44800
+
44770
44801
  // ../../packages/protocol/src/secret-broker.ts
44771
44802
  var uuid10 = external_exports.string().uuid();
44772
44803
  var VAULT_REF_PROVIDER = /^(?:infisical|doppler|local-dev):\/\/\S+$/;
@@ -46321,7 +46352,7 @@ var softwareFactoryBudgetExhaustedEventSchema = external_exports.object({
46321
46352
  }).strict();
46322
46353
 
46323
46354
  // ../../packages/protocol/src/sync-brief.ts
46324
- var uuidSchema17 = external_exports.string().uuid();
46355
+ var uuidSchema18 = external_exports.string().uuid();
46325
46356
  var dateSchema = external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/);
46326
46357
  var syncBriefGapSchema = external_exports.object({
46327
46358
  section: external_exports.enum(["exceptions", "goal_deltas", "task_review", "friction", "agent_activity"]),
@@ -46334,8 +46365,8 @@ var sectionSchema = (itemSchema) => external_exports.object({
46334
46365
  flagged_gaps: external_exports.array(syncBriefGapSchema)
46335
46366
  }).strict();
46336
46367
  var syncBriefExceptionSchema = external_exports.object({
46337
- measurable_id: uuidSchema17,
46338
- seat_id: uuidSchema17,
46368
+ measurable_id: uuidSchema18,
46369
+ seat_id: uuidSchema18,
46339
46370
  seat_name: external_exports.string().min(1),
46340
46371
  name: external_exports.string().min(1),
46341
46372
  state: external_exports.enum(["risk", "crit", "pending"]),
@@ -46346,8 +46377,8 @@ var syncBriefExceptionSchema = external_exports.object({
46346
46377
  freshness: external_exports.enum(["fresh", "due", "stale", "awaiting_first_reading", "not_expected"]).optional()
46347
46378
  }).strict();
46348
46379
  var syncBriefGoalDeltaSchema = external_exports.object({
46349
- goal_id: uuidSchema17,
46350
- seat_id: uuidSchema17.nullable(),
46380
+ goal_id: uuidSchema18,
46381
+ seat_id: uuidSchema18.nullable(),
46351
46382
  seat_name: external_exports.string().nullable(),
46352
46383
  title: external_exports.string().min(1),
46353
46384
  status: external_exports.enum(["on", "off", "done", "dropped"]),
@@ -46361,22 +46392,22 @@ var syncBriefTaskReviewSchema = external_exports.object({
46361
46392
  previous_done_rate: external_exports.number().min(0).max(1),
46362
46393
  delta: external_exports.number().min(-1).max(1),
46363
46394
  stalled: external_exports.array(external_exports.object({
46364
- task_id: uuidSchema17,
46365
- owner_seat_id: uuidSchema17,
46395
+ task_id: uuidSchema18,
46396
+ owner_seat_id: uuidSchema18,
46366
46397
  owner_seat_name: external_exports.string().min(1),
46367
46398
  title: external_exports.string().min(1),
46368
46399
  due_on: dateSchema,
46369
46400
  stalled_at: external_exports.string().nullable()
46370
46401
  }).strict()),
46371
46402
  overdue_by_owner: external_exports.array(external_exports.object({
46372
- owner_seat_id: uuidSchema17,
46403
+ owner_seat_id: uuidSchema18,
46373
46404
  owner_seat_name: external_exports.string().min(1),
46374
46405
  overdue_count: external_exports.number().int().nonnegative()
46375
46406
  }).strict())
46376
46407
  }).strict();
46377
46408
  var syncBriefIssueSchema = external_exports.object({
46378
- issue_id: uuidSchema17,
46379
- raised_by_seat_id: uuidSchema17,
46409
+ issue_id: uuidSchema18,
46410
+ raised_by_seat_id: uuidSchema18,
46380
46411
  raised_by_seat_name: external_exports.string().min(1),
46381
46412
  summary: external_exports.string().min(1),
46382
46413
  severity: external_exports.enum(["low", "med", "high", "critical"]),
@@ -46393,15 +46424,15 @@ var syncBriefActionItemTrendSchema = external_exports.object({
46393
46424
  has_prior: external_exports.boolean()
46394
46425
  }).strict();
46395
46426
  var syncBriefCascadeAtRiskSchema = external_exports.object({
46396
- goal_id: uuidSchema17,
46427
+ goal_id: uuidSchema18,
46397
46428
  title: external_exports.string().min(1),
46398
- seat_id: uuidSchema17.nullable(),
46429
+ seat_id: uuidSchema18.nullable(),
46399
46430
  progress_pct: external_exports.number().int().min(0).max(100),
46400
46431
  classification: external_exports.enum(["at_risk", "projected_miss"]),
46401
46432
  behind_days: external_exports.number().nullable()
46402
46433
  }).strict();
46403
46434
  var syncBriefRunHeartbeatStalledSeatSchema = external_exports.object({
46404
- seat_id: uuidSchema17,
46435
+ seat_id: uuidSchema18,
46405
46436
  current_phase: external_exports.string().nullable(),
46406
46437
  stalled_run_count: external_exports.number().int().nonnegative()
46407
46438
  }).strict();
@@ -46414,8 +46445,8 @@ var syncBriefRunHeartbeatRollupSchema = external_exports.object({
46414
46445
  stalled_seats: external_exports.array(syncBriefRunHeartbeatStalledSeatSchema)
46415
46446
  }).strict();
46416
46447
  var syncBriefAgentActivitySchema = external_exports.object({
46417
- agent_id: uuidSchema17,
46418
- seat_id: uuidSchema17,
46448
+ agent_id: uuidSchema18,
46449
+ seat_id: uuidSchema18,
46419
46450
  seat_name: external_exports.string().min(1),
46420
46451
  run_count: external_exports.number().int().nonnegative(),
46421
46452
  failed_run_count: external_exports.number().int().nonnegative(),
@@ -46428,11 +46459,11 @@ var syncBriefAgentActivitySchema = external_exports.object({
46428
46459
  var syncBriefSchema = external_exports.object({
46429
46460
  schema_version: external_exports.literal(1),
46430
46461
  tenant: external_exports.object({
46431
- id: uuidSchema17,
46462
+ id: uuidSchema18,
46432
46463
  name: external_exports.string().min(1)
46433
46464
  }).strict(),
46434
46465
  cluster: external_exports.object({
46435
- id: uuidSchema17,
46466
+ id: uuidSchema18,
46436
46467
  name: external_exports.string().min(1)
46437
46468
  }).strict().nullable(),
46438
46469
  period: external_exports.object({
@@ -46549,11 +46580,11 @@ var usageSnapshotOutputSchema = external_exports.object({
46549
46580
  }).strict();
46550
46581
 
46551
46582
  // ../../packages/protocol/src/event-payloads.ts
46552
- var uuidSchema18 = external_exports.string().uuid();
46583
+ var uuidSchema19 = external_exports.string().uuid();
46553
46584
  var evidenceSchema = external_exports.array(external_exports.unknown());
46554
46585
  var statusEventPayloadSchema = external_exports.object({
46555
46586
  measurables: external_exports.array(external_exports.object({
46556
- id: uuidSchema18,
46587
+ id: uuidSchema19,
46557
46588
  value: external_exports.number().finite(),
46558
46589
  // DER-1045: an optional, non-secret citation for an agent-proposed reading
46559
46590
  // (signal.report) — where the number came from + the agent's confidence.
@@ -46582,13 +46613,13 @@ var statusEventPayloadSchema = external_exports.object({
46582
46613
  }).strict().optional()
46583
46614
  }).strict()).optional(),
46584
46615
  goals: external_exports.array(external_exports.object({
46585
- id: uuidSchema18,
46616
+ id: uuidSchema19,
46586
46617
  state: external_exports.enum(["on", "off"]),
46587
46618
  note: external_exports.string().min(1).optional()
46588
46619
  }).strict()).optional()
46589
46620
  }).strict();
46590
46621
  var escalationCategorySchema = external_exports.enum(["safety_refusal"]);
46591
- var escalationEventPayloadSchema = external_exports.object({
46622
+ var escalationRaiseInputSchema = external_exports.object({
46592
46623
  reason: external_exports.string().min(1),
46593
46624
  charter_clause: external_exports.string().min(1),
46594
46625
  evidence: evidenceSchema,
@@ -46598,14 +46629,105 @@ var escalationEventPayloadSchema = external_exports.object({
46598
46629
  // explicitly escalated with a category (today: a safety refusal).
46599
46630
  category: escalationCategorySchema.optional()
46600
46631
  }).strict();
46632
+ var escalationEventPayloadSchema = escalationRaiseInputSchema.extend({
46633
+ run_id: external_exports.string().uuid().optional()
46634
+ }).strict();
46601
46635
  var issueEventPayloadSchema = external_exports.object({
46602
46636
  summary: external_exports.string().min(1),
46603
- blocking_goal_id: uuidSchema18.optional(),
46604
- broken_measurable_id: uuidSchema18.optional(),
46637
+ blocking_goal_id: uuidSchema19.optional(),
46638
+ broken_measurable_id: uuidSchema19.optional(),
46605
46639
  evidence: evidenceSchema,
46606
46640
  severity: external_exports.enum(["low", "med", "high", "critical"])
46607
46641
  }).strict();
46608
46642
 
46643
+ // ../../packages/protocol/src/event-internal-payloads.ts
46644
+ var uuidSchema20 = external_exports.string().uuid();
46645
+ var internalEventObjectSchema = external_exports.record(external_exports.string(), external_exports.unknown()).refine((payload) => !Array.isArray(payload), "Internal event payload must be an object");
46646
+ var actionEventPayloadSchema = external_exports.object({ action: external_exports.string().min(1) }).passthrough();
46647
+ function authoritativePrefixUnion(branches, authoritative) {
46648
+ return external_exports.union(branches).superRefine((payload, ctx) => {
46649
+ const action = payload.action;
46650
+ if (typeof action !== "string") return;
46651
+ for (const { prefix, strict } of authoritative) {
46652
+ if (!action.startsWith(prefix)) continue;
46653
+ const result = strict.safeParse(payload);
46654
+ if (!result.success) {
46655
+ ctx.addIssue({
46656
+ code: external_exports.ZodIssueCode.custom,
46657
+ message: `Malformed "${action}" payload: an action beginning with "${prefix}" must satisfy the strict ${prefix}* schema and may not fall through to a permissive branch (${result.error.issues.map((issue2) => issue2.message).join("; ")})`
46658
+ });
46659
+ }
46660
+ return;
46661
+ }
46662
+ });
46663
+ }
46664
+ var inviteCreatedEventPayloadSchema = external_exports.object({
46665
+ action: external_exports.literal("invite.created"),
46666
+ invite_id: uuidSchema20,
46667
+ email: external_exports.string().email(),
46668
+ role: memberRoleSchema,
46669
+ member_type: memberTypeSchema,
46670
+ access_profile: memberAccessProfileSchema,
46671
+ aicos_access_scope: aicosAccessScopeSchema,
46672
+ invited_by: uuidSchema20
46673
+ }).strict();
46674
+ var inviteRevokedEventPayloadSchema = external_exports.object({
46675
+ action: external_exports.literal("invite.revoked"),
46676
+ invite_id: uuidSchema20,
46677
+ revoked_by: uuidSchema20
46678
+ }).strict();
46679
+ var inviteAcceptedEventPayloadSchema = external_exports.object({
46680
+ action: external_exports.literal("invite.accepted"),
46681
+ invite_id: uuidSchema20,
46682
+ user_id: uuidSchema20,
46683
+ membership_id: uuidSchema20,
46684
+ linked_seat_ids: external_exports.array(uuidSchema20)
46685
+ }).strict();
46686
+ var inviteLifecycleEventPayloadSchema = external_exports.union([
46687
+ inviteCreatedEventPayloadSchema,
46688
+ inviteRevokedEventPayloadSchema,
46689
+ inviteAcceptedEventPayloadSchema
46690
+ ]);
46691
+ var internalEventWriterPayloadSchema = authoritativePrefixUnion(
46692
+ [
46693
+ inviteCreatedEventPayloadSchema,
46694
+ inviteRevokedEventPayloadSchema,
46695
+ inviteAcceptedEventPayloadSchema,
46696
+ actionEventPayloadSchema,
46697
+ internalEventObjectSchema
46698
+ ],
46699
+ [{ prefix: "invite.", strict: inviteLifecycleEventPayloadSchema }]
46700
+ );
46701
+ var provisioningEventPayloadSchema = authoritativePrefixUnion(
46702
+ [
46703
+ inviteCreatedEventPayloadSchema,
46704
+ inviteRevokedEventPayloadSchema,
46705
+ inviteAcceptedEventPayloadSchema,
46706
+ actionEventPayloadSchema,
46707
+ internalEventObjectSchema
46708
+ ],
46709
+ // Only "invite." is authoritative today (the sole prefix with typed branches).
46710
+ // Non-invite provisioning actions (e.g. tenant.created) keep riding the
46711
+ // permissive branches unchanged, preserving parse-compat with stored rows.
46712
+ [{ prefix: "invite.", strict: inviteLifecycleEventPayloadSchema }]
46713
+ );
46714
+ var decisionEventPayloadSchema = external_exports.union([
46715
+ actionEventPayloadSchema,
46716
+ internalEventObjectSchema
46717
+ ]);
46718
+ var systemEventPayloadSchema = external_exports.union([
46719
+ actionEventPayloadSchema,
46720
+ internalEventObjectSchema
46721
+ ]);
46722
+ var charterEventPayloadSchema = external_exports.union([
46723
+ actionEventPayloadSchema,
46724
+ internalEventObjectSchema
46725
+ ]);
46726
+ var taskEventPayloadSchema = external_exports.union([
46727
+ actionEventPayloadSchema,
46728
+ internalEventObjectSchema
46729
+ ]);
46730
+
46609
46731
  // ../../packages/protocol/src/held-tool-action.ts
46610
46732
  var heldToolActionReplaySchema = external_exports.object({
46611
46733
  tool_name: external_exports.string().min(1),
@@ -46614,14 +46736,14 @@ var heldToolActionReplaySchema = external_exports.object({
46614
46736
  }).strict();
46615
46737
 
46616
46738
  // ../../packages/protocol/src/operating.ts
46617
- var uuidSchema19 = external_exports.string().uuid();
46739
+ var uuidSchema21 = external_exports.string().uuid();
46618
46740
  var taskListInputSchema = external_exports.object({}).strict();
46619
46741
  var operatingTaskSchema = external_exports.object({
46620
- id: uuidSchema19,
46742
+ id: uuidSchema21,
46621
46743
  title: external_exports.string(),
46622
46744
  description: external_exports.string().nullable(),
46623
- from_seat_id: uuidSchema19.nullable(),
46624
- goal_id: uuidSchema19.nullable(),
46745
+ from_seat_id: uuidSchema21.nullable(),
46746
+ goal_id: uuidSchema21.nullable(),
46625
46747
  acceptance_criteria: external_exports.unknown(),
46626
46748
  due_on: external_exports.string().nullable(),
46627
46749
  status: external_exports.string()
@@ -46630,54 +46752,54 @@ var taskListOutputSchema = external_exports.object({
46630
46752
  tasks: external_exports.array(operatingTaskSchema)
46631
46753
  }).strict();
46632
46754
  var taskAcceptInputSchema = external_exports.object({
46633
- id: uuidSchema19
46755
+ id: uuidSchema21
46634
46756
  }).strict();
46635
46757
  var taskConfirmProposalInputSchema = external_exports.object({
46636
- id: uuidSchema19
46758
+ id: uuidSchema21
46637
46759
  }).strict();
46638
46760
  var taskMutationOutputSchema = external_exports.object({
46639
46761
  task: external_exports.object({
46640
- id: uuidSchema19,
46762
+ id: uuidSchema21,
46641
46763
  status: external_exports.string()
46642
46764
  }).strict()
46643
46765
  }).strict();
46644
46766
  var taskDeclineInputSchema = external_exports.object({
46645
- id: uuidSchema19,
46767
+ id: uuidSchema21,
46646
46768
  reason: external_exports.string().min(1)
46647
46769
  }).strict();
46648
46770
  var taskDeclineOutputSchema = external_exports.object({
46649
46771
  task: external_exports.object({
46650
- id: uuidSchema19,
46772
+ id: uuidSchema21,
46651
46773
  status: external_exports.string(),
46652
46774
  decline_reason: external_exports.string()
46653
46775
  }).strict()
46654
46776
  }).strict();
46655
46777
  var taskCompleteInputSchema = external_exports.object({
46656
- id: uuidSchema19,
46778
+ id: uuidSchema21,
46657
46779
  summary: external_exports.string().min(1),
46658
46780
  artifacts: external_exports.unknown().optional()
46659
46781
  }).strict();
46660
46782
  var taskCompleteOutputSchema = external_exports.object({
46661
- task_id: uuidSchema19,
46662
- event_id: uuidSchema19,
46783
+ task_id: uuidSchema21,
46784
+ event_id: uuidSchema21,
46663
46785
  type: external_exports.literal("handoff")
46664
46786
  }).strict();
46665
46787
  var statusRecordOutputSchema = external_exports.object({
46666
- event_id: uuidSchema19,
46788
+ event_id: uuidSchema21,
46667
46789
  type: external_exports.literal("status")
46668
46790
  }).strict();
46669
46791
  var frictionFileIssueInputSchema = issueEventPayloadSchema.extend({
46670
46792
  source_key: external_exports.string().trim().min(1).max(200).optional()
46671
46793
  }).strict();
46672
46794
  var duplicateFrictionCandidateSchema = external_exports.object({
46673
- issue_id: uuidSchema19,
46795
+ issue_id: uuidSchema21,
46674
46796
  summary: external_exports.string().min(1),
46675
46797
  // pg_trgm similarity in [0, 1]; higher is more similar.
46676
46798
  similarity: external_exports.number().min(0).max(1)
46677
46799
  }).strict();
46678
46800
  var frictionFileIssueOutputSchema = external_exports.object({
46679
- event_id: uuidSchema19,
46680
- issue_id: uuidSchema19,
46801
+ event_id: uuidSchema21,
46802
+ issue_id: uuidSchema21,
46681
46803
  type: external_exports.literal("issue"),
46682
46804
  // DER-1522: likely-duplicate candidates detected before creation. Recommend,
46683
46805
  // never block — filing always proceeds; empty when nothing crossed the
@@ -46691,12 +46813,12 @@ var workLogInputSchema = external_exports.object({
46691
46813
  note: external_exports.string().min(1)
46692
46814
  }).strict();
46693
46815
  var workLogOutputSchema = external_exports.object({
46694
- event_id: uuidSchema19,
46816
+ event_id: uuidSchema21,
46695
46817
  type: external_exports.literal("task")
46696
46818
  }).strict();
46697
46819
  var escalationRaiseOutputSchema = external_exports.object({
46698
- event_id: uuidSchema19,
46699
- escalation_id: uuidSchema19,
46820
+ event_id: uuidSchema21,
46821
+ escalation_id: uuidSchema21,
46700
46822
  type: external_exports.literal("escalation")
46701
46823
  }).strict();
46702
46824
  var deliverableKindSchema2 = external_exports.enum(["brief", "work_evidence", "artifact", "report", "other"]);
@@ -46755,7 +46877,7 @@ var deliverableRejectOutputSchema = external_exports.object({
46755
46877
  }).strict();
46756
46878
 
46757
46879
  // ../../packages/protocol/src/steward.ts
46758
- var uuidSchema20 = external_exports.string().uuid();
46880
+ var uuidSchema22 = external_exports.string().uuid();
46759
46881
  var escalationStatusSchema = external_exports.enum([
46760
46882
  "open",
46761
46883
  "approved",
@@ -46764,18 +46886,18 @@ var escalationStatusSchema = external_exports.enum([
46764
46886
  ]);
46765
46887
  var stewardReplayActionSummarySchema = external_exports.object({
46766
46888
  tool_name: external_exports.string(),
46767
- run_id: uuidSchema20
46889
+ run_id: uuidSchema22
46768
46890
  }).strict();
46769
46891
  var stewardProposedToolCallSchema = external_exports.object({
46770
46892
  tool_name: external_exports.string(),
46771
46893
  args_summary: external_exports.unknown()
46772
46894
  }).strict();
46773
46895
  var stewardEscalationSchema = external_exports.object({
46774
- id: uuidSchema20,
46775
- seat_id: uuidSchema20,
46896
+ id: uuidSchema22,
46897
+ seat_id: uuidSchema22,
46776
46898
  seat_name: external_exports.string(),
46777
46899
  seat_type: external_exports.enum(["human", "agent", "hybrid"]),
46778
- steward_seat_id: uuidSchema20,
46900
+ steward_seat_id: uuidSchema22,
46779
46901
  steward_seat_name: external_exports.string(),
46780
46902
  reason: external_exports.string(),
46781
46903
  charter_clause: external_exports.string(),
@@ -46794,11 +46916,11 @@ var stewardEscalationSchema = external_exports.object({
46794
46916
  proposed_tool_call: stewardProposedToolCallSchema.optional(),
46795
46917
  recommended_action: external_exports.string().nullable(),
46796
46918
  status: escalationStatusSchema,
46797
- decided_by: uuidSchema20.nullable(),
46919
+ decided_by: uuidSchema22.nullable(),
46798
46920
  decided_by_name: external_exports.string().nullable(),
46799
46921
  decided_at: external_exports.string().nullable(),
46800
46922
  decision_note: external_exports.string().nullable(),
46801
- issue_id: uuidSchema20.nullable(),
46923
+ issue_id: uuidSchema22.nullable(),
46802
46924
  created_at: external_exports.string(),
46803
46925
  updated_at: external_exports.string()
46804
46926
  }).strict();
@@ -46809,27 +46931,27 @@ var escalationListOutputSchema = external_exports.object({
46809
46931
  escalations: external_exports.array(stewardEscalationSchema)
46810
46932
  }).strict();
46811
46933
  var escalationGetInputSchema = external_exports.object({
46812
- id: uuidSchema20
46934
+ id: uuidSchema22
46813
46935
  }).strict();
46814
46936
  var escalationGetOutputSchema = external_exports.object({
46815
46937
  escalation: stewardEscalationSchema
46816
46938
  }).strict();
46817
46939
  var escalationResolveActionSchema = external_exports.enum(["approve", "convert_to_issue"]);
46818
46940
  var escalationResolveInputSchema = external_exports.object({
46819
- id: uuidSchema20,
46941
+ id: uuidSchema22,
46820
46942
  action: escalationResolveActionSchema.optional(),
46821
46943
  rationale: external_exports.string().trim().min(1).optional()
46822
46944
  }).strict();
46823
46945
  var escalationRejectInputSchema = external_exports.object({
46824
- id: uuidSchema20,
46946
+ id: uuidSchema22,
46825
46947
  rationale: external_exports.string().trim().min(1).optional()
46826
46948
  }).strict();
46827
46949
  var escalationDecisionOutputSchema = external_exports.object({
46828
- escalation_id: uuidSchema20,
46950
+ escalation_id: uuidSchema22,
46829
46951
  status: escalationStatusSchema,
46830
- decision_id: uuidSchema20,
46831
- decided_by: uuidSchema20,
46832
- issue_id: uuidSchema20.nullable(),
46952
+ decision_id: uuidSchema22,
46953
+ decided_by: uuidSchema22,
46954
+ issue_id: uuidSchema22.nullable(),
46833
46955
  // DER-1478: true when the resolved escalation carries a durable replay_action
46834
46956
  // (an approval-gated connector write) that the approvals path should actuate
46835
46957
  // after this decision is recorded. Omitted (not false) for non-connector
@@ -47010,7 +47132,7 @@ var workDetailsSchemas = {
47010
47132
  };
47011
47133
 
47012
47134
  // ../../packages/protocol/src/agent-grant-intervention.ts
47013
- var uuidSchema21 = external_exports.string().uuid();
47135
+ var uuidSchema23 = external_exports.string().uuid();
47014
47136
  var agentGrantBlockerKindSchema = external_exports.enum([
47015
47137
  "rost_capability",
47016
47138
  "os_permission",
@@ -47027,16 +47149,16 @@ var agentGrantInterventionStatusSchema = external_exports.enum([
47027
47149
  ]);
47028
47150
  var agentGrantKindSchema = external_exports.enum(["allow_once", "permanent"]);
47029
47151
  var agentGrantInterventionSchema = external_exports.object({
47030
- id: uuidSchema21,
47031
- seat_id: uuidSchema21,
47152
+ id: uuidSchema23,
47153
+ seat_id: uuidSchema23,
47032
47154
  seat_name: external_exports.string().nullable(),
47033
- agent_id: uuidSchema21.nullable(),
47155
+ agent_id: uuidSchema23.nullable(),
47034
47156
  // The source blocked attempt (audit link); null once the run is retention-purged.
47035
- run_id: uuidSchema21.nullable(),
47157
+ run_id: uuidSchema23.nullable(),
47036
47158
  // The runner the blocker lives on, for os_permission repairs ("Open on Runner").
47037
- runner_id: uuidSchema21.nullable(),
47159
+ runner_id: uuidSchema23.nullable(),
47038
47160
  // The linked continuation attempt, populated when a continuation is enqueued.
47039
- continuation_run_id: uuidSchema21.nullable(),
47161
+ continuation_run_id: uuidSchema23.nullable(),
47040
47162
  blocker_kind: agentGrantBlockerKindSchema,
47041
47163
  status: agentGrantInterventionStatusSchema,
47042
47164
  // The specific capability/scope requested (e.g. "gmail.send"), when applicable.
@@ -47051,7 +47173,7 @@ var agentGrantInterventionSchema = external_exports.object({
47051
47173
  // True once the blocked attempt released its lease/compute (AC #2 clean termination).
47052
47174
  compute_released: external_exports.boolean(),
47053
47175
  grant_kind: agentGrantKindSchema.nullable(),
47054
- decided_by: uuidSchema21.nullable(),
47176
+ decided_by: uuidSchema23.nullable(),
47055
47177
  decided_by_name: external_exports.string().nullable(),
47056
47178
  decided_at: external_exports.string().nullable(),
47057
47179
  expires_at: external_exports.string().nullable(),
@@ -47060,7 +47182,7 @@ var agentGrantInterventionSchema = external_exports.object({
47060
47182
  }).strict();
47061
47183
  var agentGrantInterventionListInputSchema = external_exports.object({
47062
47184
  // Optional seat filter (a seat-scoped caller is additionally clamped to its own seat).
47063
- seat_id: uuidSchema21.optional(),
47185
+ seat_id: uuidSchema23.optional(),
47064
47186
  // When true, include decided/terminal records (declined/resumed/expired) too;
47065
47187
  // by default only the actionable open blocked/granted records are returned.
47066
47188
  include_decided: external_exports.boolean().optional()
@@ -47069,14 +47191,14 @@ var agentGrantInterventionListOutputSchema = external_exports.object({
47069
47191
  interventions: external_exports.array(agentGrantInterventionSchema)
47070
47192
  }).strict();
47071
47193
  var agentGrantInterventionGetInputSchema = external_exports.object({
47072
- id: uuidSchema21
47194
+ id: uuidSchema23
47073
47195
  }).strict();
47074
47196
  var agentGrantInterventionGetOutputSchema = external_exports.object({
47075
47197
  intervention: agentGrantInterventionSchema
47076
47198
  }).strict();
47077
47199
  var agentGrantInterventionDecideActionSchema = external_exports.enum(["grant", "decline"]);
47078
47200
  var agentGrantInterventionDecideInputSchema = external_exports.object({
47079
- intervention_id: uuidSchema21,
47201
+ intervention_id: uuidSchema23,
47080
47202
  action: agentGrantInterventionDecideActionSchema,
47081
47203
  // Defaults to allow_once. `permanent` never auto-widens — it returns
47082
47204
  // requires_charter_resign so the surface routes the human to a Charter re-sign.
@@ -47088,12 +47210,12 @@ var agentGrantInterventionDecideInputSchema = external_exports.object({
47088
47210
  rationale: external_exports.string().trim().min(1).max(2e3).optional()
47089
47211
  }).strict();
47090
47212
  var agentGrantInterventionDecideOutputSchema = external_exports.object({
47091
- intervention_id: uuidSchema21,
47213
+ intervention_id: uuidSchema23,
47092
47214
  status: agentGrantInterventionStatusSchema,
47093
- continuation_run_id: uuidSchema21.nullable(),
47215
+ continuation_run_id: uuidSchema23.nullable(),
47094
47216
  // The human decision row written for a grant/decline (invariant #7). Null only
47095
47217
  // when a permanent grant deferred to a Charter re-sign (no one-time decision made).
47096
- decision_id: uuidSchema21.nullable(),
47218
+ decision_id: uuidSchema23.nullable(),
47097
47219
  // True when the human chose the permanent option — the surface must route to a
47098
47220
  // Charter re-sign; no authority was widened by this call (invariant #10).
47099
47221
  requires_charter_resign: external_exports.boolean(),
@@ -47107,12 +47229,12 @@ var agentGrantInterventionDecideOutputSchema = external_exports.object({
47107
47229
  enqueue_failed: external_exports.boolean()
47108
47230
  }).strict();
47109
47231
  var agentGrantInterventionResumeInputSchema = external_exports.object({
47110
- intervention_id: uuidSchema21
47232
+ intervention_id: uuidSchema23
47111
47233
  }).strict();
47112
47234
  var agentGrantInterventionResumeOutputSchema = external_exports.object({
47113
- intervention_id: uuidSchema21,
47235
+ intervention_id: uuidSchema23,
47114
47236
  status: agentGrantInterventionStatusSchema,
47115
- continuation_run_id: uuidSchema21.nullable(),
47237
+ continuation_run_id: uuidSchema23.nullable(),
47116
47238
  enqueue_failed: external_exports.boolean()
47117
47239
  }).strict();
47118
47240
 
@@ -47130,7 +47252,7 @@ var eventTypes = [
47130
47252
  "task"
47131
47253
  ];
47132
47254
  var publicMessageTypes = ["status", "handoff", "escalation", "issue"];
47133
- var uuidSchema22 = external_exports.string().uuid();
47255
+ var uuidSchema24 = external_exports.string().uuid();
47134
47256
  var evidenceSchema2 = external_exports.array(external_exports.unknown());
47135
47257
  var internalEventPayloadSchema = external_exports.record(external_exports.string(), external_exports.unknown()).refine((payload) => !Array.isArray(payload), "Internal event payload must be an object");
47136
47258
  var handoffEventPayloadSchema = external_exports.object({
@@ -47140,24 +47262,24 @@ var handoffEventPayloadSchema = external_exports.object({
47140
47262
  acceptance_criteria: external_exports.array(external_exports.string().min(1)),
47141
47263
  due: external_exports.string().datetime({ offset: true })
47142
47264
  }).strict(),
47143
- to_seat_id: uuidSchema22
47265
+ to_seat_id: uuidSchema24
47144
47266
  }).strict();
47145
47267
  var intakeEventPayloadSchema = external_exports.discriminatedUnion("action", [
47146
47268
  external_exports.object({
47147
47269
  action: external_exports.literal("uploaded"),
47148
- document_id: uuidSchema22,
47270
+ document_id: uuidSchema24,
47149
47271
  storage_ref: external_exports.string().min(1)
47150
47272
  }).strict(),
47151
47273
  external_exports.object({
47152
47274
  action: external_exports.literal("parsed"),
47153
- document_id: uuidSchema22,
47275
+ document_id: uuidSchema24,
47154
47276
  mode: external_exports.enum(["source_tree", "function_first"]),
47155
47277
  seat_count: external_exports.number().int().nonnegative(),
47156
47278
  edge_count: external_exports.number().int().nonnegative()
47157
47279
  }).strict(),
47158
47280
  external_exports.object({
47159
47281
  action: external_exports.literal("failed"),
47160
- document_id: uuidSchema22,
47282
+ document_id: uuidSchema24,
47161
47283
  reason: external_exports.string().min(1)
47162
47284
  }).strict(),
47163
47285
  external_exports.object({
@@ -47263,9 +47385,9 @@ var publicMessageTypeSchema = external_exports.enum(publicMessageTypes);
47263
47385
  var eventEnvelopeBaseSchema = external_exports.object({
47264
47386
  protocol: external_exports.literal(EVENT_PROTOCOL),
47265
47387
  type: eventTypeSchema,
47266
- seat_id: uuidSchema22.nullable(),
47388
+ seat_id: uuidSchema24.nullable(),
47267
47389
  occurred_at: external_exports.string().datetime({ offset: true }),
47268
- goal_ancestry: external_exports.array(uuidSchema22)
47390
+ goal_ancestry: external_exports.array(uuidSchema24)
47269
47391
  }).strict();
47270
47392
  var statusEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47271
47393
  type: external_exports.literal("status"),
@@ -47289,7 +47411,7 @@ var intakeEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47289
47411
  }).strict();
47290
47412
  var internalEventEnvelopeSchema = eventEnvelopeBaseSchema.extend({
47291
47413
  type: external_exports.enum(["decision", "provisioning", "system", "charter", "task"]),
47292
- payload: internalEventPayloadSchema
47414
+ payload: internalEventWriterPayloadSchema
47293
47415
  }).strict();
47294
47416
  var eventEnvelopeSchema = external_exports.discriminatedUnion("type", [
47295
47417
  statusEventEnvelopeSchema,
@@ -47695,7 +47817,7 @@ Treat AICOS as a coordinator over the operating system. It can become more usefu
47695
47817
  order: 20,
47696
47818
  title: "Responsibility Graph playbook",
47697
47819
  summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
47698
- version: "2026-07-14.2",
47820
+ version: "2026-07-18.1",
47699
47821
  public: true,
47700
47822
  audiences: ["human", "cli", "mcp", "in_app_agent"],
47701
47823
  stages: ["graph_design", "staffing"],
@@ -47784,7 +47906,7 @@ Agent creation at \`/agents/new\` begins with four doors: **Describe the job** o
47784
47906
 
47785
47907
  ## Review an agent seat's delivered work
47786
47908
 
47787
- Agent seat pages show the operator-facing output trail, not just low-level run telemetry. The completed work area combines explicit \`agent_deliverables\`, successful \`work.log\` evidence, and recent successful run summaries into one readable list. Each item shows what was delivered, when it happened, what kind of work it was, and safe evidence links labelled as internal, Linear, GitHub, or external. Secret-shaped values are redacted before display, and run or task context is shown only when it belongs to the same seat. Forge artifact batches can also carry a metadata-only integrity verdict so duplicate hashes, zero-byte files, size outliers, and manifest count mismatches are visible without exposing file contents.
47909
+ Agent seat pages show the operator-facing output trail, not just low-level run telemetry. The completed work area combines explicit \`agent_deliverables\`, successful \`work.log\` evidence, and recent successful run summaries into one readable list. Each item shows what was delivered, when it happened, what kind of work it was, and safe evidence links labelled as internal, Linear, GitHub, or external. Secret-shaped values are redacted before display, and run or task context is shown only when it belongs to the same seat. Forge artifact batches can also carry a metadata-only integrity verdict so duplicate hashes, zero-byte files, size outliers, and manifest count mismatches are visible without exposing file contents. Each recorded deliverable also carries a status badge \u2014 awaiting decision, accepted, or rejected \u2014 and its accepted USD value once one is recorded; a still-undecided deliverable links through to \`/approvals\` to accept or reject it there, since this tab is read-only status, not the decision surface. Run-derived (not yet explicitly recorded) items always read as awaiting decision and never link to \`/approvals\`, since there is no deliverable there yet to decide on.
47788
47910
 
47789
47911
  The **Activity** tab layers a curated business-activity narrative above the Trust Card's forensic execution trace: period-scoped counter tiles (today, this week, or 30 days) summarise the seat's \`work.record\` activity by kind \u2014 a "held for your approval" tile is always shown, and an operator can pick which other kinds appear via a per-seat, browser-local tile picker. Below the tiles, a run-grouped activity feed lists each \`work.list\` record \u2014 verb, object, outcome, evidence link, and time \u2014 with a drill-down for entity refs, the \`template_ref\` used for external comms when one was recorded, and the raw structured details. A sessions browser lists the seat's runs and, for the selected one, its persisted transcript (\`session_transcripts\`) and artifacts rail: binary artifacts (Supabase Storage) get a freshly minted 60-second signed download link at render time, pointer artifacts (Gmail draft, Drive doc, PR, or an internal reference) link out when an external URL is known. The task queue and Trust Card below are unchanged. All of this sits behind the same sensitive-data access gate as the Trust Card; a restricted viewer sees an explicit unavailable state, never a guessed empty feed. The \`/agents\` fleet page mirrors the same row grammar in a tenant-wide **Work** view \u2014 every seat's activity in one filterable stream, each row linking back to that seat's Activity tab with the originating session focused.
47790
47912
 
@@ -48521,7 +48643,7 @@ External connectors are being rolled out provider by provider, conservatively (r
48521
48643
  order: 48,
48522
48644
  title: "CLI and MCP installation guide",
48523
48645
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
48524
- version: "2026-07-18.1",
48646
+ version: "2026-07-18.3",
48525
48647
  public: true,
48526
48648
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48527
48649
  stages: ["company_setup", "staffing"],
@@ -49184,6 +49306,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
49184
49306
  | \`rost_rename_company\` | \`tenant.rename\` | Rename the current company. | Tenant-admin | Call with \`company_name\`; expect human confirmation. |
49185
49307
  | \`rost_get_sync_brief_scope\` | \`settings.sync_brief_scope.get\` | Read the tenant's Sync Brief scope (company_wide or per_cluster). | Tenant | Call with \`{}\`. |
49186
49308
  | \`rost_update_sync_brief_scope\` | \`settings.sync_brief_scope.update\` | Set the tenant's Sync Brief scope (company_wide or per_cluster). | Tenant-admin | Owner-only; call with \`{"sync_brief_scope":"company_wide"}\` or \`{"sync_brief_scope":"per_cluster"}\`. |
49309
+ | \`rost_get_member_visibility_mode\` | \`settings.member_visibility.get\` | Read the tenant's member visibility mode (all or seat_subtree). | Tenant | Call with \`{}\`. |
49310
+ | \`rost_update_member_visibility_mode\` | \`settings.member_visibility.update\` | Set the tenant's member visibility mode (all or seat_subtree). | Tenant-admin | Owner-only; call with \`{"member_visibility_mode":"all"}\` or \`{"member_visibility_mode":"seat_subtree"}\`. |
49187
49311
  | \`rost_get_product_learning_policy\` | \`settings.product_learning.get\` | Read whether product/page/recommendation analytics are allowed. | Tenant | Call with \`{}\`; audit/security logs are always enabled. |
49188
49312
  | \`rost_update_product_learning_policy\` | \`settings.product_learning.update\` | Set product-learning mode. | Tenant-admin | Human-gated; call with \`{"mode":"enabled"}\`, \`{"mode":"disabled"}\`, or \`{"mode":"enterprise_contract"}\`. |
49189
49313
  | \`rost_get_company_autonomy_ceiling\` | \`settings.agent_policy.get\` | Read the company autonomy ceiling (Company Guardrails): profile, enforcement, and max_autonomous_risk. | Tenant | Call with \`{}\`; metadata only. |
@@ -49357,6 +49481,7 @@ Seat-scoped MCP tokens expose the operating protocol below. The server still che
49357
49481
  | \`rost_file_issue\` | \`friction.file_issue\` | File a Friction issue. | Seat | Call with title, severity, and impact. Agent/scheduled producers may pass an optional \`source_key\` for deterministic idempotency \u2014 a repeat filing with the same key returns the existing open issue with \`already_filed:true\` and creates nothing new. |
49358
49482
  | \`rost_log_work\` | \`work.log\` | Record a lightweight free-text work breadcrumb for the seat. For structured, per-entity, queryable business activity (a client might ask "which ones?"), use \`rost_record_work\` instead. | Seat | Call with summary and evidence. |
49359
49483
  | \`rost_report_a_signal_reading\` | \`signal.report\` | Propose one draft reading for this seat's own agent-sourced measurable. The reading lands unconfirmed for human review. | Seat | Call with \`{"measurable_id":"<id>","value":42,"note":"read off the source","confidence":"high"}\`. |
49484
+ | \`rost_draft_first_readings_from_a_connected_source\` | \`signal.draft_first_readings\` | Pull this seat's measurable's connected source ONCE (read-only, SSRF-guarded) and land the value as a DRAFT reading for the current period, for a human to confirm. For a measurable that has a source but no confirmed reading yet. Never publishes and never fabricates a value \u2014 a non-numeric or blocked pull drafts nothing. | Seat | Call with \`{"measurable_id":"<id>"}\`. |
49360
49485
  | \`rost_create_agent_deliverable\` | \`deliverable.create\` | Create a scrubbed durable work output for the acting seat. | Seat | Call with title, kind, summary/content, and optional safe links. |
49361
49486
  | \`rost_attach_agent_deliverable\` | \`deliverable.attach\` | Attach a scrubbed deliverable to a source run, task, or work order after server-side seat validation. | Seat | Call with title, kind, and the source ids that belong to the acting seat. |
49362
49487
  | \`rost_record_work\` | \`work.record\` | Append structured business-activity records to the seat's append-only work ledger, in a batch, right after each action succeeds. Prefer this over \`rost_log_work\` for durable, per-entity, queryable activity (verb + entity ref + outcome + evidence). Secret-redacted; idempotent on \`dedup_key\`; corrections are superseding records. | Seat | Call with \`{"records":[{"verb":"contacted","object":{"kind":"supplier","external_id":"sup_42","label":"Acme Foods"},"summary":"Emailed Acme for a monk fruit quote.","dedup_key":"gmail:msg-abc"}]}\`. |
@@ -49931,7 +50056,7 @@ Agents can suggest commitments and report progress. They should not create a new
49931
50056
  order: 61,
49932
50057
  title: "Signal guide",
49933
50058
  summary: "How to define and read measurables so the company runs on evidence instead of status theater.",
49934
- version: "2026-07-12.1",
50059
+ version: "2026-07-18.3",
49935
50060
  public: true,
49936
50061
  audiences: ["human", "cli", "mcp", "in_app_agent"],
49937
50062
  stages: ["operating_rhythm"],
@@ -49944,6 +50069,7 @@ Agents can suggest commitments and report progress. They should not create a new
49944
50069
  "signal.confirm_reading",
49945
50070
  "signal.correct_reading",
49946
50071
  "signal.report",
50072
+ "signal.draft_first_readings",
49947
50073
  "measurable.create",
49948
50074
  "signal.import",
49949
50075
  "measurable_template.list",
@@ -49989,6 +50115,7 @@ Avoid vanity numbers, manual-only status fields, and metrics nobody can act on.
49989
50115
  - 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.
49990
50116
  - 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).
49991
50117
  - 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.
50118
+ - Draft first readings from a connected source: \`signal.draft_first_readings\` pulls a measurable's bound source once (read-only, SSRF-guarded \u2014 the same pull path as \`signal.preview\`) and lands the value as a DRAFT reading for the current period, for a human to confirm. It is for a measurable that has a connected source but no confirmed reading yet: the Signal page shows a "Draft first readings" button on those rows so the row stops being a permanent blank. Nothing is published \u2014 a human clears the draft with \`signal.confirm_reading\` (invariant #7) \u2014 and it never fabricates a value: a non-numeric or blocked pull drafts nothing and says so.
49992
50119
 
49993
50120
  ## Run Signal without an agent
49994
50121
 
@@ -50394,7 +50521,7 @@ Do not claim that a live charge happened unless Stripe test/live evidence proves
50394
50521
  public: true,
50395
50522
  audiences: ["human", "cli", "mcp", "in_app_agent"],
50396
50523
  stages: ["company_setup", "staffing"],
50397
- relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.readiness", "integration.status", "integration.test", "settings.get", "settings.update", "tenant.rename", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update", "settings.product_learning.get", "settings.product_learning.update", "settings.agent_policy.get", "settings.agent_policy.update", "settings.confirmation_policy.get", "settings.confirmation_policy.update", "tenant.model_gateway_policy.update", "aicos.brain_settings.get", "aicos.brain_settings.update"],
50524
+ relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.readiness", "integration.status", "integration.test", "settings.get", "settings.update", "tenant.rename", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update", "settings.member_visibility.get", "settings.member_visibility.update", "settings.product_learning.get", "settings.product_learning.update", "settings.agent_policy.get", "settings.agent_policy.update", "settings.confirmation_policy.get", "settings.confirmation_policy.update", "tenant.model_gateway_policy.update", "aicos.brain_settings.get", "aicos.brain_settings.update"],
50398
50525
  legal: { publicRisk: "low", notes: ["{{brand}}-native settings guidance."] },
50399
50526
  sources: [
50400
50527
  {
@@ -50512,7 +50639,7 @@ Agents may explain which setting is needed and why. They should not ask users to
50512
50639
  order: 73,
50513
50640
  title: "Members and invites guide",
50514
50641
  summary: "How to invite humans into the company without confusing user access with seat accountability.",
50515
- version: "2026-07-03.2",
50642
+ version: "2026-07-18.1",
50516
50643
  public: true,
50517
50644
  audiences: ["human", "cli", "mcp", "in_app_agent"],
50518
50645
  stages: ["company_setup", "staffing"],
@@ -50537,7 +50664,7 @@ Invite the person as a tenant member. Then assign them to one or more seats only
50537
50664
 
50538
50665
  Tenant roles control app access. Seats control operating accountability. Do not attach goals, tasks, or measurables directly to a user when the work belongs to a seat.
50539
50666
 
50540
- Owners and admins can invite people and manage member roles. Use \`external_implementer\` plus setup-limited access for a temporary implementation partner helping configure onboarding, Responsibility Graph, Compass, Charters, and agent setup. Setup-limited access is intentionally not enough for sensitive operating surfaces: Settings member/invite/token/runner/credential metadata, run and tool-call history, runner diagnostics, integration metadata and tests, system health, Signal operating data, and owner/operating pages require owner/admin or full setup access. Do not grant external implementers sensitive run history, hidden tool arguments, credentials, Memory, or company-operating data unless an owner explicitly expands their profile.
50667
+ Owners and admins can invite people and manage member roles. Use \`external_implementer\` plus setup-limited access for a temporary implementation partner helping configure onboarding, Responsibility Graph, Compass, Charters, and agent setup. Setup-limited access is intentionally not enough for sensitive operating surfaces: Settings member/invite/token/runner/credential metadata, run and tool-call history, runner diagnostics, integration metadata and tests, system health, and owner/operating pages require owner/admin or full setup access. Scorecard (Signal) and Issues (Friction) reads are the exception: every active member can open them, scoped by the tenant member-visibility mode \u2014 either every member sees all Signals and Frictions, or each member sees only the seats they occupy plus everything downstream. Write actions on those pages stay role-gated. Do not grant external implementers sensitive run history, hidden tool arguments, credentials, Memory, or company-operating data unless an owner explicitly expands their profile.
50541
50668
 
50542
50669
  ## Working across several client companies
50543
50670
 
@@ -52727,6 +52854,8 @@ var COMMAND_MANIFEST = [
52727
52854
  { "id": "settings.confirmation_policy.get", "namespace": "settings", "action": "confirmation_policy.get", "title": "Get CLI confirmation mode", "description": "Read this company's CLI confirmation mode (DER-1490): careful (the strict default \u2014 the CLI cannot silently auto-approve a confirmation) or trusted_operator (an owner opt-in permitting silent auto-approval of non-dangerous confirmations). Returns metadata only.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read this company's CLI confirmation mode: careful (the strict default \u2014 the CLI cannot silently auto-approve a confirmation) or trusted_operator (an owner opt-in permitting silent auto-approval of non-dangerous confirmations)." },
52728
52855
  { "id": "settings.confirmation_policy.update", "namespace": "settings", "action": "confirmation_policy.update", "title": "Set CLI confirmation mode", "description": "Set this company's CLI confirmation mode (DER-1490): careful (strict \u2014 no silent CLI auto-approval) or trusted_operator (owner opt-in permitting silent auto-approval of non-dangerous confirmations; dangerous confirmations always require an interactive review). Owner-only and human-gated: choosing trusted_operator establishes an ADR-0018 \xA76 standing authorization.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "cli_mode", "flag": "cli-mode", "type": "enum", "required": true, "enumValues": ["trusted_operator", "careful"] }], "hasComplexInput": false, "help": "Set the CLI confirmation mode to careful or trusted_operator. Owner-only and human-gated; trusted_operator establishes a standing authorization and dangerous confirmations still require an interactive review." },
52729
52856
  { "id": "settings.get", "namespace": "settings", "action": "get", "title": "Get tenant settings", "description": "Read tenant operating settings: plan, status, spend/budgets, integration status, and notification preferences. Returns metadata only.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read tenant operating settings: plan, spend, budgets, integration status, and notification preferences. No secrets." },
52857
+ { "id": "settings.member_visibility.get", "namespace": "settings", "action": "member_visibility.get", "title": "Get member visibility mode", "description": "Read the tenant's member visibility mode: all (every member sees all Signals/Frictions) or seat_subtree (a member sees only their occupied seats plus downstream seats).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read whether members see all Signals/Frictions tenant-wide (all) or only their occupied seats plus downstream seats (seat_subtree)." },
52858
+ { "id": "settings.member_visibility.update", "namespace": "settings", "action": "member_visibility.update", "title": "Update member visibility mode", "description": "Set the tenant's member visibility mode (all or seat_subtree). Governs how non-owner members see Signals (Scorecard) and Frictions (Issues); write actions stay role-gated.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "member_visibility_mode", "flag": "member-visibility-mode", "type": "enum", "required": true, "enumValues": ["all", "seat_subtree"] }], "hasComplexInput": false, "help": "Set member visibility to all or seat_subtree; owner-only. Governs how non-owner members see the Scorecard and Issues; write actions stay role-gated." },
52730
52859
  { "id": "settings.product_learning.get", "namespace": "settings", "action": "product_learning.get", "title": "Get product-learning policy", "description": "Read whether product/page/recommendation analytics may be recorded for this tenant. Security and audit logs remain enabled in every mode.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read whether product/page/recommendation analytics are allowed for the tenant; security and audit logs always stay enabled." },
52731
52860
  { "id": "settings.product_learning.update", "namespace": "settings", "action": "product_learning.update", "title": "Update product-learning policy", "description": "Set tenant product-learning participation. Disabled and enterprise-contract modes block generic product analytics writes, but not security/audit logs.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "mode", "flag": "mode", "type": "enum", "required": true, "enumValues": ["enabled", "disabled", "enterprise_contract"] }], "hasComplexInput": false, "help": "Set tenant product-learning mode to enabled, disabled, or enterprise_contract; the change is human-gated." },
52732
52861
  { "id": "settings.sync_brief_scope.get", "namespace": "settings", "action": "sync_brief_scope.get", "title": "Get Sync Brief scope", "description": "Read the tenant's Sync Brief scope: company_wide (one weekly brief) or per_cluster (one brief per cluster).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read whether weekly Sync Briefs compile company-wide (one brief) or per cluster (one brief per cluster)." },
@@ -52738,6 +52867,7 @@ var COMMAND_MANIFEST = [
52738
52867
  { "id": "signal.bind_confirm", "namespace": "signal", "action": "bind_confirm", "title": "Confirm and activate a signal binding", "description": "Human-only activation of a draft signal binding (draft \u2192 active). Agents can never self-activate \u2014 an agent caller produces a pending confirmation. A drives_status binding requires a second-anchor confirmation. Once active, the scheduled pull auto-fills the measurable.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "binding_id", "flag": "binding-id", "type": "string", "required": true }], "hasComplexInput": true, "help": "Human-only: activate a draft signal binding (draft -> active) so scheduled pulls begin; an agent that calls it produces a pending confirmation." },
52739
52868
  { "id": "signal.confirm_reading", "namespace": "signal", "action": "confirm_reading", "title": "Confirm Signal reading", "description": "Confirm an unconfirmed reading as human-verified. Humans confirm; agents cannot. Idempotent on an already-confirmed reading.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "reading_id", "flag": "reading-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Confirm an unconfirmed reading as human-verified; confirmation is a human act, not an agent one." },
52740
52869
  { "id": "signal.correct_reading", "namespace": "signal", "action": "correct_reading", "title": "Correct Signal reading", "description": "Overwrite a reading for a period with a human-confirmed value. A manual correction is a human decision and is gated behind confirmation.", "requiredScope": "seat", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }, { "name": "period_start", "flag": "period-start", "type": "string", "required": true }, { "name": "value", "flag": "value", "type": "number", "required": true }], "hasComplexInput": false, "help": "Correct a reading only as a human; manual corrections that change confirmed data require confirmation." },
52870
+ { "id": "signal.draft_first_readings", "namespace": "signal", "action": "draft_first_readings", "title": "Draft first readings from a connected source", "description": "Pull a measurable's connected source ONCE (read-only, SSRF-guarded) and land the value as a DRAFT reading for the current period, for a human to confirm. For a measurable that has a source but no confirmed reading yet. Never publishes a reading and never fabricates a value \u2014 a non-numeric or blocked pull drafts nothing.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Pull a measurable's connected source once (read-only, SSRF-guarded) and land the value as a DRAFT reading for the current period, for a human to confirm with signal.confirm_reading. For a measurable that has a source but no confirmed reading yet. Never publishes and never fabricates a value \u2014 a non-numeric or blocked pull drafts nothing.", "example": { "measurable_id": "01900001-0001-7001-8001-000000000001" } },
52741
52871
  { "id": "signal.get", "namespace": "signal", "action": "get", "title": "Get Signal", "description": "Return a measurable definition with its full reading history (confirmed and unconfirmed).", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "measurable_id", "flag": "measurable-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Read a measurable's full reading history before confirming or correcting a value." },
52742
52872
  { "id": "signal.import", "namespace": "signal", "action": "import", "title": "Import Signals from CSV", "description": "Bulk-import measurable definitions and their historical readings from a parsed scorecard export (e.g. a ninety CSV). Owners are seat names resolved to seats; readings are human-confirmed. Idempotent \u2014 re-import upserts by (measurable, period, cadence). Re-importing a measurable at a different cadence is rejected, not overwritten.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }], "hasComplexInput": true, "help": "Bulk-import measurables + historical readings from a parsed scorecard export (owners resolve to seats); idempotent, human-confirmed, re-import upserts by period." },
52743
52873
  { "id": "signal.list", "namespace": "signal", "action": "list", "title": "List Signals", "description": "List measurable definitions with their latest reading and on/off-track state. Seat-scoped callers see only their own seat.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "List Signals to find measurable ids and current on/off-track state before recording or correcting readings." },