@aisdlc/core 1.6.0 → 2.0.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/README.md +4 -3
- package/dist/index.cjs +1026 -144
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +161 -16
- package/dist/index.d.ts +161 -16
- package/dist/index.js +1011 -145
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -589,9 +589,11 @@ function resolveTargetFiles(rootDir, targetPath) {
|
|
|
589
589
|
const searchDirs = [
|
|
590
590
|
path4__namespace.join(rootDir, "product"),
|
|
591
591
|
path4__namespace.join(rootDir, "security"),
|
|
592
|
+
path4__namespace.join(rootDir, "privacy"),
|
|
592
593
|
path4__namespace.join(rootDir, "specs"),
|
|
593
594
|
path4__namespace.join(rootDir, "examples", "product"),
|
|
594
595
|
path4__namespace.join(rootDir, "examples", "security"),
|
|
596
|
+
path4__namespace.join(rootDir, "examples", "privacy"),
|
|
595
597
|
path4__namespace.join(rootDir, "examples", "specs")
|
|
596
598
|
];
|
|
597
599
|
return searchDirs.filter((d) => fs7__namespace.existsSync(d)).flatMap((d) => walkMdFiles(d));
|
|
@@ -602,10 +604,12 @@ function resolveFeatureFilePath(rootDir, filePath, id, customTarget) {
|
|
|
602
604
|
}
|
|
603
605
|
const baseDir = path4__namespace.join(rootDir, "tests", "features");
|
|
604
606
|
const candidateSecurity = path4__namespace.join(baseDir, "security", `${id.toLowerCase()}.feature`);
|
|
607
|
+
const candidatePrivacy = path4__namespace.join(baseDir, "privacy", `${id.toLowerCase()}.feature`);
|
|
605
608
|
const candidateRoot = path4__namespace.join(baseDir, `${id.toLowerCase()}.feature`);
|
|
606
609
|
if (fs7__namespace.existsSync(candidateSecurity)) return candidateSecurity;
|
|
610
|
+
if (fs7__namespace.existsSync(candidatePrivacy)) return candidatePrivacy;
|
|
607
611
|
if (fs7__namespace.existsSync(candidateRoot)) return candidateRoot;
|
|
608
|
-
const subDir = filePath.includes("security") ? "security" : "";
|
|
612
|
+
const subDir = filePath.includes("security") ? "security" : filePath.includes("privacy") ? "privacy" : "";
|
|
609
613
|
return path4__namespace.join(baseDir, subDir, `${id.toLowerCase()}.feature`);
|
|
610
614
|
}
|
|
611
615
|
function buildFeatureFileContent(rootDir, filePath, id, version, gherkinBlocks) {
|
|
@@ -832,7 +836,7 @@ function parseFeatureTags(content, relTest, reqToTestsMap) {
|
|
|
832
836
|
}
|
|
833
837
|
}
|
|
834
838
|
}
|
|
835
|
-
var REQ_ID_REGEX = /\b(FR|QR|CON|SEC-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*\b/g;
|
|
839
|
+
var REQ_ID_REGEX = /\b(FR|QR|CON|SEC-REQ|PRIV-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*\b/g;
|
|
836
840
|
function parseCodeTestIds(content, relTest, reqToTestsMap) {
|
|
837
841
|
const idMatches = content.match(REQ_ID_REGEX);
|
|
838
842
|
if (!idMatches) return;
|
|
@@ -932,9 +936,9 @@ function computeMissingVariants(cov) {
|
|
|
932
936
|
if (!cov.invalid) missing.push("invalid");
|
|
933
937
|
return missing;
|
|
934
938
|
}
|
|
935
|
-
var REQ_PREFIXES = ["FR-", "QR-", "CON-", "SEC-REQ-"];
|
|
939
|
+
var REQ_PREFIXES = ["FR-", "QR-", "CON-", "SEC-REQ-", "PRIV-REQ-"];
|
|
936
940
|
function isRequirementArtifact(frontmatter, id) {
|
|
937
|
-
if (frontmatter.type === "requirement" || frontmatter.type === "security-requirement") {
|
|
941
|
+
if (frontmatter.type === "requirement" || frontmatter.type === "security-requirement" || frontmatter.type === "privacy-requirement") {
|
|
938
942
|
return true;
|
|
939
943
|
}
|
|
940
944
|
return REQ_PREFIXES.some((prefix) => id.startsWith(prefix));
|
|
@@ -1961,11 +1965,40 @@ var CANONICAL_TYPE_MAP = {
|
|
|
1961
1965
|
"product/business-rules/": "business-rule",
|
|
1962
1966
|
"product/journeys/": "journey",
|
|
1963
1967
|
"security/requirements/": "security-requirement",
|
|
1968
|
+
"privacy/requirements/": "privacy-requirement",
|
|
1969
|
+
"specs/privacy/requirements/": "privacy-requirement",
|
|
1970
|
+
"privacy/assets/": "data-asset",
|
|
1971
|
+
"privacy/data-assets/": "data-asset",
|
|
1972
|
+
"specs/privacy/assets/": "data-asset",
|
|
1973
|
+
"specs/privacy/data-assets/": "data-asset",
|
|
1974
|
+
"privacy/ropa/": "privacy-ropa",
|
|
1975
|
+
"specs/privacy/ropa/": "privacy-ropa",
|
|
1976
|
+
"privacy/dpia/": "dpia-request",
|
|
1977
|
+
"specs/privacy/dpia/": "dpia-request",
|
|
1964
1978
|
"architecture/": "component"
|
|
1965
1979
|
};
|
|
1980
|
+
var ID_PREFIX_TYPE_PAIRS = [
|
|
1981
|
+
["PRIV-REQ-", "privacy-requirement"],
|
|
1982
|
+
["DATA-ASSET-", "data-asset"],
|
|
1983
|
+
["PRIV-ROPA-", "privacy-ropa"],
|
|
1984
|
+
["DPIA-", "dpia-request"],
|
|
1985
|
+
["SEC-REQ-", "security-requirement"],
|
|
1986
|
+
["FR-", "requirement"],
|
|
1987
|
+
["QR-", "requirement"],
|
|
1988
|
+
["CON-", "requirement"],
|
|
1989
|
+
["UC-", "use-case"],
|
|
1990
|
+
["ACT-", "actor"],
|
|
1991
|
+
["BR-", "business-rule"],
|
|
1992
|
+
["CMP-", "component"]
|
|
1993
|
+
];
|
|
1994
|
+
function resolveCanonicalArtifactType(normTarget, id) {
|
|
1995
|
+
if (CANONICAL_TYPE_MAP[normTarget]) return CANONICAL_TYPE_MAP[normTarget];
|
|
1996
|
+
const matched = ID_PREFIX_TYPE_PAIRS.find(([prefix]) => id.startsWith(prefix));
|
|
1997
|
+
return matched ? matched[1] : "artifact";
|
|
1998
|
+
}
|
|
1966
1999
|
function buildCanonicalInitialContent(item, changeId, author, date) {
|
|
1967
2000
|
const normTarget = item.targetDir.endsWith("/") ? item.targetDir : `${item.targetDir}/`;
|
|
1968
|
-
const artifactType =
|
|
2001
|
+
const artifactType = resolveCanonicalArtifactType(normTarget, item.id);
|
|
1969
2002
|
const frontmatter = `id: ${item.id}
|
|
1970
2003
|
type: ${artifactType}
|
|
1971
2004
|
status: draft
|
|
@@ -2020,6 +2053,21 @@ function checkTasksExecution(changeDir, changeId) {
|
|
|
2020
2053
|
}
|
|
2021
2054
|
return { ok: true, completedTasks, pendingTasks, error: null };
|
|
2022
2055
|
}
|
|
2056
|
+
function isProposalRequirementId(id) {
|
|
2057
|
+
return id.startsWith("FR-") || id.startsWith("QR-") || id.startsWith("CON-") || id.startsWith("SEC-REQ-");
|
|
2058
|
+
}
|
|
2059
|
+
function buildSubgraphFromProposalIds(ids) {
|
|
2060
|
+
const reqs = ids.filter(isProposalRequirementId);
|
|
2061
|
+
const privReqs = ids.filter((id) => id.startsWith("PRIV-REQ-"));
|
|
2062
|
+
const dataAssets = ids.filter((id) => id.startsWith("DATA-ASSET-"));
|
|
2063
|
+
const ropaEntries = ids.filter((id) => id.startsWith("PRIV-ROPA-"));
|
|
2064
|
+
return {
|
|
2065
|
+
requirements: reqs,
|
|
2066
|
+
...privReqs.length > 0 ? { privacyRequirements: privReqs } : {},
|
|
2067
|
+
...dataAssets.length > 0 ? { dataAssets } : {},
|
|
2068
|
+
...ropaEntries.length > 0 ? { ropaEntries } : {}
|
|
2069
|
+
};
|
|
2070
|
+
}
|
|
2023
2071
|
function resolveChangeHandoff(changeDir, changeId) {
|
|
2024
2072
|
const sidecar = loadProductHandoffSidecar(changeDir);
|
|
2025
2073
|
if (sidecar) return sidecar;
|
|
@@ -2028,12 +2076,12 @@ function resolveChangeHandoff(changeDir, changeId) {
|
|
|
2028
2076
|
const propContent = fs7__namespace.readFileSync(proposalFile, "utf-8");
|
|
2029
2077
|
const { frontmatter } = parseFrontmatter(propContent);
|
|
2030
2078
|
const citations = Array.isArray(frontmatter.citations) ? frontmatter.citations : [];
|
|
2031
|
-
const
|
|
2079
|
+
const ids = citations.map((c) => c.id || "").filter(Boolean);
|
|
2032
2080
|
return {
|
|
2033
2081
|
id: `HOF-${changeId.toUpperCase()}`,
|
|
2034
2082
|
type: "handoff",
|
|
2035
2083
|
changeId,
|
|
2036
|
-
subgraph:
|
|
2084
|
+
subgraph: buildSubgraphFromProposalIds(ids),
|
|
2037
2085
|
citations
|
|
2038
2086
|
};
|
|
2039
2087
|
}
|
|
@@ -2141,10 +2189,14 @@ function collectArchitectureComponents(handoff, canonicalArtifacts, targetReqs)
|
|
|
2141
2189
|
collectSatisfyingComponents(canonicalArtifacts, targetReqs, cited);
|
|
2142
2190
|
return cited;
|
|
2143
2191
|
}
|
|
2192
|
+
function isSatisfiableRequirementId(id) {
|
|
2193
|
+
return id.startsWith("FR-") || id.startsWith("QR-") || id.startsWith("CON-") || id.startsWith("SEC-REQ-") || id.startsWith("PRIV-REQ-");
|
|
2194
|
+
}
|
|
2144
2195
|
function mergeSatisfiesRequirements(fm, targetReqs) {
|
|
2145
2196
|
const existing = Array.isArray(fm["satisfies-requirements"]) ? [...fm["satisfies-requirements"]] : [];
|
|
2146
2197
|
let modified = false;
|
|
2147
2198
|
for (const req of targetReqs) {
|
|
2199
|
+
if (!isSatisfiableRequirementId(req)) continue;
|
|
2148
2200
|
if (!existing.includes(req)) {
|
|
2149
2201
|
existing.push(req);
|
|
2150
2202
|
modified = true;
|
|
@@ -2256,24 +2308,71 @@ function buildIntegrationSuccessPayload(changeId, tasksRes, targetReqs, updatedP
|
|
|
2256
2308
|
errors
|
|
2257
2309
|
};
|
|
2258
2310
|
}
|
|
2311
|
+
function collectSubgraphPromotableIds(subgraph) {
|
|
2312
|
+
if (!subgraph) return [];
|
|
2313
|
+
const rawSub = subgraph;
|
|
2314
|
+
const ropaAlias = Array.isArray(rawSub.ropaEntries) ? rawSub.ropaEntries : [];
|
|
2315
|
+
const privacyRopa = Array.isArray(rawSub.privacyRopa) ? rawSub.privacyRopa : [];
|
|
2316
|
+
const combined = [
|
|
2317
|
+
...subgraph.requirements || [],
|
|
2318
|
+
...subgraph.securityRequirements || [],
|
|
2319
|
+
...subgraph.privacyRequirements || [],
|
|
2320
|
+
...subgraph.dataAssets || [],
|
|
2321
|
+
...ropaAlias,
|
|
2322
|
+
...privacyRopa
|
|
2323
|
+
];
|
|
2324
|
+
return Array.from(new Set(combined));
|
|
2325
|
+
}
|
|
2326
|
+
function collectSpecAffectedNonArchIds(changeDir) {
|
|
2327
|
+
const specFile = path4__namespace.join(changeDir, "spec.md");
|
|
2328
|
+
if (!fs7__namespace.existsSync(specFile)) return [];
|
|
2329
|
+
const { affectedItems } = parseSpecCatalogScope(fs7__namespace.readFileSync(specFile, "utf-8"));
|
|
2330
|
+
return affectedItems.map((item) => item.id).filter((id) => !isArchitectureComponentId(id));
|
|
2331
|
+
}
|
|
2332
|
+
function resolveIntegrationOptions(options) {
|
|
2333
|
+
return {
|
|
2334
|
+
rootDir: options.rootDir || process.cwd(),
|
|
2335
|
+
changeId: options.changeId,
|
|
2336
|
+
author: options.author || "AI-SDLC Integration Engine",
|
|
2337
|
+
date: options.date || (/* @__PURE__ */ new Date()).toISOString().split("T")[0]
|
|
2338
|
+
};
|
|
2339
|
+
}
|
|
2340
|
+
function resolveTargetRequirements(handoff, changeDir) {
|
|
2341
|
+
return Array.from(
|
|
2342
|
+
/* @__PURE__ */ new Set([
|
|
2343
|
+
...collectSubgraphPromotableIds(handoff.subgraph),
|
|
2344
|
+
...collectSpecAffectedNonArchIds(changeDir)
|
|
2345
|
+
])
|
|
2346
|
+
);
|
|
2347
|
+
}
|
|
2348
|
+
function applyArtifactUpdates(ctx, changeDir, handoff, completedTasks, errors) {
|
|
2349
|
+
const targetReqs = resolveTargetRequirements(handoff, changeDir);
|
|
2350
|
+
const createdArtifacts = materializeNewCatalogArtifacts(changeDir, ctx.rootDir, ctx.changeId, ctx.author, ctx.date, errors);
|
|
2351
|
+
const canonicalArtifacts = loadCanonicalArtifacts(ctx.rootDir);
|
|
2352
|
+
const updatedProduct = updateRequirementsArtifacts(targetReqs, createdArtifacts, canonicalArtifacts, completedTasks, ctx.changeId, ctx.date, ctx.author, errors);
|
|
2353
|
+
const citedComponents = collectArchitectureComponents(handoff, canonicalArtifacts, targetReqs);
|
|
2354
|
+
const updatedArch = updateArchitectureComponents(citedComponents, canonicalArtifacts, targetReqs, ctx.changeId, ctx.date, ctx.author, errors);
|
|
2355
|
+
return { targetReqs, updatedProduct, updatedArch, createdArtifacts };
|
|
2356
|
+
}
|
|
2259
2357
|
function integrateSddChange(options) {
|
|
2260
|
-
const
|
|
2261
|
-
const
|
|
2262
|
-
|
|
2263
|
-
const date = options.date || (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
2264
|
-
const validation = validateChangeWorkspace(rootDir, changeId);
|
|
2265
|
-
if (validation.error) return buildEmptyIntegrationResult(changeId, validation.error, validation.pendingTasks);
|
|
2266
|
-
const { changeDir, tasksRes, handoff } = validation;
|
|
2358
|
+
const ctx = resolveIntegrationOptions(options);
|
|
2359
|
+
const validation = validateChangeWorkspace(ctx.rootDir, ctx.changeId);
|
|
2360
|
+
if (validation.error) return buildEmptyIntegrationResult(ctx.changeId, validation.error, validation.pendingTasks);
|
|
2267
2361
|
const errors = [];
|
|
2268
|
-
const
|
|
2269
|
-
const
|
|
2270
|
-
const canonicalArtifacts = loadCanonicalArtifacts(rootDir);
|
|
2271
|
-
const updatedProduct = updateRequirementsArtifacts(targetReqs, createdArtifacts, canonicalArtifacts, tasksRes.completedTasks, changeId, date, author, errors);
|
|
2272
|
-
const citedComponents = collectArchitectureComponents(handoff, canonicalArtifacts, targetReqs);
|
|
2273
|
-
const updatedArch = updateArchitectureComponents(citedComponents, canonicalArtifacts, targetReqs, changeId, date, author, errors);
|
|
2362
|
+
const { changeDir, tasksRes, handoff } = validation;
|
|
2363
|
+
const updates = applyArtifactUpdates(ctx, changeDir, handoff, tasksRes.completedTasks, errors);
|
|
2274
2364
|
const completedAll = tasksRes.completedTasks.length > 0 && tasksRes.pendingTasks.length === 0;
|
|
2275
|
-
const archiveRes = archiveChangeWorkspace(changeDir, changeId, rootDir, options.autoArchive !== false, completedAll);
|
|
2276
|
-
return buildIntegrationSuccessPayload(
|
|
2365
|
+
const archiveRes = archiveChangeWorkspace(changeDir, ctx.changeId, ctx.rootDir, options.autoArchive !== false, completedAll);
|
|
2366
|
+
return buildIntegrationSuccessPayload(
|
|
2367
|
+
ctx.changeId,
|
|
2368
|
+
tasksRes,
|
|
2369
|
+
updates.targetReqs,
|
|
2370
|
+
updates.updatedProduct,
|
|
2371
|
+
updates.updatedArch,
|
|
2372
|
+
updates.createdArtifacts,
|
|
2373
|
+
archiveRes,
|
|
2374
|
+
errors
|
|
2375
|
+
);
|
|
2277
2376
|
}
|
|
2278
2377
|
function auditChangeRequirements(targetReqs, canonicalMap) {
|
|
2279
2378
|
const integrated = [];
|
|
@@ -2304,7 +2403,7 @@ function auditChangeEntry(changeDir, changeName, canonicalMap) {
|
|
|
2304
2403
|
const tasksFile = path4__namespace.join(changeDir, "tasks.md");
|
|
2305
2404
|
const tasks = fs7__namespace.existsSync(tasksFile) ? parseTasksFromContent(fs7__namespace.readFileSync(tasksFile, "utf-8")) : [];
|
|
2306
2405
|
const completed = tasks.filter((t) => t.status === "COMPLETED");
|
|
2307
|
-
const targetReqs = handoff.subgraph
|
|
2406
|
+
const targetReqs = collectSubgraphPromotableIds(handoff.subgraph);
|
|
2308
2407
|
const { integrated, missing, gaps } = auditChangeRequirements(targetReqs, canonicalMap);
|
|
2309
2408
|
const status = resolveAuditStatus(integrated.length, targetReqs.length, gaps.length);
|
|
2310
2409
|
return {
|
|
@@ -2738,14 +2837,18 @@ function syncPdacDigests(options = {}) {
|
|
|
2738
2837
|
|
|
2739
2838
|
// src/init/starter-schemas.ts
|
|
2740
2839
|
var SCHEMA_SCHEMAS_ARCHITECTURE_ADR_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/architecture/adr.schema.json",\r\n "title": "Architecture Decision Record Schema (Versionable)",\r\n "type": "object",\r\n "required": ["id", "type", "title", "status", "version", "deciders", "decision-date"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^ADR-[0-9]{3,4}(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "architecture-decision-record"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Decision record semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["proposed", "accepted", "rejected", "deprecated", "superseded"]\r\n },\r\n "deciders": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": { "type": "string" }\r\n },\r\n "decision-date": {\r\n "type": "string",\r\n "format": "date"\r\n },\r\n "affects-components": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^ADR-[0-9]{3,4}(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^ADR-[0-9]{3,4}(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2741
|
-
var SCHEMA_SCHEMAS_ARCHITECTURE_COMPONENT_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/architecture/component.schema.json",\r\n "title": "NAF v4 / arc42 Architecture Component Schema (Multilevel)",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "level",\r\n "implementation-type",\r\n "implements-use-cases"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "component"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Architecture component semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["proposed", "accepted", "deprecated", "retired"]\r\n },\r\n "level": {\r\n "type": "integer",\r\n "minimum": 1,\r\n "description": "Hierarchical architecture level (1: Bounded Context / Root System, 2: Subsystem / Container, 3: Executable Unit / DLL / Function)."\r\n },\r\n "bounded-context": {\r\n "type": "string",\r\n "description": "Domain-Driven Design (DDD) Bounded Context name this component belongs to."\r\n },\r\n "parent-component": {\r\n "type": ["string", "null"],\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Parent component identifier (null if Level 1)."\r\n },\r\n "implementation-type": {\r\n "type": "string",\r\n "enum": ["service", "dll", "function", "composite"],\r\n "description": "Technical implementation paradigm: distributed service (service), dynamic/native library (dll), in-process module/function (function), or logical aggregator/Bounded Context (composite)."\r\n },\r\n "implements-use-cases": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "satisfies-requirements": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^(FR|QR|CON|SEC-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "hosted-in-enclave": {\r\n "type": "string",\r\n "pattern": "^SEC-ENC-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Security enclave where the component resides (optional for DLLs or in-process functions)."\r\n },\r\n "interfaces": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["name", "protocol"],\r\n "properties": {\r\n "name": { "type": "string" },\r\n "protocol": {\r\n "type": "string",\r\n "enum": [\r\n "REST/HTTP",\r\n "gRPC",\r\n "WebSocket",\r\n "Kafka",\r\n "MQTT",\r\n "C-ABI",\r\n "Native-ABI",\r\n "FFI",\r\n "In-Process API",\r\n "Function-Call",\r\n "CLI",\r\n "GUI",\r\n "IPC"\r\n ]\r\n },\r\n "contract-spec": { "type": "string" }\r\n }\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2742
|
-
var SCHEMA_SCHEMAS_ARCHITECTURE_INTRODUCTION_AND_GOALS_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/architecture/introduction-and-goals.schema.json",\r\n "title": "NAF v4 Enterprise & Capability / arc42 Introduction and System Goals Schema",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "naf-perspective",\r\n "cites-product-actors",\r\n "cites-quality-goals",\r\n "cites-use-cases"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^ARCH-INTRO-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "architecture-introduction"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Artifact semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "proposed", "accepted", "approved", "deprecated", "superseded"]\r\n },\r\n "owner": {\r\n "type": "string"\r\n },\r\n "arc42-section": {\r\n "type": "integer",\r\n "const": 1\r\n },\r\n "naf-perspective": {\r\n "type": "string",\r\n "const": "Enterprise & Capability"\r\n },\r\n "cites-product-actors": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "cites-quality-goals": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^(QR|SEC-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "cites-use-cases": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^ARCH-INTRO-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^ARCH-INTRO-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2840
|
+
var SCHEMA_SCHEMAS_ARCHITECTURE_COMPONENT_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/architecture/component.schema.json",\r\n "title": "NAF v4 / arc42 Architecture Component Schema (Multilevel)",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "level",\r\n "implementation-type",\r\n "implements-use-cases"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "component"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Architecture component semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["proposed", "accepted", "deprecated", "retired"]\r\n },\r\n "level": {\r\n "type": "integer",\r\n "minimum": 1,\r\n "description": "Hierarchical architecture level (1: Bounded Context / Root System, 2: Subsystem / Container, 3: Executable Unit / DLL / Function)."\r\n },\r\n "bounded-context": {\r\n "type": "string",\r\n "description": "Domain-Driven Design (DDD) Bounded Context name this component belongs to."\r\n },\r\n "parent-component": {\r\n "type": ["string", "null"],\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Parent component identifier (null if Level 1)."\r\n },\r\n "implementation-type": {\r\n "type": "string",\r\n "enum": ["service", "dll", "function", "composite"],\r\n "description": "Technical implementation paradigm: distributed service (service), dynamic/native library (dll), in-process module/function (function), or logical aggregator/Bounded Context (composite)."\r\n },\r\n "implements-use-cases": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "satisfies-requirements": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^(FR|QR|CON|SEC-REQ|SAF-REQ|PRIV-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "hosted-in-enclave": {\r\n "type": "string",\r\n "pattern": "^SEC-ENC-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Security enclave where the component resides (optional for DLLs or in-process functions)."\r\n },\r\n "interfaces": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["name", "protocol"],\r\n "properties": {\r\n "name": { "type": "string" },\r\n "protocol": {\r\n "type": "string",\r\n "enum": [\r\n "REST/HTTP",\r\n "gRPC",\r\n "WebSocket",\r\n "Kafka",\r\n "MQTT",\r\n "C-ABI",\r\n "Native-ABI",\r\n "FFI",\r\n "In-Process API",\r\n "Function-Call",\r\n "CLI",\r\n "GUI",\r\n "IPC"\r\n ]\r\n },\r\n "contract-spec": { "type": "string" }\r\n }\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2841
|
+
var SCHEMA_SCHEMAS_ARCHITECTURE_INTRODUCTION_AND_GOALS_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/architecture/introduction-and-goals.schema.json",\r\n "title": "NAF v4 Enterprise & Capability / arc42 Introduction and System Goals Schema",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "naf-perspective",\r\n "cites-product-actors",\r\n "cites-quality-goals",\r\n "cites-use-cases"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^ARCH-INTRO-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "architecture-introduction"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Artifact semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "proposed", "accepted", "approved", "deprecated", "superseded"]\r\n },\r\n "owner": {\r\n "type": "string"\r\n },\r\n "arc42-section": {\r\n "type": "integer",\r\n "const": 1\r\n },\r\n "naf-perspective": {\r\n "type": "string",\r\n "const": "Enterprise & Capability"\r\n },\r\n "cites-product-actors": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "cites-quality-goals": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^(QR|SEC-REQ|PRIV-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "cites-use-cases": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^ARCH-INTRO-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^ARCH-INTRO-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2743
2842
|
var SCHEMA_SCHEMAS_COMPLIANCE_LICENSE_MANIFEST_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/compliance/license-manifest.schema.json",\r\n "title": "Static Dependencies License Manifest Schema",\r\n "type": "object",\r\n "required": ["evaluated_dependencies"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(MAN-LIC|LIC-MAN|LIC)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Optional canonical artifact identifier."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "license-manifest"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+(\\\\.[0-9]+)?(-[0-9A-Za-z.-]+)?$",\r\n "description": "Manifest format version."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "description": {\r\n "type": "string"\r\n },\r\n "generated_at": {\r\n "type": "string"\r\n },\r\n "evaluated_dependencies": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "object",\r\n "required": ["package", "version", "spdx_license", "status"],\r\n "properties": {\r\n "package": {\r\n "type": "string",\r\n "minLength": 1\r\n },\r\n "version": {\r\n "type": "string",\r\n "minLength": 1\r\n },\r\n "spdx_license": {\r\n "type": "string",\r\n "minLength": 1\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": [\r\n "APPROVED",\r\n "REJECTED",\r\n "REVIEW_REQUIRED",\r\n "COMMERCIAL_APPROVAL_REQUIRED",\r\n "PENDING"\r\n ]\r\n },\r\n "reason": {\r\n "type": "string"\r\n },\r\n "approved_by": {\r\n "type": "string"\r\n }\r\n },\r\n "additionalProperties": false\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2744
2843
|
var SCHEMA_SCHEMAS_COMPLIANCE_LICENSE_POLICY_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/compliance/license-policy.schema.json",\r\n "title": "Open Source License Policy Schema",\r\n "type": "object",\r\n "required": ["version", "project", "default_action", "categories", "agent_guardrails", "ci_gates"],\r\n "properties": {\r\n "version": {\r\n "type": "string"\r\n },\r\n "project": {\r\n "type": "string"\r\n },\r\n "default_action": {\r\n "type": "string",\r\n "enum": ["ALLOW", "DENY", "REVIEW_REQUIRED"]\r\n },\r\n "categories": {\r\n "type": "object"\r\n },\r\n "agent_guardrails": {\r\n "type": "object",\r\n "required": ["enforce_pre_check", "reject_unknown_licenses"],\r\n "properties": {\r\n "enforce_pre_check": { "type": "boolean" },\r\n "reject_unknown_licenses": { "type": "boolean" },\r\n "auto_reject_categories": { "type": "array", "items": { "type": "string" } },\r\n "on_commercial_detected": { "type": "object" }\r\n }\r\n },\r\n "ci_gates": {\r\n "type": "object",\r\n "required": ["fail_on_denied", "generate_sbom"],\r\n "properties": {\r\n "fail_on_denied": { "type": "boolean" },\r\n "fail_on_missing_license": { "type": "boolean" },\r\n "generate_sbom": { "type": "boolean" },\r\n "sbom_format": { "type": "string" },\r\n "output_notices_file": { "type": "string" },\r\n "allowed_depth": { "type": "string", "enum": ["DIRECT", "TRANSITIVE"] }\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2745
2844
|
var SCHEMA_SCHEMAS_COMPLIANCE_QUALITY_POLICY_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/compliance/quality-policy.schema.json",\r\n "title": "Software Quality Policy Schema (Polyglot)",\r\n "type": "object",\r\n "required": ["version", "project", "enforcement_mode", "coding_rules", "release_thresholds", "agent_guardrails"],\r\n "properties": {\r\n "version": { "type": "string" },\r\n "project": { "type": "string" },\r\n "enforcement_mode": { "type": "string", "enum": ["STRICT", "PERMISSIVE"] },\r\n "scope": {\r\n "type": "object",\r\n "properties": {\r\n "target_directories": { "type": "array", "items": { "type": "string" } },\r\n "supported_extensions": { "type": "array", "items": { "type": "string" } },\r\n "exclude_patterns": { "type": "array", "items": { "type": "string" } }\r\n }\r\n },\r\n "language_toolchains": {\r\n "type": "object"\r\n },\r\n "coding_rules": {\r\n "type": "object",\r\n "required": ["standards", "enforce_formatting", "rules"],\r\n "properties": {\r\n "standards": { "type": "array", "items": { "type": "string" } },\r\n "enforce_formatting": { "type": "boolean" },\r\n "formatting_engine": { "type": "string" },\r\n "linter_engine": { "type": "string" },\r\n "rules": { "type": "object" }\r\n }\r\n },\r\n "release_thresholds": {\r\n "type": "object",\r\n "required": ["cyclomatic_complexity", "cognitive_complexity", "maintainability_index", "code_duplication", "test_coverage"],\r\n "properties": {\r\n "cyclomatic_complexity": {\r\n "type": "object",\r\n "required": ["max_per_function", "action_on_breach"],\r\n "properties": {\r\n "max_per_function": { "type": "integer" },\r\n "warning_at": { "type": "integer" },\r\n "action_on_breach": { "type": "string" }\r\n }\r\n },\r\n "cognitive_complexity": {\r\n "type": "object",\r\n "required": ["max_per_function", "action_on_breach"],\r\n "properties": {\r\n "max_per_function": { "type": "integer" },\r\n "warning_at": { "type": "integer" },\r\n "action_on_breach": { "type": "string" }\r\n }\r\n },\r\n "maintainability_index": {\r\n "type": "object",\r\n "required": ["min_acceptable_score", "action_on_breach"],\r\n "properties": {\r\n "min_acceptable_score": { "type": "number" },\r\n "target_score": { "type": "number" },\r\n "action_on_breach": { "type": "string" }\r\n }\r\n },\r\n "code_duplication": {\r\n "type": "object",\r\n "required": ["max_percentage", "action_on_breach"],\r\n "properties": {\r\n "max_percentage": { "type": "number" },\r\n "action_on_breach": { "type": "string" }\r\n }\r\n },\r\n "test_coverage": {\r\n "type": "object",\r\n "required": ["min_line_coverage_percent", "action_on_breach"],\r\n "properties": {\r\n "min_line_coverage_percent": { "type": "number" },\r\n "min_branch_coverage_percent": { "type": "number" },\r\n "min_function_coverage_percent": { "type": "number" },\r\n "action_on_breach": { "type": "string" }\r\n }\r\n },\r\n "technical_debt": {\r\n "type": "object"\r\n }\r\n }\r\n },\r\n "agent_guardrails": {\r\n "type": "object",\r\n "required": ["enforce_pre_commit_linter", "prevent_suppression_comments"],\r\n "properties": {\r\n "enforce_pre_commit_linter": { "type": "boolean" },\r\n "prevent_suppression_comments": { "type": "boolean" },\r\n "auto_refactor_on_high_complexity": { "type": "boolean" }\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2746
2845
|
var SCHEMA_SCHEMAS_IDE_MCP_CONFIG_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/ide/mcp-config.schema.json",\r\n "title": "IDE MCP Configuration Schema (Cursor, Antigravity, VS Code)",\r\n "type": "object",\r\n "properties": {\r\n "$schema": {\r\n "type": "string"\r\n },\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(MCP-CFG|IDE-MCP|MCP)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Optional identifier for MCP configuration artifact."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "mcp-config"\r\n },\r\n "mcpServers": {\r\n "type": "object",\r\n "additionalProperties": {\r\n "type": "object",\r\n "required": ["command"],\r\n "properties": {\r\n "command": {\r\n "type": "string",\r\n "minLength": 1\r\n },\r\n "args": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n },\r\n "env": {\r\n "type": "object"\r\n },\r\n "disabled": {\r\n "type": "boolean"\r\n },\r\n "alwaysAllow": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n },\r\n "description": "MCP server registry format for Cursor and Antigravity."\r\n },\r\n "servers": {\r\n "type": "object",\r\n "additionalProperties": {\r\n "type": "object",\r\n "required": ["command"],\r\n "properties": {\r\n "command": {\r\n "type": "string",\r\n "minLength": 1\r\n },\r\n "args": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n },\r\n "env": {\r\n "type": "object"\r\n },\r\n "disabled": {\r\n "type": "boolean"\r\n },\r\n "alwaysAllow": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n },\r\n "description": "MCP server registry format for VS Code."\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2747
2846
|
var SCHEMA_SCHEMAS_MANUALS_PRODUCTION_MANUAL_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/manuals/production-manual.schema.json",\r\n "title": "AI-SDLC Production & Operations Manual Schema",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "applies-to-version",\r\n "target-audience"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^MAN-PROD-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Immutable production manual identifier (e.g. MAN-PROD-SENTINELCORE)."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "production-manual"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Document semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string",\r\n "description": "Template schema version."\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3,\r\n "description": "Descriptive title of the production manual."\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "applies-to-version": {\r\n "type": "string",\r\n "description": "Software version or release this production manual applies to (e.g. v1.0.0)."\r\n },\r\n "target-audience": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n },\r\n "minItems": 1,\r\n "description": "Target technical profiles (e.g. DevOps, SRE, Release Manager, SecOps)."\r\n },\r\n "components-covered": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Architecture components (CMP-*) deployed and covered by the manual."\r\n },\r\n "enclaves-involved": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^SEC-ENC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Security enclaves (SEC-ENC-*) in which deployment executes."\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^MAN-PROD-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^MAN-PROD-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2748
2847
|
var SCHEMA_SCHEMAS_MANUALS_USER_MANUAL_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/manuals/user-manual.schema.json",\r\n "title": "AI-SDLC User Manual Schema",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "target-audience",\r\n "allowed-roles",\r\n "applies-to-version"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^MAN-USER-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Immutable user manual identifier (e.g. MAN-USER-SENTINELCORE)."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "user-manual"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Document semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string",\r\n "description": "Template schema version."\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3,\r\n "description": "Descriptive title of the user manual."\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "applies-to-version": {\r\n "type": "string",\r\n "description": "Software version or release this manual applies to (e.g. v1.0.0)."\r\n },\r\n "target-audience": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n },\r\n "minItems": 1,\r\n "description": "Target user profiles or roles for the manual."\r\n },\r\n "allowed-roles": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n },\r\n "minItems": 1,\r\n "description": "Formal catalog of authorized roles to operate the application (linked to ACT-*)."\r\n },\r\n "journeys-covered": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^JRN-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Product journey identifiers (JRN-*) covered in the manual."\r\n },\r\n "use-cases-covered": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Use case identifiers (UC-*) implemented across journeys."\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^MAN-USER-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^MAN-USER-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2848
|
+
var SCHEMA_SCHEMAS_PRIVACY_DATA_ASSET_SCHEMA_JSON = '{\n "$schema": "https://json-schema.org/draft/2020-12/schema",\n "$id": "https://ai-sdlc.org/schemas/privacy/data-asset.schema.json",\n "title": "Personal Data Asset & PII Inventory Schema (DATA-ASSET-*)",\n "type": "object",\n "required": [\n "id",\n "type",\n "title",\n "status",\n "version",\n "classification",\n "pii-categories",\n "data-subjects",\n "retention-period",\n "erasure-method"\n ],\n "properties": {\n "id": {\n "type": "string",\n "pattern": "^DATA-ASSET-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "type": {\n "type": "string",\n "const": "data-asset"\n },\n "version": {\n "type": "string",\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\n "description": "Data asset semantic version (SemVer)."\n },\n "schema-version": {\n "type": "string"\n },\n "title": {\n "type": "string",\n "minLength": 3\n },\n "status": {\n "type": "string",\n "enum": ["draft", "active", "deprecated", "retired"]\n },\n "classification": {\n "type": "string",\n "enum": [\n "public",\n "internal",\n "confidential-pii",\n "special-category-sensitive"\n ],\n "description": "Data sensitivity classification aligned with privacy-policy.yaml."\n },\n "pii-categories": {\n "type": "array",\n "minItems": 1,\n "items": {\n "type": "string",\n "enum": [\n "identifiers",\n "contact",\n "authentication",\n "financial",\n "location",\n "behavioral",\n "biometric",\n "health",\n "telemetry-operator"\n ]\n }\n },\n "data-subjects": {\n "type": "array",\n "minItems": 1,\n "items": {\n "type": "string",\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "description": "Product actors (ACT-*) whose personal data is stored or processed."\n },\n "fields": {\n "type": "array",\n "items": {\n "type": "object",\n "required": ["name", "sensitivity", "masking-strategy"],\n "properties": {\n "name": {\n "type": "string",\n "minLength": 1\n },\n "sensitivity": {\n "type": "string",\n "enum": ["public", "internal", "pii", "special-category"]\n },\n "masking-strategy": {\n "type": "string",\n "enum": [\n "none",\n "redact",\n "sha256-salt",\n "tokenize",\n "aes-256-gcm",\n "truncate"\n ]\n }\n },\n "additionalProperties": false\n }\n },\n "retention-period": {\n "type": "string",\n "pattern": "^([0-9]+(d|m|y)|session-only|indefinite-anonymized)$",\n "description": "Maximum retention TTL (e.g. 30d, 12m, 5y, session-only, indefinite-anonymized)."\n },\n "erasure-method": {\n "type": "string",\n "enum": [\n "hard-delete",\n "crypto-shredding",\n "irreversible-anonymization"\n ]\n },\n "owner-bounded-context": {\n "type": "string",\n "pattern": "^(BC|CMP)-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "supersedes": {\n "type": ["string", "null"],\n "pattern": "^DATA-ASSET-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "superseded-by": {\n "type": ["string", "null"],\n "pattern": "^DATA-ASSET-[A-Z0-9]+(-[A-Z0-9]+)*$"\n }\n },\n "additionalProperties": false\n}\n';
|
|
2849
|
+
var SCHEMA_SCHEMAS_PRIVACY_PRIVACY_POLICY_SCHEMA_JSON = '{\n "$schema": "https://json-schema.org/draft/2020-12/schema",\n "$id": "https://ai-sdlc.org/schemas/privacy/privacy-policy.schema.json",\n "title": "Privacy-by-Design as Code Governance Policy Schema",\n "type": "object",\n "required": [\n "version",\n "project",\n "regulatory_frameworks",\n "default_action",\n "classifications",\n "agent_guardrails",\n "ci_gates"\n ],\n "properties": {\n "id": {\n "type": "string",\n "pattern": "^(PRIV-POL|POL-PRIV)-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "type": {\n "type": "string",\n "const": "privacy-policy"\n },\n "version": {\n "type": "string",\n "minLength": 1\n },\n "project": {\n "type": "string",\n "minLength": 1\n },\n "regulatory_frameworks": {\n "type": "array",\n "minItems": 1,\n "items": {\n "type": "string",\n "enum": ["GDPR", "LOPDGDD", "ISO-27701", "CCPA", "HIPAA", "LGPD"]\n }\n },\n "default_action": {\n "type": "string",\n "enum": ["DENY_UNREGISTERED_PII", "ALLOW", "REVIEW_REQUIRED"]\n },\n "classifications": {\n "type": "object",\n "required": ["public", "internal", "confidential_pii", "special_category_sensitive"],\n "additionalProperties": {\n "type": "object",\n "required": ["action", "encryption_at_rest", "encryption_in_transit", "allow_in_logs", "allow_in_ai_prompts"],\n "properties": {\n "action": {\n "type": "string",\n "enum": ["ALLOW", "STRICT_GOVERNANCE", "DPIA_APPROVAL_REQUIRED", "DENY"]\n },\n "description": { "type": "string" },\n "exception_requires": { "type": "string" },\n "require_ropa_entry": { "type": "boolean" },\n "require_dpia_artifact": { "type": "boolean" },\n "encryption_at_rest": { "type": "boolean" },\n "encryption_in_transit": { "type": "boolean" },\n "require_field_level_encryption": { "type": "boolean" },\n "allow_in_logs": { "type": "boolean" },\n "log_masking_strategy": { "type": "string" },\n "allow_in_ai_prompts": { "type": "boolean" },\n "max_retention_days": { "type": "integer", "minimum": 1 },\n "require_right_to_erasure": { "type": "boolean" }\n },\n "additionalProperties": false\n }\n },\n "cross_border_transfers": {\n "type": "object",\n "properties": {\n "allowed_regions": {\n "type": "array",\n "items": { "type": "string" }\n },\n "require_scc_for_third_countries": { "type": "boolean" },\n "approved_subprocessors": {\n "type": "array",\n "items": { "type": "string" }\n }\n },\n "additionalProperties": false\n },\n "agent_guardrails": {\n "type": "object",\n "required": [\n "forbid_real_pii_in_tests",\n "forbid_pii_in_console_or_logger",\n "require_dto_projection_for_pii"\n ],\n "properties": {\n "forbid_real_pii_in_tests": { "type": "boolean" },\n "forbid_pii_in_console_or_logger": { "type": "boolean" },\n "require_dto_projection_for_pii": { "type": "boolean" },\n "on_special_category_detected": {\n "type": "object",\n "required": ["action", "notification_tag", "message"],\n "properties": {\n "action": { "type": "string" },\n "notification_tag": { "type": "string" },\n "message": { "type": "string" }\n },\n "additionalProperties": false\n }\n },\n "additionalProperties": false\n },\n "ci_gates": {\n "type": "object",\n "required": [\n "fail_on_unregistered_pii",\n "fail_on_pii_in_logs",\n "fail_on_missing_retention_policy",\n "generate_ropa_inventory",\n "output_ropa_file",\n "output_privacy_report"\n ],\n "properties": {\n "fail_on_unregistered_pii": { "type": "boolean" },\n "fail_on_pii_in_logs": { "type": "boolean" },\n "fail_on_missing_retention_policy": { "type": "boolean" },\n "fail_on_unapproved_subprocessor": { "type": "boolean" },\n "generate_ropa_inventory": { "type": "boolean" },\n "output_ropa_file": { "type": "string" },\n "output_privacy_report": { "type": "string" }\n },\n "additionalProperties": false\n }\n },\n "additionalProperties": false\n}\n';
|
|
2850
|
+
var SCHEMA_SCHEMAS_PRIVACY_PRIVACY_REQ_SCHEMA_JSON = '{\n "$schema": "https://json-schema.org/draft/2020-12/schema",\n "$id": "https://ai-sdlc.org/schemas/privacy/privacy-req.schema.json",\n "title": "Privacy Requirement & Technical Control Schema (PRIV-REQ-*)",\n "type": "object",\n "required": [\n "id",\n "type",\n "title",\n "status",\n "version",\n "privacy-principle",\n "linddun-category",\n "governs-ropa"\n ],\n "properties": {\n "id": {\n "type": "string",\n "pattern": "^PRIV-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "type": {\n "type": "string",\n "const": "privacy-requirement"\n },\n "version": {\n "type": "string",\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\n "description": "Privacy requirement semantic version (SemVer)."\n },\n "schema-version": {\n "type": "string"\n },\n "title": {\n "type": "string",\n "minLength": 3\n },\n "status": {\n "type": "string",\n "enum": ["draft", "active", "deprecated", "retired"]\n },\n "privacy-principle": {\n "type": "string",\n "enum": [\n "data-minimization",\n "purpose-limitation",\n "storage-limitation",\n "accuracy",\n "integrity-and-confidentiality",\n "transparency-and-consent",\n "data-subject-rights-arco",\n "pseudonymization-anonymization"\n ]\n },\n "linddun-category": {\n "type": "string",\n "enum": [\n "linkability",\n "identifiability",\n "non-repudiation",\n "detectability",\n "disclosure-of-information",\n "unawareness",\n "non-compliance"\n ],\n "description": "LINDDUN privacy threat category mitigated by this control."\n },\n "governs-ropa": {\n "type": "array",\n "minItems": 1,\n "items": {\n "type": "string",\n "pattern": "^PRIV-ROPA-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "description": "Upstream ROPA records (PRIV-ROPA-*) governed by this privacy requirement."\n },\n "protects-data-assets": {\n "type": "array",\n "items": {\n "type": "string",\n "pattern": "^DATA-ASSET-[A-Z0-9]+(-[A-Z0-9]+)*$"\n }\n },\n "enforced-in-enclave": {\n "type": "string",\n "pattern": "^SEC-ENC-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "compliance-references": {\n "type": "array",\n "items": {\n "type": "string"\n }\n },\n "acceptance-format": {\n "type": "string",\n "enum": ["gherkin", "declarative-prose"]\n },\n "cucumber-tags": {\n "type": "array",\n "items": {\n "type": "string",\n "pattern": "^@[a-zA-Z0-9_-]+$"\n }\n },\n "supersedes": {\n "type": ["string", "null"],\n "pattern": "^PRIV-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "superseded-by": {\n "type": ["string", "null"],\n "pattern": "^PRIV-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\n }\n },\n "additionalProperties": false\n}\n';
|
|
2851
|
+
var SCHEMA_SCHEMAS_PRIVACY_PRIVACY_ROPA_SCHEMA_JSON = '{\n "$schema": "https://json-schema.org/draft/2020-12/schema",\n "$id": "https://ai-sdlc.org/schemas/privacy/privacy-ropa.schema.json",\n "title": "Record of Processing Activities Schema (PRIV-ROPA-* / GDPR Art. 30)",\n "type": "object",\n "required": [\n "id",\n "type",\n "title",\n "status",\n "version",\n "lawful-basis",\n "processing-purpose",\n "use-cases",\n "data-assets",\n "data-subjects",\n "retention-ttl"\n ],\n "properties": {\n "id": {\n "type": "string",\n "pattern": "^PRIV-ROPA-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "type": {\n "type": "string",\n "const": "privacy-ropa"\n },\n "version": {\n "type": "string",\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\n "description": "ROPA record semantic version (SemVer)."\n },\n "schema-version": {\n "type": "string"\n },\n "title": {\n "type": "string",\n "minLength": 3\n },\n "status": {\n "type": "string",\n "enum": ["draft", "active", "deprecated", "retired"]\n },\n "lawful-basis": {\n "type": "string",\n "enum": [\n "consent",\n "contract",\n "legal-obligation",\n "vital-interests",\n "public-task",\n "legitimate-interests"\n ],\n "description": "Lawful basis for processing under GDPR Art. 6.1."\n },\n "special-category-condition": {\n "type": ["string", "null"],\n "enum": [\n null,\n "explicit-consent",\n "employment-social-security",\n "vital-interests",\n "public-interest",\n "preventive-medicine",\n "public-health"\n ],\n "description": "GDPR Art. 9.2 condition when processing special category data."\n },\n "processing-purpose": {\n "type": "string",\n "minLength": 10\n },\n "use-cases": {\n "type": "array",\n "minItems": 1,\n "items": {\n "type": "string",\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "description": "Upstream Use Cases (UC-*) that trigger this data processing activity."\n },\n "data-assets": {\n "type": "array",\n "minItems": 1,\n "items": {\n "type": "string",\n "pattern": "^DATA-ASSET-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "description": "Personal Data Assets (DATA-ASSET-*) processed in this activity."\n },\n "data-subjects": {\n "type": "array",\n "minItems": 1,\n "items": {\n "type": "string",\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$"\n }\n },\n "retention-ttl": {\n "type": "string",\n "pattern": "^([0-9]+(d|m|y)|session-only|indefinite-anonymized)$"\n },\n "cross-border-transfer": {\n "type": "boolean"\n },\n "transfer-safeguards": {\n "type": ["string", "null"],\n "enum": [null, "adequacy-decision", "scc", "bcr", "derogation"]\n },\n "subprocessors": {\n "type": "array",\n "items": {\n "type": "string"\n }\n },\n "dpia-required": {\n "type": "boolean"\n },\n "dpia-reference": {\n "type": ["string", "null"],\n "pattern": "^DPIA-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "mitigated-by": {\n "type": "array",\n "items": {\n "type": "string",\n "pattern": "^PRIV-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "description": "Privacy requirements (PRIV-REQ-*) governing and enforcing this processing activity."\n },\n "supersedes": {\n "type": ["string", "null"],\n "pattern": "^PRIV-ROPA-[A-Z0-9]+(-[A-Z0-9]+)*$"\n },\n "superseded-by": {\n "type": ["string", "null"],\n "pattern": "^PRIV-ROPA-[A-Z0-9]+(-[A-Z0-9]+)*$"\n }\n },\n "additionalProperties": false\n}\n';
|
|
2749
2852
|
var SCHEMA_SCHEMAS_PRODUCT_ACTOR_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/product/actor.schema.json",\r\n "title": "ProductShape Actor Schema (Versionable)",\r\n "type": "object",\r\n "required": ["id", "type", "title", "status", "version", "role-type"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "actor"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Artifact semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string",\r\n "description": "Schema specification version used."\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "role-type": {\r\n "type": "string",\r\n "enum": ["human-user", "ai-agent", "external-system", "sensor-iot"]\r\n },\r\n "description": {\r\n "type": "string"\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Identifier of the actor superseded by this version or artifact."\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Identifier of the new actor superseding this one upon deprecation/retirement."\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2750
2853
|
var SCHEMA_SCHEMAS_PRODUCT_BUSINESS_RULE_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/product/business-rule.schema.json",\r\n "title": "ProductShape Business Rule Schema (Versionable)",\r\n "type": "object",\r\n "required": ["id", "type", "title", "status", "version", "enforcement-level"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^BR-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "business-rule"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Business rule semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "enforcement-level": {\r\n "type": "string",\r\n "enum": ["strict-invariant", "override-with-approval", "guideline"]\r\n },\r\n "defined-in": {\r\n "type": "string",\r\n "pattern": "^BC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "uses-terms": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^TERM-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^BR-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^BR-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2751
2854
|
var SCHEMA_SCHEMAS_PRODUCT_JOURNEY_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/product/journey.schema.json",\r\n "title": "Customer / Operator Journey Schema",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "persona",\r\n "stages",\r\n "touchpoints"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^JRN-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "journey"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Journey semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "persona": {\r\n "type": "string",\r\n "pattern": "^ACT-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Actor (persona) starring in this journey."\r\n },\r\n "stages": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string"\r\n },\r\n "description": "Sequential journey stages (e.g. Awareness, Onboarding, Activation, Retention)."\r\n },\r\n "touchpoints": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string"\r\n },\r\n "description": "Touchpoints between persona and system at each stage."\r\n },\r\n "related-use-cases": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "System use cases related to this journey."\r\n },\r\n "pain-points": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n },\r\n "description": "Frictions or issues detected along the user journey."\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"]\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"]\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
@@ -2755,12 +2858,12 @@ var SCHEMA_SCHEMAS_PRODUCT_USE_CASE_SCHEMA_JSON = '{\r\n "$schema": "https://js
|
|
|
2755
2858
|
var SCHEMA_SCHEMAS_SAFETY_HAZARD_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/safety/hazard.schema.json",\r\n "title": "Hazard Schema (Operational Hazard & Safety Risk Analysis)",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "severity",\r\n "probability",\r\n "fault-tolerance-time-ms",\r\n "mitigated-by"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^HAZ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "hazard"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Hazard semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "severity": {\r\n "type": "string",\r\n "enum": ["catastrophic", "critical", "major", "minor", "negligible"],\r\n "description": "Hazard severity per functional safety classification (DO-178C / ISO 26262)."\r\n },\r\n "probability": {\r\n "type": "string",\r\n "enum": ["frequent", "probable", "occasional", "remote", "improbable", "extremely-improbable"],\r\n "description": "Probability of operational hazard occurrence."\r\n },\r\n "fault-tolerance-time-ms": {\r\n "type": "number",\r\n "minimum": 0,\r\n "description": "Fault tolerance time interval (FTTI) limit in milliseconds before entering safe state."\r\n },\r\n "mitigated-by": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^SAF-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Safety requirements mitigating this hazard."\r\n },\r\n "hazardous-condition": {\r\n "type": "string",\r\n "description": "Description of the dangerous operational condition."\r\n },\r\n "potential-effect": {\r\n "type": "string",\r\n "description": "Potential effect on people, aircraft, or environment if hazard materializes."\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"]\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"]\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2756
2859
|
var SCHEMA_SCHEMAS_SAFETY_SAFETY_REQ_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/safety/safety-req.schema.json",\r\n "title": "Safety Requirement Schema (Functional Safety & Hazard Mitigation)",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "title",\r\n "status",\r\n "version",\r\n "safety-domain",\r\n "safety-integrity-level",\r\n "mitigates-hazard",\r\n "fail-safe-action"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^SAF-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "safety-requirement"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Safety requirement semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "safety-domain": {\r\n "type": "string",\r\n "enum": [\r\n "flight-control",\r\n "collision-avoidance",\r\n "energy-management",\r\n "emergency-recovery",\r\n "sensor-integrity",\r\n "propulsion",\r\n "telemetry"\r\n ],\r\n "description": "Operational safety domain."\r\n },\r\n "safety-integrity-level": {\r\n "type": "string",\r\n "description": "Safety integrity level (e.g. DAL-A..D, ASIL-A..D, SIL-1..4)."\r\n },\r\n "mitigates-hazard": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^HAZ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Operational hazards mitigated by safety control."\r\n },\r\n "fail-safe-action": {\r\n "type": "string",\r\n "description": "Automatic action or contingency maneuver to enter safe state."\r\n },\r\n "fault-tolerance-time-ms": {\r\n "type": "number",\r\n "description": "Fault tolerance time interval limit in milliseconds (FTTI)."\r\n },\r\n "acceptance-format": {\r\n "type": "string",\r\n "enum": ["gherkin", "declarative-prose"]\r\n },\r\n "cucumber-tags": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"]\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"]\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2757
2860
|
var SCHEMA_SCHEMAS_SDD_DESIGN_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/design.schema.json",\r\n "title": "Spec-Driven Development Technical Design Schema (DSG-*)",\r\n "type": "object",\r\n "required": ["id", "type", "title"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(DSG-[A-Z0-9]+(-[A-Z0-9]+)*|CHG-[A-Z0-9]+-DESIGN|[A-Z0-9]+(-[A-Z0-9]+)*)$",\r\n "description": "Unique identifier of the technical design specification."\r\n },\r\n "type": {\r\n "type": "string",\r\n "enum": ["spec-design", "spec-change-design", "design"]\r\n },\r\n "change-id": {\r\n "type": "string",\r\n "pattern": "^(CHG|FEAT|PATCH)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Parent change identifier associated with this design."\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Semantic versioning (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "handoff": {\r\n "type": "string",\r\n "pattern": "^HOF-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Reference to the HOF-* sidecar."\r\n },\r\n "architecture-component": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Associated architecture component."\r\n },\r\n "architecture-components": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "List of architecture components covered by this technical design."\r\n },\r\n "enclave": {\r\n "type": "string",\r\n "pattern": "^(SEC-ENC-)?[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Zero trust security enclave."\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": [\r\n "draft",\r\n "proposed",\r\n "review",\r\n "approved",\r\n "active",\r\n "completed",\r\n "deprecated"\r\n ]\r\n },\r\n "author": {\r\n "type": "string"\r\n },\r\n "date": {\r\n "type": "string"\r\n },\r\n "contracts": {\r\n "type": "array",\r\n "description": "Explicit contract interfaces and methods designed for implementation and unit testing.",\r\n "items": {\r\n "oneOf": [\r\n { "type": "string", "minLength": 1 },\r\n {\r\n "type": "object",\r\n "required": ["methods"],\r\n "properties": {\r\n "component": { "type": "string" },\r\n "interface": { "type": "string" },\r\n "methods": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": { "type": "string", "minLength": 1 }\r\n }\r\n },\r\n "additionalProperties": false\r\n }\r\n ]\r\n }\r\n },\r\n "citations": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["id"],\r\n "properties": {\r\n "id": { "type": "string" },\r\n "digest": { "type": "string" },\r\n "comment": { "type": "string" },\r\n "anchor": { "type": "string" }\r\n },\r\n "additionalProperties": false\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2758
|
-
var SCHEMA_SCHEMAS_SDD_HANDOFF_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/handoff.schema.json",\r\n "title": "PDaC Product Handoff Sidecar Schema (HOF-*)",\r\n "type": "object",\r\n "required": ["id", "type", "changeId", "subgraph"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^HOF-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Immutable identifier emitted by PDaC handoff."\r\n },\r\n "type": {\r\n "type": "string",\r\n "enum": ["handoff", "product-handoff"]\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "changeId": {\r\n "type": "string",\r\n "pattern": "^(CHG|FEAT)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$"\r\n },\r\n "createdAt": {\r\n "type": "string"\r\n },\r\n "subgraph": {\r\n "type": "object",\r\n "required": ["requirements"],\r\n "properties": {\r\n "requirements": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": { "type": "string" }\r\n },\r\n "useCases": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "businessRules": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "securityRequirements": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "abuseCases": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "actors": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n }\r\n },\r\n "additionalProperties": true\r\n },\r\n "citations": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["id"],\r\n "properties": {\r\n "id": { "type": "string" },\r\n "digest": { "type": "string" },\r\n "anchor": { "type": "string" },\r\n "comment": { "type": "string" }\r\n }\r\n }\r\n }\r\n },\r\n "additionalProperties": true\r\n}\r\n';
|
|
2861
|
+
var SCHEMA_SCHEMAS_SDD_HANDOFF_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/handoff.schema.json",\r\n "title": "PDaC Product Handoff Sidecar Schema (HOF-*)",\r\n "type": "object",\r\n "required": ["id", "type", "changeId", "subgraph"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^HOF-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Immutable identifier emitted by PDaC handoff."\r\n },\r\n "type": {\r\n "type": "string",\r\n "enum": ["handoff", "product-handoff"]\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "changeId": {\r\n "type": "string",\r\n "pattern": "^(CHG|FEAT)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$"\r\n },\r\n "createdAt": {\r\n "type": "string"\r\n },\r\n "subgraph": {\r\n "type": "object",\r\n "required": ["requirements"],\r\n "properties": {\r\n "requirements": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": { "type": "string" }\r\n },\r\n "useCases": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "businessRules": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "securityRequirements": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "abuseCases": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "privacyRequirements": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "dataAssets": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "privacyRopa": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n },\r\n "actors": {\r\n "type": "array",\r\n "items": { "type": "string" }\r\n }\r\n },\r\n "additionalProperties": true\r\n },\r\n "citations": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["id"],\r\n "properties": {\r\n "id": { "type": "string" },\r\n "digest": { "type": "string" },\r\n "anchor": { "type": "string" },\r\n "comment": { "type": "string" }\r\n }\r\n }\r\n }\r\n },\r\n "additionalProperties": true\r\n}\r\n';
|
|
2759
2862
|
var SCHEMA_SCHEMAS_SDD_PROPOSAL_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/proposal.schema.json",\r\n "title": "Spec-Driven Development Change Proposal Schema (CHG-*)",\r\n "type": "object",\r\n "required": ["id", "type", "title", "status"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(CHG|FEAT|PATCH)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Unique identifier of the change proposal."\r\n },\r\n "type": {\r\n "type": "string",\r\n "enum": ["spec-change-proposal", "proposal"]\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": [\r\n "draft",\r\n "proposed",\r\n "review",\r\n "approved",\r\n "applied",\r\n "active",\r\n "completed",\r\n "rejected"\r\n ]\r\n },\r\n "author": {\r\n "type": "string"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Semantic versioning (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "date": {\r\n "type": "string"\r\n },\r\n "handoff": {\r\n "type": "string",\r\n "description": "Associated handoff sidecar reference."\r\n },\r\n "sdd-framework-compat": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n },\r\n "description": "Supported SDD framework adapters."\r\n },\r\n "citations": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["id"],\r\n "properties": {\r\n "id": { "type": "string" },\r\n "digest": { "type": "string" },\r\n "comment": { "type": "string" },\r\n "anchor": { "type": "string" }\r\n },\r\n "additionalProperties": false\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2760
2863
|
var SCHEMA_SCHEMAS_SDD_RELEASE_KPIS_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/release-kpis.schema.json",\r\n "title": "Release Consolidated KPIs & Attribution Telemetry Schema",\r\n "type": "object",\r\n "required": [\r\n "releaseBranch",\r\n "baseBranch",\r\n "generatedAt",\r\n "totalCommits",\r\n "totalLinesAdded",\r\n "totalLinesDeleted",\r\n "totalKloc",\r\n "totalBugs",\r\n "globalDefectDensity",\r\n "totalTimeSeconds",\r\n "totalTokens",\r\n "totalCostUsd",\r\n "authorStats",\r\n "bugList"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(KPI-REL|REL-KPI)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Optional artifact identifier."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "release-kpis"\r\n },\r\n "releaseBranch": {\r\n "type": "string"\r\n },\r\n "baseBranch": {\r\n "type": "string"\r\n },\r\n "generatedAt": {\r\n "type": "string"\r\n },\r\n "totalCommits": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "totalLinesAdded": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "totalLinesDeleted": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "totalKloc": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "totalBugs": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "globalDefectDensity": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "totalTimeSeconds": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "totalTokens": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "totalCostUsd": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "reworkTimeSeconds": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "reworkTokens": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "reworkCostUsd": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "reworkTimePercent": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "reworkTokensPercent": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "reworkCostPercent": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "authorStats": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": [\r\n "authorOrModel",\r\n "isAgent",\r\n "commits",\r\n "linesAdded",\r\n "linesDeleted",\r\n "klocProduced",\r\n "bugsInjected",\r\n "defectInjectionRate",\r\n "totalTimeSeconds",\r\n "totalTokens",\r\n "estimatedCostUsd"\r\n ],\r\n "properties": {\r\n "authorOrModel": {\r\n "type": "string"\r\n },\r\n "isAgent": {\r\n "type": "boolean"\r\n },\r\n "commits": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "linesAdded": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "linesDeleted": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "klocProduced": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "bugsInjected": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "defectInjectionRate": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "totalTimeSeconds": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "totalTokens": {\r\n "type": "integer",\r\n "minimum": 0\r\n },\r\n "estimatedCostUsd": {\r\n "type": "number",\r\n "minimum": 0\r\n }\r\n },\r\n "additionalProperties": false\r\n }\r\n },\r\n "bugList": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["sha", "subject", "author", "timeSeconds", "tokens"],\r\n "properties": {\r\n "sha": {\r\n "type": "string"\r\n },\r\n "subject": {\r\n "type": "string"\r\n },\r\n "author": {\r\n "type": "string"\r\n },\r\n "parentRef": {\r\n "type": "string"\r\n },\r\n "timeSeconds": {\r\n "type": "number",\r\n "minimum": 0\r\n },\r\n "tokens": {\r\n "type": "integer",\r\n "minimum": 0\r\n }\r\n },\r\n "additionalProperties": false\r\n }\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2761
2864
|
var SCHEMA_SCHEMAS_SDD_SESSION_TELEMETRY_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/session-telemetry.schema.json",\r\n "title": "Agent Session Telemetry Schema (.ai-sdlc/session-telemetry.json)",\r\n "type": "object",\r\n "required": [\r\n "model",\r\n "promptTokens",\r\n "completionTokens",\r\n "activeTimeSeconds"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(TEL-SES|SES-TEL|TEL)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Optional telemetry session identifier."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "session-telemetry"\r\n },\r\n "model": {\r\n "type": "string",\r\n "minLength": 1,\r\n "description": "AI model name or identifier."\r\n },\r\n "promptTokens": {\r\n "type": "integer",\r\n "minimum": 0,\r\n "description": "Total prompt tokens consumed."\r\n },\r\n "completionTokens": {\r\n "type": "integer",\r\n "minimum": 0,\r\n "description": "Total completion tokens generated."\r\n },\r\n "activeTimeSeconds": {\r\n "type": "number",\r\n "minimum": 0,\r\n "description": "Active session development duration in seconds."\r\n },\r\n "author": {\r\n "type": "string"\r\n },\r\n "authorType": {\r\n "type": "string",\r\n "enum": ["agent", "human"]\r\n },\r\n "sessionId": {\r\n "type": "string"\r\n },\r\n "timestamp": {\r\n "type": "string"\r\n },\r\n "provider": {\r\n "type": "string"\r\n },\r\n "confidence": {\r\n "type": "string",\r\n "enum": ["HIGH", "MEDIUM", "LOW"]\r\n },\r\n "source": {\r\n "type": "string"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2762
2865
|
var SCHEMA_SCHEMAS_SDD_SPEC_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/spec.schema.json",\r\n "title": "Spec-Driven Development Delivery Specification Schema (SPEC-*)",\r\n "type": "object",\r\n "required": ["id", "type", "change-id"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^SPEC-(CHG|FEAT|PATCH)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Unique identifier of the delivery specification."\r\n },\r\n "type": {\r\n "type": "string",\r\n "enum": ["delivery-spec", "spec"]\r\n },\r\n "change-id": {\r\n "type": "string",\r\n "pattern": "^(CHG|FEAT|PATCH)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Parent change identifier associated with this specification."\r\n },\r\n "profile": {\r\n "type": "string",\r\n "enum": ["patch", "standard", "critical"],\r\n "description": "Risk and governance profile of the change."\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Semantic versioning (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "handoff": {\r\n "type": "string",\r\n "description": "Associated handoff sidecar reference."\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": [\r\n "draft",\r\n "proposed",\r\n "review",\r\n "approved",\r\n "active",\r\n "completed",\r\n "deprecated"\r\n ]\r\n },\r\n "verification": {\r\n "type": "object",\r\n "properties": {\r\n "method": {\r\n "type": "string"\r\n },\r\n "command": {\r\n "type": "string"\r\n },\r\n "target": {\r\n "type": "string"\r\n }\r\n },\r\n "additionalProperties": true\r\n },\r\n "citations": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["id"],\r\n "properties": {\r\n "id": { "type": "string" },\r\n "digest": { "type": "string" },\r\n "comment": { "type": "string" },\r\n "anchor": { "type": "string" }\r\n },\r\n "additionalProperties": false\r\n }\r\n },\r\n "acceptance-format": {\r\n "type": "string",\r\n "enum": ["gherkin"],\r\n "description": "Formato de aceptaci\xF3n BDD obligatorio para especificaciones de entrega SDD."\r\n },\r\n "cucumber-tags": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^@[a-zA-Z0-9_-]+$"\r\n },\r\n "description": "Etiquetas de trazabilidad BDD para ejecuci\xF3n con Cucumber."\r\n },\r\n "cucumber-feature-file": {\r\n "type": "string",\r\n "description": "Ruta personalizada de extracci\xF3n del archivo .feature para Cucumber."\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2763
|
-
var SCHEMA_SCHEMAS_SDD_TASKS_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/tasks.schema.json",\r\n "title": "Verifiable Tasks & Human Autonomy Governance Schema",\r\n "type": "object",\r\n "required": ["id", "type", "change-id", "version", "tasks"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^TSK-PLAN-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "task-plan"\r\n },\r\n "change-id": {\r\n "type": "string",\r\n "pattern": "^(CHG|FEAT)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$"\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 5\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "approved", "in-progress", "completed", "blocked"]\r\n },\r\n "governance-summary": {\r\n "type": "object",\r\n "properties": {\r\n "autonomous-tasks-count": { "type": "integer", "minimum": 0 },\r\n "human-review-plan-count": { "type": "integer", "minimum": 0 },\r\n "ambiguous-count": { "type": "integer", "minimum": 0 },\r\n "high-risk-manual-count": { "type": "integer", "minimum": 0 }\r\n }\r\n },\r\n "tasks": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "object",\r\n "required": ["id", "title", "complexity", "risk-level", "autonomy-mode", "verification", "assigned-to", "status"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^TSK-[0-9]{3,}$"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 5\r\n },\r\n "complexity": {\r\n "type": "string",\r\n "enum": ["LOW", "MEDIUM", "HIGH"]\r\n },\r\n "risk-level": {\r\n "type": "string",\r\n "enum": ["LOW", "MEDIUM", "HIGH", "CRITICAL"]\r\n },\r\n "autonomy-mode": {\r\n "type": "string",\r\n "enum": [\r\n "AUTONOMOUS",\r\n "HUMAN_REVIEW_PLAN",\r\n "AMBIGUOUS",\r\n "HIGH_RISK_MANUAL"\r\n ],\r\n "description": "AI agent human governance and supervision mode."\r\n },\r\n "verification": {\r\n "type": "object",\r\n "required": ["method", "command-or-criteria"],\r\n "properties": {\r\n "method": {\r\n "type": "string",\r\n "enum": ["automated-unit-test", "cucumber-bdd", "quality-gate", "license-audit", "sast-scan", "manual-inspection", "smoke-test"]\r\n },\r\n "command-or-criteria": {\r\n "type": "string",\r\n "minLength": 5\r\n }\r\n }\r\n },\r\n "assigned-to": {\r\n "type": "string",\r\n "enum": [\r\n "agent-developer",\r\n "agent-security-auditor",\r\n "agent-compliance-checker",\r\n "agent-qa",\r\n "human-engineer",\r\n "human-architect",\r\n "pair-human-agent"\r\n ]\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["PENDING", "IN_PROGRESS", "COMPLETED", "BLOCKED"]\r\n },\r\n "blocking-reason": {\r\n "type": "string"\r\n },\r\n "implements-components": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Architecture components (CMP-*) implemented by this atomic task."\r\n },\r\n "satisfies-requirements": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^(FR|QR|CON|SEC-REQ|SAF-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Requirements satisfied by this atomic task."\r\n },\r\n "implements-contracts": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "minLength": 1\r\n },\r\n "description": "Explicit interface or method contracts from design.md implemented by this task."\r\n }\r\n },\r\n "additionalProperties": false\r\n }\r\n },\r\n "supersedes": { "type": ["string", "null"] },\r\n "superseded-by": { "type": ["string", "null"] }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2866
|
+
var SCHEMA_SCHEMAS_SDD_TASKS_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/sdd/tasks.schema.json",\r\n "title": "Verifiable Tasks & Human Autonomy Governance Schema",\r\n "type": "object",\r\n "required": ["id", "type", "change-id", "version", "tasks"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^TSK-PLAN-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "task-plan"\r\n },\r\n "change-id": {\r\n "type": "string",\r\n "pattern": "^(CHG|FEAT)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$"\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 5\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "approved", "in-progress", "completed", "blocked"]\r\n },\r\n "governance-summary": {\r\n "type": "object",\r\n "properties": {\r\n "autonomous-tasks-count": { "type": "integer", "minimum": 0 },\r\n "human-review-plan-count": { "type": "integer", "minimum": 0 },\r\n "ambiguous-count": { "type": "integer", "minimum": 0 },\r\n "high-risk-manual-count": { "type": "integer", "minimum": 0 }\r\n }\r\n },\r\n "tasks": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "object",\r\n "required": ["id", "title", "complexity", "risk-level", "autonomy-mode", "verification", "assigned-to", "status"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^TSK-[0-9]{3,}$"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 5\r\n },\r\n "complexity": {\r\n "type": "string",\r\n "enum": ["LOW", "MEDIUM", "HIGH"]\r\n },\r\n "risk-level": {\r\n "type": "string",\r\n "enum": ["LOW", "MEDIUM", "HIGH", "CRITICAL"]\r\n },\r\n "autonomy-mode": {\r\n "type": "string",\r\n "enum": [\r\n "AUTONOMOUS",\r\n "HUMAN_REVIEW_PLAN",\r\n "AMBIGUOUS",\r\n "HIGH_RISK_MANUAL"\r\n ],\r\n "description": "AI agent human governance and supervision mode."\r\n },\r\n "verification": {\r\n "type": "object",\r\n "required": ["method", "command-or-criteria"],\r\n "properties": {\r\n "method": {\r\n "type": "string",\r\n "enum": ["automated-unit-test", "cucumber-bdd", "quality-gate", "license-audit", "sast-scan", "privacy-audit", "manual-inspection", "smoke-test"]\r\n },\r\n "command-or-criteria": {\r\n "type": "string",\r\n "minLength": 5\r\n }\r\n }\r\n },\r\n "assigned-to": {\r\n "type": "string",\r\n "enum": [\r\n "agent-developer",\r\n "agent-security-auditor",\r\n "agent-compliance-checker",\r\n "agent-privacy-officer",\r\n "agent-qa",\r\n "human-engineer",\r\n "human-architect",\r\n "pair-human-agent"\r\n ]\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["PENDING", "IN_PROGRESS", "COMPLETED", "BLOCKED"]\r\n },\r\n "blocking-reason": {\r\n "type": "string"\r\n },\r\n "implements-components": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^CMP-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Architecture components (CMP-*) implemented by this atomic task."\r\n },\r\n "satisfies-requirements": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^(FR|QR|CON|SEC-REQ|SAF-REQ|PRIV-REQ)-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Requirements satisfied by this atomic task."\r\n },\r\n "implements-contracts": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "minLength": 1\r\n },\r\n "description": "Explicit interface or method contracts from design.md implemented by this task."\r\n }\r\n },\r\n "additionalProperties": false\r\n }\r\n },\r\n "supersedes": { "type": ["string", "null"] },\r\n "superseded-by": { "type": ["string", "null"] }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2764
2867
|
var SCHEMA_SCHEMAS_SECURITY_ABUSE_CASE_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/security/abuse-case.schema.json",\r\n "title": "Abuse Case Schema (Versionable)",\r\n "type": "object",\r\n "required": ["id", "type", "title", "status", "version", "primary-threat-actor", "targets-use-case", "stride-category", "mitigated-by"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^ABUSE-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "abuse-case"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Abuse case semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "primary-threat-actor": {\r\n "type": "string",\r\n "pattern": "^ACT-THREAT-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "targets-use-case": {\r\n "type": "string",\r\n "pattern": "^UC-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "stride-category": {\r\n "type": "string",\r\n "enum": ["spoofing", "tampering", "repudiation", "information-disclosure", "denial-of-service", "elevation-of-privilege"]\r\n },\r\n "mitigated-by": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^SEC-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "asvs-controls": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^ABUSE-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^ABUSE-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2765
2868
|
var SCHEMA_SCHEMAS_SECURITY_ENCLAVE_SCHEMA_JSON = `{\r
|
|
2766
2869
|
"$schema": "https://json-schema.org/draft/2020-12/schema",\r
|
|
@@ -2865,7 +2968,7 @@ var SCHEMA_SCHEMAS_SECURITY_ENCLAVE_SCHEMA_JSON = `{\r
|
|
|
2865
2968
|
`;
|
|
2866
2969
|
var SCHEMA_SCHEMAS_SECURITY_SECURITY_REQ_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/security/security-req.schema.json",\r\n "title": "Security Requirement Schema (Strict Test Validation Enforced)",\r\n "type": "object",\r\n "required": ["id", "type", "title", "status", "version", "security-domain", "mitigates-abuse-case"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^SEC-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "security-requirement"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Security requirement semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "security-domain": {\r\n "type": "string",\r\n "enum": ["authentication", "authorization", "cryptography", "input-validation", "audit-logging", "communication-security", "data-protection"]\r\n },\r\n "mitigates-abuse-case": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string",\r\n "pattern": "^ABUSE-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "description": "Product/Security Traceability: Abuse case or threat this control neutralizes."\r\n },\r\n "enforced-in-enclave": {\r\n "type": "string",\r\n "pattern": "^SEC-ENC-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Architecture Traceability: Perimeter or internal security enclave."\r\n },\r\n "compliance-references": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n },\r\n "acceptance-format": {\r\n "type": "string",\r\n "enum": ["gherkin", "declarative-prose"],\r\n "description": "Mitigation criteria format."\r\n },\r\n "cucumber-tags": {\r\n "type": "array",\r\n "items": {\r\n "type": "string",\r\n "pattern": "^@[a-zA-Z0-9_-]+$"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^SEC-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^SEC-REQ-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2867
2970
|
var SCHEMA_SCHEMAS_SECURITY_THREAT_ACTOR_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/security/threat-actor.schema.json",\r\n "title": "Threat Actor Schema (Versionable)",\r\n "type": "object",\r\n "required": ["id", "type", "title", "status", "version", "threat-capability", "motivation"],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^ACT-THREAT-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "threat-actor"\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Threat profile semantic version (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "deprecated", "retired"]\r\n },\r\n "threat-capability": {\r\n "type": "string",\r\n "enum": ["script-kiddie", "advanced-persistent-threat", "insider-threat", "automated-botnet", "supply-chain-attacker"]\r\n },\r\n "motivation": {\r\n "type": "string",\r\n "enum": ["financial-gain", "espionage", "sabotage", "data-theft", "reputational-damage"]\r\n },\r\n "attack-surfaces": {\r\n "type": "array",\r\n "items": {\r\n "type": "string"\r\n }\r\n },\r\n "supersedes": {\r\n "type": ["string", "null"],\r\n "pattern": "^ACT-THREAT-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n },\r\n "superseded-by": {\r\n "type": ["string", "null"],\r\n "pattern": "^ACT-THREAT-[A-Z0-9]+(-[A-Z0-9]+)*$"\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2868
|
-
var SCHEMA_SCHEMAS_WORKFLOW_AGENT_HANDOFF_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/workflow/agent-handoff.schema.json",\r\n "title": "Agent Workflow Handoff Block Schema",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "completed-phase",\r\n "acting-role",\r\n "autonomy-mode",\r\n "deliverables",\r\n "suggested-prompt"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(AHOF|HOF-WORKFLOW|HOF)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Unique workflow handoff identifier."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "agent-handoff"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Semantic versioning (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "completed", "transferred"]\r\n },\r\n "completed-phase": {\r\n "type": "string",\r\n "minLength": 2,\r\n "description": "Name of the completed lifecycle phase or activity."\r\n },\r\n "acting-role": {\r\n "type": "string",\r\n "enum": [\r\n "agent-product-analyst",\r\n "agent-threat-modeler",\r\n "agent-system-architect",\r\n "agent-qa-engineer",\r\n "agent-developer",\r\n "agent-expert-user",\r\n "agent-security-auditor",\r\n "agent-compliance-checker",\r\n "agent-code-reviewer",\r\n "agent-devops",\r\n "human-dev",\r\n "tech-lead",\r\n "release-manager"\r\n ],\r\n "description": "Specialized role executing the handoff."\r\n },\r\n "autonomy-mode": {\r\n "type": "string",\r\n "enum": ["AUTONOMOUS", "HUMAN_REVIEW_PLAN", "AMBIGUOUS", "HIGH_RISK_MANUAL"],\r\n "description": "Autonomy level under which the task was executed."\r\n },\r\n "deliverables": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string"\r\n },\r\n "description": "Paths or IDs of artifacts produced during the phase."\r\n },\r\n "recommended-next-roles": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["role", "rationale"],\r\n "properties": {\r\n "role": {\r\n "type": "string"\r\n },\r\n "rationale": {\r\n "type": "string"\r\n }\r\n },\r\n "additionalProperties": false\r\n },\r\n "description": "Recommended downstream specialist roles and technical justifications."\r\n },\r\n "suggested-prompt": {\r\n "type": "string",\r\n "minLength": 5,\r\n "description": "Suggested invocation prompt to initiate the next agent."\r\n },\r\n "human-action-window": {\r\n "type": "object",\r\n "properties": {\r\n "review-and-validate": {\r\n "type": "boolean"\r\n },\r\n "edit-directly": {\r\n "type": "boolean"\r\n },\r\n "pause-or-divert": {\r\n "type": "boolean"\r\n },\r\n "delegate": {\r\n "type": "boolean"\r\n }\r\n },\r\n "additionalProperties": false,\r\n "description": "Actions available to the human engineer within the sovereign action window."\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2971
|
+
var SCHEMA_SCHEMAS_WORKFLOW_AGENT_HANDOFF_SCHEMA_JSON = '{\r\n "$schema": "https://json-schema.org/draft/2020-12/schema",\r\n "$id": "https://ai-sdlc.org/schemas/workflow/agent-handoff.schema.json",\r\n "title": "Agent Workflow Handoff Block Schema",\r\n "type": "object",\r\n "required": [\r\n "id",\r\n "type",\r\n "completed-phase",\r\n "acting-role",\r\n "autonomy-mode",\r\n "deliverables",\r\n "suggested-prompt"\r\n ],\r\n "properties": {\r\n "id": {\r\n "type": "string",\r\n "pattern": "^(AHOF|HOF-WORKFLOW|HOF)-[A-Z0-9]+(-[A-Z0-9]+)*$",\r\n "description": "Unique workflow handoff identifier."\r\n },\r\n "type": {\r\n "type": "string",\r\n "const": "agent-handoff"\r\n },\r\n "title": {\r\n "type": "string",\r\n "minLength": 3\r\n },\r\n "version": {\r\n "type": "string",\r\n "pattern": "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9A-Za-z.-]+)?$",\r\n "description": "Semantic versioning (SemVer)."\r\n },\r\n "schema-version": {\r\n "type": "string"\r\n },\r\n "status": {\r\n "type": "string",\r\n "enum": ["draft", "active", "completed", "transferred"]\r\n },\r\n "completed-phase": {\r\n "type": "string",\r\n "minLength": 2,\r\n "description": "Name of the completed lifecycle phase or activity."\r\n },\r\n "acting-role": {\r\n "type": "string",\r\n "enum": [\r\n "agent-product-analyst",\r\n "agent-threat-modeler",\r\n "agent-privacy-officer",\r\n "agent-system-architect",\r\n "agent-qa-engineer",\r\n "agent-developer",\r\n "agent-expert-user",\r\n "agent-security-auditor",\r\n "agent-compliance-checker",\r\n "agent-code-reviewer",\r\n "agent-devops",\r\n "human-dev",\r\n "tech-lead",\r\n "release-manager",\r\n "dpo"\r\n ],\r\n "description": "Specialized role executing the handoff."\r\n },\r\n "autonomy-mode": {\r\n "type": "string",\r\n "enum": ["AUTONOMOUS", "HUMAN_REVIEW_PLAN", "AMBIGUOUS", "HIGH_RISK_MANUAL"],\r\n "description": "Autonomy level under which the task was executed."\r\n },\r\n "deliverables": {\r\n "type": "array",\r\n "minItems": 1,\r\n "items": {\r\n "type": "string"\r\n },\r\n "description": "Paths or IDs of artifacts produced during the phase."\r\n },\r\n "recommended-next-roles": {\r\n "type": "array",\r\n "items": {\r\n "type": "object",\r\n "required": ["role", "rationale"],\r\n "properties": {\r\n "role": {\r\n "type": "string"\r\n },\r\n "rationale": {\r\n "type": "string"\r\n }\r\n },\r\n "additionalProperties": false\r\n },\r\n "description": "Recommended downstream specialist roles and technical justifications."\r\n },\r\n "suggested-prompt": {\r\n "type": "string",\r\n "minLength": 5,\r\n "description": "Suggested invocation prompt to initiate the next agent."\r\n },\r\n "human-action-window": {\r\n "type": "object",\r\n "properties": {\r\n "review-and-validate": {\r\n "type": "boolean"\r\n },\r\n "edit-directly": {\r\n "type": "boolean"\r\n },\r\n "pause-or-divert": {\r\n "type": "boolean"\r\n },\r\n "delegate": {\r\n "type": "boolean"\r\n }\r\n },\r\n "additionalProperties": false,\r\n "description": "Actions available to the human engineer within the sovereign action window."\r\n }\r\n },\r\n "additionalProperties": false\r\n}\r\n';
|
|
2869
2972
|
var STARTER_SCHEMAS_MAP = {
|
|
2870
2973
|
"schemas/architecture/adr.schema.json": JSON.parse(SCHEMA_SCHEMAS_ARCHITECTURE_ADR_SCHEMA_JSON),
|
|
2871
2974
|
"schemas/architecture/component.schema.json": JSON.parse(SCHEMA_SCHEMAS_ARCHITECTURE_COMPONENT_SCHEMA_JSON),
|
|
@@ -2876,6 +2979,10 @@ var STARTER_SCHEMAS_MAP = {
|
|
|
2876
2979
|
"schemas/ide/mcp-config.schema.json": JSON.parse(SCHEMA_SCHEMAS_IDE_MCP_CONFIG_SCHEMA_JSON),
|
|
2877
2980
|
"schemas/manuals/production-manual.schema.json": JSON.parse(SCHEMA_SCHEMAS_MANUALS_PRODUCTION_MANUAL_SCHEMA_JSON),
|
|
2878
2981
|
"schemas/manuals/user-manual.schema.json": JSON.parse(SCHEMA_SCHEMAS_MANUALS_USER_MANUAL_SCHEMA_JSON),
|
|
2982
|
+
"schemas/privacy/data-asset.schema.json": JSON.parse(SCHEMA_SCHEMAS_PRIVACY_DATA_ASSET_SCHEMA_JSON),
|
|
2983
|
+
"schemas/privacy/privacy-policy.schema.json": JSON.parse(SCHEMA_SCHEMAS_PRIVACY_PRIVACY_POLICY_SCHEMA_JSON),
|
|
2984
|
+
"schemas/privacy/privacy-req.schema.json": JSON.parse(SCHEMA_SCHEMAS_PRIVACY_PRIVACY_REQ_SCHEMA_JSON),
|
|
2985
|
+
"schemas/privacy/privacy-ropa.schema.json": JSON.parse(SCHEMA_SCHEMAS_PRIVACY_PRIVACY_ROPA_SCHEMA_JSON),
|
|
2879
2986
|
"schemas/product/actor.schema.json": JSON.parse(SCHEMA_SCHEMAS_PRODUCT_ACTOR_SCHEMA_JSON),
|
|
2880
2987
|
"schemas/product/business-rule.schema.json": JSON.parse(SCHEMA_SCHEMAS_PRODUCT_BUSINESS_RULE_SCHEMA_JSON),
|
|
2881
2988
|
"schemas/product/journey.schema.json": JSON.parse(SCHEMA_SCHEMAS_PRODUCT_JOURNEY_SCHEMA_JSON),
|
|
@@ -2917,6 +3024,11 @@ var TYPE_TO_SCHEMA_MAP = {
|
|
|
2917
3024
|
"security-enclave": "schemas/security/enclave.schema.json",
|
|
2918
3025
|
"security-requirement": "schemas/security/security-req.schema.json",
|
|
2919
3026
|
"threat-actor": "schemas/security/threat-actor.schema.json",
|
|
3027
|
+
// Privacy & Data Protection
|
|
3028
|
+
"data-asset": "schemas/privacy/data-asset.schema.json",
|
|
3029
|
+
"privacy-ropa": "schemas/privacy/privacy-ropa.schema.json",
|
|
3030
|
+
"privacy-requirement": "schemas/privacy/privacy-req.schema.json",
|
|
3031
|
+
"privacy-policy": "schemas/privacy/privacy-policy.schema.json",
|
|
2920
3032
|
// Architecture
|
|
2921
3033
|
"architecture-introduction": "schemas/architecture/introduction-and-goals.schema.json",
|
|
2922
3034
|
"architecture-decision-record": "schemas/architecture/adr.schema.json",
|
|
@@ -2959,6 +3071,11 @@ var PREFIX_TAXONOMY = [
|
|
|
2959
3071
|
["ABUSE-", "abuse-case"],
|
|
2960
3072
|
["SEC-ENC-", "security-enclave"],
|
|
2961
3073
|
["SEC-REQ-", "security-requirement"],
|
|
3074
|
+
["DATA-ASSET-", "data-asset"],
|
|
3075
|
+
["PRIV-ROPA-", "privacy-ropa"],
|
|
3076
|
+
["PRIV-REQ-", "privacy-requirement"],
|
|
3077
|
+
["PRIV-POL-", "privacy-policy"],
|
|
3078
|
+
["POL-PRIV-", "privacy-policy"],
|
|
2962
3079
|
["HAZ-", "hazard"],
|
|
2963
3080
|
["SAF-REQ-", "safety-requirement"],
|
|
2964
3081
|
["SAF-", "safety-requirement"],
|
|
@@ -3864,11 +3981,28 @@ function createGreenfieldRequirement(rootDir, name, padNum, canonicalId, author,
|
|
|
3864
3981
|
const digest = computeCanonicalSha256(reqContent);
|
|
3865
3982
|
return { reqId, ucId, reqFilePath, digest };
|
|
3866
3983
|
}
|
|
3984
|
+
function resolveMissingDraftDestination(rootDir, id) {
|
|
3985
|
+
if (id.startsWith("PRIV-REQ-")) {
|
|
3986
|
+
return { dir: path4__namespace.join(rootDir, "specs", "privacy", "requirements"), type: "privacy-requirement" };
|
|
3987
|
+
}
|
|
3988
|
+
if (id.startsWith("DATA-ASSET-")) {
|
|
3989
|
+
return { dir: path4__namespace.join(rootDir, "specs", "privacy", "assets"), type: "data-asset" };
|
|
3990
|
+
}
|
|
3991
|
+
if (id.startsWith("PRIV-ROPA-")) {
|
|
3992
|
+
return { dir: path4__namespace.join(rootDir, "specs", "privacy", "ropa"), type: "privacy-ropa" };
|
|
3993
|
+
}
|
|
3994
|
+
if (id.startsWith("UC-")) {
|
|
3995
|
+
return { dir: path4__namespace.join(rootDir, "specs", "product"), type: "use-case" };
|
|
3996
|
+
}
|
|
3997
|
+
if (id.startsWith("SEC-REQ-") || id.startsWith("SAF-REQ-")) {
|
|
3998
|
+
return { dir: path4__namespace.join(rootDir, "specs", "product"), type: "security-requirement" };
|
|
3999
|
+
}
|
|
4000
|
+
return { dir: path4__namespace.join(rootDir, "specs", "product"), type: "requirement" };
|
|
4001
|
+
}
|
|
3867
4002
|
function createMissingDraftRequirement(rootDir, name, id, canonicalId, createdFiles) {
|
|
3868
|
-
const
|
|
3869
|
-
if (!fs7__namespace.existsSync(
|
|
3870
|
-
const reqFilePath = path4__namespace.join(
|
|
3871
|
-
const reqType = id.startsWith("UC-") ? "use-case" : id.startsWith("SEC-REQ-") ? "security-requirement" : "requirement";
|
|
4003
|
+
const { dir, type: reqType } = resolveMissingDraftDestination(rootDir, id);
|
|
4004
|
+
if (!fs7__namespace.existsSync(dir)) fs7__namespace.mkdirSync(dir, { recursive: true });
|
|
4005
|
+
const reqFilePath = path4__namespace.join(dir, `${id}.md`);
|
|
3872
4006
|
const header = MISSING_DRAFT_HEADER.replaceAll("{{ID}}", id).replaceAll("{{TYPE}}", reqType).replaceAll("{{NAME}}", name);
|
|
3873
4007
|
const body = MISSING_DRAFT_BODY.replaceAll("{{ID}}", id).replaceAll("{{NAME}}", name).replaceAll("{{CANONICAL_ID}}", canonicalId);
|
|
3874
4008
|
const reqContent = `${header}
|
|
@@ -3898,13 +4032,30 @@ function discoverDerivedRequirements(id, artifactMap, subRequirements, citedArti
|
|
|
3898
4032
|
function appendUnique(list, item) {
|
|
3899
4033
|
if (!list.includes(item)) list.push(item);
|
|
3900
4034
|
}
|
|
3901
|
-
function
|
|
4035
|
+
function recordCitedArtifact(existing, col) {
|
|
3902
4036
|
col.citedArtifacts.push({
|
|
3903
4037
|
id: existing.id,
|
|
3904
4038
|
digest: `sha256:${existing.digest}`,
|
|
3905
4039
|
title: existing.title,
|
|
3906
4040
|
comment: `Citaci\xF3n de ${existing.frontmatter.type || "artefacto"} (${existing.title || existing.id})`
|
|
3907
4041
|
});
|
|
4042
|
+
}
|
|
4043
|
+
function classifyPrivacyCitation(id, col) {
|
|
4044
|
+
if (id.startsWith("PRIV-REQ-")) {
|
|
4045
|
+
appendUnique(col.subPrivReqs, id);
|
|
4046
|
+
return true;
|
|
4047
|
+
}
|
|
4048
|
+
if (id.startsWith("DATA-ASSET-")) {
|
|
4049
|
+
appendUnique(col.subDataAssets, id);
|
|
4050
|
+
return true;
|
|
4051
|
+
}
|
|
4052
|
+
if (id.startsWith("PRIV-ROPA-")) {
|
|
4053
|
+
appendUnique(col.subRopa, id);
|
|
4054
|
+
return true;
|
|
4055
|
+
}
|
|
4056
|
+
return false;
|
|
4057
|
+
}
|
|
4058
|
+
function classifyProductCitation(id, artifactMap, col) {
|
|
3908
4059
|
if (/^(FR|QR|CON)-/.test(id)) {
|
|
3909
4060
|
appendUnique(col.subRequirements, id);
|
|
3910
4061
|
} else if (id.startsWith("UC-")) {
|
|
@@ -3916,9 +4067,18 @@ function classifyExistingCitation(id, existing, artifactMap, col) {
|
|
|
3916
4067
|
appendUnique(col.subRules, id);
|
|
3917
4068
|
}
|
|
3918
4069
|
}
|
|
4070
|
+
function classifyExistingCitation(id, existing, artifactMap, col) {
|
|
4071
|
+
recordCitedArtifact(existing, col);
|
|
4072
|
+
if (!classifyPrivacyCitation(id, col)) {
|
|
4073
|
+
classifyProductCitation(id, artifactMap, col);
|
|
4074
|
+
}
|
|
4075
|
+
}
|
|
3919
4076
|
function routeMissingCitationId(id, col) {
|
|
3920
4077
|
if (id.startsWith("UC-")) col.subUseCases.push(id);
|
|
3921
4078
|
else if (id.startsWith("SEC-REQ-")) col.subSecReqs.push(id);
|
|
4079
|
+
else if (id.startsWith("PRIV-REQ-")) col.subPrivReqs.push(id);
|
|
4080
|
+
else if (id.startsWith("DATA-ASSET-")) col.subDataAssets.push(id);
|
|
4081
|
+
else if (id.startsWith("PRIV-ROPA-")) col.subRopa.push(id);
|
|
3922
4082
|
else col.subRequirements.push(id);
|
|
3923
4083
|
}
|
|
3924
4084
|
function collectExplicitCitations(inputFromIds, name, canonicalId, artifactMap, col, rootDir, createdFiles) {
|
|
@@ -3948,16 +4108,31 @@ function collectGreenfieldCitations(rootDir, name, padNum, canonicalId, author,
|
|
|
3948
4108
|
col.subUseCases.push(gf.ucId);
|
|
3949
4109
|
}
|
|
3950
4110
|
}
|
|
4111
|
+
function initEmptyCitations() {
|
|
4112
|
+
return {
|
|
4113
|
+
citedArtifacts: [],
|
|
4114
|
+
subRequirements: [],
|
|
4115
|
+
subUseCases: [],
|
|
4116
|
+
subSecReqs: [],
|
|
4117
|
+
subRules: [],
|
|
4118
|
+
subPrivReqs: [],
|
|
4119
|
+
subDataAssets: [],
|
|
4120
|
+
subRopa: []
|
|
4121
|
+
};
|
|
4122
|
+
}
|
|
4123
|
+
function ensureFallbackRequirement(col, padNum, name) {
|
|
4124
|
+
if (col.subRequirements.length === 0) {
|
|
4125
|
+
col.subRequirements.push(`FR-${padNum}-${slugify(name).toUpperCase()}-001`);
|
|
4126
|
+
}
|
|
4127
|
+
}
|
|
3951
4128
|
function collectChangeCitations(rootDir, name, padNum, canonicalId, author, dateStr, inputFromIds, artifactMap, createdFiles) {
|
|
3952
|
-
const col =
|
|
4129
|
+
const col = initEmptyCitations();
|
|
3953
4130
|
if (inputFromIds.length === 0) {
|
|
3954
4131
|
collectGreenfieldCitations(rootDir, name, padNum, canonicalId, author, dateStr, createdFiles, col);
|
|
3955
4132
|
} else {
|
|
3956
4133
|
collectExplicitCitations(inputFromIds, name, canonicalId, artifactMap, col, rootDir, createdFiles);
|
|
3957
4134
|
}
|
|
3958
|
-
|
|
3959
|
-
col.subRequirements.push(`FR-${padNum}-${slugify(name).toUpperCase()}-001`);
|
|
3960
|
-
}
|
|
4135
|
+
ensureFallbackRequirement(col, padNum, name);
|
|
3961
4136
|
return col;
|
|
3962
4137
|
}
|
|
3963
4138
|
function renderProposalFile(changeDir, canonicalId, name, author, citationsYamlBlock) {
|
|
@@ -4071,6 +4246,9 @@ function buildHandoffSubgraph(citations) {
|
|
|
4071
4246
|
if (citations.subUseCases.length > 0) subgraph.useCases = citations.subUseCases;
|
|
4072
4247
|
if (citations.subSecReqs.length > 0) subgraph.securityRequirements = citations.subSecReqs;
|
|
4073
4248
|
if (citations.subRules.length > 0) subgraph.businessRules = citations.subRules;
|
|
4249
|
+
if (citations.subPrivReqs.length > 0) subgraph.privacyRequirements = citations.subPrivReqs;
|
|
4250
|
+
if (citations.subDataAssets.length > 0) subgraph.dataAssets = citations.subDataAssets;
|
|
4251
|
+
if (citations.subRopa.length > 0) subgraph.privacyRopa = citations.subRopa;
|
|
4074
4252
|
return subgraph;
|
|
4075
4253
|
}
|
|
4076
4254
|
function buildHandoffPayload(canonicalId, name, citations) {
|
|
@@ -4116,7 +4294,7 @@ function buildScaffoldFailure(profile, error, slug = "", canonicalId = "", chang
|
|
|
4116
4294
|
}
|
|
4117
4295
|
function renderAndCollectArtifactFiles(changeDir, canonicalId, name, author, dateStr, profile, citations, createdFiles) {
|
|
4118
4296
|
const citationsBlock = renderCitationsYamlBlock(citations.citedArtifacts);
|
|
4119
|
-
const reqIds = [...citations.subRequirements, ...citations.subSecReqs];
|
|
4297
|
+
const reqIds = [...citations.subRequirements, ...citations.subSecReqs, ...citations.subPrivReqs];
|
|
4120
4298
|
createdFiles.push(renderProposalFile(changeDir, canonicalId, name, author, citationsBlock));
|
|
4121
4299
|
const { specPath, specFmObj } = renderSpecFile(changeDir, canonicalId, name, profile);
|
|
4122
4300
|
createdFiles.push(specPath);
|
|
@@ -4569,28 +4747,28 @@ function buildHandoffList(rootDir, artifactMap) {
|
|
|
4569
4747
|
}
|
|
4570
4748
|
return handoffList;
|
|
4571
4749
|
}
|
|
4750
|
+
function indexSubgraphIds(ids, hof, map) {
|
|
4751
|
+
if (!Array.isArray(ids)) return;
|
|
4752
|
+
for (const reqId of ids) {
|
|
4753
|
+
map.set(reqId, hof);
|
|
4754
|
+
}
|
|
4755
|
+
}
|
|
4572
4756
|
function indexRequirementsToHandoff(handoffList) {
|
|
4573
4757
|
const reqToHandoffMap = /* @__PURE__ */ new Map();
|
|
4574
4758
|
for (const hof of handoffList) {
|
|
4575
|
-
if (hof.subgraph
|
|
4576
|
-
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
}
|
|
4580
|
-
if (hof.subgraph && Array.isArray(hof.subgraph.securityRequirements)) {
|
|
4581
|
-
for (const reqId of hof.subgraph.securityRequirements) {
|
|
4582
|
-
reqToHandoffMap.set(reqId, hof);
|
|
4583
|
-
}
|
|
4584
|
-
}
|
|
4759
|
+
if (!hof.subgraph) continue;
|
|
4760
|
+
indexSubgraphIds(hof.subgraph.requirements, hof, reqToHandoffMap);
|
|
4761
|
+
indexSubgraphIds(hof.subgraph.securityRequirements, hof, reqToHandoffMap);
|
|
4762
|
+
indexSubgraphIds(hof.subgraph.privacyRequirements, hof, reqToHandoffMap);
|
|
4585
4763
|
}
|
|
4586
4764
|
return reqToHandoffMap;
|
|
4587
4765
|
}
|
|
4588
|
-
var TARGET_REQ_PREFIXES = ["FR-", "QR-", "SEC-REQ-", "CON-"];
|
|
4766
|
+
var TARGET_REQ_PREFIXES = ["FR-", "QR-", "SEC-REQ-", "CON-", "PRIV-REQ-"];
|
|
4589
4767
|
function isRequirementToVerify(data, id) {
|
|
4590
4768
|
if (data.file.includes("templates/") || data.file.includes(".template.") || data.file.includes("process/")) {
|
|
4591
4769
|
return false;
|
|
4592
4770
|
}
|
|
4593
|
-
if (data.type === "requirement" || data.type === "security-requirement") {
|
|
4771
|
+
if (data.type === "requirement" || data.type === "security-requirement" || data.type === "privacy-requirement") {
|
|
4594
4772
|
return true;
|
|
4595
4773
|
}
|
|
4596
4774
|
return TARGET_REQ_PREFIXES.some((prefix) => id.startsWith(prefix));
|
|
@@ -4628,6 +4806,8 @@ function collectHandoffSubgraphTraces(subgraph) {
|
|
|
4628
4806
|
if (subgraph.useCases) traces.push(...subgraph.useCases);
|
|
4629
4807
|
if (subgraph.businessRules) traces.push(...subgraph.businessRules);
|
|
4630
4808
|
if (subgraph.abuseCases) traces.push(...subgraph.abuseCases);
|
|
4809
|
+
if (subgraph.privacyRopa) traces.push(...subgraph.privacyRopa);
|
|
4810
|
+
if (subgraph.dataAssets) traces.push(...subgraph.dataAssets);
|
|
4631
4811
|
return traces;
|
|
4632
4812
|
}
|
|
4633
4813
|
function collectArchIntroTraces(reqId, artifactMap) {
|
|
@@ -4646,6 +4826,8 @@ function resolveProductTraces(fm, reqId, associatedHandoff, artifactMap) {
|
|
|
4646
4826
|
const traces = [
|
|
4647
4827
|
...extractArrayOrSingle(fm["derives-from"]),
|
|
4648
4828
|
...extractArrayOrSingle(fm["mitigates-abuse-case"]),
|
|
4829
|
+
...extractArrayOrSingle(fm["governs-ropa"]),
|
|
4830
|
+
...extractArrayOrSingle(fm["protects-data-assets"]),
|
|
4649
4831
|
...collectHandoffSubgraphTraces(associatedHandoff?.subgraph),
|
|
4650
4832
|
...collectArchIntroTraces(reqId, artifactMap)
|
|
4651
4833
|
];
|
|
@@ -5082,7 +5264,8 @@ function extractHandoffExpectedScope(changeDir, maxUc = 1, violations) {
|
|
|
5082
5264
|
}
|
|
5083
5265
|
const reqs = handoff.subgraph.requirements || [];
|
|
5084
5266
|
const secReqs = handoff.subgraph.securityRequirements || [];
|
|
5085
|
-
|
|
5267
|
+
const privReqs = handoff.subgraph.privacyRequirements || [];
|
|
5268
|
+
return [...reqs, ...secReqs, ...privReqs];
|
|
5086
5269
|
}
|
|
5087
5270
|
function collectTaskCoveredScope(tasks) {
|
|
5088
5271
|
const covered = /* @__PURE__ */ new Set();
|
|
@@ -7445,6 +7628,503 @@ function detectPromptInjection(content) {
|
|
|
7445
7628
|
checkMultilinePromptInjection(content, findings);
|
|
7446
7629
|
return findings;
|
|
7447
7630
|
}
|
|
7631
|
+
var DEFAULT_PRIVACY_POLICY = {
|
|
7632
|
+
version: "1.0",
|
|
7633
|
+
project: "AI-SDLC Standard Organization",
|
|
7634
|
+
regulatory_frameworks: ["GDPR", "LOPDGDD", "ISO-27701"],
|
|
7635
|
+
default_action: "DENY_UNREGISTERED_PII",
|
|
7636
|
+
classifications: {
|
|
7637
|
+
public: {
|
|
7638
|
+
action: "ALLOW",
|
|
7639
|
+
encryption_at_rest: false,
|
|
7640
|
+
encryption_in_transit: true,
|
|
7641
|
+
allow_in_logs: true,
|
|
7642
|
+
allow_in_ai_prompts: true
|
|
7643
|
+
},
|
|
7644
|
+
internal: {
|
|
7645
|
+
action: "ALLOW",
|
|
7646
|
+
encryption_at_rest: true,
|
|
7647
|
+
encryption_in_transit: true,
|
|
7648
|
+
allow_in_logs: true,
|
|
7649
|
+
allow_in_ai_prompts: true
|
|
7650
|
+
},
|
|
7651
|
+
confidential_pii: {
|
|
7652
|
+
action: "STRICT_GOVERNANCE",
|
|
7653
|
+
require_ropa_entry: true,
|
|
7654
|
+
encryption_at_rest: true,
|
|
7655
|
+
encryption_in_transit: true,
|
|
7656
|
+
allow_in_logs: false,
|
|
7657
|
+
log_masking_strategy: "REDACT_OR_SHA256_SALT",
|
|
7658
|
+
allow_in_ai_prompts: false,
|
|
7659
|
+
max_retention_days: 365,
|
|
7660
|
+
require_right_to_erasure: true
|
|
7661
|
+
},
|
|
7662
|
+
special_category_sensitive: {
|
|
7663
|
+
action: "DPIA_APPROVAL_REQUIRED",
|
|
7664
|
+
require_ropa_entry: true,
|
|
7665
|
+
require_dpia_artifact: true,
|
|
7666
|
+
encryption_at_rest: true,
|
|
7667
|
+
encryption_in_transit: true,
|
|
7668
|
+
require_field_level_encryption: true,
|
|
7669
|
+
allow_in_logs: false,
|
|
7670
|
+
allow_in_ai_prompts: false
|
|
7671
|
+
}
|
|
7672
|
+
},
|
|
7673
|
+
cross_border_transfers: {
|
|
7674
|
+
allowed_regions: ["EU-EEA", "ADEQUACY_DECISION"],
|
|
7675
|
+
require_scc_for_third_countries: true,
|
|
7676
|
+
approved_subprocessors: []
|
|
7677
|
+
},
|
|
7678
|
+
agent_guardrails: {
|
|
7679
|
+
forbid_real_pii_in_tests: true,
|
|
7680
|
+
forbid_pii_in_console_or_logger: true,
|
|
7681
|
+
require_dto_projection_for_pii: true
|
|
7682
|
+
},
|
|
7683
|
+
ci_gates: {
|
|
7684
|
+
fail_on_unregistered_pii: true,
|
|
7685
|
+
fail_on_pii_in_logs: true,
|
|
7686
|
+
fail_on_missing_retention_policy: true,
|
|
7687
|
+
fail_on_unapproved_subprocessor: true,
|
|
7688
|
+
generate_ropa_inventory: true,
|
|
7689
|
+
output_ropa_file: "reports/ROPA_INVENTORY.md",
|
|
7690
|
+
output_privacy_report: "reports/PRIVACY_SCAN_REPORT.md"
|
|
7691
|
+
}
|
|
7692
|
+
};
|
|
7693
|
+
var PII_SAST_RULES = [
|
|
7694
|
+
{
|
|
7695
|
+
id: "PRIV-001-PII-IN-LOGS",
|
|
7696
|
+
type: "PII_IN_LOGS",
|
|
7697
|
+
severity: "HIGH",
|
|
7698
|
+
description: "Direct exposure of unmasked PII or sensitive fields in logger or console output (GDPR Art. 25 / Art. 32)",
|
|
7699
|
+
pattern: /(?:console\.(?:log|info|warn|error|debug)|logger\.(?:info|warn|error|debug|trace)|log\.(?:info|warn|error|debug))\s*\([^)]*\b(?:user\.(?:email|phone|ssn|dni|nif|password|creditCard|biometric)|req\.body\.(?:email|phone|ssn|dni|nif|password|creditCard)|rawPii|patientRecord|creditCardNumber|socialSecurityNumber)\b/i
|
|
7700
|
+
},
|
|
7701
|
+
{
|
|
7702
|
+
id: "PRIV-002-PII-IN-LLM-PROMPT",
|
|
7703
|
+
type: "PII_IN_LLM_PROMPT",
|
|
7704
|
+
severity: "CRITICAL",
|
|
7705
|
+
description: "Unmasked personal or special-category data interpolated into external AI/LLM prompt payload",
|
|
7706
|
+
pattern: /(?:(?:prompt|userPrompt|systemPrompt|llmPrompt)\s*(?::=|\+=|=)|(?:generateContent|chat\.completions\.create)\s*\()[^;\n]*\$\{[^}]*\b(?:user\.(?:email|phone|ssn|dni|nif|biometric)|patient\.(?:diagnosis|health|medicalRecord)|rawPii|creditCard)\b[^}]*\}/i
|
|
7707
|
+
},
|
|
7708
|
+
{
|
|
7709
|
+
id: "PRIV-004-HARDCODED-REAL-PII",
|
|
7710
|
+
type: "HARDCODED_PII_IN_CODE",
|
|
7711
|
+
severity: "HIGH",
|
|
7712
|
+
description: "Hardcoded real-world personal identifier (SSN / National ID / Credit Card) detected in source or test file",
|
|
7713
|
+
pattern: /\b(?:ssn|dni|nif|tax_?id|national_?id)\s*[:=]\s*['"](?:\d{3}-\d{2}-\d{4}|\d{8}[A-HJ-NP-TV-Z])['"]/i
|
|
7714
|
+
}
|
|
7715
|
+
];
|
|
7716
|
+
function loadPrivacyPolicy(rootDir, policyPath) {
|
|
7717
|
+
const candidate = policyPath ? path4__namespace.isAbsolute(policyPath) ? policyPath : path4__namespace.join(rootDir, policyPath) : path4__namespace.join(rootDir, "privacy-policy.yaml");
|
|
7718
|
+
if (!fs7__namespace.existsSync(candidate)) return DEFAULT_PRIVACY_POLICY;
|
|
7719
|
+
try {
|
|
7720
|
+
const parsed = yaml3__default.default.load(fs7__namespace.readFileSync(candidate, "utf-8"));
|
|
7721
|
+
if (!parsed || typeof parsed !== "object") return DEFAULT_PRIVACY_POLICY;
|
|
7722
|
+
return {
|
|
7723
|
+
...DEFAULT_PRIVACY_POLICY,
|
|
7724
|
+
...parsed,
|
|
7725
|
+
classifications: { ...DEFAULT_PRIVACY_POLICY.classifications, ...parsed.classifications || {} },
|
|
7726
|
+
agent_guardrails: { ...DEFAULT_PRIVACY_POLICY.agent_guardrails, ...parsed.agent_guardrails || {} },
|
|
7727
|
+
ci_gates: { ...DEFAULT_PRIVACY_POLICY.ci_gates, ...parsed.ci_gates || {} }
|
|
7728
|
+
};
|
|
7729
|
+
} catch {
|
|
7730
|
+
return DEFAULT_PRIVACY_POLICY;
|
|
7731
|
+
}
|
|
7732
|
+
}
|
|
7733
|
+
function isLineExemptFromPrivacyScan(line) {
|
|
7734
|
+
return line.includes("ai-sdlc:allow-pii") || line.includes("ai-sdlc:allow-sast") || line.includes("nosec");
|
|
7735
|
+
}
|
|
7736
|
+
function shouldApplyPiiRule(rule, policy) {
|
|
7737
|
+
if (rule.type === "PII_IN_LOGS" && !policy.ci_gates.fail_on_pii_in_logs) {
|
|
7738
|
+
return false;
|
|
7739
|
+
}
|
|
7740
|
+
if (rule.type === "HARDCODED_PII_IN_CODE" && !policy.agent_guardrails.forbid_real_pii_in_tests) {
|
|
7741
|
+
return false;
|
|
7742
|
+
}
|
|
7743
|
+
return true;
|
|
7744
|
+
}
|
|
7745
|
+
function scanFileForPrivacyViolations(filePath, rootDir, policy = DEFAULT_PRIVACY_POLICY) {
|
|
7746
|
+
const violations = [];
|
|
7747
|
+
try {
|
|
7748
|
+
const content = fs7__namespace.readFileSync(filePath, "utf-8");
|
|
7749
|
+
const lines = content.split(/\r?\n/);
|
|
7750
|
+
const relPath = path4__namespace.relative(rootDir, filePath).replace(/\\/g, "/");
|
|
7751
|
+
for (let i = 0; i < lines.length; i++) {
|
|
7752
|
+
const line = lines[i];
|
|
7753
|
+
if (isLineExemptFromPrivacyScan(line)) continue;
|
|
7754
|
+
for (const rule of PII_SAST_RULES) {
|
|
7755
|
+
if (!shouldApplyPiiRule(rule, policy)) continue;
|
|
7756
|
+
rule.pattern.lastIndex = 0;
|
|
7757
|
+
if (rule.pattern.test(line)) {
|
|
7758
|
+
violations.push({
|
|
7759
|
+
ruleId: rule.id,
|
|
7760
|
+
type: rule.type,
|
|
7761
|
+
severity: rule.severity,
|
|
7762
|
+
filePath,
|
|
7763
|
+
relPath,
|
|
7764
|
+
lineNumber: i + 1,
|
|
7765
|
+
snippet: line.trim(),
|
|
7766
|
+
message: rule.description
|
|
7767
|
+
});
|
|
7768
|
+
}
|
|
7769
|
+
}
|
|
7770
|
+
}
|
|
7771
|
+
} catch {
|
|
7772
|
+
}
|
|
7773
|
+
return violations;
|
|
7774
|
+
}
|
|
7775
|
+
var EXCLUDED_ARTIFACT_PREFIXES = [
|
|
7776
|
+
"templates/",
|
|
7777
|
+
"node_modules/",
|
|
7778
|
+
"dist/",
|
|
7779
|
+
".git/",
|
|
7780
|
+
"reports/",
|
|
7781
|
+
".agent/",
|
|
7782
|
+
".agents/",
|
|
7783
|
+
".claude/",
|
|
7784
|
+
".cursor/",
|
|
7785
|
+
".github/",
|
|
7786
|
+
"process/"
|
|
7787
|
+
];
|
|
7788
|
+
function isExcludedPrivacyMd(relPath) {
|
|
7789
|
+
return EXCLUDED_ARTIFACT_PREFIXES.some((prefix) => relPath.startsWith(prefix));
|
|
7790
|
+
}
|
|
7791
|
+
function toStringArray2(val) {
|
|
7792
|
+
if (Array.isArray(val)) return val.map((v) => String(v));
|
|
7793
|
+
if (typeof val === "string" && val.trim().length > 0) return [val.trim()];
|
|
7794
|
+
return [];
|
|
7795
|
+
}
|
|
7796
|
+
function parseDataAsset(fm, relPath) {
|
|
7797
|
+
return {
|
|
7798
|
+
id: String(fm.id || ""),
|
|
7799
|
+
title: String(fm.title || ""),
|
|
7800
|
+
classification: String(fm.classification || "internal"),
|
|
7801
|
+
piiCategories: toStringArray2(fm["pii-categories"]),
|
|
7802
|
+
dataSubjects: toStringArray2(fm["data-subjects"]),
|
|
7803
|
+
retentionPeriod: String(fm["retention-period"] || ""),
|
|
7804
|
+
erasureMethod: String(fm["erasure-method"] || ""),
|
|
7805
|
+
filePath: relPath
|
|
7806
|
+
};
|
|
7807
|
+
}
|
|
7808
|
+
function parseRopaRecord(fm, relPath) {
|
|
7809
|
+
return {
|
|
7810
|
+
id: String(fm.id || ""),
|
|
7811
|
+
title: String(fm.title || ""),
|
|
7812
|
+
lawfulBasis: String(fm["lawful-basis"] || ""),
|
|
7813
|
+
processingPurpose: String(fm["processing-purpose"] || ""),
|
|
7814
|
+
useCases: toStringArray2(fm["use-cases"]),
|
|
7815
|
+
dataAssets: toStringArray2(fm["data-assets"]),
|
|
7816
|
+
dataSubjects: toStringArray2(fm["data-subjects"]),
|
|
7817
|
+
retentionTtl: String(fm["retention-ttl"] || ""),
|
|
7818
|
+
crossBorderTransfer: Boolean(fm["cross-border-transfer"]),
|
|
7819
|
+
subprocessors: toStringArray2(fm.subprocessors),
|
|
7820
|
+
dpiaRequired: Boolean(fm["dpia-required"]),
|
|
7821
|
+
dpiaReference: typeof fm["dpia-reference"] === "string" ? fm["dpia-reference"] : null,
|
|
7822
|
+
mitigatedBy: toStringArray2(fm["mitigated-by"]),
|
|
7823
|
+
filePath: relPath
|
|
7824
|
+
};
|
|
7825
|
+
}
|
|
7826
|
+
function isDataAssetArtifact(type, id) {
|
|
7827
|
+
return type === "data-asset" || id.startsWith("DATA-ASSET-");
|
|
7828
|
+
}
|
|
7829
|
+
function isRopaArtifact(type, id) {
|
|
7830
|
+
return type === "privacy-ropa" || id.startsWith("PRIV-ROPA-");
|
|
7831
|
+
}
|
|
7832
|
+
function isPrivacyReqArtifact(type, id) {
|
|
7833
|
+
return type === "privacy-requirement" || id.startsWith("PRIV-REQ-");
|
|
7834
|
+
}
|
|
7835
|
+
function isDpiaArtifact(type, id) {
|
|
7836
|
+
return type === "dpia-request" || id.startsWith("DPIA-");
|
|
7837
|
+
}
|
|
7838
|
+
function classifyPrivacyMarkdown(fm, relPath, acc) {
|
|
7839
|
+
const id = String(fm.id || "");
|
|
7840
|
+
const type = String(fm.type || "");
|
|
7841
|
+
if (isDataAssetArtifact(type, id)) {
|
|
7842
|
+
acc.dataAssets.push(parseDataAsset(fm, relPath));
|
|
7843
|
+
} else if (isRopaArtifact(type, id)) {
|
|
7844
|
+
acc.ropaRecords.push(parseRopaRecord(fm, relPath));
|
|
7845
|
+
} else if (isPrivacyReqArtifact(type, id)) {
|
|
7846
|
+
acc.privacyReqs.push({ id, governsRopa: toStringArray2(fm["governs-ropa"]), filePath: relPath });
|
|
7847
|
+
} else if (isDpiaArtifact(type, id)) {
|
|
7848
|
+
acc.dpiaStatuses.set(id, String(fm.status || "draft"));
|
|
7849
|
+
}
|
|
7850
|
+
}
|
|
7851
|
+
function discoverPrivacyArtifacts(rootDir) {
|
|
7852
|
+
const acc = {
|
|
7853
|
+
dataAssets: [],
|
|
7854
|
+
ropaRecords: [],
|
|
7855
|
+
privacyReqs: [],
|
|
7856
|
+
dpiaStatuses: /* @__PURE__ */ new Map()
|
|
7857
|
+
};
|
|
7858
|
+
for (const file of walkMdFiles(rootDir)) {
|
|
7859
|
+
const relPath = path4__namespace.relative(rootDir, file).replace(/\\/g, "/");
|
|
7860
|
+
if (isExcludedPrivacyMd(relPath)) continue;
|
|
7861
|
+
try {
|
|
7862
|
+
const fm = extractFrontmatter(fs7__namespace.readFileSync(file, "utf-8"));
|
|
7863
|
+
if (fm && fm.id) classifyPrivacyMarkdown(fm, relPath, acc);
|
|
7864
|
+
} catch {
|
|
7865
|
+
}
|
|
7866
|
+
}
|
|
7867
|
+
return acc;
|
|
7868
|
+
}
|
|
7869
|
+
var SENSITIVE_CLASSIFICATIONS = /* @__PURE__ */ new Set([
|
|
7870
|
+
"confidential-pii",
|
|
7871
|
+
"confidential_pii",
|
|
7872
|
+
"special-category-sensitive",
|
|
7873
|
+
"special_category_sensitive"
|
|
7874
|
+
]);
|
|
7875
|
+
function isSensitiveClassification(classification) {
|
|
7876
|
+
return SENSITIVE_CLASSIFICATIONS.has(classification);
|
|
7877
|
+
}
|
|
7878
|
+
function createViolation(ruleId, type, severity, fullPath, relPath, message) {
|
|
7879
|
+
return { ruleId, type, severity, filePath: fullPath, relPath, message };
|
|
7880
|
+
}
|
|
7881
|
+
function checkAssetRetention(asset, policy, fullPath) {
|
|
7882
|
+
if (!policy.ci_gates.fail_on_missing_retention_policy) return null;
|
|
7883
|
+
if (asset.retentionPeriod && asset.erasureMethod) return null;
|
|
7884
|
+
return createViolation(
|
|
7885
|
+
"PRIV-003-MISSING-RETENTION-POLICY",
|
|
7886
|
+
"MISSING_RETENTION_POLICY",
|
|
7887
|
+
"HIGH",
|
|
7888
|
+
fullPath,
|
|
7889
|
+
asset.filePath,
|
|
7890
|
+
`Data asset '${asset.id}' (${asset.classification}) is missing a valid retention-period or erasure-method`
|
|
7891
|
+
);
|
|
7892
|
+
}
|
|
7893
|
+
function checkAssetRopaRegistration(asset, ropaRecords, policy, fullPath) {
|
|
7894
|
+
if (!policy.ci_gates.fail_on_unregistered_pii) return null;
|
|
7895
|
+
if (ropaRecords.some((r) => r.dataAssets.includes(asset.id))) return null;
|
|
7896
|
+
return createViolation(
|
|
7897
|
+
"PRIV-005-UNREGISTERED-ROPA",
|
|
7898
|
+
"UNREGISTERED_ROPA",
|
|
7899
|
+
"HIGH",
|
|
7900
|
+
fullPath,
|
|
7901
|
+
asset.filePath,
|
|
7902
|
+
`Personal data asset '${asset.id}' is not registered in any GDPR Art. 30 ROPA artifact (PRIV-ROPA-*)`
|
|
7903
|
+
);
|
|
7904
|
+
}
|
|
7905
|
+
function auditDataAssetGovernance(asset, ropaRecords, policy, rootDir) {
|
|
7906
|
+
if (!isSensitiveClassification(asset.classification)) return [];
|
|
7907
|
+
const fullPath = path4__namespace.join(rootDir, asset.filePath);
|
|
7908
|
+
const v1 = checkAssetRetention(asset, policy, fullPath);
|
|
7909
|
+
const v2 = checkAssetRopaRegistration(asset, ropaRecords, policy, fullPath);
|
|
7910
|
+
return [v1, v2].filter((v) => v !== null);
|
|
7911
|
+
}
|
|
7912
|
+
function checkRopaControlLink(ropa, governedRopaIds, fullPath) {
|
|
7913
|
+
if (ropa.mitigatedBy.length > 0 || governedRopaIds.has(ropa.id)) return [];
|
|
7914
|
+
return [
|
|
7915
|
+
createViolation(
|
|
7916
|
+
"PRIV-006-MISSING-PRIVACY-CONTROL",
|
|
7917
|
+
"MISSING_PRIVACY_CONTROL",
|
|
7918
|
+
"HIGH",
|
|
7919
|
+
fullPath,
|
|
7920
|
+
ropa.filePath,
|
|
7921
|
+
`ROPA activity '${ropa.id}' lacks a governing technical privacy control (PRIV-REQ-*)`
|
|
7922
|
+
)
|
|
7923
|
+
];
|
|
7924
|
+
}
|
|
7925
|
+
function checkRopaSubprocessors(ropa, policy, fullPath) {
|
|
7926
|
+
if (!policy.ci_gates.fail_on_unapproved_subprocessor) return [];
|
|
7927
|
+
const approved = new Set(policy.cross_border_transfers?.approved_subprocessors || []);
|
|
7928
|
+
return ropa.subprocessors.filter((sub) => !approved.has(sub)).map(
|
|
7929
|
+
(sub) => createViolation(
|
|
7930
|
+
"PRIV-007-UNAPPROVED-SUBPROCESSOR",
|
|
7931
|
+
"UNAPPROVED_SUBPROCESSOR",
|
|
7932
|
+
"HIGH",
|
|
7933
|
+
fullPath,
|
|
7934
|
+
ropa.filePath,
|
|
7935
|
+
`ROPA activity '${ropa.id}' references unapproved subprocessor '${sub}' not listed in privacy-policy.yaml`
|
|
7936
|
+
)
|
|
7937
|
+
);
|
|
7938
|
+
}
|
|
7939
|
+
function checkRopaControlsAndSubprocessors(ropa, governedRopaIds, policy, fullPath) {
|
|
7940
|
+
return [
|
|
7941
|
+
...checkRopaControlLink(ropa, governedRopaIds, fullPath),
|
|
7942
|
+
...checkRopaSubprocessors(ropa, policy, fullPath)
|
|
7943
|
+
];
|
|
7944
|
+
}
|
|
7945
|
+
function ropaProcessesSpecialCategory(ropa, dataAssets) {
|
|
7946
|
+
return ropa.dataAssets.some((id) => {
|
|
7947
|
+
const found = dataAssets.find((a) => a.id === id);
|
|
7948
|
+
return Boolean(found && found.classification.includes("special"));
|
|
7949
|
+
});
|
|
7950
|
+
}
|
|
7951
|
+
function isDpiaMissingOrUnapproved(dpiaId, dpiaStatuses) {
|
|
7952
|
+
if (!dpiaId) return true;
|
|
7953
|
+
const status = dpiaStatuses.get(dpiaId);
|
|
7954
|
+
return Boolean(status && status !== "approved");
|
|
7955
|
+
}
|
|
7956
|
+
function checkRopaDpiaApproval(ropa, dataAssets, dpiaStatuses, fullPath) {
|
|
7957
|
+
const requiresDpia = ropa.dpiaRequired || ropaProcessesSpecialCategory(ropa, dataAssets);
|
|
7958
|
+
if (!requiresDpia) return { violations: [], dpiaRequired: false };
|
|
7959
|
+
if (!isDpiaMissingOrUnapproved(ropa.dpiaReference, dpiaStatuses)) {
|
|
7960
|
+
return { violations: [], dpiaRequired: true };
|
|
7961
|
+
}
|
|
7962
|
+
return {
|
|
7963
|
+
dpiaRequired: true,
|
|
7964
|
+
violations: [
|
|
7965
|
+
createViolation(
|
|
7966
|
+
"PRIV-008-DPIA-APPROVAL-REQUIRED",
|
|
7967
|
+
"DPIA_APPROVAL_REQUIRED",
|
|
7968
|
+
"CRITICAL",
|
|
7969
|
+
fullPath,
|
|
7970
|
+
ropa.filePath,
|
|
7971
|
+
`ROPA activity '${ropa.id}' processes special-category/high-risk data and requires an approved DPIA-* signed by the DPO`
|
|
7972
|
+
)
|
|
7973
|
+
]
|
|
7974
|
+
};
|
|
7975
|
+
}
|
|
7976
|
+
function collectSourceFilesForPrivacy(rootDir, targetDirs) {
|
|
7977
|
+
const files = [];
|
|
7978
|
+
for (const dir of targetDirs) {
|
|
7979
|
+
const fullDir = path4__namespace.join(rootDir, dir);
|
|
7980
|
+
if (fs7__namespace.existsSync(fullDir)) {
|
|
7981
|
+
files.push(...walkSourceFiles(fullDir, rootDir));
|
|
7982
|
+
}
|
|
7983
|
+
}
|
|
7984
|
+
return files;
|
|
7985
|
+
}
|
|
7986
|
+
function formatRopaTableRow(r) {
|
|
7987
|
+
const ucs = r.useCases.join(", ") || "\u2014";
|
|
7988
|
+
const assets = r.dataAssets.join(", ") || "\u2014";
|
|
7989
|
+
const controls = r.mitigatedBy.join(", ") || "\u2014";
|
|
7990
|
+
return `| \`${r.id}\` | ${r.title} | \`${r.lawfulBasis}\` | ${ucs} | ${assets} | \`${r.retentionTtl}\` | ${controls} |`;
|
|
7991
|
+
}
|
|
7992
|
+
function formatAssetTableRow(a) {
|
|
7993
|
+
const cats = a.piiCategories.join(", ");
|
|
7994
|
+
return `| \`${a.id}\` | ${a.title} | \`${a.classification}\` | ${cats} | \`${a.retentionPeriod}\` | \`${a.erasureMethod}\` |`;
|
|
7995
|
+
}
|
|
7996
|
+
function buildRopaSectionLines(ropaRecords) {
|
|
7997
|
+
const rows = ropaRecords.map(formatRopaTableRow);
|
|
7998
|
+
const emptyRopa = `| \u2014 | No processing activities registered | \u2014 | \u2014 | \u2014 | \u2014 | \u2014 |`;
|
|
7999
|
+
return [
|
|
8000
|
+
`## 1. Processing Activities Register (\`PRIV-ROPA-*\`)`,
|
|
8001
|
+
``,
|
|
8002
|
+
`| ROPA ID | Processing Activity | Lawful Basis | Triggering Use Cases | Data Assets | Retention TTL | Privacy Controls |`,
|
|
8003
|
+
`| :--- | :--- | :--- | :--- | :--- | :---: | :--- |`,
|
|
8004
|
+
...rows.length > 0 ? rows : [emptyRopa]
|
|
8005
|
+
];
|
|
8006
|
+
}
|
|
8007
|
+
function buildAssetSectionLines(dataAssets) {
|
|
8008
|
+
const assetRows = dataAssets.map(formatAssetTableRow);
|
|
8009
|
+
const emptyAsset = `| \u2014 | No personal data assets registered | \u2014 | \u2014 | \u2014 | \u2014 |`;
|
|
8010
|
+
return [
|
|
8011
|
+
`## 2. Personal Data Assets Inventory (\`DATA-ASSET-*\`)`,
|
|
8012
|
+
``,
|
|
8013
|
+
`| Asset ID | Title | Classification | PII Categories | Retention | Erasure Method |`,
|
|
8014
|
+
`| :--- | :--- | :--- | :--- | :---: | :--- |`,
|
|
8015
|
+
...assetRows.length > 0 ? assetRows : [emptyAsset]
|
|
8016
|
+
];
|
|
8017
|
+
}
|
|
8018
|
+
function generateRopaInventoryMarkdown(result, policy = DEFAULT_PRIVACY_POLICY) {
|
|
8019
|
+
return [
|
|
8020
|
+
`# \u{1F510} GDPR Art. 30 Record of Processing Activities (ROPA Inventory)`,
|
|
8021
|
+
``,
|
|
8022
|
+
`> **Project:** ${policy.project}`,
|
|
8023
|
+
`> **Regulatory Frameworks:** ${policy.regulatory_frameworks.join(", ")}`,
|
|
8024
|
+
`> **Total Data Assets:** ${result.dataAssetsCount} | **Active ROPA Entries:** ${result.ropaRecordsCount} | **Privacy Controls:** ${result.privacyRequirementsCount}`,
|
|
8025
|
+
``,
|
|
8026
|
+
...buildRopaSectionLines(result.ropaRecords),
|
|
8027
|
+
``,
|
|
8028
|
+
...buildAssetSectionLines(result.dataAssets),
|
|
8029
|
+
``
|
|
8030
|
+
].join("\n");
|
|
8031
|
+
}
|
|
8032
|
+
function formatViolationRow(v) {
|
|
8033
|
+
const loc = v.lineNumber ? `${v.relPath}:${v.lineNumber}` : v.relPath;
|
|
8034
|
+
return `| **${v.severity}** | \`${v.ruleId}\` | \`${v.type}\` | \`${loc}\` | ${v.message} |`;
|
|
8035
|
+
}
|
|
8036
|
+
function buildReportFindingsSection(violations) {
|
|
8037
|
+
if (violations.length === 0) {
|
|
8038
|
+
return [
|
|
8039
|
+
`## Compliance Summary`,
|
|
8040
|
+
``,
|
|
8041
|
+
`Zero unmasked PII leaks in logs or AI prompts, zero hardcoded personal identifiers, and 100% of declared personal data assets comply with GDPR Art. 25 & Art. 30 governance.`
|
|
8042
|
+
];
|
|
8043
|
+
}
|
|
8044
|
+
return [
|
|
8045
|
+
`## Detected Privacy & Data Protection Findings`,
|
|
8046
|
+
``,
|
|
8047
|
+
`| Severity | Rule | Finding Type | Location | Details |`,
|
|
8048
|
+
`| :---: | :--- | :--- | :--- | :--- |`,
|
|
8049
|
+
...violations.map(formatViolationRow)
|
|
8050
|
+
];
|
|
8051
|
+
}
|
|
8052
|
+
function generatePrivacyReportMarkdown(result, policy = DEFAULT_PRIVACY_POLICY) {
|
|
8053
|
+
const verdict = result.success ? "\u2705 COMPLIANT (Privacy-by-Design as Code verified)" : `\u274C BLOCKED (${result.violationsCount} privacy violations detected)`;
|
|
8054
|
+
return [
|
|
8055
|
+
`# \u{1F6E1}\uFE0F Privacy-by-Design & Data Protection Audit (Gate 12)`,
|
|
8056
|
+
``,
|
|
8057
|
+
`> **Verdict:** ${verdict}`,
|
|
8058
|
+
`> **Regulatory Baseline:** ${policy.regulatory_frameworks.join(", ")}`,
|
|
8059
|
+
`> **Audited Source Files:** ${result.totalFilesScanned} | **Data Assets:** ${result.dataAssetsCount} | **ROPA Records:** ${result.ropaRecordsCount} | **Privacy Reqs:** ${result.privacyRequirementsCount}`,
|
|
8060
|
+
``,
|
|
8061
|
+
`---`,
|
|
8062
|
+
``,
|
|
8063
|
+
...buildReportFindingsSection(result.violations),
|
|
8064
|
+
``
|
|
8065
|
+
].join("\n");
|
|
8066
|
+
}
|
|
8067
|
+
function writePrivacyOutputsIfNeeded(result, options, policy, rootDir) {
|
|
8068
|
+
if (options.generateRopa) {
|
|
8069
|
+
const relRopa = options.ropaOutputPath || policy.ci_gates.output_ropa_file || "reports/ROPA_INVENTORY.md";
|
|
8070
|
+
const fullRopa = path4__namespace.isAbsolute(relRopa) ? relRopa : path4__namespace.join(rootDir, relRopa);
|
|
8071
|
+
fs7__namespace.mkdirSync(path4__namespace.dirname(fullRopa), { recursive: true });
|
|
8072
|
+
fs7__namespace.writeFileSync(fullRopa, result.ropaMarkdown, "utf-8");
|
|
8073
|
+
result.ropaOutputPath = fullRopa;
|
|
8074
|
+
}
|
|
8075
|
+
if (options.reportOutputPath) {
|
|
8076
|
+
const fullReport = path4__namespace.isAbsolute(options.reportOutputPath) ? options.reportOutputPath : path4__namespace.join(rootDir, options.reportOutputPath);
|
|
8077
|
+
fs7__namespace.mkdirSync(path4__namespace.dirname(fullReport), { recursive: true });
|
|
8078
|
+
fs7__namespace.writeFileSync(fullReport, result.reportMarkdown, "utf-8");
|
|
8079
|
+
result.reportOutputPath = fullReport;
|
|
8080
|
+
}
|
|
8081
|
+
}
|
|
8082
|
+
function evaluateDiscoveredPrivacyGovernance(discovered, policy, rootDir) {
|
|
8083
|
+
const governedRopaIds = new Set(discovered.privacyReqs.flatMap((r) => r.governsRopa));
|
|
8084
|
+
const violations = [];
|
|
8085
|
+
for (const asset of discovered.dataAssets) {
|
|
8086
|
+
violations.push(...auditDataAssetGovernance(asset, discovered.ropaRecords, policy, rootDir));
|
|
8087
|
+
}
|
|
8088
|
+
let dpiaRequiredCount = 0;
|
|
8089
|
+
for (const ropa of discovered.ropaRecords) {
|
|
8090
|
+
const fullPath = path4__namespace.join(rootDir, ropa.filePath);
|
|
8091
|
+
violations.push(...checkRopaControlsAndSubprocessors(ropa, governedRopaIds, policy, fullPath));
|
|
8092
|
+
const dpiaCheck = checkRopaDpiaApproval(ropa, discovered.dataAssets, discovered.dpiaStatuses, fullPath);
|
|
8093
|
+
if (dpiaCheck.dpiaRequired) dpiaRequiredCount++;
|
|
8094
|
+
violations.push(...dpiaCheck.violations);
|
|
8095
|
+
}
|
|
8096
|
+
return { violations, dpiaRequiredCount };
|
|
8097
|
+
}
|
|
8098
|
+
function buildInitialPrivacyResult(totalFilesScanned, discovered, violations, dpiaRequiredCount) {
|
|
8099
|
+
return {
|
|
8100
|
+
success: violations.length === 0,
|
|
8101
|
+
totalFilesScanned,
|
|
8102
|
+
dataAssetsCount: discovered.dataAssets.length,
|
|
8103
|
+
ropaRecordsCount: discovered.ropaRecords.length,
|
|
8104
|
+
privacyRequirementsCount: discovered.privacyReqs.length,
|
|
8105
|
+
violationsCount: violations.length,
|
|
8106
|
+
dpiaRequiredCount,
|
|
8107
|
+
dataAssets: discovered.dataAssets,
|
|
8108
|
+
ropaRecords: discovered.ropaRecords,
|
|
8109
|
+
violations,
|
|
8110
|
+
ropaMarkdown: "",
|
|
8111
|
+
reportMarkdown: ""
|
|
8112
|
+
};
|
|
8113
|
+
}
|
|
8114
|
+
function verifyPrivacy(options = {}) {
|
|
8115
|
+
const rootDir = options.rootDir || process.cwd();
|
|
8116
|
+
const policy = loadPrivacyPolicy(rootDir, options.policyPath);
|
|
8117
|
+
const sourceFiles = collectSourceFilesForPrivacy(rootDir, options.targetDirectories || ["src", "packages"]);
|
|
8118
|
+
const codeViolations = sourceFiles.flatMap((file) => scanFileForPrivacyViolations(file, rootDir, policy));
|
|
8119
|
+
const discovered = discoverPrivacyArtifacts(rootDir);
|
|
8120
|
+
const gov = evaluateDiscoveredPrivacyGovernance(discovered, policy, rootDir);
|
|
8121
|
+
const violations = [...codeViolations, ...gov.violations];
|
|
8122
|
+
const result = buildInitialPrivacyResult(sourceFiles.length, discovered, violations, gov.dpiaRequiredCount);
|
|
8123
|
+
result.ropaMarkdown = generateRopaInventoryMarkdown(result, policy);
|
|
8124
|
+
result.reportMarkdown = generatePrivacyReportMarkdown(result, policy);
|
|
8125
|
+
writePrivacyOutputsIfNeeded(result, options, policy, rootDir);
|
|
8126
|
+
return result;
|
|
8127
|
+
}
|
|
7448
8128
|
function calculateRating(mi, cc) {
|
|
7449
8129
|
if (mi >= 75 && cc <= 5) return "A";
|
|
7450
8130
|
if (mi >= 60 && cc <= 10) return "B";
|
|
@@ -8885,7 +9565,9 @@ var NON_GRAPH_TYPES = /* @__PURE__ */ new Set([
|
|
|
8885
9565
|
"mcp-config",
|
|
8886
9566
|
"user-manual",
|
|
8887
9567
|
"production-manual",
|
|
8888
|
-
"architecture-glossary"
|
|
9568
|
+
"architecture-glossary",
|
|
9569
|
+
"dpia-request",
|
|
9570
|
+
"privacy-policy"
|
|
8889
9571
|
]);
|
|
8890
9572
|
var PREFIX_MAP = {
|
|
8891
9573
|
"ARCH-INTRO": { type: "architecture-introduction", layer: "product" },
|
|
@@ -8895,11 +9577,14 @@ var PREFIX_MAP = {
|
|
|
8895
9577
|
"UC": { type: "use-case", layer: "product" },
|
|
8896
9578
|
"BR": { type: "business-rule", layer: "product" },
|
|
8897
9579
|
"ABUSE": { type: "abuse-case", layer: "product" },
|
|
9580
|
+
"DATA-ASSET": { type: "data-asset", layer: "product" },
|
|
9581
|
+
"PRIV-ROPA": { type: "privacy-ropa", layer: "product" },
|
|
8898
9582
|
"HAZ": { type: "hazard", layer: "product" },
|
|
8899
9583
|
"SEC-ENC": { type: "security-enclave", layer: "architecture" },
|
|
8900
9584
|
"CMP": { type: "component", layer: "architecture" },
|
|
8901
9585
|
"ADR": { type: "adr", layer: "architecture" },
|
|
8902
|
-
"SEC-REQ": { type: "security-requirement", layer: "requirement" }
|
|
9586
|
+
"SEC-REQ": { type: "security-requirement", layer: "requirement" },
|
|
9587
|
+
"PRIV-REQ": { type: "privacy-requirement", layer: "requirement" }
|
|
8903
9588
|
};
|
|
8904
9589
|
var TYPE_LOOKUP = {
|
|
8905
9590
|
"architecture-introduction": { type: "architecture-introduction", layer: "product" },
|
|
@@ -8911,15 +9596,18 @@ var TYPE_LOOKUP = {
|
|
|
8911
9596
|
"business-rule": { type: "business-rule", layer: "product" },
|
|
8912
9597
|
"rule": { type: "business-rule", layer: "product" },
|
|
8913
9598
|
"abuse-case": { type: "abuse-case", layer: "product" },
|
|
9599
|
+
"data-asset": { type: "data-asset", layer: "product" },
|
|
9600
|
+
"privacy-ropa": { type: "privacy-ropa", layer: "product" },
|
|
8914
9601
|
"hazard": { type: "hazard", layer: "product" },
|
|
8915
9602
|
"security-enclave": { type: "security-enclave", layer: "architecture" },
|
|
8916
9603
|
"component": { type: "component", layer: "architecture" },
|
|
8917
9604
|
"architecture-decision-record": { type: "adr", layer: "architecture" },
|
|
8918
9605
|
"adr": { type: "adr", layer: "architecture" },
|
|
8919
|
-
"security-requirement": { type: "security-requirement", layer: "requirement" }
|
|
9606
|
+
"security-requirement": { type: "security-requirement", layer: "requirement" },
|
|
9607
|
+
"privacy-requirement": { type: "privacy-requirement", layer: "requirement" }
|
|
8920
9608
|
};
|
|
8921
9609
|
function classifyArtifactLayerAndType(id, declaredType) {
|
|
8922
|
-
if (NON_GRAPH_TYPES.has(declaredType) || /^(TERM|HOF|AHOF|CHG|DSG|SPEC|TSK|UDF|AUDIT)-/.test(id)) {
|
|
9610
|
+
if (NON_GRAPH_TYPES.has(declaredType) || /^(TERM|HOF|AHOF|CHG|DSG|SPEC|TSK|UDF|AUDIT|DPIA)-/.test(id)) {
|
|
8923
9611
|
return null;
|
|
8924
9612
|
}
|
|
8925
9613
|
for (const [prefix, mapping] of Object.entries(PREFIX_MAP)) {
|
|
@@ -8963,7 +9651,7 @@ function parseAndCatalogArtifactFile(rootDir, filePath, scannedMap, archViewByBa
|
|
|
8963
9651
|
function scanWorkspaceArtifacts(rootDir) {
|
|
8964
9652
|
const scannedArtifactsMap = /* @__PURE__ */ new Map();
|
|
8965
9653
|
const archViewByBasename = /* @__PURE__ */ new Map();
|
|
8966
|
-
const artifactDirs = ["product", "architecture", "specs", "security"];
|
|
9654
|
+
const artifactDirs = ["product", "architecture", "specs", "security", "privacy"];
|
|
8967
9655
|
for (const dirName of artifactDirs) {
|
|
8968
9656
|
const fullDirPath = path4__namespace.join(rootDir, dirName);
|
|
8969
9657
|
if (fs7__namespace.existsSync(fullDirPath)) {
|
|
@@ -8980,6 +9668,8 @@ function resolveUpstreamType(u) {
|
|
|
8980
9668
|
if (u.startsWith("UC-")) return "use-case";
|
|
8981
9669
|
if (u.startsWith("BR-")) return "business-rule";
|
|
8982
9670
|
if (u.startsWith("ABUSE-")) return "abuse-case";
|
|
9671
|
+
if (u.startsWith("DATA-ASSET-")) return "data-asset";
|
|
9672
|
+
if (u.startsWith("PRIV-ROPA-")) return "privacy-ropa";
|
|
8983
9673
|
return "product";
|
|
8984
9674
|
}
|
|
8985
9675
|
function addTraceUpstreamEdges(r, status, nodeMap, addEdge) {
|
|
@@ -9058,7 +9748,7 @@ function addTraceTestEdges(r, status, rootDir, nodeMap, addEdge) {
|
|
|
9058
9748
|
}
|
|
9059
9749
|
}
|
|
9060
9750
|
function buildReqNode(r, status) {
|
|
9061
|
-
const reqType = r.id.startsWith("SEC-REQ-") ? "security-requirement" : "requirement";
|
|
9751
|
+
const reqType = r.id.startsWith("SEC-REQ-") ? "security-requirement" : r.id.startsWith("PRIV-REQ-") ? "privacy-requirement" : "requirement";
|
|
9062
9752
|
return {
|
|
9063
9753
|
id: r.id,
|
|
9064
9754
|
label: r.id,
|
|
@@ -9132,7 +9822,7 @@ function connectIntroRelationships(art, nodeMap, addEdge) {
|
|
|
9132
9822
|
for (const qrId of list) {
|
|
9133
9823
|
if (typeof qrId === "string" && qrId.trim()) {
|
|
9134
9824
|
const q = qrId.trim();
|
|
9135
|
-
const qType = q.startsWith("SEC-REQ-") ? "security-requirement" : "requirement";
|
|
9825
|
+
const qType = q.startsWith("SEC-REQ-") ? "security-requirement" : q.startsWith("PRIV-REQ-") ? "privacy-requirement" : "requirement";
|
|
9136
9826
|
connectTargets(art.id, [q], "defines-goal", nodeMap, addEdge, qType, "requirement");
|
|
9137
9827
|
}
|
|
9138
9828
|
}
|
|
@@ -9211,6 +9901,28 @@ function connectAbuseCaseRelationships(art, nodeMap, addEdge) {
|
|
|
9211
9901
|
connectAbuseTargets(fm["targets-use-case"] || fm["targets-use-cases"] || fm["targets"], art.id, nodeMap, addEdge);
|
|
9212
9902
|
connectAbuseMitigations(fm["mitigated-by"], art.id, nodeMap, addEdge);
|
|
9213
9903
|
}
|
|
9904
|
+
function connectDataAssetRelationships(art, nodeMap, addEdge) {
|
|
9905
|
+
const fm = art.frontmatter;
|
|
9906
|
+
for (const subj of toList(fm["data-subjects"])) {
|
|
9907
|
+
connectTargets(subj.trim(), [art.id], "owns-data", nodeMap, addEdge, "actor", "product");
|
|
9908
|
+
}
|
|
9909
|
+
const owner = typeof fm["owner-bounded-context"] === "string" ? fm["owner-bounded-context"].trim() : "";
|
|
9910
|
+
if (owner && owner.startsWith("CMP-")) {
|
|
9911
|
+
connectTargets(art.id, [owner], "satisfies", nodeMap, addEdge, "component", "architecture");
|
|
9912
|
+
}
|
|
9913
|
+
}
|
|
9914
|
+
function connectPrivacyRopaRelationships(art, nodeMap, addEdge) {
|
|
9915
|
+
const fm = art.frontmatter;
|
|
9916
|
+
for (const uc of toList(fm["use-cases"])) {
|
|
9917
|
+
connectTargets(uc.trim(), [art.id], "derives-from", nodeMap, addEdge, "use-case", "product");
|
|
9918
|
+
}
|
|
9919
|
+
for (const asset of toList(fm["data-assets"])) {
|
|
9920
|
+
connectTargets(asset.trim(), [art.id], "governs", nodeMap, addEdge, "data-asset", "product");
|
|
9921
|
+
}
|
|
9922
|
+
for (const req of toList(fm["mitigated-by"])) {
|
|
9923
|
+
connectTargets(art.id, [req.trim()], "mitigated-by", nodeMap, addEdge, "privacy-requirement", "requirement");
|
|
9924
|
+
}
|
|
9925
|
+
}
|
|
9214
9926
|
function connectRequirementMitigations(art, nodeMap, addEdge) {
|
|
9215
9927
|
for (const ab of toList(art.frontmatter["mitigates-abuse-case"])) {
|
|
9216
9928
|
const id = ab.trim();
|
|
@@ -9218,6 +9930,18 @@ function connectRequirementMitigations(art, nodeMap, addEdge) {
|
|
|
9218
9930
|
connectTargets(id, [art.id], "mitigated-by", nodeMap, addEdge, "abuse-case", "product");
|
|
9219
9931
|
}
|
|
9220
9932
|
}
|
|
9933
|
+
for (const ropa of toList(art.frontmatter["governs-ropa"])) {
|
|
9934
|
+
const id = ropa.trim();
|
|
9935
|
+
if (id) {
|
|
9936
|
+
connectTargets(id, [art.id], "mitigated-by", nodeMap, addEdge, "privacy-ropa", "product");
|
|
9937
|
+
}
|
|
9938
|
+
}
|
|
9939
|
+
for (const asset of toList(art.frontmatter["protects-data-assets"])) {
|
|
9940
|
+
const id = asset.trim();
|
|
9941
|
+
if (id) {
|
|
9942
|
+
connectTargets(id, [art.id], "governs", nodeMap, addEdge, "data-asset", "product");
|
|
9943
|
+
}
|
|
9944
|
+
}
|
|
9221
9945
|
}
|
|
9222
9946
|
function connectAdrRelationships(art, nodeMap, addEdge) {
|
|
9223
9947
|
for (const cmp of toList(art.frontmatter["affects-components"])) {
|
|
@@ -9241,8 +9965,11 @@ var CONNECTOR_MAP = {
|
|
|
9241
9965
|
"use-case": connectUseCaseRelationships,
|
|
9242
9966
|
"business-rule": (art, _map, addEdge) => connectBusinessRuleRelationships(art, addEdge),
|
|
9243
9967
|
"abuse-case": connectAbuseCaseRelationships,
|
|
9968
|
+
"data-asset": connectDataAssetRelationships,
|
|
9969
|
+
"privacy-ropa": connectPrivacyRopaRelationships,
|
|
9244
9970
|
"requirement": connectRequirementMitigations,
|
|
9245
9971
|
"security-requirement": connectRequirementMitigations,
|
|
9972
|
+
"privacy-requirement": connectRequirementMitigations,
|
|
9246
9973
|
"adr": connectAdrRelationships,
|
|
9247
9974
|
"security-enclave": connectEnclaveRelationships
|
|
9248
9975
|
};
|
|
@@ -9862,6 +10589,28 @@ var DASHBOARD_CLIENT_SCRIPT = `
|
|
|
9862
10589
|
'height': 46
|
|
9863
10590
|
}
|
|
9864
10591
|
},
|
|
10592
|
+
{
|
|
10593
|
+
selector: 'node.type-data-asset',
|
|
10594
|
+
style: {
|
|
10595
|
+
'shape': 'barrel',
|
|
10596
|
+
'background-color': '#134e4a',
|
|
10597
|
+
'border-color': '#5eead4',
|
|
10598
|
+
'border-width': 2.5,
|
|
10599
|
+
'width': 68,
|
|
10600
|
+
'height': 42
|
|
10601
|
+
}
|
|
10602
|
+
},
|
|
10603
|
+
{
|
|
10604
|
+
selector: 'node.type-privacy-ropa',
|
|
10605
|
+
style: {
|
|
10606
|
+
'shape': 'round-rectangle',
|
|
10607
|
+
'background-color': '#1e3a8a',
|
|
10608
|
+
'border-color': '#60a5fa',
|
|
10609
|
+
'border-width': 2.5,
|
|
10610
|
+
'width': 72,
|
|
10611
|
+
'height': 40
|
|
10612
|
+
}
|
|
10613
|
+
},
|
|
9865
10614
|
{
|
|
9866
10615
|
selector: 'node.type-security-enclave',
|
|
9867
10616
|
style: {
|
|
@@ -9874,7 +10623,7 @@ var DASHBOARD_CLIENT_SCRIPT = `
|
|
|
9874
10623
|
}
|
|
9875
10624
|
},
|
|
9876
10625
|
{
|
|
9877
|
-
selector: 'node.type-requirement, node.type-security-requirement',
|
|
10626
|
+
selector: 'node.type-requirement, node.type-security-requirement, node.type-privacy-requirement',
|
|
9878
10627
|
style: {
|
|
9879
10628
|
'shape': 'round-rectangle',
|
|
9880
10629
|
'background-color': '#1e293b',
|
|
@@ -9907,7 +10656,7 @@ var DASHBOARD_CLIENT_SCRIPT = `
|
|
|
9907
10656
|
}
|
|
9908
10657
|
},
|
|
9909
10658
|
{
|
|
9910
|
-
selector: 'node.layer-product:not(.type-architecture-introduction):not(.type-journey):not(.type-actor):not(.type-use-case):not(.type-usecase):not(.type-business-rule):not(.type-rule):not(.type-abuse-case):not(.type-threat-actor)',
|
|
10659
|
+
selector: 'node.layer-product:not(.type-architecture-introduction):not(.type-journey):not(.type-actor):not(.type-use-case):not(.type-usecase):not(.type-business-rule):not(.type-rule):not(.type-abuse-case):not(.type-threat-actor):not(.type-data-asset):not(.type-privacy-ropa)',
|
|
9911
10660
|
style: { 'shape': 'diamond', 'background-color': '#0e7490', 'border-color': '#38bdf8', 'width': 50, 'height': 50 }
|
|
9912
10661
|
},
|
|
9913
10662
|
{
|
|
@@ -10105,7 +10854,15 @@ var DASHBOARD_CLIENT_SCRIPT = `
|
|
|
10105
10854
|
typeBadgeColor = '#881337';
|
|
10106
10855
|
typeTitle = 'ABUSE CASE (ABUSE)';
|
|
10107
10856
|
typologyKey = 'abuse-case';
|
|
10108
|
-
} else if (typeName === '
|
|
10857
|
+
} else if (typeName === 'data-asset') {
|
|
10858
|
+
typeBadgeColor = '#134e4a';
|
|
10859
|
+
typeTitle = 'DATA ASSET (DATA-ASSET)';
|
|
10860
|
+
typologyKey = 'data-asset';
|
|
10861
|
+
} else if (typeName === 'privacy-ropa') {
|
|
10862
|
+
typeBadgeColor = '#1e3a8a';
|
|
10863
|
+
typeTitle = 'PRIVACY ROPA (PRIV-ROPA)';
|
|
10864
|
+
typologyKey = 'privacy-ropa';
|
|
10865
|
+
} else if (typeName === 'requirement' || typeName === 'security-requirement' || typeName === 'privacy-requirement') {
|
|
10109
10866
|
typeBadgeColor = '#1e293b';
|
|
10110
10867
|
typeTitle = 'REQUIREMENT (' + (data.id.split('-')[0] || 'REQ') + ')';
|
|
10111
10868
|
typologyKey = 'requirement';
|
|
@@ -10159,7 +10916,9 @@ var DASHBOARD_CLIENT_SCRIPT = `
|
|
|
10159
10916
|
'use-case': '.type-use-case, .type-usecase',
|
|
10160
10917
|
'business-rule': '.type-business-rule, .type-rule',
|
|
10161
10918
|
'abuse-case': '.type-abuse-case, .type-threat-actor',
|
|
10162
|
-
'
|
|
10919
|
+
'data-asset': '.type-data-asset',
|
|
10920
|
+
'privacy-ropa': '.type-privacy-ropa',
|
|
10921
|
+
'requirement': '.type-requirement, .type-security-requirement, .type-privacy-requirement, .layer-requirement',
|
|
10163
10922
|
'architecture': '.type-component, .type-adr, .type-security-enclave, .layer-architecture',
|
|
10164
10923
|
'test': '.type-bdd-feature, .type-code-test, .layer-test'
|
|
10165
10924
|
};
|
|
@@ -10569,7 +11328,9 @@ var GRAPH_LEGEND_HTML = `
|
|
|
10569
11328
|
<div class="legend-item" data-type="use-case" onclick="handleTypologyClick(event, 'use-case')" title="Filter Use Case"><span class="legend-dot" style="background:#0369a1; border:2px solid #38bdf8;"></span><strong>Use Case</strong> (UC)</div>
|
|
10570
11329
|
<div class="legend-item" data-type="business-rule" onclick="handleTypologyClick(event, 'business-rule')" title="Filter Business Rule"><span class="legend-dot" style="background:#b45309; border:2px solid #fbbf24; transform:rotate(45deg);"></span><strong>Business Rule</strong> (BR)</div>
|
|
10571
11330
|
<div class="legend-item" data-type="abuse-case" onclick="handleTypologyClick(event, 'abuse-case')" title="Filter Abuse Case"><span class="legend-dot" style="background:#881337; border:2px solid #f43f5e;"></span><strong>Abuse Case</strong> (ABUSE)</div>
|
|
10572
|
-
<div class="legend-item" data-type="
|
|
11331
|
+
<div class="legend-item" data-type="data-asset" onclick="handleTypologyClick(event, 'data-asset')" title="Filter Data Asset"><span class="legend-dot" style="background:#134e4a; border:2px solid #5eead4;"></span><strong>Data Asset</strong> (DATA-ASSET)</div>
|
|
11332
|
+
<div class="legend-item" data-type="privacy-ropa" onclick="handleTypologyClick(event, 'privacy-ropa')" title="Filter Privacy ROPA"><span class="legend-dot" style="background:#1e3a8a; border:2px solid #60a5fa;"></span><strong>Privacy ROPA</strong> (PRIV-ROPA)</div>
|
|
11333
|
+
<div class="legend-item" data-type="requirement" onclick="handleTypologyClick(event, 'requirement')" title="Filter Requirement"><span class="legend-dot" style="background:#1e293b; border:2px solid #64748b;"></span><strong>Requirement</strong> (FR/QR/SEC/PRIV)</div>
|
|
10573
11334
|
<div class="legend-item" data-type="architecture" onclick="handleTypologyClick(event, 'architecture')" title="Filter Architecture"><span class="legend-dot" style="background:#312e81; border:2px solid #818cf8;"></span><strong>Architecture</strong> (CMP/ADR)</div>
|
|
10574
11335
|
<div class="legend-item" data-type="test" onclick="handleTypologyClick(event, 'test')" title="Filter Test"><span class="legend-dot" style="background:#047857; border:2px solid #10b981;"></span><strong>Test</strong> (BDD/Test)</div>
|
|
10575
11336
|
</div>
|
|
@@ -10610,7 +11371,7 @@ function renderGraphToolbarHtml() {
|
|
|
10610
11371
|
` <div class="graph-toolbar">`,
|
|
10611
11372
|
` <div class="tool-row"><button class="tool-btn" onclick="cyZoom(0.2)">Zoom +</button><button class="tool-btn" onclick="cyZoom(-0.2)">Zoom -</button><button class="tool-btn" onclick="cy.fit(30)">Center</button><button class="tool-btn" onclick="resetHighlight()">Reset</button></div>`,
|
|
10612
11373
|
` <div class="tool-row"><select id="layout-select" class="tool-select" onchange="applyLayout(this.value)"><option value="breadthfirst">Hierarchical (Layers)</option><option value="cose">Force-directed (COSE)</option><option value="concentric">Concentric</option><option value="circle">Circular</option></select></div>`,
|
|
10613
|
-
` <div class="tool-row"><select id="type-filter" class="tool-select" onchange="filterType(this.value)"><option value="all">All Typologies</option><option value="architecture-introduction">Vision & Goals (ARCH-INTRO)</option><option value="journey">Journeys (JRN)</option><option value="actor">Actors (ACT)</option><option value="use-case">Use Cases (UC)</option><option value="business-rule">Business Rules (BR)</option><option value="abuse-case">Abuse Cases (ABUSE)</option><option value="requirement">Requirements (FR/QR/SEC)</option><option value="architecture">Architecture (CMP/ADR)</option><option value="test">Testing (BDD/Test)</option></select></div>`,
|
|
11374
|
+
` <div class="tool-row"><select id="type-filter" class="tool-select" onchange="filterType(this.value)"><option value="all">All Typologies</option><option value="architecture-introduction">Vision & Goals (ARCH-INTRO)</option><option value="journey">Journeys (JRN)</option><option value="actor">Actors (ACT)</option><option value="use-case">Use Cases (UC)</option><option value="business-rule">Business Rules (BR)</option><option value="abuse-case">Abuse Cases (ABUSE)</option><option value="data-asset">Data Assets (DATA-ASSET)</option><option value="privacy-ropa">Privacy ROPA (PRIV-ROPA)</option><option value="requirement">Requirements (FR/QR/SEC/PRIV)</option><option value="architecture">Architecture (CMP/ADR)</option><option value="test">Testing (BDD/Test)</option></select></div>`,
|
|
10614
11375
|
` <div class="tool-row"><select id="layer-filter" class="tool-select" onchange="filterLayer(this.value)"><option value="all">All Layers</option><option value="product">Layer 1: Product (Upstream)</option><option value="requirement">Layer 2: Requirements</option><option value="architecture">Layer 3: Architecture (Midstream)</option><option value="test">Layer 4: Testing (Downstream)</option></select></div>`,
|
|
10615
11376
|
` <div class="tool-row"><select id="status-filter" class="tool-select" onchange="filterStatus(this.value)"><option value="all">All Statuses</option><option value="COMPLIANT">Only Compliant (Green)</option><option value="issues">Only Orphans / Drift (Red)</option></select></div>`,
|
|
10616
11377
|
` <div class="tool-row"><input type="text" id="node-search" class="tool-input" placeholder="Search node ID..." oninput="searchNode(this.value)"></div>`,
|
|
@@ -11387,7 +12148,32 @@ var SPECIALIZED_AGENT_TEMPLATES = [
|
|
|
11387
12148
|
- In the **Technical Security Feedback Loop** (arriving from \`agent-system-architect\`), analyze infrastructure, persistence, middleware, and API decisions to issue system/software-level \`ACT-THREAT-*\` and \`SEC-REQ-*\`.
|
|
11388
12149
|
- Every \`SEC-REQ-*\` must include negative BDD attack and rejection scenarios tagged \`@security @mitigation\`.
|
|
11389
12150
|
- Run \`pnpm run verify:schemas\` before delivering the draft.
|
|
11390
|
-
- If autonomy is $\\ge$ \`HUMAN_REVIEW_PLAN\`, conclude by emitting the Workflow Handoff block (\`templates/workflow/agent-handoff.template.md\`) suggesting \`agent-system-architect\`
|
|
12151
|
+
- If autonomy is $\\ge$ \`HUMAN_REVIEW_PLAN\`, conclude by emitting the Workflow Handoff block (\`templates/workflow/agent-handoff.template.md\`) suggesting \`agent-privacy-officer\` (to model LINDDUN privacy threats, \`DATA-ASSET-*\`, \`PRIV-ROPA-*\`, and \`PRIV-REQ-*\` before \`agent-system-architect\` or \`agent-qa-engineer\`) and opening the Human Action Window. In \`AUTONOMOUS\` mode, omit interactive handoff.`
|
|
12152
|
+
},
|
|
12153
|
+
{
|
|
12154
|
+
id: "agent-privacy-officer",
|
|
12155
|
+
title: "Data Protection & Privacy-by-Design Specialist",
|
|
12156
|
+
description: "Model personal data assets (DATA-ASSET-*), GDPR Art. 30 records of processing (PRIV-ROPA-*), and LINDDUN/ISO 27701 privacy requirements (PRIV-REQ-*) on handoff from cybersecurity, and audit code diffs against privacy-policy.yaml.",
|
|
12157
|
+
globs: "privacy/**, specs/privacy/**, privacy-policy.yaml, templates/privacy/**, schemas/privacy/**",
|
|
12158
|
+
body: `## Role & Mission
|
|
12159
|
+
- **Role**: Data Protection & Privacy-by-Design Specialist Agent (\`agent-privacy-officer\`).
|
|
12160
|
+
- **Mission**: Receive the handoff from \`agent-threat-modeler\` to model personal data assets (\`DATA-ASSET-*\`), GDPR Art. 30 records of processing (\`PRIV-ROPA-*\`), and LINDDUN / GDPR Art. 25 / ISO 27701 privacy requirements (\`PRIV-REQ-*\`), and audit code changes in Pre-Merge against \`privacy-policy.yaml\`.
|
|
12161
|
+
|
|
12162
|
+
## Operational Directives & Guardrails
|
|
12163
|
+
- Operate under bimodal discipline depending on the lifecycle phase:
|
|
12164
|
+
1. **Shift-Left Design Mode (Post-Cybersecurity Handoff)**:
|
|
12165
|
+
- Inspect \`UC-*\`, \`FR-*\`, \`ABUSE-*\`, and \`SEC-REQ-*\` (and \`CMP-*\` during the technical security/privacy feedback loop from \`agent-system-architect\`).
|
|
12166
|
+
- Apply **LINDDUN** (Linkability, Identifiability, Non-repudiation, Detectability, Disclosure of information, Unawareness, Non-compliance) and **GDPR / LOPDGDD / ISO 27701** to generate the PDaC privacy triad in \`specs/privacy/\` conforming to \`schemas/privacy/\`:
|
|
12167
|
+
- \`DATA-ASSET-*\` (\`type: data-asset\`): personal data inventory classifying fields (\`PUBLIC\`, \`INTERNAL\`, \`CONFIDENTIAL_PII\`, \`RESTRICTED_SENSITIVE_PII\`), retention (\`retention-period\`), and erasure strategy (\`CRYPTO_SHREDDING\`, \`HARD_DELETE\`, \`ANONYMIZATION\`, \`RETENTION_LOCK\`).
|
|
12168
|
+
- \`PRIV-ROPA-*\` (\`type: privacy-ropa\`): GDPR Art. 30 Record of Processing Activity linking \`processes-use-cases\` (\`UC-*\`), \`data-assets\` (\`DATA-ASSET-*\`), \`lawful-basis\` (Art. 6), \`special-category-basis\` (Art. 9), and \`cross-border-transfer\`.
|
|
12169
|
+
- \`PRIV-REQ-*\` (\`type: privacy-requirement\`): technical and organizational privacy requirements (minimization, pseudonymization, masking in logs/LLM prompts, ARCO+/GDPR Art. 15\u201322 rights, retention/erasure) with Gherkin scenarios tagged \`@<PRIV-REQ-ID> @privacy @gdpr @automated @regression\`.
|
|
12170
|
+
- \`status\` ALWAYS starts as \`draft\`.
|
|
12171
|
+
- **DPIA Escalation Gate**: If \`RESTRICTED_SENSITIVE_PII\` (GDPR Art. 9 special categories), biometric/health data, systematic profiling, or unapproved cross-border transfers are detected, generate a \`DPIA-*\` request (\`templates/privacy/dpia-request.template.md\`), set \`dpia-required: true\`, and block autonomous progression until the human DPO / Legal Counsel approves.
|
|
12172
|
+
2. **Pre-Merge Privacy Audit Mode (Downstream / PR Gate)**:
|
|
12173
|
+
- Execute deterministic verification via \`pnpm run verify:privacy\` (\`npx aisdlc verify privacy\`) and inspect PR diffs for PII leaks in logs/telemetry (\`PRIV-001\`), unmasked PII in external LLM prompts (\`PRIV-002\`), missing retention/erasure on PII assets (\`PRIV-003\`), hardcoded real PII in tests/seeds (\`PRIV-004\`), unregistered ROPA (\`PRIV-005\`), or unapproved subprocessors (\`PRIV-007\`).
|
|
12174
|
+
- Block any PR with \`CRITICAL\` or \`HIGH\` privacy violations (exit code \`5\`).
|
|
12175
|
+
- Run \`pnpm run verify:schemas\` and \`pnpm run verify:privacy\` before delivering artifacts or audit verdicts.
|
|
12176
|
+
- If autonomy is $\\ge$ \`HUMAN_REVIEW_PLAN\`, conclude by emitting the Workflow Handoff block (\`templates/workflow/agent-handoff.template.md\`) suggesting \`agent-system-architect\` (or \`agent-qa-engineer\` after technical loop, or the human Tech Lead / DPO in Pre-Merge) and opening the Human Action Window. In \`AUTONOMOUS\` mode, omit interactive handoff.`
|
|
11391
12177
|
},
|
|
11392
12178
|
{
|
|
11393
12179
|
id: "agent-system-architect",
|
|
@@ -11399,22 +12185,22 @@ var SPECIALIZED_AGENT_TEMPLATES = [
|
|
|
11399
12185
|
- **Mission**: Translate approved product definition into a modular technical architecture based on arc42 enriched with NAF v4.
|
|
11400
12186
|
|
|
11401
12187
|
## Operational Directives & Guardrails
|
|
11402
|
-
- Decompose the system into building blocks \`CMP-*\` ensuring each component declares which use cases \`UC-*\` it implements and which requirements (\`FR-*\`, \`QR-*\`, \`SEC-REQ-*\`) it fulfills under \`satisfies-requirements\`.
|
|
12188
|
+
- Decompose the system into building blocks \`CMP-*\` ensuring each component declares which use cases \`UC-*\` it implements and which requirements (\`FR-*\`, \`QR-*\`, \`SEC-REQ-*\`, \`PRIV-REQ-*\`) it fulfills under \`satisfies-requirements\`.
|
|
11403
12189
|
- **Contract-First Full-Stack Integration**: Whenever a feature or change spans Frontend (UI) and Backend (API/services), define an explicit shared typed contract (Zod schemas, shared TypeScript DTOs, or OpenAPI specification) in \`design.md\` before implementation so both layers compile against a single source of truth.
|
|
11404
12190
|
- Generate interaction and sequence diagrams in native Mermaid syntax.
|
|
11405
12191
|
- Document critical technological decisions using immutable \`ADR-*\` records conforming to \`schemas/architecture/adr.schema.json\`.
|
|
11406
|
-
- Validate that architectural choices comply with legal constraints in \`license-policy.yaml\`.
|
|
11407
|
-
- **Technical Security Feedback Loop**: If architectural decisions (databases, queues, distributed caching, third-party APIs, authentication schemes) introduce new attack vectors, emit a return handoff to \`agent-threat-modeler\` for technical modeling prior to the testing phase.
|
|
11408
|
-
- If autonomy is $\\ge$ \`HUMAN_REVIEW_PLAN\`, conclude by emitting the Workflow Handoff block (\`templates/workflow/agent-handoff.template.md\`) suggesting \`agent-qa-engineer\` (or \`agent-threat-modeler\` if technical security loop is required) and opening the Human Action Window. In \`AUTONOMOUS\` mode, omit interactive handoff.`
|
|
12192
|
+
- Validate that architectural choices comply with legal constraints in \`license-policy.yaml\` and data protection constraints in \`privacy-policy.yaml\`.
|
|
12193
|
+
- **Technical Security & Privacy Feedback Loop**: If architectural decisions (databases, queues, distributed caching, third-party APIs, LLM providers, authentication schemes) introduce new attack vectors or PII data flows, emit a return handoff to \`agent-threat-modeler\` (which chains to \`agent-privacy-officer\`) for technical modeling prior to the testing phase.
|
|
12194
|
+
- If autonomy is $\\ge$ \`HUMAN_REVIEW_PLAN\`, conclude by emitting the Workflow Handoff block (\`templates/workflow/agent-handoff.template.md\`) suggesting \`agent-qa-engineer\` (or \`agent-threat-modeler\` if technical security/privacy loop is required) and opening the Human Action Window. In \`AUTONOMOUS\` mode, omit interactive handoff.`
|
|
11409
12195
|
},
|
|
11410
12196
|
{
|
|
11411
12197
|
id: "agent-qa-engineer",
|
|
11412
12198
|
title: "QA Engineer and SDET",
|
|
11413
|
-
description: "Translate approved requirements (FR-*, SEC-REQ-*, QR-*) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites before production code is written.",
|
|
12199
|
+
description: "Translate approved requirements (FR-*, SEC-REQ-*, PRIV-REQ-*, QR-*) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites before production code is written.",
|
|
11414
12200
|
globs: "tests/**, specs/changes/**/spec.md",
|
|
11415
12201
|
body: `## Role & Mission
|
|
11416
12202
|
- **Role**: QA Engineer and SDET (Software Development Engineer in Test) Agent (\`agent-qa-engineer\`).
|
|
11417
|
-
- **Mission**: Translate approved requirements (\`FR-*\`, \`SEC-REQ-*\`, \`QR-*\`) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites before \`agent-developer\` writes a single line of production code.
|
|
12203
|
+
- **Mission**: Translate approved requirements (\`FR-*\`, \`SEC-REQ-*\`, \`PRIV-REQ-*\`, \`QR-*\`) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites before \`agent-developer\` writes a single line of production code.
|
|
11418
12204
|
|
|
11419
12205
|
## Operational Directives & Guardrails
|
|
11420
12206
|
- Read exclusively requirements cited in the \`handoff.yaml\` sidecar (\`HOF-*\`) and their referenced artifacts.
|
|
@@ -11429,7 +12215,7 @@ var SPECIALIZED_AGENT_TEMPLATES = [
|
|
|
11429
12215
|
2. **Boundary Cases** (\`@boundary\` \`Scenario Outline\` + \`Examples\` table): values at the extremes of the accepted range.
|
|
11430
12216
|
3. **Out-of-Range / Invalid Cases** (\`@invalid\` \`Scenario Outline\` + \`Examples\` table): null, empty, wrong types, values exceeding bounds.
|
|
11431
12217
|
- **Use Case Variant Coverage**: Inspect every \`UC-*\` in \`handoff.yaml\` and generate BDD scenarios covering 100% of its \`alternative-flows\` and \`exception-flows\`.
|
|
11432
|
-
- Apply conditional categories when applicable: Security (\`@security @mitigation\`), Performance (\`@performance\`), Idempotency (\`@idempotence\`), Postconditions, and Interface Contracts.
|
|
12218
|
+
- Apply conditional categories when applicable: Security (\`@security @mitigation\`), Privacy (\`@privacy @gdpr\`), Performance (\`@performance\`), Idempotency (\`@idempotence\`), Postconditions, and Interface Contracts.
|
|
11433
12219
|
- **Zero-Mock Integration Rule**: When an \`FR-*\` spans UI and Backend, unit tests mocking \`fetch\`/HTTP in isolation are insufficient; include integration/contract or E2E test scenarios verifying real request/response wiring and UI state transitions (\`Loading\`, \`Empty\`, \`Error\`, \`Nominal\`).
|
|
11434
12220
|
- Tag all scenarios with \`@<FR-ID> @automated @regression\`.
|
|
11435
12221
|
- **STRICTLY FORBIDDEN**: Including production code, suggesting implementation, or anticipating technical solutions.
|
|
@@ -11458,16 +12244,16 @@ Execute every implementation task following this strict sequential order:
|
|
|
11458
12244
|
|
|
11459
12245
|
## Operational Directives & Guardrails
|
|
11460
12246
|
- Respect the autonomy mode assigned to each task in \`tasks.md\` (\`AUTONOMOUS\`, \`HUMAN_REVIEW_PLAN\`, \`AMBIGUOUS\`, \`HIGH_RISK_MANUAL\`).
|
|
11461
|
-
- **100% Design & Handoff Scope Coverage in Tasks**: Ensure every task in \`tasks.md\` declares \`implements-components\` (\`CMP-*\`), \`satisfies-requirements\` (\`FR-*\`, \`SEC-REQ-*\`), and \`implements-contracts\` so 100% of \`design.md\` and \`handoff.yaml\` is mapped and implemented.
|
|
12247
|
+
- **100% Design & Handoff Scope Coverage in Tasks**: Ensure every task in \`tasks.md\` declares \`implements-components\` (\`CMP-*\`), \`satisfies-requirements\` (\`FR-*\`, \`SEC-REQ-*\`, \`PRIV-REQ-*\`), and \`implements-contracts\` so 100% of \`design.md\` and \`handoff.yaml\` is mapped and implemented.
|
|
11462
12248
|
- Apply Test-Driven Development (TDD): make failing tests delivered by \`agent-qa-engineer\` pass green without altering tests to accommodate buggy code, and write direct unit tests in \`tests/unit/\` for every exported function and contract method declared in \`design.md\` or implemented in \`src/\`.
|
|
11463
|
-
- Cite implemented \`FR
|
|
12249
|
+
- Cite implemented \`FR-*\`, \`SEC-REQ-*\`, or \`PRIV-REQ-*\` IDs in test header comments to maintain 360\xB0 reverse traceability.
|
|
11464
12250
|
- **Zero Fake-Wiring Guardrail**: Strictly forbidden from marking a task \`COMPLETED\` with hardcoded \`mockData\` arrays in production views, \`setTimeout\` simulating network calls, or empty UI event handlers (\`onClick={() => {}}\`, \`onSubmit={() => {}}\`). Frontend components must wire directly to the shared contract and real Backend endpoints.
|
|
11465
12251
|
- **Mandatory 4 UI States Matrix**: Every data-driven UI component or screen must explicitly implement all 4 usability states: \`Loading\` (spinner/skeleton + disabled submit), \`Empty\` (clear message + CTA), \`Error\` (visible error recovery banner, never silent failure), and \`Nominal/Success\` (accessible semantic DOM + keyboard navigation).
|
|
11466
12252
|
- **Live Runtime Smoke Verification**: For tasks touching UI or UI-to-Backend integration, unit tests alone are insufficient. Before emitting handoff, boot the real Backend and Frontend servers and verify (via Playwright E2E or Chrome DevTools MCP) that browser \`console.error\` and \`pageerror\` counts are \`0\` and API calls return real \`2xx\` responses without CORS or schema mismatches.
|
|
11467
12253
|
- Before adding any external dependency, verify its SPDX license is permitted in \`license-policy.yaml\`.
|
|
11468
12254
|
- Respect non-negotiable \`quality-policy.yaml\` thresholds: Cyclomatic Complexity $\\le 10$, Cognitive Complexity $\\le 15$, Maintainability Index $\\ge 50$, Function Length $\\le 40$ lines.
|
|
11469
12255
|
- Run unified pre-flight with auto-fix (\`pnpm run check:fix\`) and full verification (\`pnpm run verify:all\`).
|
|
11470
|
-
- Upon completing green implementation, suggest handoff to \`agent-expert-user\` for Post-Development Functional Validation prior to security audit.`
|
|
12256
|
+
- Upon completing green implementation, suggest handoff to \`agent-expert-user\` for Post-Development Functional Validation prior to security and privacy audit.`
|
|
11471
12257
|
},
|
|
11472
12258
|
{
|
|
11473
12259
|
id: "agent-security-auditor",
|
|
@@ -11514,7 +12300,7 @@ Execute every implementation task following this strict sequential order:
|
|
|
11514
12300
|
1. **Design Mode (Upstream)**: Adopt the primary actor persona under real-world field conditions (stress, latency, constrained viewports). Separate strict Minimum Viable Product (MVP) core from future roadmap ideas using \`templates/product/user-design-feedback.template.md\`.
|
|
11515
12301
|
2. **Functional Validation Mode (Downstream / Pre-PR / Post-Development Functional Validation)**: Inspect \`agent-developer\` deliverables once unit tests pass green by executing the real application (via Playwright or Chrome DevTools MCP when UI is present). Contrast actual UI, CLI, and API behavior against approved \`UC-*\` and \`FR-*\` criteria, verifying real Backend connectivity, the 4 UI usability states (\`Loading\`, \`Empty\`, \`Error\`, \`Nominal\`), keyboard/ARIA accessibility, and \`0\` browser \`console.error\` / network failures.
|
|
11516
12302
|
- Formulate decisive questions under \`open-questions\` for the human Product Owner.
|
|
11517
|
-
- Emit handoff block suggesting the Pre-Merge Audit Triad (\`agent-code-reviewer\`, \`agent-security-auditor\`, \`agent-compliance-checker\`) if compliant, or return to \`agent-developer\` on functional drift or fake-wiring.`
|
|
12303
|
+
- Emit handoff block suggesting the Pre-Merge Audit Triad (\`agent-code-reviewer\`, \`agent-security-auditor\`, \`agent-privacy-officer\`, \`agent-compliance-checker\`) if compliant, or return to \`agent-developer\` on functional drift or fake-wiring.`
|
|
11518
12304
|
},
|
|
11519
12305
|
{
|
|
11520
12306
|
id: "agent-code-reviewer",
|
|
@@ -11530,7 +12316,7 @@ Execute every implementation task following this strict sequential order:
|
|
|
11530
12316
|
- Detect improper coupling, code smells, magic numbers, ambiguous identifiers, and encapsulation breaches.
|
|
11531
12317
|
- Flag premature abstractions and speculative code violating YAGNI.
|
|
11532
12318
|
- **Block Fake-Wiring & Disconnected UI**: Flag as \`[BLOCKING]\` any production UI component containing hardcoded mock data (\`mockData\`), empty event handlers (\`onClick={() => {}}\`), missing error/loading state handling, or API calls bypassing shared contracts.
|
|
11533
|
-
- Coordinate Pre-Merge Audit Triad with \`agent-security-auditor\` and \`agent-compliance-checker\`.
|
|
12319
|
+
- Coordinate Pre-Merge Audit Triad with \`agent-security-auditor\`, \`agent-privacy-officer\`, and \`agent-compliance-checker\`.
|
|
11534
12320
|
- Categorize findings into: \`[BLOCKING]\` (quality violation or broken pattern), \`[CLEAN_CODE_SUGGESTION]\` (non-blocking improvement), and \`[COMPLIANT]\`.
|
|
11535
12321
|
- If autonomy is $\\ge$ \`HUMAN_REVIEW_PLAN\`, conclude by emitting the Workflow Handoff block (\`templates/workflow/agent-handoff.template.md\`) to the human Tech Lead for final approval and merge, opening the Human Action Window. In \`AUTONOMOUS\` mode, omit interactive handoff.`
|
|
11536
12322
|
},
|
|
@@ -11610,16 +12396,16 @@ var LIFECYCLE_SKILL_TEMPLATES = [
|
|
|
11610
12396
|
id: "aisdlc-greenfield",
|
|
11611
12397
|
title: "Greenfield Project Inception & Delivery Playbook",
|
|
11612
12398
|
description: "Orchestrate end-to-end AI-SDLC onboarding and Phase 0 Inception for brand-new (Greenfield) projects, from repository initialization (aisdlc init) and NAF v4 Vision (ARCH-INTRO-*) through ProductShape, STRIDE Threat Modeling, arc42 Architecture, and initial SDD increment delivery.",
|
|
11613
|
-
references: "[`process/02_product_definition.md`](../../process/02_product_definition.md), [`process/05_architecture_arc42_nafv4.md`](../../process/05_architecture_arc42_nafv4.md), [`process/06_spec_driven_development.md`](../../process/06_spec_driven_development.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
|
|
12399
|
+
references: "[`process/02_product_definition.md`](../../process/02_product_definition.md), [`process/04b_data_protection_and_privacy.md`](../../process/04b_data_protection_and_privacy.md), [`process/05_architecture_arc42_nafv4.md`](../../process/05_architecture_arc42_nafv4.md), [`process/06_spec_driven_development.md`](../../process/06_spec_driven_development.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
|
|
11614
12400
|
body: `## Purpose & Trigger
|
|
11615
|
-
Use this skill when starting a **brand-new software project from scratch (Greenfield)** or when \`specs/product/\` has no canonical baseline yet. It coordinates the sequential execution of AI-SDLC MCP/CLI tools and specialized role agents so no code is written before product vision, security enclaves, and architecture contracts exist.
|
|
12401
|
+
Use this skill when starting a **brand-new software project from scratch (Greenfield)** or when \`specs/product/\` has no canonical baseline yet. It coordinates the sequential execution of AI-SDLC MCP/CLI tools and specialized role agents so no code is written before product vision, security enclaves, privacy-by-design controls, and architecture contracts exist.
|
|
11616
12402
|
|
|
11617
12403
|
## End-to-End Execution Playbook
|
|
11618
12404
|
|
|
11619
12405
|
### Step 1: Repository Turnkey Initialization
|
|
11620
12406
|
1. If the workspace has not been initialized with AI-SDLC schemas, policies, and templates, run MCP tool \`new\` (or CLI \`npx @aisdlc/cli init\`).
|
|
11621
12407
|
2. Install the Git telemetry hook via \`npx aisdlc git hook install\` (\`pnpm run git:hook:install\`).
|
|
11622
|
-
3. Verify \`quality-policy.yaml\` and \`
|
|
12408
|
+
3. Verify \`quality-policy.yaml\`, \`license-policy.yaml\`, and \`privacy-policy.yaml\` are present in the repository root.
|
|
11623
12409
|
|
|
11624
12410
|
### Step 2: Phase 0 Product Inception (\`agent-product-analyst\`)
|
|
11625
12411
|
1. Delegate to or adopt [\`agent-product-analyst\`](../agent-product-analyst/SKILL.md).
|
|
@@ -11634,19 +12420,21 @@ Use this skill when starting a **brand-new software project from scratch (Greenf
|
|
|
11634
12420
|
5. Validate schemas and duplicates via MCP tools \`verify_schemas\` and \`verify_duplicates\` (or \`npx aisdlc check --fix\`).
|
|
11635
12421
|
6. **Mandatory Upstream UX & MVP Boundary Gate (\`agent-expert-user\`)**: Invoke [\`agent-expert-user\`](../agent-expert-user/SKILL.md) in **Design Mode** to stress-test the proposed workflows, enforce strict MVP boundaries, and separate core MVP \`UC-*\` from future roadmap backlog (\`templates/product/user-design-feedback.template.md\`).
|
|
11636
12422
|
|
|
11637
|
-
### Step 3: Shift-Left Cybersecurity &
|
|
12423
|
+
### Step 3: Shift-Left Cybersecurity & Privacy-by-Design (\`agent-threat-modeler\` \u2794 \`agent-privacy-officer\`)
|
|
11638
12424
|
1. Delegate to or adopt [\`agent-threat-modeler\`](../agent-threat-modeler/SKILL.md).
|
|
11639
12425
|
2. Analyze every \`UC-*\` and \`FR-*\` using STRIDE and OWASP ASVS to create in \`specs/security/\`:
|
|
11640
12426
|
- Threat Actors (\`ACT-THREAT-*\`)
|
|
11641
12427
|
- Abuse Cases (\`ABUSE-*\` targeting \`UC-*\`)
|
|
11642
12428
|
- Security Requirements (\`SEC-REQ-*\` with \`@security @mitigation\` negative Gherkin scenarios and \`SEC-ENC-*\` Zero Trust enclave bindings).
|
|
11643
|
-
3.
|
|
12429
|
+
3. Hand off to [\`agent-privacy-officer\`](../agent-privacy-officer/SKILL.md) to apply LINDDUN and GDPR/LOPDGDD/ISO 27701 in \`specs/privacy/\`:
|
|
12430
|
+
- Personal Data Assets (\`DATA-ASSET-*\`), GDPR Art. 30 Records of Processing (\`PRIV-ROPA-*\`), and Privacy Requirements (\`PRIV-REQ-*\` with \`@privacy @gdpr\` Gherkin scenarios).
|
|
12431
|
+
4. Run \`verify_schemas\` and \`verify_privacy\` (\`npx aisdlc verify privacy\`).
|
|
11644
12432
|
|
|
11645
12433
|
### Step 4: Modular Systems Architecture (\`agent-system-architect\`)
|
|
11646
12434
|
1. Delegate to or adopt [\`agent-system-architect\`](../agent-system-architect/SKILL.md).
|
|
11647
|
-
2. Define building blocks (\`CMP-*\`) and Architectural Decision Records (\`ADR-*\`) in \`specs/architecture/\` using \`templates/architecture/\`, ensuring every \`CMP-*\` cites \`implements-use-cases\` (\`UC-*\`) and \`satisfies-requirements\` (\`FR-*\`, \`QR-*\`, \`SEC-REQ-*\`).
|
|
11648
|
-
3. Inspect third-party stack choices against \`license-policy.yaml\` via \`verify_licenses\`.
|
|
11649
|
-
4. **Technical Security Feedback Loop**: If new infrastructure, persistence, or auth decisions introduce attack vectors, return to \`agent-threat-modeler\` to add technical \`SEC-REQ-*\` mitigations before coding.
|
|
12435
|
+
2. Define building blocks (\`CMP-*\`) and Architectural Decision Records (\`ADR-*\`) in \`specs/architecture/\` using \`templates/architecture/\`, ensuring every \`CMP-*\` cites \`implements-use-cases\` (\`UC-*\`) and \`satisfies-requirements\` (\`FR-*\`, \`QR-*\`, \`SEC-REQ-*\`, \`PRIV-REQ-*\`).
|
|
12436
|
+
3. Inspect third-party stack choices against \`license-policy.yaml\` via \`verify_licenses\` and subprocessors against \`privacy-policy.yaml\` via \`verify_privacy\`.
|
|
12437
|
+
4. **Technical Security & Privacy Feedback Loop**: If new infrastructure, persistence, LLM, or auth decisions introduce attack vectors or PII flows, return to \`agent-threat-modeler\` \u2794 \`agent-privacy-officer\` to add technical \`SEC-REQ-*\` and \`PRIV-REQ-*\` mitigations before coding.
|
|
11650
12438
|
|
|
11651
12439
|
### Step 5: Release Milestone & Topological Wave SDD Plan (\`1 UC-* = 1 CHG-*\`)
|
|
11652
12440
|
1. **Open Release Milestone (\`Tier 2: release/v1.0.0\`)**: Group the approved MVP Use Cases (\`UC-001\`, \`UC-002\`, ...) under the initial release milestone (\`release/v1.0.0\`) and visualize the branch hierarchy via \`npx aisdlc git plan\`.
|
|
@@ -11665,29 +12453,30 @@ Use this skill when starting a **brand-new software project from scratch (Greenf
|
|
|
11665
12453
|
id: "aisdlc-legacy-onboarding",
|
|
11666
12454
|
title: "Legacy / Brownfield Retro-Inception Playbook",
|
|
11667
12455
|
description: "Orchestrate progressive AI-SDLC adoption and Brownfield retro-inception on existing or legacy repositories without breaking production code, reverse-engineering architecture (ARCH-INTRO-*, CMP-*) and establishing baseline quality, security, and license audits before new SDD increments.",
|
|
11668
|
-
references: "[`process/02_product_definition.md`](../../process/02_product_definition.md), [`process/04_open_source_license_compliance.md`](../../process/04_open_source_license_compliance.md), [`process/05_architecture_arc42_nafv4.md`](../../process/05_architecture_arc42_nafv4.md), [`process/10_quality_management_and_release_gates.md`](../../process/10_quality_management_and_release_gates.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
|
|
12456
|
+
references: "[`process/02_product_definition.md`](../../process/02_product_definition.md), [`process/04_open_source_license_compliance.md`](../../process/04_open_source_license_compliance.md), [`process/04b_data_protection_and_privacy.md`](../../process/04b_data_protection_and_privacy.md), [`process/05_architecture_arc42_nafv4.md`](../../process/05_architecture_arc42_nafv4.md), [`process/10_quality_management_and_release_gates.md`](../../process/10_quality_management_and_release_gates.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
|
|
11669
12457
|
body: `## Purpose & Trigger
|
|
11670
|
-
Use this skill when **adopting AI-SDLC in an existing or legacy codebase (Brownfield)** that already has production source code (\`src/\`, \`packages/\`, etc.) but lacks canonical PDaC specifications, arc42 architecture views, or deterministic quality/license gates.
|
|
12458
|
+
Use this skill when **adopting AI-SDLC in an existing or legacy codebase (Brownfield)** that already has production source code (\`src/\`, \`packages/\`, etc.) but lacks canonical PDaC specifications, arc42 architecture views, or deterministic quality/license/privacy gates.
|
|
11671
12459
|
|
|
11672
12460
|
## End-to-End Execution Playbook
|
|
11673
12461
|
|
|
11674
12462
|
### Step 1: Non-Destructive Framework Scaffolding
|
|
11675
12463
|
1. Run MCP tool \`new\` (or CLI \`npx @aisdlc/cli init\`) on the existing repository.
|
|
11676
|
-
- AI-SDLC enforces strict **no-clobber protection**: existing \`package.json\`, \`CLAUDE.md\`, or CI pipelines are preserved while injecting missing schemas (\`schemas/\`), templates (\`templates/\`), policies (\`quality-policy.yaml\`, \`license-policy.yaml\`), and MCP configs.
|
|
12464
|
+
- AI-SDLC enforces strict **no-clobber protection**: existing \`package.json\`, \`CLAUDE.md\`, or CI pipelines are preserved while injecting missing schemas (\`schemas/\`), templates (\`templates/\`), policies (\`quality-policy.yaml\`, \`license-policy.yaml\`, \`privacy-policy.yaml\`), and MCP configs.
|
|
11677
12465
|
2. Install the Git commit trailer hook via \`npx aisdlc git hook install\`.
|
|
11678
12466
|
|
|
11679
12467
|
### Step 2: Baseline Diagnostic Audit (Read-Only Assessment)
|
|
11680
|
-
Before modifying any code or creating SDD changes, run diagnostic verifiers to quantify existing technical, legal, and security debt:
|
|
12468
|
+
Before modifying any code or creating SDD changes, run diagnostic verifiers to quantify existing technical, legal, privacy, and security debt:
|
|
11681
12469
|
1. **License & Dependency Audit (\`agent-compliance-checker\`)**: Run MCP tool \`verify_licenses\` (\`npx aisdlc verify licenses\`). Identify any viral (\`GPL\`/\`AGPL\`) or commercial (\`BSL\`/\`SSPL\`) dependencies already present in the lockfile and document exceptions or remediation plans.
|
|
11682
12470
|
2. **Shift-Left Security Scan (\`agent-security-auditor\`)**: Run MCP tool \`verify_security\` (\`npx aisdlc verify security\`) to detect hardcoded secrets (Gate 11) or OWASP SAST vulnerabilities in legacy files.
|
|
11683
|
-
3. **
|
|
12471
|
+
3. **Privacy & PII Scan (\`agent-privacy-officer\`)**: Run MCP tool \`verify_privacy\` (\`npx aisdlc verify privacy\`) to detect PII in logs/telemetry or hardcoded real PII in legacy tests/seeds.
|
|
12472
|
+
4. **AST Code Quality Baseline (\`agent-code-reviewer\`)**: Run MCP tool \`report_quality\` (\`npx aisdlc report quality\`) to generate \`reports/QUALITY_REPORT.md\` and identify legacy hotspots exceeding Cyclomatic Complexity ($\\le 10$), Cognitive Complexity ($\\le 15$), or Maintainability Index ($\\ge 50$).
|
|
11684
12473
|
|
|
11685
12474
|
### Step 3: Brownfield Retro-Inception (\`agent-system-architect\` & \`agent-product-analyst\`)
|
|
11686
12475
|
Instead of attempting to document 100% of a legacy monolith upfront, apply **bounded retro-inception** focused on the system boundary and the domain areas under active evolution:
|
|
11687
12476
|
1. **System Vision & Context (\`ARCH-INTRO-001\`)**: Use [\`agent-product-analyst\`](../agent-product-analyst/SKILL.md) to document the current system's mission, primary actors (\`ACT-*\`), and top quality goals (\`QR-*\`) in \`specs/architecture/ARCH-INTRO-001.md\`.
|
|
11688
12477
|
2. **As-Is Component Mapping (\`CMP-*\` & \`ADR-*\`)**: Use [\`agent-system-architect\`](../agent-system-architect/SKILL.md) to map existing core modules/services into \`specs/architecture/CMP-*.md\` and capture historical architectural constraints (\`CON-*\`, \`ADR-*\`).
|
|
11689
12478
|
3. **Core Use Cases Extraction (\`UC-*\`, \`FR-*\`)**: Extract canonical \`UC-*\` and \`FR-*\` artifacts in \`specs/product/\` for the specific bounded context or module that will be modified or extended next, including Gherkin acceptance scenarios reflecting current expected behavior (characterization specs).
|
|
11690
|
-
4. **Threat &
|
|
12479
|
+
4. **Threat & Privacy Boundary Mapping (\`agent-threat-modeler\` \u2794 \`agent-privacy-officer\`)**: Map existing trust zones (\`SEC-ENC-*\`), active threat vectors (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`), and personal data inventories (\`DATA-ASSET-*\`, \`PRIV-ROPA-*\`, \`PRIV-REQ-*\`) on the target module.
|
|
11691
12480
|
|
|
11692
12481
|
### Step 4: Characterization Testing & Synchronization
|
|
11693
12482
|
1. Run MCP tool \`sdd_check_fix\` (\`npx aisdlc check --fix\`) to extract \`.feature\` files and compute canonical SHA-256 digests.
|
|
@@ -11707,16 +12496,17 @@ Once the target domain's baseline artifacts (\`ARCH-INTRO-*\`, \`UC-*\`, \`FR-*\
|
|
|
11707
12496
|
description: "Orchestrate the complete Spec-Driven Development (SDD) lifecycle for bounded feature increments, enhancements, and bugfixes (CHG-* / TSK-*), from upstream requirement derivation and 4-tier Git branching through Red-Green-Refactor TDD, Pre-Merge Audit Triad, all 11 Quality Gates, and canonical baseline integration.",
|
|
11708
12497
|
references: "[`process/06_spec_driven_development.md`](../../process/06_spec_driven_development.md), [`process/08_citation_contract_and_drift.md`](../../process/08_citation_contract_and_drift.md), [`process/10_quality_management_and_release_gates.md`](../../process/10_quality_management_and_release_gates.md), [`process/11_git_branching_and_lifecycle.md`](../../process/11_git_branching_and_lifecycle.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
|
|
11709
12498
|
body: `## Purpose & Trigger
|
|
11710
|
-
Use this skill for **every evolutionary increment (new feature, enhancement, refactoring, or bugfix)** on a project that already has an AI-SDLC baseline. It enforces strict 360\xB0 traceability from upstream ProductShape (\`UC-*\`, \`FR-*\`) through SDD (\`CHG-*\`, \`HOF-*\`, \`TSK-*\`), TDD implementation, the
|
|
12499
|
+
Use this skill for **every evolutionary increment (new feature, enhancement, refactoring, or bugfix)** on a project that already has an AI-SDLC baseline. It enforces strict 360\xB0 traceability from upstream ProductShape (\`UC-*\`, \`FR-*\`) through SDD (\`CHG-*\`, \`HOF-*\`, \`TSK-*\`), TDD implementation, the 12 Quality Gates, and baseline promotion.
|
|
11711
12500
|
|
|
11712
12501
|
## End-to-End Execution Playbook
|
|
11713
12502
|
|
|
11714
|
-
### Step 1: Upstream Product &
|
|
12503
|
+
### Step 1: Upstream Product, Security & Privacy Delta (\`agent-product-analyst\`, \`agent-threat-modeler\` & \`agent-privacy-officer\`)
|
|
11715
12504
|
1. Inspect active changes via MCP tool \`get_active_handoff\` and verify whether the target Use Case (\`UC-*\`) or Requirement (\`FR-*\`) already exists in \`specs/product/\`.
|
|
11716
12505
|
2. If the increment introduces new behavior or modifies business rules:
|
|
11717
12506
|
- Use [\`agent-product-analyst\`](../agent-product-analyst/SKILL.md) to create or update the \`UC-*\`, \`BR-*\`, and \`FR-*\` (with \`@nominal\`, \`@boundary\`, \`@invalid\` Gherkin scenarios).
|
|
11718
12507
|
- Run MCP tool \`verify_duplicates\` (\`npx aisdlc verify duplicates\`) to block lexical or functional collisions early.
|
|
11719
12508
|
- Use [\`agent-threat-modeler\`](../agent-threat-modeler/SKILL.md) to model any new \`ABUSE-*\` and \`SEC-REQ-*\` mitigations.
|
|
12509
|
+
- Hand off to [\`agent-privacy-officer\`](../agent-privacy-officer/SKILL.md) to model any personal data assets (\`DATA-ASSET-*\`), GDPR Art. 30 processing activities (\`PRIV-ROPA-*\`), and privacy requirements (\`PRIV-REQ-*\`).
|
|
11720
12510
|
3. Run \`sdd_check_fix\` (\`npx aisdlc check --fix\`) to sync Gherkin \`.feature\` files and validate schemas.
|
|
11721
12511
|
|
|
11722
12512
|
### Step 2: SDD Change Scaffolding & Architectural Design (\`agent-system-architect\`)
|
|
@@ -11743,7 +12533,7 @@ Use this skill for **every evolutionary increment (new feature, enhancement, ref
|
|
|
11743
12533
|
1. Delegate to or adopt [\`agent-developer\`](../agent-developer/SKILL.md).
|
|
11744
12534
|
2. Execute the **Mandatory 4-Step Implementation Order**:
|
|
11745
12535
|
- (1) Clean Architecture boundaries, (2) Inter-module interfaces first, (3) Concrete component implementation (zero fake-wiring; all 4 UI states \`Loading\`, \`Empty\`, \`Error\`, \`Nominal\`), (4) Exhaustive per-function unit tests in \`tests/unit/\` (Happy Path, Sad Path, Boundary, Null/Empty).
|
|
11746
|
-
3. Verify any new dependency against \`license-policy.yaml\` via \`verify_licenses\`.
|
|
12536
|
+
3. Verify any new dependency against \`license-policy.yaml\` via \`verify_licenses\` and PII handling against \`privacy-policy.yaml\` via \`verify_privacy\`.
|
|
11747
12537
|
4. Run \`sdd_check_fix\` (\`npx aisdlc check --fix\`) and \`verify_quality\` (\`npx aisdlc verify quality\`) until Cyclomatic Complexity $\\le 10$, Cognitive $\\le 15$, Maintainability $\\ge 50$, and Function Length $\\le 40$ lines pass with zero violations.
|
|
11748
12538
|
|
|
11749
12539
|
### Step 6: Post-Development Functional Validation & Pre-Merge Audit Triad
|
|
@@ -11751,11 +12541,12 @@ Use this skill for **every evolutionary increment (new feature, enhancement, ref
|
|
|
11751
12541
|
2. **Pre-Merge Audit Triad**: Execute concurrent review across:
|
|
11752
12542
|
- [\`agent-code-reviewer\`](../agent-code-reviewer/SKILL.md) (SOLID, DRY, YAGNI, AST thresholds, zero fake-wiring)
|
|
11753
12543
|
- [\`agent-security-auditor\`](../agent-security-auditor/SKILL.md) (\`verify_security\`: Gitleaks secrets + OWASP SAST)
|
|
12544
|
+
- [\`agent-privacy-officer\`](../agent-privacy-officer/SKILL.md) (\`verify_privacy\`: GDPR/LOPDGDD ROPA + PII-SAST)
|
|
11754
12545
|
- [\`agent-compliance-checker\`](../agent-compliance-checker/SKILL.md) (\`verify_licenses\`: SPDX & SBOM compliance)
|
|
11755
|
-
3. **Consolidated Release Gate**: Run MCP tool \`verify\` (\`npx aisdlc verify all\`) and confirm all **
|
|
12546
|
+
3. **Consolidated Release Gate**: Run MCP tool \`verify\` (\`npx aisdlc verify all\`) and confirm all **12 Quality Gates** pass green.
|
|
11756
12547
|
|
|
11757
12548
|
### Step 7: Human PR Sign-Off, Baseline Integration & Release Closure
|
|
11758
|
-
1. **Feature Merge (\`feat/CHG-*\` \u2794 \`release/vX.Y.Z\`)**: Present the PR, KPI summary (\`kpi_pr\`), and autogenerated reports (\`reports/QUALITY_REPORT.md\`, \`reports/TRACEABILITY_MATRIX.md\`) to the human Tech Lead for review and approval (never auto-approve or auto-merge).
|
|
12549
|
+
1. **Feature Merge (\`feat/CHG-*\` \u2794 \`release/vX.Y.Z\`)**: Present the PR, KPI summary (\`kpi_pr\`), and autogenerated reports (\`reports/QUALITY_REPORT.md\`, \`reports/TRACEABILITY_MATRIX.md\`, \`reports/ROPA_INVENTORY.md\`) to the human Tech Lead for review and approval (never auto-approve or auto-merge).
|
|
11759
12550
|
2. **Canonical Baseline Promotion**: Once tasks in \`tasks.md\` are marked \`COMPLETED\` and approved, promote the change into the canonical baseline via MCP tool \`sdd_integrate\` (\`npx aisdlc sdd integrate --auto\`), which promotes \`FR-*\` to \`active\`, links \`CMP-*\`, and archives the change under \`specs/changes/completed/\`.
|
|
11760
12551
|
3. **Release Milestone Closure (\`release/vX.Y.Z\` \u2794 \`main\`)**: When all \`CHG-*\` increments planned for \`release/vX.Y.Z\` are integrated:
|
|
11761
12552
|
- Run full verification (\`verify\`), generate CycloneDX SBOM & legal notices (\`npx aisdlc verify licenses --sbom reports/sbom.cdx.json --notices THIRD_PARTY_NOTICES.md\`), compute release telemetry (\`kpi_release\` / \`npx aisdlc kpi release --release release/vX.Y.Z\`), and refresh the interactive dashboard (\`report_dashboard\`).
|
|
@@ -11763,7 +12554,7 @@ Use this skill for **every evolutionary increment (new feature, enhancement, ref
|
|
|
11763
12554
|
|
|
11764
12555
|
## Non-Negotiable Guardrails
|
|
11765
12556
|
- **Single-Use-Case Scope (\`1 UC-* = 1 CHG-*\`)**: Each SDD change (\`CHG-*\`) must deliver at most 1 Use Case (\`UC-*\`). Bundling multiple \`UC-*\` into one \`handoff.yaml\` is blocked by \`verify_governance\` (\`Greenfield monolith detected\`). Scale throughput via parallel \`CHG-*\` branches/worktrees, not monolithic changes.
|
|
11766
|
-
- **100% Design & Handoff Coverage in \`tasks.md\`**: Every \`CMP-*\`, \`FR-*\`, and \`
|
|
12557
|
+
- **100% Design & Handoff Coverage in \`tasks.md\`**: Every \`CMP-*\`, \`FR-*\`, \`SEC-REQ-*\`, and \`PRIV-REQ-*\` declared in \`design.md\` and \`handoff.yaml\` must be explicitly assigned to at least one \`TSK-*\` in \`tasks.md\`.`
|
|
11767
12558
|
}
|
|
11768
12559
|
];
|
|
11769
12560
|
function renderAntigravitySkillFile(skill) {
|
|
@@ -11793,7 +12584,7 @@ This file defines the operational rules and specialized role mappings for Google
|
|
|
11793
12584
|
1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: No agent may auto-approve PRs or perform direct merges to protected branches (\`main\`, \`release/*\`). Only a human engineer may approve or merge.
|
|
11794
12585
|
2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguous requirements, formulate clarifying questions (\`open-questions\`). Never assume unspecified intentions.
|
|
11795
12586
|
3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always consult \`license-policy.yaml\`. Dependencies with viral licenses (\`GPL\`/\`AGPL\`) or commercial paid licenses (\`BSL\`/\`SSPL\`) are strictly forbidden without authorization.
|
|
11796
|
-
4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, sanitize data, and add mitigation tests (\`SEC-TEST
|
|
12587
|
+
4. **FORBIDDEN TO IGNORE CYBERSECURITY & PRIVACY (SECURITY-BY-DEFAULT & PRIVACY-BY-DEFAULT)**: Validate inputs, sanitize data, protect PII according to \`privacy-policy.yaml\`, and add mitigation tests (\`SEC-TEST-*\`, \`@privacy\`). Disabling linters or suppressing typing errors is prohibited.
|
|
11797
12588
|
5. **MANDATORY CRYPTOGRAPHIC CITATION**: Every derived artifact must cite upstream artifacts using canonical identifiers and their Unix LF-normalized SHA-256 cryptographic hashes.
|
|
11798
12589
|
|
|
11799
12590
|
---
|
|
@@ -11814,23 +12605,31 @@ This file defines the operational rules and specialized role mappings for Google
|
|
|
11814
12605
|
### 2. \`agent-threat-modeler\` (Threat Modeler and Security Specialist)
|
|
11815
12606
|
- **Mission**: Analyze use cases and proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigations, both at product level and in the technical security feedback loop over architecture.
|
|
11816
12607
|
- **Input**: Use cases \`UC-*\`, functional requirements \`FR-*\`, or architecture components (\`CMP-*\`, Mermaid diagrams, ADRs).
|
|
11817
|
-
- **Output**: Cybersecurity triad (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`) compliant with \`schemas/security
|
|
12608
|
+
- **Output**: Cybersecurity triad (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`) compliant with \`schemas/security/\`, followed by handoff to \`agent-privacy-officer\`.
|
|
11818
12609
|
- **Guardrails**:
|
|
11819
12610
|
- \`status\` always starts in \`draft\`.
|
|
11820
12611
|
- Negative BDD attack and rejection scenarios tagged with \`@security @mitigation\`.
|
|
11821
12612
|
- Assignment of Zero Trust enclaves \`SEC-ENC-*\`.
|
|
11822
12613
|
|
|
11823
|
-
### 3. \`agent-
|
|
12614
|
+
### 3. \`agent-privacy-officer\` (Data Protection & Privacy-by-Design Specialist)
|
|
12615
|
+
- **Mission**: Receive handoff from \`agent-threat-modeler\` to model personal data assets (\`DATA-ASSET-*\`), GDPR Art. 30 processing activities (\`PRIV-ROPA-*\`), and LINDDUN / GDPR / ISO 27701 privacy requirements (\`PRIV-REQ-*\`), and audit PR diffs against \`privacy-policy.yaml\`.
|
|
12616
|
+
- **Output**: Privacy triad (\`DATA-ASSET-*\`, \`PRIV-ROPA-*\`, \`PRIV-REQ-*\`) in \`specs/privacy/\` compliant with \`schemas/privacy/\`, and \`DPIA-*\` requests when Art. 9 sensitive data is detected.
|
|
12617
|
+
- **Guardrails**:
|
|
12618
|
+
- \`status\` always starts in \`draft\`.
|
|
12619
|
+
- Every \`PRIV-REQ-*\` includes Gherkin scenarios tagged with \`@<PRIV-REQ-ID> @privacy @gdpr @automated @regression\`.
|
|
12620
|
+
- Run \`pnpm run verify:privacy\` to block PII in logs/prompts and enforce ROPA & retention/erasure policies.
|
|
12621
|
+
|
|
12622
|
+
### 4. \`agent-system-architect\` (System Architect)
|
|
11824
12623
|
- **Mission**: Translate the approved product definition into a modular technical architecture based on arc42 enriched with NAF v4.
|
|
11825
12624
|
- **Output**: Architecture components (\`CMP-*\`), Mermaid diagrams, and immutable \`ADR-*\` records compliant with \`schemas/architecture/\`.
|
|
11826
12625
|
- **Guardrails**:
|
|
11827
|
-
- Every \`CMP-*\` must declare \`satisfies-requirements\` linking \`FR-*\`, \`QR-*\`, and \`
|
|
11828
|
-
- Emit a return handoff to \`agent-threat-modeler\` in the technical security feedback loop when infrastructure or persistence decisions introduce new attack vectors.
|
|
12626
|
+
- Every \`CMP-*\` must declare \`satisfies-requirements\` linking \`FR-*\`, \`QR-*\`, \`SEC-REQ-*\`, and \`PRIV-REQ-*\`.
|
|
12627
|
+
- Emit a return handoff to \`agent-threat-modeler\` (chaining to \`agent-privacy-officer\`) in the technical security/privacy feedback loop when infrastructure or persistence decisions introduce new attack vectors or PII flows.
|
|
11829
12628
|
|
|
11830
|
-
###
|
|
11831
|
-
- **Mission**: Translate approved requirements (\`FR-*\`, \`SEC-REQ-*\`, \`QR-*\`) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites, before \`agent-developer\` writes production code.
|
|
12629
|
+
### 5. \`agent-qa-engineer\` (QA Engineer and SDET)
|
|
12630
|
+
- **Mission**: Translate approved requirements (\`FR-*\`, \`SEC-REQ-*\`, \`PRIV-REQ-*\`, \`QR-*\`) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites, before \`agent-developer\` writes production code.
|
|
11832
12631
|
- **Input**: Approved requirements from the \`handoff.yaml\` sidecar (\`HOF-*\`).
|
|
11833
|
-
- **Output**: Failing Gherkin, E2E, and UI test suites covering: nominal case, boundary cases, out-of-range cases, per-interactive-element tests (Happy Path, Sad Path, Boundary Values), and conditional categories (security, performance, idempotency, postconditions, interface contract).
|
|
12632
|
+
- **Output**: Failing Gherkin, E2E, and UI test suites covering: nominal case, boundary cases, out-of-range cases, per-interactive-element tests (Happy Path, Sad Path, Boundary Values), and conditional categories (security, privacy, performance, idempotency, postconditions, interface contract).
|
|
11834
12633
|
- **Guardrails**:
|
|
11835
12634
|
- FORBIDDEN to include production code or anticipate implementations.
|
|
11836
12635
|
- **Agreed Project Technology**: Always use the testing frameworks, E2E/UI runners, and technology stack agreed upon for the project (if any), without requiring the user to specify it in the prompt.
|
|
@@ -11840,7 +12639,7 @@ This file defines the operational rules and specialized role mappings for Google
|
|
|
11840
12639
|
- Mandatory tags: \`@<FR-ID> @automated @regression\`.
|
|
11841
12640
|
- Run \`pnpm run verify:testing\` before emitting handoff.
|
|
11842
12641
|
|
|
11843
|
-
###
|
|
12642
|
+
### 6. \`agent-developer\` (Software Developer)
|
|
11844
12643
|
- **Mission**: Implement atomic tasks from SDD specifications (\`tasks.md\`) with clean, strictly typed code and thorough tests.
|
|
11845
12644
|
- **Directives**:
|
|
11846
12645
|
- **Mandatory 4-Step Implementation Order**: (1) Define/refine Clean Architecture layers & boundaries, (2) Define interfaces/ports for all inter-module interactions to avoid direct module coupling, (3) Implement components consuming/fulfilling those interfaces, (4) Write unit tests for every function covering Happy Path, Sad Path, Boundary Values, and Unexpected/Null/Empty values.
|
|
@@ -11848,36 +12647,36 @@ This file defines the operational rules and specialized role mappings for Google
|
|
|
11848
12647
|
- Make tests delivered by \`agent-qa-engineer\` pass green without altering them to accommodate code.
|
|
11849
12648
|
- Respect \`quality-policy.yaml\` thresholds: CC $\\le 10$, Cognitive $\\le 15$, MI $\\ge 50$, LOC $\\le 40$.
|
|
11850
12649
|
- Run pre-flight with auto-fix: \`pnpm run check:fix\` and full verification: \`pnpm run verify:all\`.
|
|
11851
|
-
- Upon completing green implementation, suggest handoff to \`agent-expert-user\` for post-development functional validation prior to security audit.
|
|
12650
|
+
- Upon completing green implementation, suggest handoff to \`agent-expert-user\` for post-development functional validation prior to security and privacy audit.
|
|
11852
12651
|
|
|
11853
|
-
###
|
|
12652
|
+
### 7. \`agent-security-auditor\` (Adversarial Code Auditor)
|
|
11854
12653
|
- **Mission**: Rigorously examine Pull Requests for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.
|
|
11855
12654
|
- **Directives**:
|
|
11856
12655
|
- Analyze code diffs with an attacker mindset and run \`pnpm run verify:security\`.
|
|
11857
12656
|
- Issue findings with CVSS v3.1 severity scoring and block any PR introducing CRITICAL or HIGH security risks.
|
|
11858
12657
|
|
|
11859
|
-
###
|
|
12658
|
+
### 8. \`agent-compliance-checker\` (Open Source License Compliance Auditor)
|
|
11860
12659
|
- **Mission**: Audit dependency manifests and ensure every direct and transitive third-party package complies with \`license-policy.yaml\` as part of the Pre-Merge Audit Triad.
|
|
11861
12660
|
- **Directives**:
|
|
11862
12661
|
- Verify SPDX identifiers via \`pnpm run verify:licenses\`, immediately blocking viral (\`GPL\`, \`AGPL\`) or unapproved commercial (\`BSL\`, \`SSPL\`) licenses.
|
|
11863
12662
|
|
|
11864
|
-
###
|
|
12663
|
+
### 9. \`agent-expert-user\` (Expert User and Domain Evaluator)
|
|
11865
12664
|
- **Mission**: Contrast design and specifications (design phase) and functionally validate finished software against \`UC-*\` and \`FR-*\` (post-development phase).
|
|
11866
12665
|
- **Directives**:
|
|
11867
12666
|
- Design mode (upstream): Adopt the primary actor's profile under stressful field conditions, applying bimodal discrimination (strict MVP core vs. roadmap suggestion backlog in \`templates/product/user-design-feedback.template.md\`).
|
|
11868
12667
|
- Functional validation mode (downstream / pre-PR / post-development functional validation): Thoroughly contrast interface and actual CLI execution against \`UC-*\` and \`FR-*\` acceptance criteria before pre-merge security audit.
|
|
11869
|
-
- Emit handoff block suggesting \`agent-code-reviewer\` / \`agent-security-auditor\` if compliant, or return to \`agent-developer\` on functional drift.
|
|
12668
|
+
- Emit handoff block suggesting \`agent-code-reviewer\` / \`agent-security-auditor\` / \`agent-privacy-officer\` if compliant, or return to \`agent-developer\` on functional drift.
|
|
11870
12669
|
|
|
11871
|
-
###
|
|
12670
|
+
### 10. \`agent-code-reviewer\` (Technical and Architectural Code Reviewer)
|
|
11872
12671
|
- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, design patterns, and respect for complexity and maintainability thresholds (\`quality-policy.yaml\`), forming part of the Pre-Merge Audit Triad.
|
|
11873
12672
|
- **Directives**:
|
|
11874
12673
|
- Respect \`quality-policy.yaml\` thresholds: CC $\\le 10$, Cognitive $\\le 15$, MI $\\ge 50$, LOC $\\le 40$.
|
|
11875
12674
|
- Detect improper coupling, code smells, magic numbers, ambiguous names, and encapsulation violations.
|
|
11876
12675
|
- Flag premature abstractions and speculative code violating YAGNI.
|
|
11877
|
-
- Coordinate Pre-Merge Audit Triad with \`agent-security-auditor\` and \`agent-compliance-checker\`.
|
|
12676
|
+
- Coordinate Pre-Merge Audit Triad with \`agent-security-auditor\`, \`agent-privacy-officer\`, and \`agent-compliance-checker\`.
|
|
11878
12677
|
- Classify findings into: \`[BLOCKING]\` (quality violation or broken pattern), \`[CLEAN_CODE_SUGGESTION]\` (non-blocking improvement), and \`[COMPLIANT]\`.
|
|
11879
12678
|
|
|
11880
|
-
###
|
|
12679
|
+
### 11. \`agent-devops\` (Automation and Infrastructure Engineer)
|
|
11881
12680
|
- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, IaC manifests, and support scripts.
|
|
11882
12681
|
- **Directives**:
|
|
11883
12682
|
- Strict infrastructure domain: Operates exclusively in \`.github/workflows/\`, \`Dockerfile*\`, \`docker-compose*.yml\`, IaC manifests, and \`scripts/\`.
|
|
@@ -11903,7 +12702,7 @@ This file defines the operational rules and specialized role mappings for Google
|
|
|
11903
12702
|
- **Conditional Activation Rule by Autonomy**:
|
|
11904
12703
|
- \u{1F7E2} **\`AUTONOMOUS\`** (or exclusive final supervision in PR/CI): **OMITTED**. Do not request or emit interactive handoff to avoid interrupting unattended execution.
|
|
11905
12704
|
- \u{1F7E1} **Autonomy $\\ge$ \`HUMAN_REVIEW_PLAN\`** (\`HUMAN_REVIEW_PLAN\`, \`AMBIGUOUS\`, \`HIGH_RISK_MANUAL\`): **MANDATORY**. Emit the Workflow Handoff block compliant with [\`templates/workflow/agent-handoff.template.md\`](../../templates/workflow/agent-handoff.template.md) and **STOP**.
|
|
11906
|
-
- **Block Contents**: Declare produced deliverables, recommend the next role in workflow (\`agent-threat-modeler\`, \`agent-system-architect\`, \`agent-qa-engineer\`, \`agent-developer\`, \`agent-expert-user\`, \`agent-code-reviewer\`, \`agent-security-auditor\`, \`agent-compliance-checker\`, \`agent-devops\`, etc.), provide suggested invocation prompt, and keep **the Human Action Window open at all times for the human user to take action** (review, edit by hand, pause/reroute, or delegate).
|
|
12705
|
+
- **Block Contents**: Declare produced deliverables, recommend the next role in workflow (\`agent-threat-modeler\`, \`agent-privacy-officer\`, \`agent-system-architect\`, \`agent-qa-engineer\`, \`agent-developer\`, \`agent-expert-user\`, \`agent-code-reviewer\`, \`agent-security-auditor\`, \`agent-compliance-checker\`, \`agent-devops\`, etc.), provide suggested invocation prompt, and keep **the Human Action Window open at all times for the human user to take action** (review, edit by hand, pause/reroute, or delegate).
|
|
11907
12706
|
`;
|
|
11908
12707
|
var STARTER_CURSOR_CORE_RULES = `---
|
|
11909
12708
|
description: Global canonical directives, 5 unbreakable commandments, and AI-SDLC pre-flight
|
|
@@ -11920,7 +12719,7 @@ Every agent operating in this repository must strictly observe the following gua
|
|
|
11920
12719
|
1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: Do not approve PRs or execute direct merges to protected branches (\`main\`, \`release/*\`). Approval is exclusively reserved for human reviewers.
|
|
11921
12720
|
2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguity, formulate open questions (\`open-questions\`). Never assume undocumented requirements.
|
|
11922
12721
|
3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always verify \`license-policy.yaml\`. Viral dependencies (GPL/AGPL) or commercial paid dependencies (BSL/SSPL) are strictly forbidden without explicit human approval.
|
|
11923
|
-
4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, apply least privilege, and accompany every change with security tests (\`SEC-TEST
|
|
12722
|
+
4. **FORBIDDEN TO IGNORE CYBERSECURITY & PRIVACY (SECURITY-BY-DEFAULT & PRIVACY-BY-DEFAULT)**: Validate inputs, apply least privilege, protect PII according to \`privacy-policy.yaml\`, and accompany every change with security and privacy tests (\`SEC-TEST-*\`, \`@privacy\`). Suppressing linters or tests to force a green pipeline is prohibited.
|
|
11924
12723
|
5. **MANDATORY CRYPTOGRAPHIC CITATION**: Link specifications using immutable identifiers and Unix LF-normalized SHA-256 hashes.
|
|
11925
12724
|
|
|
11926
12725
|
## 2. Pre-Flight Verification Commands
|
|
@@ -11940,7 +12739,8 @@ Before finalizing changes or proposing commits:
|
|
|
11940
12739
|
| Role | Mission (summary) |
|
|
11941
12740
|
| :--- | :--- |
|
|
11942
12741
|
| \`agent-product-analyst\` | Phase 0 NAF v4 Enterprise & Capability Vision (\`ARCH-INTRO-*\`, 3\u20135 question interview) + ProductShape artifacts (\`ACT-*\`, \`UC-*\`, \`FR-*\`, \`QR-*\`, \`BR-*\`); status starts \`draft\`. |
|
|
11943
|
-
| \`agent-threat-modeler\` | STRIDE/OWASP threat triad (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`)
|
|
12742
|
+
| \`agent-threat-modeler\` | STRIDE/OWASP threat triad (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`); hands off to \`agent-privacy-officer\`. |
|
|
12743
|
+
| \`agent-privacy-officer\` | LINDDUN & GDPR/LOPDGDD privacy triad (\`DATA-ASSET-*\`, \`PRIV-ROPA-*\`, \`PRIV-REQ-*\`) + Pre-Merge \`verify:privacy\`. |
|
|
11944
12744
|
| \`agent-system-architect\` | Modular arc42 + NAF v4 architecture (\`CMP-*\`, Mermaid diagrams, \`ADR-*\`). |
|
|
11945
12745
|
| \`agent-qa-engineer\` | FAILING BDD/Gherkin, E2E, and UI suites (using agreed project tech; Happy Path, Sad Path & Boundary Values per interactive UI element) before \`agent-developer\` writes code. |
|
|
11946
12746
|
| \`agent-developer\` | Atomic tasks from \`tasks.md\`; respects autonomy mode; runs \`pnpm run check:fix\` + \`pnpm run verify:all\`. |
|
|
@@ -11963,8 +12763,8 @@ Before finalizing changes or proposing commits:
|
|
|
11963
12763
|
- **Content**: Declare completed deliverables, recommend next role(s), provide suggested invocation prompt, and **keep the Human Action Window open for the human user to take action** (review, edit by hand, pause/reroute, or delegate).
|
|
11964
12764
|
`;
|
|
11965
12765
|
var STARTER_CURSOR_PRODUCT_RULES = `---
|
|
11966
|
-
description: Directives for SDD specifications editing, ProductShape artifacts, and
|
|
11967
|
-
globs: specs/**, templates/**, product/**, security/**
|
|
12766
|
+
description: Directives for SDD specifications editing, ProductShape artifacts, Cybersecurity, and Privacy
|
|
12767
|
+
globs: specs/**, templates/**, product/**, security/**, privacy/**
|
|
11968
12768
|
alwaysApply: false
|
|
11969
12769
|
---
|
|
11970
12770
|
|
|
@@ -11983,14 +12783,17 @@ Every generated or modified artifact must follow canonical naming and satisfy it
|
|
|
11983
12783
|
- Threat Actors: \`ACT-THREAT-[SUFFIX]\` (\`schemas/security/threat-actor.schema.json\`)
|
|
11984
12784
|
- Abuse Cases: \`ABUSE-[SUFFIX]\` (\`schemas/security/abuse-case.schema.json\`)
|
|
11985
12785
|
- Security Requirements: \`SEC-REQ-[SUFFIX]\` (\`schemas/security/security-req.schema.json\`)
|
|
12786
|
+
- Data Assets: \`DATA-ASSET-[SUFFIX]\` (\`schemas/privacy/data-asset.schema.json\`)
|
|
12787
|
+
- Processing Activities (ROPA): \`PRIV-ROPA-[SUFFIX]\` (\`schemas/privacy/privacy-ropa.schema.json\`)
|
|
12788
|
+
- Privacy Requirements: \`PRIV-REQ-[SUFFIX]\` (\`schemas/privacy/privacy-req.schema.json\`)
|
|
11986
12789
|
|
|
11987
12790
|
## 2. "AI as Scribe" Protocol Rules
|
|
11988
12791
|
- **Phase 0 (New Product Inception)**: When starting a new product, conduct a 3\u20135 question discovery interview, instantiate \`ARCH-INTRO-001\` (\`naf-perspective: "Enterprise & Capability"\`) in \`draft\`, and derive \`ACT-*\`, \`UC-*\`, \`BR-*\`, \`FR-*\`, and \`QR-*\`.
|
|
11989
12792
|
- **Initial Status**: Every new artifact strictly starts with \`status: draft\`. Creating artifacts directly as \`active\` or \`approved\` is forbidden.
|
|
11990
12793
|
- **Gherkin Acceptance Criteria**: In every \`FR-*\` requirement, include a \`\`\`gherkin block with tags \`@<ID> @automated @regression\` and at least one \`Scenario Outline\` with an \`Examples\` data table.
|
|
11991
|
-
- **Security Mitigations**: Every \`SEC-REQ-*\` must include negative Gherkin tests (\`@security @mitigation\`).
|
|
12794
|
+
- **Security & Privacy Mitigations**: Every \`SEC-REQ-*\` must include negative Gherkin tests (\`@security @mitigation\`) and every \`PRIV-REQ-*\` must include Gherkin privacy scenarios (\`@privacy @gdpr\`).
|
|
11992
12795
|
- **Use Cases (User Story Structure)**: In every \`UC-*\`, the \`1. Intent and Outcome\` section must be written using the standard English structure: \`As a <ACT-ID>... I want <action>... To <outcome>...\`.
|
|
11993
|
-
- **Deterministic Validation**: Run \`pnpm run verify:schemas\` and \`pnpm run verify:
|
|
12796
|
+
- **Deterministic Validation**: Run \`pnpm run verify:schemas\`, \`pnpm run verify:duplicates\`, and \`pnpm run verify:privacy\` before presenting the draft to the human reviewer.
|
|
11994
12797
|
`;
|
|
11995
12798
|
var STARTER_CURSOR_QUALITY_RULES = `---
|
|
11996
12799
|
description: Directives for code quality, architecture, TDD, and complexity limits
|
|
@@ -12012,7 +12815,7 @@ Canonical Reference: [\`process/09_agent_protocols.md\`](process/09_agent_protoc
|
|
|
12012
12815
|
## 2. TDD Methodology, Clean Architecture & Unit Testing
|
|
12013
12816
|
- **Mandatory 4-Step Implementation Order**: (1) Define/refine Clean Architecture layers & boundaries, (2) Define interfaces/ports for all inter-module interactions to avoid direct module coupling, (3) Implement components consuming/fulfilling those interfaces, (4) Write unit tests for every function covering Happy Path, Sad Path, Boundary Values, and Unexpected/Null/Empty values.
|
|
12014
12817
|
- Apply Test-Driven Development: generate unit tests before or alongside component logic.
|
|
12015
|
-
- Tag tests linked to requirements with header comments citing the ID (\`FR
|
|
12818
|
+
- Tag tests linked to requirements with header comments citing the ID (\`FR-*\`, \`SEC-REQ-*\`, or \`PRIV-REQ-*\`) to enable reverse traceability.
|
|
12016
12819
|
- Suppressing types (\`any\`), linter rules (\`eslint-disable\`), or unit tests to force pipeline passage is prohibited.
|
|
12017
12820
|
|
|
12018
12821
|
## 3. Open Source License Policy (\`license-policy.yaml\`)
|
|
@@ -12027,7 +12830,7 @@ var STARTER_CLAUDE_RULES = `# Claude Code Instructions - AI-SDLC Monorepo
|
|
|
12027
12830
|
|
|
12028
12831
|
Canonical Reference: [\`process/09_agent_protocols.md\`](process/09_agent_protocols.md) and [\`process/01_governance_and_roles.md\`](process/01_governance_and_roles.md).
|
|
12029
12832
|
|
|
12030
|
-
This repository implements the **AI-SDLC** framework (Spec-Driven Development, deterministic quality governance, and OSS license compliance for human-agent collaboration).
|
|
12833
|
+
This repository implements the **AI-SDLC** framework (Spec-Driven Development, deterministic quality governance, Privacy-by-Design, and OSS license compliance for human-agent collaboration).
|
|
12031
12834
|
|
|
12032
12835
|
---
|
|
12033
12836
|
|
|
@@ -12036,7 +12839,7 @@ This repository implements the **AI-SDLC** framework (Spec-Driven Development, d
|
|
|
12036
12839
|
1. **FORBIDDEN TO AUTO-APPROVE OR AUTO-MERGE | PROHIBIDO AUTO-APROBAR O AUTO-FUSIONAR**: Never approve PRs or merge directly to \`main\` or protected branches. Approval is exclusively a human prerogative.
|
|
12037
12840
|
2. **FORBIDDEN TO INVENT PRODUCT OR ARCHITECTURE DECISIONS**: When facing ambiguous requirements, formulate open questions (\`open-questions\`). Never assume undocumented behaviors.
|
|
12038
12841
|
3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**: Always validate the SPDX identifier against \`license-policy.yaml\`. Viral libraries (\`GPL\`/\`AGPL\`) or paid commercial libraries (\`BSL\`/\`SSPL\`) are strictly forbidden without formal human approval.
|
|
12039
|
-
4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**: Validate inputs, sanitize data, and include mitigation tests (\`SEC-TEST
|
|
12842
|
+
4. **FORBIDDEN TO IGNORE CYBERSECURITY & PRIVACY (SECURITY-BY-DEFAULT & PRIVACY-BY-DEFAULT)**: Validate inputs, sanitize data, protect PII according to \`privacy-policy.yaml\`, and include mitigation tests (\`SEC-TEST-*\`, \`@privacy\`). Disabling linters or suppressing typing errors (\`any\`, \`@ts-ignore\`) is prohibited.
|
|
12040
12843
|
5. **MANDATORY CRYPTOGRAPHIC CITATION**: Every spec or sidecar must cite immutable identifiers and Unix LF-normalized SHA-256 digests.
|
|
12041
12844
|
|
|
12042
12845
|
---
|
|
@@ -12047,7 +12850,7 @@ This repository implements the **AI-SDLC** framework (Spec-Driven Development, d
|
|
|
12047
12850
|
# 1. Pre-flight with deterministic auto-fix (Gherkin & SHA-256 digests)
|
|
12048
12851
|
pnpm run check:fix
|
|
12049
12852
|
|
|
12050
|
-
# 2. Complete verification across all Quality Gates (Quality, RTM, Governance, Testing, Licenses, PDaC, Schemas, Duplicates, Security)
|
|
12853
|
+
# 2. Complete verification across all Quality Gates (Quality, RTM, Governance, Testing, Licenses, PDaC, Schemas, Duplicates, Security, Privacy)
|
|
12051
12854
|
pnpm run verify:all
|
|
12052
12855
|
|
|
12053
12856
|
# 3. Complete automated test suite (Vitest)
|
|
@@ -12075,37 +12878,41 @@ npx tsx packages/cli/src/index.ts sdd integrate --change <chg-id>
|
|
|
12075
12878
|
- **Guardrails**: \`status\` always starts in \`draft\`. Mandatory Gherkin criteria with \`@<ID> @automated @regression\`.
|
|
12076
12879
|
|
|
12077
12880
|
### 2. \`agent-threat-modeler\` (Threat Modeler and Security Specialist)
|
|
12078
|
-
- **Mission**: Analyze use cases and proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigations, both at product level and in the technical security feedback loop over architecture
|
|
12881
|
+
- **Mission**: Analyze use cases and proactively model adversaries, STRIDE attack vectors, and OWASP ASVS mitigations, both at product level and in the technical security feedback loop over architecture, handing off to \`agent-privacy-officer\`.
|
|
12079
12882
|
- **Output**: Cybersecurity triad (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`) compliant with \`schemas/security/\`.
|
|
12080
12883
|
|
|
12081
|
-
### 3. \`agent-
|
|
12884
|
+
### 3. \`agent-privacy-officer\` (Data Protection & Privacy-by-Design Specialist)
|
|
12885
|
+
- **Mission**: Receive handoff from \`agent-threat-modeler\` to model personal data assets (\`DATA-ASSET-*\`), GDPR Art. 30 records of processing (\`PRIV-ROPA-*\`), and LINDDUN / GDPR / ISO 27701 privacy requirements (\`PRIV-REQ-*\`), and audit code diffs against \`privacy-policy.yaml\`.
|
|
12886
|
+
- **Directives**: Run \`pnpm run verify:privacy\`, enforce PII masking in logs/LLM prompts, and trigger \`DPIA-*\` requests on Art. 9 sensitive data.
|
|
12887
|
+
|
|
12888
|
+
### 4. \`agent-system-architect\` (System Architect)
|
|
12082
12889
|
- **Mission**: Translate the approved product definition into a modular technical architecture based on arc42 enriched with NAF v4 (\`CMP-*\`, Mermaid diagrams, \`ADR-*\`).
|
|
12083
|
-
- **Guardrails**: Declare \`satisfies-requirements\` on every \`CMP-*\` and trigger the technical security feedback loop toward \`agent-threat-modeler\` when infrastructure decisions introduce new attack vectors.
|
|
12890
|
+
- **Guardrails**: Declare \`satisfies-requirements\` on every \`CMP-*\` (including \`PRIV-REQ-*\`) and trigger the technical security/privacy feedback loop toward \`agent-threat-modeler\` \u2794 \`agent-privacy-officer\` when infrastructure decisions introduce new attack vectors or PII flows.
|
|
12084
12891
|
|
|
12085
|
-
###
|
|
12086
|
-
- **Mission**: Translate approved requirements (\`FR-*\`, \`SEC-REQ-*\`, \`QR-*\`) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites, before \`agent-developer\` writes production code.
|
|
12892
|
+
### 5. \`agent-qa-engineer\` (QA Engineer and SDET)
|
|
12893
|
+
- **Mission**: Translate approved requirements (\`FR-*\`, \`SEC-REQ-*\`, \`PRIV-REQ-*\`, \`QR-*\`) into comprehensive FAILING (red) BDD/Gherkin, End-to-End (E2E), UI, and unit test suites, before \`agent-developer\` writes production code.
|
|
12087
12894
|
- **Guardrails**: Always use the agreed project technology/testing stack (if any). Never omit End-to-End (E2E) and UI tests. Create specific tests for every interactive UI element covering Happy Path, Sad Path, and Boundary Values. FORBIDDEN to include production code. Mandatory tags: \`@<FR-ID> @automated @regression\`.
|
|
12088
12895
|
|
|
12089
|
-
###
|
|
12896
|
+
### 6. \`agent-developer\` (Software Developer)
|
|
12090
12897
|
- **Mission**: Implement atomic tasks from SDD specifications (\`tasks.md\`) with clean, strictly typed code and thorough tests.
|
|
12091
12898
|
- **Directives**: Execute the mandatory 4-step order: (1) Clean Architecture definition/redefinition, (2) Inter-module interfaces first, (3) Component implementation, (4) Per-function unit tests (Happy Path, Sad Path, Boundary Values, Unexpected/Null/Empty values). Respect the autonomy mode. Make tests delivered by \`agent-qa-engineer\` pass green. Run \`pnpm run check:fix\` and \`pnpm run verify:all\`.
|
|
12092
12899
|
|
|
12093
|
-
###
|
|
12900
|
+
### 7. \`agent-security-auditor\` (Adversarial Code Auditor)
|
|
12094
12901
|
- **Mission**: Examine Pull Requests for business logic vulnerabilities, injection vectors, secret leaks, and authorization flaws as part of the Pre-Merge Audit Triad.
|
|
12095
12902
|
- **Directives**: Run \`pnpm run verify:security\`, evaluate CVSS v3.1 severity, and block CRITICAL/HIGH risks.
|
|
12096
12903
|
|
|
12097
|
-
###
|
|
12904
|
+
### 8. \`agent-compliance-checker\` (Open Source License Compliance Auditor)
|
|
12098
12905
|
- **Mission**: Audit dependency manifests against \`license-policy.yaml\` as part of the Pre-Merge Audit Triad.
|
|
12099
12906
|
- **Directives**: Run \`pnpm run verify:licenses\`, blocking viral (\`GPL\`, \`AGPL\`) or unapproved commercial (\`BSL\`, \`SSPL\`) packages.
|
|
12100
12907
|
|
|
12101
|
-
###
|
|
12908
|
+
### 9. \`agent-expert-user\` (Expert User and Domain Evaluator)
|
|
12102
12909
|
- **Mission**: Contrast design and specifications (design phase) and functionally validate finished software against \`UC-*\` and \`FR-*\` (post-development functional validation phase).
|
|
12103
12910
|
|
|
12104
|
-
###
|
|
12911
|
+
### 10. \`agent-code-reviewer\` (Technical and Architectural Code Reviewer)
|
|
12105
12912
|
- **Mission**: Audit Pull Requests evaluating code cleanliness, adherence to SOLID, DRY, YAGNI principles, and respect for \`quality-policy.yaml\` thresholds, forming part of the Pre-Merge Audit Triad.
|
|
12106
12913
|
- **Findings classification**: \`[BLOCKING]\`, \`[CLEAN_CODE_SUGGESTION]\`, \`[COMPLIANT]\`.
|
|
12107
12914
|
|
|
12108
|
-
###
|
|
12915
|
+
### 11. \`agent-devops\` (Automation and Infrastructure Engineer)
|
|
12109
12916
|
- **Mission**: Maintain, evolve, and audit automated project infrastructure: CI/CD workflows, Docker containers, IaC manifests, and support scripts.
|
|
12110
12917
|
- **NON-INVASION GUARDRAIL**: STRICTLY FORBIDDEN from modifying application source code (\`src/\`, \`packages/*/src/\`).
|
|
12111
12918
|
|
|
@@ -12176,8 +12983,8 @@ You operate as an assistant agent in the **AI-SDLC** repository. You are not a s
|
|
|
12176
12983
|
- If a requirement is ambiguous or incomplete, formulate open questions (\`open-questions\`) to the human user. Guessing undocumented intentions is forbidden.
|
|
12177
12984
|
3. **FORBIDDEN TO INTRODUCE DEPENDENCIES WITHOUT LICENSE INSPECTION**:
|
|
12178
12985
|
- Before suggesting or adding dependencies to manifests (\`package.json\`, etc.), validate their SPDX identifier against \`license-policy.yaml\`. Adding viral (\`GPL\`, \`AGPL\`) or commercial paid (\`BSL\`, \`SSPL\`) licenses without human authorization is prohibited.
|
|
12179
|
-
4. **FORBIDDEN TO IGNORE CYBERSECURITY (SECURITY-BY-DEFAULT)**:
|
|
12180
|
-
- All code must enforce least privilege, sanitize external inputs, and include mitigation tests (\`SEC-TEST
|
|
12986
|
+
4. **FORBIDDEN TO IGNORE CYBERSECURITY & PRIVACY (SECURITY-BY-DEFAULT & PRIVACY-BY-DEFAULT)**:
|
|
12987
|
+
- All code must enforce least privilege, sanitize external inputs, protect PII according to \`privacy-policy.yaml\`, and include mitigation tests (\`SEC-TEST-*\`, \`@privacy\`). Suppressing types (\`any\`), linters, or tests to force a green pipeline is prohibited.
|
|
12181
12988
|
5. **MANDATORY CRYPTOGRAPHIC CITATION**:
|
|
12182
12989
|
- Every specification, design, or sidecar must reference canonical identifiers and their Unix LF-normalized SHA-256 digests.
|
|
12183
12990
|
|
|
@@ -12222,7 +13029,7 @@ Non-Negotiable Quality Thresholds (\`quality-policy.yaml\`):
|
|
|
12222
13029
|
- **Conditional Activation**:
|
|
12223
13030
|
* \u{1F7E2} **\`AUTONOMOUS\` Mode** (or PR/CI final supervision): **OMITTED**. Do not interrupt unattended execution.
|
|
12224
13031
|
* \u{1F7E1} **Autonomy $\\ge$ \`HUMAN_REVIEW_PLAN\`** (\`HUMAN_REVIEW_PLAN\`, \`AMBIGUOUS\`, \`HIGH_RISK_MANUAL\`): **MANDATORY**. Emit Workflow Handoff block compliant with [\`templates/workflow/agent-handoff.template.md\`](../templates/workflow/agent-handoff.template.md) and **STOP**.
|
|
12225
|
-
- **Components**: Declare completed deliverables, recommend next roles (\`agent-threat-modeler\`, \`agent-system-architect\`, \`agent-developer\`, \`agent-security-auditor\`), provide suggested invocation prompt, and **keep the Human Action Window open at all times for the user to take action** (review, edit by hand, pause/reroute, or delegate).
|
|
13032
|
+
- **Components**: Declare completed deliverables, recommend next roles (\`agent-threat-modeler\`, \`agent-privacy-officer\`, \`agent-system-architect\`, \`agent-developer\`, \`agent-security-auditor\`), provide suggested invocation prompt, and **keep the Human Action Window open at all times for the user to take action** (review, edit by hand, pause/reroute, or delegate).
|
|
12226
13033
|
|
|
12227
13034
|
---
|
|
12228
13035
|
|
|
@@ -12231,7 +13038,8 @@ Non-Negotiable Quality Thresholds (\`quality-policy.yaml\`):
|
|
|
12231
13038
|
| Role | Mission (summary) |
|
|
12232
13039
|
| :--- | :--- |
|
|
12233
13040
|
| \`agent-product-analyst\` | Phase 0 NAF v4 Enterprise & Capability Vision (\`ARCH-INTRO-*\`, 3\u20135 question interview) + ProductShape artifacts (\`ACT-*\`, \`UC-*\`, \`FR-*\`, \`QR-*\`, \`BR-*\`); \`status\` starts \`draft\`. |
|
|
12234
|
-
| \`agent-threat-modeler\` | STRIDE/OWASP threat triad (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`)
|
|
13041
|
+
| \`agent-threat-modeler\` | STRIDE/OWASP threat triad (\`ACT-THREAT-*\`, \`ABUSE-*\`, \`SEC-REQ-*\`); hands off to \`agent-privacy-officer\`. |
|
|
13042
|
+
| \`agent-privacy-officer\` | LINDDUN & GDPR/LOPDGDD privacy triad (\`DATA-ASSET-*\`, \`PRIV-ROPA-*\`, \`PRIV-REQ-*\`) + Pre-Merge \`verify:privacy\`. |
|
|
12235
13043
|
| \`agent-system-architect\` | Modular arc42 + NAF v4 architecture (\`CMP-*\`, Mermaid diagrams, \`ADR-*\`). |
|
|
12236
13044
|
| \`agent-qa-engineer\` | FAILING BDD/Gherkin, E2E, and UI suites (using agreed project tech; Happy Path, Sad Path & Boundary Values per interactive UI element) before \`agent-developer\` writes production code. |
|
|
12237
13045
|
| \`agent-developer\` | Atomic tasks from \`tasks.md\`; autonomy mode must be respected; runs \`pnpm run check:fix\` + \`pnpm run verify:all\`. |
|
|
@@ -13293,6 +14101,10 @@ var STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_SDD_INTEGRATE_ON_MERGE_YML = 'name: SD
|
|
|
13293
14101
|
var STARTER_TEMPLATES_COMPLIANCE_COMMERCIAL_ACQUISITION_REQUEST_TEMPLATE_MD = '---\r\nid: REQ-LIC-ACQUISITION-001\r\ntype: license-acquisition-request\r\ntitle: Commercial License Acquisition Request for [Library]\r\nstatus: pending-approval # pending-approval, approved, rejected\r\nrequested-package: "@vendor/commercial-package"\r\nspdx-license: "BSL-1.1" # or Commercial, SSPL-1.0\r\nlicense-category: commercial_acquisition_required\r\nestimated-cost: "$1,200 / year"\r\nbusiness-justification: "Accelerates critical telemetry module development avoiding 4 months of in-house implementation."\r\n---\r\n\r\n# Commercial License Acquisition Request\r\n\r\n## 1. Package and Vendor\r\n- **Package**: `@vendor/commercial-package`\r\n- **Version**: `2.4.0`\r\n- **License Type**: BSL 1.1 / Commercial\r\n- **Official Website**: `https://vendor.example.com`\r\n\r\n## 2. Technical Justification and Evaluated Alternatives\r\n- **Why a permissive alternative (MIT/Apache 2.0) is not used**:\r\n - Open-source alternatives lack required hardware encryption protocol support.\r\n- **Impact of not acquiring the license**:\r\n - 4-month delay on product delivery milestone.\r\n\r\n## 3. Human Authorization Signatures\r\n- [ ] Tech Lead: Technical approval\r\n- [ ] Legal / IP Counsel: EULA clauses validation\r\n- [ ] Procurement / Budget Owner: Payment authorization\r\n';
|
|
13294
14102
|
var STARTER_TEMPLATES_MANUALS_PRODUCTION_MANUAL_TEMPLATE_MD = '---\r\nid: MAN-PROD-001\r\ntype: production-manual\r\ntitle: "Production & Operations Manual: Application Name"\r\nstatus: draft\r\nversion: "1.0.0"\r\nschema-version: "1.0"\r\napplies-to-version: "v1.0.0"\r\ntarget-audience:\r\n - devops-engineer\r\n - sre-engineer\r\n - release-manager\r\n - secops\r\ncomponents-covered:\r\n - CMP-NAME-001\r\nenclaves-involved:\r\n - SEC-ENC-DMZ-001\r\nsupersedes: null\r\nsuperseded-by: null\r\n---\r\n\r\n# MAN-PROD-001: Production & Operations Manual - Application Name\r\n\r\n## 1. Deterministic Release Regeneration (Reproducible Builds)\r\n\r\nThis section contains the specifications and directives required to deterministically reproduce identical bit-by-bit application artifacts or releases from their Git tag.\r\n\r\n### 1.1 Source Code Baseline\r\n\r\n- **Canonical Repository**: `https://github.com/organization/repo-name.git`\r\n- **Immutable Git Release Tag**: `v1.0.0`\r\n- **Commit SHA-256 / SHA-1**: `[VERIFIED_HEXADECIMAL_COMMIT_SHA]`\r\n- **Clean Checkout Command**:\r\n ```bash\r\n git clone --recurse-submodules https://github.com/organization/repo-name.git\r\n cd repo-name\r\n git checkout tags/v1.0.0\r\n git submodule update --init --recursive\r\n ```\r\n\r\n### 1.2 Frozen Toolchains and Build Tool Matrix\r\n\r\nTo prevent discrepancies in binary or package generation, strict usage of pinned versions of the following utilities is enforced:\r\n\r\n| Tool / Runtime | Exact Version | Toolchain Checksum / Digest | Purpose |\r\n| :--- | :--- | :--- | :--- |\r\n| **Node.js LTS** | `v22.12.0` | `sha256:node-v22.12.0-linux-x64.tar.xz` | Execution and transpilation runtime |\r\n| **pnpm** | `9.15.0` | `sha256:pnpm-v9.15.0` | Deterministic monorepo package manager |\r\n| **TypeScript (tsc)** | `5.7.2` | Pinned in `devDependencies` | Strict ECMAScript compiler |\r\n| **Docker BuildKit** | `v0.18.0` | `moby/buildkit:v0.18.0` | Hermetic OCI packaging engine |\r\n\r\n### 1.3 Libraries, Dependencies, and Vertex Graph\r\n\r\n- **Immutable Lockfile**: `pnpm-lock.yaml` (or `Cargo.lock`, `go.sum`, `requirements.lock`). Installations with open resolution are forbidden (`pnpm install --frozen-lockfile` mandatory).\r\n- **SBOM (Software Bill of Materials) Inventory**:\r\n - Format: CycloneDX JSON v1.5 / SPDX v2.3.\r\n - Compiled SBOM path: `reports/sbom-cyclonedx.json`.\r\n- **OSS License Governance**:\r\n - Binding policy: `license-policy.yaml`.\r\n - Library vertex pre-verification:\r\n ```bash\r\n pnpm verify:licenses\r\n ```\r\n\r\n### 1.4 Step-by-Step Deterministic Build Procedure\r\n\r\n1. **Step 1: Hermetic Dependency Installation**\r\n ```bash\r\n pnpm install --frozen-lockfile --ignore-scripts\r\n ```\r\n\r\n2. **Step 2: Integrity and Strict Type Checking**\r\n ```bash\r\n pnpm typecheck\r\n ```\r\n\r\n3. **Step 3: Artifact Compilation**\r\n ```bash\r\n export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)\r\n pnpm build\r\n ```\r\n\r\n4. **Step 4: Cryptographic Verification of Generated Artifact**\r\n ```bash\r\n sha256sum dist/app.bundle.js\r\n # Compare against the canonical checksum registered in official release:\r\n # Expected: [CANONICAL_SHA256_CHECKSUM]\r\n ```\r\n\r\n---\r\n\r\n## 2. Version, Infrastructure, and Migration Compatibility Matrix\r\n\r\nThis section defines technical interoperability boundaries between the release version and the deployment ecosystem, ensuring safe Zero-Downtime transitions.\r\n\r\n### 2.1 Platform and Execution Runtime Compatibility\r\n\r\n| Infrastructure Component | Approved Version Range | Recommended Version | Support Status |\r\n| :--- | :--- | :--- | :---: |\r\n| **Kubernetes Cluster (K8s)** | `>= 1.28` and `<= 1.31` | `1.30.2` | \u2705 Certified |\r\n| **Container Runtime (CRI)** | containerd `>= 1.7` / CRI-O `>= 1.28` | containerd `1.7.15` | \u2705 Certified |\r\n| **Base Operating System (Host)** | Ubuntu 22.04 LTS / RHEL 9.2+ | Ubuntu 22.04 LTS (Kernel 6.x) | \u2705 Homologated |\r\n| **Language Runtime (Production)** | Node.js `>= 20.x` and `<= 22.x` | `v22.12.0 LTS` | \u2705 Hermetic |\r\n\r\n### 2.2 Data Schema and Migration Compatibility (N-1 Support)\r\n\r\nTo enable Canary or Blue-Green continuous deployments without transaction loss:\r\n\r\n| Release Version | DB Schema Version | Compatible with $N-1$ Code | Schema Migration Status |\r\n| :---: | :---: | :---: | :--- |\r\n| **`v1.0.0`** (Current) | `SCHEMA-v1.0` | \u2705 Yes (supports `v0.9.x` code) | Non-destructive additive migration (no column renaming). |\r\n| **`v0.9.x`** | `SCHEMA-v0.9` | \u2705 Previous baseline | Fully compatible during Canary drain period. |\r\n\r\n### 2.3 Interoperability Between Architecture Components (`CMP-*`)\r\n\r\n| Dependent Component | Consumed Component | Minimum Compatible Versions | Binding Protocol / Contract |\r\n| :--- | :--- | :---: | :--- |\r\n| `CMP-NAME-001` (Gateway) | `CMP-NAME-002` (Backend) | `>= v1.0.0` | gRPC / Protobuf v3 (`contract_spec.proto`) |\r\n| `CMP-NAME-001` (Gateway) | Messaging Bus / Kafka | `>= 3.5.0` | Kafka v2 Protocol with TLS mTLS |\r\n\r\n### 2.4 Homologated Upgrade & Rollback Paths\r\n\r\n| Source Version | Direct Jump to `v1.0.0` | Intermediate Migration Required | Direct Rollback Procedure |\r\n| :---: | :---: | :---: | :---: |\r\n| **`v0.9.1`** | \u2705 Allowed | \u274C Not required | `kubectl rollout undo` without data loss. |\r\n| **`v0.9.0`** | \u2705 Allowed | \u274C Not required | `kubectl rollout undo` without data loss. |\r\n| **`< v0.9.0`** | \u274C Blocked | \u2705 Must upgrade to `v0.9.1` first | Requires restore from backup snapshot. |\r\n\r\n---\r\n\r\n## 3. CI/CD Architecture and Pipelines\r\n\r\n### 3.1 Hierarchical Branching Model and Integration Triggers\r\n\r\nFollowing the AI-SDLC 4-tier standard:\r\n\r\n```text\r\nTIER 1: main (Production)\r\n \u25B2\r\n \u2514\u2500\u2500 PR Release Gate (Manual Tech Lead / Release Manager Approval)\r\n \u2502\r\nTIER 2: release/v1.0.0 (Open Version Branch)\r\n \u25B2\r\n \u2514\u2500\u2500 PR Feature Gate (Lint + Tests + Quality Gate + SAST + SBOM)\r\n \u2502\r\nTIER 3: feat/CHG-001-* (Feature / Bug)\r\n```\r\n\r\n- **Pull Request Trigger**: Executes linters, full test battery, and governance verifications without deployment.\r\n- **Release Tag Trigger (`v*.*.*`)**: Executes the full hermetic build pipeline, image signing, and continuous deployment.\r\n\r\n### 3.2 CI/CD Pipeline Flowchart\r\n\r\n```mermaid\r\nflowchart LR\r\n A["Git Push / Tag v1.0.0"] --> B["Hermetic Checkout"]\r\n B --> C["Linters & Typecheck"]\r\n C --> D["Vitest: Unit & BDD"]\r\n D --> E["Quality Gate: CC & MI"]\r\n E --> F["SAST & Secret Scan"]\r\n F --> G["SBOM & License Gate"]\r\n G --> H["Deterministic Build"]\r\n H --> I["Cosign / SLSA Signing"]\r\n I --> J["Push to OCI Registry"]\r\n J --> K["Deploy to DMZ Enclave"]\r\n```\r\n\r\n### 3.3 Release Gate Contracts and Thresholds\r\n\r\n| Quality Gate | Tool / Command | Required Threshold | Action on Non-Compliance |\r\n| :--- | :--- | :--- | :--- |\r\n| **Lint & Typecheck** | `pnpm typecheck` | Zero errors, zero `any` | **Immediate failure** |\r\n| **Automated Tests** | `pnpm test:all` | 100% passed, Coverage >= 85% | **Immediate failure** |\r\n| **Cyclomatic Complexity** | `aisdlc verify quality` | CC <= 10 per function | **Release blocked** |\r\n| **Maintainability Index** | `aisdlc verify quality` | MI >= 50.0 / 100 | **Release blocked** |\r\n| **360\xB0 Traceability** | `aisdlc verify traceability` | 100% of requirements linked | **Release blocked** |\r\n| **OSS Licenses** | `aisdlc verify licenses` | Zero forbidden/viral licenses | **Release blocked** |\r\n| **Cryptographic Signature** | `cosign verify` | Valid signature from Corporate CA | **Deployment rejected** |\r\n\r\n---\r\n\r\n## 4. Production Deployment Strategy and Procedure\r\n\r\n### 4.1 Infrastructure Prerequisites and Network Enclaves\r\n\r\n- **Target Enclave**: `SEC-ENC-DMZ-001` (Strict segmentation without direct uncontrolled outbound internet access).\r\n- **Enabled Network Ports**:\r\n - Port `8443/TCP`: Secure WebSocket ingestion with mutual TLS (mTLS) authentication.\r\n - Port `9090/TCP`: Prometheus metrics (internal management network only).\r\n- **Secrets and Certificate Management**:\r\n - Server TLS and client root CA certificates mounted via immutable secret at `/etc/pki/tls/`.\r\n - Embedding cryptographic keys in environment variables or images is strictly forbidden.\r\n\r\n### 4.2 Rollout Strategy\r\n\r\nA **Canary strategy with progressive telemetry metrics analysis** is utilized:\r\n1. 10% of traffic is routed to the new version for 15 minutes.\r\n2. If the 5xx error rate is `<= 0.01%` and p99 latency is `<= 50ms`, traffic is promoted to 100%.\r\n\r\n### 4.3 Step-by-Step Deployment Procedure\r\n\r\n1. **Step 1: Pre-deployment and State Snapshot**\r\n ```bash\r\n # Check cluster health and record baseline\r\n kubectl get pods -n production -l app=system\r\n kubectl exec -it system-db-0 -- /backup/create-snapshot.sh\r\n ```\r\n\r\n2. **Step 2: Deployment Manifest Application**\r\n ```bash\r\n kubectl apply -f deploy/production/canary-deployment.yaml\r\n kubectl rollout status deployment/system-service -n production --timeout=180s\r\n ```\r\n\r\n3. **Step 3: Health Verification and Smoke Tests**\r\n ```bash\r\n curl -f --cacert /etc/pki/tls/ca.crt https://127.0.0.1:8443/healthz\r\n curl -f --cacert /etc/pki/tls/ca.crt https://127.0.0.1:8443/readyz\r\n pnpm test:example\r\n ```\r\n\r\n### 4.4 Rollback Plan (Immediate Rollback)\r\n\r\n- **Objective Rollback Activation Criteria**:\r\n - mTLS handshake failure rate `> 1.0%`.\r\n - Ingestion p99 latency `> 100ms` for 2 continuous minutes.\r\n - Critical `CrashLoopBackOff` alert on more than 20% of instances.\r\n- **Rollback Execution Command**:\r\n ```bash\r\n kubectl rollout undo deployment/system-service -n production\r\n kubectl rollout status deployment/system-service -n production\r\n ```\r\n\r\n---\r\n\r\n## 5. Likely Errors Resolution and Troubleshooting (Runbooks)\r\n\r\nThis section documents the most frequent runtime and deployment failures along with diagnosis and immediate mitigation procedures.\r\n\r\n### 5.1 Frequent Incidents and Solutions Matrix\r\n\r\n#### Incident 1: Dependency Vertex Inconsistency or Drift (Build Failure)\r\n- **Symptom**: `pnpm install --frozen-lockfile` command fails in CI with error `ERR_PNPM_LOCKFILE_OUTDATED`.\r\n- **Root Cause**: `package.json` was modified without updating `pnpm-lock.yaml`.\r\n- **Diagnosis**:\r\n ```bash\r\n git diff HEAD^ package.json pnpm-lock.yaml\r\n ```\r\n- **Mitigation**:\r\n 1. On the feature branch, run `pnpm install` locally to regenerate the deterministic lockfile.\r\n 2. Verify no restricted-license dependencies were introduced via `pnpm verify:licenses`.\r\n 3. Commit both files together in an atomic commit.\r\n\r\n---\r\n\r\n#### Incident 2: mTLS Handshake Failure or Enclave Certificate Rejected\r\n- **Symptom**: Clients receive error `ERR_TLS_CERT_ALTNAME_INVALID` or connection closed with TLS alert `certificate_unknown (46)`.\r\n- **Root Cause**: Internal root CA mounted on server does not match the client certificate issuer CA, or certificate expired.\r\n- **Diagnosis**:\r\n ```bash\r\n openssl s_client -connect 127.0.0.1:8443 -CAfile /etc/pki/tls/ca.crt -cert /etc/pki/tls/client.crt -key /etc/pki/tls/client.key\r\n openssl x509 -in /etc/pki/tls/ca.crt -noout -dates -issuer -subject\r\n ```\r\n- **Mitigation**:\r\n 1. Verify expiration date of certificate mounted in cluster Secret.\r\n 2. If expired, rotate the certificate by injecting the new pair from HSM / Vault storage.\r\n 3. Orderly restart pods with `kubectl rollout restart deployment/system-service`.\r\n\r\n---\r\n\r\n#### Incident 3: Release Gate Rejection in CI/CD Due to Quality Metrics\r\n- **Symptom**: Pipeline aborts with verdict `Quality Gate REJECTED` (Cyclomatic Complexity > 10 or Maintainability < 50).\r\n- **Root Cause**: Introduction of complex nested logic (multiple `if/else`, extensive `switch`, or branching loops).\r\n- **Diagnosis**:\r\n ```bash\r\n pnpm verify:quality\r\n ```\r\n- **Mitigation**:\r\n 1. Inspect the violation report in `reports/QUALITY_GATE_REPORT.md` to identify the offending function.\r\n 2. Decompose function into cohesive private helper methods following the rule of maximum 40 lines per function.\r\n 3. Re-run `pnpm verify:quality` until green verdict is confirmed. Adding suppression comments (`// @ts-ignore`) is forbidden.\r\n\r\n---\r\n\r\n#### Incident 4: CrashLoopBackOff Due to Memory Leak or Connection Limit\r\n- **Symptom**: Pod is terminated with exit code `ExitCode: 137` (`OOMKilled`) after a load spike.\r\n- **Root Cause**: Undrained socket buffer accumulation during high-frequency bursts.\r\n- **Diagnosis**:\r\n ```bash\r\n kubectl describe pod system-service-xxx -n production | grep -i oom\r\n kubectl logs system-service-xxx -n production --previous\r\n ```\r\n- **Mitigation**:\r\n 1. Temporarily adjust memory limits in Kubernetes manifest (`resources.limits.memory`) if the load burst is legitimate.\r\n 2. Apply backpressure or discard expired packets in accordance with business rules (`BR-*`).\r\n 3. Run local benchmark with `pnpm test:all` to audit memory consumption.\r\n\r\n---\r\n\r\n### 5.2 Escalation Protocol and Critical Incident Management\r\n\r\n| Severity Level | Impact Criterion | Maximum Response Time | Roles Involved |\r\n| :--- | :--- | :---: | :--- |\r\n| **SEV-1 (Critical)** | Complete service outage or security breach in enclave. | 15 minutes | On-call SRE + Lead Architect + SecOps |\r\n| **SEV-2 (Major)** | Severe service degradation, massive retries without outage. | 1 hour | On-call SRE + Tech Lead |\r\n| **SEV-3 (Minor)** | Isolated node incident without global SLA impact. | 4 hours | Support Engineer / DevOps |\r\n\r\n---\r\n\r\n## 6. Revision History and Version Control\r\n\r\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\r\n| :--- | :--- | :--- | :--- | :--- |\r\n| **1.0.0** | 2026-09-15 | Operations & DevOps Team | Initial Production Manual generation | CHG-009 |\r\n';
|
|
13295
14103
|
var STARTER_TEMPLATES_MANUALS_USER_MANUAL_TEMPLATE_MD = '---\r\nid: MAN-USER-001\r\ntype: user-manual\r\ntitle: "User Manual: Application Name"\r\nstatus: draft\r\nversion: "1.0.0"\r\nschema-version: "1.0"\r\napplies-to-version: "v1.0.0"\r\ntarget-audience:\r\n - ACT-ROLE-USER-001\r\n - ACT-OPERATOR-002\r\nallowed-roles:\r\n - ACT-ROLE-USER-001\r\n - ACT-OPERATOR-002\r\njourneys-covered:\r\n - JRN-JOURNEY-001\r\nuse-cases-covered:\r\n - UC-ACTION-001\r\nsupersedes: null\r\nsuperseded-by: null\r\n---\r\n\r\n# MAN-USER-001: User Manual - Application Name\r\n\r\n## 1. System Purpose and Audience\r\n\r\nConcisely describes the software\'s purpose, the operational value it delivers to end users, and the general context in which it operates.\r\n\r\n- **Application / System**: `[System Name or Bounded Context]`\r\n- **Software Version**: `v1.0.0`\r\n- **Target Audience**: `[Functional roles and user profiles addressed]`\r\n\r\n---\r\n\r\n## 2. User Role Catalog and Permissions Matrix (RBAC)\r\n\r\nThis section formally defines the roles authorized to access and operate the application, as well as the privileges assigned to each.\r\n\r\n### 2.1 Authorized Role Catalog\r\n\r\n| Role Identifier | Role Name | Associated Actor | Description & Responsibility | Enclave / Access Level |\r\n| :--- | :--- | :--- | :--- | :--- |\r\n| **`ROLE_USER`** | Standard User | `ACT-ROLE-USER-001` | Data queries and nominal business flow execution. | Corporate Network / Web UI |\r\n| **`ROLE_OPERATOR`** | System Operator | `ACT-OPERATOR-002` | Streaming supervision, alert management, and command control. | DMZ Enclave / Operational Console |\r\n\r\n### 2.2 Access and Capabilities Matrix by Role\r\n\r\n| Application Capability / Module | `ROLE_USER` | `ROLE_OPERATOR` | Authentication Mode |\r\n| :--- | :---: | :---: | :--- |\r\n| Status Query and Dashboard Visualizations | \u2705 Allowed | \u2705 Allowed | Bearer Token (OIDC/JWT) |\r\n| Business Journey Execution (`JRN-JOURNEY-001`) | \u2705 Allowed | \u2705 Allowed | Bearer Token (OIDC/JWT) |\r\n| Real-Time Streaming and Operational Control | \u274C Denied | \u2705 Allowed | mTLS + Device X.509 Certificate |\r\n| Global Parameters Configuration & Connectivity | \u274C Denied | \u2705 Allowed | Administrator Credential |\r\n\r\n---\r\n\r\n## 3. Version and User Platform Compatibility Matrix\r\n\r\nThis section specifies cross-compatibility between the current application version and user environments, clients, and formats.\r\n\r\n### 3.1 Client-Server Compatibility (APIs and SDKs)\r\n\r\n| Application Version (Backend) | Compatible CLI Version | Compatible SDK Version | Compatibility Status | Migration Notes |\r\n| :---: | :---: | :---: | :---: | :--- |\r\n| **`v1.0.0`** (Current) | `>= v1.0.0` | `>= v1.0.0` | \u2705 Fully Supported | Active canonical version. |\r\n| **`v1.0.0`** (Current) | `v0.9.x` | `v0.9.x` | \u26A0\uFE0F Degraded Mode | Requires upgrade before next minor. |\r\n| **`v1.0.0`** (Current) | `< v0.9.0` | `< v0.9.0` | \u274C Incompatible / Deprecated | Legacy endpoints decommissioned. |\r\n\r\n### 3.2 Homologated Browsers and Client Platforms\r\n\r\n| Platform / Environment | Minimum Supported Versions | Support Level | Known Constraints |\r\n| :--- | :--- | :---: | :--- |\r\n| **Google Chrome / Chromium** | Version `>= 120` | Tier 1 (Official) | Optimal WebSockets and WebGL performance. |\r\n| **Mozilla Firefox** | Version `>= 115 ESR` | Tier 1 (Official) | Full client certificate support. |\r\n| **Safari / WebKit** | Version `>= 17.0` | Tier 2 (Functional) | Requires explicit mTLS enablement in macOS Keychain. |\r\n| **Terminal / CLI (Linux / macOS / Windows)** | Node.js `>= 18` or Bash `>= 5.0` | Tier 1 (Official) | Full support on PowerShell 7+ and bash. |\r\n\r\n### 3.3 Configuration Files and Data Formats Compatibility\r\n\r\n| Format / Artifact | Source Version Supported | Automatic Conversion | User Action Required |\r\n| :--- | :---: | :---: | :--- |\r\n| **`config.yaml`** | `v0.9.x` | \u2705 Yes | None. Application migrates deprecated keys on startup. |\r\n| **Export Profiles (`.json`)** | `v0.9.x` | \u2705 Yes | 100% backward compatible. |\r\n\r\n---\r\n\r\n## 4. Application Installation, Access, and Configuration\r\n\r\n### 4.1 Access Channels and Prerequisites\r\n\r\n- **Web Portal / UI**: Access URL (e.g., `https://app.system.internal`).\r\n- **Command Line (CLI)**: Executable binary or package (e.g., `npx system-cli` or `./system-client`).\r\n- **Supported Browsers or Platforms**: Chrome >= 120, Firefox >= 120, Linux/macOS/Windows terminal.\r\n\r\n### 4.2 Client Configuration and Environment Variables\r\n\r\nThe application allows parameterizing its behavior via environment variables or local configuration files:\r\n\r\n| Parameter / Variable | Type | Default Value | Required | Description |\r\n| :--- | :--- | :--- | :---: | :--- |\r\n| `API_ENDPOINT` | URL | `https://api.system.internal/v1` | Yes | Base backend API endpoint. |\r\n| `WS_STREAM_URL` | WSS URL | `wss://stream.system.internal/telemetry` | No | Real-time telemetry or notifications socket. |\r\n| `CLIENT_TIMEOUT_MS` | Integer | `5000` | No | Network response timeout in milliseconds. |\r\n| `AUTH_PROFILE` | String | `production` | No | Active authentication profile (`development`, `staging`, `production`). |\r\n\r\n### 4.3 Local Configuration File (`config.yaml` / `.env`)\r\n\r\nExample recommended configuration for operator workstations:\r\n\r\n```yaml\r\n# Client configuration file: config.yaml\r\nprofile: production\r\nnetwork:\r\n api_endpoint: "https://api.system.internal/v1"\r\n stream_url: "wss://stream.system.internal/telemetry"\r\n timeout_ms: 5000\r\n retry_attempts: 3\r\n\r\nsecurity:\r\n tls_verify: true\r\n client_cert_path: "/etc/pki/client/operator.crt"\r\n client_key_path: "/etc/pki/client/operator.key"\r\n\r\nui:\r\n theme: "dark"\r\n refresh_interval_sec: 1\r\n```\r\n\r\n---\r\n\r\n## 5. Step-by-Step Journey Execution Guide (`JRN-*`)\r\n\r\nEach subsection documents an end-to-end Journey, specifying authorized execution roles, starting conditions, and the step-by-step operating procedure.\r\n\r\n### 5.1 `JRN-JOURNEY-001`: User Journey Name\r\n\r\n- **Linked Use Case**: `UC-ACTION-001`\r\n- **Primary Actor**: `ACT-ROLE-USER-001`\r\n- **Authorized Roles**: `ROLE_USER`, `ROLE_OPERATOR`\r\n- **Required Execution Enclave**: Corporate Intranet or VPN access\r\n\r\n#### A. Preconditions\r\n1. User must have an active and authenticated session with their authorized role.\r\n2. The base entity or resource must be in `ACTIVE` state.\r\n\r\n#### B. Step-by-Step Procedure\r\n\r\n1. **Step 1: Operation Initiation**\r\n - **Action**: User navigates to the execution section or invokes the corresponding command:\r\n ```bash\r\n system-cli execute --journey JRN-JOURNEY-001 --input payload.json\r\n ```\r\n - **Required Input**: Resource identifier and validated parameters.\r\n - **Expected On-Screen Response**: System displays confirmation dialog with operation summary.\r\n\r\n2. **Step 2: Validation and Submission**\r\n - **Action**: User reviews parameters and confirms execution.\r\n - **System Behavior**: Client locally validates data schema and transmits signed request.\r\n\r\n3. **Step 3: Observable Outcome Verification**\r\n - **Success Outcome**: Console / interface displays success message `MSG-SUCCESS-001` with generated unique transaction ID.\r\n - **Final State**: Resource transitions to `PROCESSED` state.\r\n\r\n#### C. Alternative Flows and Exception Handling\r\n- **Unauthorized Access**: If an unauthorized role attempts to invoke the journey, the system blocks the action, outputs code `MSG-ERR-AUTH-403`, and records the access attempt in the audit trail.\r\n- **Connection Loss in Transit**: If connection is lost during step 2, client retries with exponential backoff up to 3 times before notifying user.\r\n\r\n---\r\n\r\n## 6. System Messages Catalog and Response Codes\r\n\r\nStructured matrix of key informational, warning, and error messages emitted by the application during its operational lifecycle:\r\n\r\n| Code | Severity | Literal Screen Message | Trigger / Context | Meaning for User | Recommended Corrective Action |\r\n| :--- | :--- | :--- | :--- | :--- | :--- |\r\n| **`MSG-SYS-100`** | `INFO` | `"Connection established successfully with server"` | Successful network handshake upon initializing session. | Application is online and ready to process commands. | None. Normal operation. |\r\n| **`MSG-SYS-200`** | `INFO` | `"Operation completed successfully. Transaction ID: [TX-ID]"` | Successful completion of a Journey or Use Case. | Transaction was persisted and acknowledged by backend. | Save `TX-ID` for tracking if required. |\r\n| **`MSG-WARN-301`** | `WARN` | `"High link latency (>500ms). Degraded mode active"` | Response metric exceeds real-time threshold. | Screen data may experience slight refresh delays. | Check network connection quality or bandwidth. |\r\n| **`MSG-WARN-302`** | `WARN` | `"Session expiring in 5 minutes"` | Authentication token approaching TTL expiry. | User will be logged out unless credential is refreshed. | Renew session by clicking alert or re-authenticating. |\r\n| **`MSG-ERR-401`** | `ERR-USER` | `"Invalid credentials or expired token. Access denied"` | Login authentication failure or expired token. | User identity could not be validated. | Re-enter credentials or request a new token. |\r\n| **`MSG-ERR-403`** | `ERR-USER` | `"Unauthorized action for assigned role [ROLE]"` | Attempted execution of Journey or command outside RBAC. | User role lacks permissions for this resource. | Contact administrator to request permission expansion. |\r\n| **`MSG-ERR-422`** | `ERR-USER` | `"Invalid payload: field [FIELD] does not match schema"` | Syntactic validation or business rule (`BR-*`) failure. | User-supplied data is invalid. | Correct indicated fields according to business rule. |\r\n| **`MSG-ERR-503`** | `ERR-SYS` | `"Service temporarily unavailable. Retrying..."` | Backend gateway unreachable or under scheduled maintenance. | Central server is not responding to requests. | Await automatic retries or check system status page. |\r\n\r\n---\r\n\r\n## 7. Frequently Asked Questions (FAQ) and Support\r\n\r\n- **What should I do if I lose connectivity while executing a Journey?** \r\n The application implements idempotency mechanisms. Once network connectivity is restored, verify resource status before retrying to prevent duplicate transactions.\r\n- **How do I request a user role change?** \r\n Contact the Security Administrator (`SecOps`) referencing your user ID and operational justification for the role change.\r\n\r\n---\r\n\r\n## 8. Revision History and Version Control\r\n\r\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\r\n| :--- | :--- | :--- | :--- | :--- |\r\n| **1.0.0** | 2026-09-15 | Documentation & Product Team | Initial User Manual generation | CHG-009 |\r\n';
|
|
14104
|
+
var STARTER_TEMPLATES_PRIVACY_DATA_ASSET_TEMPLATE_MD = '---\nid: DATA-ASSET-USER-PROFILE-001\ntype: data-asset\ntitle: User Profile & Identity Personal Data Asset\nstatus: draft\nversion: "1.0.0"\nschema-version: "1.0"\nclassification: confidential-pii # public, internal, confidential-pii, special-category-sensitive\npii-categories:\n - identifiers\n - contact\ndata-subjects:\n - ACT-USER-001\nfields:\n - name: email\n sensitivity: pii\n masking-strategy: sha256-salt\n - name: phone_number\n sensitivity: pii\n masking-strategy: redact\n - name: operator_callsign\n sensitivity: internal\n masking-strategy: none\nretention-period: 365d\nerasure-method: crypto-shredding\nowner-bounded-context: CMP-IDENTITY-SERVICE-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# DATA-ASSET-USER-PROFILE-001: User Profile & Identity Personal Data Asset\n\n## 1. Data Asset Inventory & Purpose\nDescribes the structure, storage medium, and operational boundary of the personal data asset governed under GDPR / ISO 27701.\n\n## 2. Field-Level Sensitivity & Masking Policy\n\n| Field Name | Sensitivity | Masking / Pseudonymization Strategy | Allowed in Logs | Allowed in AI Prompts |\n| :--- | :--- | :--- | :---: | :---: |\n| `email` | `pii` | `sha256-salt` | \u274C No | \u274C No |\n| `phone_number` | `pii` | `redact` | \u274C No | \u274C No |\n| `operator_callsign` | `internal` | `none` | \u2705 Yes | \u2705 Yes |\n\n## 3. Storage Limitation & Right to Erasure (GDPR Art. 17)\n- **Maximum Retention TTL**: `365d` after account deactivation.\n- **Erasure Mechanism**: `crypto-shredding` (destruction of per-subject encryption key and PII column purge).\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-10-17 | Privacy Officer (`agent-privacy-officer`) | Initial personal data asset inventory | CHG-PRIV-001 |\n';
|
|
14105
|
+
var STARTER_TEMPLATES_PRIVACY_DPIA_REQUEST_TEMPLATE_MD = '---\nid: DPIA-ASSESSMENT-001\ntype: dpia-request\ntitle: Data Protection Impact Assessment (DPIA / EIPD) Request\nstatus: pending-dpo-approval # pending-dpo-approval, approved, rejected\nversion: "1.0.0"\nschema-version: "1.0"\nropa-reference: PRIV-ROPA-USER-AUTH-001\ndata-assets:\n - DATA-ASSET-USER-PROFILE-001\nspecial-category-triggers:\n - "GDPR Art. 9 Special Category Data or Automated Profiling"\nresidual-risk-level: MEDIUM # LOW, MEDIUM, HIGH\n---\n\n# Data Protection Impact Assessment (DPIA / EIPD \u2014 GDPR Art. 35)\n\n## 1. Trigger & Necessity Assessment\n- **Associated ROPA**: `PRIV-ROPA-USER-AUTH-001`\n- **Data Assets Affected**: `DATA-ASSET-USER-PROFILE-001`\n- **Why a DPIA is Mandatory**: Processing involves `special_category_sensitive` data (biometrics, health, precise geolocation) or systematic automated profiling under GDPR Art. 35.\n\n## 2. Necessity, Proportionality & LINDDUN Risk Matrix\n\n| LINDDUN Threat Category | Identified Privacy Risk | Intrinsic Risk | Technical Mitigation (`PRIV-REQ-*`) | Residual Risk |\n| :--- | :--- | :---: | :--- | :---: |\n| **Identifiability** | Re-identification of operator from telemetry streams | HIGH | `PRIV-REQ-MASKING-001` (SHA-256 salted pseudonymization) | LOW |\n| **Disclosure of Information** | Plaintext PII leakage in error logs | HIGH | `PRIV-REQ-MASKING-001` (Redaction middleware) | LOW |\n\n## 3. Mandatory Human Sovereign Signatures (DPO & Legal)\n- [ ] **Data Protection Officer (DPO)**: Necessity, proportionality, and GDPR Art. 35 validation\n- [ ] **Legal / Privacy Counsel**: Lawful basis and cross-border transfer clauses verified\n- [ ] **Security Officer (CISO) / System Architect**: Cryptographic and enclave controls verified\n';
|
|
14106
|
+
var STARTER_TEMPLATES_PRIVACY_PRIVACY_REQ_TEMPLATE_MD = '---\nid: PRIV-REQ-MASKING-001\ntype: privacy-requirement\ntitle: Mandatory Pseudonymization and Log Redaction of Operator PII\nstatus: draft\nversion: "1.0.0"\nschema-version: "1.0"\nprivacy-principle: data-minimization # data-minimization, purpose-limitation, storage-limitation, accuracy, integrity-and-confidentiality, transparency-and-consent, data-subject-rights-arco, pseudonymization-anonymization\nlinddun-category: identifiability # linkability, identifiability, non-repudiation, detectability, disclosure-of-information, unawareness, non-compliance\ngoverns-ropa:\n - PRIV-ROPA-USER-AUTH-001\nprotects-data-assets:\n - DATA-ASSET-USER-PROFILE-001\nenforced-in-enclave: SEC-ENC-DMZ-001\ncompliance-references:\n - "GDPR-Art-25-Privacy-by-Design"\n - "GDPR-Art-32-Pseudonymization"\n - "ISO-27701-A.7.4"\nacceptance-format: gherkin\ncucumber-tags:\n - "@PRIV-REQ-MASKING-001"\n - "@privacy"\n - "@linddun"\nsupersedes: null\nsuperseded-by: null\n---\n\n# PRIV-REQ-MASKING-001: Mandatory Pseudonymization and Log Redaction of Operator PII\n\n## 1. Technical Privacy Control Statement\nThe system MUST pseudonymize or redact all `confidential-pii` fields (`email`, `phone_number`) prior to emitting structured application logs, telemetry traces, or external AI prompts, and MUST enforce automated TTL purge after `365d`.\n\n---\n\n## 2. Upstream Privacy Traceability (PDaC)\n\n| Dimension | Link / Artifact | Relationship Type | Status |\n| :--- | :--- | :--- | :--- |\n| **Record of Processing (ROPA)** | `PRIV-ROPA-USER-AUTH-001` | Governs Processing Activity | Validated |\n| **Protected Data Asset** | `DATA-ASSET-USER-PROFILE-001` | Enforces Field Masking & TTL | Validated |\n\n---\n\n## 3. Privacy Verification Criteria in Gherkin Format (Cucumber Privacy Tests)\n\n```gherkin\n@PRIV-REQ-MASKING-001 @privacy @linddun\nFeature: Personal Data Pseudonymization and Zero-PII Telemetry Logging\n As a Data Protection Officer (DPO)\n I want all personal identifiers to be redacted or salted-hashed before logging\n So that application logs and telemetry never expose raw personal data\n\n Scenario: Structured logger redacts PII fields automatically (Nominal Privacy Control)\n Given an authenticated operator session with email "operator@example.com" and phone "+34600112233"\n When the telemetry ingestion service emits an audit log entry\n Then the serialized log payload must not contain the literal string "operator@example.com"\n And the serialized log payload must not contain the literal string "+34600112233"\n And the email field must be replaced by a deterministic SHA-256 salted pseudonym\n\n Scenario: Right to erasure purges expired or revoked subject records\n Given a personal data record for subject "ACT-USER-001" exceeding the "365d" retention TTL\n When the automated retention enforcement job executes\n Then the personal data fields must be irreversibly erased via crypto-shredding\n```\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-10-17 | Privacy Officer (`agent-privacy-officer`) | Initial privacy control specification | CHG-PRIV-001 |\n';
|
|
14107
|
+
var STARTER_TEMPLATES_PRIVACY_PRIVACY_ROPA_TEMPLATE_MD = '---\nid: PRIV-ROPA-USER-AUTH-001\ntype: privacy-ropa\ntitle: Record of Processing Activity for Operator Authentication and Session Audit\nstatus: draft\nversion: "1.0.0"\nschema-version: "1.0"\nlawful-basis: contract # consent, contract, legal-obligation, vital-interests, public-task, legitimate-interests\nspecial-category-condition: null\nprocessing-purpose: "Authenticate authorized operators and maintain tamper-evident operational session audit trails."\nuse-cases:\n - UC-ACTION-001\ndata-assets:\n - DATA-ASSET-USER-PROFILE-001\ndata-subjects:\n - ACT-USER-001\nretention-ttl: 365d\ncross-border-transfer: false\ntransfer-safeguards: null\nsubprocessors: []\ndpia-required: false\ndpia-reference: null\nmitigated-by:\n - PRIV-REQ-MASKING-001\nsupersedes: null\nsuperseded-by: null\n---\n\n# PRIV-ROPA-USER-AUTH-001: Record of Processing Activity (GDPR Art. 30)\n\n## 1. Processing Activity Summary & Lawful Basis\n- **Lawful Basis (GDPR Art. 6.1)**: `contract` \u2014 Necessary for the performance of the operator service agreement.\n- **Purpose of Processing**: Authenticate authorized operators and maintain tamper-evident operational session audit trails.\n\n## 2. Linked Product & Data Artifacts\n\n| Dimension | Artifact ID | Relationship |\n| :--- | :--- | :--- |\n| **Triggering Use Cases** | `UC-ACTION-001` | Initiates personal data collection/processing |\n| **Data Assets Processed** | `DATA-ASSET-USER-PROFILE-001` | Personal data fields subject to minimization |\n| **Data Subjects** | `ACT-USER-001` | Natural persons whose data is processed |\n| **Governing Privacy Controls** | `PRIV-REQ-MASKING-001` | Technical privacy-by-design controls |\n\n## 3. International Transfers & Subprocessors\n- **Cross-Border Transfer Outside EEA**: `false`\n- **Authorized Subprocessors**: None (In-house processing within `SEC-ENC-DMZ-001`).\n\n---\n\n## 4. Revision History and Version Control\n\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\n| :--- | :--- | :--- | :--- | :--- |\n| **1.0.0** | 2026-10-17 | Privacy Officer (`agent-privacy-officer`) | Initial GDPR Art. 30 ROPA entry | CHG-PRIV-001 |\n';
|
|
13296
14108
|
var STARTER_TEMPLATES_PRODUCT_ACTOR_TEMPLATE_MD = '---\r\nid: ACT-NAME-001\r\ntype: actor\r\ntitle: Descriptive Actor Title\r\nstatus: draft\r\nversion: "1.0.0"\r\nschema-version: "1.0"\r\nrole-type: human-user # human-user, ai-agent, external-system, sensor-iot\r\ndescription: One-sentence summary of the role this actor performs in the system.\r\nsupersedes: null\r\nsuperseded-by: null\r\n---\r\n\r\n# ACT-NAME-001: Descriptive Actor Title\r\n\r\n## 1. Profile and Responsibility\r\nDescribes who this actor is, their operational context, and what goals they pursue when interacting with the product.\r\n\r\n## 2. System Touchpoints\r\n- Interaction channels (Web UI, REST API, WebSocket, Messaging).\r\n- Privilege level and latency/availability expectations.\r\n\r\n---\r\n\r\n## 3. Revision History and Version Control\r\n\r\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\r\n| :--- | :--- | :--- | :--- | :--- |\r\n| **1.0.0** | 2026-09-03 | Product Owner / Analyst | Initial actor profile creation | CHG-INIT-001 |\r\n';
|
|
13297
14109
|
var STARTER_TEMPLATES_PRODUCT_BUSINESS_RULE_TEMPLATE_MD = '---\r\nid: BR-DOMAIN-001\r\ntype: business-rule\r\ntitle: Business Rule Name\r\nstatus: draft\r\nversion: "1.0.0"\r\nschema-version: "1.0"\r\nenforcement-level: strict-invariant # strict-invariant, override-with-approval, guideline\r\ndefined-in: BC-CONTEXT-001\r\nuses-terms:\r\n - TERM-TERM-001\r\nsupersedes: null\r\nsuperseded-by: null\r\n---\r\n\r\n# BR-DOMAIN-001: Business Rule Name\r\n\r\n## 1. Rule Definition\r\nFormally establishes the business invariant that must not be violated under any circumstance.\r\n\r\n## 2. Business Rationale and Consequences\r\n- **Why it exists**: Economic, regulatory, or technical justification for the constraint.\r\n- **Action upon violation**: Immediate transaction rejection with a formal error code.\r\n\r\n---\r\n\r\n## 3. Revision History and Version Control\r\n\r\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\r\n| :--- | :--- | :--- | :--- | :--- |\r\n| **1.0.0** | 2026-09-03 | Product Owner / Analyst | Initial business rule definition | CHG-INIT-001 |\r\n';
|
|
13298
14110
|
var STARTER_TEMPLATES_PRODUCT_JOURNEY_TEMPLATE_MD = '---\r\nid: JRN-NAME-001\r\ntype: journey\r\ntitle: Descriptive User or Operator Journey Title\r\nstatus: draft\r\nversion: "1.0.0"\r\nschema-version: "1.0"\r\npersona: ACT-OPERATOR-001\r\nstages:\r\n - "Discovery and Planning"\r\n - "Configuration and Pre-flight"\r\n - "Mission Execution"\r\n - "Post-Analysis and Wrap-up"\r\ntouchpoints:\r\n - "Mission planning web portal"\r\n - "Ground control station (GCS)"\r\n - "Real-time telemetry dashboard"\r\n - "Flight report exporter"\r\nrelated-use-cases:\r\n - UC-PLAN-MISSION-001\r\n - UC-MONITOR-FLIGHT-001\r\npain-points:\r\n - "Latency when loading offline navigation maps"\r\n - "Complexity in manual flight plan reconciliation"\r\nsupersedes: null\r\nsuperseded-by: null\r\n---\r\n\r\n# JRN-NAME-001: Descriptive User or Operator Journey Title\r\n\r\n## 1. Actor / Primary Persona Profile\r\n- **Protagonist Actor**: `ACT-OPERATOR-001`\r\n- **Main Goal**: Complete operational workflow with high efficiency, safety, and real-time visibility.\r\n\r\n---\r\n\r\n## 2. Journey Stages Map\r\n\r\n| Stage | User Goal | Touchpoints | Frictions / Pain Points |\r\n| :--- | :--- | :--- | :--- |\r\n| **1. Discovery and Planning** | Design route and validate operational constraints | Mission planning web portal | Complexity in manual flight plan reconciliation |\r\n| **2. Configuration and Pre-flight** | Verify subsystem health and link integrity | Ground control station (GCS) | Latency when loading offline navigation maps |\r\n| **3. Mission Execution** | Supervise telemetry and respond to alerts | Real-time telemetry dashboard | None detected in nominal flow |\r\n| **4. Post-Analysis and Wrap-up** | Export mission logs and performance metrics | Flight report exporter | Telemetry consolidation latency |\r\n\r\n---\r\n\r\n## 3. Traceability to Use Cases and Product\r\n\r\n- `UC-PLAN-MISSION-001`: Planning and validation of safe corridors.\r\n- `UC-MONITOR-FLIGHT-001`: Ingestion and visualization of real-time telemetry.\r\n\r\n---\r\n\r\n## 4. Revision History\r\n\r\n| Version | Date | Author / Agent | Change Description | Change Reference (Change/PR) |\r\n| :--- | :--- | :--- | :--- | :--- |\r\n| **1.0.0** | 2026-09-23 | Product Manager / UX Lead | Initial operator journey definition | CHG-INIT-001 |\r\n';
|
|
@@ -13344,10 +14156,10 @@ Describes the adversary's profile, technical skill level, available resources, a
|
|
|
13344
14156
|
| :--- | :--- | :--- | :--- | :--- |\r
|
|
13345
14157
|
| **1.0.0** | 2026-09-03 | Security Officer / Threat Modeler | Initial threat profile characterization | CHG-SEC-001 |\r
|
|
13346
14158
|
`;
|
|
13347
|
-
var STARTER_TEMPLATES_WORKFLOW_AGENT_HANDOFF_TEMPLATE_MD = '# Workflow Handoff Template\r\n\r\n> **Canonical reference:** [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md) and [`process/01_governance_and_roles.md`](../../process/01_governance_and_roles.md).\r\n>\r\n> **Activation Criterion by Autonomy Mode:**\r\n> - \u{1F7E2} **`AUTONOMOUS` (or exclusive supervision at the end in PR/CI):** OMITTED. The agent executes and delivers without interrupting the user with this handoff block.\r\n> - \u{1F7E1} **`HUMAN_REVIEW_PLAN` | \u{1F7E0} `AMBIGUOUS` | \u{1F534} `HIGH_RISK_MANUAL`:** MANDATORY. Upon completing the phase or proposal, the agent emits this block and **halts**, granting visibility to the user and relinquishing control.\r\n\r\n---\r\n\r\n### \u{1F504} Workflow Handoff\r\n\r\n- **Completed Phase / Activity**: `[Current phase, e.g. Product Definition / Threat Modeling / Architecture / SDD Implementation]`\r\n- **Acting Role**: `[agent-product-analyst | agent-threat-modeler | agent-system-architect | agent-developer | agent-expert-user | agent-security-auditor | agent-compliance-checker]`\r\n- **Task Autonomy Mode**: `[HUMAN_REVIEW_PLAN | AMBIGUOUS | HIGH_RISK_MANUAL]`\r\n- **Produced Deliverables**:\r\n - [x] `[Path or ID of generated artifact, e.g. specs/product/uc-mission.md]`\r\n - [x] `[Path or ID of generated artifact, e.g. quality-report.md]`\r\n\r\n- **Recommended Next Role(s) in Workflow**:\r\n - `[Suggested role name, e.g. agent-threat-modeler]`: `[Technical rationale, e.g. Model STRIDE adversaries and mitigate abuse cases]`\r\n - *(Optional)* `[Alternative role, e.g. agent-expert-user]`: `[Technical rationale, e.g. Evaluate UX and MVP boundary]`\r\n\r\n- **Suggested Invocation Prompt**:\r\n > "Act as `[next-role]` and proceed with the `[next phase]` phase on the generated deliverables: `[key artifacts]`."\r\n\r\n- **Human Action Window (User Sovereignty and Priority)**:\r\n - \u270B **Review and Validate**: Inspect generated artifacts and validate alignment with project vision before proceeding.\r\n - \u270F\uFE0F **Edit Directly**: Modify requirements, code, or acceptance criteria directly at any time.\r\n - \u{1F6D1} **Pause, Divert, or Discard**: Freeze workflow, redirect toward another goal, or discard proposal.\r\n - \u25B6\uFE0F **Delegate to Next Agent**: If satisfied with output, execute suggested prompt to continue the chain.\r\n\r\n---\r\n';
|
|
14159
|
+
var STARTER_TEMPLATES_WORKFLOW_AGENT_HANDOFF_TEMPLATE_MD = '# Workflow Handoff Template\r\n\r\n> **Canonical reference:** [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md) and [`process/01_governance_and_roles.md`](../../process/01_governance_and_roles.md).\r\n>\r\n> **Activation Criterion by Autonomy Mode:**\r\n> - \u{1F7E2} **`AUTONOMOUS` (or exclusive supervision at the end in PR/CI):** OMITTED. The agent executes and delivers without interrupting the user with this handoff block.\r\n> - \u{1F7E1} **`HUMAN_REVIEW_PLAN` | \u{1F7E0} `AMBIGUOUS` | \u{1F534} `HIGH_RISK_MANUAL`:** MANDATORY. Upon completing the phase or proposal, the agent emits this block and **halts**, granting visibility to the user and relinquishing control.\r\n\r\n---\r\n\r\n### \u{1F504} Workflow Handoff\r\n\r\n- **Completed Phase / Activity**: `[Current phase, e.g. Product Definition / Threat Modeling / Privacy Modeling / Architecture / SDD Implementation]`\r\n- **Acting Role**: `[agent-product-analyst | agent-threat-modeler | agent-privacy-officer | agent-system-architect | agent-developer | agent-expert-user | agent-security-auditor | agent-compliance-checker]`\r\n- **Task Autonomy Mode**: `[HUMAN_REVIEW_PLAN | AMBIGUOUS | HIGH_RISK_MANUAL]`\r\n- **Produced Deliverables**:\r\n - [x] `[Path or ID of generated artifact, e.g. specs/product/uc-mission.md]`\r\n - [x] `[Path or ID of generated artifact, e.g. quality-report.md]`\r\n\r\n- **Recommended Next Role(s) in Workflow**:\r\n - `[Suggested role name, e.g. agent-threat-modeler]`: `[Technical rationale, e.g. Model STRIDE adversaries and mitigate abuse cases]`\r\n - *(Optional)* `[Alternative role, e.g. agent-expert-user]`: `[Technical rationale, e.g. Evaluate UX and MVP boundary]`\r\n\r\n- **Suggested Invocation Prompt**:\r\n > "Act as `[next-role]` and proceed with the `[next phase]` phase on the generated deliverables: `[key artifacts]`."\r\n\r\n- **Human Action Window (User Sovereignty and Priority)**:\r\n - \u270B **Review and Validate**: Inspect generated artifacts and validate alignment with project vision before proceeding.\r\n - \u270F\uFE0F **Edit Directly**: Modify requirements, code, or acceptance criteria directly at any time.\r\n - \u{1F6D1} **Pause, Divert, or Discard**: Freeze workflow, redirect toward another goal, or discard proposal.\r\n - \u25B6\uFE0F **Delegate to Next Agent**: If satisfied with output, execute suggested prompt to continue the chain.\r\n\r\n---\r\n';
|
|
13348
14160
|
var STARTER__GITHUB_PULL_REQUEST_TEMPLATE_MD = "## 1. SDD Identification and Traceability\r\n\r\n- **SDD Change Specification**: `specs/changes/active/<change-id>/` <!-- Link to active change directory -->\r\n- **PDaC Handoff Sidecar**: `specs/changes/active/<change-id>/handoff.yaml` <!-- ID: HOF-* -->\r\n- **Git Hierarchy Tier (4 Tiers)**:\r\n - [ ] Tier 4: `task/<PARENT-ID>/<TSK-ID>-<slug>` \u2794 `feat/<PARENT-ID>-<slug>`\r\n - [ ] Tier 3: `feat/<FEAT-ID>-<slug>` \u2794 `release/vX.Y.Z`\r\n - [ ] Tier 2: `release/vX.Y.Z` \u2794 `main`\r\n- **Linked Issues**: Closes #... / Refs #...\r\n\r\n---\r\n\r\n## 2. \u{1F4CB} Plan Execution Matrix and Testing Status (`X` vs `O`)\r\n\r\n> [!IMPORTANT]\r\n> **Non-Negotiable Total Exhaustiveness Rule**:\r\n> This table must include **each and every item identified for implementation** in the delivery plan (originating from `tasks.md`, the SDD specification, or issue criteria), without omitting any or creating abstract groupings.\r\n>\r\n> **Mandatory Marking Convention**:\r\n> - **`[X]` (Completed and Tested)**: Item is 100% implemented and has verifiable automated tests on disk (`tests/` or `.feature`) passing green.\r\n> - **`[O]` (Problem / Blocked)**: If there was any issue, technical limitation, failing test, or deferred scope, it must be marked with `[O]` and **full mandatory justification is required**:\r\n> 1. **Technical root cause** or encountered limitation.\r\n> 2. **Impact** on increment or system.\r\n> 3. **Mitigation** or rationale for deferral.\r\n> 4. **Formal reference** to tracking issue (GitHub Issue or `ADR-TECH-DEBT-*`).\r\n>\r\n> *Any PR with omitted planned items or unjustified `[O]` will be immediately blocked and rejected by the Tech Lead.*\r\n\r\n| Task / Item ID | Planned Description | Status (`[X]` / `[O]`) | Test Evidence on Disk or Mandatory Justification of `[O]` |\r\n| :--- | :--- | :---: | :--- |\r\n| `TSK-001` | <!-- e.g. Contract DTOs and Interfaces Definition --> | **[X]** | Covered in `tests/unit/dto.spec.ts` (100% pass) |\r\n| `TSK-002` | <!-- e.g. Network disconnection resilience --> | **[O]** | **Root cause:** TCP socket mock exhibits race conditions in CI.<br>**Impact:** Low in prod, flaky test.<br>**Mitigation:** Temporary extended timeout; tracked in issue #... |\r\n\r\n---\r\n\r\n## 3. \u{1F5FA}\uFE0F Weak Points Map and Risk Hotspots (Weak Points Hotspots)\r\n\r\n### A. Complexity Hotspots\r\n<!-- Record functions nearing quality-policy.yaml thresholds: CC > 7 (max 10), Cognitive > 10 (max 15), LOC > 30 (max 40), MI < 70 (min 50/65) -->\r\n| File | Function / Module | Metrics (CC / Cognitive / LOC / MI) | Technical Maintainability Justification |\r\n| :--- | :--- | :---: | :--- |\r\n| <!-- e.g. src/engine.ts --> | <!-- parsePayload() --> | CC: 8, Cog: 11, LOC: 32, MI: 72 | Deterministic parser without recursion; exhaustively tested. |\r\n\r\n### B. Edge Cases and Blind Spots\r\n<!-- Scenarios not covered by automated unit tests (concurrency, network timeouts, memory, jitter) -->\r\n- [ ] **Edge Case 1**: <!-- Scenario description, estimated risk, and operational mitigation -->\r\n- [ ] **Edge Case 2**: <!-- Scenario description, estimated risk, and operational mitigation -->\r\n\r\n### C. AI Assumptions\r\n<!-- Behaviors or heuristics assumed by the agent during implementation that require critical human review -->\r\n- [ ] **Assumption 1**: <!-- e.g. Assumed payload always arrives pre-parsed in UTF-8 -->\r\n- [ ] **Assumption 2**: <!-- e.g. Default timeout set to 5000ms as not stipulated in spec -->\r\n\r\n---\r\n\r\n## 4. \u{1F6E1}\uFE0F Attack Surface and Cybersecurity (STRIDE / Zero Trust)\r\n\r\n- [ ] **New External Channels**: Does it introduce HTTP endpoints, sockets, IPC channels, or brokers?\r\n- [ ] **Sanitization and Inputs**: Are all external inputs validated with strict typing schemas (Zod/JSON Schema)?\r\n- [ ] **Insecure Serialization**: Is polymorphic deserialization or dynamic code evaluation avoided?\r\n- [ ] **Secrets and Enclaves**: Are cryptographic keys, credentials, sensitive env vars, or enclaves (`SEC-ENC-*`) handled?\r\n- [ ] **Mitigated Security Requirements**: Implemented IDs (e.g. `SEC-REQ-*`) and associated tests (`SEC-TEST-*` or `.feature`).\r\n\r\n---\r\n\r\n## 5. \u{1F4E6} Dependencies and Licenses Inspection\r\n\r\n- **New Dependencies Added**:\r\n | Package | Version | License Type | `license-policy.yaml` Verification |\r\n | :--- | :---: | :---: | :---: |\r\n | <!-- e.g. zod --> | <!-- ^3.22.4 --> | <!-- MIT --> | <!-- \u2714 Compliant (Permissive) --> |\r\n- [ ] Zero dependencies with prohibited licenses (GPLv3/AGPL/unapproved commercial).\r\n- [ ] Verification executed successfully (`pnpm run verify:licenses`).\r\n\r\n---\r\n\r\n## 6. \u2705 Deterministic Pre-Flight Checklist (Release Gates)\r\n\r\n- [ ] **Strict Typing and Linter**: `pnpm run typecheck` (zero errors, zero unjustified suppressions).\r\n- [ ] **Quality Gate**: `pnpm run verify:quality` (CC $\\le 10$, Cognitive $\\le 15$, MI $\\ge 50$, LOC $\\le 40$).\r\n- [ ] **BDD / Unit Tests**: `pnpm run verify:testing` (Gherkin scenarios synchronized and 100% passing).\r\n- [ ] **360\xB0 Traceability**: `pnpm run verify:traceability` (no orphan requirements).\r\n- [ ] **Open Source Licenses**: `pnpm run verify:licenses` (strict policy compliance).\r\n- [ ] **Schema Compliance**: `pnpm run verify:schemas` (100% of artifacts conform to JSON Schema).\r\n- [ ] **Full Test Suite**: `pnpm run test:all` / `pnpm run verify:all` (general green CI approval).\r\n\r\n---\r\n\r\n## 7. \u{1F6A8} Contingency Plan, Observability, and Rollback\r\n\r\n- **Observability Metrics and Alarms**: <!-- What metrics (p99 latency, 5xx error rate, memory) or logs should be monitored post-deployment? -->\r\n- **Rollback Procedure**: <!-- Exact command or procedure to revert change without collateral impact (e.g. git revert -m 1 <sha>) -->\r\n\r\n---\r\n\r\n## 8. \u{1F4CA} AI-SDLC: Aggregated KPIs Summary\r\n\r\n<!-- AI-SDLC-KPI-SUMMARY-START -->\r\n| Metric | Human | Total PR |\r\n| :--- | :---: | :---: |\r\n| **Commits Made** | - | **-** |\r\n| **Lines Added / Modif.** | - | **-** |\r\n| **Active Development Time** | - | **-** |\r\n| **Consumed Tokens (In+Out)** | - | **-** |\r\n| **Estimated Cost (\u20AC/$)** | \u2014 (Labor) | **-** |\r\n\r\n> *This block is updated automatically via `aisdlc kpi pr` or the CI workflow.*\r\n<!-- AI-SDLC-KPI-SUMMARY-END -->\r\n";
|
|
13349
14161
|
var STARTER_COMPLIANCE_LICENSE_MANIFEST_YAML = '# ==============================================================================\r\n# AI-SDLC: Manifiesto de Cumplimiento de Licencias Evaluadas\r\n# ==============================================================================\r\n# Verificado contra: /license-policy.yaml\r\n# ==============================================================================\r\n\r\nevaluated_dependencies:\r\n - package: "@modelcontextprotocol/sdk"\r\n version: "1.0.4"\r\n spdx_license: "MIT"\r\n category: "permissive_free"\r\n status: "APPROVED"\r\n usage: "SDK oficial para servidor Model Context Protocol."\r\n commercial_payment_required: false\r\n\r\n - package: "commander"\r\n version: "12.1.0"\r\n spdx_license: "MIT"\r\n category: "permissive_free"\r\n status: "APPROVED"\r\n usage: "Parser de l\xEDnea de comandos para @ai-sdlc/cli."\r\n commercial_payment_required: false\r\n\r\n - package: "zod"\r\n version: "3.23.8"\r\n spdx_license: "MIT"\r\n category: "permissive_free"\r\n status: "APPROVED"\r\n usage: "Validaci\xF3n de esquemas y tipos en runtime."\r\n commercial_payment_required: false\r\n\r\n - package: "js-yaml"\r\n version: "4.1.0"\r\n spdx_license: "MIT"\r\n category: "permissive_free"\r\n status: "APPROVED"\r\n usage: "Parser y serializador YAML para especificaciones y frontmatter."\r\n commercial_payment_required: false\r\n\r\n - package: "chalk"\r\n version: "5.3.0"\r\n spdx_license: "MIT"\r\n category: "permissive_free"\r\n status: "APPROVED"\r\n usage: "Estilizado de salida en terminal para comandos CLI."\r\n commercial_payment_required: false\r\n\r\n - package: "ajv"\r\n version: "8.17.1"\r\n spdx_license: "MIT"\r\n category: "permissive_free"\r\n status: "APPROVED"\r\n usage: "Validador JSON Schema para ProductShape, arc42 y SDD."\r\n commercial_payment_required: false\r\n';
|
|
13350
|
-
var STARTER_PROCESS_README = "# AI-SDLC: Process & Governance Framework\n\nThis directory hosts the deterministic governance, verification gates, and lifecycle protocols for AI-assisted software development.\n\n## Core Protocols & Lifecycle\n- **Phase 0 (Product Definition)**: `specs/product/` (Requirements `FR-*`, Use Cases `UC-*`, Actors `ACT-*`, Rules `BR-*`).\n- **Phase 1 (System Architecture)**: `templates/architecture/` (arc42 + NAF v4, `CMP-*`, Decisions `ADR-*`).\n- **Phase 2 (Cybersecurity Triad)**: `templates/security/` (Threat Actors `ACT-THREAT-*`, Abuse Cases `ABUSE-*`, Security Reqs `SEC-REQ-*`).\n- **Phase 3 (Spec-Driven Delivery - SDD)**: `specs/changes/active/<change-id>/` (`proposal.md`, `spec.md`, `design.md`, `tasks.md`, `handoff.yaml`).\n- **Phase 4 (Continuous Quality Gates & Verification)**:\n - Quality Gate: `npx aisdlc verify quality` (CC $\\le 10$, MI $\\ge 50$, LOC $\\le 40$)\n - BDD Testing: `npx aisdlc verify testing`\n - Traceability: `npx aisdlc verify traceability`\n - Licenses: `npx aisdlc verify licenses`\n - Schemas: `npx aisdlc verify schemas`\n - Release Gates: `npx aisdlc check` / `npx aisdlc verify all`\n";
|
|
14162
|
+
var STARTER_PROCESS_README = "# AI-SDLC: Process & Governance Framework\n\nThis directory hosts the deterministic governance, verification gates, and lifecycle protocols for AI-assisted software development.\n\n## Core Protocols & Lifecycle\n- **Phase 0 (Product Definition)**: `specs/product/` (Requirements `FR-*`, Use Cases `UC-*`, Actors `ACT-*`, Rules `BR-*`).\n- **Phase 1 (System Architecture)**: `templates/architecture/` (arc42 + NAF v4, `CMP-*`, Decisions `ADR-*`).\n- **Phase 2 (Cybersecurity Triad)**: `templates/security/` (Threat Actors `ACT-THREAT-*`, Abuse Cases `ABUSE-*`, Security Reqs `SEC-REQ-*`).\n- **Phase 2b (Privacy-by-Design as Code)**: `templates/privacy/` (Data Assets `DATA-ASSET-*`, ROPA `PRIV-ROPA-*`, Privacy Reqs `PRIV-REQ-*`).\n- **Phase 3 (Spec-Driven Delivery - SDD)**: `specs/changes/active/<change-id>/` (`proposal.md`, `spec.md`, `design.md`, `tasks.md`, `handoff.yaml`).\n- **Phase 4 (Continuous Quality Gates & Verification)**:\n - Quality Gate: `npx aisdlc verify quality` (CC $\\le 10$, MI $\\ge 50$, LOC $\\le 40$)\n - BDD Testing: `npx aisdlc verify testing`\n - Traceability: `npx aisdlc verify traceability`\n - Licenses: `npx aisdlc verify licenses`\n - Privacy & Data Protection: `npx aisdlc verify privacy`\n - Schemas: `npx aisdlc verify schemas`\n - Release Gates: `npx aisdlc check` / `npx aisdlc verify all`\n";
|
|
13351
14163
|
var STARTER_BASE_TEMPLATES = [
|
|
13352
14164
|
{ relPath: "templates/ci/.gitlab-ci.yml", content: STARTER_TEMPLATES_CI__GITLAB_CI_YML },
|
|
13353
14165
|
{ relPath: "templates/ci/azure-pipelines.yml", content: STARTER_TEMPLATES_CI_AZURE_PIPELINES_YML },
|
|
@@ -13359,6 +14171,10 @@ var STARTER_BASE_TEMPLATES = [
|
|
|
13359
14171
|
{ relPath: "templates/compliance/commercial-acquisition-request.template.md", content: STARTER_TEMPLATES_COMPLIANCE_COMMERCIAL_ACQUISITION_REQUEST_TEMPLATE_MD },
|
|
13360
14172
|
{ relPath: "templates/manuals/production-manual.template.md", content: STARTER_TEMPLATES_MANUALS_PRODUCTION_MANUAL_TEMPLATE_MD },
|
|
13361
14173
|
{ relPath: "templates/manuals/user-manual.template.md", content: STARTER_TEMPLATES_MANUALS_USER_MANUAL_TEMPLATE_MD },
|
|
14174
|
+
{ relPath: "templates/privacy/data-asset.template.md", content: STARTER_TEMPLATES_PRIVACY_DATA_ASSET_TEMPLATE_MD },
|
|
14175
|
+
{ relPath: "templates/privacy/dpia-request.template.md", content: STARTER_TEMPLATES_PRIVACY_DPIA_REQUEST_TEMPLATE_MD },
|
|
14176
|
+
{ relPath: "templates/privacy/privacy-req.template.md", content: STARTER_TEMPLATES_PRIVACY_PRIVACY_REQ_TEMPLATE_MD },
|
|
14177
|
+
{ relPath: "templates/privacy/privacy-ropa.template.md", content: STARTER_TEMPLATES_PRIVACY_PRIVACY_ROPA_TEMPLATE_MD },
|
|
13362
14178
|
{ relPath: "templates/product/actor.template.md", content: STARTER_TEMPLATES_PRODUCT_ACTOR_TEMPLATE_MD },
|
|
13363
14179
|
{ relPath: "templates/product/business-rule.template.md", content: STARTER_TEMPLATES_PRODUCT_BUSINESS_RULE_TEMPLATE_MD },
|
|
13364
14180
|
{ relPath: "templates/product/journey.template.md", content: STARTER_TEMPLATES_PRODUCT_JOURNEY_TEMPLATE_MD },
|
|
@@ -13476,6 +14292,52 @@ categories:
|
|
|
13476
14292
|
- "SSPL-1.0"
|
|
13477
14293
|
- "BSL-1.1"
|
|
13478
14294
|
`;
|
|
14295
|
+
var STARTER_PRIVACY_POLICY = `# ==============================================================================
|
|
14296
|
+
# AI-SDLC: Data Protection & Privacy-by-Design Governance Policy (PDaC)
|
|
14297
|
+
# ==============================================================================
|
|
14298
|
+
version: "1.0"
|
|
14299
|
+
project: "Standard AI-SDLC Project"
|
|
14300
|
+
regulatory_frameworks:
|
|
14301
|
+
- "GDPR"
|
|
14302
|
+
- "LOPDGDD"
|
|
14303
|
+
- "ISO-27701"
|
|
14304
|
+
default_pii_action: "DENY_UNCLASSIFIED"
|
|
14305
|
+
|
|
14306
|
+
classification_levels:
|
|
14307
|
+
PUBLIC:
|
|
14308
|
+
encryption_at_rest: false
|
|
14309
|
+
encryption_in_transit: true
|
|
14310
|
+
allow_in_logs: true
|
|
14311
|
+
allow_in_llm_prompts: true
|
|
14312
|
+
INTERNAL:
|
|
14313
|
+
encryption_at_rest: true
|
|
14314
|
+
encryption_in_transit: true
|
|
14315
|
+
allow_in_logs: true
|
|
14316
|
+
allow_in_llm_prompts: true
|
|
14317
|
+
CONFIDENTIAL_PII:
|
|
14318
|
+
encryption_at_rest: true
|
|
14319
|
+
encryption_in_transit: true
|
|
14320
|
+
allow_in_logs: false
|
|
14321
|
+
masking_in_logs: "HASH_OR_REDACT"
|
|
14322
|
+
allow_in_llm_prompts: false
|
|
14323
|
+
require_retention_policy: true
|
|
14324
|
+
require_erasure_mechanism: true
|
|
14325
|
+
RESTRICTED_SENSITIVE_PII:
|
|
14326
|
+
encryption_at_rest: true
|
|
14327
|
+
field_level_encryption: true
|
|
14328
|
+
encryption_in_transit: true
|
|
14329
|
+
allow_in_logs: false
|
|
14330
|
+
allow_in_llm_prompts: false
|
|
14331
|
+
require_dpia_approval: true
|
|
14332
|
+
require_explicit_consent_or_art9_basis: true
|
|
14333
|
+
|
|
14334
|
+
cross_border_transfers:
|
|
14335
|
+
allowed_regions:
|
|
14336
|
+
- "EU"
|
|
14337
|
+
- "EEA"
|
|
14338
|
+
require_scc_for_external: true
|
|
14339
|
+
approved_subprocessors: []
|
|
14340
|
+
`;
|
|
13479
14341
|
var STARTER_TASK_TEMPLATE = `---
|
|
13480
14342
|
tasks:
|
|
13481
14343
|
- id: "TSK-001-setup"
|
|
@@ -13529,8 +14391,8 @@ var STARTER_WORKFLOW_HANDOFF_TEMPLATE = `# Workflow Handoff Template
|
|
|
13529
14391
|
|
|
13530
14392
|
### \u{1F504} Workflow Handoff
|
|
13531
14393
|
|
|
13532
|
-
- **Completed Phase / Activity**: \`[Current phase, e.g. Product Definition / Threat Modeling / Architecture / SDD Implementation]\`
|
|
13533
|
-
- **Acting Role**: \`[agent-product-analyst | agent-threat-modeler | agent-system-architect | agent-developer | agent-expert-user | agent-security-auditor | agent-compliance-checker]\`
|
|
14394
|
+
- **Completed Phase / Activity**: \`[Current phase, e.g. Product Definition / Threat Modeling / Privacy Modeling / Architecture / SDD Implementation]\`
|
|
14395
|
+
- **Acting Role**: \`[agent-product-analyst | agent-threat-modeler | agent-privacy-officer | agent-system-architect | agent-developer | agent-expert-user | agent-security-auditor | agent-compliance-checker]\`
|
|
13534
14396
|
- **Task Autonomy Mode**: \`[HUMAN_REVIEW_PLAN | AMBIGUOUS | HIGH_RISK_MANUAL]\`
|
|
13535
14397
|
- **Produced Deliverables**:
|
|
13536
14398
|
- [x] \`[Path or ID of generated artifact, e.g. specs/product/uc-mission.md]\`
|
|
@@ -14117,6 +14979,7 @@ var BASE_DIRECTORIES = [
|
|
|
14117
14979
|
"compliance",
|
|
14118
14980
|
"schemas/product",
|
|
14119
14981
|
"schemas/security",
|
|
14982
|
+
"schemas/privacy",
|
|
14120
14983
|
"schemas/compliance",
|
|
14121
14984
|
"schemas/architecture",
|
|
14122
14985
|
"schemas/safety",
|
|
@@ -14126,6 +14989,7 @@ var BASE_DIRECTORIES = [
|
|
|
14126
14989
|
"schemas/ide",
|
|
14127
14990
|
"templates/product",
|
|
14128
14991
|
"templates/security",
|
|
14992
|
+
"templates/privacy",
|
|
14129
14993
|
"templates/compliance",
|
|
14130
14994
|
"templates/architecture",
|
|
14131
14995
|
"templates/safety",
|
|
@@ -14170,6 +15034,7 @@ function collectStarterFiles(ciProvider, agentFiles = [], archGranularity = "min
|
|
|
14170
15034
|
const files = [
|
|
14171
15035
|
{ relPath: "quality-policy.yaml", content: STARTER_QUALITY_POLICY },
|
|
14172
15036
|
{ relPath: "license-policy.yaml", content: STARTER_LICENSE_POLICY },
|
|
15037
|
+
{ relPath: "privacy-policy.yaml", content: STARTER_PRIVACY_POLICY },
|
|
14173
15038
|
...STARTER_BASE_TEMPLATES,
|
|
14174
15039
|
...STARTER_SCHEMAS.map((s) => ({ relPath: s.relPath, content: s.content })),
|
|
14175
15040
|
...getCiWorkflowFiles(ciProvider),
|
|
@@ -14191,6 +15056,7 @@ var STANDARD_AISDLC_SCRIPTS = {
|
|
|
14191
15056
|
check: "aisdlc check",
|
|
14192
15057
|
"check:fix": "aisdlc check --fix",
|
|
14193
15058
|
"verify:quality": "aisdlc verify quality",
|
|
15059
|
+
"verify:privacy": "aisdlc verify privacy",
|
|
14194
15060
|
"verify:all": "aisdlc verify all",
|
|
14195
15061
|
"change:new": "aisdlc change new"
|
|
14196
15062
|
};
|
|
@@ -14298,12 +15164,14 @@ exports.BRANCH_PATTERNS = BRANCH_PATTERNS;
|
|
|
14298
15164
|
exports.DEFAULT_EXCLUDED_PATTERNS = DEFAULT_EXCLUDED_PATTERNS;
|
|
14299
15165
|
exports.DEFAULT_EXCLUDES = DEFAULT_EXCLUDES;
|
|
14300
15166
|
exports.DEFAULT_EXTENSIONS = DEFAULT_EXTENSIONS;
|
|
15167
|
+
exports.DEFAULT_PRIVACY_POLICY = DEFAULT_PRIVACY_POLICY;
|
|
14301
15168
|
exports.DEFAULT_SAST_EXCLUDES = DEFAULT_SAST_EXCLUDES;
|
|
14302
15169
|
exports.GENERAL_SOURCE_EXTENSIONS = GENERAL_SOURCE_EXTENSIONS;
|
|
14303
15170
|
exports.KPI_SUMMARY_END_TAG = KPI_SUMMARY_END_TAG;
|
|
14304
15171
|
exports.KPI_SUMMARY_START_TAG = KPI_SUMMARY_START_TAG;
|
|
14305
15172
|
exports.LIFECYCLE_SKILL_TEMPLATES = LIFECYCLE_SKILL_TEMPLATES;
|
|
14306
15173
|
exports.OpenSpecAdapter = OpenSpecAdapter;
|
|
15174
|
+
exports.PII_SAST_RULES = PII_SAST_RULES;
|
|
14307
15175
|
exports.PREPARE_COMMIT_MSG_SCRIPT = PREPARE_COMMIT_MSG_SCRIPT;
|
|
14308
15176
|
exports.PROMPT_INJECTION_SIGNATURES = PROMPT_INJECTION_SIGNATURES;
|
|
14309
15177
|
exports.PROTECTED_BYPASS_PATTERNS = PROTECTED_BYPASS_PATTERNS;
|
|
@@ -14317,6 +15185,10 @@ exports.SCHEMA_SCHEMAS_COMPLIANCE_QUALITY_POLICY_SCHEMA_JSON = SCHEMA_SCHEMAS_CO
|
|
|
14317
15185
|
exports.SCHEMA_SCHEMAS_IDE_MCP_CONFIG_SCHEMA_JSON = SCHEMA_SCHEMAS_IDE_MCP_CONFIG_SCHEMA_JSON;
|
|
14318
15186
|
exports.SCHEMA_SCHEMAS_MANUALS_PRODUCTION_MANUAL_SCHEMA_JSON = SCHEMA_SCHEMAS_MANUALS_PRODUCTION_MANUAL_SCHEMA_JSON;
|
|
14319
15187
|
exports.SCHEMA_SCHEMAS_MANUALS_USER_MANUAL_SCHEMA_JSON = SCHEMA_SCHEMAS_MANUALS_USER_MANUAL_SCHEMA_JSON;
|
|
15188
|
+
exports.SCHEMA_SCHEMAS_PRIVACY_DATA_ASSET_SCHEMA_JSON = SCHEMA_SCHEMAS_PRIVACY_DATA_ASSET_SCHEMA_JSON;
|
|
15189
|
+
exports.SCHEMA_SCHEMAS_PRIVACY_PRIVACY_POLICY_SCHEMA_JSON = SCHEMA_SCHEMAS_PRIVACY_PRIVACY_POLICY_SCHEMA_JSON;
|
|
15190
|
+
exports.SCHEMA_SCHEMAS_PRIVACY_PRIVACY_REQ_SCHEMA_JSON = SCHEMA_SCHEMAS_PRIVACY_PRIVACY_REQ_SCHEMA_JSON;
|
|
15191
|
+
exports.SCHEMA_SCHEMAS_PRIVACY_PRIVACY_ROPA_SCHEMA_JSON = SCHEMA_SCHEMAS_PRIVACY_PRIVACY_ROPA_SCHEMA_JSON;
|
|
14320
15192
|
exports.SCHEMA_SCHEMAS_PRODUCT_ACTOR_SCHEMA_JSON = SCHEMA_SCHEMAS_PRODUCT_ACTOR_SCHEMA_JSON;
|
|
14321
15193
|
exports.SCHEMA_SCHEMAS_PRODUCT_BUSINESS_RULE_SCHEMA_JSON = SCHEMA_SCHEMAS_PRODUCT_BUSINESS_RULE_SCHEMA_JSON;
|
|
14322
15194
|
exports.SCHEMA_SCHEMAS_PRODUCT_JOURNEY_SCHEMA_JSON = SCHEMA_SCHEMAS_PRODUCT_JOURNEY_SCHEMA_JSON;
|
|
@@ -14371,6 +15243,7 @@ exports.STARTER_GITHUB_PULL_REQUEST_TEMPLATE = STARTER_GITHUB_PULL_REQUEST_TEMPL
|
|
|
14371
15243
|
exports.STARTER_GITHUB_SDD_INTEGRATE = STARTER_GITHUB_SDD_INTEGRATE;
|
|
14372
15244
|
exports.STARTER_GITLAB_CI = STARTER_GITLAB_CI;
|
|
14373
15245
|
exports.STARTER_LICENSE_POLICY = STARTER_LICENSE_POLICY;
|
|
15246
|
+
exports.STARTER_PRIVACY_POLICY = STARTER_PRIVACY_POLICY;
|
|
14374
15247
|
exports.STARTER_PROCESS_README = STARTER_PROCESS_README;
|
|
14375
15248
|
exports.STARTER_PULL_REQUEST_TEMPLATE = STARTER_PULL_REQUEST_TEMPLATE;
|
|
14376
15249
|
exports.STARTER_QUALITY_POLICY = STARTER_QUALITY_POLICY;
|
|
@@ -14388,6 +15261,10 @@ exports.STARTER_TEMPLATES_CI__GITLAB_CI_YML = STARTER_TEMPLATES_CI__GITLAB_CI_YM
|
|
|
14388
15261
|
exports.STARTER_TEMPLATES_COMPLIANCE_COMMERCIAL_ACQUISITION_REQUEST_TEMPLATE_MD = STARTER_TEMPLATES_COMPLIANCE_COMMERCIAL_ACQUISITION_REQUEST_TEMPLATE_MD;
|
|
14389
15262
|
exports.STARTER_TEMPLATES_MANUALS_PRODUCTION_MANUAL_TEMPLATE_MD = STARTER_TEMPLATES_MANUALS_PRODUCTION_MANUAL_TEMPLATE_MD;
|
|
14390
15263
|
exports.STARTER_TEMPLATES_MANUALS_USER_MANUAL_TEMPLATE_MD = STARTER_TEMPLATES_MANUALS_USER_MANUAL_TEMPLATE_MD;
|
|
15264
|
+
exports.STARTER_TEMPLATES_PRIVACY_DATA_ASSET_TEMPLATE_MD = STARTER_TEMPLATES_PRIVACY_DATA_ASSET_TEMPLATE_MD;
|
|
15265
|
+
exports.STARTER_TEMPLATES_PRIVACY_DPIA_REQUEST_TEMPLATE_MD = STARTER_TEMPLATES_PRIVACY_DPIA_REQUEST_TEMPLATE_MD;
|
|
15266
|
+
exports.STARTER_TEMPLATES_PRIVACY_PRIVACY_REQ_TEMPLATE_MD = STARTER_TEMPLATES_PRIVACY_PRIVACY_REQ_TEMPLATE_MD;
|
|
15267
|
+
exports.STARTER_TEMPLATES_PRIVACY_PRIVACY_ROPA_TEMPLATE_MD = STARTER_TEMPLATES_PRIVACY_PRIVACY_ROPA_TEMPLATE_MD;
|
|
14391
15268
|
exports.STARTER_TEMPLATES_PRODUCT_ACTOR_TEMPLATE_MD = STARTER_TEMPLATES_PRODUCT_ACTOR_TEMPLATE_MD;
|
|
14392
15269
|
exports.STARTER_TEMPLATES_PRODUCT_BUSINESS_RULE_TEMPLATE_MD = STARTER_TEMPLATES_PRODUCT_BUSINESS_RULE_TEMPLATE_MD;
|
|
14393
15270
|
exports.STARTER_TEMPLATES_PRODUCT_JOURNEY_TEMPLATE_MD = STARTER_TEMPLATES_PRODUCT_JOURNEY_TEMPLATE_MD;
|
|
@@ -14473,7 +15350,9 @@ exports.generateDuplicatesReportMarkdown = generateDuplicatesReportMarkdown;
|
|
|
14473
15350
|
exports.generateGovernanceReportMarkdown = generateGovernanceReportMarkdown;
|
|
14474
15351
|
exports.generateLicenseReportMarkdown = generateLicenseReportMarkdown;
|
|
14475
15352
|
exports.generatePdacReportMarkdown = generatePdacReportMarkdown;
|
|
15353
|
+
exports.generatePrivacyReportMarkdown = generatePrivacyReportMarkdown;
|
|
14476
15354
|
exports.generateQualityReport = generateQualityReport;
|
|
15355
|
+
exports.generateRopaInventoryMarkdown = generateRopaInventoryMarkdown;
|
|
14477
15356
|
exports.generateSastReportMarkdown = generateSastReportMarkdown;
|
|
14478
15357
|
exports.generateSecretsReportMarkdown = generateSecretsReportMarkdown;
|
|
14479
15358
|
exports.generateTestingCoverageReportMarkdown = generateTestingCoverageReportMarkdown;
|
|
@@ -14496,6 +15375,7 @@ exports.isPlaceholderOrIgnored = isPlaceholderOrIgnored;
|
|
|
14496
15375
|
exports.isRequirementArtifact = isRequirementArtifact2;
|
|
14497
15376
|
exports.isSemgrepInstalled = isSemgrepInstalled;
|
|
14498
15377
|
exports.isToolAvailable = isToolAvailable;
|
|
15378
|
+
exports.loadPrivacyPolicy = loadPrivacyPolicy;
|
|
14499
15379
|
exports.loadProductHandoffSidecar = loadProductHandoffSidecar;
|
|
14500
15380
|
exports.locateTaskInActiveChanges = locateTaskInActiveChanges;
|
|
14501
15381
|
exports.maskSecret = maskSecret;
|
|
@@ -14537,6 +15417,7 @@ exports.scaffoldSddChange = scaffoldSddChange;
|
|
|
14537
15417
|
exports.scanAllProductHandoffs = scanAllProductHandoffs;
|
|
14538
15418
|
exports.scanAllTestArtifacts = scanAllTestArtifacts;
|
|
14539
15419
|
exports.scanContentForSecrets = scanContentForSecrets;
|
|
15420
|
+
exports.scanFileForPrivacyViolations = scanFileForPrivacyViolations;
|
|
14540
15421
|
exports.scanFileForSast = scanFileForSast;
|
|
14541
15422
|
exports.scanInstalledLicenses = scanInstalledLicenses;
|
|
14542
15423
|
exports.scanManualsInWorkspace = scanManualsInWorkspace;
|
|
@@ -14556,6 +15437,7 @@ exports.verifyArtifactsSchemas = verifyArtifactsSchemas;
|
|
|
14556
15437
|
exports.verifyLicenses = verifyLicenses;
|
|
14557
15438
|
exports.verifyManuals = verifyManuals;
|
|
14558
15439
|
exports.verifyPdacGraph = verifyPdacGraph;
|
|
15440
|
+
exports.verifyPrivacy = verifyPrivacy;
|
|
14559
15441
|
exports.verifyProgressiveFriction = verifyProgressiveFriction;
|
|
14560
15442
|
exports.verifyQualityGate = verifyQualityGate;
|
|
14561
15443
|
exports.verifySast = verifySast;
|