Refresh operator dashboard readiness markers

This commit is contained in:
Affaan Mustafa
2026-05-17 14:26:16 -04:00
parent ffcde01e4b
commit f9bf94b246
2 changed files with 98 additions and 10 deletions

View File

@@ -264,10 +264,17 @@ function hasAgentShieldEnterpriseTracking(roadmap) {
|| roadmap.includes('AgentShield #91') || roadmap.includes('AgentShield #91')
|| roadmap.includes('checksum-backed policy export') || roadmap.includes('checksum-backed policy export')
|| roadmap.includes('#78-#90') || roadmap.includes('#78-#90')
|| roadmap.includes('hosted promotion judge audit traces')
|| roadmap.includes('operator-visible promotion output values')
); );
} }
function agentShieldEnterpriseGap(roadmap) { function agentShieldEnterpriseGap(roadmap) {
if (roadmap.includes('hosted promotion judge audit traces')
|| roadmap.includes('operator-visible promotion output values')) {
return 'deepen live operator approval/readback after Marketplace/payment gates';
}
if (roadmap.includes('#78-#92') if (roadmap.includes('#78-#92')
|| roadmap.includes('AgentShield PR #92') || roadmap.includes('AgentShield PR #92')
|| roadmap.includes('AgentShield #92') || roadmap.includes('AgentShield #92')
@@ -284,6 +291,63 @@ function agentShieldEnterpriseGap(roadmap) {
: 'durable policy export and fleet-review workflow automation remain pending after reviewItems shipped'; : 'durable policy export and fleet-review workflow automation remain pending after reviewItems shipped';
} }
function agentShieldEnterpriseEvidence(roadmap) {
if (roadmap.includes('hosted promotion judge audit traces')
|| roadmap.includes('operator-visible promotion output values')) {
return 'AgentShield policy promotion `reviewItems` landed in `87aec47`; package-manager hardening drift detection landed in `28d08c7`; workflow action runtime pins were refreshed in `659f569`; npm age-gate guidance was corrected in `ee585cd`; package-manager hardening Action outputs landed in `1124535`; policy-promotion Action outputs and runtime-smoke job-summary evidence landed in `1593925`; ECC-Tools consumes those outputs in `8658951`, surfaces operator-readable status/pack/count/digest telemetry in `16c537f`, and renders hosted promotion judge audit traces in `05d4e82`; all are mirrored in the GA roadmap';
}
return 'AgentShield enterprise PR evidence is mirrored in the GA roadmap';
}
function eccToolsNextLevelEvidence(roadmap) {
if (roadmap.includes('production Marketplace readback state')
|| roadmap.includes('eb69412')) {
return 'billing announcement gate, hosted analysis lanes, AgentShield fleet-summary consumption, hosted finding evidence paths, harness-route policy linking, policy-promotion Action-output telemetry, operator-visible promotion output details, hosted promotion judge audit traces, billing announcement preflight, and production KV readback state are mirrored in the GA roadmap';
}
if (roadmap.includes('hosted promotion judge audit traces')
|| roadmap.includes('operator-visible promotion output values')) {
return 'billing announcement gate, hosted analysis lanes, AgentShield fleet-summary consumption, hosted finding evidence paths, harness-route policy linking, policy-promotion Action-output telemetry, operator-visible promotion output details, and hosted promotion judge audit traces are mirrored in the GA roadmap';
}
return 'billing announcement gate, hosted analysis lanes, AgentShield fleet-summary consumption, hosted finding evidence paths, and harness-route policy linking are mirrored in the GA roadmap';
}
function eccToolsNextLevelGap(roadmap) {
if (roadmap.includes('production Marketplace readback state')
|| roadmap.includes('eb69412')) {
return 'complete Marketplace purchase/webhook readback, then run the live announcement gate';
}
if (roadmap.includes('hosted promotion judge audit traces')
|| roadmap.includes('operator-visible promotion output values')) {
return 'live Marketplace test-account readback pending';
}
return 'live Marketplace test-account readback, hosted promotion telemetry, and richer operator review UX pending';
}
function supplyChainLocalProtectionEvidence({ roadmap, scripts }) {
if (scripts['security:advisory-sources'] === 'node scripts/ci/supply-chain-advisory-sources.js'
&& roadmap.includes('package-manager hardening Action outputs')) {
return 'scheduled supply-chain watch emits IOC/advisory-source refresh artifacts; AgentShield now detects known AI-tool persistence IOCs, npm lifecycle/token drift, unsupported npm age-key drift, and pnpm/Yarn cooldown drift; ITO-57 has May 17 Linear evidence updates';
}
return scripts['security:advisory-sources'] === 'node scripts/ci/supply-chain-advisory-sources.js'
? 'scheduled supply-chain watch now emits IOC and advisory-source refresh artifacts'
: 'scheduled supply-chain watch or advisory-source command is missing';
}
function supplyChainLocalProtectionGap({ roadmap, scripts }) {
if (scripts['security:advisory-sources'] === 'node scripts/ci/supply-chain-advisory-sources.js'
&& roadmap.includes('package-manager hardening Action outputs')) {
return 'repeat advisory/source refresh and Linear sync after each significant supply-chain batch';
}
return 'Linear status synchronization remains ITO-57 follow-up after each significant merge batch';
}
function runCommand(command, args, options = {}) { function runCommand(command, args, options = {}) {
const result = spawnSync(command, args, { const result = spawnSync(command, args, {
cwd: options.cwd, cwd: options.cwd,
@@ -437,7 +501,7 @@ function buildRequirements(rootDir, platformReport) {
hasAgentShieldEnterpriseTracking(roadmap) hasAgentShieldEnterpriseTracking(roadmap)
? 'in_progress' ? 'in_progress'
: 'not_complete', : 'not_complete',
'AgentShield enterprise PR evidence is mirrored in the GA roadmap', agentShieldEnterpriseEvidence(roadmap),
agentShieldEnterpriseGap(roadmap) agentShieldEnterpriseGap(roadmap)
), ),
buildRequirement( buildRequirement(
@@ -447,8 +511,8 @@ function buildRequirements(rootDir, platformReport) {
includesAll(roadmap, ['ECC-Tools PR #78', 'hosted promotion', 'announcementGate']) includesAll(roadmap, ['ECC-Tools PR #78', 'hosted promotion', 'announcementGate'])
? 'in_progress' ? 'in_progress'
: 'not_complete', : 'not_complete',
'billing announcement gate, hosted analysis lanes, AgentShield fleet-summary consumption, hosted finding evidence paths, and harness-route policy linking are mirrored in the GA roadmap', eccToolsNextLevelEvidence(roadmap),
'live Marketplace test-account readback, hosted promotion telemetry, and richer operator review UX pending' eccToolsNextLevelGap(roadmap)
), ),
buildRequirement( buildRequirement(
'legacy-salvage', 'legacy-salvage',
@@ -486,17 +550,15 @@ function buildRequirements(rootDir, platformReport) {
buildRequirement( buildRequirement(
'supply-chain-local-protection', 'supply-chain-local-protection',
'Keep Mini Shai-Hulud/TanStack protection loop current', 'Keep Mini Shai-Hulud/TanStack protection loop current',
'supply-chain watch plus runbook', 'supply-chain watch plus runbook plus AgentShield package-manager hardening',
includesAll(supplyChainRunbook, ['TanStack', 'Mini Shai-Hulud', 'scan-supply-chain-iocs.js', 'supply-chain-advisory-sources.js']) includesAll(supplyChainRunbook, ['TanStack', 'Mini Shai-Hulud', 'scan-supply-chain-iocs.js', 'supply-chain-advisory-sources.js'])
&& includesAll(supplyChainWorkflow, ['supply-chain-advisory-sources.js', 'supply-chain-advisory-sources.json']) && includesAll(supplyChainWorkflow, ['supply-chain-advisory-sources.js', 'supply-chain-advisory-sources.json'])
&& scripts['security:advisory-sources'] === 'node scripts/ci/supply-chain-advisory-sources.js' && scripts['security:advisory-sources'] === 'node scripts/ci/supply-chain-advisory-sources.js'
&& fileExists(rootDir, '.github/workflows/supply-chain-watch.yml') && fileExists(rootDir, '.github/workflows/supply-chain-watch.yml')
? 'current' ? 'current'
: 'in_progress', : 'in_progress',
scripts['security:advisory-sources'] === 'node scripts/ci/supply-chain-advisory-sources.js' supplyChainLocalProtectionEvidence({ roadmap, scripts }),
? 'scheduled supply-chain watch now emits IOC and advisory-source refresh artifacts' supplyChainLocalProtectionGap({ roadmap, scripts })
: 'scheduled supply-chain watch or advisory-source command is missing',
'Linear status synchronization remains ITO-57 follow-up after each significant merge batch'
), ),
]; ];
} }
@@ -550,7 +612,7 @@ function buildReport(options) {
next_work_order: [ next_work_order: [
'Regenerate this dashboard from the final release commit before publication evidence is recorded.', 'Regenerate this dashboard from the final release commit before publication evidence is recorded.',
'Continue ITO-57 with Linear status synchronization for the scheduled supply-chain watch advisory-source report.', 'Continue ITO-57 with Linear status synchronization for the scheduled supply-chain watch advisory-source report.',
'Advance ECC Tools live Marketplace test-account readback before publishing native-payments announcement copy.', 'Complete ECC Tools Marketplace purchase/webhook readback, then run preflight and the live announcement gate before publishing native-payments copy.',
'Resume ITO-45, ITO-46, and ITO-56 only after the generated dashboard and final release gates are refreshed.', 'Resume ITO-45, ITO-46, and ITO-56 only after the generated dashboard and final release gates are refreshed.',
], ],
}; };

View File

@@ -51,6 +51,11 @@ function seedRepo(rootDir, overrides = {}) {
'AgentShield Enterprise Iteration', 'AgentShield Enterprise Iteration',
'ECC-Tools PR #78', 'ECC-Tools PR #78',
'hosted promotion', 'hosted promotion',
'operator-visible promotion output values',
'hosted promotion judge audit traces',
'package-manager hardening Action outputs',
'production Marketplace readback state',
'eb69412',
'announcementGate', 'announcementGate',
'ITO-55' 'ITO-55'
].join('\n'), ].join('\n'),
@@ -190,7 +195,24 @@ function runTests() {
assert.ok(report.requirements.some(item => item.id === 'ecc-tools-next-level' && item.status === 'in_progress')); assert.ok(report.requirements.some(item => item.id === 'ecc-tools-next-level' && item.status === 'in_progress'));
assert.ok(report.requirements.some(item => ( assert.ok(report.requirements.some(item => (
item.id === 'agentshield-enterprise-iteration' item.id === 'agentshield-enterprise-iteration'
&& item.gap === 'workflow automation around protected rollout and richer runtime review UX pending after policy promotion shipped' && item.gap === 'deepen live operator approval/readback after Marketplace/payment gates'
&& item.evidence.includes('policy-promotion Action outputs')
&& item.evidence.includes('hosted promotion judge audit traces')
)));
assert.ok(report.requirements.some(item => (
item.id === 'ecc-tools-next-level'
&& item.gap === 'complete Marketplace purchase/webhook readback, then run the live announcement gate'
&& item.evidence.includes('operator-visible promotion output details')
&& item.evidence.includes('hosted promotion judge audit traces')
&& item.evidence.includes('billing announcement preflight')
&& item.evidence.includes('production KV readback state')
)));
assert.ok(report.requirements.some(item => (
item.id === 'supply-chain-local-protection'
&& item.artifact.includes('AgentShield package-manager hardening')
&& item.evidence.includes('known AI-tool persistence IOCs')
&& item.evidence.includes('unsupported npm age-key drift')
&& item.gap === 'repeat advisory/source refresh and Linear sync after each significant supply-chain batch'
))); )));
assert.ok(report.top_actions.some(item => item.id === 'naming-and-plugin-publication')); assert.ok(report.top_actions.some(item => item.id === 'naming-and-plugin-publication'));
} finally { } finally {
@@ -216,6 +238,10 @@ function runTests() {
marker: 'checksum-verified policy promotion', marker: 'checksum-verified policy promotion',
gap: 'workflow automation around protected rollout and richer runtime review UX pending after policy promotion shipped' gap: 'workflow automation around protected rollout and richer runtime review UX pending after policy promotion shipped'
}, },
{
marker: 'hosted promotion judge audit traces',
gap: 'deepen live operator approval/readback after Marketplace/payment gates'
},
{ {
marker: '#78-#91', marker: '#78-#91',
gap: 'workflow automation plus policy promotion/review UX pending after policy export shipped' gap: 'workflow automation plus policy promotion/review UX pending after policy export shipped'