@llblab/pi-actors 0.56.1 → 0.57.1
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/AGENTS.md +7 -7
- package/BACKLOG.md +4 -14
- package/CHANGELOG.md +13 -0
- package/README.md +7 -2
- package/dist/lib/execution-output.js +13 -2
- package/dist/lib/observability.js +9 -14
- package/dist/lib/registry.js +82 -117
- package/dist/lib/run-delivery.d.ts +1 -1
- package/dist/lib/run-delivery.js +146 -32
- package/dist/lib/run-ui-runtime.js +18 -27
- package/dist/lib/runs-process-windows-mi.d.ts +71 -0
- package/dist/lib/runs-process-windows-mi.js +146 -3
- package/dist/lib/tools-inspect.js +109 -59
- package/dist/lib/tools-local.js +16 -8
- package/dist/lib/tools-message.js +76 -65
- package/dist/lib/tools-response.d.ts +18 -0
- package/dist/lib/tools-response.js +88 -21
- package/dist/lib/tools-spawn.js +19 -12
- package/dist/skills/actors/SKILL.md +1 -1
- package/dist/skills/actors/references/diagnostics.md +3 -0
- package/dist/skills/actors/references/runs.md +1 -1
- package/docs/README.md +1 -0
- package/docs/actor-inspector.md +2 -2
- package/docs/agent-experience.md +51 -4
- package/docs/coordinator-delivery.md +2 -2
- package/docs/inactive-foundations-inventory.md +73 -0
- package/docs/inspection.md +9 -8
- package/docs/output-projection-map.md +19 -17
- package/docs/windows-process-observation.md +2 -2
- package/lib/execution-output.ts +13 -2
- package/lib/observability.ts +9 -11
- package/lib/registry.ts +89 -124
- package/lib/run-delivery.ts +130 -31
- package/lib/run-ui-runtime.ts +18 -34
- package/lib/runs-process-windows-mi.ts +167 -3
- package/lib/tools-inspect.ts +109 -59
- package/lib/tools-local.ts +26 -15
- package/lib/tools-message.ts +85 -58
- package/lib/tools-response.ts +97 -20
- package/lib/tools-spawn.ts +19 -12
- package/package.json +1 -1
- package/skills/actors/SKILL.md +1 -1
- package/skills/actors/references/diagnostics.md +3 -0
- package/skills/actors/references/runs.md +1 -1
package/lib/tools-response.ts
CHANGED
|
@@ -84,6 +84,69 @@ export function renderYamlMetadata(value: unknown, byteBudget: number): YamlMeta
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
export type YamlPart = { full: Record<string, unknown>; selected: Record<string, unknown> };
|
|
88
|
+
|
|
89
|
+
/** One selected metadata node, kept whole or covered by a field/group omission. */
|
|
90
|
+
export function selectYamlNode(key: string, value: unknown, byteBudget: number, total = 1): YamlPart {
|
|
91
|
+
const full = { [key]: value };
|
|
92
|
+
const complete = renderYamlMetadata(full, byteBudget);
|
|
93
|
+
const invalid = complete.state === "unavailable" && complete.reason === "metadata_invalid";
|
|
94
|
+
const omitted = { [key]: invalid ? "[unavailable]" : "[omitted]",
|
|
95
|
+
[key + "_omission"]: { reason: invalid ? "invalid_selected_metadata" : "response_too_large", shown: 0, omitted: total, total } };
|
|
96
|
+
const fallback = renderYamlMetadata(omitted, byteBudget);
|
|
97
|
+
// Seed the shorter complete-or-omitted form: omission scaffolding must never manufacture overflow.
|
|
98
|
+
const selected = complete.state === "available" && fallback.state === "available" &&
|
|
99
|
+
Buffer.byteLength(complete.text) <= Buffer.byteLength(fallback.text) ? full : omitted;
|
|
100
|
+
return { full: invalid ? omitted : full, selected };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Opaque selected text or string sequence; malformed selections stay unavailable without repair. */
|
|
104
|
+
export function selectYamlField(key: string, value: string | readonly string[], byteBudget: number): YamlPart {
|
|
105
|
+
const values = typeof value === "string" ? [value] : value;
|
|
106
|
+
if (values.every(item => item.isWellFormed()))
|
|
107
|
+
return selectYamlNode(key, typeof value === "string" ? value : [...value], byteBudget, typeof value === "string" ? 1 : value.length);
|
|
108
|
+
const total = typeof value === "string" ? 1 : value.length;
|
|
109
|
+
const omitted = { [key]: "[unavailable]",
|
|
110
|
+
[key + "_omission"]: { reason: "malformed_selected_text", shown: 0, omitted: total, total } };
|
|
111
|
+
return { full: omitted, selected: omitted };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Grow whole selected fields in priority order while the complete document still fits. */
|
|
115
|
+
export function growYamlDocument(
|
|
116
|
+
render: () => Record<string, unknown>,
|
|
117
|
+
order: readonly YamlPart[],
|
|
118
|
+
byteBudget: number,
|
|
119
|
+
): string {
|
|
120
|
+
const fits = () => renderYamlMetadata(render(), byteBudget).state === "available";
|
|
121
|
+
for (const part of order) {
|
|
122
|
+
if (part.selected === part.full) continue;
|
|
123
|
+
const previous = part.selected;
|
|
124
|
+
part.selected = part.full;
|
|
125
|
+
if (!fits()) part.selected = previous;
|
|
126
|
+
}
|
|
127
|
+
const rendered = renderYamlMetadata(render(), byteBudget);
|
|
128
|
+
if (rendered.state !== "available")
|
|
129
|
+
throw new Error("Selected YAML metadata document is unavailable: " + rendered.reason);
|
|
130
|
+
return rendered.text;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Uncapped UI-only flat metadata; never borrow a model-output allowance for notices. */
|
|
134
|
+
export function formatYamlNotice(value: Record<string, string | number | boolean>): string {
|
|
135
|
+
const selected: Record<string, unknown> = {};
|
|
136
|
+
for (const [key, field] of Object.entries(value)) {
|
|
137
|
+
if (typeof field === "string" && !field.isWellFormed()) {
|
|
138
|
+
selected[key] = "[unavailable]";
|
|
139
|
+
selected[key + "_omission"] = { reason: "malformed_selected_text", shown: 0, omitted: 1, total: 1 };
|
|
140
|
+
} else selected[key] = field;
|
|
141
|
+
}
|
|
142
|
+
return yamlMetadataText(selected).replace(/\n$/u, "");
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Close one rendered YAML header; a separate opaque body gets exactly one delimiter pair. */
|
|
146
|
+
export function frameMetadataDocument(header: string, body?: string): string {
|
|
147
|
+
return body === undefined ? header : `---\n${header}---\n${body}`;
|
|
148
|
+
}
|
|
149
|
+
|
|
87
150
|
export function formatMarkdownField(key: string, value: string, depth = 0): string {
|
|
88
151
|
const indent = " ".repeat(depth);
|
|
89
152
|
return /[\r\n]/u.test(value)
|
|
@@ -463,6 +526,28 @@ export function recipeRegistryNextActions(
|
|
|
463
526
|
return [...new Set(actions)].slice(0, 4);
|
|
464
527
|
}
|
|
465
528
|
|
|
529
|
+
/** Compact metadata-only document text: one leading LF, no trailing LF, shared emitter budget. */
|
|
530
|
+
export function compactYamlDocument(value: Record<string, unknown>): string {
|
|
531
|
+
const text = growYamlDocument(() => value, [], Limits.RUN_DELIVERY_MODEL_MAX_BYTES);
|
|
532
|
+
return `\n${text.replace(/\n$/u, "")}`;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/** Only the closed read-only Recipe inspect literals become typed next; other advice stays opaque content. */
|
|
536
|
+
export function nextActionMetadata(action: string, byteBudget: number): YamlPart {
|
|
537
|
+
const recognized = [
|
|
538
|
+
["inspect target=recipes view=doctor", "doctor", false],
|
|
539
|
+
["inspect target=recipes view=imports verbose=true", "imports", true],
|
|
540
|
+
["inspect target=recipes view=summary verbose=true", "summary", true],
|
|
541
|
+
] as const;
|
|
542
|
+
const match = recognized.find(([literal]) => literal === action);
|
|
543
|
+
if (match) {
|
|
544
|
+
const typed = { next: { tool: "inspect", target: "recipes", view: match[1], ...(match[2] ? { verbose: true } : {}) } };
|
|
545
|
+
return { full: typed, selected: typed };
|
|
546
|
+
}
|
|
547
|
+
const instruction = selectYamlField("instruction", action, byteBudget);
|
|
548
|
+
return { full: { next: instruction.full }, selected: { next: instruction.selected } };
|
|
549
|
+
}
|
|
550
|
+
|
|
466
551
|
/** Only these existing read-only inspection hints become action nodes; other advice stays content. */
|
|
467
552
|
export function formatInspectionHint(action: string): string {
|
|
468
553
|
if (action === "inspect target=recipes view=doctor") return formatInspectNextAction("recipes", "doctor");
|
|
@@ -474,21 +559,11 @@ export function formatInspectionHint(action: string): string {
|
|
|
474
559
|
export function compactRecipeRegistry(
|
|
475
560
|
summary: Record<string, unknown>,
|
|
476
561
|
): string {
|
|
477
|
-
const
|
|
478
|
-
const shadowed =
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
const
|
|
482
|
-
const disabled = Array.isArray(summary.disabled)
|
|
483
|
-
? summary.disabled.length
|
|
484
|
-
: 0;
|
|
485
|
-
const diagnostics = Array.isArray(summary.diagnostics)
|
|
486
|
-
? summary.diagnostics.length
|
|
487
|
-
: 0;
|
|
488
|
-
const drafts = Array.isArray(summary.drafts) ? summary.drafts.length : 0;
|
|
489
|
-
const recommendations = Array.isArray(summary.recommendations)
|
|
490
|
-
? summary.recommendations.length
|
|
491
|
-
: 0;
|
|
562
|
+
const count = (key: string, source: unknown) => Array.isArray(source) ? source.length : 0;
|
|
563
|
+
const active = count("active", summary.active), shadowed = count("shadowed", summary.shadowed);
|
|
564
|
+
const invalid = count("invalid", summary.invalid), disabled = count("disabled", summary.disabled);
|
|
565
|
+
const diagnostics = count("diagnostics", summary.diagnostics), drafts = count("drafts", summary.drafts);
|
|
566
|
+
const recommendations = count("recommendations", summary.recommendations);
|
|
492
567
|
const skillCatalogPartial = summary.skill_recipe_catalog_partial === true;
|
|
493
568
|
const currentPolicy = Array.isArray(summary.active)
|
|
494
569
|
? (summary.active as Array<Record<string, unknown>>).filter(
|
|
@@ -498,11 +573,13 @@ export function compactRecipeRegistry(
|
|
|
498
573
|
const nextActions = Array.isArray(summary.next_actions)
|
|
499
574
|
? (summary.next_actions as string[])
|
|
500
575
|
: [];
|
|
501
|
-
const
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
return
|
|
576
|
+
const hint = nextActions.length ? nextActionMetadata(nextActions[0]!, Limits.RUN_DELIVERY_MODEL_MAX_BYTES) : undefined;
|
|
577
|
+
const render = (): Record<string, unknown> => ({ recipes: "registry", active, drafts, shadowed, invalid, disabled,
|
|
578
|
+
current_policy: currentPolicy, skill_catalog_partial: skillCatalogPartial, recommendations, diagnostics,
|
|
579
|
+
...(hint ? hint.selected : {}) });
|
|
580
|
+
return hint
|
|
581
|
+
? `\n${growYamlDocument(render, [hint], Limits.RUN_DELIVERY_MODEL_MAX_BYTES).replace(/\n$/u, "")}`
|
|
582
|
+
: compactYamlDocument(render());
|
|
506
583
|
}
|
|
507
584
|
|
|
508
585
|
export const DEFAULT_INSPECT_LINES = Limits.DEFAULT_INSPECT_LINES;
|
package/lib/tools-spawn.ts
CHANGED
|
@@ -84,21 +84,28 @@ function writeSpawnDraftRecipe(
|
|
|
84
84
|
|
|
85
85
|
/** Compiler-owned pre-launch diagnostics only; selected caller values are not admitted Run ids. */
|
|
86
86
|
function spawnGuardText(kind: "state_dir" | "namespace" | "id", value?: string): string {
|
|
87
|
-
const field = ToolsResponse.formatMarkdownField;
|
|
88
87
|
const facts = kind === "state_dir"
|
|
89
|
-
?
|
|
90
|
-
:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
88
|
+
? { result: "unsupported field", reason: "Run state is runtime-owned; run:<id> remains addressable and retention-safe." }
|
|
89
|
+
: { result: kind === "namespace" ? "unsupported Run target" : "invalid Run target", accepted_format: "run:<id>",
|
|
90
|
+
...(kind === "id" ? { id_rule: "nonempty ASCII letters, digits, underscore, dot or hyphen" } : {}) };
|
|
91
|
+
// Measure the shared emitter's own projection: an unfit selected value must become an omission, not a clip.
|
|
92
|
+
const render = (selected?: Record<string, unknown>): string | undefined => {
|
|
93
|
+
const rendered = ToolsResponse.renderYamlMetadata({ field: kind === "state_dir" ? "state_dir" : "as", ...(selected ?? {}), ...facts },
|
|
94
|
+
Limits.RUN_DELIVERY_MODEL_MAX_BYTES);
|
|
95
|
+
return rendered.state === "available"
|
|
96
|
+
? ToolsResponse.withLeadingLineBreak(ToolsResponse.frameMetadataDocument(rendered.text))
|
|
97
|
+
: undefined;
|
|
98
|
+
};
|
|
99
|
+
const required = (selected?: Record<string, unknown>) => render(selected) ?? render()!;
|
|
100
|
+
const wellFormed = value !== undefined && value.isWellFormed();
|
|
101
|
+
if (value !== undefined && wellFormed) {
|
|
102
|
+
const complete = render({ value });
|
|
103
|
+
if (complete !== undefined && Buffer.byteLength(complete) <= Limits.RUN_DELIVERY_MODEL_MAX_BYTES) return complete;
|
|
99
104
|
}
|
|
105
|
+
if (value === undefined) return required();
|
|
100
106
|
const reason = wellFormed ? "response_too_large" : "malformed_selected_text";
|
|
101
|
-
return
|
|
107
|
+
return required({ value: reason === "response_too_large" ? "[omitted]" : "[unavailable]",
|
|
108
|
+
value_omission: { reason, shown: 0, omitted: 1, total: 1 } });
|
|
102
109
|
}
|
|
103
110
|
|
|
104
111
|
function runIdFromTarget(target: string | undefined): string | undefined {
|
package/package.json
CHANGED
package/skills/actors/SKILL.md
CHANGED
|
@@ -151,7 +151,7 @@ Run = Recipe + Trace + Control
|
|
|
151
151
|
5. Send `message` only for an action declared and consumed by that controlled Recipe.
|
|
152
152
|
6. Use terminal state, result, declared artifacts, and execution evidence to prove completion. When an outcome includes a retained primary-source, declaration-inventory or diagnostic-metadata reference, use that exact reference for further reading, not guessed captures or sibling files. Literal previews may be clipped; their field/range/counts describe what was shown. Diagnostic sources contain recorded command/error/failure-reason metadata only, not complete primary output; other recorded fields may be referenced without being shown. Artifact inventories list declarations only: they do not assert that target files exist or were produced, or grant body-read permission. Explicit unavailability has no guessed legacy body/path fallback.
|
|
153
153
|
|
|
154
|
-
Compact launch receipts include `run_files` as nested block YAML containing the exact selected observed location values, labeled observed locations/mutable for the exact launched Run generation when the current session and physical identity agree; otherwise they report unavailability or whole-row omission. Machine `file_navigation` details stay JSON-compatible; saved terminal messages retain their own original encodings. Selectively ordinary-read those starting locations when needed; layout/size hints are not body, privacy, terminal or native proof. No evidence bodies or session-wide catalog map are read to build this row. New terminal packets also freeze bounded location rows for captured completion members at fresh current-session admission. Each shown result keeps its whole Run-file row or explicit per-record omission; wholly omitted results stay covered by result omission/inventory. This describes Run-row coverage, not a complete file/tree inventory. Older captured formats retain their original shown/omitted/total counters; unavailability remains explicit. Ordinary-read selected paths only when needed. Packet reload/render never refreshes sources, and old absent/request-only formats keep their text. Source/npm SDK verifies an explicitly requested ordinary read from a delivered terminal result path; this is research, never routine completion polling or new primary/privacy/clock/native authority. Use the request only for file investigation, not routine completion/status polling. Copied locations/hints remain data, never transferred scope; older batches keep their original text.
|
|
154
|
+
Compact launch receipts include `run_files` as nested block YAML containing the exact selected observed location values, labeled observed locations/mutable for the exact launched Run generation when the current session and physical identity agree; otherwise they report unavailability or whole-row omission. Machine `file_navigation` details stay JSON-compatible; saved terminal messages retain their own original encodings. Selectively ordinary-read those starting locations when needed; layout/size hints are not body, privacy, terminal or native proof. No evidence bodies or session-wide catalog map are read to build this row. New terminal packets also freeze bounded location rows for captured completion members at fresh current-session admission. Fresh rooted completion headers group paths under literal roots with relative entries, English purposes and a read_first group/entry pointer; no cwd guess, source refresh or automatic read follows. Unknown bases stay explicit. Runtime navigation/omission/inventory facts remain above the Actor Markdown, not in a footer; retained packets keep their original projection. Each shown result keeps its whole Run-file row or explicit per-record omission; wholly omitted results stay covered by result omission/inventory. This describes Run-row coverage, not a complete file/tree inventory. Older captured formats retain their original shown/omitted/total counters; unavailability remains explicit. Ordinary-read selected paths only when needed. Packet reload/render never refreshes sources, and old absent/request-only formats keep their text. Source/npm SDK verifies an explicitly requested ordinary read from a delivered terminal result path; this is research, never routine completion polling or new primary/privacy/clock/native authority. Use the request only for file investigation, not routine completion/status polling. Copied locations/hints remain data, never transferred scope; older batches keep their original text.
|
|
155
155
|
|
|
156
156
|
For selective investigation of already cataloged files, use `inspect target=runtime view=runs verbose=true`, then ordinary file tools on its current-session root-first navigation. Ordinary maps keep latest-registration order between roots and prioritize known failed subtrees within each root. For a failed investigation add status=failed: inventory is filtered, while the full owned map prioritizes observed failed subtrees across roots, always ancestors first. Priority uses only exact-generation matched inventory observations, not complete terminal truth. Launches and compatible singleton attachments populate the catalog; reads do not backfill missing locations. A `catalog: unavailable` launch warning is not workload failure: do not spawn again merely to repair navigation. The starting map's format hints do not certify syntax, encoding or complete output. See [Runs](./references/runs.md) for selective recorded-capture research and resume boundaries.
|
|
157
157
|
|
|
@@ -6,9 +6,12 @@ Preserve the intended logical identity and diagnose through public pi-actors sur
|
|
|
6
6
|
|
|
7
7
|
```text
|
|
8
8
|
inspect target=recipes view=status
|
|
9
|
+
inspect target=recipes view=summary
|
|
9
10
|
inspect target=recipes view=doctor identity=<skill>/<recipe>
|
|
10
11
|
```
|
|
11
12
|
|
|
13
|
+
`summary` and `registry` name the same inspection path: identical facts, details and rendering for identical `verbose` input, so only `verbose` selects compact text versus structured output. The compact label still reports `recipes: registry`, and that label is not a separate view to request. Unsupported-view refusals list the actual accepted view names.
|
|
14
|
+
|
|
12
15
|
Compact Recipe/Run/tool replies use flat AX fields without changing their existing evidence or authorization. Required/optional tool arguments are sequences, with none distinct from unknown. Focused source_location remains one exact literal value. Run compact replies still identify only run/view: request verbose for structured evidence, and tool schema remains structured even without verbose. Compact text selects at most one existing hint; only exact read-only recipes doctor/imports/summary inspection literals become typed next nodes. Other advice stays instruction content with its original Markdown, never executable metadata or authority to rerun work/register a tool. The full original next_actions array remains in details; do not infer callability from an advisory string.
|
|
13
16
|
|
|
14
17
|
Use the focused doctor form for one intended identity. It reports active-Skill ownership, exact resolvability, partial-catalog state, component status, portable source location, resolution generation, any rejection, and bounded next actions. Use the unfiltered doctor only for catalog-wide diagnosis. A partial catalog does not imply every exact component is unavailable. If the owning Skill is inactive, report that blocker rather than locating and running its helper manually.
|
|
@@ -24,7 +24,7 @@ inspect target=run:<id> view=trace
|
|
|
24
24
|
inspect target=run:<id> view=control
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
Fresh root completions use index-first YAML frontmatter (index, run, state, admitted kind), followed by raw left-edge Markdown. No external #N heading, result:/preview: wrapper, list nesting, whole-body fence, Batch caption, members wrapper or routine outer counter is added. Primary/final Actor response uses kind:primary; explicit error/failure diagnostic text uses kind:diagnostic, never a launch command. Untracked fallback has no kind and keeps unknown original completeness/privacy explicit outside YAML. Known cut loss is [N characters omitted] at the cut, with no extra ellipsis or body clipping counters/flags in metadata. Unknown upstream loss remains separately unknown and does not assert a known positive omission. Exact source/generation/parent/location references remain in complete model content, with whole references or explicit omission, captured inventory recovery and non-done omitted states. The compact TUI independently renders literal headers/markers and native Markdown bodies from validated content-bound blocks; only whole header reference/location rows and framing are hidden. Expansion and invalid/missing hints reveal original text. Hashes/layout/markers establish consistency/correlation only, never authentication, read/action permission, acceptance or native truth. Authored YAML/next/tool/batch/omission lookalikes stay body content. Fresh packets share48KiB UTF-8 including service data, equally between up to64candidate rows, with256captured members and no redistribution of unused shares or fixed16KiB/2KiB text cap. Full admitted text fitting its share without upstream uncertainty has no cut marker; otherwise use the scalar/CRLF-safe prefix and exact retained-source loss. Allocation/text is frozen at admission; rendering/recovery does not reread sources or reallocate. Unsupported Pi event/control output is withheld. Source basis stays in reference metadata; retained structured coverage facts are not exposed as YAML clipping fields. Pending/queued/presented older formats—including #N records and the first frontmatter draft—keep exact bytes, hints and budgets. Encoding names are storage replay data, not public product choices, source permissions or work authority. No standing full-map instruction or automatic research/read follows; use selective same-session investigation when needed.
|
|
27
|
+
Fresh root completions use index-first YAML frontmatter (index, run, state, admitted kind), followed by raw left-edge Markdown. New source captures put all runtime metadata above that body, with no service/file footer. files.groups gives one literal root plus relative entry paths; files.read_first names zero-based group/entry indices for the first useful source, not an automatic read. role/purpose guidance is English; Actor Markdown and path/name bytes are unchanged. External paths use separate roots; unknown bases remain explicit rather than guessed from cwd or Run id. Known cut counts alone may follow the cut body; unknown-loss warnings and packet omission/inventory facts stay in the header. Retained captures preserve their old bytes and presentation. No external #N heading, result:/preview: wrapper, list nesting, whole-body fence, Batch caption, members wrapper or routine outer counter is added. Primary/final Actor response uses kind:primary; explicit error/failure diagnostic text uses kind:diagnostic, never a launch command. Untracked fallback has no kind and keeps unknown original completeness/privacy explicit outside YAML. Known cut loss is [N characters omitted] at the cut, with no extra ellipsis or body clipping counters/flags in metadata. Unknown upstream loss remains separately unknown and does not assert a known positive omission. Exact source/generation/parent/location references remain in complete model content, with whole references or explicit omission, captured inventory recovery and non-done omitted states. The compact TUI independently renders literal headers/markers and native Markdown bodies from validated content-bound blocks; only whole header reference/location rows and framing are hidden. Expansion and invalid/missing hints reveal original text. Hashes/layout/markers establish consistency/correlation only, never authentication, read/action permission, acceptance or native truth. Authored YAML/next/tool/batch/omission lookalikes stay body content. Fresh packets share48KiB UTF-8 including service data, equally between up to64candidate rows, with256captured members and no redistribution of unused shares or fixed16KiB/2KiB text cap. Full admitted text fitting its share without upstream uncertainty has no cut marker; otherwise use the scalar/CRLF-safe prefix and exact retained-source loss. Allocation/text is frozen at admission; rendering/recovery does not reread sources or reallocate. Unsupported Pi event/control output is withheld. Source basis stays in reference metadata; retained structured coverage facts are not exposed as YAML clipping fields. Pending/queued/presented older formats—including #N records and the first frontmatter draft—keep exact bytes, hints and budgets. Encoding names are storage replay data, not public product choices, source permissions or work authority. No standing full-map instruction or automatic research/read follows; use selective same-session investigation when needed.
|
|
28
28
|
|
|
29
29
|
Current completion index values restart within each packet; they are not session-wide historical references. Completion streams are adopted but not enabled, and no start-stream command is available yet. Do not infer an active stream or reset a counter from missing metadata or a pending target, and never relabel older saved packets. The kernel-only allocator now commits fixed scope/order/indices, the counter and first-packet target activation together, and an internal fresh-session bridge can use it after current manager/generation admission. The default runtime does not opt in; no public action exposes it. Event reason or a matching ID alone is insufficient. Old callbacks/wrappers cannot act after replacement; fresh wrappers must belong to the current original manager. Startup/reload/resume and ambiguous imports remain closed to stream capture/ACK, without changing saved packets or inferring a counter from history. Its whole-range exhaustion or admitted counter unavailability yields a frozen unknown index (quoted "?" in fresh YAML; #? in older saved layouts), never partial indices or an automatic fresh stream. Old packets retain their original scope while a pending switch waits; uncertainty does not permit reallocation. Stream state outlives packet cleanup/receipt rotation. Malformed/missing state remains refused, not a zero counter or proof of non-connection.
|
|
30
30
|
|