create-agdf 0.20.1 → 0.20.2
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/README.md +6 -1
- package/generated/.agdf/control/templates/artefacts/SD.md +7 -1
- package/generated/.agdf/control/templates/artefacts/TP.md +4 -0
- package/generated/.opencode/contracts/quality.md +71 -4
- package/generated/.opencode/contracts/sd-definition.md +16 -0
- package/generated/.opencode/contracts/tp-definition.md +6 -0
- package/generated/.opencode/skills/agdf-clean-implementation-review/SKILL.md +2 -0
- package/generated/.opencode/skills/agdf-code-review/SKILL.md +2 -0
- package/generated/.opencode/skills/agdf-qa-gate/SKILL.md +10 -9
- package/generated/.opencode/skills/agdf-sd-definition/SKILL.md +2 -1
- package/generated/.opencode/skills/agdf-task-plan-review/SKILL.md +2 -0
- package/generated/.opencode/skills/agdf-tp-definition/SKILL.md +2 -1
- package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/control/templates/artefacts/SD.md +7 -1
- package/generated/plugins/agdf/control/templates/artefacts/TP.md +4 -0
- package/generated/plugins/agdf/mcp/server/README.md +5 -5
- package/generated/plugins/agdf/mcp/server/package.json +2 -2
- package/generated/plugins/agdf/mcp/server/src/server.js +21 -8
- package/generated/plugins/agdf/mcp/server/src/ui-capability.js +49 -1
- package/generated/plugins/agdf/meta/agdf-mcp-capability.json +2 -2
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +5 -3
- package/generated/plugins/agdf/meta/contracts/quality.md +71 -4
- package/generated/plugins/agdf/meta/contracts/sd-definition.md +16 -0
- package/generated/plugins/agdf/meta/contracts/tp-definition.md +6 -0
- package/generated/plugins/agdf/meta/copilot-payload-baseline.json +2 -2
- package/generated/plugins/agdf/meta/distribution-profile-history.json +7 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +5 -3
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/quality.md +71 -4
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/sd-definition.md +16 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/tp-definition.md +6 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-dispatch-runtime.js +10 -2
- package/generated/plugins/agdf/runtime/create-agdf/package.json +1 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/contract.js +26 -34
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/service.js +26 -8
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-contract.js +140 -9
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-presentation-render.js +2 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/interaction-presentation.js +1 -1
- package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/plugins/agdf/skills/clean-implementation-review/SKILL.md +2 -0
- package/generated/plugins/agdf/skills/code-review/SKILL.md +2 -0
- package/generated/plugins/agdf/skills/qa-gate/SKILL.md +10 -9
- package/generated/plugins/agdf/skills/sd-definition/SKILL.md +2 -1
- package/generated/plugins/agdf/skills/task-plan-review/SKILL.md +2 -0
- package/generated/plugins/agdf/skills/tp-definition/SKILL.md +2 -1
- package/generated/plugins/agdf/submission/openai/availability.md +1 -1
- package/generated/plugins/agdf/submission/openai/capability-matrix.json +1 -1
- package/generated/plugins/agdf/submission/openai/release-notes.md +1 -1
- package/generated/plugins/agdf/submission/openai/reviewer-cases.json +1 -1
- package/generated/plugins/copilot/agdf/.agdf-payload-inventory.json +74 -74
- package/generated/plugins/copilot/agdf/control/templates/artefacts/SD.md +7 -1
- package/generated/plugins/copilot/agdf/control/templates/artefacts/TP.md +4 -0
- package/generated/plugins/copilot/agdf/mcp/server/README.md +5 -5
- package/generated/plugins/copilot/agdf/mcp/server/package.json +2 -2
- package/generated/plugins/copilot/agdf/mcp/server/src/server.js +21 -8
- package/generated/plugins/copilot/agdf/mcp/server/src/ui-capability.js +49 -1
- package/generated/plugins/copilot/agdf/meta/agdf-plugin.definition.json +5 -3
- package/generated/plugins/copilot/agdf/meta/distribution-profile-history.json +7 -0
- package/generated/plugins/copilot/agdf/plugin.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +5 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/quality.md +71 -4
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/sd-definition.md +16 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/tp-definition.md +6 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-dispatch-runtime.js +10 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/package.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/contract.js +26 -34
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/service.js +26 -8
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-contract.js +140 -9
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-presentation-render.js +2 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/interaction-presentation.js +1 -1
- package/generated/plugins/copilot/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/plugins/copilot/agdf/skills/agdf-clean-implementation-review/SKILL.md +2 -0
- package/generated/plugins/copilot/agdf/skills/agdf-code-review/SKILL.md +2 -0
- package/generated/plugins/copilot/agdf/skills/agdf-qa-gate/SKILL.md +10 -9
- package/generated/plugins/copilot/agdf/skills/agdf-sd-definition/SKILL.md +2 -1
- package/generated/plugins/copilot/agdf/skills/agdf-task-plan-review/SKILL.md +2 -0
- package/generated/plugins/copilot/agdf/skills/agdf-tp-definition/SKILL.md +2 -1
- package/generated/plugins/copilot/agdf/skills/contracts/quality.md +71 -4
- package/generated/plugins/copilot/agdf/skills/contracts/sd-definition.md +16 -0
- package/generated/plugins/copilot/agdf/skills/contracts/tp-definition.md +6 -0
- package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +5 -3
- package/generated/submissions/openai/agdf/meta/contracts/quality.md +71 -4
- package/generated/submissions/openai/agdf/meta/contracts/sd-definition.md +16 -0
- package/generated/submissions/openai/agdf/meta/contracts/tp-definition.md +6 -0
- package/generated/submissions/openai/agdf/meta/copilot-payload-baseline.json +2 -2
- package/generated/submissions/openai/agdf/meta/distribution-profile-history.json +7 -0
- package/generated/submissions/openai/agdf/plugin.json +1 -1
- package/generated/submissions/openai/agdf/skills/clean-implementation-review/SKILL.md +2 -0
- package/generated/submissions/openai/agdf/skills/code-review/SKILL.md +2 -0
- package/generated/submissions/openai/agdf/skills/qa-gate/SKILL.md +10 -9
- package/generated/submissions/openai/agdf/skills/sd-definition/SKILL.md +2 -1
- package/generated/submissions/openai/agdf/skills/task-plan-review/SKILL.md +2 -0
- package/generated/submissions/openai/agdf/skills/tp-definition/SKILL.md +2 -1
- package/generated/submissions/openai/agdf/submission/openai/availability.md +1 -1
- package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +1 -1
- package/generated/submissions/openai/agdf/submission/openai/inventory.json +21 -21
- package/generated/submissions/openai/agdf/submission/openai/listing.json +1 -1
- package/generated/submissions/openai/agdf/submission/openai/readiness.json +2 -2
- package/generated/submissions/openai/agdf/submission/openai/readiness.md +2 -2
- package/generated/submissions/openai/agdf/submission/openai/release-notes.md +1 -1
- package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +1 -1
- package/lib/mcp-dispatch-runtime.js +10 -2
- package/lib/mcp-lifecycle/adapters/copilot.js +13 -7
- package/lib/mcp-lifecycle/adapters/opencode.js +97 -8
- package/lib/mcp-lifecycle/profile.js +2 -1
- package/package.json +1 -1
- package/runtime/core/lib/control-inspect/contract.js +26 -34
- package/runtime/core/lib/control-inspect/service.js +26 -8
- package/runtime/core/lib/control-state/run-command-contract.js +140 -9
- package/runtime/core/lib/control-state/run-presentation-render.js +2 -2
- package/runtime/core/lib/interaction-presentation.js +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { UR_AUTHORING_FORMAT } from '../control-evaluation/ur-readiness.js';
|
|
2
2
|
import { PRD_DECISION_FORMAT } from '../control-evaluation/prd-readiness.js';
|
|
3
3
|
import { SD_DECISION_FORMAT } from '../control-evaluation/sd-readiness.js';
|
|
4
|
-
import { DIGEST_PATTERN, canonicalJson, digest } from './approval-command-contract.js';
|
|
4
|
+
import { DIGEST_PATTERN, COOPERATIVE_ASSURANCE, canonicalJson, digest } from './approval-command-contract.js';
|
|
5
5
|
import { RUN_ID_PATTERN, REVISION_ID_PATTERN, APPROVAL_GATES } from './run-identity.js';
|
|
6
6
|
import { TASK_TARGET_SOURCES } from '../task-target-resolution.js';
|
|
7
7
|
import { PRESENTATION_LANGUAGE_TAG_PATTERN_SOURCE } from '../interaction-presentation.js';
|
|
@@ -73,14 +73,128 @@ function payloadSchema(group, kind) {
|
|
|
73
73
|
original_kind: enumeration(Object.keys(recoveryGroups).filter(original => recoveryGroups[original] === group)) })
|
|
74
74
|
: RUN_COMMAND_DESCRIPTORS[kind].payload_schema;
|
|
75
75
|
}
|
|
76
|
+
// Canonical help is shared by expanded Core validation and operation help.
|
|
77
|
+
const fieldHelp = Object.freeze({
|
|
78
|
+
schema_version: 'Contract version 1.',
|
|
79
|
+
presentation_language: 'Response BCP 47 language, e.g. de.',
|
|
80
|
+
working_directory: 'Absolute task directory for target resolution.',
|
|
81
|
+
target_source: 'Human task basis for this target; cwd alone is not authority.',
|
|
82
|
+
primary_target: 'Confirmed absolute target from resolution.',
|
|
83
|
+
target_id: 'Exact hash from current MCP target inspection; never guess.',
|
|
84
|
+
run_id: 'Scope-matching Run from inspection; recency is not authority.',
|
|
85
|
+
expected_revision_id: 'Current inspected revision; recovery retains original binding.',
|
|
86
|
+
operation_id: 'New command UUID; after handoff reuse original UUID/exact payload.',
|
|
87
|
+
assurance: 'Cooperative intent, not human proof or approval.',
|
|
88
|
+
command: 'Kind/payload; nested help: operation-contract.',
|
|
89
|
+
path: 'Contained Run-local source path; read the actual file before recording.',
|
|
90
|
+
digest: 'Canonical SHA-256 of the exact source bytes; never guess or reseal unrelated edits.',
|
|
91
|
+
gate: 'Exact gate named by current control, not permission to advance it.',
|
|
92
|
+
presentation_id: 'Immutable current presentation id from MCP inspection or preparation.',
|
|
93
|
+
response: 'Forward the new deliberate human reply for this exact presentation.',
|
|
94
|
+
confirmation: 'Exact concrete confirmation required by this operation contract.',
|
|
95
|
+
source_gate: 'Earliest actually changed approved source, determined from the reviewed proposal.',
|
|
96
|
+
preview_digest: 'Exact preview digest returned for the same reviewed proposal and binding.',
|
|
97
|
+
recovery_revision_id: 'Revision allowed by the original pending operation recovery contract.',
|
|
98
|
+
pending_digest: 'Exact pending operation digest from authoritative operation-status.',
|
|
99
|
+
original_kind: 'Original operation kind in this fixed permission group; preserve its identity.',
|
|
100
|
+
});
|
|
101
|
+
function describeFields(schema) {
|
|
102
|
+
const value = { ...schema };
|
|
103
|
+
if (value.properties) value.properties = Object.fromEntries(Object.entries(value.properties).map(([key, child]) =>
|
|
104
|
+
[key, { ...describeFields(child), ...(fieldHelp[key] ? { description: fieldHelp[key] } : {}) }]));
|
|
105
|
+
for (const key of ['oneOf', 'anyOf', 'allOf']) if (value[key]) value[key] = value[key].map(describeFields);
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
function commandSchema(group) {
|
|
109
|
+
return { oneOf: RUN_COMMAND_GROUPS[group].map(kind => strictObject({ kind: { const: kind },
|
|
110
|
+
payload: { ...payloadSchema(group, kind), description: RUN_COMMAND_DESCRIPTORS[kind].effects.join('; ') } })) };
|
|
111
|
+
}
|
|
76
112
|
export function commandGroupSchema(group) {
|
|
77
|
-
|
|
78
|
-
return strictObject({ ...envelope, command:
|
|
113
|
+
if (!RUN_COMMAND_GROUPS[group]) throw Error('command_group_unsupported');
|
|
114
|
+
return describeFields(strictObject({ ...envelope, command: commandSchema(group) }));
|
|
115
|
+
}
|
|
116
|
+
// Repeated immutable schema nodes become deterministic local references. Only
|
|
117
|
+
// schema positions are traversed: a properties map is never itself a schema.
|
|
118
|
+
export function compactCommandSchema(expanded) {
|
|
119
|
+
const visit = (node, transform, depth = 0) => {
|
|
120
|
+
const copy = { ...node };
|
|
121
|
+
if (copy.properties) copy.properties = Object.fromEntries(Object.entries(copy.properties).map(([key, child]) =>
|
|
122
|
+
[key, visit(child, transform, depth + 1)]));
|
|
123
|
+
for (const key of ['oneOf', 'anyOf', 'allOf']) if (copy[key]) copy[key] = copy[key].map(child => visit(child, transform, depth + 1));
|
|
124
|
+
if (copy.items) copy.items = visit(copy.items, transform, depth + 1);
|
|
125
|
+
return transform(copy, depth);
|
|
126
|
+
};
|
|
127
|
+
// Discovery keeps direct envelope and per-operation payload meaning; nested
|
|
128
|
+
// field detail remains in the expanded operation-contract from this owner.
|
|
129
|
+
const discovery = visit(expanded, (node, depth) => {
|
|
130
|
+
if (depth > 1) delete node.description;
|
|
131
|
+
return node;
|
|
132
|
+
});
|
|
133
|
+
// Restore every payload's concise meaning explicitly, without phrase policy.
|
|
134
|
+
discovery.properties.command.oneOf.forEach((row, i) => { row.properties.payload.description = expanded.properties.command.oneOf[i].properties.payload.description; });
|
|
135
|
+
const counts = new Map();
|
|
136
|
+
visit(discovery, node => { const { description, ...base } = node; const key = JSON.stringify(base); counts.set(key, (counts.get(key) ?? 0) + 1); return node; });
|
|
137
|
+
const definitions = {}, names = new Map();
|
|
138
|
+
const factor = (node, depth = 0, defining = false) => {
|
|
139
|
+
const { description, ...base } = node;
|
|
140
|
+
const key = JSON.stringify(base);
|
|
141
|
+
if (!defining && depth > 0 && (counts.get(key) ?? 0) > 1 && key.length >= 48) {
|
|
142
|
+
if (!names.has(key)) {
|
|
143
|
+
const name = `s${names.size}`; names.set(key, name);
|
|
144
|
+
definitions[name] = factor(base, depth, true);
|
|
145
|
+
}
|
|
146
|
+
return { $ref: `#/$defs/${names.get(key)}`, ...(description ? { description } : {}) };
|
|
147
|
+
}
|
|
148
|
+
const copy = { ...node };
|
|
149
|
+
if (copy.properties) copy.properties = Object.fromEntries(Object.entries(copy.properties).map(([name, child]) => [name, factor(child, depth + 1)]));
|
|
150
|
+
for (const name of ['oneOf', 'anyOf', 'allOf']) if (copy[name]) copy[name] = copy[name].map(child => factor(child, depth + 1));
|
|
151
|
+
if (copy.items) copy.items = factor(copy.items, depth + 1);
|
|
152
|
+
return copy;
|
|
153
|
+
};
|
|
154
|
+
const projected = factor(discovery);
|
|
155
|
+
if (names.size) projected.$defs = definitions;
|
|
156
|
+
return projected;
|
|
79
157
|
}
|
|
158
|
+
const openObject = { type: 'object', additionalProperties: true };
|
|
159
|
+
const nullableObject = { ...openObject, type: ['object', 'null'] };
|
|
160
|
+
const nullableString = { type: ['string', 'null'] };
|
|
161
|
+
const resultProperties = {
|
|
162
|
+
schema_version: { const: '1' }, outcome: enumeration(['accepted', 'already_applied', 'rejected', 'recovery_required', 'effect_unknown']), authorizes: { const: false },
|
|
163
|
+
reason: { ...nullableString, minLength: 1 }, operation_id: { ...identity, type: ['string', 'null'] }, request_digest: { ...hash, type: ['string', 'null'] },
|
|
164
|
+
binding: { ...nullableObject, properties: { target_id: hash, run_id: envelope.run_id, expected_revision_id: identity, kind: string() }, required: ['target_id', 'run_id', 'expected_revision_id', 'kind'] },
|
|
165
|
+
receipt: nullableObject, effect: nullableObject,
|
|
166
|
+
current: { ...nullableObject, properties: { available: { type: 'boolean' }, revision: { type: 'integer' }, revision_id: identity }, required: ['available'] },
|
|
167
|
+
assurance: { ...openObject, properties: Object.fromEntries(Object.entries(COOPERATIVE_ASSURANCE).map(([key, value]) => [key, { const: value }])), required: Object.keys(COOPERATIVE_ASSURANCE) }, family_result: openObject,
|
|
168
|
+
historical_effect: { type: 'boolean' }, dispatch: enumeration(['not_dispatched', 'unknown']), recovery: nullableString,
|
|
169
|
+
diagnostics: { type: 'array', items: openObject },
|
|
170
|
+
presentation_delivery: { ...openObject, properties: { mode: enumeration(['native_plus_chat', 'full_chat']), display: enumeration(['confirmed', 'unconfirmed']),
|
|
171
|
+
text: { type: 'string' }, presentation_id: identity, revision_id: identity, document_digest: hash, document_language: nullableString, authorizes: { const: false } },
|
|
172
|
+
required: ['mode', 'display', 'text', 'presentation_id', 'revision_id', 'document_digest', 'document_language', 'authorizes'] },
|
|
173
|
+
app_capability: { type: 'string' }, app_reason: { type: 'string' }, app_display: { type: 'string' },
|
|
174
|
+
};
|
|
175
|
+
const resultVariants = [
|
|
176
|
+
{ properties: { outcome: enumeration(['accepted', 'already_applied']), operation_id: { type: 'string' }, request_digest: { type: 'string' }, binding: { type: 'object' }, current: { type: 'object' } }, required: ['operation_id', 'request_digest', 'binding', 'receipt', 'effect', 'current', 'assurance', 'historical_effect', 'recovery', 'reason', 'family_result'] },
|
|
177
|
+
{ properties: { outcome: enumeration(['rejected', 'recovery_required', 'effect_unknown']), reason: { type: 'string', minLength: 1 } }, required: ['reason'] },
|
|
178
|
+
];
|
|
179
|
+
export const RUN_COMMAND_RESULT_SCHEMA = freeze({ type: 'object', additionalProperties: true, properties: resultProperties,
|
|
180
|
+
required: ['schema_version', 'outcome', 'authorizes'], oneOf: resultVariants,
|
|
181
|
+
allOf: [{ oneOf: [
|
|
182
|
+
{ properties: { outcome: enumeration(['accepted', 'already_applied', 'rejected']) } },
|
|
183
|
+
{ properties: { outcome: enumeration(['recovery_required', 'effect_unknown']), recovery: { type: 'string', minLength: 1 } }, required: ['operation_id', 'recovery'] },
|
|
184
|
+
] }] });
|
|
185
|
+
// Essential envelope projection from the full model, not a second result owner.
|
|
186
|
+
export function commandResultSchema() {
|
|
187
|
+
const keys = ['schema_version', 'outcome', 'authorizes', 'reason', 'operation_id', 'binding', 'receipt', 'recovery'];
|
|
188
|
+
const properties = Object.fromEntries(keys.map(key => [key, key === 'binding' ? { type: resultProperties.binding.type } : key === 'outcome' ? { type: 'string' } : resultProperties[key]]));
|
|
189
|
+
return { type: 'object', properties, required: RUN_COMMAND_RESULT_SCHEMA.required,
|
|
190
|
+
oneOf: resultVariants.map(variant => ({ ...variant, properties: Object.fromEntries(Object.entries(variant.properties).filter(([key]) => keys.includes(key))), required: variant.required.filter(key => keys.includes(key)) })) };
|
|
191
|
+
}
|
|
192
|
+
export function validateRunCommandResult(value) { return schemaDiagnostics(value, RUN_COMMAND_RESULT_SCHEMA); }
|
|
80
193
|
export function commandGroupDefinition(group) {
|
|
81
194
|
const definition = { name: group,
|
|
82
|
-
description: `${group}: ${RUN_COMMAND_GROUPS[group]?.join(', ')}.
|
|
83
|
-
annotations: { readOnlyHint: false, destructiveHint: group !== 'agdf_prepare', idempotentHint: false, openWorldHint: false },
|
|
195
|
+
description: `${group}: ${RUN_COMMAND_GROUPS[group]?.join(', ')}. Inspect operation-contract for payloads/bindings. Cooperative intent never approves a gate. After uncertainty inspect operation-status with original UUID/payload. No VCS.`,
|
|
196
|
+
annotations: { readOnlyHint: false, destructiveHint: group !== 'agdf_prepare', idempotentHint: false, openWorldHint: false },
|
|
197
|
+
inputSchema: compactCommandSchema(commandGroupSchema(group)), outputSchema: commandResultSchema() };
|
|
84
198
|
if (Buffer.byteLength(JSON.stringify(definition)) > RUN_COMMAND_LIMITS.definition_bytes) throw Error('command_definition_budget_exceeded');
|
|
85
199
|
return freeze(definition);
|
|
86
200
|
}
|
|
@@ -88,14 +202,31 @@ export function commandGroupDefinition(group) {
|
|
|
88
202
|
// No caller validator, accessor execution, coercion or default-expanded effect is allowed.
|
|
89
203
|
export function schemaDiagnostics(value, schema, path = '$') {
|
|
90
204
|
const errors = [];
|
|
91
|
-
if (schema.oneOf
|
|
205
|
+
if (schema.oneOf && schema.oneOf.filter(choice => schemaDiagnostics(value, choice, path).length === 0).length !== 1) errors.push({ path, code: 'one_of_invalid' });
|
|
206
|
+
if (schema.allOf) for (const choice of schema.allOf) errors.push(...schemaDiagnostics(value, choice, path));
|
|
207
|
+
if (Array.isArray(schema.type)) {
|
|
208
|
+
const matches = schema.type.map(type => schemaDiagnostics(value, { ...schema, type }, path));
|
|
209
|
+
return matches.some(result => result.length === 0) ? errors : [...errors, { path, code: 'type_invalid' }];
|
|
210
|
+
}
|
|
211
|
+
if (schema.type === 'null' && value !== null) errors.push({ path, code: 'null_required' });
|
|
212
|
+
if (schema.type === 'integer' && !Number.isInteger(value)) errors.push({ path, code: 'integer_required' });
|
|
213
|
+
if (schema.type === 'boolean' && typeof value !== 'boolean') errors.push({ path, code: 'boolean_required' });
|
|
214
|
+
if (schema.type === 'array') {
|
|
215
|
+
if (!Array.isArray(value)) return [...errors, { path, code: 'array_required' }];
|
|
216
|
+
for (let i = 0; i < value.length; i++) {
|
|
217
|
+
const field = Object.getOwnPropertyDescriptor(value, String(i));
|
|
218
|
+
if (!field || !Object.hasOwn(field, 'value')) errors.push({ path, code: 'accessor_forbidden' });
|
|
219
|
+
else if (schema.items) errors.push(...schemaDiagnostics(field.value, schema.items, `${path}[${i}]`));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
92
222
|
if (Object.hasOwn(schema, 'const') && value !== schema.const) errors.push({ path, code: 'constant_invalid' });
|
|
93
223
|
if (schema.enum && !schema.enum.includes(value)) errors.push({ path, code: 'enum_invalid' });
|
|
94
|
-
if (schema.type === 'object') {
|
|
224
|
+
if (schema.type === 'object' || !schema.type && (schema.properties || schema.required) && value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
95
225
|
if (value === null || typeof value !== 'object' || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) return [{ path, code: 'object_required' }];
|
|
96
226
|
const keys = Reflect.ownKeys(value);
|
|
97
227
|
for (const key of keys) {
|
|
98
|
-
if (typeof key !== 'string'
|
|
228
|
+
if (typeof key !== 'string') { errors.push({ path, code: 'unknown_field' }); continue; }
|
|
229
|
+
if (!Object.hasOwn(schema.properties ?? {}, key)) { if (schema.additionalProperties === false) errors.push({ path, code: 'unknown_field' }); continue; }
|
|
99
230
|
const property = Object.getOwnPropertyDescriptor(value, key);
|
|
100
231
|
if (!Object.hasOwn(property, 'value')) { errors.push({ path: `${path}.${key}`, code: 'accessor_forbidden' }); continue; }
|
|
101
232
|
errors.push(...schemaDiagnostics(property.value, schema.properties[key], `${path}.${key}`));
|
|
@@ -122,7 +253,7 @@ export const runCommandRequestDigest = input => digest(`agdf-run-command/1\0${ca
|
|
|
122
253
|
export function operationContract(group, kind, { gate } = {}) {
|
|
123
254
|
if (!RUN_COMMAND_GROUPS[group]?.includes(kind)) return { available: false, reason: 'command_group_unsupported' };
|
|
124
255
|
return { schema_version: RUN_COMMAND_VERSION, available: true, group, kind, ...RUN_COMMAND_DESCRIPTORS[kind], payload_schema: payloadSchema(group, kind),
|
|
125
|
-
schema: strictObject({ ...envelope, command: strictObject({ kind: { const: kind }, payload: payloadSchema(group, kind) }) }), retry_class: 'inspect_original_operation_after_dispatch', assurance: 'cooperative_local',
|
|
256
|
+
schema: describeFields(strictObject({ ...envelope, command: strictObject({ kind: { const: kind }, payload: { ...payloadSchema(group, kind), description: RUN_COMMAND_DESCRIPTORS[kind].effects.join('; ') } }) })), result_schema: RUN_COMMAND_RESULT_SCHEMA, retry_class: 'inspect_original_operation_after_dispatch', assurance: 'cooperative_local',
|
|
126
257
|
reference_limits: { input_bytes: RUN_COMMAND_LIMITS.input_bytes, source_file_bytes: 131072, result_bytes: RUN_COMMAND_LIMITS.result_bytes },
|
|
127
258
|
internal_result_formats: kind === 'step.record' ? { 'UX Intent Definition': UX_DECISION_FORMAT,
|
|
128
259
|
reviews: { declaration: '- decision: pass | revise | block | not_applicable', result_scope: 'actual current owner report; no generated judgement or approval' } } : undefined,
|
|
@@ -431,8 +431,8 @@ export function renderReviewableApproval(root, report, { runId, gate, revisionId
|
|
|
431
431
|
german ? 'Antworte „Dokument lesen“, um diese Fassung vollständig im Chat zu lesen. Fragen und Änderungswünsche kannst du hier besprechen. Ohne deine Freigabe bleibt dieser Schritt offen.'
|
|
432
432
|
: 'Reply “Read document” to read this complete version in Chat. Discuss questions and requested changes here. This step remains open until you approve.',
|
|
433
433
|
pack.decisionCard.chatApprovalHint.replace('{gate}', gate),
|
|
434
|
-
|
|
435
|
-
|
|
434
|
+
`### ${german ? 'Details und Nachweise' : 'Details and evidence'}\n\n${summaryMarkdown}`,
|
|
435
|
+
`### ${german ? 'Fassung und Quellen' : 'Version and sources'}\n\nRun: \`${runId}\` · ${pack.gateTitles[gate]} · Revision: \`${revisionId}\`\n\nSHA-256: \`${artefactDigest}\``];
|
|
436
436
|
return parts.every((part) => typeof part === "string" && part.trim())
|
|
437
437
|
? { markdown: parts.join("\n\n"), companion_markdown: [german
|
|
438
438
|
? `Die AGDF-Karte ist geöffnet. Du kannst dort „${qaAcceptance?.approve_label || 'Freigeben'}“ klicken oder hier \`Approval: ${gate}\` eingeben. Beide Wege entscheiden dieselbe vorgelegte Fassung einmal.`
|
package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/interaction-presentation.js
CHANGED
|
@@ -409,7 +409,7 @@ function markdownCell(value) {
|
|
|
409
409
|
.replaceAll("&", "&")
|
|
410
410
|
.replaceAll("<", "<")
|
|
411
411
|
.replaceAll(">", ">")
|
|
412
|
-
.replace(/\r
|
|
412
|
+
.replace(/\r\n?|\n/g, " · ");
|
|
413
413
|
}
|
|
414
414
|
|
|
415
415
|
function localizedOperationalValue(value, pack, fallbackPack, fallbackLocale) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": "1",
|
|
3
3
|
"generated": true,
|
|
4
4
|
"source": "create-agdf/cli",
|
|
5
|
-
"version": "0.20.
|
|
5
|
+
"version": "0.20.2",
|
|
6
6
|
"entrypoint": "create-agdf/bin/agdf-validator.js",
|
|
7
|
-
"digest": "
|
|
7
|
+
"digest": "c5e31f9ebf057b4fd18244e276f2262fe0fa6bc40d120ace72d69bdf421a41d1"
|
|
8
8
|
}
|
|
@@ -59,6 +59,8 @@ Clean-review-specific output must make the primary solution, fallbacks, workarou
|
|
|
59
59
|
Applicable findings must use `../../meta/contracts/quality.md` §Normalized Review Gaps. This skill
|
|
60
60
|
must distinguish a missing upstream decision from implementation that violates an approved decision.
|
|
61
61
|
|
|
62
|
+
Apply quality.md Proportionate Tests And Evidence and Verification Effectiveness And Completion when assessing reuse and parallel structures. Reject unnecessary duplicated proof and status-only finding closure; shared evidence preserves this review responsibility.
|
|
63
|
+
|
|
62
64
|
## Rules
|
|
63
65
|
1. Clean primary solution before fallback.
|
|
64
66
|
2. Root cause before symptom masking.
|
|
@@ -58,6 +58,8 @@ Code-review-specific output must make actual findings, missing review scope, evi
|
|
|
58
58
|
Applicable findings must use `../../meta/contracts/quality.md` §Normalized Review Gaps. Concrete diff
|
|
59
59
|
defects remain Code Review findings; missing upstream constraints route to their authoritative owner.
|
|
60
60
|
|
|
61
|
+
Apply quality.md Proportionate Tests And Evidence and Verification Effectiveness And Completion to actual changed behavior: check requirement-derived expectations, meaningful defect detection and targeted re-verification of findings, including relevant side effects or justified alternatives.
|
|
62
|
+
|
|
61
63
|
## Rules
|
|
62
64
|
1. Review the actual diff and impacted code, not intent alone.
|
|
63
65
|
2. Findings require concrete evidence.
|
|
@@ -74,12 +74,11 @@ evidence into `pass`, or claim native qualification. Only a deliberate human dec
|
|
|
74
74
|
new exact presentation can accept deviations through the existing approval owner. The technical
|
|
75
75
|
QA result and open findings remain unchanged and accompany UAT and OR.
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
Gate Transition Card or the durable QA report.
|
|
77
|
+
For routine technical pass, use quality.md Quality Readiness Projection's concise result
|
|
78
|
+
and report reference. At revise/block show its four dimensions in the canonical order,
|
|
79
|
+
with the decisive source/reason and next permissible action. Explicit detail/status
|
|
80
|
+
requests may show the full overview even at pass. This derived, non-authorizing output
|
|
81
|
+
never replaces durable reports, complete gate material or deliberate human decisions.
|
|
83
82
|
|
|
84
83
|
## Resolved Target Run And Evidence Discovery
|
|
85
84
|
|
|
@@ -107,6 +106,8 @@ QA owns the Quality Readiness and QA decision only. It must not reconstruct or p
|
|
|
107
106
|
Card, Gate Transition Card, native QA card or interactive QA card. Operational run status and gate
|
|
108
107
|
approval orientation remain owned by gate-check and the Interaction Contract.
|
|
109
108
|
|
|
109
|
+
Apply quality.md Proportionate Tests And Evidence and Verification Effectiveness And Completion. Assess evidence applicability and targeted finding re-verification; sufficient checking ends redundant collection, never required reviews or approvals. Missing proof and accepted deviations retain their original technical effect.
|
|
110
|
+
|
|
110
111
|
## Rules
|
|
111
112
|
1. No QA pass without strong evidence.
|
|
112
113
|
2. TP is the reference, not merely working code.
|
|
@@ -183,9 +184,9 @@ If Context Graph impact is relevant, include the fields from `../../meta/contrac
|
|
|
183
184
|
|
|
184
185
|
### Compact Chat Output
|
|
185
186
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
At `revise`/`block
|
|
187
|
+
Follow quality.md Quality Readiness Projection: routine `pass` is one concise line
|
|
188
|
+
with the durable report reference; explicit detail requests may show the overview.
|
|
189
|
+
At `revise`/`block`, show its four dimensions and the decisive source/reason/next action.
|
|
189
190
|
|
|
190
191
|
## Decision Guidance
|
|
191
192
|
- `pass`: required TP tasks are done, evidence is strong, no blocking Brownfield or solution-integrity risk remains.
|
|
@@ -8,7 +8,8 @@ description: "Use this skill for this scope: bound SD content. Boundary: content
|
|
|
8
8
|
## Runtime Contract
|
|
9
9
|
|
|
10
10
|
Use the returned `continuation.runtime_contracts` after `skill_continuation`. If absent, load
|
|
11
|
-
`../../meta/contracts/sd-definition.md
|
|
11
|
+
`../../meta/contracts/sd-definition.md`, `../../meta/contracts/gate-artifact-preparation.md`
|
|
12
|
+
and `../../meta/contracts/quality.md`
|
|
12
13
|
through the supplied contract reader or bundled files.
|
|
13
14
|
Missing contract or invalid binding: stop. This skill owns SD content; gate-check owns readiness.
|
|
14
15
|
|
|
@@ -62,6 +62,8 @@ If `context_graph_required_action` is not `none`, the affected task is complete
|
|
|
62
62
|
Applicable review gaps must use `../../meta/contracts/quality.md` §Normalized Review Gaps. This skill
|
|
63
63
|
must not maintain its own type-to-route mapping.
|
|
64
64
|
|
|
65
|
+
Verify scoped coverage, reuse applicability and remaining obligations under quality.md Proportionate Tests And Evidence and Verification Effectiveness And Completion. Reuse valid results without replacing this review assessment; a later gate alone requires no recollection.
|
|
66
|
+
|
|
65
67
|
## Rules
|
|
66
68
|
1. The Task Plan is the reference, not plausible code.
|
|
67
69
|
2. No assumptions without evidence.
|
|
@@ -8,7 +8,8 @@ description: "Use this skill for this scope: bound TP content. Boundary: content
|
|
|
8
8
|
## Runtime Contract
|
|
9
9
|
|
|
10
10
|
Use the returned `continuation.runtime_contracts` after `skill_continuation`. If absent, load
|
|
11
|
-
`../../meta/contracts/tp-definition.md
|
|
11
|
+
`../../meta/contracts/tp-definition.md`, `../../meta/contracts/gate-artifact-preparation.md`
|
|
12
|
+
and `../../meta/contracts/quality.md`
|
|
12
13
|
through the supplied contract reader or bundled files.
|
|
13
14
|
Missing contract or invalid binding: stop. This skill owns TP content; gate-check owns readiness.
|
|
14
15
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# AGDF 0.20.
|
|
1
|
+
# AGDF 0.20.2 — Initial OpenAI Public Plugin Candidate
|
|
2
2
|
|
|
3
3
|
This candidate packages the canonical AGDF workflow skills for public discovery in ChatGPT and
|
|
4
4
|
Codex. It helps users assess delivery fit, preserve explicit human approvals, inspect existing-system
|