shapeup-sdlc 1.6.3 → 3.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/.claude/settings.local.example.json +5 -5
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +54 -107
- package/README.md +165 -151
- package/SECURITY.md +49 -27
- package/bin/init.mjs +93 -108
- package/bin/lib/grant.mjs +145 -0
- package/commands/build.md +20 -0
- package/commands/eval.md +5 -4
- package/commands/scopes.md +5 -4
- package/commands/shape.md +1 -1
- package/commands/ship.md +53 -7
- package/commands/wire.md +1 -1
- package/hooks/dispatch-receipt.mjs +195 -0
- package/hooks/gate-intake.mjs +16 -17
- package/hooks/gate-zerowork.mjs +107 -25
- package/hooks/hooks.json +9 -48
- package/hooks/lib/decision.mjs +38 -19
- package/hooks/safety-spine.mjs +4 -4
- package/hooks/sandbox-guard.mjs +130 -50
- package/{skills/tech-lead/scripts/compile-order.mjs → kernel/compile.mjs} +344 -55
- package/{skills/tech-lead/scripts/gate-answers.mjs → kernel/gate.mjs} +69 -26
- package/kernel/harness.mjs +134 -0
- package/{skills/tech-lead/scripts/fit-check.mjs → kernel/init/fit.mjs} +25 -22
- package/kernel/init/run.mjs +489 -0
- package/{skills/tech-lead/scripts → kernel}/lib/argv.mjs +52 -31
- package/{skills/tech-lead/scripts/lib/contract-md.mjs → kernel/lib/contract.mjs} +261 -17
- package/kernel/lib/paths.mjs +491 -0
- package/kernel/probe/concurrency.mjs +510 -0
- package/{skills/tech-lead/scripts/aegis-digest.mjs → kernel/probe/digest.mjs} +10 -11
- package/kernel/probe/eval.mjs +77 -0
- package/kernel/probe/leg.mjs +125 -0
- package/kernel/probe/resume.mjs +528 -0
- package/{skills/tech-lead/scripts → kernel/probe}/stats.mjs +102 -21
- package/kernel/probe/t0.mjs +66 -0
- package/{skills/ba-pitch-analyzer/scripts/board-derive.mjs → kernel/reduce/board.mjs} +104 -28
- package/kernel/reduce/graph.mjs +437 -0
- package/kernel/reduce/hill.mjs +152 -0
- package/kernel/reduce/ingest.mjs +633 -0
- package/{hooks/slop-cleaner.mjs → kernel/reduce/leftovers.mjs} +40 -57
- package/{skills/tech-lead/scripts/ship-report.mjs → kernel/reduce/ship.mjs} +93 -14
- package/{skills/tech-lead/scripts/run-snapshot.mjs → kernel/reduce/snapshot.mjs} +22 -21
- package/{skills/spec-evaluator/scripts/verdict-ledger.mjs → kernel/reduce/verdict.mjs} +14 -8
- package/kernel/report/export.mjs +325 -0
- package/kernel/report/facts.mjs +347 -0
- package/{skills/tech-lead/scripts/budget-check.mjs → kernel/verify/budget.mjs} +22 -25
- package/kernel/verify/dispatch.mjs +114 -0
- package/{skills/tech-lead/scripts/validate-envelope.mjs → kernel/verify/envelope.mjs} +20 -15
- package/{skills/tech-lead/scripts/lib → kernel/verify}/ratchet-tree.mjs +36 -14
- package/kernel/verify/skills.mjs +125 -0
- package/kernel/verify/spec.mjs +559 -0
- package/{skills/tech-lead/scripts/t0-verify.mjs → kernel/verify/t0.mjs} +138 -28
- package/{skills/tech-lead/scripts/trace-lint.mjs → kernel/verify/trace.mjs} +28 -13
- package/oracles/_shared.mjs +1 -1
- package/oracles/http-oracle.mjs +2 -2
- package/oracles/index.mjs +1 -1
- package/oracles/process-oracle.mjs +2 -2
- package/oracles/snapshot-oracle.mjs +2 -2
- package/oracles/test-oracle.mjs +2 -2
- package/package.json +11 -13
- package/skills/ba-pitch-analyzer/SKILL.md +24 -19
- package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +1 -1
- package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +12 -7
- package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +6 -3
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +5 -4
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +23 -13
- package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +17 -12
- package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +17 -38
- package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +3 -0
- package/skills/ba-pitch-analyzer/references/contract-patterns.md +8 -4
- package/skills/ba-pitch-analyzer/references/doc-schemas.md +3 -1
- package/skills/ba-pitch-analyzer/references/task-generation.md +8 -8
- package/skills/ba-pitch-analyzer/references/test-surface.md +1 -1
- package/skills/coach/SKILL.md +3 -3
- package/skills/orient/SKILL.md +2 -1
- package/skills/qa-edge-hunter/SKILL.md +15 -41
- package/skills/scope-architect/SKILL.md +57 -18
- package/skills/scope-hammer/SKILL.md +5 -5
- package/skills/shapeup/SKILL.md +3 -3
- package/skills/shapeup/resources/context-compaction.md +4 -3
- package/skills/solution-architect/SKILL.md +37 -15
- package/skills/spec-evaluator/SKILL.md +24 -7
- package/skills/spec-evaluator/references/dimensions/_registry.md +2 -2
- package/skills/spec-evaluator/references/dimensions/completeness.md +1 -1
- package/skills/spec-evaluator/references/dimensions/integration.md +98 -67
- package/skills/spec-evaluator/references/dimensions/spec-conformance.md +4 -4
- package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +1 -1
- package/skills/spec-evaluator/references/probing.md +42 -23
- package/skills/spec-evaluator/references/report-schema.md +2 -2
- package/skills/task-executor/SKILL.md +32 -18
- package/skills/tech-lead/SKILL.md +127 -438
- package/skills/tech-lead/references/gates.md +140 -49
- package/skills/tech-lead/references/protocol.md +832 -0
- package/skills/tech-lead/schemas/domain.schema.json +645 -198
- package/skills/tech-lead/schemas/gate-answers.schema.json +2 -2
- package/skills/tech-lead/schemas/work-order.schema.json +11 -2
- package/skills/tech-lead/schemas/work-result.schema.json +56 -18
- package/skills/tech-lead/workflows/shapeup-run.js +1474 -0
- package/skills/translator/SKILL.md +2 -2
- package/hooks/anti-rationalization.mjs +0 -244
- package/hooks/compact-snapshot.mjs +0 -47
- package/hooks/gate-deadline.mjs +0 -151
- package/hooks/gate-l2.mjs +0 -161
- package/hooks/session-rehydrate.mjs +0 -109
- package/skills/advisor-protocol/SKILL.md +0 -171
- package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +0 -239
- package/skills/spec-evaluator/README.md +0 -93
- package/skills/tech-lead/README.md +0 -71
- package/skills/tech-lead/references/delegation.md +0 -254
- package/skills/tech-lead/references/invocation.md +0 -45
- package/skills/tech-lead/references/ledger-schema.md +0 -214
- package/skills/tech-lead/references/round-protocol.md +0 -184
- package/skills/tech-lead/references/state-model.md +0 -66
- package/skills/tech-lead/scripts/ingest-result.mjs +0 -270
- package/skills/tech-lead/scripts/init-run.mjs +0 -326
- package/skills/tech-lead/scripts/lib/is-main.mjs +0 -82
- package/skills/tech-lead/scripts/lib/paths.mjs +0 -278
- package/skills/translator/README.md +0 -66
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://github.com/nguyenvanphituoc/shapeup-sdlc-plugin/schemas/gate-answers.schema.json",
|
|
4
4
|
"title": "GateAnswerSet",
|
|
5
|
-
"description": "A pre-recorded set of PO decisions, one per gate, that lets a run cross its gates without a human in the loop. This is NOT 'gates off' — every gate still emits its block and still records a decision in the ledger; the decision's SOURCE becomes this file instead of a live human. That distinction is the whole design: an unattended run with no answer set stalls at the first ⏸ and burns its wall-clock budget
|
|
5
|
+
"description": "A pre-recorded set of PO decisions, one per gate, that lets a run cross its gates without a human in the loop. This is NOT 'gates off' — every gate still emits its block and still records a decision in the ledger; the decision's SOURCE becomes this file instead of a live human. That distinction is the whole design: an unattended run with no answer set stalls at the first ⏸ and burns its whole wall-clock budget having built nothing, while an unattended run with one produces the same audit trail an interactive run does.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["version", "preset", "answers"],
|
|
8
8
|
"additionalProperties": false,
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"escalation": {
|
|
27
27
|
"type": "object",
|
|
28
28
|
"additionalProperties": false,
|
|
29
|
-
"description": "Policy for a worker
|
|
29
|
+
"description": "RESERVED. Policy for a worker-raised question, which would be a gate in all but name. Inert today: WorkResult carries no escalates field, so no worker can raise one. Kept as a declared key because the answer-set schema forbids additional properties, and removing it would invalidate every gate-answers.json already on disk.",
|
|
30
30
|
"properties": {
|
|
31
31
|
"default": {
|
|
32
32
|
"type": "string",
|
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "work-order.schema.json",
|
|
3
3
|
"title": "WorkOrder",
|
|
4
|
-
"description": "The orchestrator → worker envelope (pure-skill architecture v1.0). Compiled by
|
|
4
|
+
"description": "The orchestrator → worker envelope (pure-skill architecture v1.0). Compiled by kernel/compile.mjs, validated by harness verify envelope before any worker dispatch. A worker depends only on this envelope — never on filesystem topology, run-state format, board schema, or another worker. Path: .shapeup/<slug>/orders/r<N>-a<M>.json (or <slug>/orders/<operation>.json for non-attempt work). Every record type and payload field is DEFINED CENTRALLY in domain.schema.json ($defs + x-payload-by-worker) — this file only shapes the envelope; it never re-defines a domain entity.",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": ["schema_version", "order_id", "worker", "mode", "payload"],
|
|
7
7
|
"properties": {
|
|
8
8
|
"schema_version": { "type": "integer", "enum": [1] },
|
|
9
9
|
"order_id": {
|
|
10
10
|
"type": "string",
|
|
11
|
-
"description": "\"<slug>/r<N>-a<M>\" for build attempts, \"<slug>/<operation>[-r<N>]\" otherwise",
|
|
11
|
+
"description": "\"<slug>/r<N>-a<M>\" for build attempts, \"<slug>/<operation>[-r<N>]\" otherwise. Identifies a dispatch WITHIN a run — it repeats across runs of the same slug, which is why run_id exists.",
|
|
12
12
|
"pattern": "^[a-z0-9][a-z0-9-]*/[a-z0-9][A-Za-z0-9.-]*$"
|
|
13
13
|
},
|
|
14
|
+
"run_id": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "OPTIONAL (v1.8) — the run this dispatch belongs to, stamped by harness compile from the receipt (kernel/lib/paths.mjs). The join key the analysis plane groups on: order_id alone collides across runs of the same slug, so without this no record the pipeline writes can be attributed to a run. Absent when no readable receipt exists (a standalone dispatch in a workspace with no open run) — never invented, and never required, because an analytic field must not be able to block a build.",
|
|
17
|
+
"pattern": "^[a-z0-9][a-z0-9-]*-[0-9]{8}T[0-9]{6}Z-[0-9a-f]{8}$"
|
|
18
|
+
},
|
|
19
|
+
"compiled_at": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "OPTIONAL (v1.8) — ISO timestamp of compilation. The dispatch record's own time dimension: WorkResult carries none, and the journal's timings exist only on the workflow lane, so without this a dispatch on the prose lane is timeless."
|
|
22
|
+
},
|
|
14
23
|
"worker": { "$ref": "domain.schema.json#/$defs/WorkerName" },
|
|
15
24
|
"mode": { "type": "string", "enum": ["orchestrated", "standalone"] },
|
|
16
25
|
"operation": { "$ref": "domain.schema.json#/$defs/Operation" },
|
|
@@ -1,40 +1,78 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "work-result.schema.json",
|
|
3
3
|
"title": "WorkResult",
|
|
4
|
-
"description": "The worker → orchestrator envelope (pure-skill architecture v1.0). Everything a worker used to write into shared files it now RETURNS as data;
|
|
4
|
+
"description": "The worker → orchestrator envelope (pure-skill architecture v1.0). Everything a worker used to write into shared files it now RETURNS as data; kernel/reduce/ingest.mjs performs the writes (tick AC boxes, flip board status, append execution log, propagate unblocks, append discoveries) deterministically, in one place. Path: .shapeup/<slug>/results/r<N>-a<M>.json. Every record type is DEFINED CENTRALLY in domain.schema.json — this file only shapes the envelope.",
|
|
5
5
|
"type": "object",
|
|
6
|
-
"required": [
|
|
6
|
+
"required": [
|
|
7
|
+
"schema_version",
|
|
8
|
+
"order_id",
|
|
9
|
+
"status"
|
|
10
|
+
],
|
|
7
11
|
"properties": {
|
|
8
|
-
"schema_version": {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
"schema_version": {
|
|
13
|
+
"type": "integer",
|
|
14
|
+
"enum": [
|
|
15
|
+
1
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"order_id": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Copied verbatim from the answered WorkOrder — the 1:1 join key."
|
|
21
|
+
},
|
|
22
|
+
"worker": {
|
|
23
|
+
"type": "string"
|
|
24
|
+
},
|
|
25
|
+
"status": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"enum": [
|
|
28
|
+
"done",
|
|
29
|
+
"partial",
|
|
30
|
+
"escalated",
|
|
31
|
+
"failed"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
12
34
|
"task_results": {
|
|
13
35
|
"type": "array",
|
|
14
36
|
"description": "Per-task outcome. ingest-result flips the board row, ticks GATE-verified AC boxes, and appends the Execution Log from these entries.",
|
|
15
|
-
"items": {
|
|
37
|
+
"items": {
|
|
38
|
+
"$ref": "domain.schema.json#/$defs/TaskResult"
|
|
39
|
+
}
|
|
16
40
|
},
|
|
17
41
|
"files_touched": {
|
|
18
42
|
"type": "array",
|
|
19
|
-
"items": {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"type": "array",
|
|
23
|
-
"description": "advisor-protocol ESCALATE blocks — the worker's one outward port.",
|
|
24
|
-
"items": { "$ref": "domain.schema.json#/$defs/Escalate" }
|
|
43
|
+
"items": {
|
|
44
|
+
"$ref": "domain.schema.json#/$defs/FileTouched"
|
|
45
|
+
}
|
|
25
46
|
},
|
|
26
47
|
"discoveries": {
|
|
27
48
|
"type": "array",
|
|
28
49
|
"description": "Raw discovered lines. ingest-result appends them to the discovery ledger — the worker never touches the ledger itself.",
|
|
29
|
-
"items": {
|
|
50
|
+
"items": {
|
|
51
|
+
"$ref": "domain.schema.json#/$defs/Discovery"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"verdict": {
|
|
55
|
+
"$ref": "domain.schema.json#/$defs/Verdict"
|
|
30
56
|
},
|
|
31
|
-
"verdict": { "$ref": "domain.schema.json#/$defs/Verdict" },
|
|
32
57
|
"artifacts": {
|
|
33
58
|
"type": "array",
|
|
34
59
|
"description": "Domain artifacts the worker wrote inside its substrate (spec docs, orient/ files, reports).",
|
|
35
|
-
"items": {
|
|
60
|
+
"items": {
|
|
61
|
+
"type": "string"
|
|
62
|
+
}
|
|
36
63
|
},
|
|
37
|
-
"assumptions": {
|
|
38
|
-
|
|
64
|
+
"assumptions": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"items": {
|
|
67
|
+
"type": "string"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"deviations": {
|
|
71
|
+
"type": "array",
|
|
72
|
+
"items": {
|
|
73
|
+
"type": "string"
|
|
74
|
+
},
|
|
75
|
+
"description": "When status is \"escalated\", the FIRST entry is the blocker: one specific, answerable question with the context needed to answer it. There is no escalates[] field, so this is the only channel a blocked worker has."
|
|
76
|
+
}
|
|
39
77
|
}
|
|
40
78
|
}
|