faberun 0.25.0 → 0.26.0

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.
Files changed (54) hide show
  1. package/package.json +1 -1
  2. package/skills/faberun/references/contract.md +34 -28
  3. package/src/campaign/campaign-brief-graph.mjs +218 -0
  4. package/src/campaign/campaign-brief.mjs +15 -167
  5. package/src/campaign/metrics-command.mjs +3 -1
  6. package/src/cli/brand.mjs +1 -0
  7. package/src/cli/plan.mjs +75 -3
  8. package/src/cli/setup.mjs +22 -5
  9. package/src/cli.mjs +35 -1
  10. package/src/contract/definition-of-done.mjs +48 -8
  11. package/src/contract/human-step.mjs +54 -0
  12. package/src/contract/index.mjs +25 -38
  13. package/src/contract/judge-independence.mjs +170 -0
  14. package/src/contract/judges.mjs +27 -0
  15. package/src/contract/provider.mjs +103 -0
  16. package/src/contract/runtime.mjs +19 -2
  17. package/src/contract/snapshot.mjs +31 -1
  18. package/src/contract/task-packet.mjs +4 -1
  19. package/src/contract/worker-result.mjs +35 -4
  20. package/src/engine/assignment.mjs +41 -5
  21. package/src/engine/backoff.mjs +30 -9
  22. package/src/engine/dispatch.mjs +19 -2
  23. package/src/engine/failover.mjs +10 -2
  24. package/src/engine/judge-gate.mjs +24 -4
  25. package/src/engine/judge-list.mjs +206 -0
  26. package/src/engine/lifecycle.mjs +29 -24
  27. package/src/engine/resume.mjs +49 -12
  28. package/src/engine/runtime-discovery.mjs +72 -11
  29. package/src/engine/scheduler.mjs +27 -6
  30. package/src/harnesses/catalogue.mjs +9 -2
  31. package/src/harnesses/index.mjs +2 -2
  32. package/src/harnesses/model-tiers.mjs +39 -0
  33. package/src/harnesses/protocol.mjs +4 -1
  34. package/src/host/config.mjs +7 -2
  35. package/src/plan/contest.mjs +78 -0
  36. package/src/plan/freeze.mjs +118 -7
  37. package/src/plan/human-step.mjs +38 -0
  38. package/src/plan/pipeline.mjs +224 -313
  39. package/src/plan/preflight.mjs +5 -3
  40. package/src/plan/proof-check.mjs +161 -0
  41. package/src/plan/proof-run.mjs +6 -2
  42. package/src/plan/proof-scope.mjs +175 -0
  43. package/src/plan/resolve.mjs +182 -0
  44. package/src/plan/reviewer.mjs +82 -0
  45. package/src/plan/rounds.mjs +446 -0
  46. package/src/plan/routing.mjs +11 -4
  47. package/src/plan/template.mjs +36 -14
  48. package/src/repo/signal-block.mjs +10 -3
  49. package/src/repo/source-identity.mjs +45 -5
  50. package/src/repo/worktree-prune.mjs +72 -0
  51. package/src/report/campaign-brief-estimate.mjs +1 -1
  52. package/src/report/campaign-brief.mjs +4 -0
  53. package/src/report/metrics-report.mjs +34 -1
  54. package/src/report/render.mjs +31 -10
@@ -0,0 +1,38 @@
1
+ /**
2
+ * R16: a requirement's `constraints` bullet can declare a step only the
3
+ * operator can perform (the planner and every worker run inside a sandbox
4
+ * that is never the operator's real environment). Detected here so
5
+ * freeze.mjs can carry it on the frozen plan as an explicit stop, and the
6
+ * Campaign Brief can list it among the human decisions. Pure text matching:
7
+ * no file I/O, no git, no model.
8
+ */
9
+
10
+ /** @typedef {{requirementId: string, step: string, command: string}} HumanStep */
11
+
12
+ /** The word a requirement's constraints must use to name the actor a worker cannot be. */
13
+ const OPERATOR_KEYWORD = /\boperator\b/iu;
14
+
15
+ /** The one command the declared step names, quoted the way the spec format already writes one (spec-format.md). */
16
+ const COMMAND_FENCE = /`([^`]+)`/u;
17
+
18
+ /**
19
+ * @param {import("./spec.mjs").SpecRequirement} requirement
20
+ * @returns {HumanStep|null}
21
+ */
22
+ export function detectHumanStep(requirement) {
23
+ const text = requirement.constraints;
24
+ if (!text || !OPERATOR_KEYWORD.test(text)) return null;
25
+ const command = COMMAND_FENCE.exec(text);
26
+ if (!command) return null;
27
+ return { requirementId: requirement.id ?? requirement.title, step: text, command: command[1] };
28
+ }
29
+
30
+ /**
31
+ * @param {import("./spec.mjs").SpecRequirement[]} requirements
32
+ * @returns {HumanStep[]}
33
+ */
34
+ export function collectHumanSteps(requirements) {
35
+ return requirements
36
+ .map((requirement) => detectHumanStep(requirement))
37
+ .filter((step) => step !== null);
38
+ }