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.
- package/CHANGELOG.md +48 -0
- package/README.md +63 -10
- package/docs/architecture/OWLCODA_RUNKIT_0201_RELEASE_TRUTH_AND_PROFILE_NORMALIZATION_PATCH_DECISION_20260813.md +95 -0
- package/docs/architecture/OWLCODA_RUNKIT_021_TEAM_DELIVERY_PHASE2_PRODUCT_DECISION_20260813.md +249 -0
- package/integrations/codex/skills/owlcoda-runkit/SKILL.md +92 -12
- package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
- package/package.json +1 -1
- package/packages/attest/README.md +7 -1
- package/packages/attest/consumer-surface-v3.json +275 -0
- package/packages/attest/distribution-manifest-v1.json +14 -0
- package/packages/attest/schemas/canonical-candidate-identity-v1.schema.json +112 -0
- package/packages/attest/schemas/foreign-workspace-filesystem-identity-v1.schema.json +32 -0
- package/packages/attest/schemas/quick-verification-receipt-v4.schema.json +226 -0
- package/packages/attest/src/candidate-identity.mjs +454 -0
- package/packages/attest/src/index.mjs +11 -0
- package/packages/attest/src/quick-receipt-contract.mjs +126 -5
- package/packages/attest/src/quick.mjs +43 -8
- package/{registry-release-policy-v1.json → registry-release-policy-v2.json} +8 -9
- package/sbom.spdx.json +4 -4
- package/scripts/runkit-contract/core-contract.mjs +14 -1
- package/scripts/runkit-contract/fleet-skill-plan.mjs +223 -0
- package/scripts/runkit-contract/formal-workflow.mjs +3 -1
- package/scripts/runkit-contract/inspect-presentation.mjs +56 -0
- package/scripts/runkit-contract/install-codex-skill.mjs +1 -0
- package/scripts/runkit-contract/onboarding-bootstrap.mjs +15 -0
- package/scripts/runkit-contract/onboarding-doctor.mjs +201 -7
- package/scripts/runkit-contract/profile-onboarding.mjs +6 -0
- package/scripts/runkit-contract/project-cli-resolver.mjs +9 -1
- package/scripts/runkit-contract/quick-metrics.mjs +9 -5
- package/scripts/runkit-contract/quick-verify.mjs +108 -24
- package/scripts/runkit-contract/registry-adoption-gate.mjs +12 -3
- package/scripts/runkit-contract/registry-adoption.mjs +10 -5
- package/scripts/runkit-contract/runkit-cli.mjs +289 -19
- package/scripts/runkit-contract/schemas/delivery-lifecycle-v1.schema.json +91 -0
- package/scripts/runkit-contract/schemas/external-gate-v1.schema.json +68 -0
- package/scripts/runkit-contract/schemas/fleet-skill-upgrade-plan-v1.schema.json +140 -0
- package/scripts/runkit-contract/schemas/inspect-compact-v1.schema.json +93 -0
- package/scripts/runkit-contract/schemas/team-delivery-status-v2.schema.json +219 -0
- package/scripts/runkit-contract/schemas/team-project-event-v6.schema.json +82 -0
- package/scripts/runkit-contract/schemas/team-project-event-v7.schema.json +80 -0
- package/scripts/runkit-contract/schemas/team-project-status-v4.schema.json +208 -0
- package/scripts/runkit-contract/sync-release-identity.mjs +87 -0
- package/scripts/runkit-contract/team-delivery.mjs +128 -3
- 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
|
-
|
|
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.",
|