@fulmenhq/tsfulmen 0.2.8 → 0.3.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +1 -1
  3. package/config/crucible-ts/agentic/roles/devlead.yaml +21 -3
  4. package/config/crucible-ts/agentic/roles/devrev.yaml +15 -1
  5. package/config/crucible-ts/agentic/roles/qa.yaml +11 -2
  6. package/config/crucible-ts/devsecops/lorage-central/activity/v1.0.0/defaults.yaml +2 -2
  7. package/config/crucible-ts/devsecops/lorage-central/credentials/v1.0.0/defaults.yaml +4 -4
  8. package/config/crucible-ts/devsecops/lorage-central/policy/v1.0.0/defaults.yaml +13 -13
  9. package/config/crucible-ts/devsecops/lorage-central/recipe/v1.0.0/defaults.yaml +13 -13
  10. package/config/crucible-ts/devsecops/lorage-central/runbooks/v1.0.0/defaults.yaml +8 -8
  11. package/config/crucible-ts/devsecops/lorage-central/tenant/v1.0.0/defaults.yaml +9 -9
  12. package/config/crucible-ts/devsecops/secrets/v1.0.0/defaults.yaml +5 -5
  13. package/config/crucible-ts/library/foundry/fixtures/signals/valid/complete.yaml +32 -32
  14. package/config/crucible-ts/library/foundry/signals.yaml +34 -34
  15. package/config/crucible-ts/server/management/server-management.yaml +3 -3
  16. package/config/crucible-ts/taxonomy/fixture-catalog.yaml +1 -1
  17. package/config/crucible-ts/taxonomy/metrics.yaml +1 -1
  18. package/config/crucible-ts/web/styling/site-styling.yaml +16 -16
  19. package/dist/appidentity/index.js.map +1 -1
  20. package/dist/config/index.js.map +1 -1
  21. package/dist/crucible/index.js.map +1 -1
  22. package/dist/errors/index.js.map +1 -1
  23. package/dist/foundry/index.js.map +1 -1
  24. package/dist/fulencode/index.js.map +1 -1
  25. package/dist/fulpack/index.js +43 -31
  26. package/dist/fulpack/index.js.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +44 -32
  29. package/dist/index.js.map +1 -1
  30. package/dist/pathfinder/index.js +0 -1
  31. package/dist/pathfinder/index.js.map +1 -1
  32. package/dist/reports/license-inventory.csv +63 -52
  33. package/dist/schema/index.js.map +1 -1
  34. package/dist/signals/index.js.map +1 -1
  35. package/dist/telemetry/http/index.js.map +1 -1
  36. package/dist/telemetry/index.js.map +1 -1
  37. package/dist/telemetry/prometheus/index.js.map +1 -1
  38. package/package.json +20 -21
  39. package/schemas/crucible-ts/taxonomy/library/fulencode/detection-confidence/v1.0.0/levels.yaml +1 -1
  40. package/schemas/crucible-ts/taxonomy/library/fulpack/archive-formats/v1.0.0/formats.yaml +1 -1
package/CHANGELOG.md CHANGED
@@ -14,6 +14,50 @@ _No unreleased changes._
14
14
 
15
15
  ---
16
16
 
17
+ ## [0.3.0] - 2026-06-06
18
+
19
+ > **Breaking (majors wave).** Migrates four major dependencies (archiver 8, pino 10, TypeScript 6, commander 15) and **raises the Node engine floor to `>=22.12.0`** (was `>=20.0.0`). No external consumers are affected (the galaxy runs Node 22+). Shipped as four reviewed PRs (#6, #9, #10, #11). Full details in `docs/releases/v0.3.0.md`.
20
+
21
+ ### Breaking
22
+
23
+ - **Node engine floor `>=20.0.0` → `>=22.12.0`** (`package.json` `engines.node`). Driven by commander 15 (requires `node>=22.12.0` for `require(esm)`); also clears pino 10's Node-18 drop. Consumers must be on Node 22.12+.
24
+
25
+ ### Security
26
+
27
+ - **archiver 7.0.1 → 8.0.0** — escapes the **unpatchable lodash 4.x advisories** that archiver 7 pulled transitively via `archiver-utils` (GHSA-r5fr-rjxr-66jc `_.template` code injection [high] + two `_.unset`/`_.omit` prototype-pollution advisories [moderate] — none have a fixed lodash 4.x, so dropping lodash was the only remedy). archiver 8 removes `archiver-utils`/`lodash` entirely; its `readdir-glob → minimatch` chain resolves to a patched `minimatch@10.2.x`. Net `bun audit`: **23 → 17** findings (15 → 11 high).
28
+
29
+ ### Changed
30
+
31
+ - **archiver 8 API migration** (`src/fulpack/core.ts`) — archiver 8 is a ground-up ESM rewrite that replaced the callable `archiver(format, options)` factory with format-specific classes. Updated to `new TarArchive(...)` / `new ZipArchive(...)` and the imported `Archiver` type. No public-API or behavior change for fulpack (`create`/`extract`/`scan` unchanged); all 122 fulpack/test files green.
32
+ - **Local archiver v8 type shim** (`src/fulpack/archiver.d.ts`) — archiver 8 ships no types and `@types/archiver` is frozen on the removed v7 factory API, so `@types/archiver` was dropped in favor of a focused ambient `declare module "archiver"` covering the v8 surface fulpack uses. The shim leaks no `archiver` types into the published `dist` surface. **Remove the shim and restore `@types/archiver` once `@types/archiver@8` lands on DefinitelyTyped.**
33
+ - **pino 9.14.0 → 10.3.1** — clean major bump (no source changes). pino 10's only breaking change is dropping Node 18, satisfied by the wave's engine floor; pino remains CJS with a default export, so the `src/logging/logger.ts` integration is unchanged. tsfulmen uses custom redaction (`logging/middleware.ts`), not pino's `redact`/`censor`, so the v10.1.0 censor type change does not apply. Sinks are custom (not pino transports), so the thread-stream@4 / pino-abstract-transport@3 upgrades have no surface here. Added DEBUG/WARN severity-label coverage to complete the logger output assertions across all four methods.
34
+ - **commander 14.0.3 → 15.0.0** — commander 15 is ESM-only and requires `node>=22.12.0` (drives the engine-floor bump above). No source changes: tsfulmen is already ESM and all three CLIs (`foundry/signals`, `schema`, `telemetry/prometheus`) use the stable `import { Command }` API. The `schema export` command defines **standalone** negated flags (`--no-provenance`, `--no-validate`); commander 15's parsing change affects only **paired** positive+negative option definitions (e.g. both `--foo` and `--no-foo`), which tsfulmen does not use, so standalone `--no-*` behavior is unchanged (verified: `schema export --no-provenance --no-validate` works under v15). Validated by smoke-testing the CLIs under v15 at the parse level (help rendering, subcommands, `--json`, the `--no-*` flags above) plus the existing CLI-logic tests. The CLIs `program.parse()` on import, so commander-level arg-parse unit tests would need an `import.meta.main` guard + extracted `buildProgram()` (tracked as a testability follow-up, not part of this bump). _Note: `telemetry/prometheus` `export`/`validate` actions exercise downstream exporter logic that requires a populated `TelemetryRegistry`; those fail in a bare standalone CLI invocation (pre-existing, unrelated to commander — parsing succeeds, the `RefreshError` originates in `exporter.ts`)._
35
+ - **TypeScript (dev) 5.9.3 → 6.0.3** — compiler bump, no `src/` changes. The `tsconfig.json` already sets all options explicitly (`target`/`module`/`lib` ES2022, `moduleResolution: bundler`, `esModuleInterop: true`, `strict`, `skipLibCheck`) and uses none of the options TS 6 removed (`outFile`, `classic`/`node10` resolution, `importsNotUsedAsValues`, etc.), so the default changes don't apply. **Added `ignoreDeprecations: "6.0"`** to `tsconfig.json`: the `.d.ts` build (tsup 8.5.1) injects `baseUrl: "."` into the declaration compiler options (`rollup-plugin-dts` path), and TS 6 errors on the now-deprecated `baseUrl` (`TS5101`) — `ignoreDeprecations` is the TS-sanctioned 6.x-transition opt-out (remove once tsup stops injecting `baseUrl` or before TS 7). Typecheck, full `tsup` `.d.ts` emit, and the `validate:exports`/`validate:types`/`validate:imports` consumer-surface suite all pass under 6.0.3.
36
+
37
+ ### Fixed
38
+
39
+ - **Node 25 test teardown** — `src/config/__tests__/loader.test.ts` used the deprecated `fs.rmdir(path, { recursive: true })`, which is a deprecation warning on Node ≤24 but a hard failure on Node 25.x. Switched to `fs.rm(path, { recursive: true, force: true })` (surfaced during the pino 10 review on Node 25.8.0).
40
+
41
+ ---
42
+
43
+ ## [0.2.10] - 2026-06-05
44
+
45
+ ### Security
46
+
47
+ - **vitest 4.0.18 → 4.1.8** — clears **CRITICAL** GHSA-5xrq-8626-4rwp (vitest UI-server arbitrary file read/exec). The dependency wave also clears direct-dep advisories in ajv (8.20.0), picomatch (4.0.4), yaml (2.9.0), and fastify (5.8.5). Remaining `bun audit` findings are all transitive (archiver→lodash, vitest→vite/postcss, plus residual ajv/fast-uri/picomatch slots pulled by other deps) — tracked for a follow-up wave.
48
+
49
+ ### Changed
50
+
51
+ - **Synced Crucible SSOT to v0.4.13** (`ssot-consumer` ref v0.4.12 → v0.4.13): agentic role catalog `devlead`/`devrev`/`qa` → v1.0.1 (contract-parity), plus goneat v0.5.12 YAML formatting alignment across the synced `config/crucible-ts` and `schemas/crucible-ts` assets.
52
+ - **CI hardening**: `actions/download-artifact@v4 → @v4.1.3` (clears GHSA-cxww-7g56-2vh6 zip-slip), `oven-sh/setup-bun@v1 → @v2`, and `BUN_VERSION 1.2.22 → 1.3.9` (aligned with the local toolchain) in `ci.yml` + `release.yml`; **goneat pin v0.5.12 → v0.5.13** (Makefile + workflow `GONEAT_VERSION`) — picks up the `goneat format --check` YAML false-positive fix.
53
+ - **Dependency wave (v0.2.10, minor/patch — no majors)**: vitest / @vitest/coverage-v8 / @vitest/ui → 4.1.8; @biomejs/biome → 2.4.16 (+ `biome.json` `$schema`); tsx → 4.22.4; prettier → 3.8.3; @types/node → 25.9.1; @types/bun → 1.3.14; @types/picomatch → 4.0.3; fastify → 5.8.5; ajv → 8.20.0; picomatch → 4.0.4; tar-stream → 3.2.0; yaml → 2.9.0; pino → 9.14.0 (held on 9.x). Deferred majors: TypeScript 6, pino 10, commander 15, archiver 8.
54
+
55
+ ### Fixed
56
+
57
+ - **picomatch options**: dropped the no-op `posixSlashes` option in `pathfinder/ignore.ts` (removed from `@types/picomatch` 4.0.3; picomatch never honored it at runtime — zero behavior change), plus biome 2.4.16 import-ordering auto-fixes.
58
+
59
+ ---
60
+
17
61
  ## [0.2.8] - 2026-02-20
18
62
 
19
63
  ### Added
package/README.md CHANGED
@@ -8,7 +8,7 @@ Every team writes their own HTTP status helpers, exit code enums, and country co
8
8
  - **Cross-language parity**: Same exit codes, signals, and schemas as gofulmen, rsfulmen, pyfulmen
9
9
  - **Type-safe**: Full TypeScript types with strict mode throughout
10
10
 
11
- **Lifecycle Phase**: `beta` | **Version**: 0.2.3 | **Test Coverage**: 71%
11
+ **Lifecycle Phase**: `beta` | **Version**: 0.3.0 | **Test Coverage**: 71%
12
12
 
13
13
  **Install**: `bun add @fulmenhq/tsfulmen` (or `npm install @fulmenhq/tsfulmen`)
14
14
 
@@ -2,7 +2,7 @@
2
2
  slug: devlead
3
3
  name: Development Lead
4
4
  description: Architecture, implementation, and code review for FulmenHQ ecosystem
5
- version: 1.0.0
5
+ version: 1.0.1
6
6
  author: entarch
7
7
  status: approved
8
8
  category: agentic
@@ -22,11 +22,11 @@ context: |
22
22
  Distinct from:
23
23
  - devrev: Reviews for correctness (devlead writes the implementation)
24
24
  - infoarch: Focuses on documentation (devlead focuses on code)
25
+ - qa: Validates end-to-end behavior and test strategy (devlead ships implementation-ready code)
25
26
  scope:
26
27
  - Feature implementation and bug fixes
27
28
  - Code architecture and design patterns
28
29
  - Integration across components
29
- - Code review and PR oversight
30
30
  - Release preparation
31
31
  - FulmenHQ ecosystem patterns (gofulmen, tsfulmen, pyfulmen)
32
32
  mindset:
@@ -36,19 +36,26 @@ mindset:
36
36
  - Will this be maintainable in 6 months?
37
37
  - Are there edge cases I'm missing?
38
38
  - Does this align with FulmenHQ patterns?
39
+ - Which contract/default/error-path decision would a devrev call out as P1?
39
40
  principles:
40
41
  - Build incrementally with working checkpoints
41
42
  - Prefer standard library over dependencies
42
43
  - Write tests alongside implementation
43
44
  - Keep changes focused on the task
44
45
  - Follow existing codebase patterns
46
+ - Implement strict/contract-compliant behavior first, then add tolerant modes explicitly
47
+ - Verify schema + fixtures + standards before declaring implementation complete
48
+ - "Default precedence: schema silent -> standards doc authoritative; schema vs standards conflict -> escalate before merge"
45
49
  responsibilities:
46
50
  - Implement features according to specifications
47
51
  - Maintain code quality and consistency
48
- - Run quality gates before commits (make precommit)
52
+ - Run quality gates before commits (make check-all)
49
53
  - Document architectural decisions in code and ADRs
50
54
  - Coordinate with other roles on cross-cutting concerns
51
55
  - Ensure API consistency with FulmenHQ ecosystem patterns
56
+ - Validate public API shape and defaults against synced schemas and standards
57
+ - Add fixture-backed parity tests for canonical happy-path and failure-path behavior
58
+ - Escalate intentional deviations from SSOT contracts before merge
52
59
  escalates_to:
53
60
  - target: human maintainers
54
61
  when: Releases, version tags, breaking changes
@@ -65,6 +72,17 @@ does_not:
65
72
  - Commit secrets or credentials
66
73
  - Modify files outside task scope without justification
67
74
  - Create inconsistent APIs across language implementations
75
+ - Assume defaults; all defaults must be sourced from spec/schema
76
+ - Treat passing happy-path tests as sufficient for contract correctness
77
+ checklists:
78
+ implementation:
79
+ - "Contract parity: Do types/fields/enums match synced schemas exactly? (missing test: regression for each mismatch)"
80
+ - "Defaults parity: Are default values and behaviors explicitly aligned with standards? (missing test: default-value assertions)"
81
+ - "Error paths: Are strict-mode and malformed-input behaviors tested? (missing test: failure-path coverage)"
82
+ - "Deferred scope: Are unsupported features returning canonical explicit errors? (missing test: explicit error assertions)"
83
+ - "Fixture parity: Are canonical fixtures wired and passing? (missing test: fixture case not yet implemented)"
84
+ - "Cross-language parity: Does behavior align with gofulmen/tsfulmen/pyfulmen intent? (missing test: cross-language equivalence suite)"
85
+ - "Quality gates: Has make check-all passed locally? (missing test: any new lint/type failures)"
68
86
  examples:
69
87
  - type: commit
70
88
  title: Feature implementation
@@ -2,7 +2,7 @@
2
2
  slug: devrev
3
3
  name: Development Reviewer
4
4
  description: Code review, bug finding, and four-eyes audit
5
- version: 1.0.0
5
+ version: 1.0.1
6
6
  author: entarch
7
7
  status: approved
8
8
  category: review
@@ -24,6 +24,7 @@ context: |
24
24
  Distinct from:
25
25
  - devlead: Writes the implementation (devrev reviews it)
26
26
  - secrev: Focuses on security vulnerabilities (devrev focuses on correctness)
27
+ - qa: Validates broader test strategy and user-level behavior (devrev focuses on implementation correctness)
27
28
  scope:
28
29
  - Code review for correctness and maintainability
29
30
  - Bug finding and edge case identification
@@ -31,6 +32,7 @@ scope:
31
32
  - Error handling verification
32
33
  - Performance concern identification
33
34
  - Consistency with codebase patterns
35
+ - Contract conformance against synced schemas, fixtures, and standards
34
36
  mindset:
35
37
  focus:
36
38
  - What assumptions is this code making that might be wrong?
@@ -39,12 +41,15 @@ mindset:
39
41
  - Will this fail gracefully or catastrophically?
40
42
  - Are the tests actually testing the right things?
41
43
  - Would I understand this code in 6 months?
44
+ - Does this implementation match spec defaults and strict-mode behavior exactly?
42
45
  principles:
43
46
  - Challenge happy path thinking
44
47
  - Question implicit assumptions
45
48
  - Verify error paths are handled
46
49
  - Ensure tests cover edge cases
47
50
  - Be constructively critical, not adversarial
51
+ - Treat schema/spec/default mismatches as defects, not style preferences
52
+ - "Default precedence: schema silent -> standards doc authoritative; schema vs standards conflict -> escalate"
48
53
  responsibilities:
49
54
  - Review code changes for correctness
50
55
  - Identify bugs, edge cases, and logic errors
@@ -53,6 +58,9 @@ responsibilities:
53
58
  - Assess code maintainability and readability
54
59
  - Confirm consistency with existing patterns
55
60
  - Provide actionable feedback with specific suggestions
61
+ - Verify contract parity for public APIs (types, fields, enums, defaults)
62
+ - Verify strict-mode behavior and malformed-input paths are covered by tests
63
+ - Flag fixture/spec mismatches early and recommend escalation path
56
64
  escalates_to:
57
65
  - target: human maintainers
58
66
  when: Fundamental design disagreements
@@ -69,6 +77,7 @@ does_not:
69
77
  - Rubber-stamp changes from senior contributors
70
78
  - Rewrite the implementation (suggest changes instead)
71
79
  - Block on style preferences (focus on correctness)
80
+ - Approve on green CI alone when contract-parity checks are missing
72
81
  examples:
73
82
  - type: review
74
83
  title: Good review comment
@@ -106,3 +115,8 @@ checklists:
106
115
  - "Performance: Any obvious O(n²) or memory issues?"
107
116
  - "Maintainability: Will someone understand this in 6 months?"
108
117
  - "Consistency: Does it match existing patterns in the codebase?"
118
+ - "Schema parity: Do public fields/types/enums match synced JSON schemas? (missing test: regression for each mismatch)"
119
+ - "Spec defaults: Are default values/behaviors aligned with standards text? (missing test: default-value assertions)"
120
+ - "Strict-mode behavior: Do strict settings reject malformed input as required? (missing test: strict-mode rejection cases)"
121
+ - "Fixture parity: Are canonical fixture cases wired and passing? (missing test: fixture case not yet implemented)"
122
+ - "Deferred scope handling: Are out-of-phase features explicitly and canonically rejected? (missing test: explicit rejection assertions)"
@@ -2,7 +2,7 @@
2
2
  slug: qa
3
3
  name: Quality Assurance
4
4
  description: Testing, validation, and quality gate enforcement for enterprise-scale Fulmen systems
5
- version: 1.0.0
5
+ version: 1.0.1
6
6
  author: entarch
7
7
  status: approved
8
8
  category: review
@@ -41,6 +41,7 @@ scope:
41
41
  - Tool integration testing (goneat, fulward, sumpter)
42
42
  # Enterprise validation
43
43
  - API contract validation (OpenAPI, JSON Schema)
44
+ - Spec-default and strict-mode behavior validation
44
45
  - Fixture-based integration testing (real execution, not mocks)
45
46
  - Observability verification (metrics, logs, traces)
46
47
  - AAA validation (authentication, authorization, audit)
@@ -56,6 +57,7 @@ mindset:
56
57
  - Is the test actually testing what it claims?
57
58
  - Would this test catch a regression?
58
59
  - Does this honor the SSOT contracts?
60
+ - Do defaults and error-path semantics match the standard exactly?
59
61
  - Does this work across all target languages?
60
62
  - Is the fixture realistic enough to catch real bugs?
61
63
  - Are observability signals firing correctly?
@@ -66,12 +68,14 @@ mindset:
66
68
  - Keep tests fast and focused
67
69
  - Use fixtures for real execution, never mock integration points
68
70
  - Validate contracts at layer boundaries
71
+ - Treat schema/spec/default mismatches as defects, not style issues
69
72
  - Dogfood before release
70
73
  - Respect coverage targets from module manifest
71
74
  responsibilities:
72
75
  - Design comprehensive test cases aligned with layer cake architecture
73
76
  - Verify quality gates pass (`make check-all`, goneat hooks)
74
77
  - Validate schema conformance against Crucible SSOT
78
+ - Validate default values and strict-mode behavior against standards docs
75
79
  - Execute cross-language parity tests for *fulmen libraries
76
80
  - Run CRDL validation on template changes
77
81
  - Execute dogfooding workflows against fixture servers
@@ -79,6 +83,7 @@ responsibilities:
79
83
  - Validate AAA flows (auth, authz, audit logging)
80
84
  - Maintain fixture scenarios and test data (no PII)
81
85
  - Document test findings with clear reproduction steps
86
+ - Classify findings by severity (P0/P1/P2) with exact file/line evidence
82
87
  - Verify CalVer compatibility on releases
83
88
  escalates_to:
84
89
  - target: devlead
@@ -98,12 +103,16 @@ does_not:
98
103
  - Test with production data or PII
99
104
  - Skip CRDL validation for template changes
100
105
  - Bypass goneat/fulward quality gates
106
+ - Approve changes on green CI alone when contract-parity checks are missing
101
107
  checklists:
102
108
  quality_bars:
103
109
  - "Coverage targets: Go >=95%, TypeScript >=85%, Python >=90%"
104
110
  - "make check-all must pass"
105
111
  - "goneat precommit hooks enforced"
106
- - "schema validation via validate-schemas.ts"
112
+ - "Schema + standard parity validated (types, enums, required fields, defaults)"
113
+ - "Strict-mode behavior validated for malformed/ambiguous inputs"
114
+ - "Fixture parity validated (happy path + failure fixtures)"
115
+ - "Findings reported with severity and reproduction steps"
107
116
  - "Fixtures: container-first, scenario-driven, no PII"
108
117
  examples:
109
118
  - type: other
@@ -5,14 +5,14 @@
5
5
  # Version: v1.0.0 (Ties to schema; integrates gofulmen).
6
6
  # Example Event Template (auto-populated in REPL)
7
7
  eventTemplate:
8
- eventType: unlock # From enum
8
+ eventType: unlock # From enum
9
9
  outcome: success
10
10
  metadata:
11
11
  sessionId: "sess-default-001"
12
12
  userId: "user-anon-123"
13
13
  duration: "5s"
14
14
  details: {method: totp}
15
- backend: # Refs policy.audit
15
+ backend: # Refs policy.audit
16
16
  level: structured
17
17
  retain: 30d
18
18
  # Usage: REPL emits: {id: evt-default-unlock-001, timestamp: now, tenant: tnt-uuid-123-prod-us, ...}
@@ -4,17 +4,17 @@
4
4
  # Rationale: Secure defaults (1y expiry); used in seeding/actions.
5
5
  # Version: v1.0.0 (Ties to schema; backend from policy).
6
6
  id: default-bootstrap-key
7
- tenant: tnt-uuid-123-prod-us # From registry
7
+ tenant: tnt-uuid-123-prod-us # From registry
8
8
  type: gpg-key
9
- ref: "gpg://keyring/default-bootstrap" # Opaque; decrypted at runtime
9
+ ref: "gpg://keyring/default-bootstrap" # Opaque; decrypted at runtime
10
10
  metadata:
11
11
  created: "2025-11-09T12:00:00Z"
12
- expires: "2026-11-09T12:00:00Z" # 1y default
12
+ expires: "2026-11-09T12:00:00Z" # 1y default
13
13
  purpose: tenant-bootstrap
14
14
  rotation:
15
15
  interval: 365d
16
16
  method: manual
17
- backend: # Refs policy.isolation.store
17
+ backend: # Refs policy.isolation.store
18
18
  type: gpg-file
19
19
  enc: true
20
20
  # Usage: In recipe.actions or seeding: ref this for bootstrap; REPL checks expiry.
@@ -3,34 +3,34 @@
3
3
  # Description: Default policy for new tenants (loaded via three-layer config; overrides in .fulmen/lorage.yaml).
4
4
  # Rationale: Secure MVP defaults (short TTL, MFA required, Turso backend); confidential example (obscure publicId).
5
5
  # Version: v1.0.0 (Ties to schema; auto-applies dataSensitivity guards from registry).
6
- tenant: tnt-uuid-123-prod-us # Obscure publicId from registry (confidential=true; no client exposure)
6
+ tenant: tnt-uuid-123-prod-us # Obscure publicId from registry (confidential=true; no client exposure)
7
7
  session:
8
8
  ttl:
9
- default: 15m # Force re-unlock per session
9
+ default: 15m # Force re-unlock per session
10
10
  ops:
11
11
  deploy: 1h
12
12
  query: 5m
13
13
  seed: 30m
14
- maxConcurrent: 1 # Strict isolation
14
+ maxConcurrent: 1 # Strict isolation
15
15
  mfa:
16
- required: true # Auto-true if registry.dataSensitivity.pii=true
17
- methods: [totp, webauthn] # From auth-methods taxonomy
16
+ required: true # Auto-true if registry.dataSensitivity.pii=true
17
+ methods: [totp, webauthn] # From auth-methods taxonomy
18
18
  fallback: cli-prompt
19
19
  isolation:
20
20
  store:
21
- type: turso # HA default
21
+ type: turso # HA default
22
22
  conn:
23
- url: "turso://default-db" # Placeholder; ref root-credentials
23
+ url: "turso://default-db" # Placeholder; ref root-credentials
24
24
  auth: {ref: "gpg://keyring/default-bootstrap"}
25
- enc: false # Enable for cloud-free
25
+ enc: false # Enable for cloud-free
26
26
  crossAccess: false
27
- geoRestrictions: [eu-west-1] # From registry.geo (e.g., EU for GDPR)
28
- cloudRestrictions: [aws, doc] # From registry.cloud
27
+ geoRestrictions: [eu-west-1] # From registry.geo (e.g., EU for GDPR)
28
+ cloudRestrictions: [aws, doc] # From registry.cloud
29
29
  dataSensitivityGuards:
30
- pii: false # Auto-from registry; triggers mfa/geo if true
31
- phi: false # Triggers enc/audit if true
30
+ pii: false # Auto-from registry; triggers mfa/geo if true
31
+ phi: false # Triggers enc/audit if true
32
32
  audit:
33
- level: structured # gofulmen integration
33
+ level: structured # gofulmen integration
34
34
  retain: 30d
35
35
  # Usage: REPL loads defaults + overrides; validates against schema/registry.
36
36
  # Example Override: For PHI tenant, set dataSensitivityGuards.phi: true → auto-enc=true.
@@ -3,27 +3,27 @@
3
3
  # Description: Default recipe config (e.g., for Mattermost MVP); loaded via three-layer.
4
4
  # Rationale: Declarative base (components/phases); procedural actions for bootstrap.
5
5
  # Version: v1.0.0 (Ties to schema; refs taxonomies for provider/backend/phase).
6
- name: mattermost-stack # Slug-safe
6
+ name: mattermost-stack # Slug-safe
7
7
  type: deploy
8
8
  target:
9
- provider: doc # From infra-providers
9
+ provider: doc # From infra-providers
10
10
  region: nyc3
11
- backend: opentofu # From toolchains
11
+ backend: opentofu # From toolchains
12
12
  components:
13
13
  - name: postgres
14
14
  image: postgres:15
15
- phase: storage # From infra-phases (order 3)
15
+ phase: storage # From infra-phases (order 3)
16
16
  ports: [5432]
17
17
  env:
18
18
  POSTGRES_DB: mattermost
19
19
  secrets:
20
20
  - ref: "gpg://keyring/acme/db-pass"
21
21
  injectAs: POSTGRES_PASSWORD
22
- dependsOn: [] # No deps for base DB
23
- module: db-postgres # Tofu module
22
+ dependsOn: [] # No deps for base DB
23
+ module: db-postgres # Tofu module
24
24
  - name: mattermost
25
25
  image: mattermost/mattermost-team:latest
26
- phase: compute # Order 4
26
+ phase: compute # Order 4
27
27
  ports: [8065]
28
28
  env:
29
29
  MM_POSTGRES_URL: "postgres://user:pass@localhost:5432/mattermost"
@@ -34,15 +34,15 @@ components:
34
34
  module: app-mattermost
35
35
  actions:
36
36
  - type: bootstrap
37
- phase: bootstrap # Order 0; procedural for key gen
38
- cmd: "gpg --gen-key --batch acme-bootstrap" # Example script
37
+ phase: bootstrap # Order 0; procedural for key gen
38
+ cmd: "gpg --gen-key --batch acme-bootstrap" # Example script
39
39
  dependsOn: []
40
40
  - type: script
41
- phase: network # Order 2
42
- cmd: "doctl compute vpc create --name acme-vpc" # SDK wrapper for VPC
41
+ phase: network # Order 2
42
+ cmd: "doctl compute vpc create --name acme-vpc" # SDK wrapper for VPC
43
43
  dependsOn: [bootstrap]
44
44
  secrets:
45
- backend: gpg-keyring # Refs policy.isolation.store
45
+ backend: gpg-keyring # Refs policy.isolation.store
46
46
  globalRefs:
47
47
  - ref: "turso://shared-network-key"
48
48
  validate:
@@ -50,7 +50,7 @@ validate:
50
50
  endpoint: "http://localhost:8065/health"
51
51
  - type: connect
52
52
  endpoint: "postgres://localhost:5432/mattermost"
53
- diff: # For seed type
53
+ diff: # For seed type
54
54
  from: v1-0
55
55
  to: v1-1
56
56
  changes:
@@ -3,26 +3,26 @@
3
3
  # Description: Default runbook config (e.g., global-network prototype); loaded via three-layer.
4
4
  # Rationale: Serializes Markdown prototypes (e.g., from .plans/research/); executable in REPL.
5
5
  # Version: v1.0.0 (Ties to schema; refs phases/recipe for steps).
6
- id: global-network # Slug-safe
6
+ id: global-network # Slug-safe
7
7
  title: Global Enterprise Network Setup
8
- tenantScope: [all] # Or specific publicIds
8
+ tenantScope: [all] # Or specific publicIds
9
9
  description: >-
10
10
  Beginnings of the Runbook: Global Enterprise Picture with Tenants. Our runbook will live in the IDE... (from prototypes).
11
11
  phases:
12
- - id: bootstrap # From infra-phases
12
+ - id: bootstrap # From infra-phases
13
13
  title: Initial Setup
14
14
  description: "Core Components: Provision monitoring first."
15
15
  steps:
16
16
  - id: vaultwarden-init
17
17
  type: script
18
- content: "docker run -d --name vaultwarden vaultwarden/server:latest" # Bootstrap secrets
18
+ content: "docker run -d --name vaultwarden vaultwarden/server:latest" # Bootstrap secrets
19
19
  dependsOn: []
20
20
  parallel: false
21
21
  - id: prometheus-setup
22
22
  type: action
23
- ref: prometheus-stack # Ref recipe
23
+ ref: prometheus-stack # Ref recipe
24
24
  dependsOn: [vaultwarden-init]
25
- - id: network # Order 2
25
+ - id: network # Order 2
26
26
  title: Networking Backbone
27
27
  description: "Zero-trust backbone (Cloudflare Gateway); VPC peering for hybrids."
28
28
  steps:
@@ -35,10 +35,10 @@ phases:
35
35
  | 3 Leaps Sponsored | Internal | Sponsored OSS | Cloudflare (Workers/DNS), Azure (AI), Hetzner (compute) | API tokens, DB creds | Worker deployments, basic storage |
36
36
  | 3 Leaps Commercial | External | Client-specific | Client-dictated (AWS/Azure/GCP) | Isolated vaults | Hybrid connectivity, compliance-heavy |
37
37
  dependsOn: []
38
- parallel: true # Table review parallel with setup
38
+ parallel: true # Table review parallel with setup
39
39
  - id: vpc-peering-setup
40
40
  type: script
41
- content: "doctl compute vpc create --name global-vpc" # Create VPC for hybrid peering
41
+ content: "doctl compute vpc create --name global-vpc" # Create VPC for hybrid peering
42
42
  dependsOn: [tenant-table]
43
43
  validate:
44
44
  type: custom
@@ -5,24 +5,24 @@
5
5
  # Version: v1.0.0 (Ties to schema; geo/cloud from taxonomies).
6
6
  client:
7
7
  id: default-client-internal
8
- name: Default Client # Confidential; not exposed
9
- confidential: true # Obscure publicIds (UUID-based)
8
+ name: Default Client # Confidential; not exposed
9
+ confidential: true # Obscure publicIds (UUID-based)
10
10
  tenants:
11
- - publicId: tnt-uuid-123-prod-us # Globally unique/obscure
11
+ - publicId: tnt-uuid-123-prod-us # Globally unique/obscure
12
12
  purpose: production-mattermost
13
- geo: [na] # From geo-regions (expands to us/ca)
14
- cloud: [doc, aws] # From infra-providers
13
+ geo: [na] # From geo-regions (expands to us/ca)
14
+ cloud: [doc, aws] # From infra-providers
15
15
  dataSensitivity:
16
16
  pii: false
17
17
  phi: false
18
- other: [] # e.g., [pci-dss]
18
+ other: [] # e.g., [pci-dss]
19
19
  - publicId: tnt-uuid-456-dev-eu
20
20
  purpose: development-testing
21
- geo: [eu] # Expands to de/fr/gb/ch (conventions)
21
+ geo: [eu] # Expands to de/fr/gb/ch (conventions)
22
22
  cloud: [gcp]
23
23
  dataSensitivity:
24
- pii: true # Triggers policy guards (mfa/geo)
24
+ pii: true # Triggers policy guards (mfa/geo)
25
25
  phi: false
26
- globalUniqueness: true # Enforced (UUID for anon)
26
+ globalUniqueness: true # Enforced (UUID for anon)
27
27
  # Usage: REPL loads defaults + client overrides; validates publicId uniqueness.
28
28
  # Example: For confidential client, generate UUID publicIds; pii=true → policy.mfa.required=true.
@@ -42,7 +42,7 @@ projects:
42
42
  type: password
43
43
  value: debug
44
44
  policies:
45
- allow_plain_secrets: true # OK for development
45
+ allow_plain_secrets: true # OK for development
46
46
 
47
47
  # Example 2: Full-Featured Credentials with Metadata & Rotation
48
48
  # Use case: Production secrets with lifecycle tracking and rotation policies
@@ -142,7 +142,7 @@ projects:
142
142
  credentials:
143
143
  DATABASE_URL:
144
144
  type: password
145
- ref: vault://secrets/staging/db-url # Shared reference
145
+ ref: vault://secrets/staging/db-url # Shared reference
146
146
  QUEUE_URL:
147
147
  type: password
148
148
  value: amqp://staging-queue.internal:5672
@@ -153,7 +153,7 @@ projects:
153
153
  type: password
154
154
  value: https://fake@sentry.io/staging
155
155
  - project_slug: frontend_staging
156
- env_prefix: VITE_ # Override global prefix for frontend
156
+ env_prefix: VITE_ # Override global prefix for frontend
157
157
  credentials:
158
158
  API_URL:
159
159
  type: password
@@ -181,7 +181,7 @@ projects:
181
181
  schema_version: v1.0.0
182
182
  encryption:
183
183
  method: gpg
184
- key_id: 7A8B9C0D1E2F3A4B # GPG key fingerprint
184
+ key_id: 7A8B9C0D1E2F3A4B # GPG key fingerprint
185
185
  encrypted_at: "2025-11-15T10:00:00Z"
186
186
  cipher: AES-256-GCM
187
187
  # The 'projects' array is encrypted inside this ciphertext blob
@@ -207,7 +207,7 @@ ciphertext: |
207
207
  ...real encrypted payload would be here...
208
208
  -----END PGP MESSAGE-----
209
209
  policies:
210
- allow_plain_secrets: false # Enforce encryption for production
210
+ allow_plain_secrets: false # Enforce encryption for production
211
211
 
212
212
  # Example 5: Production Environment (Encrypted - age)
213
213
  # Use case: Modern encryption with age instead of GPG