mirror of
https://github.com/wassname/pi-plan.git
synced 2026-09-26 14:10:23 +08:00
Use VCC compiler for bounded worker supervision overviews
This commit is contained in:
Generated
+10
@@ -9,6 +9,7 @@
|
||||
"version": "0.2.2",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sting8k/pi-vcc": "0.5.0",
|
||||
"pi-intercom": "^0.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -3574,6 +3575,15 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@sting8k/pi-vcc": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@sting8k/pi-vcc/-/pi-vcc-0.5.0.tgz",
|
||||
"integrity": "sha512-KJbOVUFbyghn6h+RD9bDXFNWkKNqpxaCpPQWceOuxMPe9ySpbEfaYnqO9CZUiCP3AFmQ5Ghnsg2B8pdKgY+0Hg==",
|
||||
"peerDependencies": {
|
||||
"@earendil-works/pi-coding-agent": ">=0.74.0 <1.0.0",
|
||||
"typebox": ">=1.1.24 <2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tybys/wasm-util": {
|
||||
"version": "0.10.3",
|
||||
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
"lint:fix": "biome check --fix src/ test/"
|
||||
},
|
||||
"dependencies": {
|
||||
"@sting8k/pi-vcc": "0.5.0",
|
||||
"pi-intercom": "^0.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
// Read-only replay of recorded research branches. Run from the pi-goals root after npm run build.
|
||||
import assert from "node:assert/strict";
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { createHash } from "node:crypto";
|
||||
import { readFileSync, writeFileSync } from "node:fs";
|
||||
import { createRequire } from "node:module";
|
||||
import { resolve } from "node:path";
|
||||
import ts from "typescript";
|
||||
|
||||
const output = "slop/reviews/vcc-view";
|
||||
const root = "/home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/";
|
||||
const workerPath = `${root}2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl`;
|
||||
const supervisorPath = `${root}2026-09-08T22-43-35-654Z_01a08330-e866-7004-9b7f-5efdceb2488e.jsonl`;
|
||||
const load = path => readFileSync(path, "utf8").trim().split("\n").map(line => JSON.parse(line));
|
||||
const entries = load(workerPath);
|
||||
const byId = new Map(entries.map(entry => [entry.id, entry]));
|
||||
const records = load(supervisorPath);
|
||||
const oldSource = execFileSync("git", ["show", "8953dce:src/worker-view.ts"], { encoding: "utf8" });
|
||||
const oldCode = ts.transpileModule(oldSource, { compilerOptions: { module: ts.ModuleKind.ES2022 } }).outputText;
|
||||
const { workerView: oldView } = await import(`data:text/javascript;base64,${Buffer.from(oldCode).toString("base64")}`);
|
||||
const piRequire = createRequire(import.meta.resolve("@earendil-works/pi-coding-agent"));
|
||||
const { createJiti } = piRequire("jiti");
|
||||
const jiti = createJiti(import.meta.url, { moduleCache: false, fsCache: false });
|
||||
const { workerView: newView } = await jiti.import(resolve("src/worker-view.ts"));
|
||||
const { workerView: builtView } = await jiti.import(resolve("dist/worker-view.js"));
|
||||
const results = [];
|
||||
for (const [name, through] of [["pilot-preparation", "3cb9b26f"], ["flow-implementation", "69943231"], ["settled-checkpoint", "e266d41e"]]) {
|
||||
const record = records.find(entry => entry.customType === "pi-goals-intercom" && entry.data.message.kind === "view" && entry.data.message.through === through);
|
||||
assert(record, `recorded view ${through}`);
|
||||
const message = record.data.message;
|
||||
const branch = [];
|
||||
for (let entry = byId.get(through); entry; entry = byId.get(entry.parentId)) branch.unshift(entry);
|
||||
assert(branch.length, "nonempty live branch");
|
||||
const ack = branch.filter(entry => entry.customType === "pi-goals-intercom" && entry.data.direction === "ack" && entry.data.message.through).at(-1);
|
||||
const context = {
|
||||
sourceSession: workerPath,
|
||||
model: message.text.match(/^worker model: (.*)$/m)[1],
|
||||
latestDirection: message.text.match(/latest human direction:\n([\s\S]*?)\ntool calls with no result:/)[1],
|
||||
background: message.text.match(/^tracked background work: (.*)$/m)[1],
|
||||
since: ack?.data.message.through,
|
||||
};
|
||||
const args = [branch, message.reason, message.text.startsWith("The worker stopped."), context];
|
||||
const before = oldView(...args);
|
||||
const after = newView(...args);
|
||||
assert.equal(builtView(...args), after, "built/source real compiler parity");
|
||||
const envelope = { binding: message.binding, role: "worker", kind: "view", id: message.id, text: after, reason: message.reason, through, backgroundQuiet: message.backgroundQuiet };
|
||||
assert(Buffer.byteLength(JSON.stringify(envelope)) < 16_000, "serialized transport bound");
|
||||
// Normalize only the saved files' trailing blank lines; byte metrics use the exact rendered strings.
|
||||
writeFileSync(`${output}/${name}-old.md`, before.trimEnd() + "\n");
|
||||
writeFileSync(`${output}/${name}-vcc.md`, after.trimEnd() + "\n");
|
||||
results.push({ name, timestamp: record.timestamp, through, since: context.since, branchEntries: branch.length, branchSha256: createHash("sha256").update(JSON.stringify(branch)).digest("hex"), oldBytes: Buffer.byteLength(before), vccBytes: Buffer.byteLength(after), oldSerializedTextBytes: Buffer.byteLength(JSON.stringify(before)), vccSerializedTextBytes: Buffer.byteLength(JSON.stringify(after)), envelopeBytes: Buffer.byteLength(JSON.stringify(envelope)) });
|
||||
}
|
||||
const manifest = { baseline: "8953dce", workerPath, supervisorPath, compiler: "@sting8k/pi-vcc@0.5.0", results };
|
||||
writeFileSync(`${output}/comparison.json`, JSON.stringify(manifest, null, 2) + "\n");
|
||||
console.log(JSON.stringify(manifest, null, 2));
|
||||
console.log("PASS: three identical historical branch/ack windows, serialized bounds, source and built compiler execution agree.");
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"baseline": "8953dce",
|
||||
"workerPath": "/home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl",
|
||||
"supervisorPath": "/home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T22-43-35-654Z_01a08330-e866-7004-9b7f-5efdceb2488e.jsonl",
|
||||
"compiler": "@sting8k/pi-vcc@0.5.0",
|
||||
"results": [
|
||||
{
|
||||
"name": "pilot-preparation",
|
||||
"timestamp": "2026-09-08T22:59:31.347Z",
|
||||
"through": "3cb9b26f",
|
||||
"branchEntries": 597,
|
||||
"branchSha256": "f0da668db6266780aa3ba803e5260d4009732c74ab3276f4db55910b8d74af5a",
|
||||
"oldBytes": 4961,
|
||||
"vccBytes": 5356,
|
||||
"oldSerializedTextBytes": 5324,
|
||||
"vccSerializedTextBytes": 5462,
|
||||
"envelopeBytes": 5655
|
||||
},
|
||||
{
|
||||
"name": "flow-implementation",
|
||||
"timestamp": "2026-09-08T23:17:08.542Z",
|
||||
"through": "69943231",
|
||||
"since": "54648ab4",
|
||||
"branchEntries": 715,
|
||||
"branchSha256": "2293e2e7158c051c3571cd50befb14900cea39314640421a5735633775af427b",
|
||||
"oldBytes": 4897,
|
||||
"vccBytes": 2396,
|
||||
"oldSerializedTextBytes": 5109,
|
||||
"vccSerializedTextBytes": 2452,
|
||||
"envelopeBytes": 2646
|
||||
},
|
||||
{
|
||||
"name": "settled-checkpoint",
|
||||
"timestamp": "2026-09-09T00:11:07.924Z",
|
||||
"through": "e266d41e",
|
||||
"since": "18c6af89",
|
||||
"branchEntries": 981,
|
||||
"branchSha256": "3460caf8d1a093309ad2639decbc181151f27871c42ffa62ca98803aae726ce7",
|
||||
"oldBytes": 1676,
|
||||
"vccBytes": 1840,
|
||||
"oldSerializedTextBytes": 1721,
|
||||
"vccSerializedTextBytes": 1882,
|
||||
"envelopeBytes": 2078
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
The worker is still working.
|
||||
|
||||
review trigger: turns
|
||||
source session: /home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl
|
||||
worker model: openai-codex/gpt-6-astra
|
||||
latest human direction:
|
||||
but also try the flow healing one as a next goal on the list
|
||||
tool calls with no result: none
|
||||
tracked background work: processes: 1 (e55-fine-job802-follower); subagents: 0; unregistered detached work is not tracked
|
||||
|
||||
new worker transcript since the last acknowledged view:
|
||||
[truncated; inspect source session]
|
||||
: answer_reached={} reason={} E={:.3f}", setting.name, task.name, r["scorable"], r["reason"], r["E"])
|
||||
if setting.method == "base":
|
||||
if r["scorable"]:
|
||||
base_scorable.add(task.name)
|
||||
if task.name in {"s_add", "l_moral_lie"}:
|
||||
ref_ids = ids[:, :n_prompt + cfg.kl_tokens]
|
||||
base_logp = model(ref_ids, use_cache=False).logits[:, n_prompt - 1:-1].float().log_softmax(-1)
|
||||
references.append((ref_ids, n_prompt - 1, base_logp))
|
||||
report = evaluate_with_vector(model, tok, vignettes=vignettes, max_think_tokens=cfg.think_tokens,
|
||||
batch_size=2, log_demo=False, verbose=0)
|
||||
kl = shared_prefix_kl(model, references)
|
||||
if setting.method == "logit_diff":
|
||||
dump(outdir / f"{setting.name}_adapter.json", stats)
|
||||
dump(outdir / f"{setting.name}_behavior.json", report["per_row"])
|
||||
if setting.method == "base":
|
||||
base_report = report
|
||||
delta = dclr_per_foundation(base_report, report)
|
||||
care, auth = delta["Care"]["mean"], delta["Authority"]["mean"]
|
||||
other = [delta[f]["mean"] for f in FOUNDATION_ORDER if f not in {"Care", "Authority"}]
|
||||
off = sum(abs(x) for x in other) / len(other)
|
||||
scorable = [r for r in generated if r["scorable"]]
|
||||
subset = [r for r in generated if r["task"] in base_scorable]
|
||||
direction = random_v if setting.random_direction else v0
|
||||
along = setting.c * float(direction @ v0)
|
||||
point = dict(name=setting.name, method=setting.method, internal_c=setting.c,
|
||||
logit_alpha=setting.alpha if setting.method == "logit_diff" else 1.0,
|
||||
frac_scorable=len(scorable) / len(tasks), n_base_scorable=len(subset),
|
||||
frac_on_base_scorable=sum(r["scorable"] for r in subset) / len(subset) if subset else float("nan"),
|
||||
mean_nonforced_E=sum(r["E"] for r in generated) / len(tasks),
|
||||
care=care, auth=auth, dlog_on_target=-auth, dlog_off_target=off,
|
||||
net_behavior_nats=care - auth, score=float("nan"),
|
||||
pmass_coherence=report["mean_pmass_allowed"], base_pmass=base_report["mean_pmass_allowed"],
|
||||
pmass_floor=0.99 * base_report["mean_pmass_allowed"],
|
||||
passes_pmass=report["mean_pmass_allowed"] >= 0.99 * base_report["mean_pmass_allowed"],
|
||||
steering_strength_v0=along, total_strength=setting.c,
|
||||
off_axis_strength=setting.c * float((direction - (direction @ v0) * v0).norm()),
|
||||
shared_prefix_kl_nats=kl, behavior_pairs=delta["Authority"]["n"],
|
||||
behavior_pairs_total=delta["Authority"]["n_total"], elapsed_s=time.monotonic() - stage_start)
|
||||
points.append(point)
|
||||
pl.DataFrame([{k: v for k, v in r.items() if k not in {"completion", "prefix", "generated_ids"}} for r in records]).write_csv(outdir / "tasks.csv")
|
||||
pl.DataFrame([{"name": r["name"], "prompt": r["task"], "task": r["task"],
|
||||
"scenario": choice_metadata[r["task"]]["scenario"] if r["task"] in choice_metadata else None,
|
||||
"rating_1_to_5": None, "coherent": None, "passes_demo_gate": None,
|
||||
"premise_preserved": None, "post_answer_repetition": None, "evidence_quote": None,
|
||||
"care_choice_verified": None, "failure_reason": "pending_manual"} for r in records]).write_csv(outdir / "demo_audit.tsv", separator="\t")
|
||||
table = write_report(outdir, points, records, cfg)
|
||||
logger.info("{}: {:.1f}s, ΔCare={:+.3f}, ΔAuth={:+.3f}, KL={:.4f}", setting.name, point["elapsed_s"], care, auth, kl)
|
||||
assert {(r["name"], r["task"]) for r in records} == {(s.name, t.name) for s in settings for t in tasks}
|
||||
assert len(records) == len(settings) * len(tasks), "duplicate or missing generation"
|
||||
logger.info("SHOULD every treatment/prompt cell retained: {} records PASS", len(records))
|
||||
logger.info("RESULT_DEMO: NO_RESULT (pending manual audit)\n{}\nreport={}\nelapsed_s={:.1f}", table, outdir / "report.md", time.monotonic() - start)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(tyro.cli(Cfg))
|
||||
@@ -0,0 +1,39 @@
|
||||
The worker is still working.
|
||||
|
||||
review trigger: turns
|
||||
source session: /home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl
|
||||
worker model: openai-codex/gpt-6-astra
|
||||
latest human direction:
|
||||
but also try the flow healing one as a next goal on the list
|
||||
tool calls with no result: none
|
||||
tracked background work: processes: 1 (e55-fine-job802-follower); subagents: 0; unregistered detached work is not tracked
|
||||
|
||||
new worker overview since the last acknowledged view (VCC algorithmic compression; local # refs index new messages; tool-result bodies omitted; inspect source for evidence):
|
||||
[Files And Changes]
|
||||
- Modified: experiments/e56_flow_repair/flow.py, experiments/e56_flow_repair/test_flow.py,
|
||||
slop/reviews/e56_flow_matching_source.md, slop/reviews/e56_flow_discussion_brief.md,
|
||||
experiments/e56_flow_repair/intervention.py, src/manifold_steer/autoencoder.py
|
||||
- Read: slop/reviews/2026-09-09_glm-5.3-flash_e56_flow_scientist.md,
|
||||
/workspace/2026/lite/steering-lite/src/steering_lite/variants/mean_diff.py,
|
||||
slop/audits/steering_tradeoff/flow_synthetic.log, slop/reviews/2026-09-09_deepseek-v4-pro-0813_e56_flow_scientist.md,
|
||||
/home/code/.pi/agent/skills/arxiv/SKILL.md, /workspace/2026/lite/steering-lite/src/steering_lite/config.py,
|
||||
experiments/e55_logit_diff_amplification/logit_diff.py, /workspace/2026/lite/steering-lite/src/steering_lite/vector.py
|
||||
, slop/reviews/2026-09-09_deepseek-v4-pro-0813_e56_flow_discussion.md,
|
||||
slop/reviews/2026-09-09_glm-5.3-flash_e56_flow_discussion.md
|
||||
|
||||
[assistant]
|
||||
* (15 earlier tool-call entries omitted)
|
||||
* read "experiments/e55_logit_diff_amplification/logit_diff.py" (#30)
|
||||
* read "/workspace/2026/lite/steering-lite/src/steering_lite/vector.py" (#30)
|
||||
* write "experiments/e56_flow_repair/intervention.py" (#34)
|
||||
* edit "experiments/e56_flow_repair/test_flow.py" (#36)
|
||||
* read "slop/reviews/2026-09-09_deepseek-v4-pro-0813_e56_flow_discussion.md" (#38)
|
||||
* read "slop/reviews/2026-09-09_glm-5.3-flash_e56_flow_discussion.md" (#40)
|
||||
* edit "src/manifold_steer/autoencoder.py" (#42, #44, #46) x3
|
||||
(thinking) Thinking: **Preparing evaluation configuration**
|
||||
|
||||
**Refactoring evaluation context** (#48)
|
||||
(thinking) Thinking: **Preparing token geometry logging**
|
||||
|
||||
**Implementing token geometry logging** (#48)
|
||||
* bash "sed -n '255,370p' experiments/e55_logit_diff_amplification/run.py" (#48)
|
||||
@@ -0,0 +1,144 @@
|
||||
The worker is still working.
|
||||
|
||||
review trigger: turns
|
||||
source session: /home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl
|
||||
worker model: openai-codex/gpt-6-astra
|
||||
latest human direction:
|
||||
but also try the flow healing one as a next goal on the list
|
||||
tool calls with no result: none
|
||||
tracked background work: processes: 0; subagents: 0; unregistered detached work is not tracked
|
||||
|
||||
compaction summary (worker account, not independent evidence):
|
||||
[OpenAI native compaction checkpoint]
|
||||
|
||||
new worker transcript (initial or reset view):
|
||||
[truncated; inspect source session]
|
||||
"enqueued_at": "2026-09-08T13:38:57.301057325+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: validate common L22-24 C2 on dog legs; resolve: correct clean controls and consistent transfer on plain questions",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 769,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T13:38:57.518018760+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: validate common L22-24 C2 on dog name; resolve: correct clean controls and consistent transfer on plain questions",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 770,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T13:38:57.740040876+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: validate common L22-24 C2 on dog property; resolve: correct clean controls and consistent transfer on plain questions",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 771,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T13:38:57.987386109+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: validate common L22-24 C2 on ant legs; resolve: correct clean controls and consistent transfer on plain questions",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 772,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T13:38:58.231236887+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: validate common L22-24 C2 on ant name; resolve: correct clean controls and consistent transfer on plain questions",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 773,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T13:38:58.435527993+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: validate common L22-24 C2 on ant property; resolve: correct clean controls and consistent transfer on plain questions",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 775,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T13:41:03.538541658+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: selected dog band may just cause generic changes; resolve: eight random spans matched per-token edit magnitude",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 776,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T13:41:04.114346905+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: selected ant band may just cause generic changes; resolve: eight random spans matched per-token edit magnitude",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 778,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T15:16:24.724372591+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: dog clean controls may fail from assistant-prefilled questions; resolve: user-role and generation-boundary repair must give correct clean answers before assessing fixed L22-24 C2 transfer",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 779,
|
||||
"status": {
|
||||
"Queued": {
|
||||
"enqueued_at": "2026-09-08T15:16:24.923827832+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: ant clean controls may fail from assistant-prefilled questions; resolve: user-role and generation-boundary repair must give correct clean answers before assessing fixed L22-24 C2 transfer",
|
||||
"path": "/workspace/2026/suppressed-activations"
|
||||
},
|
||||
{
|
||||
"id": 801,
|
||||
"status": {
|
||||
"Running": {
|
||||
"enqueued_at": "2026-09-09T06:50:35.856041965+08:00",
|
||||
"start": "2026-09-09T06:50:48.080797309+08:00"
|
||||
}
|
||||
},
|
||||
"priority": 0,
|
||||
"label": "why: larger paired MLP reader/writer needs a fitting check; resolve: batch-eight memory and complete local readouts before held-out training; args --steps 4 --eval-every 2",
|
||||
"path": "/workspace/2026/LUCID3_wikit"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
tool: edit
|
||||
|
||||
Successfully replaced 3 block(s) in experiments/e55_logit_diff_amplification/run_fine_s43/run_card.md.
|
||||
|
||||
tool: bash
|
||||
|
||||
(no output)
|
||||
@@ -0,0 +1,82 @@
|
||||
The worker is still working.
|
||||
|
||||
review trigger: turns
|
||||
source session: /home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl
|
||||
worker model: openai-codex/gpt-6-astra
|
||||
latest human direction:
|
||||
but also try the flow healing one as a next goal on the list
|
||||
tool calls with no result: none
|
||||
tracked background work: processes: 0; subagents: 0; unregistered detached work is not tracked
|
||||
|
||||
compaction summary (worker account, not independent evidence):
|
||||
[OpenAI native compaction checkpoint]
|
||||
|
||||
new worker overview (initial or reset view) (VCC algorithmic compression; local # refs index new messages; tool-result bodies omitted; inspect source for evidence):
|
||||
[Session Goal]
|
||||
- was your job killed?
|
||||
- [Scope change]
|
||||
- maybe read it your self ml-debug
|
||||
|
||||
[Files And Changes]
|
||||
- Modified: slop/audits/e55/job798_parent_read.md, /workspace/2026/mfv/manifold-steer/.pi/plan/01a0809b-a528-7724-a514-5
|
||||
9f3c61116a6-v1.md, experiments/e55_logit_diff_amplification/LAB.md, experiments/ACTIVE.md,
|
||||
experiments/e55_logit_diff_amplification/choice_tasks.py, experiments/e55_logit_diff_amplification/run.py,
|
||||
experiments/e55_logit_diff_amplification/choice_summary.py,
|
||||
experiments/e55_logit_diff_amplification/test_choice_summary.py, justfile,
|
||||
experiments/e55_logit_diff_amplification/run_fine_s43/run_card.md (+2 more)
|
||||
- Read: experiments/e55_logit_diff_amplification/LAB.md, /home/code/.pi/agent/skills/ml-debug/SKILL.md,
|
||||
experiments/e55_logit_diff_amplification/run_s43/run.log, experiments/e55_logit_diff_amplification/run_s43/run_card.md
|
||||
, /home/code/.pi/agent/skills/plan-format/SKILL.md, experiments/e55_logit_diff_amplification/run.py,
|
||||
/home/code/.pi/agent/skills/pueue/SKILL.md, /home/code/.pi/agent/skills/machine-map/SKILL.md,
|
||||
/home/code/.pi/agent/skills/ponytailplus/SKILL.md, /workspace/2026/lite/steering-lite/src/steering_lite/eval/tinymfv.p
|
||||
y (+11 more)
|
||||
|
||||
[Commits]
|
||||
- dff95a9: Record E55 independent demo audit and parent caveats
|
||||
|
||||
[User Preferences]
|
||||
- Style: Make it easy for a busy and forgetfull user to review. Use ASD-STE100 Simplified Technical English. Use active
|
||||
voice, one idea per sentence, common words,
|
||||
|
||||
[truncated; inspect source session]
|
||||
te the stale E55 LAB/ACTIVE claims ('Not run'/'queued798') from existing evidence.
|
||||
Then implement and run the smallest finer-dose comparison resolving matched achieved behavior versus coherence, with a
|
||||
reviewed run card and saved just smoke output before queueing on the existing default group. Specify behavior
|
||||
measurement and uncertainty before collecting new results: forced 32-token CLR and answer-span E alone cannot establish
|
||||
the tradeoff; retain full 512-token generations, premise/repetition audits and missing completions rather than selecting
|
||||
survivors. Compare only overlapping measured effects and keep confirmation prompts separate. Diagnose unexpected results
|
||||
with ml-debug. Goal2 is authorized next: inspect existing AE repair and prepare independent-reviewed corruption-to-clean
|
||||
flow pseudocode during safe CPU work if goal1 is queued; no sign-off dependency forbids that preparation. Deliver the
|
||||
single linked report with both plots, full demos, independent reviews and saved verification/job receipts. Continue
|
||||
autonomously within scope; no approval claim until real evidence is ready.
|
||||
|
||||
[assistant]
|
||||
* (40 earlier tool-call entries omitted)
|
||||
* edit "experiments/e55_logit_diff_amplification/run.py" (#161, #163) x2
|
||||
* process (#165)
|
||||
* bash "cp /home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/subagent-artifacts/outputs/7a33c86b-5383-
|
||||
4752-8ecb-d5912c2583bd/slop/reviews/tradeoff_measurement.md slop/reviews/tradeoff_prequeue.md; cp
|
||||
/home/code/.pi/agent/sessio..." (#167)
|
||||
The review found an important measurement issue: moralmaps deliberately prevents `</think>` and EOS during its probe.
|
||||
Its `emitted_close=0` therefore was not evidence of natural nontermination.
|
||||
|
||||
The follow-up keeps that probe diagnostic only. It adds freely generated care-versus-authority choices, finer doses,
|
||||
paired option orders, and explicit uncertainty for missing answers. I’m fixing the review’s parser and analysis issues
|
||||
before queueing.
|
||||
|
||||
Flow preparation also confirms a distinct test: the previous online AE used one learned map; flow repair would integrate
|
||||
a time-conditioned recovery field. (#169)
|
||||
* edit ".pi/plan/01a0809b-a528-7724-a514-59f3c61116a6-v1.md" (#169)
|
||||
* bash "grep -E 'Ran |OK|PASS|elapsed_s=' slop/audits/steering_tradeoff/reviewed_smoke.log; cat
|
||||
slop/audits/steering_tradeoff/saved_vector_check.log; git diff --check; pueue add --help | head -65; pueue status
|
||||
--json | jq '[.tasks[] | select(.gr..." (#171)
|
||||
* bash "pueue status --json | jq '{groups:.groups,tasks:[.tasks[] | select(.group=="default" and (.status.Done == null))
|
||||
| {id,status,priority,label,path}]}'" (#173)
|
||||
(thinking) Thinking: **Refining run-card wording** (#175)
|
||||
* edit "experiments/e55_logit_diff_amplification/run_fine_s43/run_card.md" (#175)
|
||||
(thinking) Thinking: **Checking saved-vector comment**
|
||||
|
||||
**Extracting old-run report blocks** (#177)
|
||||
* bash "UV_NO_SYNC=1 uv run python -c 'from pathlib import Path;
|
||||
p=Path("experiments/e55_logit_diff_amplification/LAB.md"); report=Path("experiments/e55_logit_diff_amplification/run_s
|
||||
43/report.md").read_text(); blocks=report.split("\n## ")[1:]; ..." (#177)
|
||||
@@ -0,0 +1,7 @@
|
||||
# VCC worker-view change / UAT plan
|
||||
|
||||
Goal: improve supervisor judgment per context token by replacing raw transcript-tail extraction with the existing deterministic VCC compiler. Keep acknowledged-entry slicing, plan changes, tracked background work, and missing tool results. Preserve two recent thinking tails next to their actions. No transport or supervision lifecycle redesign.
|
||||
|
||||
Acceptance: pin and inspect the compiler dependency; test new-turn slicing, compaction/rewind resets, thinking/action ordering, tool arguments, extracted files/context, output omission notices and serialized byte bounds. Run full tests, typecheck, lint and build. Render old and new views from identical recorded maniworker windows, saving reproducible comparison and honest information-loss notes. The parent must perform real isolated Herdr acceptance after this handoff; no research pane interaction here.
|
||||
|
||||
Baseline: HEAD 8953dce, src/worker-view.ts 69 lines. Pre-existing dirty native worker/supervisor event logs and untracked docs/human_journal.md are outside scope and remain untouched/unstaged. No dependency lifecycle scripts will run.
|
||||
@@ -0,0 +1,62 @@
|
||||
# VCC worker overview: implementation and replay review
|
||||
|
||||
## Decision and scope
|
||||
|
||||
Use the deterministic compiler from `@sting8k/pi-vcc@0.5.0` inside the existing worker view. No model call, copied compiler, transport/lifecycle change, new monitoring framework, or change to approval rules. Keep acknowledged-entry boundaries, compaction reset, missing-result matching, plan diff/status claims and existing managed process/subagent tracking. Add context percentage from `ctx.getContextUsage().percent`; unknown remains omitted.
|
||||
|
||||
`src/worker-view.ts`: **69 -> 100 lines (+31)**. Compiler declaration: **10 lines**. Caller: **+1 line**. Not fewer lines than the previous raw-tail implementation, but much smaller than transplanting the 302-line pi-supervise view plus its lifecycle. VCC itself remains an external dependency, not free code complexity.
|
||||
|
||||
## Dependency provenance and security
|
||||
|
||||
- Inspected `../pi-supervise/src/view.ts`, package manifest/lock, installed compiler and normalization/brief/extractor path. Custom last-two-thinking support is in pi-supervise's adapter, not a patched installed VCC package.
|
||||
- Downloaded exact registry tarball using `npm pack @sting8k/pi-vcc@0.5.0 --ignore-scripts --pack-destination /tmp/pi-goals-vcc-package --json`.
|
||||
- `diff -qr /tmp/pi-goals-vcc-package/package ../pi-supervise/node_modules/@sting8k/pi-vcc` produced no differences. This includes all installed package files, not just version strings.
|
||||
- Pinned exact `0.5.0` in dependencies and lockfile. Registry: `https://registry.npmjs.org/@sting8k/pi-vcc/-/pi-vcc-0.5.0.tgz`; SHA512 integrity: `KJbOVUFbyghn6h+RD9bDXFNWkKNqpxaCpPQWceOuxMPe9ySpbEfaYnqO9CZUiCP3AFmQ5Ghnsg2B8pdKgY+0Hg==`.
|
||||
- Tarball SHA1: `090e5c7cacec00b1083bf423bc08aa2d3eb9cb3a`; size 16,206,703 bytes compressed, 16,712,402 unpacked. It ships more than just the compiler. Added one package; no new transitive packages beyond already installed peers.
|
||||
- Read cybersec-situational-awareness skill before fetching/installing. Used `npm install --save-exact @sting8k/pi-vcc@0.5.0 --ignore-scripts --no-audit --no-fund`. No lifecycle scripts run. Mise is installed but has no configured/installed Node version; used current project Node v22.23.2/npm rather than install another toolchain. This was not a sandboxed install.
|
||||
- Runtime imports only compiler source, not the VCC extension entrypoint. The compiler pipeline is algorithmic: no network, shell, or model call.
|
||||
- Local upstream clone is newer (09c4a74, 0.6.0 work); deliberately did not switch versions. This reproduces the installed reference dependency.
|
||||
|
||||
### Source-only package type boundary
|
||||
|
||||
Direct tsc traversal exposed three upstream 0.5.0 errors: `brief.ts:61,77` passes Intl SegmentData with optional `isWordLike` to a required-boolean shape, and `normalize.ts:21` compares Pi Message role with `bashExecution`, outside that union. Supervisor approved a narrow declaration for the exact compile input/output, with tsconfig path mapping just as this repo handles pi-intercom. No runtime fallback or node_modules patch. Source and built JS imports execute the real compiler in replay; tests likewise execute the real package. This declaration must be reviewed if the pinned compiler version changes.
|
||||
|
||||
## Replay method and result
|
||||
|
||||
`node slop/reviews/vcc-view/compare.mjs` loads the actual maniworker branch terminating at each recorded manisuper view's `through` ID, follows parent links (not dead branches), and recovers its last acknowledged view boundary. Both renderers receive identical entries, context, trigger and idle state. Old renderer comes from HEAD 8953dce; new source and built renderer outputs must agree. Paths, timestamps, IDs and branch SHA256 hashes are in `comparison.json`. No sessions were messaged, reloaded or edited. The source sessions remain local prerequisites to reproduce the replay; saved rendered views are reviewable without them.
|
||||
|
||||
| Recorded window | Old UTF-8 bytes | VCC UTF-8 bytes | Observation |
|
||||
|---|---:|---:|---|
|
||||
| Pilot preparation, 22:59:31 | 4,961 | 5,356 | Slightly larger, much better task signal |
|
||||
| Flow implementation, 23:17:08 | 4,897 | 2,396 | About half the bytes; restores action context |
|
||||
| Settled checkpoint, 00:11:07 | 1,676 | 1,840 | Slightly larger; direct test output lost |
|
||||
|
||||
These are bytes, **not measured token counts or realized supervisor cost savings**. Each complete serialized transport envelope is below 16KB (largest 5,655 bytes). The raw transcript and VCC brief keep the same total 5.5KB serialized content allowance; VCC splits extracted headers (1.5KB) from newest brief (4KB) when headers exist, so one cannot evict the other.
|
||||
|
||||
### What improves
|
||||
|
||||
- Pilot old view is dominated by unrelated queue-job JSON. VCC retains the decision that moralmaps deliberately suppresses think closure/EOS, so `emitted_close=0` is not evidence of natural nontermination; the narrower choice pilot/uncertainty approach; edited files/commit; recent thinking about run-card wording and saved-vector checks; actual shell commands rather than `tool: bash`.
|
||||
- Flow old view is almost entirely a raw Python source tail with no useful explanation of the current action. VCC gives changed file paths, reviewed source paths, edit/read/bash arguments and the two recent thinking tails about evaluation configuration and token geometry. Existing E55 follower tracking remains unchanged.
|
||||
- Checkpoint retains the claim `Test passed. Committed as c41e0f2`, extracted commit title, changed files, verification-log path, and thinking about byte identity/rubric migration. The old view had no tool arguments or thinking.
|
||||
|
||||
### Honest limits / evidence lost
|
||||
|
||||
- The checkpoint's actual `Ran 1 test ... OK` tool result is absent in VCC. Supervisor must read the retained log path before treating the worker's pass claim as evidence. The view explicitly says tool-result bodies are omitted and provides the source session path.
|
||||
- VCC file lists/commits are extracted activity, not independent proof that a write or commit succeeded. Some file classifications are heuristic (`write` is reported as Modified). Full source/artifact inspection still matters.
|
||||
- VCC's initial Session Goal extraction includes weak historical phrases such as `was your job killed?`, not the actual agreed research discriminator. It is an overview, not a replacement for the plan or latest human direction. Existing plan review remains separate.
|
||||
- Generic `process` calls appear by name only in VCC's installed compiler; their detailed command/state is not reconstructed here. Existing live background summary still names tracked processes/subagents. Unregistered detached work remains untracked, as before.
|
||||
- Older brief/tool entries can still be cut. Long paths/commands can wrap or truncate. Local `#` references index fresh messages, not session entry IDs; the label now explains this. The compiler's unavailable `vcc_recall` instruction is removed.
|
||||
- Two recent thinking tails are limited to 400 characters before the compiler's own shortening; hidden/redacted thinking cannot be recovered. Large views may still cut earlier retained thinking.
|
||||
- First/reset views can repeat older instructions. No new deduplication or lifecycle machinery was introduced in this scoped change.
|
||||
|
||||
## Validation
|
||||
|
||||
Final output: `validation.txt`. `npm test`: **94/94**, 18 files including RPC. Typecheck, lint, build and diff check pass. Six focused worker-view tests added to the previous three: thinking/action order and immutability; extracted paths/blockers/arguments with omitted output notices and metadata; partial pending calls across acknowledgements; rewind/compaction reset and unknown context; oversized headers/brief preserving newest activity; omitted-result versus empty-update distinction and commit extraction. Existing flow fixture supplies the new standard context-usage API.
|
||||
|
||||
During implementation, full tests caught a partial `edit` call with no arguments: the adapter now supplies an empty argument object for that incomplete call while preserving missing-result status. Two added assertions initially assumed VCC classified `write` as Created and could extract a commit from a result without its call; corrected tests to the inspected compiler semantics, not patched dependency behavior. Upstream type errors are isolated as described above. All final checks pass.
|
||||
|
||||
## Remaining acceptance
|
||||
|
||||
The replay supports a **better overview**, especially when raw output crowds out decisions, but not a claim that this produces better outcomes or lower total token cost. Parent-owned isolated real Herdr acceptance and independent reviewer gate remain required. Suggested UAT: trivial artifact and saved verification log; inspect the supervisor's new overview and actual artifact read; exercise a manual plan tick/edit and full ApproveGoal -> CompleteGoal sequence. Do not use the user's research panes.
|
||||
|
||||
No Herdr panes, GPU jobs, supervisor sessions, user research files, old native evidence logs or human journal were modified by this task. No push performed.
|
||||
@@ -0,0 +1,44 @@
|
||||
The worker stopped.
|
||||
|
||||
review trigger: settled
|
||||
source session: /home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl
|
||||
worker model: openai-codex/gpt-6-astra
|
||||
latest human direction:
|
||||
but also try the flow healing one as a next goal on the list
|
||||
tool calls with no result: none
|
||||
tracked background work: processes: 2 (e55-fine-job802-follower, e56-recovery-job805-follower); subagents: 0; unregistered detached work is not tracked
|
||||
|
||||
new worker transcript since the last acknowledged view:
|
||||
tool: edit
|
||||
|
||||
Successfully replaced 1 block(s) in experiments/e55_logit_diff_amplification/audit_choices.py.
|
||||
|
||||
tool: edit
|
||||
|
||||
Successfully replaced 1 block(s) in experiments/e55_logit_diff_amplification/test_audit_choices.py.
|
||||
|
||||
tool: process
|
||||
|
||||
Started process audit-rubric-template-test (proc_43e4) with pid 3380015.
|
||||
|
||||
Moved the unchanged rubric to [audit_instructions.md](experiments/e55_logit_diff_amplification/audit_instructions.md). The file-roundtrip test is running; queued code is untouched.
|
||||
|
||||
tool: read
|
||||
|
||||
test_prepare_and_summary_file_paths (experiments.e55_logit_diff_amplification.test_audit_choices.AuditTests.test_prepare_and_summary_file_paths) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 1 test in 0.018s
|
||||
|
||||
OK
|
||||
|
||||
|
||||
tool: bash
|
||||
|
||||
[main c41e0f2] Move generated audit rubric out of Python source
|
||||
4 files changed, 19 insertions(+), 12 deletions(-)
|
||||
create mode 100644 experiments/e55_logit_diff_amplification/audit_instructions.md
|
||||
create mode 100644 slop/audits/steering_tradeoff/audit_rubric_template_test.log
|
||||
|
||||
|
||||
Test passed. Committed as `c41e0f2`; rubric wording is unchanged.
|
||||
@@ -0,0 +1,33 @@
|
||||
The worker stopped.
|
||||
|
||||
review trigger: settled
|
||||
source session: /home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl
|
||||
worker model: openai-codex/gpt-6-astra
|
||||
latest human direction:
|
||||
but also try the flow healing one as a next goal on the list
|
||||
tool calls with no result: none
|
||||
tracked background work: processes: 2 (e55-fine-job802-follower, e56-recovery-job805-follower); subagents: 0; unregistered detached work is not tracked
|
||||
|
||||
new worker overview since the last acknowledged view (VCC algorithmic compression; local # refs index new messages; tool-result bodies omitted; inspect source for evidence):
|
||||
[Files And Changes]
|
||||
- Modified: experiments/e55_logit_diff_amplification/audit_choices.py,
|
||||
experiments/e55_logit_diff_amplification/test_audit_choices.py
|
||||
- Read: slop/audits/steering_tradeoff/audit_rubric_template_test.log
|
||||
|
||||
[Commits]
|
||||
- c41e0f2: Move generated audit rubric out of Python source
|
||||
|
||||
[assistant]
|
||||
* edit "experiments/e55_logit_diff_amplification/audit_choices.py" (#0)
|
||||
* edit "experiments/e55_logit_diff_amplification/test_audit_choices.py" (#2)
|
||||
* process (#4)
|
||||
(thinking) Thinking: **Checking baseline byte identity**
|
||||
|
||||
**Testing the rubric migration** (#6)
|
||||
Moved the unchanged rubric to [audit_instructions.md](experiments/e55_logit_diff_amplification/audit_instructions.md).
|
||||
The file-roundtrip test is running; queued code is untouched. (#6)
|
||||
* read "slop/audits/steering_tradeoff/audit_rubric_template_test.log" (#7)
|
||||
* bash "git add experiments/e55_logit_diff_amplification/audit_choices.py
|
||||
experiments/e55_logit_diff_amplification/audit_instructions.md
|
||||
experiments/e55_logit_diff_amplification/test_audit_choices.py && git add -f slop/audits/steering_tradeoff/a..." (#9)
|
||||
Test passed. Committed as `c41e0f2`; rubric wording is unchanged. (#11)
|
||||
@@ -0,0 +1,73 @@
|
||||
|
||||
> @wassname2/pi-goals@0.2.2 test
|
||||
> vitest run
|
||||
|
||||
|
||||
RUN v4.1.9 /home/code/.pi/agent/git/github.com/wassname/pi-goals
|
||||
|
||||
|
||||
Test Files 18 passed (18)
|
||||
Tests 94 passed (94)
|
||||
Start at 10:10:30
|
||||
Duration 3.11s (transform 3.98s, setup 0ms, import 8.30s, tests 7.14s, environment 2ms)
|
||||
|
||||
|
||||
> @wassname2/pi-goals@0.2.2 typecheck
|
||||
> tsc --noEmit
|
||||
|
||||
|
||||
> @wassname2/pi-goals@0.2.2 lint
|
||||
> biome check src/ test/
|
||||
|
||||
Checked 34 files in 45ms. No fixes applied.
|
||||
|
||||
> @wassname2/pi-goals@0.2.2 build
|
||||
> tsc
|
||||
|
||||
{
|
||||
"baseline": "8953dce",
|
||||
"workerPath": "/home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T10-41-19-145Z_01a0809b-a528-7724-a514-59f3c61116a6.jsonl",
|
||||
"supervisorPath": "/home/code/.pi/agent/sessions/--workspace-2026-mfv-manifold-steer--/2026-09-08T22-43-35-654Z_01a08330-e866-7004-9b7f-5efdceb2488e.jsonl",
|
||||
"compiler": "@sting8k/pi-vcc@0.5.0",
|
||||
"results": [
|
||||
{
|
||||
"name": "pilot-preparation",
|
||||
"timestamp": "2026-09-08T22:59:31.347Z",
|
||||
"through": "3cb9b26f",
|
||||
"branchEntries": 597,
|
||||
"branchSha256": "f0da668db6266780aa3ba803e5260d4009732c74ab3276f4db55910b8d74af5a",
|
||||
"oldBytes": 4961,
|
||||
"vccBytes": 5356,
|
||||
"oldSerializedTextBytes": 5324,
|
||||
"vccSerializedTextBytes": 5462,
|
||||
"envelopeBytes": 5655
|
||||
},
|
||||
{
|
||||
"name": "flow-implementation",
|
||||
"timestamp": "2026-09-08T23:17:08.542Z",
|
||||
"through": "69943231",
|
||||
"since": "54648ab4",
|
||||
"branchEntries": 715,
|
||||
"branchSha256": "2293e2e7158c051c3571cd50befb14900cea39314640421a5735633775af427b",
|
||||
"oldBytes": 4897,
|
||||
"vccBytes": 2396,
|
||||
"oldSerializedTextBytes": 5109,
|
||||
"vccSerializedTextBytes": 2452,
|
||||
"envelopeBytes": 2646
|
||||
},
|
||||
{
|
||||
"name": "settled-checkpoint",
|
||||
"timestamp": "2026-09-09T00:11:07.924Z",
|
||||
"through": "e266d41e",
|
||||
"since": "18c6af89",
|
||||
"branchEntries": 981,
|
||||
"branchSha256": "3460caf8d1a093309ad2639decbc181151f27871c42ffa62ca98803aae726ce7",
|
||||
"oldBytes": 1676,
|
||||
"vccBytes": 1840,
|
||||
"oldSerializedTextBytes": 1721,
|
||||
"vccSerializedTextBytes": 1882,
|
||||
"envelopeBytes": 2078
|
||||
}
|
||||
]
|
||||
}
|
||||
PASS: three identical historical branch/ack windows, serialized bounds, source and built compiler execution agree.
|
||||
@@ -260,6 +260,7 @@ export default function piGoalsExtension(pi: ExtensionAPI): void {
|
||||
const view = workerView(entries, reason, reason !== "started" && ctx.isIdle(), {
|
||||
sourceSession: ctx.sessionManager.getSessionFile()!, latestDirection: state.latestDirection,
|
||||
model: ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "not selected",
|
||||
contextPercent: ctx.getContextUsage()?.percent,
|
||||
since: intercom.acknowledgedEntry, background: background.description,
|
||||
planReview: `Plan: ${planRel(ctx)}\n${planReview(plan)}`,
|
||||
});
|
||||
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
// VCC 0.5.0 ships source only; describe its compiler boundary without typechecking upstream internals.
|
||||
declare module "@sting8k/pi-vcc/src/core/summarize" {
|
||||
import type { Message } from "@earendil-works/pi-ai";
|
||||
export interface CompileInput {
|
||||
messages: Message[];
|
||||
previousSummary?: string;
|
||||
fileOps?: { readFiles?: string[]; modifiedFiles?: string[]; createdFiles?: string[] };
|
||||
}
|
||||
export function compile(input: CompileInput): string;
|
||||
}
|
||||
+40
-9
@@ -1,14 +1,19 @@
|
||||
import { compile } from "@sting8k/pi-vcc/src/core/summarize";
|
||||
|
||||
export interface SessionBlock {
|
||||
type?: string;
|
||||
id?: string;
|
||||
name?: string;
|
||||
text?: string;
|
||||
thinking?: string;
|
||||
arguments?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export interface SessionMessage {
|
||||
role?: string;
|
||||
content?: string | SessionBlock[];
|
||||
toolCallId?: string;
|
||||
toolName?: string;
|
||||
}
|
||||
|
||||
export interface SessionEntry {
|
||||
@@ -18,13 +23,38 @@ export interface SessionEntry {
|
||||
message?: SessionMessage;
|
||||
}
|
||||
|
||||
function text(message: SessionMessage): string {
|
||||
if (typeof message.content === "string") return message.content;
|
||||
return (message.content ?? []).flatMap((block) => {
|
||||
if (block.type === "text" && block.text) return [block.text];
|
||||
if (block.type === "toolCall") return [`tool: ${block.name ?? "unknown"}`];
|
||||
return [];
|
||||
}).join("\n");
|
||||
// VCC drops reasoning. Preserve only two recent tails, in place beside the actions they inform.
|
||||
function recentThinking(messages: SessionMessage[]): SessionMessage[] {
|
||||
let remaining = 2;
|
||||
return messages.map(message => ({
|
||||
...message,
|
||||
// Unanswered/partial calls may have no arguments yet; VCC expects an argument object.
|
||||
content: Array.isArray(message.content) ? message.content.map(block => block.type === "toolCall" ? { ...block, arguments: block.arguments ?? {} } : { ...block }) : message.content,
|
||||
})).reverse().map(message => {
|
||||
if (Array.isArray(message.content)) {
|
||||
for (const block of [...message.content].reverse()) {
|
||||
if (block.type === "thinking" && block.thinking && remaining > 0) {
|
||||
block.type = "text";
|
||||
block.text = `(thinking) ${block.thinking.slice(-400)}`;
|
||||
remaining--;
|
||||
}
|
||||
}
|
||||
}
|
||||
return message;
|
||||
}).reverse();
|
||||
}
|
||||
|
||||
function compiledView(messages: SessionMessage[]): string {
|
||||
// Only role/content/tool fields are read by normalize; Pi usage/provider metadata is irrelevant.
|
||||
const compiled = compile({ messages: recentThinking(messages) as Parameters<typeof compile>[0]["messages"] })
|
||||
.replace(/\n*-*\n*Use `vcc_recall`[\s\S]*$/, "").trim();
|
||||
const separator = compiled.indexOf("\n\n---\n\n");
|
||||
// Keep extracted context and newest actions separately: a long brief must not evict all headers.
|
||||
if (/^\[(Session Goal|Files And Changes|Commits|Outstanding Context|User Preferences)\]/.test(compiled)) {
|
||||
if (separator < 0) return bounded(compiled, 1500);
|
||||
return `${bounded(compiled.slice(0, separator), 1500)}\n\n${bounded(compiled.slice(separator + 7), 4000, true)}`;
|
||||
}
|
||||
return bounded(compiled || (messages.length ? "No overview text retained from these messages." : "No new messages."), 5500, true);
|
||||
}
|
||||
|
||||
function outstandingTools(entries: SessionEntry[]): string[] {
|
||||
@@ -51,6 +81,7 @@ export interface ViewContext {
|
||||
sourceSession: string;
|
||||
latestDirection: string;
|
||||
model: string;
|
||||
contextPercent?: number | null;
|
||||
since?: string;
|
||||
background: string;
|
||||
planReview?: string;
|
||||
@@ -61,9 +92,9 @@ export function workerView(entries: SessionEntry[], reason: "ready" | "settled"
|
||||
const since = context.since ? entries.findIndex(entry => entry.id === context.since) : -1;
|
||||
const from = since >= compactAt ? since + 1 : compactAt + 1;
|
||||
const fresh = entries.slice(from);
|
||||
const recent = fresh.flatMap(entry => entry.type === "message" && entry.message ? [text(entry.message)] : []).filter(Boolean).join("\n\n");
|
||||
const recent = compiledView(fresh.flatMap(entry => entry.type === "message" && entry.message ? [entry.message] : []));
|
||||
const summary = since < compactAt ? entries[compactAt]?.summary : undefined;
|
||||
const outstanding = outstandingTools(entries.slice(compactAt + 1));
|
||||
const state = reason === "ready" ? "is ready to begin" : idle ? "stopped" : "is still working";
|
||||
return `The worker ${state}.\n\nreview trigger: ${reason}\nsource session: ${bounded(context.sourceSession, 800)}\nworker model: ${bounded(context.model, 300)}\nlatest human direction:\n${bounded(context.latestDirection || "not recorded", 1800)}\ntool calls with no result: ${bounded(outstanding.join(", ") || "none", 500)}\ntracked background work: ${bounded(context.background, 800)}\n\n${context.planReview ? `Plan review:\n${bounded(context.planReview, 1800)}\n\n` : ""}${summary ? `compaction summary (worker account, not independent evidence):\n${bounded(summary, 2500)}\n\n` : ""}new worker transcript${since === -1 ? " (initial or reset view)" : " since the last acknowledged view"}:\n${bounded(recent || "No new messages.", 5500, true)}`;
|
||||
return `The worker ${state}.\n\nreview trigger: ${reason}\nsource session: ${bounded(context.sourceSession, 800)}\nworker model: ${bounded(context.model, 300)}${context.contextPercent == null ? "" : `; context used: ${context.contextPercent}%`}\nlatest human direction:\n${bounded(context.latestDirection || "not recorded", 1800)}\ntool calls with no result: ${bounded(outstanding.join(", ") || "none", 500)}\ntracked background work: ${bounded(context.background, 800)}\n\n${context.planReview ? `Plan review:\n${bounded(context.planReview, 1800)}\n\n` : ""}${summary ? `compaction summary (worker account, not independent evidence):\n${bounded(summary, 2500)}\n\n` : ""}new worker overview${since === -1 ? " (initial or reset view)" : " since the last acknowledged view"} (VCC algorithmic compression; local # refs index new messages; tool-result bodies omitted; inspect source for evidence):\n${recent}`;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ function setup(selectChoices: Array<string | undefined>, editorChoices: Array<st
|
||||
hasUI: true,
|
||||
isIdle: vi.fn(() => true),
|
||||
getSystemPrompt: () => "base prompt",
|
||||
getContextUsage: () => ({ percent: 25 }),
|
||||
model: { provider: "test", id: "tiny" },
|
||||
modelRegistry: { find: (provider: string, id: string) => ({ provider, id }) },
|
||||
sessionManager: {
|
||||
|
||||
@@ -35,3 +35,87 @@ it("bounds serialized Unicode and quoted logs while marking omissions", () => {
|
||||
expect(view).toContain("[truncated; inspect source session]");
|
||||
expect(view).toContain(context.sourceSession);
|
||||
});
|
||||
|
||||
it("keeps two recent thinking tails beside their actions without mutating the branch", () => {
|
||||
const entries = ["old", "middle", "new"].map(id => ({ id, type: "message", message: { role: "assistant", content: [
|
||||
{ type: "thinking", thinking: `${id} discarded head ${"padding ".repeat(100)}${id} decisive tail` },
|
||||
{ type: "toolCall", id, name: "bash", arguments: { command: `verify-${id}` } },
|
||||
] } }));
|
||||
const before = structuredClone(entries);
|
||||
const view = workerView(entries, "turns", false, context);
|
||||
expect(view).not.toContain("old decisive tail");
|
||||
expect(view).not.toContain("discarded head");
|
||||
expect(view).toContain("middle decisive tail");
|
||||
expect(view).toContain("new decisive tail");
|
||||
expect(view.indexOf("middle decisive tail")).toBeLessThan(view.indexOf("verify-middle"));
|
||||
expect(view.indexOf("verify-middle")).toBeLessThan(view.indexOf("new decisive tail"));
|
||||
expect(view.indexOf("new decisive tail")).toBeLessThan(view.indexOf("verify-new"));
|
||||
expect(entries).toEqual(before);
|
||||
});
|
||||
|
||||
it("extracts files and blockers, retaining tool arguments instead of verbose result bodies", () => {
|
||||
const entries = [
|
||||
entry("claim", "Cannot finish because the fixture is broken."),
|
||||
{ id: "write", type: "message", message: { role: "assistant", content: [{ type: "toolCall", id: "call", name: "write", arguments: { path: "result.txt", content: "artifact" } }] } },
|
||||
{ id: "result", type: "message", message: { role: "toolResult", toolName: "write", toolCallId: "call", content: "verbose-result-body".repeat(1000) } },
|
||||
];
|
||||
const view = workerView(entries, "settled", true, { ...context, contextPercent: 42, planReview: "goal: [/] -> [x], manual claim" });
|
||||
expect(view).toContain("[Files And Changes]");
|
||||
expect(view).toContain("Modified: result.txt");
|
||||
expect(view).toContain("[Outstanding Context]");
|
||||
expect(view).toContain("fixture is broken");
|
||||
expect(view).toContain('write "result.txt"');
|
||||
expect(view).toContain("tool calls with no result: none");
|
||||
expect(view).toContain(context.background);
|
||||
expect(view).toContain("context used: 42%");
|
||||
expect(view).toContain("goal: [/] -> [x], manual claim");
|
||||
expect(view).not.toContain("verbose-result-body");
|
||||
expect(view).toContain("tool-result bodies omitted; inspect source for evidence");
|
||||
expect(view).not.toContain("vcc_recall");
|
||||
});
|
||||
|
||||
it("preserves unanswered partial calls across the acknowledged boundary", () => {
|
||||
const entries = [{ id: "call", type: "message", message: { role: "assistant", content: [{ type: "toolCall", id: "pending", name: "edit" }] } }];
|
||||
expect(workerView(entries, "turns", false, context)).toContain("tool calls with no result: edit");
|
||||
const view = workerView(entries, "turns", false, { ...context, since: "call" });
|
||||
expect(view).toContain("tool calls with no result: edit");
|
||||
expect(view).toContain("No new messages.");
|
||||
});
|
||||
|
||||
it("restarts a rewound branch and keeps fresh headerless text after compaction", () => {
|
||||
const view = workerView([
|
||||
{ id: "compaction", type: "compaction", summary: "Prior worker account." }, entry("fresh", "Fresh decisive result."),
|
||||
], "settled", true, { ...context, since: "entry-on-discarded-branch", contextPercent: null });
|
||||
expect(view).toContain("initial or reset view");
|
||||
expect(view).toContain("Prior worker account.");
|
||||
expect(view).toContain("Fresh decisive result.");
|
||||
expect(view).not.toContain("context used:");
|
||||
});
|
||||
|
||||
it("protects VCC headers and newest actions when the compacted brief exceeds its budget", () => {
|
||||
const entries = [
|
||||
{ id: "write", type: "message", message: { role: "assistant", content: [{ type: "toolCall", id: "call", name: "write", arguments: { path: "important.txt", content: "artifact" } }] } },
|
||||
...Array.from({ length: 150 }, (_, i) => entry(`entry-${i}`, `Action ${i}: ${"details ".repeat(80)}`)),
|
||||
entry("last", "Newest decisive observation."),
|
||||
];
|
||||
const view = workerView(entries, "turns", false, context);
|
||||
expect(view).toContain("[Files And Changes]");
|
||||
expect(view).toContain("important.txt");
|
||||
expect(view).toContain("Newest decisive observation.");
|
||||
expect(view).toContain("[truncated; inspect source session]");
|
||||
expect(Buffer.byteLength(JSON.stringify({ text: view }))).toBeLessThan(16_000);
|
||||
});
|
||||
|
||||
it("distinguishes omitted result-only updates from no messages and extracts paired commit evidence", () => {
|
||||
const result = (content: string) => [{ id: "result", type: "message", message: { role: "toolResult", toolName: "bash", toolCallId: "done", content } }];
|
||||
const omitted = workerView(result("large diagnostic output"), "settled", true, context);
|
||||
expect(omitted).toContain("No overview text retained from these messages.");
|
||||
expect(omitted).not.toContain("No new messages.");
|
||||
const commit = workerView([
|
||||
{ id: "commit", type: "message", message: { role: "assistant", content: [{ type: "toolCall", id: "done", name: "bash", arguments: { command: 'git commit -m "Save verified artifact"' } }] } },
|
||||
...result("[main abc1234] Save verified artifact"),
|
||||
], "settled", true, context);
|
||||
expect(commit).toContain("[Commits]");
|
||||
expect(commit).toContain("abc1234");
|
||||
expect(commit).not.toContain("vcc_recall");
|
||||
});
|
||||
|
||||
+4
-1
@@ -3,7 +3,10 @@
|
||||
"target": "ES2022",
|
||||
"module": "ES2022",
|
||||
"moduleResolution": "bundler",
|
||||
"paths": { "pi-intercom": ["./src/intercom-package.d.ts"] },
|
||||
"paths": {
|
||||
"pi-intercom": ["./src/intercom-package.d.ts"],
|
||||
"@sting8k/pi-vcc/src/core/summarize": ["./src/vcc-package.d.ts"]
|
||||
},
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
|
||||
Reference in New Issue
Block a user