speckl/reference-agent/src/till-done.ts
Scott Scoble 7297b5ec58 feat: whitepaper sections 2-6, README overhaul, SpeckDL spec v0.1, reference agent scaffold
- Dark Provenance whitepaper: complete sections 2-6 (What Is Dark Provenance,
  The Speckl Approach, Semantic Preservation & SA-11, Implications, Call to Action)
- README: public launch-ready with architecture, roadmap, getting started
- SpeckDL SPEC.md: v0.1 language specification with EBNF grammar,
  type system, compilation pipeline, 5 example Specks
- Reference agent: TypeScript scaffold with Orchestrator, TeamLead, SMEs
  (VerificationSME, CodegenSME), TillDone condition tracking,
  ProvenanceGraph, and CLI with example Specks
2026-04-28 09:33:48 -07:00

73 lines
No EOL
2.4 KiB
TypeScript

/**
* TillDone — Condition-based task tracking for Speckl.
*
* Tasks don't tick boxes. They evaluate predicates.
* "Done" means a proven condition is met.
*/
import type { TillDoneCondition, TaskResult } from "./types.js";
export class TillDoneTracker {
private conditions: Map<string, TillDoneCondition> = new Map();
/** Register a completion condition for a task. */
register(taskId: string, description: string, predicate: (result: TaskResult) => boolean): void {
this.conditions.set(taskId, {
taskId,
description,
predicate,
isDone: false,
});
}
/** Evaluate a task result against its condition. */
evaluate(taskId: string, result: TaskResult): boolean {
const condition = this.conditions.get(taskId);
if (!condition) {
throw new Error(`No TillDone condition registered for task ${taskId}`);
}
const satisfied = condition.predicate(result);
condition.isDone = satisfied;
return satisfied;
}
/** Check if a task's condition has been met. */
isDone(taskId: string): boolean {
return this.conditions.get(taskId)?.isDone ?? false;
}
/** Get all pending (not done) conditions. */
pending(): TillDoneCondition[] {
return [...this.conditions.values()].filter((c) => !c.isDone);
}
/** Get all completed conditions. */
completed(): TillDoneCondition[] {
return [...this.conditions.values()].filter((c) => c.isDone);
}
/** Built-in predicates for common Speckl conditions. */
static predicates = {
/** Z3 verification returned SAT (constraints satisfiable). */
z3Verified: (result: TaskResult): boolean =>
result.status === "success" &&
(result.output as Record<string, unknown>)?.z3Result === "sat",
/** All constraints are satisfiable (no contradictions). */
noContradictions: (result: TaskResult): boolean =>
result.status === "success" &&
(result.output as Record<string, unknown>)?.contradictions === 0,
/** Code generation produced valid output. */
codeGenerated: (result: TaskResult): boolean =>
result.status === "success" &&
typeof (result.output as Record<string, unknown>)?.code === "string",
/** Provenance graph is complete for this Speck. */
provenanceComplete: (result: TaskResult): boolean =>
result.status === "success" &&
Array.isArray(result.provenance) &&
result.provenance.length > 0,
};
}