@pareto4/pp-core 1.19.0 → 1.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/agents/pp-nyquist-auditor.md +19 -14
- package/agents/pp-phase-researcher.md +10 -0
- package/agents/pp-plan-checker.md +59 -36
- package/agents/pp-planner.md +49 -53
- package/agents/pp-vault-reviewer.md +2 -0
- package/agents/pp-verifier.md +15 -60
- package/commands/pp-autonomous.md +2 -1
- package/commands/pp-discovery.md +3 -2
- package/commands/pp-plan-phase.md +2 -1
- package/commands/pp-plan-review-convergence.md +2 -1
- package/gemini-extension.json +1 -1
- package/package.json +6 -3
- package/pareto-skills/_shared/pp-claude-md-protocol.md +1 -1
- package/pareto-skills/pp-project-setup/SKILL.md +18 -343
- package/pp-core/bin/lib/capability-activation.cjs +77 -0
- package/pp-core/bin/lib/capability-registry.cjs +15 -15
- package/pp-core/bin/lib/capability-state.cjs +8 -18
- package/pp-core/bin/lib/ceremony.cjs +1342 -0
- package/pp-core/bin/lib/check-command-router.cjs +62 -1
- package/pp-core/bin/lib/commands.cjs +29 -3
- package/pp-core/bin/lib/config.cjs +5 -0
- package/pp-core/bin/lib/discovery-access.cjs +276 -0
- package/pp-core/bin/lib/discovery-charter.cjs +664 -0
- package/pp-core/bin/lib/discovery-deviations.cjs +264 -0
- package/pp-core/bin/lib/discovery-entities.cjs +323 -0
- package/pp-core/bin/lib/discovery-for-phase.cjs +628 -0
- package/pp-core/bin/lib/discovery-integrations.cjs +286 -0
- package/pp-core/bin/lib/discovery-migration.cjs +246 -0
- package/pp-core/bin/lib/discovery-phases.cjs +233 -0
- package/pp-core/bin/lib/discovery-processes.cjs +355 -0
- package/pp-core/bin/lib/discovery-research-track.cjs +5 -4
- package/pp-core/bin/lib/discovery-rollup.cjs +8 -7
- package/pp-core/bin/lib/discovery-rules.cjs +216 -0
- package/pp-core/bin/lib/discovery-screens.cjs +1 -1
- package/pp-core/bin/lib/discovery-session-check.cjs +264 -0
- package/pp-core/bin/lib/discovery-stories.cjs +273 -0
- package/pp-core/bin/lib/discovery-sweep.cjs +1 -1
- package/pp-core/bin/lib/discovery-table.cjs +55 -0
- package/pp-core/bin/lib/init.cjs +50 -1
- package/pp-core/bin/lib/io.cjs +24 -0
- package/pp-core/bin/lib/loop-resolver.cjs +26 -12
- package/pp-core/bin/lib/phase.cjs +39 -3
- package/pp-core/bin/lib/plan-sizing.cjs +346 -0
- package/pp-core/bin/lib/test-substance.cjs +3190 -0
- package/pp-core/bin/lib/timeline.cjs +605 -0
- package/pp-core/bin/lib/vault-standards-review.cjs +50 -2
- package/pp-core/bin/pp-tools.cjs +214 -5
- package/pp-core/bin/shared/ceremony-gates.json +17 -0
- package/pp-core/bin/shared/config-schema.manifest.json +1 -0
- package/pp-core/references/ceremony.md +81 -0
- package/pp-core/references/discovery-access.md +112 -0
- package/pp-core/references/discovery-build-consumption.md +256 -0
- package/pp-core/references/discovery-charter.md +127 -0
- package/pp-core/references/discovery-data-model.md +145 -0
- package/pp-core/references/discovery-id-conventions.md +50 -14
- package/pp-core/references/discovery-integrations.md +151 -0
- package/pp-core/references/discovery-processes.md +190 -0
- package/pp-core/references/discovery-rebaseline.md +2 -2
- package/pp-core/references/discovery-research-track.md +5 -6
- package/pp-core/references/discovery-session-output.md +70 -0
- package/pp-core/references/discovery-standards.md +107 -0
- package/pp-core/references/discovery-traceability.md +2 -2
- package/pp-core/references/few-shot-examples/plan-checker.md +8 -8
- package/pp-core/references/phase-timeline.md +107 -0
- package/pp-core/references/planner-antipatterns.md +32 -0
- package/pp-core/references/planner-discovery-extract.md +35 -0
- package/pp-core/references/planner-guidance.md +17 -14
- package/pp-core/references/planner-revision.md +1 -1
- package/pp-core/references/planning-config.md +3 -2
- package/pp-core/references/test-substance.md +324 -0
- package/pp-core/references/verifier-discovery-conformance.md +36 -0
- package/pp-core/references/verifier-stub-patterns.md +51 -0
- package/pp-core/templates/VALIDATION.md +1 -0
- package/pp-core/templates/phase-prompt.md +19 -7
- package/pp-core/templates/project-charter.md +161 -100
- package/pp-core/templates/project.md +3 -3
- package/pp-core/templates/requirements.md +18 -0
- package/pp-core/templates/roadmap.md +1 -1
- package/pp-core/templates/verification-report.md +17 -1
- package/pp-core/workflows/audit-milestone.md +4 -1
- package/pp-core/workflows/autonomous.md +11 -8
- package/pp-core/workflows/code-review.md +15 -6
- package/pp-core/workflows/discovery-sprint/charter.md +114 -0
- package/pp-core/workflows/discovery-sprint/prefill.md +1 -1
- package/pp-core/workflows/discovery-sprint/prototype.md +4 -4
- package/pp-core/workflows/discovery-sprint/session-13-gates.md +10 -0
- package/pp-core/workflows/discovery-sprint/sessions/01-kick-off.md +5 -2
- package/pp-core/workflows/discovery-sprint/sessions/02-as-is.md +27 -5
- package/pp-core/workflows/discovery-sprint/sessions/03-to-be.md +56 -31
- package/pp-core/workflows/discovery-sprint/sessions/04-ux-design.md +1 -1
- package/pp-core/workflows/discovery-sprint/sessions/05-architecture.md +42 -19
- package/pp-core/workflows/discovery-sprint/sessions/06-security.md +27 -12
- package/pp-core/workflows/discovery-sprint/sessions/07-identity.md +41 -23
- package/pp-core/workflows/discovery-sprint/sessions/08-integration.md +50 -23
- package/pp-core/workflows/discovery-sprint/sessions/09-qa.md +26 -11
- package/pp-core/workflows/discovery-sprint/sessions/10-infrastructure.md +28 -9
- package/pp-core/workflows/discovery-sprint/sessions/11-roadmap.md +21 -0
- package/pp-core/workflows/discovery-sprint/sessions/13-wrap-up.md +24 -9
- package/pp-core/workflows/discovery-sprint.md +12 -15
- package/pp-core/workflows/discovery-to-build/steps/architecture-deliverables.md +80 -29
- package/pp-core/workflows/discovery-to-build/steps/{screen-inventory-gate.md → handoff-gates.md} +111 -3
- package/pp-core/workflows/discovery-to-build/templates/discovery-references.md +12 -9
- package/pp-core/workflows/discovery-to-build/templates/pp-handoff.md +27 -26
- package/pp-core/workflows/discovery-to-build.md +70 -34
- package/pp-core/workflows/discuss-phase/discovery.md +83 -0
- package/pp-core/workflows/discuss-phase/templates/context.md +4 -0
- package/pp-core/workflows/discuss-phase.md +10 -7
- package/pp-core/workflows/execute-phase/steps/check-query-gate.md +7 -7
- package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -2
- package/pp-core/workflows/execute-phase.md +14 -3
- package/pp-core/workflows/new-project.md +3 -3
- package/pp-core/workflows/plan-phase/steps/chunked-planning.md +7 -3
- package/pp-core/workflows/plan-phase/steps/discovery-extract.md +41 -0
- package/pp-core/workflows/plan-phase/steps/prd-express.md +104 -0
- package/pp-core/workflows/plan-phase.md +62 -124
- package/pp-core/workflows/plan-review-convergence.md +6 -3
- package/pp-core/workflows/ship.md +2 -2
- package/pp-core/workflows/stats.md +19 -4
- package/pp-core/workflows/validate-phase.md +19 -4
- package/pp-core/workflows/vault-review.md +5 -0
- package/pp-core/workflows/verify-phase.md +1 -1
- package/pp-core/workflows/verify-work.md +1 -1
- package/scripts/gen-capability-registry.cjs +43 -45
- package/scripts/run-tests.cjs +54 -30
- package/pp-core/workflows/discovery-sprint/templates/context-template.md +0 -272
|
@@ -34,6 +34,12 @@ const SCHEMA_VERSION = '1';
|
|
|
34
34
|
// registry generator and the loop-host-contract generator share one source of truth.
|
|
35
35
|
const { LOOP_HOST_CONTRACT } = require('../pp-core/bin/lib/loop-host-contract.cjs');
|
|
36
36
|
|
|
37
|
+
// Ceremony gate vocabulary (Phase 37, D-14) — a hook `when` conjunct `ceremony.<gate>`
|
|
38
|
+
// must name a gate declared here.
|
|
39
|
+
const CEREMONY_GATE_NAMES = new Set(
|
|
40
|
+
require('../pp-core/bin/shared/ceremony-gates.json').gates.map((g) => g.key),
|
|
41
|
+
);
|
|
42
|
+
|
|
37
43
|
// Wired-points helper — tells us which points actually have render-hooks call sites.
|
|
38
44
|
const { getWiredLoopPoints } = require('./gen-loop-host-contract.cjs');
|
|
39
45
|
|
|
@@ -1241,6 +1247,38 @@ function validateGate(gate, prefix) {
|
|
|
1241
1247
|
|
|
1242
1248
|
// ─── Contract validation ──────────────────────────────────────────────────────
|
|
1243
1249
|
|
|
1250
|
+
/**
|
|
1251
|
+
* Validate a hook `when` (Phase 37, D-14). A `when` is one or more conjuncts joined
|
|
1252
|
+
* by `&&`; each is a config key the capability declares, or `ceremony.<gate>` with
|
|
1253
|
+
* the gate named in pp-core/bin/shared/ceremony-gates.json. A non-string `when` is
|
|
1254
|
+
* already reported by the schema checks and is skipped here. Pushes onto `errors`.
|
|
1255
|
+
* `where` is the message prefix, e.g. `capability "x" step.when`, so the message of
|
|
1256
|
+
* a single undeclared key stays `<where> "<key>" is not defined in capability config keys`.
|
|
1257
|
+
*/
|
|
1258
|
+
function validateWhen(when, cap, where, errors) {
|
|
1259
|
+
if (typeof when !== 'string') return;
|
|
1260
|
+
for (const raw of when.split('&&')) {
|
|
1261
|
+
const conjunct = raw.trim();
|
|
1262
|
+
if (conjunct === '') {
|
|
1263
|
+
errors.push(where + ' has an empty conjunct');
|
|
1264
|
+
continue;
|
|
1265
|
+
}
|
|
1266
|
+
if (conjunct.startsWith('ceremony.')) {
|
|
1267
|
+
if (!CEREMONY_GATE_NAMES.has(conjunct.slice('ceremony.'.length))) {
|
|
1268
|
+
errors.push(where + ' "' + conjunct + '" is not a ceremony gate');
|
|
1269
|
+
}
|
|
1270
|
+
continue;
|
|
1271
|
+
}
|
|
1272
|
+
if (
|
|
1273
|
+
typeof cap.config === 'object' &&
|
|
1274
|
+
cap.config !== null &&
|
|
1275
|
+
!Object.prototype.hasOwnProperty.call(cap.config, conjunct)
|
|
1276
|
+
) {
|
|
1277
|
+
errors.push(where + ' "' + conjunct + '" is not defined in capability config keys');
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1244
1282
|
/**
|
|
1245
1283
|
* Validate per-capability contract constraints against the Loop Host Contract.
|
|
1246
1284
|
* This covers:
|
|
@@ -1281,51 +1319,10 @@ function validateAgainstContract(cap, capId, knownAgentIds) {
|
|
|
1281
1319
|
}
|
|
1282
1320
|
}
|
|
1283
1321
|
|
|
1284
|
-
// when
|
|
1285
|
-
for (const step of cap.steps)
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
if (
|
|
1289
|
-
typeof cap.config === 'object' &&
|
|
1290
|
-
cap.config !== null &&
|
|
1291
|
-
!Object.prototype.hasOwnProperty.call(cap.config, step.when)
|
|
1292
|
-
) {
|
|
1293
|
-
errors.push(
|
|
1294
|
-
prefix + ' step.when "' + step.when + '" is not defined in capability config keys',
|
|
1295
|
-
);
|
|
1296
|
-
}
|
|
1297
|
-
}
|
|
1298
|
-
}
|
|
1299
|
-
|
|
1300
|
-
for (const contrib of cap.contributions) {
|
|
1301
|
-
if (contrib.when !== undefined) {
|
|
1302
|
-
if (typeof contrib.when !== 'string') continue;
|
|
1303
|
-
if (
|
|
1304
|
-
typeof cap.config === 'object' &&
|
|
1305
|
-
cap.config !== null &&
|
|
1306
|
-
!Object.prototype.hasOwnProperty.call(cap.config, contrib.when)
|
|
1307
|
-
) {
|
|
1308
|
-
errors.push(
|
|
1309
|
-
prefix + ' contribution.when "' + contrib.when + '" is not defined in capability config keys',
|
|
1310
|
-
);
|
|
1311
|
-
}
|
|
1312
|
-
}
|
|
1313
|
-
}
|
|
1314
|
-
|
|
1315
|
-
for (const gate of cap.gates) {
|
|
1316
|
-
if (gate.when !== undefined) {
|
|
1317
|
-
if (typeof gate.when !== 'string') continue;
|
|
1318
|
-
if (
|
|
1319
|
-
typeof cap.config === 'object' &&
|
|
1320
|
-
cap.config !== null &&
|
|
1321
|
-
!Object.prototype.hasOwnProperty.call(cap.config, gate.when)
|
|
1322
|
-
) {
|
|
1323
|
-
errors.push(
|
|
1324
|
-
prefix + ' gate.when "' + gate.when + '" is not defined in capability config keys',
|
|
1325
|
-
);
|
|
1326
|
-
}
|
|
1327
|
-
}
|
|
1328
|
-
}
|
|
1322
|
+
// when: one or more `&&` conjuncts, each a declared config key or `ceremony.<gate>`
|
|
1323
|
+
for (const step of cap.steps) validateWhen(step.when, cap, prefix + ' step.when', errors);
|
|
1324
|
+
for (const contrib of cap.contributions) validateWhen(contrib.when, cap, prefix + ' contribution.when', errors);
|
|
1325
|
+
for (const gate of cap.gates) validateWhen(gate.when, cap, prefix + ' gate.when', errors);
|
|
1329
1326
|
|
|
1330
1327
|
return errors;
|
|
1331
1328
|
}
|
|
@@ -2759,6 +2756,7 @@ function main() {
|
|
|
2759
2756
|
module.exports = {
|
|
2760
2757
|
validateCapability,
|
|
2761
2758
|
validateAgainstContract,
|
|
2759
|
+
validateWhen,
|
|
2762
2760
|
validateConsumesGlobal,
|
|
2763
2761
|
validateCrossCapability,
|
|
2764
2762
|
validateSealField,
|
package/scripts/run-tests.cjs
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
const { readdirSync } = require('fs');
|
|
33
33
|
const { join, basename } = require('path');
|
|
34
|
-
const { execFileSync } = require('child_process');
|
|
34
|
+
const { execFileSync, spawnSync } = require('child_process');
|
|
35
35
|
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
36
36
|
|
|
37
37
|
const SUITES = ['all', 'unit', 'integration', 'install', 'security', 'slow'];
|
|
@@ -548,42 +548,66 @@ function main() {
|
|
|
548
548
|
if (chunks.length > 1) {
|
|
549
549
|
console.error(`run-tests: chunk ${i + 1}/${chunks.length} — ${chunks[i].length} files`);
|
|
550
550
|
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
551
|
+
const chunkFiles = chunks[i].map(f => f.split(/[\\/]/).pop()).join(' ');
|
|
552
|
+
// stdout is captured, not inherited, so the chunk's node:test summary can be
|
|
553
|
+
// checked; it is written through unchanged once the chunk ends. stderr stays
|
|
554
|
+
// live. A chunk can exit 0 with its output cut off and no summary — on CI
|
|
555
|
+
// (2026-10-28) two of five chunks did, and ~1,000 tests never reported while
|
|
556
|
+
// the job stayed green — so a missing summary fails the run.
|
|
557
|
+
const result = spawnSync(
|
|
558
|
+
process.execPath,
|
|
559
|
+
['--test', ...(forceExit ? ['--test-force-exit'] : []), concurrency, ...chunks[i]],
|
|
560
|
+
{
|
|
561
|
+
stdio: ['inherit', 'pipe', 'inherit'],
|
|
562
|
+
env: { ...process.env },
|
|
563
|
+
timeout: chunkTimeoutMs,
|
|
564
|
+
maxBuffer: 1024 * 1024 * 1024,
|
|
565
|
+
},
|
|
566
|
+
);
|
|
567
|
+
if (result.stdout && result.stdout.length > 0) process.stdout.write(result.stdout);
|
|
568
|
+
// When the per-chunk timeout fires, spawnSync kills the child and reports
|
|
569
|
+
// error.code === 'ETIMEDOUT' (POSIX) and/or a kill signal (platform-dependent).
|
|
570
|
+
// Check both so detection holds on Windows and POSIX.
|
|
571
|
+
const timedOut = (result.error && result.error.code === 'ETIMEDOUT') ||
|
|
572
|
+
(result.signal !== null && result.status === null && !result.error);
|
|
573
|
+
let code = result.status === null ? 1 : result.status;
|
|
574
|
+
if (result.error && result.error.code === 'ETIMEDOUT') code = 1;
|
|
575
|
+
if (timedOut) {
|
|
576
|
+
console.error(
|
|
577
|
+
`run-tests: chunk ${i + 1}/${chunks.length} exceeded the per-chunk timeout ` +
|
|
578
|
+
`of ${chunkTimeoutMs}ms and was killed — a test in this chunk is likely leaking ` +
|
|
579
|
+
`an open handle (un-terminated Worker, un-killed child process, or ref'd timer) ` +
|
|
580
|
+
`so node --test never exits. Files: ${chunkFiles}`,
|
|
560
581
|
);
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
`
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
`so node --test never exits. Files: ${chunks[i]
|
|
572
|
-
.map(f => f.split(/[\\/]/).pop())
|
|
573
|
-
.join(' ')}`,
|
|
574
|
-
);
|
|
575
|
-
}
|
|
576
|
-
const code = err.status || 1;
|
|
577
|
-
// Run every chunk so the operator sees all failures in one pass; report
|
|
578
|
-
// the first non-zero exit at the end.
|
|
579
|
-
if (firstFailureExit === 0) firstFailureExit = code;
|
|
582
|
+
} else if (result.error) {
|
|
583
|
+
console.error(`run-tests: chunk ${i + 1}/${chunks.length} could not run: ${result.error.message}`);
|
|
584
|
+
code = 1;
|
|
585
|
+
} else if (code === 0 && !hasTestSummary(result.stdout)) {
|
|
586
|
+
console.error(
|
|
587
|
+
`run-tests: chunk ${i + 1}/${chunks.length} exited without a test summary ` +
|
|
588
|
+
`(no "ℹ tests N" / "ℹ fail N" lines) — its output was cut off, so some of its ` +
|
|
589
|
+
`tests never reported. Files: ${chunkFiles}`,
|
|
590
|
+
);
|
|
591
|
+
code = 1;
|
|
580
592
|
}
|
|
593
|
+
// Run every chunk so the operator sees all failures in one pass; report
|
|
594
|
+
// the first non-zero exit at the end.
|
|
595
|
+
if (code !== 0 && firstFailureExit === 0) firstFailureExit = code;
|
|
581
596
|
}
|
|
582
597
|
if (firstFailureExit !== 0) return firstFailureExit;
|
|
583
598
|
}
|
|
584
599
|
|
|
600
|
+
/**
|
|
601
|
+
* Whether a chunk's stdout carries node:test's closing summary: both the
|
|
602
|
+
* `tests N` and `fail N` lines, from the spec reporter (`ℹ`) or TAP (`#`).
|
|
603
|
+
*/
|
|
604
|
+
function hasTestSummary(stdout) {
|
|
605
|
+
const text = stdout ? stdout.toString('utf8') : '';
|
|
606
|
+
return /^(?:ℹ|#) tests \d+\s*$/m.test(text) && /^(?:ℹ|#) fail \d+\s*$/m.test(text);
|
|
607
|
+
}
|
|
608
|
+
|
|
585
609
|
if (require.main === module) {
|
|
586
610
|
runMain(main);
|
|
587
611
|
}
|
|
588
612
|
|
|
589
|
-
module.exports = { suiteOf, ensureBuiltArtifacts, parseShardArg, selectShard };
|
|
613
|
+
module.exports = { suiteOf, ensureBuiltArtifacts, parseShardArg, selectShard, hasTestSummary };
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
# Bootstrap Template — .planning/discovery/_context.md
|
|
2
|
-
|
|
3
|
-
> **Lazy-loaded.** Read this file from `workflows/discovery-sprint.md` — from
|
|
4
|
-
> Flow 2 Step 1, or from the Bootstrap Templates section — when
|
|
5
|
-
> `.planning/discovery/_context.md` is absent (first-ever session on this
|
|
6
|
-
> project). Create that file verbatim from the fenced schema below. The path is
|
|
7
|
-
> fixed under `.planning/discovery/` (T-04-03): never a root-level directory,
|
|
8
|
-
> never an absolute path, never a path containing `..`.
|
|
9
|
-
|
|
10
|
-
**`.planning/discovery/_context.md`:**
|
|
11
|
-
|
|
12
|
-
```markdown
|
|
13
|
-
# Cross-Session Context — [PROJECT_NAME]
|
|
14
|
-
|
|
15
|
-
This file accumulates key outputs from each completed session to provide context for subsequent sessions. It is automatically maintained as sessions are completed.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Session 1: Kick-off Outputs
|
|
20
|
-
_Populated after Session 1 completion_
|
|
21
|
-
|
|
22
|
-
### Project Context
|
|
23
|
-
<!-- Notes about the rationale and context -->
|
|
24
|
-
|
|
25
|
-
### Business Vision
|
|
26
|
-
<!-- Business vision summary, KPIs -->
|
|
27
|
-
|
|
28
|
-
### Stakeholders
|
|
29
|
-
<!-- Key stakeholder list with roles -->
|
|
30
|
-
|
|
31
|
-
### Approval Routes
|
|
32
|
-
<!-- Who approves scope, budget, architecture and security deviations, go-live -->
|
|
33
|
-
|
|
34
|
-
### Platform and Team Shape
|
|
35
|
-
<!-- Mandated platform (D-01-n) or "open"; team shape for the build -->
|
|
36
|
-
|
|
37
|
-
### Discovery Sprint Scope
|
|
38
|
-
**In Scope:**
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
**Out of Scope:**
|
|
42
|
-
-
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Session 2: As-Is Outputs
|
|
47
|
-
_Populated after Session 2 completion_
|
|
48
|
-
|
|
49
|
-
### Core Processes
|
|
50
|
-
<!-- Current business processes -->
|
|
51
|
-
|
|
52
|
-
### Pain Points
|
|
53
|
-
<!-- Prioritized pain points -->
|
|
54
|
-
|
|
55
|
-
### User Personas
|
|
56
|
-
<!-- Key personas and their journeys -->
|
|
57
|
-
|
|
58
|
-
### Current Systems
|
|
59
|
-
<!-- Systems landscape -->
|
|
60
|
-
|
|
61
|
-
### Data Flows
|
|
62
|
-
<!-- How information moves today -->
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## Session 3: To-Be Outputs
|
|
67
|
-
_Populated after Session 3 completion_
|
|
68
|
-
|
|
69
|
-
### Business Objectives
|
|
70
|
-
<!-- Measurable outcomes and KPIs -->
|
|
71
|
-
|
|
72
|
-
### MVP Scope
|
|
73
|
-
<!-- What's in/out for MVP -->
|
|
74
|
-
|
|
75
|
-
### EPICs Summary
|
|
76
|
-
<!-- EPIC registry table -->
|
|
77
|
-
|
|
78
|
-
### User Stories Summary
|
|
79
|
-
<!-- Story count and distribution -->
|
|
80
|
-
|
|
81
|
-
### Requirements Summary
|
|
82
|
-
<!-- Copy the rollup:auto totals table verbatim from .planning/discovery/_requirements.md — never hand-count -->
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Session 4: UX Design Outputs
|
|
87
|
-
_Populated after Session 4 completion_
|
|
88
|
-
|
|
89
|
-
### Design Principles
|
|
90
|
-
<!-- Numbered design principles -->
|
|
91
|
-
|
|
92
|
-
### UX Standards
|
|
93
|
-
<!-- Standards Applied: the frontend standard citations and every D-04 deviation -->
|
|
94
|
-
|
|
95
|
-
### Key Personas (Refined)
|
|
96
|
-
<!-- Persona categories and interaction patterns -->
|
|
97
|
-
|
|
98
|
-
### Key Screen Decisions
|
|
99
|
-
<!-- Screen layout decisions -->
|
|
100
|
-
|
|
101
|
-
### Prototype
|
|
102
|
-
<!-- Session 4 Closing Step answer; per /pp-discovery prototype round: flows validated, open feedback count -->
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Session 5: Architecture Outputs
|
|
107
|
-
_Populated after Session 5 completion_
|
|
108
|
-
|
|
109
|
-
### Target Architecture
|
|
110
|
-
<!-- Platform, architecture style, ownership -->
|
|
111
|
-
|
|
112
|
-
### Technology Stack
|
|
113
|
-
<!-- Full stack listing -->
|
|
114
|
-
|
|
115
|
-
### Key Components
|
|
116
|
-
<!-- Module/component list -->
|
|
117
|
-
|
|
118
|
-
### Integration Points
|
|
119
|
-
<!-- External system integrations -->
|
|
120
|
-
|
|
121
|
-
### ADRs
|
|
122
|
-
<!-- Architecture Decision Records -->
|
|
123
|
-
|
|
124
|
-
### Domain Model / Entity Register
|
|
125
|
-
<!-- Entity, key attributes, relationships, owner module -->
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## Session 6: Security Outputs
|
|
130
|
-
_Populated after Session 6 completion_
|
|
131
|
-
|
|
132
|
-
### Data Classification
|
|
133
|
-
<!-- Data sensitivity levels -->
|
|
134
|
-
|
|
135
|
-
### Compliance Framework
|
|
136
|
-
<!-- Standards and regulations -->
|
|
137
|
-
|
|
138
|
-
### Encryption
|
|
139
|
-
<!-- In-transit, at-rest, key management -->
|
|
140
|
-
|
|
141
|
-
### Network & Access
|
|
142
|
-
<!-- Network security approach -->
|
|
143
|
-
|
|
144
|
-
### Audit Logging
|
|
145
|
-
<!-- Logging strategy and retention -->
|
|
146
|
-
|
|
147
|
-
### Availability
|
|
148
|
-
<!-- SLA targets -->
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Session 7: Identity Management Outputs
|
|
153
|
-
_Populated after Session 7 completion_
|
|
154
|
-
|
|
155
|
-
### RBAC Model
|
|
156
|
-
<!-- Roles and permissions summary -->
|
|
157
|
-
|
|
158
|
-
### IdP Integration
|
|
159
|
-
<!-- Identity provider details -->
|
|
160
|
-
|
|
161
|
-
### User Lifecycle
|
|
162
|
-
<!-- Provisioning approach -->
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Session 8: Integration Outputs
|
|
167
|
-
_Populated after Session 8 completion_
|
|
168
|
-
|
|
169
|
-
### External Systems
|
|
170
|
-
<!-- Systems and their interfaces -->
|
|
171
|
-
|
|
172
|
-
### Interface Patterns
|
|
173
|
-
<!-- Chosen patterns and protocols -->
|
|
174
|
-
|
|
175
|
-
### Data Exchange
|
|
176
|
-
<!-- Key data flows and formats -->
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Session 9: QA Outputs
|
|
181
|
-
_Populated after Session 9 completion_
|
|
182
|
-
|
|
183
|
-
### Test Strategy
|
|
184
|
-
<!-- Testing approach -->
|
|
185
|
-
|
|
186
|
-
### Tooling
|
|
187
|
-
<!-- Test management and automation tools -->
|
|
188
|
-
|
|
189
|
-
### Test Environments
|
|
190
|
-
<!-- Environment list and purposes -->
|
|
191
|
-
|
|
192
|
-
### Quality Gates
|
|
193
|
-
<!-- Gate definitions -->
|
|
194
|
-
|
|
195
|
-
### UAT
|
|
196
|
-
<!-- UAT participants, period, criteria -->
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## Session 10: Infrastructure Outputs
|
|
201
|
-
_Populated after Session 10 completion_
|
|
202
|
-
|
|
203
|
-
### Infrastructure
|
|
204
|
-
<!-- Cloud/hosting setup -->
|
|
205
|
-
|
|
206
|
-
### Deployment
|
|
207
|
-
<!-- Deployment strategy -->
|
|
208
|
-
|
|
209
|
-
### Monitoring
|
|
210
|
-
<!-- Monitoring and alerting approach -->
|
|
211
|
-
|
|
212
|
-
### Backup & DR
|
|
213
|
-
<!-- Backup and disaster recovery -->
|
|
214
|
-
|
|
215
|
-
### Go-Live Readiness
|
|
216
|
-
<!-- Readiness checklist status -->
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
## Session 11: Roadmap Outputs
|
|
221
|
-
_Populated after Session 11 completion_
|
|
222
|
-
|
|
223
|
-
### Project Phases
|
|
224
|
-
<!-- Phase breakdown -->
|
|
225
|
-
|
|
226
|
-
### Timeline
|
|
227
|
-
<!-- Iteration model (sprints or pp-core phases) and key dates -->
|
|
228
|
-
|
|
229
|
-
### MVP Scope (Confirmed)
|
|
230
|
-
<!-- Must-have vs nice-to-have -->
|
|
231
|
-
|
|
232
|
-
### Build Order
|
|
233
|
-
<!-- Iteration-by-iteration plan -->
|
|
234
|
-
|
|
235
|
-
### Key Milestones
|
|
236
|
-
<!-- Milestone dates -->
|
|
237
|
-
|
|
238
|
-
### Risks
|
|
239
|
-
<!-- Top risks and mitigations -->
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
## Session 12: Delivery Model Outputs
|
|
244
|
-
_Populated after Session 12 completion_
|
|
245
|
-
|
|
246
|
-
### Team Structure
|
|
247
|
-
<!-- Key roles and people -->
|
|
248
|
-
|
|
249
|
-
### Governance
|
|
250
|
-
<!-- Governance framework summary -->
|
|
251
|
-
|
|
252
|
-
### Ceremonies
|
|
253
|
-
<!-- Iteration cadence and the meetings held -->
|
|
254
|
-
|
|
255
|
-
### Support Model
|
|
256
|
-
<!-- Post-go-live support approach -->
|
|
257
|
-
|
|
258
|
-
---
|
|
259
|
-
|
|
260
|
-
## Session 13: Wrap-up Outputs
|
|
261
|
-
_Populated after Session 13 completion_
|
|
262
|
-
|
|
263
|
-
### Decision Readiness
|
|
264
|
-
<!-- Go / Conditional Go / No-Go assessment -->
|
|
265
|
-
|
|
266
|
-
### Open Items
|
|
267
|
-
<!-- Items carried forward -->
|
|
268
|
-
|
|
269
|
-
### Next Steps
|
|
270
|
-
<!-- Transition plan to execution -->
|
|
271
|
-
```
|
|
272
|
-
|