@ogygie/core 0.16.0 → 0.18.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ogygie/core",
3
- "version": "0.16.0",
3
+ "version": "0.18.0",
4
4
  "description": "Ogygie framework core: manifest/spec/error schemas, generic tenancy and gate tooling. Ships TypeScript sources — Ogygie products run tsx/vitest by construction (D1).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -265,8 +265,12 @@ describe("hasImplementation — ce qui prouve qu'une spec draft a déjà du code
265
265
  }
266
266
  });
267
267
 
268
- it("une FEATURE skeleton dont le dossier existe a bien du code — c'est la preuve historique", () => {
269
- expect(hasImplementation(owner("feature", "skeleton"), true)).toBe(true);
268
+ it("une FEATURE skeleton dont le dossier existe n'a PAS de code déclaré — la branche spéculative de D26 porte un dossier avant la signature", () => {
269
+ // La preuve historique (« un dossier de feature naît avec son code ») est
270
+ // retirée : le générateur émet un dossier pendant que la spec attend sa
271
+ // validation, et le gate refusait l'état que le processus prescrit
272
+ // (FAILURES.md 2026-10-18). Le statut déclaré est la seule preuve.
273
+ expect(hasImplementation(owner("feature", "skeleton"), true)).toBe(false);
270
274
  expect(hasImplementation(owner("feature", "skeleton"), false)).toBe(false);
271
275
  });
272
276
 
@@ -277,4 +281,9 @@ describe("hasImplementation — ce qui prouve qu'une spec draft a déjà du code
277
281
  expect(hasImplementation(owner("package", "skeleton"), true)).toBe(false);
278
282
  expect(hasImplementation(owner("framework-package", "skeleton"), true)).toBe(false);
279
283
  });
284
+
285
+ it("MUTATION : une entrée in-progress ou delivered dont la spec reste draft est le défaut que le gate attrape encore", () => {
286
+ expect(hasImplementation(owner("feature", "in-progress"), false)).toBe(true);
287
+ expect(hasImplementation(owner("feature", "delivered"), true)).toBe(true);
288
+ });
280
289
  });
@@ -162,22 +162,24 @@ export function findSpecOwner(
162
162
  * Does an implementation of this spec exist? The question the `draft` rule of
163
163
  * the spec lifecycle rests on ("draft = no code yet").
164
164
  *
165
- * A declared status above `skeleton` always answers yes. A FOLDER on disk only
166
- * answers yes for a FEATURE, whose folder is born with its code and is
167
- * therefore evidence of it. A package's folder is NOT evidence: the manifest
168
- * gate REQUIRES it to exist (MANIFEST_PACKAGE_NOT_FOUND), so a package
169
- * declared `skeleton` whose spec is still `draft` could satisfy neither gate —
170
- * one demands the folder, the other reads it as code, and the project is stuck
171
- * between two governed files it may not edit. Observed on a consumer project
172
- * the day it declared its first package before writing it.
165
+ * The answer is the STATUS the map declares, and nothing else: an entry above
166
+ * `skeleton` claims code, a `skeleton` entry claims none — it is a proposal on
167
+ * the map. A folder on disk is NOT evidence. For a package it never was: the
168
+ * manifest gate REQUIRES the folder (MANIFEST_PACKAGE_NOT_FOUND), so reading it
169
+ * as code left a project stuck between two governed files. For a feature it
170
+ * used to be — a feature's folder was born with its code — until speculative
171
+ * execution (DECISIONS.md D26 of the framework repo): a generated feature has
172
+ * its folder on its branch while its spec is still `draft`, awaiting the human
173
+ * signature, and the gate refused the very state the process prescribes
174
+ * (framework FAILURES.md 2026-10-18). The status is what the author declares;
175
+ * the folder is what a generator or a session left there.
173
176
  *
174
177
  * Lives here rather than in the gate script for the reason the whole module
175
178
  * exists: the rule travels with the versioned package, not with a copy each
176
179
  * project keeps.
177
180
  */
178
- export function hasImplementation(owner: SpecOwner, folderExists: boolean): boolean {
179
- if (owner.status !== "skeleton") return true;
180
- return owner.kind === "feature" && folderExists;
181
+ export function hasImplementation(owner: SpecOwner, _folderExists: boolean): boolean {
182
+ return owner.status !== "skeleton";
181
183
  }
182
184
 
183
185
  /** What a refusal should suggest — both natures, never one that cannot exist. */