@rosthq/cli 0.7.50 → 0.7.52

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":"groups.d.ts","sourceRoot":"","sources":["../../src/generator/groups.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAM1D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKhF,CAAC;AAmmCF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA2OjD,CAAC"}
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/generator/groups.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAM1D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKhF,CAAC;AAonCF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA2OjD,CAAC"}
package/dist/index.js CHANGED
@@ -41339,7 +41339,9 @@ var graphNodeSchema = external_exports.object({
41339
41339
  }).strict().nullable(),
41340
41340
  signal_state: rollupStateSchema,
41341
41341
  cascade_state: rollupStateSchema,
41342
- open_task_count: external_exports.number().int().nonnegative()
41342
+ open_task_count: external_exports.number().int().nonnegative(),
41343
+ unassigned: external_exports.boolean(),
41344
+ is_peer: external_exports.boolean()
41343
41345
  }).strict();
41344
41346
  var graphEdgeSchema = external_exports.object({
41345
41347
  parent_seat_id: uuidSchema11,
@@ -43334,6 +43336,7 @@ var forgePlanArtifact = external_exports.object({
43334
43336
  }
43335
43337
  }
43336
43338
  });
43339
+ var forgePlanArtifactSchema = forgePlanArtifact;
43337
43340
  var forgeImplementationArtifact = external_exports.object({
43338
43341
  changes: forgeArtifactList,
43339
43342
  verification: forgeArtifactList,
@@ -44515,7 +44518,7 @@ Treat AICOS as a coordinator over the operating system. It can become more usefu
44515
44518
  order: 20,
44516
44519
  title: "Responsibility Graph playbook",
44517
44520
  summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
44518
- version: "2026-07-04.3",
44521
+ version: "2026-07-06.2",
44519
44522
  public: true,
44520
44523
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44521
44524
  stages: ["graph_design", "staffing"],
@@ -44548,6 +44551,23 @@ The Responsibility Graph is the company's operating structure. It answers who ow
44548
44551
  - Give every agent seat a human Steward chain.
44549
44552
  - Attach goals, measurables, and tasks to seats, not directly to people.
44550
44553
 
44554
+ ## Single-root chart and parent resolution
44555
+
44556
+ The graph always resolves to a single canonical root seat (Founder & CEO in the standard shape) so the web canvas, CLI \`rost graph show\`, and MCP \`graph.get\` all agree on the same structure. The parent of each seat is derived deterministically:
44557
+
44558
+ 1. An explicit parent seat id, when it names a live seat in the same chart.
44559
+ 2. The seat at the ltree parent path, when one exists.
44560
+ 3. The steward seat, when the seat is not AICOS and the steward is a live non-self seat.
44561
+ 4. Otherwise the seat has no parent.
44562
+
44563
+ AICOS always stays a peer of the root (never a child of its steward) and never appears as an orphan in the unassigned set \u2014 this is intentional and not a data-quality issue.
44564
+
44565
+ Seats that do not reach the single root through the resolved parent chain are listed as **unassigned** (with \`unassigned: true\` and no incoming edge). Each \`graph.get\` node carries an \`unassigned\` boolean, and the CLI \`rost graph show\` output prints unassigned seats under a separate \`Unassigned\` section so operators can see which parts of the chart need attention. The web canvas parks unassigned seats at the bottom of the chart instead of inventing fake root edges.
44566
+
44567
+ ## Forge Developer Team seats are pinned
44568
+
44569
+ Seats under \`forge.developer_team\` are resolved by Forge build dispatch using their exact path, so they cannot be reparented or merged from the graph, CLI, or MCP \u2014 moving a seat (or an ancestor whose subtree holds them) would eject them from dispatch, and no command can restore the path. To change who is accountable for one of these seats, update its steward with \`agent_setup.update\`; the reporting path stays fixed. To stand the team down, use the governed Forge team teardown flow, not a merge or decommission.
44570
+
44551
44571
  ## Add an agent from the graph
44552
44572
 
44553
44573
  Agent creation is a first-class graph action. From a seat in the Responsibility Graph you can open the agent setup wizard with the seat already chosen as the parent:
@@ -44618,7 +44638,7 @@ Each seat needs:
44618
44638
 
44619
44639
  Read before you write. Load the whole graph first so seat ids, parents, and occupancy are known.
44620
44640
 
44621
- - CLI: \`{{cli}} command graph.get --json '{}'\` (scope: tenant). Returns seats, edges, root, occupants, and status rollups.
44641
+ - CLI: \`{{cli}} command graph.get --json '{}'\` (scope: tenant). Returns seats, edges, root, occupants, status rollups, and unassigned-seat flags. The output includes a single \`root_seat_id\`, exactly one \`is_root: true\` node, and unassigned seats listed under their own section with a data-quality note.
44622
44642
  - MCP tool: \`rost_get_responsibility_graph\` with \`{}\`; or read the resource \`rost://graph\` (tenant-admin token).
44623
44643
  - One seat: \`{{cli}} command seat.get --json '{"seat_id":"<seat-id>"}'\` or \`rost_get_seat_detail\`.
44624
44644
 
@@ -49863,10 +49883,27 @@ function renderGraph(output) {
49863
49883
  `root_seat_id=${field(record2, "root_seat_id")}`,
49864
49884
  "seat_id parent_seat_id type status name"
49865
49885
  ];
49886
+ const assigned = [];
49887
+ const unassigned = [];
49866
49888
  for (const node of nodes) {
49867
49889
  const row = asRecord(node);
49890
+ if (row.unassigned) {
49891
+ unassigned.push(row);
49892
+ } else {
49893
+ assigned.push(row);
49894
+ }
49895
+ }
49896
+ for (const row of assigned) {
49868
49897
  lines.push(`${field(row, "seat_id")} ${field(row, "parent_seat_id")} ${field(row, "seat_type")} ${field(row, "status")} ${field(row, "name")}`);
49869
49898
  }
49899
+ if (unassigned.length > 0) {
49900
+ lines.push("");
49901
+ lines.push("Unassigned (no path to root \u2014 data-quality signal)");
49902
+ lines.push("seat_id parent_seat_id type status name");
49903
+ for (const row of unassigned) {
49904
+ lines.push(`${field(row, "seat_id")} ${field(row, "parent_seat_id")} ${field(row, "seat_type")} ${field(row, "status")} ${field(row, "name")}`);
49905
+ }
49906
+ }
49870
49907
  return lines.join("\n");
49871
49908
  }
49872
49909
  function renderSeatList(output) {
@@ -53362,7 +53399,9 @@ async function executeClaimedUnit(fetchImpl, appUrl2, state, config2, io, runtim
53362
53399
  // narrower endpoint — T1.9 scope); its Zod schema strips unrecognized keys on a non-strict
53363
53400
  // parse either way, so sending them there is harmless, just unused.
53364
53401
  ...input.kind === "work_order" ? { step_ledger: ledger.entries() } : {},
53365
- ...input.kind === "work_order" && result.transcript ? { transcript: result.transcript } : {}
53402
+ ...input.kind === "work_order" && result.transcript ? { transcript: result.transcript } : {},
53403
+ // DER-1371: the planner's structured decomposition — only sent when the model produced one.
53404
+ ...result.planArtifact ? { plan_artifact: result.planArtifact } : {}
53366
53405
  }, state.runner_secret);
53367
53406
  if (reported.status !== 200) {
53368
53407
  if (reported.status >= 400 && reported.status < 500) {
@@ -54108,12 +54147,14 @@ function runModelProcess(input) {
54108
54147
  const rawOutput = (out || err || "completed").trim();
54109
54148
  const redacted = redactForLog(rawOutput);
54110
54149
  const evidence = input.collectEvidence && code === 0 ? extractRunnerEvidence(rawOutput) : [];
54150
+ const planArtifact = input.collectEvidence && code === 0 ? extractForgePlanArtifact(rawOutput) : void 0;
54111
54151
  finish({
54112
54152
  ok: code === 0,
54113
54153
  summary: extractRunnerSummary(redacted).slice(0, 12e3),
54114
54154
  transcript: scrubTranscriptSessionIds(redacted).slice(0, MAX_TRANSCRIPT_CHARS),
54115
54155
  ...evidence.length > 0 ? { evidence } : {},
54116
- ...input.expectSessionEnvelope ? extractClaudeSessionId(rawOutput) : {}
54156
+ ...input.expectSessionEnvelope ? extractClaudeSessionId(rawOutput) : {},
54157
+ ...planArtifact ? { planArtifact } : {}
54117
54158
  });
54118
54159
  });
54119
54160
  child.on("error", (error51) => {
@@ -54206,6 +54247,25 @@ function extractRunnerEvidence(output) {
54206
54247
  }
54207
54248
  return [];
54208
54249
  }
54250
+ function extractForgePlanArtifact(output) {
54251
+ const directRecord = parseJsonObject(output.trim());
54252
+ if (directRecord) {
54253
+ const parsed = forgePlanArtifactSchema.safeParse(directRecord);
54254
+ if (parsed.success) {
54255
+ return parsed.data;
54256
+ }
54257
+ for (const key of ["result", "summary", "content", "text", "message"]) {
54258
+ const nested = typeof directRecord[key] === "string" ? parseJsonObject(directRecord[key].trim()) : null;
54259
+ if (nested) {
54260
+ const nestedParsed = forgePlanArtifactSchema.safeParse(nested);
54261
+ if (nestedParsed.success) {
54262
+ return nestedParsed.data;
54263
+ }
54264
+ }
54265
+ }
54266
+ }
54267
+ return void 0;
54268
+ }
54209
54269
  function extractClaudeSessionId(output) {
54210
54270
  const trimmed = output.trim();
54211
54271
  if (!trimmed.startsWith("{")) {