owlrunkit 0.20.0 → 0.21.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 (44) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +63 -10
  3. package/docs/architecture/OWLCODA_RUNKIT_0201_RELEASE_TRUTH_AND_PROFILE_NORMALIZATION_PATCH_DECISION_20260813.md +95 -0
  4. package/docs/architecture/OWLCODA_RUNKIT_021_TEAM_DELIVERY_PHASE2_PRODUCT_DECISION_20260813.md +249 -0
  5. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +92 -12
  6. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
  7. package/package.json +1 -1
  8. package/packages/attest/README.md +7 -1
  9. package/packages/attest/consumer-surface-v3.json +275 -0
  10. package/packages/attest/distribution-manifest-v1.json +14 -0
  11. package/packages/attest/schemas/canonical-candidate-identity-v1.schema.json +112 -0
  12. package/packages/attest/schemas/foreign-workspace-filesystem-identity-v1.schema.json +32 -0
  13. package/packages/attest/schemas/quick-verification-receipt-v4.schema.json +226 -0
  14. package/packages/attest/src/candidate-identity.mjs +454 -0
  15. package/packages/attest/src/index.mjs +11 -0
  16. package/packages/attest/src/quick-receipt-contract.mjs +126 -5
  17. package/packages/attest/src/quick.mjs +43 -8
  18. package/{registry-release-policy-v1.json → registry-release-policy-v2.json} +8 -9
  19. package/sbom.spdx.json +4 -4
  20. package/scripts/runkit-contract/core-contract.mjs +14 -1
  21. package/scripts/runkit-contract/fleet-skill-plan.mjs +223 -0
  22. package/scripts/runkit-contract/formal-workflow.mjs +3 -1
  23. package/scripts/runkit-contract/inspect-presentation.mjs +56 -0
  24. package/scripts/runkit-contract/install-codex-skill.mjs +1 -0
  25. package/scripts/runkit-contract/onboarding-bootstrap.mjs +15 -0
  26. package/scripts/runkit-contract/onboarding-doctor.mjs +201 -7
  27. package/scripts/runkit-contract/profile-onboarding.mjs +6 -0
  28. package/scripts/runkit-contract/project-cli-resolver.mjs +9 -1
  29. package/scripts/runkit-contract/quick-metrics.mjs +9 -5
  30. package/scripts/runkit-contract/quick-verify.mjs +108 -24
  31. package/scripts/runkit-contract/registry-adoption-gate.mjs +12 -3
  32. package/scripts/runkit-contract/registry-adoption.mjs +10 -5
  33. package/scripts/runkit-contract/runkit-cli.mjs +289 -19
  34. package/scripts/runkit-contract/schemas/delivery-lifecycle-v1.schema.json +91 -0
  35. package/scripts/runkit-contract/schemas/external-gate-v1.schema.json +68 -0
  36. package/scripts/runkit-contract/schemas/fleet-skill-upgrade-plan-v1.schema.json +140 -0
  37. package/scripts/runkit-contract/schemas/inspect-compact-v1.schema.json +93 -0
  38. package/scripts/runkit-contract/schemas/team-delivery-status-v2.schema.json +219 -0
  39. package/scripts/runkit-contract/schemas/team-project-event-v6.schema.json +82 -0
  40. package/scripts/runkit-contract/schemas/team-project-event-v7.schema.json +80 -0
  41. package/scripts/runkit-contract/schemas/team-project-status-v4.schema.json +208 -0
  42. package/scripts/runkit-contract/sync-release-identity.mjs +87 -0
  43. package/scripts/runkit-contract/team-delivery.mjs +128 -3
  44. package/scripts/runkit-contract/team-project.mjs +970 -9
@@ -9,6 +9,7 @@ import { parseJsonStrict } from "./quick-canonical.mjs";
9
9
  import {
10
10
  normalizeTeamProjectDefinitionV1,
11
11
  readTeamProjectStatusV3,
12
+ readTeamProjectStatusV4,
12
13
  teamProjectDefinitionBindingV1,
13
14
  } from "./team-project.mjs";
14
15
 
@@ -45,6 +46,10 @@ const TRANSFER_LIFECYCLES = new Set([
45
46
  "handoff_ack",
46
47
  "old_writer_release",
47
48
  ]);
49
+
50
+ function compareCodeUnits(left, right) {
51
+ return left < right ? -1 : left > right ? 1 : 0;
52
+ }
48
53
  const TRANSFER_VERIFICATION_STATUSES = new Set([
49
54
  "source_candidate_unverified",
50
55
  "source_candidate_verified",
@@ -470,6 +475,11 @@ function currentProjectStatus(workspaceRoot) {
470
475
  return readTeamProjectStatusV3({ workspaceRoot });
471
476
  }
472
477
 
478
+ function currentProjectStatusV2(workspaceRoot) {
479
+ if (!existsSync(projectDefinitionPath(workspaceRoot))) return null;
480
+ return readTeamProjectStatusV4({ workspaceRoot });
481
+ }
482
+
473
483
  function readProjectDefinition(workspaceRoot) {
474
484
  const { bytes } = readFileBytesBounded(projectDefinitionPath(workspaceRoot));
475
485
  return normalizeTeamProjectDefinitionV1(parseJsonStrict(decodeUtf8Strict(bytes)));
@@ -548,6 +558,32 @@ function uniqueSorted(values) {
548
558
  return [...new Set(values)].sort();
549
559
  }
550
560
 
561
+ function explicitCandidateInventory(project) {
562
+ if (project === null) return [];
563
+ return [
564
+ ...project.dataCandidates.map(candidate => ({
565
+ laneId: `data-candidate:${candidate.candidateId}`,
566
+ kind: "data_candidate",
567
+ artifactId: candidate.candidateId,
568
+ status: candidate.admissionStatus,
569
+ sourceRef: candidate.sourceRef,
570
+ actionable: candidate.admissionStatus !== "eligible_candidate",
571
+ modeledWorkItemId: null,
572
+ truthRefs: [...candidate.truthRefs],
573
+ })),
574
+ ...project.externalGates.map(gate => ({
575
+ laneId: `external-gate:${gate.gateId}`,
576
+ kind: "external_gate",
577
+ artifactId: gate.gateId,
578
+ status: gate.gateStatus,
579
+ sourceRef: gate.source.ref,
580
+ actionable: gate.blocking,
581
+ modeledWorkItemId: null,
582
+ truthRefs: [...gate.truthRefs],
583
+ })),
584
+ ].sort((left, right) => compareCodeUnits(left.laneId, right.laneId));
585
+ }
586
+
551
587
  function shellQuote(value) {
552
588
  return `'${String(value).replaceAll("'", `'"'"'`)}'`;
553
589
  }
@@ -642,9 +678,7 @@ export function recommendTeamDeliveryV1({ workspaceRoot } = {}) {
642
678
  return recommendationFromProject(currentProjectStatus(workspaceRoot), workspaceRoot);
643
679
  }
644
680
 
645
- export function readTeamDeliveryStatusV1({ workspaceRoot } = {}) {
646
- if (!nonEmptyString(workspaceRoot)) throw new Error("workspaceRoot is required.");
647
- const project = currentProjectStatus(workspaceRoot);
681
+ function teamDeliveryStatusFromProject(project, workspaceRoot) {
648
682
  const recommendation = recommendationFromProject(project, workspaceRoot);
649
683
  return {
650
684
  schemaVersion: "OwlCodaRunKitTeamDeliveryStatusV1",
@@ -671,6 +705,71 @@ export function readTeamDeliveryStatusV1({ workspaceRoot } = {}) {
671
705
  };
672
706
  }
673
707
 
708
+ export function readTeamDeliveryStatusV1({ workspaceRoot } = {}) {
709
+ if (!nonEmptyString(workspaceRoot)) throw new Error("workspaceRoot is required.");
710
+ return teamDeliveryStatusFromProject(currentProjectStatus(workspaceRoot), workspaceRoot);
711
+ }
712
+
713
+ function enrichedProjectWarnings(project) {
714
+ return (project?.warnings ?? []).map((warning) => {
715
+ const workItem = project.workItems.find(row => row.workItemId === warning.workItemId);
716
+ const completed = workItem?.status === "completed";
717
+ return {
718
+ ...warning,
719
+ severity: "warning",
720
+ blocking: false,
721
+ requiredAtGate: false,
722
+ recommendedAction: completed
723
+ ? "no_retroactive_action_required"
724
+ : "bind_quick_or_formal_receipt_if_reusable_evidence_is_required",
725
+ };
726
+ });
727
+ }
728
+
729
+ function aggregateWarningSummary(warnings) {
730
+ const groups = new Map();
731
+ for (const warning of warnings) {
732
+ const current = groups.get(warning.code) ?? {
733
+ code: warning.code,
734
+ severity: warning.severity,
735
+ blocking: warning.blocking,
736
+ count: 0,
737
+ workItemIds: [],
738
+ requiredAtGate: warning.requiredAtGate,
739
+ recommendedAction: warning.recommendedAction,
740
+ };
741
+ current.count += 1;
742
+ current.workItemIds.push(warning.workItemId);
743
+ if (current.recommendedAction !== warning.recommendedAction) {
744
+ current.recommendedAction = "review_individual_warning_actions";
745
+ }
746
+ groups.set(warning.code, current);
747
+ }
748
+ return {
749
+ count: warnings.length,
750
+ groups: [...groups.values()]
751
+ .map(group => ({ ...group, workItemIds: uniqueSorted(group.workItemIds) }))
752
+ .sort((left, right) => compareCodeUnits(left.code, right.code)),
753
+ };
754
+ }
755
+
756
+ export function readTeamDeliveryStatusV2({ workspaceRoot } = {}) {
757
+ if (!nonEmptyString(workspaceRoot)) throw new Error("workspaceRoot is required.");
758
+ const project = currentProjectStatusV2(workspaceRoot);
759
+ const legacy = teamDeliveryStatusFromProject(project, workspaceRoot);
760
+ const warnings = enrichedProjectWarnings(project);
761
+ return {
762
+ ...legacy,
763
+ schemaVersion: "OwlCodaRunKitTeamDeliveryStatusV2",
764
+ externalGates: project?.externalGates ?? [],
765
+ deliveryLifecycle: project?.deliveryLifecycle ?? null,
766
+ unmodeledCandidateLanes: explicitCandidateInventory(project),
767
+ nextAction: project?.nextAction ?? legacy.nextAction,
768
+ warnings,
769
+ warningSummary: aggregateWarningSummary(warnings),
770
+ };
771
+ }
772
+
674
773
  function bindPacketToProject(packet, project, definition, issueCodes) {
675
774
  if (!projectBindingValid(packet.projectBinding)) return;
676
775
  if (project === null) {
@@ -886,6 +985,32 @@ export function formatTeamDeliveryStatusHumanV1(result) {
886
985
  `Lanes: ${result.lanes.length}`,
887
986
  `Path conflicts: ${result.pathConflicts.length}`,
888
987
  `Acceptance gaps: ${result.acceptanceGaps.length}`,
988
+ ...(result.warningSummary?.count > 0
989
+ ? [`Warnings: ${result.warningSummary.count} non-blocking (${result.warningSummary.groups.map(group => `${group.code}:${group.count}`).join(", ")})`]
990
+ : []),
991
+ `Next: ${result.nextAction ?? "none"}`,
992
+ "Agent dispatch: not permitted.",
993
+ "Authority: not granted.",
994
+ "",
995
+ ].join("\n");
996
+ }
997
+
998
+ export function formatTeamDeliveryStatusHumanV2(result) {
999
+ return [
1000
+ `Team Delivery: ${result.recommendation.recommendedMode}`,
1001
+ `Project: ${result.projectId ?? "not initialized"}`,
1002
+ `Project state: ${result.projectOverall}`,
1003
+ `Graph source: ${result.graphSource}`,
1004
+ `Persisted team graph: ${result.persistedTeamGraph ? "yes" : "no"}`,
1005
+ `Lanes: ${result.lanes.length}`,
1006
+ `Path conflicts: ${result.pathConflicts.length}`,
1007
+ `Acceptance gaps: ${result.acceptanceGaps.length}`,
1008
+ `External Gates: ${result.externalGates.length}`,
1009
+ `Unmodeled candidate lanes: ${result.unmodeledCandidateLanes.length}`,
1010
+ `Delivery: ${result.deliveryLifecycle?.currentStage ?? "not initialized"}`,
1011
+ ...(result.warningSummary?.count > 0
1012
+ ? [`Warnings: ${result.warningSummary.count} non-blocking (${result.warningSummary.groups.map(group => `${group.code}:${group.count}`).join(", ")})`]
1013
+ : []),
889
1014
  `Next: ${result.nextAction ?? "none"}`,
890
1015
  "Agent dispatch: not permitted.",
891
1016
  "Authority: not granted.",