- 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
73 lines
No EOL
2.4 KiB
TypeScript
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,
|
|
};
|
|
} |