@produtype/core 0.21.0 → 0.22.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.
@@ -16,9 +16,17 @@ const severityOrder = {
16
16
  info: 4,
17
17
  };
18
18
  const phaseMeta = {
19
+ /**
20
+ * The phase is about order, not about severity.
21
+ *
22
+ * It was titled "Critical production blockers", and fifty-one of the fifty-nine plans
23
+ * that had a non-empty one contained no critical finding at all — a heading announcing
24
+ * critical blockers directly above a report whose own count of critical issues was
25
+ * zero. The grouping is right; the promise in the words was not.
26
+ */
19
27
  'critical-blockers': {
20
- title: 'Critical production blockers',
21
- description: 'Fix the items most likely to cause immediate security, auth, or data-loss regressions.',
28
+ title: 'Security and access, first',
29
+ description: 'Identity, secrets and anything exposed without a check. These come first because the rest of the plan rests on them — not because each item is critical; every task carries its own severity.',
22
30
  },
23
31
  'saas-safety-layer': {
24
32
  title: 'SaaS safety layer',
@@ -33,11 +33,20 @@ function renderTask(task) {
33
33
  ].join('\n');
34
34
  }
35
35
  function renderPhase(phase) {
36
+ /**
37
+ * Four bare words in brackets are four facts a reader cannot tell apart.
38
+ *
39
+ * `[p1, small, low, safe_template]` was the whole annotation: which of those is the
40
+ * effort and which the risk is only knowable from the source. They are named now,
41
+ * which costs a line's width and saves the reader guessing.
42
+ */
36
43
  const tasks = phase.tasks.length > 0
37
- ? phase.tasks.map((task) => `- ${task.id}: ${task.title} [${task.priority}, ${task.effort}, ${task.risk}, ${task.automationReadiness}]`).join('\n')
44
+ ? phase.tasks.map((task) => `- ${task.id}: ${task.title} — priority ${task.priority}, effort ${task.effort}, risk ${task.risk}, automation ${task.automationReadiness}`).join('\n')
38
45
  : '- none';
39
46
  return [
40
- `## ${phase.title}`,
47
+ // A phase is part of the plan's list of phases, so it sits under it rather than
48
+ // beside it. Every phase was a sibling of the "Phases" heading that introduced them.
49
+ `### ${phase.title}`,
41
50
  '',
42
51
  phase.description,
43
52
  '',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@produtype/core",
3
- "version": "0.21.0",
3
+ "version": "0.22.0",
4
4
  "description": "Deterministic CLI and library that analyzes a web application repository and reports how far it is from production-ready for the kind of product it is meant to be.",
5
5
  "license": "MIT",
6
6
  "bin": {