@praxisflux/gates 0.34.0 → 0.35.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.
@@ -6,3 +6,7 @@ Zero-dependency Node modules shared by every plugin, **vendored into each plugin
6
6
  Planned modules (**TASK-1.2**): `project-root` · `gate-runner` (Stop-hook harness) · `markdown`
7
7
  · `selfcontained` (HTML verifier) · `lifecycle` (status-cannot-exceed-proven-artifacts) ·
8
8
  `installer` · `dates` · `template`.
9
+
10
+ Also shipped here: `handoff-protocol.md` — a stamped copy of the canonical
11
+ `docs/handoff-protocol.md` (re-stamped by `scripts/sync-shared.mjs`), so skills can reference
12
+ the protocol as `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md` from an installed plugin.
@@ -0,0 +1,53 @@
1
+ # The praxisflux handoff protocol (stamped copy)
2
+
3
+ **Do not edit.** This is a stamped copy of the canonical `docs/handoff-protocol.md` at the
4
+ praxisflux repo root, shipped on the `lib/` chassis so `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md`
5
+ resolves from an installed plugin. `scripts/sync-shared.mjs` re-stamps the region below from the
6
+ canonical source; the sync-shared drift test fails the suite if this copy diverges.
7
+
8
+ <!-- praxisflux:handoff-protocol:start -->
9
+ How one plugin hands work to another. The **transport is shared** (`lib/handoff.mjs`); the
10
+ **payload semantics are per plugin pair**. (Full authoring guidance lands in `skill-patterns.md`,
11
+ TASK-1.11 — this is the protocol reference.)
12
+
13
+ ## The rule: transient payload, durable evidence
14
+
15
+ A handoff message is *plumbing*, not a work product — it must not clutter `git status`. So:
16
+
17
+ - **Payloads** live in a **gitignored `.handoff/`** at the project root (the installer adds the
18
+ ignore). They are opaque markdown files with a small envelope; consuming one moves it to
19
+ `.handoff/consumed/`.
20
+ - **Evidence** that a handoff happened — and what it changed — is recorded in the consumer's own
21
+ **tracked state** (e.g. educate's `progress.json`). Gates read the evidence, never the loose
22
+ payload files. A clean `git status` and an enforceable gate at the same time.
23
+ - **Durable residue** (what was actually learned/produced) lands in the normal tracked artifacts
24
+ (a lesson's `guide.md` / `raw-notes.md`), not in the handoff.
25
+
26
+ The gitignored `.handoff/` transport is unrelated to `docs/design-inputs/` (tracked session
27
+ notes and vendored design inputs — see its README): payloads ride here, evidence lives there.
28
+
29
+ ## The envelope (shared)
30
+
31
+ Frontmatter on each `.handoff/<id>.md`:
32
+
33
+ | field | meaning |
34
+ |---|---|
35
+ | `id` | unique message id |
36
+ | `kind` | `request` (e.g. a SPEC) or `response` (e.g. findings) |
37
+ | `from` / `to` | plugin names |
38
+ | `ref` | correlation id tying a response back to its request |
39
+ | `title` | human label |
40
+
41
+ The body below the frontmatter is the **payload — defined by the plugin pair, not the chassis.**
42
+
43
+ ## Instances
44
+
45
+ - **educate → build:** a `request` carrying a **SPEC** (what to build). Evidence: `handoff.specd`.
46
+ - **build → educate:** a `response` carrying **findings** (what building taught us). Evidence:
47
+ `handoff.returned` — **recorded by educate's return leg when it picks the response up** (build
48
+ writes only the payload, never the producer's ledger); once folded back into the lesson,
49
+ `handoff.foldedIn` (gated at `done`).
50
+ - **educate → research (grounding):** a `request` to ground a topic/lesson (see TASK-1.9).
51
+
52
+ Each pair defines its own payload shape; all ride the same envelope + `.handoff/` transport.
53
+ <!-- praxisflux:handoff-protocol:end -->
@@ -6,3 +6,7 @@ Zero-dependency Node modules shared by every plugin, **vendored into each plugin
6
6
  Planned modules (**TASK-1.2**): `project-root` · `gate-runner` (Stop-hook harness) · `markdown`
7
7
  · `selfcontained` (HTML verifier) · `lifecycle` (status-cannot-exceed-proven-artifacts) ·
8
8
  `installer` · `dates` · `template`.
9
+
10
+ Also shipped here: `handoff-protocol.md` — a stamped copy of the canonical
11
+ `docs/handoff-protocol.md` (re-stamped by `scripts/sync-shared.mjs`), so skills can reference
12
+ the protocol as `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md` from an installed plugin.
@@ -0,0 +1,53 @@
1
+ # The praxisflux handoff protocol (stamped copy)
2
+
3
+ **Do not edit.** This is a stamped copy of the canonical `docs/handoff-protocol.md` at the
4
+ praxisflux repo root, shipped on the `lib/` chassis so `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md`
5
+ resolves from an installed plugin. `scripts/sync-shared.mjs` re-stamps the region below from the
6
+ canonical source; the sync-shared drift test fails the suite if this copy diverges.
7
+
8
+ <!-- praxisflux:handoff-protocol:start -->
9
+ How one plugin hands work to another. The **transport is shared** (`lib/handoff.mjs`); the
10
+ **payload semantics are per plugin pair**. (Full authoring guidance lands in `skill-patterns.md`,
11
+ TASK-1.11 — this is the protocol reference.)
12
+
13
+ ## The rule: transient payload, durable evidence
14
+
15
+ A handoff message is *plumbing*, not a work product — it must not clutter `git status`. So:
16
+
17
+ - **Payloads** live in a **gitignored `.handoff/`** at the project root (the installer adds the
18
+ ignore). They are opaque markdown files with a small envelope; consuming one moves it to
19
+ `.handoff/consumed/`.
20
+ - **Evidence** that a handoff happened — and what it changed — is recorded in the consumer's own
21
+ **tracked state** (e.g. educate's `progress.json`). Gates read the evidence, never the loose
22
+ payload files. A clean `git status` and an enforceable gate at the same time.
23
+ - **Durable residue** (what was actually learned/produced) lands in the normal tracked artifacts
24
+ (a lesson's `guide.md` / `raw-notes.md`), not in the handoff.
25
+
26
+ The gitignored `.handoff/` transport is unrelated to `docs/design-inputs/` (tracked session
27
+ notes and vendored design inputs — see its README): payloads ride here, evidence lives there.
28
+
29
+ ## The envelope (shared)
30
+
31
+ Frontmatter on each `.handoff/<id>.md`:
32
+
33
+ | field | meaning |
34
+ |---|---|
35
+ | `id` | unique message id |
36
+ | `kind` | `request` (e.g. a SPEC) or `response` (e.g. findings) |
37
+ | `from` / `to` | plugin names |
38
+ | `ref` | correlation id tying a response back to its request |
39
+ | `title` | human label |
40
+
41
+ The body below the frontmatter is the **payload — defined by the plugin pair, not the chassis.**
42
+
43
+ ## Instances
44
+
45
+ - **educate → build:** a `request` carrying a **SPEC** (what to build). Evidence: `handoff.specd`.
46
+ - **build → educate:** a `response` carrying **findings** (what building taught us). Evidence:
47
+ `handoff.returned` — **recorded by educate's return leg when it picks the response up** (build
48
+ writes only the payload, never the producer's ledger); once folded back into the lesson,
49
+ `handoff.foldedIn` (gated at `done`).
50
+ - **educate → research (grounding):** a `request` to ground a topic/lesson (see TASK-1.9).
51
+
52
+ Each pair defines its own payload shape; all ride the same envelope + `.handoff/` transport.
53
+ <!-- praxisflux:handoff-protocol:end -->
package/lib/README.md CHANGED
@@ -6,3 +6,7 @@ Zero-dependency Node modules shared by every plugin, **vendored into each plugin
6
6
  Planned modules (**TASK-1.2**): `project-root` · `gate-runner` (Stop-hook harness) · `markdown`
7
7
  · `selfcontained` (HTML verifier) · `lifecycle` (status-cannot-exceed-proven-artifacts) ·
8
8
  `installer` · `dates` · `template`.
9
+
10
+ Also shipped here: `handoff-protocol.md` — a stamped copy of the canonical
11
+ `docs/handoff-protocol.md` (re-stamped by `scripts/sync-shared.mjs`), so skills can reference
12
+ the protocol as `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md` from an installed plugin.
@@ -0,0 +1,53 @@
1
+ # The praxisflux handoff protocol (stamped copy)
2
+
3
+ **Do not edit.** This is a stamped copy of the canonical `docs/handoff-protocol.md` at the
4
+ praxisflux repo root, shipped on the `lib/` chassis so `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md`
5
+ resolves from an installed plugin. `scripts/sync-shared.mjs` re-stamps the region below from the
6
+ canonical source; the sync-shared drift test fails the suite if this copy diverges.
7
+
8
+ <!-- praxisflux:handoff-protocol:start -->
9
+ How one plugin hands work to another. The **transport is shared** (`lib/handoff.mjs`); the
10
+ **payload semantics are per plugin pair**. (Full authoring guidance lands in `skill-patterns.md`,
11
+ TASK-1.11 — this is the protocol reference.)
12
+
13
+ ## The rule: transient payload, durable evidence
14
+
15
+ A handoff message is *plumbing*, not a work product — it must not clutter `git status`. So:
16
+
17
+ - **Payloads** live in a **gitignored `.handoff/`** at the project root (the installer adds the
18
+ ignore). They are opaque markdown files with a small envelope; consuming one moves it to
19
+ `.handoff/consumed/`.
20
+ - **Evidence** that a handoff happened — and what it changed — is recorded in the consumer's own
21
+ **tracked state** (e.g. educate's `progress.json`). Gates read the evidence, never the loose
22
+ payload files. A clean `git status` and an enforceable gate at the same time.
23
+ - **Durable residue** (what was actually learned/produced) lands in the normal tracked artifacts
24
+ (a lesson's `guide.md` / `raw-notes.md`), not in the handoff.
25
+
26
+ The gitignored `.handoff/` transport is unrelated to `docs/design-inputs/` (tracked session
27
+ notes and vendored design inputs — see its README): payloads ride here, evidence lives there.
28
+
29
+ ## The envelope (shared)
30
+
31
+ Frontmatter on each `.handoff/<id>.md`:
32
+
33
+ | field | meaning |
34
+ |---|---|
35
+ | `id` | unique message id |
36
+ | `kind` | `request` (e.g. a SPEC) or `response` (e.g. findings) |
37
+ | `from` / `to` | plugin names |
38
+ | `ref` | correlation id tying a response back to its request |
39
+ | `title` | human label |
40
+
41
+ The body below the frontmatter is the **payload — defined by the plugin pair, not the chassis.**
42
+
43
+ ## Instances
44
+
45
+ - **educate → build:** a `request` carrying a **SPEC** (what to build). Evidence: `handoff.specd`.
46
+ - **build → educate:** a `response` carrying **findings** (what building taught us). Evidence:
47
+ `handoff.returned` — **recorded by educate's return leg when it picks the response up** (build
48
+ writes only the payload, never the producer's ledger); once folded back into the lesson,
49
+ `handoff.foldedIn` (gated at `done`).
50
+ - **educate → research (grounding):** a `request` to ground a topic/lesson (see TASK-1.9).
51
+
52
+ Each pair defines its own payload shape; all ride the same envelope + `.handoff/` transport.
53
+ <!-- praxisflux:handoff-protocol:end -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisflux/gates",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "praxisflux gate checks as a zero-dependency CLI (spec-bridge, wiki-freshness, course) — status can't exceed proven artifacts",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -6,3 +6,7 @@ Zero-dependency Node modules shared by every plugin, **vendored into each plugin
6
6
  Planned modules (**TASK-1.2**): `project-root` · `gate-runner` (Stop-hook harness) · `markdown`
7
7
  · `selfcontained` (HTML verifier) · `lifecycle` (status-cannot-exceed-proven-artifacts) ·
8
8
  `installer` · `dates` · `template`.
9
+
10
+ Also shipped here: `handoff-protocol.md` — a stamped copy of the canonical
11
+ `docs/handoff-protocol.md` (re-stamped by `scripts/sync-shared.mjs`), so skills can reference
12
+ the protocol as `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md` from an installed plugin.
@@ -0,0 +1,53 @@
1
+ # The praxisflux handoff protocol (stamped copy)
2
+
3
+ **Do not edit.** This is a stamped copy of the canonical `docs/handoff-protocol.md` at the
4
+ praxisflux repo root, shipped on the `lib/` chassis so `${CLAUDE_PLUGIN_ROOT}/lib/handoff-protocol.md`
5
+ resolves from an installed plugin. `scripts/sync-shared.mjs` re-stamps the region below from the
6
+ canonical source; the sync-shared drift test fails the suite if this copy diverges.
7
+
8
+ <!-- praxisflux:handoff-protocol:start -->
9
+ How one plugin hands work to another. The **transport is shared** (`lib/handoff.mjs`); the
10
+ **payload semantics are per plugin pair**. (Full authoring guidance lands in `skill-patterns.md`,
11
+ TASK-1.11 — this is the protocol reference.)
12
+
13
+ ## The rule: transient payload, durable evidence
14
+
15
+ A handoff message is *plumbing*, not a work product — it must not clutter `git status`. So:
16
+
17
+ - **Payloads** live in a **gitignored `.handoff/`** at the project root (the installer adds the
18
+ ignore). They are opaque markdown files with a small envelope; consuming one moves it to
19
+ `.handoff/consumed/`.
20
+ - **Evidence** that a handoff happened — and what it changed — is recorded in the consumer's own
21
+ **tracked state** (e.g. educate's `progress.json`). Gates read the evidence, never the loose
22
+ payload files. A clean `git status` and an enforceable gate at the same time.
23
+ - **Durable residue** (what was actually learned/produced) lands in the normal tracked artifacts
24
+ (a lesson's `guide.md` / `raw-notes.md`), not in the handoff.
25
+
26
+ The gitignored `.handoff/` transport is unrelated to `docs/design-inputs/` (tracked session
27
+ notes and vendored design inputs — see its README): payloads ride here, evidence lives there.
28
+
29
+ ## The envelope (shared)
30
+
31
+ Frontmatter on each `.handoff/<id>.md`:
32
+
33
+ | field | meaning |
34
+ |---|---|
35
+ | `id` | unique message id |
36
+ | `kind` | `request` (e.g. a SPEC) or `response` (e.g. findings) |
37
+ | `from` / `to` | plugin names |
38
+ | `ref` | correlation id tying a response back to its request |
39
+ | `title` | human label |
40
+
41
+ The body below the frontmatter is the **payload — defined by the plugin pair, not the chassis.**
42
+
43
+ ## Instances
44
+
45
+ - **educate → build:** a `request` carrying a **SPEC** (what to build). Evidence: `handoff.specd`.
46
+ - **build → educate:** a `response` carrying **findings** (what building taught us). Evidence:
47
+ `handoff.returned` — **recorded by educate's return leg when it picks the response up** (build
48
+ writes only the payload, never the producer's ledger); once folded back into the lesson,
49
+ `handoff.foldedIn` (gated at `done`).
50
+ - **educate → research (grounding):** a `request` to ground a topic/lesson (see TASK-1.9).
51
+
52
+ Each pair defines its own payload shape; all ride the same envelope + `.handoff/` transport.
53
+ <!-- praxisflux:handoff-protocol:end -->