@nebulacomponents/citable 1.12.0 → 1.13.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 +140 -0
- package/README.md +23 -1
- package/dist/universal/.agents/skills/citable/SKILL.md +12 -1
- package/dist/universal/.agents/skills/citable/VERSION +1 -1
- package/dist/universal/.agents/skills/citable/commands/README.md +2 -1
- package/dist/universal/.agents/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.agents/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.agents/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.agents/skills/citable/manifest.json +30 -10
- package/dist/universal/.agents/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.agents/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.agents/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.agents/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.agents/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.agents/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.agents/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.agents/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.agents/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.agents/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.agents/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.agents/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.agents/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.agents/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.agents/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.agents/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.agents/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.agents/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.agents/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.agents/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.agents/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.claude/skills/citable/SKILL.md +12 -1
- package/dist/universal/.claude/skills/citable/VERSION +1 -1
- package/dist/universal/.claude/skills/citable/commands/README.md +2 -1
- package/dist/universal/.claude/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.claude/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.claude/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.claude/skills/citable/manifest.json +30 -10
- package/dist/universal/.claude/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.claude/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.claude/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.claude/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.claude/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.claude/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.claude/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.claude/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.claude/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.claude/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.claude/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.claude/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.claude/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.claude/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.claude/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.claude/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.claude/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.claude/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.claude/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.claude/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.claude/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.cursor/skills/citable/SKILL.md +12 -1
- package/dist/universal/.cursor/skills/citable/VERSION +1 -1
- package/dist/universal/.cursor/skills/citable/commands/README.md +2 -1
- package/dist/universal/.cursor/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.cursor/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.cursor/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.cursor/skills/citable/manifest.json +30 -10
- package/dist/universal/.cursor/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.cursor/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.cursor/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.cursor/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.cursor/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.cursor/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.cursor/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.cursor/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.cursor/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.cursor/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.cursor/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.cursor/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.cursor/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.cursor/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.cursor/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.cursor/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.cursor/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.cursor/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.cursor/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.cursor/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.cursor/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.gemini/skills/citable/SKILL.md +12 -1
- package/dist/universal/.gemini/skills/citable/VERSION +1 -1
- package/dist/universal/.gemini/skills/citable/commands/README.md +2 -1
- package/dist/universal/.gemini/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.gemini/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.gemini/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.gemini/skills/citable/manifest.json +30 -10
- package/dist/universal/.gemini/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.gemini/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.gemini/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.gemini/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.gemini/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.gemini/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.gemini/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.gemini/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.gemini/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.gemini/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.gemini/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.gemini/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.gemini/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.gemini/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.gemini/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.gemini/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.gemini/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.gemini/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.gemini/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.gemini/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.gemini/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.github/skills/citable/SKILL.md +12 -1
- package/dist/universal/.github/skills/citable/VERSION +1 -1
- package/dist/universal/.github/skills/citable/commands/README.md +2 -1
- package/dist/universal/.github/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.github/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.github/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.github/skills/citable/manifest.json +30 -10
- package/dist/universal/.github/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.github/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.github/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.github/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.github/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.github/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.github/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.github/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.github/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.github/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.github/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.github/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.github/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.github/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.github/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.github/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.github/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.github/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.github/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.github/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.github/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.kiro/skills/citable/SKILL.md +12 -1
- package/dist/universal/.kiro/skills/citable/VERSION +1 -1
- package/dist/universal/.kiro/skills/citable/commands/README.md +2 -1
- package/dist/universal/.kiro/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.kiro/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.kiro/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.kiro/skills/citable/manifest.json +30 -10
- package/dist/universal/.kiro/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.kiro/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.kiro/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.kiro/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.kiro/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.kiro/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.kiro/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.kiro/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.kiro/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.kiro/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.kiro/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.kiro/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.kiro/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.kiro/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.kiro/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.kiro/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.kiro/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.kiro/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.kiro/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.kiro/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.kiro/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.opencode/skills/citable/SKILL.md +12 -1
- package/dist/universal/.opencode/skills/citable/VERSION +1 -1
- package/dist/universal/.opencode/skills/citable/commands/README.md +2 -1
- package/dist/universal/.opencode/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.opencode/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.opencode/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.opencode/skills/citable/manifest.json +30 -10
- package/dist/universal/.opencode/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.opencode/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.opencode/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.opencode/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.opencode/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.opencode/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.opencode/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.opencode/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.opencode/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.opencode/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.opencode/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.opencode/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.opencode/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.opencode/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.opencode/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.opencode/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.opencode/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.opencode/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.opencode/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.opencode/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.opencode/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.pi/agent/skills/citable/SKILL.md +12 -1
- package/dist/universal/.pi/agent/skills/citable/VERSION +1 -1
- package/dist/universal/.pi/agent/skills/citable/commands/README.md +2 -1
- package/dist/universal/.pi/agent/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.pi/agent/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.pi/agent/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.pi/agent/skills/citable/manifest.json +30 -10
- package/dist/universal/.pi/agent/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.pi/agent/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.pi/agent/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.pi/agent/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.qoder/skills/citable/SKILL.md +12 -1
- package/dist/universal/.qoder/skills/citable/VERSION +1 -1
- package/dist/universal/.qoder/skills/citable/commands/README.md +2 -1
- package/dist/universal/.qoder/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.qoder/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.qoder/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.qoder/skills/citable/manifest.json +30 -10
- package/dist/universal/.qoder/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.qoder/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.qoder/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.qoder/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.qoder/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.qoder/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.qoder/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.qoder/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.qoder/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.qoder/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.qoder/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.qoder/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.qoder/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.qoder/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.qoder/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.qoder/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.qoder/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.qoder/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.qoder/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.qoder/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.qoder/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.rovodev/skills/citable/SKILL.md +12 -1
- package/dist/universal/.rovodev/skills/citable/VERSION +1 -1
- package/dist/universal/.rovodev/skills/citable/commands/README.md +2 -1
- package/dist/universal/.rovodev/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.rovodev/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.rovodev/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.rovodev/skills/citable/manifest.json +30 -10
- package/dist/universal/.rovodev/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.rovodev/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.rovodev/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.rovodev/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.rovodev/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.rovodev/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.rovodev/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.rovodev/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.rovodev/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.rovodev/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.rovodev/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.rovodev/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.rovodev/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.rovodev/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.rovodev/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.rovodev/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.rovodev/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.rovodev/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.rovodev/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.rovodev/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.rovodev/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.trae/skills/citable/SKILL.md +12 -1
- package/dist/universal/.trae/skills/citable/VERSION +1 -1
- package/dist/universal/.trae/skills/citable/commands/README.md +2 -1
- package/dist/universal/.trae/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.trae/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.trae/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.trae/skills/citable/manifest.json +30 -10
- package/dist/universal/.trae/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.trae/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.trae/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.trae/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.trae/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.trae/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.trae/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.trae/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.trae/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.trae/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.trae/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.trae/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.trae/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.trae/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.trae/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.trae/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.trae/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.trae/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.trae/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.trae/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.trae/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/.trae-cn/skills/citable/SKILL.md +12 -1
- package/dist/universal/.trae-cn/skills/citable/VERSION +1 -1
- package/dist/universal/.trae-cn/skills/citable/commands/README.md +2 -1
- package/dist/universal/.trae-cn/skills/citable/commands/artifact-interchange.md +28 -0
- package/dist/universal/.trae-cn/skills/citable/commands/field-validation.md +71 -0
- package/dist/universal/.trae-cn/skills/citable/commands/observe-and-act.md +5 -0
- package/dist/universal/.trae-cn/skills/citable/manifest.json +30 -10
- package/dist/universal/.trae-cn/skills/citable/references/aeo-geo-validation.md +1 -1
- package/dist/universal/.trae-cn/skills/citable/references/capability-boundaries.md +1 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/artifact-interchange.schema.json +58 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/assumption.schema.json +119 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/customer-outcome.schema.json +119 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/decision.schema.json +154 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/deployment-receipt.schema.json +51 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/initiative.schema.json +185 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/kpi.schema.json +108 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/observation.schema.json +1 -1
- package/dist/universal/.trae-cn/skills/citable/schemas/release-manifest.schema.json +74 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/release-state.schema.json +40 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/risk.schema.json +172 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/scenario.schema.json +165 -0
- package/dist/universal/.trae-cn/skills/citable/schemas/variance.schema.json +112 -0
- package/dist/universal/manifest.json +363 -123
- package/package.json +4 -1
- package/release/surfaces.json +21 -0
- package/schemas/acceptance-corpus.schema.json +168 -0
- package/schemas/acceptance-run-context.schema.json +17 -0
- package/schemas/acceptance-run-receipt.schema.json +88 -0
- package/schemas/artifact-interchange.schema.json +58 -0
- package/schemas/assumption.schema.json +119 -0
- package/schemas/browser-evidence-plan.schema.json +76 -0
- package/schemas/corpus-publication-receipt.schema.json +24 -0
- package/schemas/customer-outcome.schema.json +119 -0
- package/schemas/decision.schema.json +154 -0
- package/schemas/deployment-receipt.schema.json +51 -0
- package/schemas/field-validation-metrics.schema.json +15 -0
- package/schemas/initiative.schema.json +185 -0
- package/schemas/kpi.schema.json +108 -0
- package/schemas/observation.schema.json +1 -1
- package/schemas/release-manifest.schema.json +74 -0
- package/schemas/release-state.schema.json +40 -0
- package/schemas/risk.schema.json +172 -0
- package/schemas/scenario.schema.json +165 -0
- package/schemas/variance.schema.json +112 -0
- package/scripts/release-governance.js +123 -0
- package/skill/SKILL.md +12 -1
- package/skill/commands/README.md +2 -1
- package/skill/commands/artifact-interchange.md +28 -0
- package/skill/commands/field-validation.md +71 -0
- package/skill/commands/observe-and-act.md +5 -0
- package/skill/references/aeo-geo-validation.md +1 -1
- package/skill/references/capability-boundaries.md +1 -0
- package/src/acceptance/reproducibility.js +180 -0
- package/src/artifacts/interchange.js +179 -0
- package/src/cli/index.js +143 -4
- package/src/commands/assumptionAudit.js +111 -0
- package/src/commands/audit.js +6 -0
- package/src/commands/boardReport.js +251 -0
- package/src/commands/competitiveIntel.js +124 -0
- package/src/commands/corpus.js +322 -0
- package/src/commands/decisionMemo.js +202 -0
- package/src/commands/executive.js +167 -0
- package/src/commands/executiveReview.js +206 -0
- package/src/commands/init.js +14 -1
- package/src/commands/kpi.js +86 -0
- package/src/commands/monitor.js +9 -0
- package/src/commands/observe.js +84 -2
- package/src/commands/outcomes.js +113 -0
- package/src/commands/prioritize.js +108 -0
- package/src/commands/risk.js +104 -0
- package/src/commands/scenario.js +98 -0
- package/src/commands/variance.js +102 -0
- package/src/detectors/framework.js +37 -0
- package/src/detectors/page.js +10 -10
- package/src/detectors/tech.js +5 -3
- package/src/extractor/site.js +21 -6
- package/src/observations/browserJourney.js +167 -0
- package/src/observations/media.js +8 -1
- package/src/registries/index.js +107 -6
- package/src/release/governance.js +331 -0
- package/src/shared/asOf.js +18 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { execFileSync } from 'node:child_process';
|
|
5
|
+
import {
|
|
6
|
+
createDeploymentReceipt,
|
|
7
|
+
generateReleaseManifest,
|
|
8
|
+
initializeReleaseState,
|
|
9
|
+
transitionRelease,
|
|
10
|
+
validateReleaseManifest,
|
|
11
|
+
verifyManifestIntegrity,
|
|
12
|
+
verifyRepositoryBinding,
|
|
13
|
+
} from '../src/release/governance.js';
|
|
14
|
+
import { writeJson } from '../src/shared/io.js';
|
|
15
|
+
|
|
16
|
+
function read(file) {
|
|
17
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function generatedFiles(dir) {
|
|
21
|
+
const files = {};
|
|
22
|
+
for (const [name, key] of [['resource-data.json', 'release/resource-data.json'], ['llms.txt', 'release/llms.txt']]) {
|
|
23
|
+
const file = path.join(dir, name);
|
|
24
|
+
if (fs.existsSync(file)) files[key] = fs.readFileSync(file, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
return files;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function requireArg(value, usage) {
|
|
30
|
+
if (!value) throw new Error(usage);
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function runReleaseGovernance(argv, root = process.cwd()) {
|
|
35
|
+
const [command, ...args] = argv;
|
|
36
|
+
if (command === 'manifest') {
|
|
37
|
+
const outputDir = path.resolve(requireArg(args[0], 'manifest requires <output-dir>'));
|
|
38
|
+
const commit = args[1];
|
|
39
|
+
const boundCommit = commit || execFileCommit(root);
|
|
40
|
+
const binding = verifyRepositoryBinding(root, boundCommit);
|
|
41
|
+
if (!binding.ok) throw new Error(`release source binding failed: ${binding.failures.join('; ')}`);
|
|
42
|
+
const result = generateReleaseManifest(root, { outputDir, commit: boundCommit });
|
|
43
|
+
return { command, output: path.join(outputDir, 'release-manifest.json'), manifest: result.manifest };
|
|
44
|
+
}
|
|
45
|
+
if (command === 'validate') {
|
|
46
|
+
const manifestFile = path.resolve(requireArg(args[0], 'validate requires <manifest-file>'));
|
|
47
|
+
const projectionDir = path.resolve(args[1] || path.dirname(manifestFile));
|
|
48
|
+
const manifest = read(manifestFile);
|
|
49
|
+
const binding = verifyRepositoryBinding(root, manifest.commit);
|
|
50
|
+
if (!binding.ok) throw new Error(`release source binding failed: ${binding.failures.join('; ')}`);
|
|
51
|
+
const result = validateReleaseManifest(root, manifest, generatedFiles(projectionDir));
|
|
52
|
+
if (!result.ok) throw new Error(`phase-one release validation failed: ${result.failures.join('; ')}`);
|
|
53
|
+
return { command, ok: true };
|
|
54
|
+
}
|
|
55
|
+
if (command === 'state-init') {
|
|
56
|
+
const manifestFile = path.resolve(requireArg(args[0], 'state-init requires <manifest-file> <output-file> <actor>'));
|
|
57
|
+
const outputFile = path.resolve(requireArg(args[1], 'state-init requires <manifest-file> <output-file> <actor>'));
|
|
58
|
+
const actor = requireArg(args[2], 'state-init requires <manifest-file> <output-file> <actor>');
|
|
59
|
+
const manifest = read(manifestFile);
|
|
60
|
+
const integrity = verifyManifestIntegrity(manifest);
|
|
61
|
+
if (!integrity.ok) throw new Error(`manifest integrity failed: ${integrity.failures.join('; ')}`);
|
|
62
|
+
const state = initializeReleaseState(manifest, { actor, maxDwellHours: Number(process.env.CITABLE_RELEASE_DWELL_HOURS || 24) });
|
|
63
|
+
writeJson(outputFile, state);
|
|
64
|
+
return { command, output: outputFile, state };
|
|
65
|
+
}
|
|
66
|
+
if (command === 'state-publish') {
|
|
67
|
+
const manifestFile = path.resolve(requireArg(args[0], 'state-publish requires <manifest-file> <state-file> <actor>'));
|
|
68
|
+
const stateFile = path.resolve(requireArg(args[1], 'state-publish requires <manifest-file> <state-file> <actor>'));
|
|
69
|
+
const actor = requireArg(args[2], 'state-publish requires <manifest-file> <state-file> <actor>');
|
|
70
|
+
const manifest = read(manifestFile);
|
|
71
|
+
const binding = verifyRepositoryBinding(root, manifest.commit);
|
|
72
|
+
if (!binding.ok) throw new Error(`release source binding failed: ${binding.failures.join('; ')}`);
|
|
73
|
+
const phaseOne = validateReleaseManifest(root, manifest, generatedFiles(path.dirname(manifestFile)));
|
|
74
|
+
if (!phaseOne.ok) throw new Error(`phase-one release validation failed: ${phaseOne.failures.join('; ')}`);
|
|
75
|
+
const state = transitionRelease(read(stateFile), 'published_unfinalized', { actor, reason: 'Immutable npm package and release references published.', phaseOne: { ok: true, manifest_hash: manifest.manifest_hash }, evidenceRefs: [manifest.manifest_hash, `https://www.npmjs.com/package/@nebulacomponents/citable/v/${manifest.version}`] });
|
|
76
|
+
writeJson(stateFile, state);
|
|
77
|
+
return { command, output: stateFile, state };
|
|
78
|
+
}
|
|
79
|
+
if (command === 'receipt') {
|
|
80
|
+
const manifestFile = path.resolve(requireArg(args[0], 'receipt requires <manifest-file> <observation-file> <output-file>'));
|
|
81
|
+
const observationFile = path.resolve(requireArg(args[1], 'receipt requires <manifest-file> <observation-file> <output-file>'));
|
|
82
|
+
const outputFile = path.resolve(requireArg(args[2], 'receipt requires <manifest-file> <observation-file> <output-file>'));
|
|
83
|
+
const receipt = createDeploymentReceipt(read(manifestFile), read(observationFile));
|
|
84
|
+
writeJson(outputFile, receipt);
|
|
85
|
+
return { command, output: outputFile, receipt };
|
|
86
|
+
}
|
|
87
|
+
if (command === 'state-finalize') {
|
|
88
|
+
const manifestFile = path.resolve(requireArg(args[0], 'state-finalize requires <manifest-file> <state-file> <actor> <receipt...>'));
|
|
89
|
+
const stateFile = path.resolve(requireArg(args[1], 'state-finalize requires <manifest-file> <state-file> <actor> <receipt...>'));
|
|
90
|
+
const actor = requireArg(args[2], 'state-finalize requires <manifest-file> <state-file> <actor> <receipt...>');
|
|
91
|
+
const receiptFiles = args.slice(3);
|
|
92
|
+
if (!receiptFiles.length) throw new Error('state-finalize requires at least one receipt');
|
|
93
|
+
const manifest = read(manifestFile);
|
|
94
|
+
const receipts = receiptFiles.map((file) => read(path.resolve(file)));
|
|
95
|
+
const state = transitionRelease(read(stateFile), 'finalized', { actor, reason: 'All required publisher-controlled surfaces verified.', manifest, receipts, evidenceRefs: receipts.map((item) => item.receipt_hash) });
|
|
96
|
+
writeJson(stateFile, state);
|
|
97
|
+
return { command, output: stateFile, state };
|
|
98
|
+
}
|
|
99
|
+
if (command === 'state-resolve') {
|
|
100
|
+
const stateFile = path.resolve(requireArg(args[0], 'state-resolve requires <state-file> <withdrawn|superseded> <actor> <reason> [superseding-release-id]'));
|
|
101
|
+
const to = requireArg(args[1], 'state-resolve requires a terminal state');
|
|
102
|
+
const actor = requireArg(args[2], 'state-resolve requires an actor');
|
|
103
|
+
const reason = requireArg(args[3], 'state-resolve requires a reason');
|
|
104
|
+
const state = transitionRelease(read(stateFile), to, { actor, reason, supersedingReleaseId: args[4] || null });
|
|
105
|
+
writeJson(stateFile, state);
|
|
106
|
+
return { command, output: stateFile, state };
|
|
107
|
+
}
|
|
108
|
+
throw new Error('usage: release-governance <manifest|validate|state-init|state-publish|receipt|state-finalize|state-resolve> ...');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function execFileCommit(root) {
|
|
112
|
+
return execFileSync('git', ['rev-parse', 'HEAD'], { cwd: root, encoding: 'utf8' }).trim();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
116
|
+
try {
|
|
117
|
+
const result = runReleaseGovernance(process.argv.slice(2));
|
|
118
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
process.stderr.write(`release-governance: ${error.message}\n`);
|
|
121
|
+
process.exitCode = 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
package/skill/SKILL.md
CHANGED
|
@@ -7,7 +7,7 @@ description: >
|
|
|
7
7
|
generative engine optimization, structured data governance, claim substantiation,
|
|
8
8
|
crawler policy, entity consistency, content discoverability, or wants a site audited
|
|
9
9
|
for how search and AI systems will retrieve, understand, cite, or recommend it.
|
|
10
|
-
version: 1.
|
|
10
|
+
version: 1.13.0
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Citable — evidence and change control for search and AI citation readiness
|
|
@@ -97,6 +97,7 @@ citable action-plan [run-id] # ordered actions, blockers, semantic gate
|
|
|
97
97
|
citable observe <mode> [options] # render/index/citation/log/passage/consensus/performance evidence
|
|
98
98
|
citable observe bing --dataset <search_performance|ai_performance> --input <csv|json>
|
|
99
99
|
citable observe render --target <url> [--interactions] [--resume-run <run-id>]
|
|
100
|
+
citable observe render --input <browser-evidence-plan.json>
|
|
100
101
|
citable observe performance --target <url> --lighthouse [--repeat 1..5]
|
|
101
102
|
citable apply --input <spec> [--write] # reviewed, hash-locked remediation; dry run by default
|
|
102
103
|
citable monitor [runA runB] # observation regression alerts
|
|
@@ -120,6 +121,14 @@ citable reviews evaluate
|
|
|
120
121
|
citable schedules run <schedule-id> [--ref-date YYYY-MM-DD]
|
|
121
122
|
citable project github <run-id>
|
|
122
123
|
citable observe media --input <manifest.json> [--ocr]
|
|
124
|
+
citable observe representation --input <release-manifest.json> --target <controlled-url>
|
|
125
|
+
citable corpus evaluate --input <acceptance-corpus.json>
|
|
126
|
+
citable corpus publish --input <acceptance-corpus.json> --output <public-corpus.json>
|
|
127
|
+
citable corpus receipt --run <run-id> [--input <execution-context.json>]
|
|
128
|
+
citable corpus compare-receipts <receipt-a.json> <receipt-b.json>
|
|
129
|
+
citable artifacts export <run-id> --output <directory>
|
|
130
|
+
citable artifacts verify --input <directory>
|
|
131
|
+
citable artifacts import --input <directory>
|
|
123
132
|
```
|
|
124
133
|
|
|
125
134
|
Audit scopes: `technical seo aeo geo architecture entity claims evidence schema
|
|
@@ -164,6 +173,8 @@ operator data or future adapters.
|
|
|
164
173
|
Use `commands/observe-and-act.md` for collector prerequisites, evidence labels,
|
|
165
174
|
the controlled citation adapter protocol, remediation refusal conditions, and
|
|
166
175
|
monitoring interpretation.
|
|
176
|
+
Use `commands/field-validation.md` for acceptance-corpus authorization,
|
|
177
|
+
sanitization, publication refusal, reproducibility, and evidence boundaries.
|
|
167
178
|
|
|
168
179
|
## Command workflows
|
|
169
180
|
|
package/skill/commands/README.md
CHANGED
|
@@ -34,8 +34,9 @@ intent, not executability, so statuses are strict:
|
|
|
34
34
|
| /citable ingest, map-site, map-queries, map-prompts, map-entities, map-evidence | specified (ingest.md) |
|
|
35
35
|
| /citable optimize-page | specified (optimize-page.md) — requires source-to-render mapping, claim-preserving rewrites, build execution, rollback; none of that is proven yet |
|
|
36
36
|
| /citable create-page, answer-block, architect, interlink, consolidate, metadata | specified (page-work.md) |
|
|
37
|
-
| /citable validate-render | partially implemented by `observe render`;
|
|
37
|
+
| /citable validate-render | partially implemented by `observe render`; fixed Chromium profiles and schema-validated Chromium/Firefox/WebKit journeys are implemented, while reviewed semantic-impact detectors and reusable application-specific journey libraries remain |
|
|
38
38
|
| /citable measure seo/aeo/geo, test-prompts, monitor-crawlers, monitor-contradictions | partially implemented by metric/observation imports, objective evaluation, Google/CrUX live APIs, custom citation adapters, and monitor comparisons |
|
|
39
|
+
| `citable artifacts export/verify/import` | implemented — portable, versioned, checksum-bound run interchange without hosted-service authority |
|
|
39
40
|
|
|
40
41
|
Shared refusal conditions (all commands): any action that would fabricate
|
|
41
42
|
facts, citations, evidence, authorship, reviews, corroboration, or hidden
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Portable artifact interchange
|
|
2
|
+
|
|
3
|
+
Use artifact interchange to move one sealed Citable run between local or
|
|
4
|
+
external workspaces without changing its canonical bytes.
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
citable artifacts export <run-id> --output <directory>
|
|
8
|
+
citable artifacts verify --input <directory>
|
|
9
|
+
citable artifacts import --input <directory>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
An export contains the original run package plus
|
|
13
|
+
`citable-artifact.json`. The versioned envelope binds the run identity,
|
|
14
|
+
exporter identity, source-run versions, manifest and checksum hashes, exact
|
|
15
|
+
artifact inventory, byte sizes, and a canonical package hash. Verification rejects missing,
|
|
16
|
+
additional, modified, unsafe, or symbolic-link entries. Import verifies into a
|
|
17
|
+
temporary directory before atomically creating `.citable/runs/<run-id>`.
|
|
18
|
+
|
|
19
|
+
Import never rewrites the run manifest, checksums, or artifacts. An identical
|
|
20
|
+
existing run is `already_present`; a different package with the same run ID is
|
|
21
|
+
a collision and fails closed. The interchange envelope is transport metadata
|
|
22
|
+
and is not copied into the canonical run package.
|
|
23
|
+
|
|
24
|
+
Checksums prove preservation after export. They do not prove that the source
|
|
25
|
+
was authentic, that external observations were representative or complete, or
|
|
26
|
+
that an intervention caused an outcome. Hosted tenancy, authentication,
|
|
27
|
+
storage, retention, billing, scheduling, and dashboards are outside this
|
|
28
|
+
contract.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Field validation corpus
|
|
2
|
+
|
|
3
|
+
Use this workflow to assemble, evaluate, and publish an acceptance corpus. A
|
|
4
|
+
fixture-valid corpus is not field evidence. Do not describe a corpus as real,
|
|
5
|
+
representative, accurate, or public until the corresponding records and reviews
|
|
6
|
+
exist.
|
|
7
|
+
|
|
8
|
+
## Preconditions
|
|
9
|
+
|
|
10
|
+
For every property, record:
|
|
11
|
+
|
|
12
|
+
- architecture and property class;
|
|
13
|
+
- owner authorization for collection, retention, review, and the intended
|
|
14
|
+
publication level;
|
|
15
|
+
- collection methods, authority labels, timestamps, and limitations;
|
|
16
|
+
- unavailable evidence, intentional incompleteness, and contradictions;
|
|
17
|
+
- publication approval, retention, and the exact artifact-reference allowlist;
|
|
18
|
+
- human sanitization review covering personal data, credentials, and source
|
|
19
|
+
identifiers.
|
|
20
|
+
|
|
21
|
+
Every execution must reference raw artifacts, deterministic and heuristic
|
|
22
|
+
findings, reviewer assignments, disagreements, exceptions, interventions,
|
|
23
|
+
verification, and its reproducibility receipt where available. Empty reference
|
|
24
|
+
arrays are valid only where that class of evidence did not occur.
|
|
25
|
+
|
|
26
|
+
## Evaluate
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
citable corpus evaluate --input acceptance-corpus.json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Evaluation validates the v2 contract and writes `accuracy-metrics.json` plus a
|
|
33
|
+
human-readable `accuracy-metrics.md` projection from the same hash-bound data.
|
|
34
|
+
Every reported metric discloses its numerator, denominator, population,
|
|
35
|
+
exclusions, and confidence limits. Sample and census designs remain distinct,
|
|
36
|
+
and detector versions are reported as separate cohorts. Evaluation does not
|
|
37
|
+
authorize publication. Unknown false negatives remain unknown; discovered
|
|
38
|
+
false-negative rates apply only to adjudicated expected detections in the
|
|
39
|
+
disclosed population.
|
|
40
|
+
|
|
41
|
+
## Publish
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
citable corpus publish \
|
|
45
|
+
--input acceptance-corpus.json \
|
|
46
|
+
--output public-corpus.json
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Publication fails closed when any property is private or aggregate-only, owner
|
|
50
|
+
authority is expired or incomplete, sanitization review is incomplete, an
|
|
51
|
+
artifact reference is unsafe or outside the allowlist, sensitive patterns are
|
|
52
|
+
detected, or the output already exists. It emits the public corpus, a hash-bound
|
|
53
|
+
publisher-controlled receipt, and an immutable local evidence package.
|
|
54
|
+
|
|
55
|
+
Automated checks supplement but do not replace human sanitization review. The
|
|
56
|
+
receipt is owner-authorized publication evidence, not independent attestation.
|
|
57
|
+
Never publish production credentials, customer data, private property artifacts,
|
|
58
|
+
or evidence outside the exact approved scope.
|
|
59
|
+
|
|
60
|
+
## Reproducibility
|
|
61
|
+
|
|
62
|
+
Create one receipt per sealed acceptance run, then compare repeated envelopes:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
citable corpus receipt --run <run-id> --input execution-context.json
|
|
66
|
+
citable corpus compare-receipts <receipt-a.json> <receipt-b.json>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Treat fingerprint equality as bounded equality of declared inputs, methods,
|
|
70
|
+
tools, external-system versions, and artifacts. It does not establish causation
|
|
71
|
+
or performance on untested properties.
|
|
@@ -14,6 +14,11 @@ failure_behaviour: unavailable dependency, credential, source run, reviewer, exa
|
|
|
14
14
|
disclosure, inactive-tab, and load-more-like controls; it does not prove an
|
|
15
15
|
application-specific journey. `--resume-run` reuses only successful profile
|
|
16
16
|
observations from the named immutable run and recollects failed/absent ones.
|
|
17
|
+
`observe render --input <browser-evidence-plan.json>` executes an
|
|
18
|
+
explicit Chromium, Firefox, or WebKit profile matrix. Each plan records the
|
|
19
|
+
browser version, device, JavaScript, locale, consent, authentication state,
|
|
20
|
+
and ordered interaction steps. Fill/select values are referenced by
|
|
21
|
+
environment-variable name and are never written to the plan or artifacts.
|
|
17
22
|
- `observe index --input <JSON>` imports owner exports. With `--target`,
|
|
18
23
|
`--site-url`, and `GSC_ACCESS_TOKEN`, it calls Google URL Inspection, which
|
|
19
24
|
reports the indexed version rather than performing a live indexability test.
|
|
@@ -9,7 +9,7 @@ not a prediction of citation or recommendation. Report every row as
|
|
|
9
9
|
| State | Current evidence boundary |
|
|
10
10
|
| --- | --- |
|
|
11
11
|
| Retrieval eligibility | Static policy plus captured synthetic HTTP response; crawler identity remains simulated unless verified logs/IP evidence are supplied |
|
|
12
|
-
| Source extraction and support suitability | Initial HTML plus registries/detectors/rubrics; optional Chromium profiles
|
|
12
|
+
| Source extraction and support suitability | Initial HTML plus registries/detectors/rubrics; optional fixed Chromium profiles and explicit Chromium/Firefox/WebKit journey plans establish bounded artifact-level parity, while semantic impact remains unproven |
|
|
13
13
|
| Observed citation behavior | Operator-supplied prompt-result observations only; report cohort size and property citation presence, never infer from readiness |
|
|
14
14
|
|
|
15
15
|
## AEO checks
|
|
@@ -10,6 +10,7 @@ Use the narrowest supported state. Never promote evidence across rows.
|
|
|
10
10
|
| Observed in production logs | Imported evidence | Timestamped `observe logs` artifact with URL, status, bytes, latency, cache result, UA, and verification result |
|
|
11
11
|
| Indexed | Google API or imported evidence | `observe index`; Google inspection covers the indexed version, other engines require owner exports |
|
|
12
12
|
| Rendered profile observed | Optional local browser evidence | Successful profile-specific Chromium DOM, text, screenshot, failed requests, interactions, viewport, and configuration; failed profiles remain independent |
|
|
13
|
+
| Browser journey observed | Schema-validated local browser plan | Engine/version, device, JavaScript, locale, consent, authentication declaration, steps, DOM, text, accessibility snapshot, screenshots, and failures remain separate; differences do not establish semantic or citation impact |
|
|
13
14
|
| Render parity compared | Bounded local comparison | Raw/desktop and mobile/desktop word ratios from the same run or explicitly resumed immutable profiles; not semantic equivalence |
|
|
14
15
|
| Returned by retrieval | Operator supplied | Provider observation containing retrieved source URL |
|
|
15
16
|
| Cited | Import or disclosed adapter | Complete `observe citations` answer with citation URL and product/adapter mode |
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { canonicalJson } from '../release/governance.js';
|
|
4
|
+
import { nowIso, readJson, sha256, sha256File, writeJson } from '../shared/io.js';
|
|
5
|
+
import { validateAgainst } from '../shared/schemaValidator.js';
|
|
6
|
+
|
|
7
|
+
const INCLUDED_FIELDS = [
|
|
8
|
+
'property.target', 'property.source_commit', 'property.content_hashes',
|
|
9
|
+
'detectors', 'configuration.hash', 'observation_method', 'toolchain',
|
|
10
|
+
'external_systems', 'canonical_artifacts', 'execution.status',
|
|
11
|
+
'execution.unavailable_observations', 'execution.errors',
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
const EXCLUDED_FIELDS = [
|
|
15
|
+
'run_id', 'execution.started_at', 'execution.receipt_created_at',
|
|
16
|
+
'execution.locale', 'execution.region', 'property.working_tree_state',
|
|
17
|
+
'host identity', 'filesystem paths', 'runtime duration', 'memory consumption',
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
function sortedObject(value = {}) {
|
|
21
|
+
return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function normalizedArguments(argv = []) {
|
|
25
|
+
const pathFlags = new Set(['--target', '--input', '--resume-run']);
|
|
26
|
+
const normalized = [];
|
|
27
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
28
|
+
const value = String(argv[index]);
|
|
29
|
+
normalized.push(value);
|
|
30
|
+
if (pathFlags.has(value) && index + 1 < argv.length) {
|
|
31
|
+
normalized.push('<excluded-path-or-run>');
|
|
32
|
+
index += 1;
|
|
33
|
+
} else if (path.isAbsolute(value)) {
|
|
34
|
+
normalized[normalized.length - 1] = '<excluded-path>';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return normalized;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function verifyRunPackage(runDir, manifest) {
|
|
41
|
+
const manifestCheck = validateAgainst('run.schema.json', manifest);
|
|
42
|
+
if (!manifestCheck.valid) throw new Error(`run manifest violates contract: ${manifestCheck.errors.join('; ')}`);
|
|
43
|
+
const checksumsFile = path.join(runDir, 'checksums.json');
|
|
44
|
+
if (!fs.existsSync(checksumsFile)) throw new Error(`run ${manifest.run_id} has no checksums.json`);
|
|
45
|
+
const checksums = readJson(checksumsFile);
|
|
46
|
+
if (!checksums || Array.isArray(checksums) || typeof checksums !== 'object') throw new Error('run checksums must be an object');
|
|
47
|
+
const failures = [];
|
|
48
|
+
for (const [relative, expected] of Object.entries(checksums)) {
|
|
49
|
+
const file = path.resolve(runDir, relative);
|
|
50
|
+
if (path.isAbsolute(relative) || (!file.startsWith(`${path.resolve(runDir)}${path.sep}`))) failures.push(`${relative} escapes the run package`);
|
|
51
|
+
else if (!/^[a-f0-9]{64}$/.test(expected)) failures.push(`${relative} has an invalid checksum`);
|
|
52
|
+
else if (!fs.existsSync(file)) failures.push(`${relative} is missing`);
|
|
53
|
+
else if (sha256File(file) !== expected) failures.push(`${relative} checksum differs`);
|
|
54
|
+
}
|
|
55
|
+
if (failures.length) throw new Error(`run package integrity failed: ${failures.join('; ')}`);
|
|
56
|
+
return checksums;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function fingerprintPayload(receipt) {
|
|
60
|
+
return {
|
|
61
|
+
property: { target: receipt.property.target, source_commit: receipt.property.source_commit, content_hashes: receipt.property.content_hashes },
|
|
62
|
+
detectors: receipt.detectors,
|
|
63
|
+
configuration: receipt.configuration,
|
|
64
|
+
observation_method: receipt.observation_method,
|
|
65
|
+
toolchain: receipt.toolchain,
|
|
66
|
+
external_systems: receipt.external_systems,
|
|
67
|
+
canonical_artifacts: receipt.canonical_artifacts,
|
|
68
|
+
execution: { status: receipt.execution.status, unavailable_observations: receipt.execution.unavailable_observations, errors: receipt.execution.errors },
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function createAcceptanceReceipt(root, { runId, context = {}, createdAt = nowIso() }) {
|
|
73
|
+
if (!runId) throw new Error('corpus receipt requires --run <run-id>');
|
|
74
|
+
const contextCheck = validateAgainst('acceptance-run-context.schema.json', context);
|
|
75
|
+
if (!contextCheck.valid) throw new Error(`acceptance context violates contract: ${contextCheck.errors.join('; ')}`);
|
|
76
|
+
const runDir = path.join(root, '.citable', 'runs', runId);
|
|
77
|
+
const manifestFile = path.join(runDir, 'manifest.json');
|
|
78
|
+
if (!fs.existsSync(manifestFile)) throw new Error(`run ${runId} not found`);
|
|
79
|
+
const manifest = readJson(manifestFile);
|
|
80
|
+
if (manifest.run_id !== runId) throw new Error(`run manifest id ${manifest.run_id} does not match requested run ${runId}`);
|
|
81
|
+
const checksums = verifyRunPackage(runDir, manifest);
|
|
82
|
+
const canonicalArtifacts = sortedObject(Object.fromEntries(
|
|
83
|
+
Object.entries(checksums).filter(([name]) => name !== 'manifest.json'),
|
|
84
|
+
));
|
|
85
|
+
const unavailable = [...new Set([...(manifest.incomplete_checks || []), ...(context.unavailable_observations || [])])].sort();
|
|
86
|
+
const receipt = {
|
|
87
|
+
schema_version: 1,
|
|
88
|
+
receipt_id: `ACCEPTANCE-RECEIPT-${sha256(`${runId}:${createdAt}`).slice(0, 20).toUpperCase()}`,
|
|
89
|
+
run_id: runId,
|
|
90
|
+
property: {
|
|
91
|
+
target: manifest.target || {},
|
|
92
|
+
source_commit: context.source_commit ?? manifest.repository_commit ?? null,
|
|
93
|
+
working_tree_state: manifest.working_tree_state ?? null,
|
|
94
|
+
content_hashes: sortedObject({ ...(manifest.input_hashes || {}), ...(context.content_hashes || {}) }),
|
|
95
|
+
},
|
|
96
|
+
detectors: {
|
|
97
|
+
run: [...(manifest.detectors_run || [])].sort(),
|
|
98
|
+
skipped: [...(manifest.detectors_skipped || [])].sort((a, b) => a.detector_id.localeCompare(b.detector_id)),
|
|
99
|
+
},
|
|
100
|
+
configuration: { hash: manifest.configuration_hash ?? null },
|
|
101
|
+
observation_method: {
|
|
102
|
+
command: manifest.command,
|
|
103
|
+
arguments: normalizedArguments(manifest.argv || []),
|
|
104
|
+
target_kind: manifest.target?.kind ?? null,
|
|
105
|
+
collectors: sortedObject(context.collectors || {}),
|
|
106
|
+
},
|
|
107
|
+
toolchain: {
|
|
108
|
+
citable_version: manifest.tool_version,
|
|
109
|
+
skill_version: manifest.skill_version,
|
|
110
|
+
node_version: context.node_version || process.version,
|
|
111
|
+
},
|
|
112
|
+
external_systems: sortedObject(context.external_systems || {}),
|
|
113
|
+
execution: {
|
|
114
|
+
started_at: manifest.timestamp,
|
|
115
|
+
receipt_created_at: createdAt,
|
|
116
|
+
locale: context.locale || manifest.locale || 'und',
|
|
117
|
+
region: context.region ?? null,
|
|
118
|
+
status: manifest.status,
|
|
119
|
+
partial: manifest.status !== 'completed' || unavailable.length > 0 || (manifest.errors || []).length > 0,
|
|
120
|
+
unavailable_observations: unavailable,
|
|
121
|
+
errors: [...(manifest.errors || [])],
|
|
122
|
+
},
|
|
123
|
+
canonical_artifacts: canonicalArtifacts,
|
|
124
|
+
reproducibility: { fingerprint: '', included_fields: INCLUDED_FIELDS, excluded_environment_fields: EXCLUDED_FIELDS },
|
|
125
|
+
limitations: [
|
|
126
|
+
'Fingerprint equality establishes only equality of the declared canonical inputs, methods, tools, external-system versions, and artifacts.',
|
|
127
|
+
'Locale, region, timestamps, host identity, runtime, memory, and filesystem paths are execution context and are excluded from fingerprint equality.',
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
receipt.reproducibility.fingerprint = sha256(canonicalJson(fingerprintPayload(receipt)));
|
|
131
|
+
receipt.receipt_hash = sha256(canonicalJson(receipt));
|
|
132
|
+
const check = validateAgainst('acceptance-run-receipt.schema.json', receipt);
|
|
133
|
+
if (!check.valid) throw new Error(`acceptance receipt violates contract: ${check.errors.join('; ')}`);
|
|
134
|
+
const output = path.join(root, '.citable', 'corpus', 'receipts', `${receipt.receipt_id}.json`);
|
|
135
|
+
writeJson(output, receipt);
|
|
136
|
+
return { receipt, output };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function verifyAcceptanceReceipt(receipt) {
|
|
140
|
+
const check = validateAgainst('acceptance-run-receipt.schema.json', receipt);
|
|
141
|
+
const failures = check.valid ? [] : [...check.errors];
|
|
142
|
+
const { receipt_hash: ignored, ...unsigned } = receipt;
|
|
143
|
+
if (receipt.receipt_hash !== sha256(canonicalJson(unsigned))) failures.push('receipt hash is inconsistent');
|
|
144
|
+
if (receipt.reproducibility?.fingerprint !== sha256(canonicalJson(fingerprintPayload(receipt)))) failures.push('reproducibility fingerprint is inconsistent');
|
|
145
|
+
return { valid: failures.length === 0, failures };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function changed(left, right) {
|
|
149
|
+
return canonicalJson(left) !== canonicalJson(right);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function compareAcceptanceReceipts(left, right) {
|
|
153
|
+
const leftCheck = verifyAcceptanceReceipt(left);
|
|
154
|
+
const rightCheck = verifyAcceptanceReceipt(right);
|
|
155
|
+
if (!leftCheck.valid || !rightCheck.valid) throw new Error(`acceptance receipt integrity failed: ${[...leftCheck.failures, ...rightCheck.failures].join('; ')}`);
|
|
156
|
+
const dimensions = {
|
|
157
|
+
property_changed: changed({ target: left.property.target, source_commit: left.property.source_commit, content_hashes: left.property.content_hashes }, { target: right.property.target, source_commit: right.property.source_commit, content_hashes: right.property.content_hashes }),
|
|
158
|
+
detector_changed: changed(left.detectors, right.detectors),
|
|
159
|
+
configuration_changed: changed(left.configuration, right.configuration),
|
|
160
|
+
observation_method_changed: changed(left.observation_method, right.observation_method),
|
|
161
|
+
tool_changed: changed(left.toolchain, right.toolchain),
|
|
162
|
+
external_system_changed: changed(left.external_systems, right.external_systems),
|
|
163
|
+
};
|
|
164
|
+
const canonicalArtifactsChanged = changed(left.canonical_artifacts, right.canonical_artifacts);
|
|
165
|
+
return {
|
|
166
|
+
receipt_a: left.receipt_id,
|
|
167
|
+
receipt_b: right.receipt_id,
|
|
168
|
+
fingerprint_equal: left.reproducibility.fingerprint === right.reproducibility.fingerprint,
|
|
169
|
+
canonical_artifacts_changed: canonicalArtifactsChanged,
|
|
170
|
+
change_dimensions: dimensions,
|
|
171
|
+
partial_runs: [left, right].filter((item) => item.execution.partial).map((item) => ({ receipt_id: item.receipt_id, status: item.execution.status, unavailable_observations: item.execution.unavailable_observations, errors: item.execution.errors })),
|
|
172
|
+
comparable: !Object.values(dimensions).some(Boolean),
|
|
173
|
+
limitation: 'Comparability identifies declared envelope differences. It does not establish causation, external-system stability, or performance on untested properties.',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function readAndCompareAcceptanceReceipts(leftFile, rightFile) {
|
|
178
|
+
if (!leftFile || !rightFile) throw new Error('corpus compare-receipts requires two receipt files');
|
|
179
|
+
return compareAcceptanceReceipts(readJson(leftFile), readJson(rightFile));
|
|
180
|
+
}
|