feat: track fugu ultra access safely
This commit is contained in:
parent
518a26fdd9
commit
8cf1ff22f8
|
|
@ -24,6 +24,7 @@ describe("fableflow manifest", () => {
|
||||||
"zte-gate",
|
"zte-gate",
|
||||||
"factory-reconcile",
|
"factory-reconcile",
|
||||||
"model-access",
|
"model-access",
|
||||||
|
"fugu-ultra",
|
||||||
"rsi-canary",
|
"rsi-canary",
|
||||||
]));
|
]));
|
||||||
});
|
});
|
||||||
|
|
@ -48,6 +49,8 @@ describe("fableflow manifest", () => {
|
||||||
expect(edges).toContain("governance-contract>agent-chain-workers");
|
expect(edges).toContain("governance-contract>agent-chain-workers");
|
||||||
expect(edges).toContain("agent-chain-workers>zte-gate");
|
expect(edges).toContain("agent-chain-workers>zte-gate");
|
||||||
expect(edges).toContain("factory-reconcile>git-proxy-8099");
|
expect(edges).toContain("factory-reconcile>git-proxy-8099");
|
||||||
|
expect(edges).toContain("model-access>fugu-ultra");
|
||||||
|
expect(edges).toContain("fugu-ultra>agent-chain-workers");
|
||||||
expect(edges).toContain("deploy-webhook-8098>git-proxy-8099");
|
expect(edges).toContain("deploy-webhook-8098>git-proxy-8099");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,8 @@ export function createFableFlowManifest(): FableFlowManifest {
|
||||||
node("zte-gate", "ZTE Gate", "receipt", "verify", "gate", "plan/gate", "Verifier gate before deploy decisions", "src/fable5/zte-protocol.ts", ".fable/zte-receipts.jsonl", "ZT", 720, 360),
|
node("zte-gate", "ZTE Gate", "receipt", "verify", "gate", "plan/gate", "Verifier gate before deploy decisions", "src/fable5/zte-protocol.ts", ".fable/zte-receipts.jsonl", "ZT", 720, 360),
|
||||||
node("factory-reconcile", "Factory Reconcile", "receipt", "verify", "factory", "live receipt", "Live reconciliation overrides memory", "src/fable5/factory-reconciliation.ts", ".fable/factory/reconciliation-live.json", "RC", 960, 360),
|
node("factory-reconcile", "Factory Reconcile", "receipt", "verify", "factory", "live receipt", "Live reconciliation overrides memory", "src/fable5/factory-reconciliation.ts", ".fable/factory/reconciliation-live.json", "RC", 960, 360),
|
||||||
node("model-access", "Model Access", "receipt", "verify", "models", "access check", "Model access claims require fresh receipt", "src/fable5/model-access-receipt.ts", "fable.model_access.receipt.v1", "MA", 0, 540),
|
node("model-access", "Model Access", "receipt", "verify", "models", "access check", "Model access claims require fresh receipt", "src/fable5/model-access-receipt.ts", "fable.model_access.receipt.v1", "MA", 0, 540),
|
||||||
node("rsi-canary", "RSI Canary", "receipt", "verify", "rsi", "canary only", "Canary repair proven; broad autopatch remains unproven without fresh receipt", "fable rsi receipts", ".fable/rsi/canary-live-*.json", "RS", 240, 540),
|
node("fugu-ultra", "Fugu Ultra", "model", "verify", "models", "orchestration model", "Sakana Fugu Ultra candidate; unknown until model-access receipt verifies official access", "sakana/fugu-ultra access probe", "fable.model_access.receipt.v1", "FU", 240, 540),
|
||||||
|
node("rsi-canary", "RSI Canary", "receipt", "verify", "rsi", "canary only", "Canary repair proven; broad autopatch remains unproven without fresh receipt", "fable rsi receipts", ".fable/rsi/canary-live-*.json", "RS", 480, 540),
|
||||||
],
|
],
|
||||||
edges: [
|
edges: [
|
||||||
edge("feedbackpilot-intake", "forgejo-intake", "intake", "opens issue"),
|
edge("feedbackpilot-intake", "forgejo-intake", "intake", "opens issue"),
|
||||||
|
|
@ -81,6 +82,8 @@ export function createFableFlowManifest(): FableFlowManifest {
|
||||||
edge("factory-reconcile", "git-proxy-8099", "deploy", "canonical gated path"),
|
edge("factory-reconcile", "git-proxy-8099", "deploy", "canonical gated path"),
|
||||||
edge("deploy-webhook-8098", "git-proxy-8099", "legacy", "superseded by"),
|
edge("deploy-webhook-8098", "git-proxy-8099", "legacy", "superseded by"),
|
||||||
edge("forgejo-writeback", "forgejo", "intake", "comments/labels"),
|
edge("forgejo-writeback", "forgejo", "intake", "comments/labels"),
|
||||||
|
edge("model-access", "fugu-ultra", "verify", "tracks access"),
|
||||||
|
edge("fugu-ultra", "agent-chain-workers", "verify", "candidate worker after verified access"),
|
||||||
edge("model-access", "agent-chain-workers", "verify", "provider evidence"),
|
edge("model-access", "agent-chain-workers", "verify", "provider evidence"),
|
||||||
edge("rsi-canary", "zte-gate", "verify", "canary proof only"),
|
edge("rsi-canary", "zte-gate", "verify", "canary proof only"),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,16 @@ describe("model access receipt", () => {
|
||||||
expect(receipt.reasons).toContain("ChatGPT Cyber access not verified");
|
expect(receipt.reasons).toContain("ChatGPT Cyber access not verified");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("tracks Fugu Ultra without claiming access", () => {
|
||||||
|
const receipt = createModelAccessReceipt({
|
||||||
|
probes: [{ surface: "sakana-fugu", command: "sakana/fugu-ultra access probe", status: "unknown", model: "fugu-ultra", evidence: "not probed; do not buy or bypass with VPN" }],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(receipt.decision).toBe("blocked");
|
||||||
|
expect(receipt.claims).toEqual([]);
|
||||||
|
expect(receipt.reasons).toContain("one or more model surfaces are unknown");
|
||||||
|
});
|
||||||
|
|
||||||
it("writes a JSON receipt", () => {
|
it("writes a JSON receipt", () => {
|
||||||
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "model-access-"));
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "model-access-"));
|
||||||
const file = path.join(dir, "receipt.json");
|
const file = path.join(dir, "receipt.json");
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import * as fs from "node:fs";
|
import * as fs from "node:fs";
|
||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
|
|
||||||
export type ModelAccessSurface = "pi" | "openrouter" | "openai" | "chatgpt-cyber" | "other";
|
export type ModelAccessSurface = "pi" | "openrouter" | "openai" | "chatgpt-cyber" | "sakana-fugu" | "other";
|
||||||
export type ModelAccessStatus = "available" | "blocked" | "missing" | "unknown";
|
export type ModelAccessStatus = "available" | "blocked" | "missing" | "unknown";
|
||||||
|
|
||||||
export interface ModelAccessProbe {
|
export interface ModelAccessProbe {
|
||||||
|
|
|
||||||
|
|
@ -1968,6 +1968,7 @@ fable
|
||||||
{ surface: "openai" as const, command: "env OPENAI_API_KEY", status: process.env.OPENAI_API_KEY ? "unknown" as const : "missing" as const, evidence: process.env.OPENAI_API_KEY ? "key present; API not probed" : "OPENAI_API_KEY missing" },
|
{ surface: "openai" as const, command: "env OPENAI_API_KEY", status: process.env.OPENAI_API_KEY ? "unknown" as const : "missing" as const, evidence: process.env.OPENAI_API_KEY ? "key present; API not probed" : "OPENAI_API_KEY missing" },
|
||||||
{ surface: "pi" as const, command: "pi --list-models cyber", status: "unknown" as const, evidence: "not probed by this fail-closed receipt command" },
|
{ surface: "pi" as const, command: "pi --list-models cyber", status: "unknown" as const, evidence: "not probed by this fail-closed receipt command" },
|
||||||
{ surface: "chatgpt-cyber" as const, command: "https://chatgpt.com/cyber", status: "unknown" as const, evidence: "browser/login-gated surface not probed by this command" },
|
{ surface: "chatgpt-cyber" as const, command: "https://chatgpt.com/cyber", status: "unknown" as const, evidence: "browser/login-gated surface not probed by this command" },
|
||||||
|
{ surface: "sakana-fugu" as const, command: "sakana/fugu-ultra access probe", status: "unknown" as const, model: "fugu-ultra", evidence: "not probed; do not buy or bypass with VPN" },
|
||||||
];
|
];
|
||||||
const out = opts.output ?? path.join(".fable", "api", "model-access-live.json");
|
const out = opts.output ?? path.join(".fable", "api", "model-access-live.json");
|
||||||
const receipt = createModelAccessReceipt({ probes });
|
const receipt = createModelAccessReceipt({ probes });
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue