@wairon/cli 5.1.1-dev.109 → 5.1.1-dev.110

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/dist/index.d.ts CHANGED
@@ -155,6 +155,13 @@ type NamingRuleConfig = z.infer<typeof NamingRuleConfigSchema>;
155
155
  * and rename accept the same names. Pure.
156
156
  */
157
157
  declare function methodCasingFor(naming: Pick<NamingRuleConfig, 'methods'> | undefined, targetLanguage?: string): string;
158
+ /**
159
+ * Whether a method name fits a casing (methodCasingFor's answer): a known
160
+ * style, or a configured regular expression on top of the identifier grammar.
161
+ * An unreadable expression refuses nothing here (the naming rule reports it as
162
+ * INVALID_NAMING_PATTERN). Pure.
163
+ */
164
+ declare function fitsMethodCasing(name: string, casing: string): boolean;
158
165
  declare const DocumentationRuleConfigSchema: z.ZodObject<{
159
166
  /** Minimum character length for description fields */
160
167
  minDescriptionLength: z.ZodOptional<z.ZodNumber>;
@@ -2931,7 +2938,7 @@ declare function projectIdentity(config: Pick<ProjectConfig, 'id' | 'name' | 'pr
2931
2938
  * (`.wai/externals/<alias>.yaml`), which no Windows checkout could hold.
2932
2939
  */
2933
2940
  declare const EXTERNAL_ALIAS_RE: RegExp;
2934
- /** Why an alias breaks EXTERNAL_ALIAS_RE, in words: the grammar, or a Windows device name. */
2941
+ /** Why an alias breaks EXTERNAL_ALIAS_RE, in words (identifier.problemAs alias): the grammar, a device name, the length, ... */
2935
2942
  declare function aliasGrammarProblem(alias: string): string;
2936
2943
  /**
2937
2944
  * declared_external — one external as the configuration declares it,
@@ -5742,7 +5749,7 @@ declare const PackAssertionSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<
5742
5749
  profile?: string[] | undefined;
5743
5750
  componentType?: string[] | undefined;
5744
5751
  };
5745
- level: "component" | "interface" | "implementation";
5752
+ level: "interface" | "implementation" | "component";
5746
5753
  values?: string[] | undefined;
5747
5754
  }, {
5748
5755
  code: string;
@@ -5756,7 +5763,7 @@ declare const PackAssertionSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<
5756
5763
  };
5757
5764
  values?: string[] | undefined;
5758
5765
  severity?: "error" | "warning" | undefined;
5759
- level?: "component" | "interface" | "implementation" | undefined;
5766
+ level?: "interface" | "implementation" | "component" | undefined;
5760
5767
  }>, z.ZodObject<{
5761
5768
  on: z.ZodObject<{
5762
5769
  componentType: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -6508,7 +6515,7 @@ declare const DeclarativePackSchema: z.ZodObject<{
6508
6515
  profile?: string[] | undefined;
6509
6516
  componentType?: string[] | undefined;
6510
6517
  };
6511
- level: "component" | "interface" | "implementation";
6518
+ level: "interface" | "implementation" | "component";
6512
6519
  values?: string[] | undefined;
6513
6520
  }, {
6514
6521
  code: string;
@@ -6522,7 +6529,7 @@ declare const DeclarativePackSchema: z.ZodObject<{
6522
6529
  };
6523
6530
  values?: string[] | undefined;
6524
6531
  severity?: "error" | "warning" | undefined;
6525
- level?: "component" | "interface" | "implementation" | undefined;
6532
+ level?: "interface" | "implementation" | "component" | undefined;
6526
6533
  }>, z.ZodObject<{
6527
6534
  on: z.ZodObject<{
6528
6535
  componentType: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -6727,7 +6734,7 @@ declare const DeclarativePackSchema: z.ZodObject<{
6727
6734
  profile?: string[] | undefined;
6728
6735
  componentType?: string[] | undefined;
6729
6736
  };
6730
- level: "component" | "interface" | "implementation";
6737
+ level: "interface" | "implementation" | "component";
6731
6738
  values?: string[] | undefined;
6732
6739
  } | {
6733
6740
  code: string;
@@ -6873,7 +6880,7 @@ declare const DeclarativePackSchema: z.ZodObject<{
6873
6880
  };
6874
6881
  values?: string[] | undefined;
6875
6882
  severity?: "error" | "warning" | undefined;
6876
- level?: "component" | "interface" | "implementation" | undefined;
6883
+ level?: "interface" | "implementation" | "component" | undefined;
6877
6884
  } | {
6878
6885
  code: string;
6879
6886
  kind: "endpoint-shape";
@@ -7108,12 +7115,6 @@ interface PackDiagnosis {
7108
7115
  declare function defaultPackSelections(): PackSelection[];
7109
7116
  /** Diagnose this project's pack situation for `wairon doctor`. Never throws. */
7110
7117
  declare function diagnoseProjectPacks(): PackDiagnosis;
7111
- /**
7112
- * Convert the implicitly-applied global packs into EXPLICIT selections and turn
7113
- * global auto-load off, so this project's doctrine survives a change of default
7114
- * and is visible in a diff. Returns the names recorded.
7115
- */
7116
- declare function pinInstalledPacksAsSelections(): string[];
7117
7118
  /**
7118
7119
  * A stable human label for a config pack entry — the path for a legacy ref, or
7119
7120
  * `name[@version]` for a selection. For messages and listings, never for loading.
@@ -7388,407 +7389,1204 @@ interface CandidateOptions {
7388
7389
  */
7389
7390
  declare function validateComponentCandidate(candidate: ComponentSpec, opts?: CandidateOptions): CandidateVerdict;
7390
7391
 
7392
+ /** type_dialect — one language's reading and writing of the neutral grammar. */
7393
+ interface TypeDialect {
7394
+ /** The language this dialect reads and writes, as the code analyzer names it. */
7395
+ language: string;
7396
+ /** The canonical expression a code annotation spells, or null when it has no canonical reading. */
7397
+ read(annotation: string): TypeExpression | null;
7398
+ /** Whether a code annotation and a canonical spec expression describe the same type. */
7399
+ agrees(annotation: string, expression: TypeExpression, codeNames: Map<string, string>): boolean;
7400
+ /** This language's idiomatic spelling of a canonical expression. */
7401
+ write(expression: TypeExpression): string;
7402
+ /** The write table as lines an implementer brief carries. */
7403
+ mappingLines(): string[];
7404
+ }
7405
+ /** type_dialect.forLanguage — the dialect shipped for a language, or null when none reads it yet. */
7406
+ declare function typeDialectFor(language: string): TypeDialect | null;
7407
+ /**
7408
+ * type_dialect.mappingFor — the write table an implementer brief carries for
7409
+ * a language: a shipped dialect's mappingLines, else a MAPPING-ONLY table for
7410
+ * a language no analyzer reads yet (Rust, Python), whose last line says that
7411
+ * code conformance does not compare its types. Null for a language with
7412
+ * neither.
7413
+ */
7414
+ declare function typeMappingFor(language: string): string[] | null;
7415
+
7416
+ type AnalysisGrade = 'exact' | 'pattern' | 'generic';
7417
+ type SourceFileStatus = 'analyzed' | 'missing' | 'escaped' | 'unreadable';
7391
7418
  /**
7392
- * The tests that encode one method a write just changed or deleted
7393
- * (tests_to_revisit).
7419
+ * One runtime (value) import binding a file makes: the module specifier a
7420
+ * local name came from, and whether it was bound as a whole NAMESPACE.
7394
7421
  *
7395
- * Two lists rather than one because the two ways of finding them fail in
7396
- * OPPOSITE directions, and merging them would hide which is which — see the
7397
- * measurement above.
7422
+ * The namespace flag separates the two readings of `x.save()`. For a namespace
7423
+ * import (`import * as specs from './specs.js'`), `specs.save` IS that
7424
+ * module's own export, so the call site resolves to the module. For a named or
7425
+ * default binding, `db.save` is a property of a VALUE that module handed over,
7426
+ * and where that property's function was written is beyond a pure model — so
7427
+ * it resolves to nothing rather than to the module.
7428
+ *
7429
+ * Type-only imports are never recorded: a type binding cannot be a call origin.
7398
7430
  */
7399
- interface TestsToRevisit {
7400
- /** The contract method the write changed or deleted. */
7401
- method: string;
7402
- /** The code-level name searched for: the method's `symbol` when it declares one, else its name. */
7403
- symbol: string;
7431
+ /**
7432
+ * One name a file republishes from another module (source_file_facts
7433
+ * reexportBindings): `export { local as exported } from 'from'`, or a star
7434
+ * re-export, which republishes every name its module exports under that same
7435
+ * name and is written with `*` on both sides.
7436
+ */
7437
+ interface ReexportBindingFact {
7438
+ /** The name this file publishes it under; `*` for a star re-export. */
7439
+ exported: string;
7440
+ /** The name the module it comes from publishes it under; `*` for a star re-export. */
7441
+ local: string;
7442
+ /** The module specifier, exactly as written. */
7443
+ from: string;
7444
+ }
7445
+ /**
7446
+ * One name a file publishes BOUND to another name of its own scope, with no
7447
+ * module specifier of its own (source_file_facts exportAliases): an export
7448
+ * specifier `export { local as exported }`, renamed or not, or an
7449
+ * identifier-valued property of an exported top-level object literal —
7450
+ * `{ exported: local }` or the shorthand `{ exported }` — which then carries
7451
+ * the object's binding name as its `container`. The local name is this file's
7452
+ * own declaration, or an import binding that leads on to the module it came
7453
+ * from: either way the forwarding is written down, one hop away.
7454
+ */
7455
+ interface ExportAliasFact {
7456
+ /** The name this file publishes: the export specifier's exported name, or the object property's key. */
7457
+ exported: string;
7458
+ /** The name of this file's own scope it is bound to: a local declaration, or an import binding. */
7459
+ local: string;
7460
+ /** The exported object literal's binding name, set only for a property alias — what an `exportedVia` handle names. */
7461
+ container?: string;
7462
+ }
7463
+ interface ImportBindingFact {
7464
+ /** The module specifier the binding came from, exactly as written. */
7465
+ from: string;
7466
+ /** True for `import * as name from …` — the only binding whose property calls are that module's own exports. */
7467
+ namespace?: boolean;
7468
+ /** The name the module publishes it under, set only when the import renamed it (`import { save as store }`). */
7469
+ imported?: string;
7470
+ }
7471
+ /**
7472
+ * One call SITE SHAPE inside a named function-like: the invoked name together
7473
+ * with how the call was written. Shape is what a pure model can honestly say
7474
+ * about a call's ORIGIN — with no type checker, `save(x)`, `ledger.save(x)`,
7475
+ * `this.store.save(x)` and `new Ledger(db).save(x)` are four different
7476
+ * questions, and collapsing them onto the name "save" is what let a call into
7477
+ * an unrelated module count as realizing a narrative step.
7478
+ *
7479
+ * Sites are deduplicated per shape, never counted: the checks that read them
7480
+ * ask where a call could land, never how often it was written.
7481
+ */
7482
+ interface CallSiteFact {
7483
+ /** The invoked name: the identifier of a bare call, the property name of a member call. */
7484
+ name: string;
7485
+ /** True when the call was written as a member access (`receiver.name(…)`). */
7486
+ member: boolean;
7404
7487
  /**
7405
- * Test files that IMPORT that symbol — from the method's own source file, or
7406
- * from a module re-exporting it from there, when that file is known. The
7407
- * high-confidence list.
7488
+ * The receiver identifier — set only when the receiver is a plain identifier
7489
+ * (`specs.save()` → "specs"). The one receiver that can be PROVEN, when the
7490
+ * name is a namespace import binding and its properties are that module's
7491
+ * own exports — and otherwise a receiver to follow past the value it holds,
7492
+ * through the type the file ANNOTATES the name with.
7408
7493
  */
7409
- imported: string[];
7494
+ via?: string;
7410
7495
  /**
7411
- * Test files that name the symbol without importing it — usually a test
7412
- * driving the method through a portal or a helper. A file that binds the
7413
- * name to ANOTHER module is not here: the name in it is that module's.
7414
- * Empty when `indiscriminate` is true.
7496
+ * The instance FIELD the receiver is — set only when the call was written
7497
+ * `this.<field>.name(…)` (`this.store.save()` → "store"), and never together
7498
+ * with `via`. A receiver a pure model can follow past the value it holds,
7499
+ * because the class DECLARES what the field is; what that type resolves to
7500
+ * is a POSSIBLE origin, never a proven one, since the declared type says
7501
+ * what a collaborator is and not which class ships the body.
7415
7502
  */
7416
- mentioned: string[];
7503
+ field?: string;
7417
7504
  /**
7418
- * True when the bare name matched more than a tenth of the walked test files,
7419
- * so mentioning it carries no signal and `mentioned` was withheld.
7505
+ * The CLASS the receiver was constructed from — set only when the call was
7506
+ * written `new Class(…).name(…)` (`new ApprovalRegistry(store).create()` →
7507
+ * "ApprovalRegistry"), and never together with `via` or `field`. Another
7508
+ * receiver a pure model can follow, because the code NAMES the class it
7509
+ * built. Like a declared field type it is a POSSIBLE origin and never a
7510
+ * proven one: a method the class INHERITS is written in its base's module,
7511
+ * not in the constructed class's.
7420
7512
  */
7421
- indiscriminate: boolean;
7513
+ constructed?: string;
7514
+ /**
7515
+ * The function whose RESULT the receiver is — set only when the call was
7516
+ * written `fn(…).name(…)` with `fn` a plain identifier
7517
+ * (`current().updateSpec()` → "current"), and never together with `via`,
7518
+ * `field` or `constructed`. Followed through what the code writes down
7519
+ * about fn's result (SourceFileFacts.returnTypes): a POSSIBLE origin and
7520
+ * never a proven one, and only where the module that type leads to holds a
7521
+ * body under the invoked name.
7522
+ */
7523
+ returnedBy?: string;
7524
+ /**
7525
+ * The top-level named class whose own method the call sits in — set only
7526
+ * when the call was written `this.name(…)` directly inside a method,
7527
+ * accessor or constructor of that class (an arrow function keeps `this`; a
7528
+ * nested function expression rebinds it and records nothing). A POSSIBLE
7529
+ * origin and never a proven one, since a subclass may override the method,
7530
+ * and only where the class holds a body under the invoked name.
7531
+ */
7532
+ enclosingClass?: string;
7533
+ /**
7534
+ * The receiver written as a CHAIN of property accesses — set only when the
7535
+ * call was written `this.<field>.<property>….name(…)`
7536
+ * (`this.c.tracker.checkIn()` → ["this", "c", "tracker"]) or
7537
+ * `<name>.<property>….name(…)` (`deps.tracker.checkIn()` → ["deps",
7538
+ * "tracker"]), and never together with `via`, `field`, `constructed`,
7539
+ * `returnedBy` or `enclosingClass`. The shape constructor-injected
7540
+ * collaborators take when they arrive as ONE bag object. Followed link by
7541
+ * link through what the code DECLARES each link to be — the root's field
7542
+ * or annotated type, then each property's declared type on the shape that
7543
+ * declares it — and, like every receiver past an import binding, a
7544
+ * POSSIBLE origin and never a proven one.
7545
+ */
7546
+ receiverPath?: string[];
7547
+ /**
7548
+ * The file this site was READ in, set only when it is not the file these
7549
+ * facts describe — a pure re-export barrel carries the sites of the function
7550
+ * it publishes. A carried site's bare names and receivers resolve in that
7551
+ * file's scope, never in the barrel's.
7552
+ */
7553
+ from?: string;
7422
7554
  }
7423
-
7424
7555
  /**
7425
- * ispec_validator/ivalidator_portal.findTestsReferencing — the tests that
7426
- * encode a given set of methods, so a write that changes or deletes one can
7427
- * say which tests it just invalidated.
7556
+ * One function-like BODY under its name, with where it is bound — the
7557
+ * identity that tells same-named functions in one file apart.
7428
7558
  *
7429
- * The walk itself belongs to the source analyzer, which already owns this
7430
- * subsystem's only source-code I/O and the containment rules a root is held
7431
- * to. A project that declares no test roots answers empty rather than
7432
- * throwing: naming the tests must never be the thing that fails a write.
7559
+ * module (no `container`, no `nested`) a top-level function declaration,
7560
+ * or a function/arrow initializer of a top-level variable: what
7561
+ * the bare name means anywhere in the module's scope.
7562
+ * member `container` set: a member of a top-level named class, or a
7563
+ * property of an object literal a top-level variable is bound to
7564
+ * (`const store = { save() {} }` → container "store"). Reachable
7565
+ * only through that container, never by the bare name.
7566
+ * nested `nested` set: any other binding — a function inside a
7567
+ * function, a member of a class or object literal the model
7568
+ * cannot name. A nested body can shadow the bare name in the
7569
+ * scope it sits in, so where one exists the name stays ambiguous.
7433
7570
  */
7434
- declare function findTestsReferencing(methods: ReadonlyArray<Pick<MethodImplementation, 'name' | 'symbol'>>, projectRoot: string, testRoots: readonly string[]): TestsToRevisit[];
7435
- interface ValidationIssue {
7571
+ interface FunctionBodyFact {
7572
+ /** The named class or top-level object literal the body is a member of. */
7573
+ container?: string;
7574
+ /** True when the body is bound somewhere the model cannot name. */
7575
+ nested?: boolean;
7576
+ /** The call sites written inside this body alone. */
7577
+ sites: CallSiteFact[];
7578
+ }
7579
+ /**
7580
+ * One data member of a shape a file declares: its name, and whether the code
7581
+ * lets it be ABSENT.
7582
+ *
7583
+ * Absent-able is the only optionality worth recording, because it is the only
7584
+ * one a spec can be wrong about in a way a reader would notice — a field the
7585
+ * spec calls required that the code lets you omit is a promise the data does
7586
+ * not keep. A wrapper that FILLS a missing key is not absent-able: the value
7587
+ * the type finally holds always has it, which is the shape the spec describes.
7588
+ */
7589
+ interface ShapeMemberFact {
7590
+ /** The member's name, as the code spells it. */
7591
+ name: string;
7592
+ /** Whether the code lets the member be absent from a value of this shape. */
7593
+ optional: boolean;
7594
+ }
7595
+ /**
7596
+ * One parameter of a function as the code declares it: what it is called, what
7597
+ * it is annotated with, and whether a caller may leave it out.
7598
+ *
7599
+ * The TYPE is what makes a RENAME tellable from a dropped parameter —
7600
+ * `seed(config: HostConfig)` realized as `bootstrapInstance(cfg: HostConfig)`
7601
+ * is one parameter under two names, and matching on names alone reads it as a
7602
+ * parameter the code lost. A parameter bound by destructuring has no name to
7603
+ * compare, so it records none rather than inventing one: a guess about
7604
+ * somebody's signature is worse than silence, exactly as it is for a field.
7605
+ */
7606
+ interface ParameterFact {
7607
+ /** The parameter's name, absent when it is bound by a destructuring pattern instead. */
7608
+ name?: string;
7609
+ /** The type it is annotated with, exactly as written and whitespace-normalized; absent when the code annotates nothing. */
7610
+ type?: string;
7611
+ /** Whether a caller may leave it out — marked optional, given a default, or a rest parameter. */
7612
+ optional: boolean;
7613
+ }
7614
+ /**
7615
+ * One route a router function handles, rebuilt from the conditions that guard
7616
+ * the branch serving it — the branch's own AND every enclosing one on the path
7617
+ * taken, because routers nest: an outer check on the first segment, an inner
7618
+ * one on the rest. Reading only the innermost guard would turn every route
7619
+ * into `/*` followed by whatever the inner branch happened to check.
7620
+ *
7621
+ * A segment is the literal the code compares it to, or `*` where nothing
7622
+ * constrains it. A leading `*` is usually the segment the listener's mount
7623
+ * already guarantees, which the router never re-checks — so it is left open
7624
+ * here and completed by whoever knows the mount.
7625
+ *
7626
+ * Only one idiom is read: a method comparison together with comparisons on the
7627
+ * path's split segments and their count. A router written another way yields
7628
+ * nothing, and the reader reports that as unread rather than passing it — a
7629
+ * check that cannot see a router must say so rather than stay quiet.
7630
+ */
7631
+ interface RouteFact {
7632
+ /** The HTTP method the branch requires. */
7633
+ verb: string;
7634
+ /** The path's segments in order: the literal compared against, or `*` where nothing constrains it. */
7635
+ segments: string[];
7436
7636
  /**
7437
- * After project and profile overrides. A `notice` is reported like any other
7438
- * finding but never makes a result invalid (`valid` counts errors only) and
7439
- * never fails `--ci`.
7637
+ * Whether the branch pins the number of segments. When it does not, the path
7638
+ * may continue past the last one read, so the route covers any longer path
7639
+ * with the same leading segments.
7440
7640
  */
7441
- severity: IssueSeverity;
7442
- code: string;
7443
- message: string;
7444
- /** Optional: agent id related to the issue */
7445
- agentId?: string;
7446
- specId?: string;
7641
+ exactLength: boolean;
7642
+ }
7643
+ /** How a type shape's members were read: listed by the shape itself, or followed one hop from an alias to the value its shape comes from. */
7644
+ type ShapeOrigin = 'declared' | 'derived';
7645
+ /**
7646
+ * The members of one named shape a file declares — what a data type IS, read
7647
+ * off the code so a type spec's claim about it can be checked.
7648
+ *
7649
+ * Two origins answer, and the difference is recorded rather than smoothed
7650
+ * away. A DECLARED shape lists its own members, so the file is the whole
7651
+ * answer. A DERIVED one names a VALUE instead — an alias resolved one hop to
7652
+ * the object literal its schema is built from, where the keys are the members
7653
+ * — so the answer is as good as that hop and no better, and a hop that lands
7654
+ * on nothing readable records no shape at all. Silence, not a guess: a wrong
7655
+ * member list is worse than none, because nothing downstream would correct it.
7656
+ *
7657
+ * Methods are kept apart from fields because a spec models them on a different
7658
+ * axis — the one `typeRealization` already judges. Counting a behavioural
7659
+ * interface's method signatures as data would accuse every one of them of
7660
+ * carrying undeclared state.
7661
+ */
7662
+ interface TypeShapeFact {
7663
+ /** How the members were read. */
7664
+ origin: ShapeOrigin;
7665
+ /** The data members, each with whether the code lets it be absent. */
7666
+ fields: ShapeMemberFact[];
7667
+ /** The method-style members, kept on the axis a spec models them on. */
7668
+ methods: string[];
7447
7669
  /**
7448
- * True when this issue was raised in a draft/design context — i.e. the spec
7449
- * it concerns (or an ancestor) is not yet complete. Rules that already know
7450
- * this (e.g. DRAFT_COMPONENT_WARNING, UNUSED_COMPONENT on a draft component)
7451
- * surface it so downstream policy — like the --ci gate — can waive warnings
7452
- * that merely reflect declared, unfinished work without silencing the rule.
7670
+ * True when the shape EXTENDS another, so members it does not list exist
7671
+ * but are not in this file to count. Presence and absence are therefore
7672
+ * different questions for it: what it shows can be judged, what it omits
7673
+ * cannot.
7453
7674
  */
7454
- draftContext?: boolean;
7675
+ inherited?: boolean;
7676
+ }
7677
+ interface SourceFileFacts {
7678
+ /** Project-relative resolved source path (many implementations may share it, N:1). */
7679
+ path: string;
7680
+ status: SourceFileStatus;
7681
+ /** Effective language the file was analyzed as. */
7682
+ language?: string;
7683
+ analysisGrade?: AnalysisGrade;
7455
7684
  /**
7456
- * On a finding about a cross-project reference: how the owner's gate
7457
- * resolved it (outcome, owner, call site, canonical target, input digest,
7458
- * reason), decided before the severity.
7685
+ * Declaration-tier anchors: named declarations at any nesting depth,
7686
+ * destructuring bindings, object-literal keys, import bindings, and export
7687
+ * specifiers (export-* barrels chased through relative specifiers).
7459
7688
  */
7460
- resolution?: ReferenceResolution;
7689
+ declaredNames: string[];
7690
+ /** Weaker anchors: exact string-literal occurrences (tool/route registrations). */
7691
+ anchoredNames: string[];
7692
+ /** Exported bindings (Level 2 dependency-conformance and UNDECLARED_EXPORT fuel). */
7693
+ exportedNames: string[];
7461
7694
  /**
7462
- * In a family run: the key of the project whose gate (or whose external,
7463
- * for a composition finding) the finding belongs to — '' for the family
7464
- * root. Absent on the owner's own run.
7695
+ * Runtime import/require module specifiers (dependency-conformance fuel).
7696
+ * Type-only imports and export-from specifiers are excluded — type coupling
7697
+ * is allowed by default, and re-exporting is surface republication, not
7698
+ * collaboration.
7465
7699
  */
7466
- project?: string;
7700
+ imports: string[];
7701
+ /** Module specifiers of export-from declarations (surface republication). */
7702
+ reexports: string[];
7467
7703
  /**
7468
- * True on a finding reported beside a gate rather than by it — the live
7469
- * comparison of an external with its producer (family_validator.advise).
7470
- * Printed and counted with its severity, but never part of a failure
7471
- * decision: `valid` and `validate --ci` both ignore it, because the pin is
7472
- * the reproducible gate and a live producer is not.
7704
+ * What each export-from declaration republishes, name by name: a named one
7705
+ * with both sides of its rename (`export { a as b } from 'm'` publishes `b`
7706
+ * as m's `a`), a star with `*` on both sides. Runtime re-exports only — a
7707
+ * type-only one republishes no function. EXACT grade only: it is what lets a
7708
+ * reader follow a republished name to the module that wrote it, and a
7709
+ * weaker grade leaves it unset rather than guess.
7473
7710
  */
7474
- advisory?: boolean;
7475
- }
7476
- interface ValidationResult {
7477
- valid: boolean;
7478
- issues: ValidationIssue[];
7711
+ reexportBindings?: ReexportBindingFact[];
7479
7712
  /**
7480
- * One line, never a finding. The owner's gate: present when the project
7481
- * declares externals, saying they were judged against their pins and the
7482
- * advisory live comparison reads their live producers. A family run: present when externals were left out
7483
- * because their producers lie outside the run's reach.
7713
+ * The forwarding bindings the file publishes with no module specifier of
7714
+ * its own (see ExportAliasFact): each runtime `export { local as exported }`
7715
+ * specifier, renamed or not, and each identifier-valued property of an
7716
+ * exported top-level object literal, under that object's binding name.
7717
+ * EXACT grade only. The analyzer carries the local name's body onto the
7718
+ * published one when the local name settles on exactly one — a module-scope
7719
+ * body of this file with no nested same-named one, or an import binding
7720
+ * whose module holds one — and leaves the published name bodiless otherwise.
7484
7721
  */
7485
- hint?: string;
7722
+ exportAliases?: ExportAliasFact[];
7486
7723
  /**
7487
- * A family run only: one line per selected project (the root first, then its
7488
- * members in scan order) with its own gate's totals. Absent on the owner's
7489
- * gate.
7724
+ * The type name each named function-like RETURNS, by function name,
7725
+ * recorded only where the code settles it: a return annotation naming a
7726
+ * type outright (`Promise<T>` unwrapped), else, unannotated, a body whose
7727
+ * ONE return statement constructs a plainly named class. Same-named
7728
+ * functions that disagree, a generic, union or literal annotation, and
7729
+ * several returns record nothing. EXACT grade only. What a `fn().method()`
7730
+ * receiver is followed through.
7490
7731
  */
7491
- projects?: ProjectVerdict[];
7732
+ returnTypes?: Record<string, string>;
7492
7733
  /**
7493
- * The as-complete run only (validateAsComplete): the code-conformance half
7494
- * summarized with the analyzer that produced it. Absent on the owner's gate
7495
- * and on a family run.
7734
+ * Cyclomatic complexity per named function-like (function/method/accessor
7735
+ * declarations, and function/arrow initializers of named slots). EXACT grade
7736
+ * only — lower grades omit the map rather than guess. Same-named functions
7737
+ * in one file record their maximum. Fuel for the detail-sufficiency lint.
7496
7738
  */
7497
- analysis?: CodeAnalysis;
7739
+ functionComplexity?: Record<string, number>;
7498
7740
  /**
7499
- * A family run only: the aliases of the bound project's externals the run
7500
- * composed as part of its gate (their producers in reach) — the advisory
7501
- * live comparison skips them, so they get no second word.
7741
+ * Direct call sites per named function-like: every call written inside the
7742
+ * function body, with its shape (see CallSiteFact) — nested NAMED functions
7743
+ * excluded (they carry their own entries), anonymous callbacks included.
7744
+ * EXACT grade only. Same-named functions union their sites.
7745
+ *
7746
+ * A function-like WITH A BODY always gets an entry, empty when it calls
7747
+ * nothing; a name with NO entry has no body in this file to read — a bare
7748
+ * declaration, an overload signature, an ambient declaration, an interface
7749
+ * member, a plain value binding or an imported name. That difference is the
7750
+ * whole of hasFunctionBody, which is why an empty entry is never dropped.
7751
+ *
7752
+ * Fuel for the call-step realization checks (Level 3).
7502
7753
  */
7503
- composed?: string[];
7504
- }
7505
- /**
7506
- * project_verdict — one project's line in a family run: which project it is,
7507
- * where it lives, and the totals of its own gate's verdict, which the family
7508
- * run carries verbatim under the project's key.
7509
- */
7510
- interface ProjectVerdict {
7511
- /** The project's key in the family root's scan ('' for the root itself). */
7512
- key: string;
7513
- /** The project's effective id. */
7514
- id?: string;
7515
- /** The project's root directory. */
7516
- directory: string;
7517
- /** Whether its own gate found no error. */
7518
- valid: boolean;
7519
- errors: number;
7520
- warnings: number;
7521
- notices: number;
7522
- }
7523
- declare function validateRegistry(registry: Registry, rules: RulesConfig): ValidationResult;
7524
- declare function validateProjectConfig(config: ProjectConfig): ValidationResult;
7525
- interface ValidationOptions {
7526
- rules?: RulesConfig;
7527
- projectType?: string;
7528
- scopeSubsystem?: string;
7754
+ functionCallSites?: Record<string, CallSiteFact[]>;
7529
7755
  /**
7530
- * At a project that declares members: how many member levels the run
7531
- * reaches. Absent, every level (the family run); 0, the owner's gate alone;
7532
- * n, the family run selecting that many levels.
7756
+ * The same call sites, BODY by body, under each function-like's name: one
7757
+ * entry per body, carrying WHERE that body is bound (see FunctionBodyFact).
7758
+ * EXACT grade only. Where functionCallSites unions every same-named body,
7759
+ * this keeps them apart, so an exported facade `save` and the class member
7760
+ * `Workspace.save` it forwards to are read as the two functions they are.
7761
+ * Which body a NAME means is bodySitesOf's question, and it answers only
7762
+ * where the code itself settles it.
7533
7763
  */
7534
- memberDepth?: number;
7764
+ functionBodies?: Record<string, FunctionBodyFact[]>;
7535
7765
  /**
7536
- * Pre-loaded extension packs (the programmatic-wrapper path). When omitted,
7537
- * the packs declared in the project's own config are loaded — so CLI and
7538
- * MCP callers get pack rules/profiles/languages without passing anything.
7766
+ * Runtime (value) import bindings by local name (see ImportBindingFact).
7767
+ * EXACT grade only — a weaker grade sees module specifiers but never which
7768
+ * local name they bound.
7539
7769
  */
7540
- extensions?: LoadedExtensions;
7770
+ importBindings?: Record<string, ImportBindingFact>;
7541
7771
  /**
7542
- * Validate at FULL strictness: treat every spec as `complete`, so the
7543
- * completeness rules that relax to warnings while draft/design apply as
7544
- * errors. This is the as-complete gate behind `wairon lock`. The flip must
7545
- * happen INSIDE the validation run — clearLoaderIssues() invalidates the
7546
- * spec cache, so any status mutation done before calling in is lost to the
7547
- * rescan (statuses are restored before returning, so the flip is never
7548
- * observable to later callers).
7772
+ * The type names an instance FIELD is DECLARED with, by field name — read
7773
+ * off class property declarations and constructor parameter properties,
7774
+ * which is where a constructor-injected collaborator says what it is.
7775
+ * EXACT grade only.
7776
+ *
7777
+ * Same-named fields of different classes in one file keep EVERY declared
7778
+ * type: the file cannot say which class a call site's `this` was, and a
7779
+ * wider answer only ever widens what a call may have reached. A field with
7780
+ * no annotation records nothing — what an initializer INFERS is not what
7781
+ * the code declares, and a guess is not a fact.
7549
7782
  */
7550
- treatAllAsComplete?: boolean;
7783
+ fieldTypes?: Record<string, string[]>;
7551
7784
  /**
7552
- * Ask for the family run explicitly (`validate --family`, MCP `family:
7553
- * true`). Omitted, a project that declares members runs its family and any
7554
- * other project runs its owner's gate (validation_options.selectsFamily).
7785
+ * The type names a LOCALLY BOUND name is DECLARED with, by name — read off
7786
+ * function and method parameters and off variable declarations that carry
7787
+ * an annotation, which is where a module that wires its collaborators as
7788
+ * closures writes down what each one is. EXACT grade only.
7789
+ *
7790
+ * Keyed by name across the WHOLE file, as `fieldTypes` is: the facts cannot
7791
+ * say which function a call site sits in, and a receiver is as often a
7792
+ * parameter of an ENCLOSING function as of the one that calls it — a
7793
+ * closure captures it, which is the shape this records at all. Same-named
7794
+ * bindings therefore keep EVERY declared type, and a wider answer only ever
7795
+ * widens what a call may have reached. A binding the file annotates with
7796
+ * nothing records nothing, and so does one annotated with anything but a
7797
+ * plain type reference or a member-preserving utility (`Pick`, `Omit`,
7798
+ * `Partial`, `Required`, `Readonly`) around one, which names the type it
7799
+ * wraps: what an initializer INFERS is not what the code
7800
+ * declares, and a guess is not a fact.
7555
7801
  */
7556
- family?: boolean;
7802
+ localTypes?: Record<string, string[]>;
7557
7803
  /**
7558
- * The by-name pack selections the pack rules judge. Omitted, the project's
7559
- * own stored selections are read. Given only by a dry run that judges a
7560
- * candidate configuration it has not written (pack_impact.measure), together
7561
- * with that candidate's rules, projectType and loaded extensions.
7562
- */
7563
- packSelections?: PackSelection[];
7564
- }
7565
- /**
7566
- * The active conformance rule set — the built-in rules plus the loaded
7567
- * programmatic pack rules, in run order — for `wairon rules list`. Loads and
7568
- * registers the governing packs, then reads the composed sequence.
7804
+ * The module specifier each TYPE-ONLY import binding came from, by local
7805
+ * name. EXACT grade only.
7806
+ *
7807
+ * The half of the import list `importBindings` deliberately leaves out,
7808
+ * because a type binding can never be a call ORIGIN — and exactly what a
7809
+ * declared field type is resolved through, which is why it is kept apart
7810
+ * rather than folded in.
7811
+ */
7812
+ typeOnlyBindings?: Record<string, string>;
7813
+ /**
7814
+ * The type names each PROPERTY of a named shape the file declares is
7815
+ * DECLARED with, keyed `<shape>.<property>` — an interface's or a type
7816
+ * literal alias's property signatures, and a class's property declarations
7817
+ * and constructor parameter properties. EXACT grade only.
7818
+ *
7819
+ * What a receiver CHAIN (`CallSiteFact.receiverPath`) is followed through:
7820
+ * a bag of collaborators handed to a constructor names each one's type
7821
+ * exactly here. Read the way `fieldTypes` is, and a property annotated with
7822
+ * anything else records nothing.
7823
+ */
7824
+ memberTypes?: Record<string, string[]>;
7825
+ /**
7826
+ * The ONE type each type alias NAMES outright, by alias name —
7827
+ * `type Contract = Pick<HabitRepository, 'find'>` names HabitRepository,
7828
+ * `type Store = SpecStore` names SpecStore. EXACT grade only. Read the way
7829
+ * `fieldTypes` is, so a union, an intersection, a literal or any other
7830
+ * generic names nothing. The one hop a declared type is followed through
7831
+ * when it is an alias of this file.
7832
+ */
7833
+ aliasTargets?: Record<string, string>;
7834
+ /**
7835
+ * The interface names each named class's `implements` clause writes, by
7836
+ * class name; exact grade only. What lets a receiver whose declared type is
7837
+ * an interface written in a shared contracts file be followed to the class
7838
+ * that implements it, wherever that class lives — a possible origin, never
7839
+ * a proven one, like every declared type.
7840
+ */
7841
+ implementsClauses?: Record<string, string[]>;
7842
+ /**
7843
+ * The members of each named shape the file declares, by declaration name
7844
+ * (see TypeShapeFact). EXACT grade only — below it a member list cannot be
7845
+ * told from a mention, and a guess about somebody's data model is worse
7846
+ * than silence.
7847
+ *
7848
+ * What lets a type spec's `fields` be CHECKED rather than read as truth by
7849
+ * the ERD, the briefs and every implementer. A wrong method signature
7850
+ * eventually breaks at a call site; a type spec that lies about its data is
7851
+ * only ever read by humans and agents, so nothing corrects it until
7852
+ * somebody measures it against the code.
7853
+ */
7854
+ typeShapes?: Record<string, TypeShapeFact>;
7855
+ /**
7856
+ * The parameter lists of each named function-like in the file, by name (see
7857
+ * ParameterFact) — what lets a contract's declared `params` be checked
7858
+ * against the signature that realizes them, the last of the three
7859
+ * code-to-spec readings nothing had ever made. EXACT grade only: below it a
7860
+ * parameter list cannot be told from a call.
7861
+ *
7862
+ * EVERY body under a name is kept, not the first: a file routinely holds a
7863
+ * class member and the module-level facade that forwards to it under one
7864
+ * name, with different parameters, and picking one silently drops the
7865
+ * other's leading argument from view. Same-named bodies therefore keep every
7866
+ * candidate, exactly as the field-type facts do, and a reader accuses only
7867
+ * what all of them agree on.
7868
+ *
7869
+ * Overloads record the IMPLEMENTATION signature, the one with a body,
7870
+ * because that is the one a caller actually reaches — and a name with no
7871
+ * entry at all has no signature here to read, which is the silence a
7872
+ * forwarding file owes: that the body is not here is already
7873
+ * `methodRealization`'s finding.
7874
+ */
7875
+ functionParams?: Record<string, ParameterFact[][]>;
7876
+ /**
7877
+ * The routes each named function-like in the file handles, by name (see
7878
+ * RouteFact) — what lets a listener's mount be read against the contract
7879
+ * endpoints of the portal it serves, so a route the router answers that no
7880
+ * contract declares cannot go unnoticed again. EXACT grade only: reading a
7881
+ * guard as a route needs the conditions as expressions, not as text.
7882
+ *
7883
+ * A function with no recognisable route records NO entry rather than an
7884
+ * empty one — an empty guess would read as "a router with no routes", and
7885
+ * the reader needs to tell a router it could not read from one it read.
7886
+ * Same-named bodies union their routes; nested NAMED functions carry their
7887
+ * own entries, while anonymous callbacks count into the enclosing one.
7888
+ */
7889
+ functionRoutes?: Record<string, RouteFact[]>;
7890
+ /**
7891
+ * The named function-likes in the file that complete LATER — declared
7892
+ * `async`, or annotated to return a Promise — listed once per such BODY, in
7893
+ * the order the bodies are met, exactly as `functionParams` keeps one
7894
+ * signature per body. A name with several bodies (a class member and the
7895
+ * module-level facade forwarding to it) is therefore judged on what they ALL
7896
+ * say: as many entries as signatures is every body, none is no body. What
7897
+ * ASYNC_MISMATCH compares a contract method's `async` returns with. EXACT
7898
+ * grade only: below it a body cannot be told from a call.
7899
+ */
7900
+ asyncFunctions?: string[];
7901
+ /**
7902
+ * The values of each ENUM-LIKE declaration in the file, by declaration name,
7903
+ * in declared order: a string-literal union alias (`type E = 'a' | 'b'`),
7904
+ * the string array a `z.enum([...])` constant holds — an alias
7905
+ * `z.infer<typeof X>` followed one hop, as a derived shape is — or a string
7906
+ * enum's member values. What UNREALIZED_ENUM_VALUE and UNDECLARED_ENUM_VALUE
7907
+ * read. EXACT grade only; a union mixing in anything but string literals is
7908
+ * not enum-like and is left out.
7909
+ */
7910
+ enumValues?: Record<string, string[]>;
7911
+ /**
7912
+ * The right side of each TYPE ALIAS the file declares, as written, by alias
7913
+ * name — every alias whose right side is not an object shape
7914
+ * (`type PackPath = string`). What a named scalar's holds is compared with
7915
+ * through the file's dialect (TYPE_HOLDS_MISMATCH). EXACT grade only.
7916
+ */
7917
+ aliasTypes?: Record<string, string>;
7918
+ /**
7919
+ * Module-scope mutable bindings (`let`/`var` at the top level of the file).
7920
+ * EXACT grade only. The static approximation of held state a logic
7921
+ * component may be hiding — fuel for the HIDDEN_STATE lint. (Mutation of
7922
+ * const-bound containers is invisible to this collection; the lint says so.)
7923
+ */
7924
+ topLevelMutableBindings?: string[];
7925
+ /**
7926
+ * True when the file declared nothing of its own and only re-exported —
7927
+ * a pure re-export barrel, which has no code to claim. Measured BEFORE the
7928
+ * barrel chase folds the republished names into `declaredNames`, since
7929
+ * after it a barrel is indistinguishable from the files it publishes.
7930
+ * EXACT grade only: a weaker grade cannot tell a barrel from a file it
7931
+ * failed to parse, so it leaves this unset rather than guess.
7932
+ */
7933
+ reexportOnly?: boolean;
7934
+ /**
7935
+ * Every call expression of the file as the TypeScript type checker resolved
7936
+ * it (see ResolvedCallFact), in source order. EXACT grade only, and only
7937
+ * where a compiler with a type checker was loaded. What the Portal
7938
+ * write-shortcut twin and the unnarrated-write check read first: the
7939
+ * checker follows every spelling of a receiver to the declaration, where
7940
+ * the shape facts follow the spellings they know.
7941
+ */
7942
+ resolvedCalls?: ResolvedCallFact[];
7943
+ }
7944
+ /**
7945
+ * One place a call the type checker resolved can land in THIS project's code:
7946
+ * the file holding the declaration (or an implementor of it), the class,
7947
+ * interface or shape it is a member of, and the member's name. A declaration
7948
+ * in a dependency's typings or the language's own library is no target — it
7949
+ * is nobody's component.
7569
7950
  */
7570
- declare function listRules(): SddRule[];
7951
+ interface CallTargetFact {
7952
+ /** Canonical project-relative path of the file holding the declaration or implementor. */
7953
+ path: string;
7954
+ /** The class, interface or named shape the member belongs to; absent for a module-level function. */
7955
+ container?: string;
7956
+ /** The declared name of the method or function the call reaches. */
7957
+ member: string;
7958
+ /**
7959
+ * `declaration` when the checker named this declaration itself;
7960
+ * `implementor` when the declaration sits in an interface or type shape and
7961
+ * this is a class of the project that realizes it.
7962
+ */
7963
+ via: 'declaration' | 'implementor';
7964
+ }
7571
7965
  /**
7572
- * ispec_validator/ivalidator_portal.validateProject — the owner's gate (stage
7573
- * 4): judge the bound project from its own files alone — its specs, its
7574
- * configuration and doctrine, its code, its lock, its externals lock and
7575
- * pinned snapshots, and the export tables of the members it contains — and
7576
- * nothing else. It never walks up to a parent, never reads a sibling's live
7577
- * tree and discovers nothing, so a project's verdict is the same from every
7578
- * root and with or without its family on disk. A contained member's own specs
7579
- * are never judged here: its gate judges them under its own configuration.
7966
+ * One call expression of a file as the TypeScript type checker resolved it:
7967
+ * what was invoked, how it was written, which body it sits in, and every
7968
+ * place in this project it can land. Where CallSiteFact records the SHAPE a
7969
+ * pure model can follow, this records the checker's answer — so a receiver
7970
+ * reached through an alias, a field chain, an element access, a destructured
7971
+ * method, a factory's result, a barrel or a port interface lands where the
7972
+ * checker says it lands, whatever its spelling.
7580
7973
  */
7581
- declare function validateProject(rulesOrOptions?: RulesConfig | ValidationOptions, projectType?: string): ValidationResult;
7974
+ interface ResolvedCallFact {
7975
+ /** The invoked name: the declared member a target names, else the name as written. */
7976
+ name: string;
7977
+ /** The callee as written, whitespace-collapsed and shortened — what a finding quotes. */
7978
+ written: string;
7979
+ /** The innermost named function-like the call sits in; absent at module scope. */
7980
+ enclosing?: string;
7981
+ /** The top-level class or object literal whose member that function-like is, when it is one. */
7982
+ enclosingContainer?: string;
7983
+ /** Every place in this project's own code the call can land; empty for a call into a dependency or the language library. */
7984
+ targets: CallTargetFact[];
7985
+ /**
7986
+ * True when the call lands nowhere this analysis can name and the CODE made
7987
+ * it so: the checker resolved the callee to no declaration because its
7988
+ * receiver (or the callee itself) is typed any, unknown or not at all; or
7989
+ * the call reaches no declaration of this project because its member is
7990
+ * chosen by a computed key that names no single member, or its receiver is
7991
+ * cast to an index-signature type — neither a landing nor its absence means
7992
+ * anything.
7993
+ */
7994
+ unresolved?: boolean;
7995
+ /**
7996
+ * For an unresolved call, where its receiver's ORIGINAL type lands — the
7997
+ * expression with every cast, assertion, non-null mark and parenthesis
7998
+ * taken off: each project class that type is, or that realizes the
7999
+ * interface or shape it is, as a target whose member is the call's name
8000
+ * (empty when a computed key names none). What tells a cast that hid a data
8001
+ * component from a receiver that never was one.
8002
+ */
8003
+ receivers?: CallTargetFact[];
8004
+ /**
8005
+ * True when this is no call but a REFERENCE to a function or method of this
8006
+ * project the code takes as a value at this site — passes as an argument,
8007
+ * assigns, returns, binds, or hands to Reflect.apply — rather than invoking
8008
+ * it where it is written. A use all the same: what the reference lands on
8009
+ * can be invoked anywhere the value travels.
8010
+ */
8011
+ reference?: boolean;
8012
+ }
8013
+ interface CodeModel {
8014
+ /** One facts entry per distinct resolved sourcePath (missing/escaped/unreadable included). */
8015
+ files: SourceFileFacts[];
8016
+ /** The root every sourcePath was resolved and containment-checked against. */
8017
+ projectRoot: string;
8018
+ /**
8019
+ * Every source file the declared source-root walk found, as canonical keys
8020
+ * in walk order — the domain the unclaimed-source rule judges. Empty when
8021
+ * the project declares no source roots, which is what keeps that rule
8022
+ * opt-in. Facts for these files live in `files`, like any other path.
8023
+ */
8024
+ rootFiles: string[];
8025
+ /**
8026
+ * The package specifiers that name a package of THIS repository, each
8027
+ * mapped to the canonical source file it resolves to: the root package and
8028
+ * every workspace package the root package.json declares (never
8029
+ * node_modules), `name` for the main entry and `name/sub` for each plain
8030
+ * subpath export, build entries mapped back to their source through the
8031
+ * package's tsconfig outDir/rootDir. What lets a package import resolve like
8032
+ * a relative one; a third-party specifier is in no entry and resolves to
8033
+ * nothing. Absent or empty when the repository declares no packages.
8034
+ */
8035
+ packages?: Record<string, string>;
8036
+ /**
8037
+ * The resolved calls of the project's own source files that no facts entry
8038
+ * holds but a resolved call or reference of the run reaches — a helper
8039
+ * module no spec names and no source-root walk found — keyed by canonical
8040
+ * path. What lets a rule read unowned code as part of whoever calls it.
8041
+ * Absent where no type checker was loaded.
8042
+ */
8043
+ reachedCalls?: Record<string, ResolvedCallFact[]>;
8044
+ }
7582
8045
  /**
7583
- * Validate the tree at FULL strictness — treating every spec as `complete`, so
7584
- * the completeness rules that relax to warnings while draft/design apply as
7585
- * errors — WITHOUT mutating anything on disk. This is the as-complete gate that
7586
- * `wairon lock` and the hosting lock require: a draft tree can "pass" a normal
7587
- * validate yet break the moment it is frozen, so lock must gate on this.
7588
- *
7589
- * The status flip lives inside validateProject (treatAllAsComplete) because
7590
- * validation begins by invalidating the spec cache (clearLoaderIssues), which
7591
- * would discard any objects mutated out here before the rules ever saw them —
7592
- * exactly the silent degradation this wrapper previously suffered from.
8046
+ * code_model.pathKey — the canonical key form of a source path in the model:
8047
+ * forward slashes, no leading `./`. Every facts entry is stored under it, and
8048
+ * every lookup or path comparison uses it.
7593
8049
  */
7594
- declare function validateAsComplete(options?: ValidationOptions): ValidationResult;
8050
+ declare function pathKey(sourcePath: string): string;
7595
8051
  /**
7596
- * ivalidator_portal.validateFamily — the family run: every selected project's
7597
- * own gate verbatim under its project key, the composition of each project's
7598
- * externals against their live producers, and the family checks. `wairon
7599
- * validate` at a project that declares members, and `--family` anywhere, call
7600
- * this; the owner's gate is validateProject. It forwards to the family
7601
- * validator, which keeps the owner's gate a pure function of one project.
8052
+ * code_model.factsFor — the facts entry for a source path, looked up by its
8053
+ * canonical key; undefined when the run analyzed no such path. The model holds
8054
+ * one entry per key; were it to hold two, the later one answers, as it does in
8055
+ * the keyed indexes the rules build over the same files.
7602
8056
  */
7603
- declare function validateFamily(options: ValidationOptions): ValidationResult;
8057
+ declare function factsFor(model: CodeModel, sourcePath: string): SourceFileFacts | undefined;
7604
8058
  /**
7605
- * ivalidator_portal.measurePackImpact — what one pack write would change on
7606
- * the bound project, measured before it happens: the pack's doctrine against
7607
- * wairon's defaults, the profiles of it that would govern, and the owner's-gate
7608
- * findings that differ between the current and the candidate configuration.
7609
- * Writes nothing. Forwarded to the pack impact workflow.
8059
+ * source_file_facts.importBindingOf — the runtime import binding a file makes
8060
+ * under a local name, or undefined when the name is not an import of this
8061
+ * file (it is local, global, or bound type-only).
7610
8062
  */
7611
- declare function measurePackImpact(candidate: PackCandidate): PackImpact;
8063
+ declare function importBindingOf(facts: SourceFileFacts, name: string): ImportBindingFact | undefined;
7612
8064
  /**
7613
- * ivalidator_portal.measurePackDoctrine — what one pack changes against
7614
- * wairon's defaults, with no project to validate. Writes nothing. Forwarded to
7615
- * the pack impact workflow.
8065
+ * source_file_facts.fieldTypesOf — the type names an instance field is
8066
+ * DECLARED with, or EMPTY when the file declares no such field, annotates it
8067
+ * with nothing, or was analyzed below exact grade. The empty answer is what
8068
+ * keeps an unresolvable field from becoming a guess.
7616
8069
  */
7617
- declare function measurePackDoctrine(manifest: ExtensionPack): PackDoctrine;
8070
+ declare function fieldTypesOf(facts: SourceFileFacts, field: string): string[];
7618
8071
  /**
7619
- * ispec_validator/ivalidator_portal.builtinProfileIds — the ids of wairon's
7620
- * built-in architectural profiles: the built-in half of the profiles a
7621
- * projectType may name. A copy of the rule set's own constant, so a caller can
7622
- * never mutate it.
8072
+ * source_file_facts.localTypesOf — the type names a locally bound name is
8073
+ * DECLARED with, or EMPTY when the file binds no such name, annotates it with
8074
+ * nothing, or was analyzed below exact grade. The empty answer is what keeps
8075
+ * an unannotated receiver from becoming a guess, exactly as it does for a
8076
+ * field.
7623
8077
  */
7624
- declare function builtinProfileIds(): string[];
8078
+ declare function localTypesOf(facts: SourceFileFacts, name: string): string[];
7625
8079
  /**
7626
- * ispec_validator/ivalidator_portal.builtinProjectKinds — the built-in
7627
- * composite project kinds: legal projectType values that are not
7628
- * architectural profiles and carry no doctrine of their own.
8080
+ * source_file_facts.memberTypesOf — the type names a property of a named
8081
+ * shape this file declares is DECLARED with, or EMPTY when the file declares
8082
+ * no such shape or property, annotates it with nothing, or was analyzed below
8083
+ * exact grade. The empty answer keeps an unresolvable link of a receiver
8084
+ * chain from becoming a guess.
7629
8085
  */
7630
- declare function builtinProjectKinds(): string[];
8086
+ declare function memberTypesOf(facts: SourceFileFacts, shape: string, property: string): string[];
7631
8087
  /**
7632
- * The gate identity a lock records and every staleness check compares
7633
- * (ispec_validator/ivalidator_portal.computeGateStateId): the project's OWN
7634
- * DESIGN identity (code linkage and timestamps out), the design doctrine, its own consumed contract inputs, its
7635
- * `composition`, and each direct member's composition subject — read from the
7636
- * member's own lock record, never recomputed and never its specs. So a
7637
- * parent's identity costs its own tree plus one lock file per direct member,
7638
- * and a lock taken at a member's own root and one taken inside its family
7639
- * record the same identity. The validator computes it because the doctrine it
7640
- * covers is the validator's own rule set; core only compares a lock against
7641
- * the identity its caller passes (readLockState).
8088
+ * source_file_facts.aliasTargetOf — the type a type alias this file declares
8089
+ * names outright, or undefined when the name is no such alias or its right
8090
+ * side names no single type.
7642
8091
  */
7643
- declare function computeGateStateId(): StateId;
8092
+ declare function aliasTargetOf(facts: SourceFileFacts, name: string): string | undefined;
7644
8093
  /**
7645
- * ivalidator_portal.familyApprovals — the bound project's pin tree: its own
7646
- * approval state and each member's within `depth` levels, each computed at the
7647
- * member's own root, with each member's subject and how its parent pinned it.
7648
- * The one source the lock workflow, `wairon status` and sdd_get_status read,
7649
- * so they cannot disagree. Writes nothing; a hosted caller gates on reach
7650
- * itself before asking about a family.
8094
+ * source_file_facts.typeBindingOf — the module specifier a NAME was imported
8095
+ * from, whether the import was type-only or a runtime one, since a declared
8096
+ * type may be spelled either way. Undefined when the file imports no such
8097
+ * name, which leaves the name local, global or ambient.
7651
8098
  */
7652
- declare function familyApprovals(depth?: number): ProjectApproval[];
8099
+ declare function typeBindingOf(facts: SourceFileFacts, name: string): string | undefined;
7653
8100
  /**
7654
- * ivalidator_portal.familyRelations — the bound family's relation health: each
7655
- * project's externals status read at its own root, stamped with when, a project
7656
- * that could not be opened answered with its reason. What the canvas colours
7657
- * its consumption edges from. Writes nothing; callers grant the reach first.
8101
+ * source_file_facts.callSitesOf — the call sites written inside one named
8102
+ * function-like, or undefined when the file holds no BODY under that name.
8103
+ * The two answers are different findings and must never be collapsed: an
8104
+ * empty array is a body that calls nothing, undefined is nothing to read.
7658
8105
  */
7659
- declare function familyRelations(): ProjectRelations[];
7660
-
7661
- /** How an approver's identity was established. */
7662
- type ApproverSource = 'git' | 'hosted' | 'os' | 'legacy';
8106
+ declare function callSitesOf(facts: SourceFileFacts, fn: string): CallSiteFact[] | undefined;
8107
+ /** The bodies one name resolved to, and an identity a walk can de-duplicate on. */
8108
+ interface ResolvedBody {
8109
+ /** `<container>.<name>` for a member, `<name>` for the module binding, `*<name>` for the union. */
8110
+ key: string;
8111
+ sites: CallSiteFact[];
8112
+ }
7663
8113
  /**
7664
- * Who approved, and HOW that identity was established — because the two are
7665
- * different claims. A `hosted` identity was authenticated by the instance that
7666
- * issued the caller's credential; `git` and `os` are self-declared, read from
7667
- * the machine's own config. Recording the source keeps the record honest about
7668
- * how much it proves instead of leaving a bare name to imply more than it can.
8114
+ * source_file_facts.bodySitesOf — the call sites of the ONE body a name
8115
+ * means, told apart from its same-named neighbours by where each is bound;
8116
+ * undefined when the file holds no body under the name.
7669
8117
  *
7670
- * The actual proof is the commit that introduces the lock record — signed
7671
- * commits or a protected branch establish it; no field inside the file ever
7672
- * can.
8118
+ * `container` and `member` are what the reference says about its owner:
8119
+ * `container` is an anchor's `exportedVia` handle or a call's plain-identifier
8120
+ * receiver, and `member` says the reference was written through a receiver at
8121
+ * all. Only the code
8122
+ * settles which body a name means, and where it does not this answers what
8123
+ * the name-keyed union always answered — never a guess:
8124
+ *
8125
+ * - with a container the file binds bodies of this name under, those bodies;
8126
+ * - else a BARE reference (an anchor's symbol, a bare call) means the
8127
+ * module-scope bodies, when the name has some and NO nested one: a bare
8128
+ * name in the module's scope binds the top-level declaration, a member is
8129
+ * reachable only through its container, and a nested body could shadow
8130
+ * the name where it sits;
8131
+ * - else every body under the name, unioned, as callSitesOf answers — a
8132
+ * receiver the file binds no container to holds a value the model cannot
8133
+ * follow, so which body it reaches is not this model's to say.
7673
8134
  */
7674
- interface ApproverIdentity {
7675
- /** Git author line, hosted subject id, or OS username — per `source`. */
7676
- id: string;
7677
- /** Display name when the source carries one separately from the id. */
7678
- name?: string;
7679
- /** 'legacy' is a record written before this field existed: an opaque string. */
7680
- source: ApproverSource;
7681
- }
7682
- /** Weakest-first order of the analysis grades; `none` when no file was analyzed. */
7683
- type AnalysisGradeLabel = 'exact' | 'pattern' | 'generic' | 'none';
8135
+ declare function bodySitesOf(facts: SourceFileFacts, fn: string, container?: string, member?: boolean): ResolvedBody | undefined;
7684
8136
  /**
7685
- * analyzer_identity — which code analyzer produced a set of code-conformance
7686
- * results. Deliberately NOT an input of the gate identity: an analyzer upgrade
7687
- * changes this and never stales a lock.
8137
+ * source_file_facts.hasFunctionBody — whether the file holds a function-like
8138
+ * BODY under a name, as the model measured it: a function, method or accessor
8139
+ * declaration, or a function/arrow initializer bound to a named slot. A name
8140
+ * the file declares WITHOUT one — an overload signature, an ambient
8141
+ * declaration, an interface or type member, a plain value binding, an import
8142
+ * binding, a re-export specifier — answers false, because there is no body
8143
+ * there to read.
8144
+ *
8145
+ * Only exact grade measures bodies at all, so a file analyzed below it always
8146
+ * answers false; a caller that would ACCUSE on the answer must check the grade
8147
+ * itself rather than read "no body" into "not measured".
7688
8148
  */
7689
- interface AnalyzerIdentity {
7690
- /** The wairon version that ran the analysis. */
7691
- validatorVersion: string;
7692
- /** sha256 (hex) of the code-conformance doctrine (gate_identity.analyzer). */
7693
- doctrineDigest: string;
7694
- /** The weakest analysis grade applied to any analyzed file, or `none`. */
7695
- grade: AnalysisGradeLabel;
7696
- }
8149
+ declare function hasFunctionBody(facts: SourceFileFacts, symbol: string): boolean;
7697
8150
  /**
7698
- * code_analysis — the code-conformance half of a validation run, summarized
7699
- * apart from the design half. A lock records it as `code`, beside the claim
7700
- * and never inside it; its `codes` list is left out there.
8151
+ * The language a source file is analyzed as, read from its extension; undefined
8152
+ * for a file no analyzer reads. The one table the analyzer and the implementer
8153
+ * briefs share, so a brief's type mapping is the dialect its code is judged by.
7701
8154
  */
7702
- interface CodeAnalysis {
7703
- analyzer: AnalyzerIdentity;
7704
- /** Every code a code-judging rule declares, sorted. Absent on a lock record. */
7705
- codes?: string[];
7706
- errors: number;
7707
- warnings: number;
7708
- notices: number;
7709
- }
8155
+ declare function languageOfSourcePath(sourcePath: string): string | undefined;
7710
8156
  /**
7711
- * spec_digest_reading — which reading of a spec file a lock record's per-spec
7712
- * digests were taken in. `content`: the raw text, line endings normalized —
7713
- * what every record written before format 3 carries (the field absent).
7714
- * `design`: the spec's design view (code linkage and timestamps out) in
7715
- * canonical form, so a sourcePath, a whitespace edit or a no-op re-save never
7716
- * moves it.
8157
+ * source_file_facts.dialect — the type dialect shipped for the language this
8158
+ * file was analyzed as (type_dialect.forLanguage of its effective language),
8159
+ * or null when the file has no language or no dialect reads it yet. What a
8160
+ * conformance rule reads this file's type annotations through; a null answer
8161
+ * is silence, never a finding.
7717
8162
  */
7718
- type SpecDigestReading = 'content' | 'design';
8163
+ declare function dialectOf(facts: SourceFileFacts): TypeDialect | null;
7719
8164
  /**
7720
- * lock_reexpression — provenance on a lock record a tool carried into a newer
7721
- * reading after PROVING the design is the one approved (its own earlier
7722
- * identity, recomputed over the tree as it stands, matched), rather than a
7723
- * human re-approving it. Who approved and when stay the human's.
8165
+ * The type name a named function-like returns, where the code settles it
8166
+ * (SourceFileFacts.returnTypes); undefined otherwise — the silence a
8167
+ * `fn().method()` receiver keeps when the code does not say what fn returns.
7724
8168
  */
7725
- interface LockReexpression {
7726
- /** ISO-8601 time of the re-expression. */
7727
- at: string;
7728
- /** The gate algorithm the record carried before. */
7729
- fromAlgorithm: string;
7730
- /** The per-spec digest reading the record carried before. */
7731
- fromReading: SpecDigestReading;
7732
- /** The command that re-expressed it (e.g. `wairon doctor --fix`), never a person. */
7733
- by: string;
7734
- }
7735
- /** A project's approval state as seen from its own root. */
7736
- type ProjectApprovalState = 'approved' | 'drifted' | 'never';
7737
- /** How a parent's lock pinned a member. */
7738
- type PinState = 'matches' | 'moved' | 'unpinned';
8169
+ declare function returnTypeOf(facts: SourceFileFacts, fn: string): string | undefined;
7739
8170
  /**
7740
- * project_approval — one project's approval state, computed at that project's
7741
- * OWN root, so the answer is the same whichever root asked (status-agrees).
7742
- * The family's pin tree is a list of these, the root's own entry first.
8171
+ * source_file_facts.resolveImport — resolve one of a file's import specifiers
8172
+ * against a set of known source paths, purely (no I/O). A relative one: join
8173
+ * it with the importing file's directory, then try the joined path, `.js`
8174
+ * swapped for `.ts` or `.tsx`, the `.ts`, `.tsx` and `.js` extensions, and an
8175
+ * index file. A package specifier: the source file `packages` (the code
8176
+ * model's local-package map) names for it, when that file is known.
8177
+ * Undefined for a package the map does not name — a third-party one — or
8178
+ * when nothing matches.
7743
8179
  */
7744
- interface ProjectApproval {
7745
- /** '' for the root the question was asked at, else the member's key. */
7746
- key: string;
7747
- /** The alias the parent declares this member under; absent on the root. */
7748
- alias?: string;
7749
- /** The key of the declaring project; absent on the root. */
7750
- parent?: string;
7751
- /** The project's effective id, when it has a usable one. */
7752
- projectId?: string;
7753
- state: ProjectApprovalState;
7754
- /** Its composition subject: its own record's stateId, `<algorithm>:<digest>`. Absent when never. */
7755
- subject?: string;
7756
- /** Drifted only because the lock predates the stage-5 gate identity. */
7757
- upgraded?: boolean;
7758
- /**
7759
- * Why the approval on record does not cover the project although its gate
7760
- * identity may match: its id moved since the approval, or a declared
7761
- * external was never pinned or is used beyond its pin. Set only on a
7762
- * drifted entry; status, lock-check and lock read the same entry.
7763
- */
7764
- owed?: string;
7765
- /** How the parent's lock pinned it; absent on the root. */
7766
- pinned?: PinState;
7767
- /** part | project (stage 8). A part's state is its declaring project's, and it has no subject of its own. */
7768
- as?: MemberKind;
7769
- /** A part's content digest (ScannedPart.contentDigest), recorded by the lock as its MemberPin. */
7770
- contentDigest?: string;
7771
- /** The commit a part or a referenced project member was read at, when known — provenance the lock records. */
7772
- commit?: string;
7773
- }
8180
+ declare function resolveImport(fromFile: string, specifier: string, knownPaths: Set<string>, packages?: Readonly<Record<string, string>>): string | undefined;
7774
8181
 
7775
8182
  /**
7776
- * member_pin — one direct member as a parent's lock recorded it: the member's
7777
- * composition subject (the stateId its OWN lock record carries) and its
7778
- * approval state when the parent locked. A record of the member owner's
7779
- * decision, never of the member's specs; the parent never writes below itself.
8183
+ * The tests that encode one method a write just changed or deleted
8184
+ * (tests_to_revisit).
8185
+ *
8186
+ * Two lists rather than one because the two ways of finding them fail in
8187
+ * OPPOSITE directions, and merging them would hide which is which — see the
8188
+ * measurement above.
7780
8189
  */
7781
- interface MemberPin {
7782
- /** The member's effective project id when the parent locked. */
7783
- project?: string;
7784
- /** The member's recorded gate identity, `<algorithm>:<digest>`; absent when it had no lock. */
7785
- subject?: string;
7786
- /** approved | drifted | never, as it stood when the parent locked (a part records approved). Recorded, never hashed. */
7787
- state: ProjectApprovalState;
7788
- /** part | project, as the member's content made it when the parent locked; absent in a record written before stage 8. */
7789
- as?: MemberKind;
7790
- /** The commit the member was read at when the parent locked. Provenance only: never read by a verdict. */
7791
- commit?: string;
8190
+ interface TestsToRevisit {
8191
+ /** The contract method the write changed or deleted. */
8192
+ method: string;
8193
+ /** The code-level name searched for: the method's `symbol` when it declares one, else its name. */
8194
+ symbol: string;
8195
+ /**
8196
+ * Test files that IMPORT that symbol — from the method's own source file, or
8197
+ * from a module re-exporting it from there, when that file is known. The
8198
+ * high-confidence list.
8199
+ */
8200
+ imported: string[];
8201
+ /**
8202
+ * Test files that name the symbol without importing it — usually a test
8203
+ * driving the method through a portal or a helper. A file that binds the
8204
+ * name to ANOTHER module is not here: the name in it is that module's.
8205
+ * Empty when `indiscriminate` is true.
8206
+ */
8207
+ mentioned: string[];
8208
+ /**
8209
+ * True when the bare name matched more than a tenth of the walked test files,
8210
+ * so mentioning it carries no signal and `mentioned` was withheld.
8211
+ */
8212
+ indiscriminate: boolean;
8213
+ }
8214
+
8215
+ /**
8216
+ * ispec_validator/ivalidator_portal.findTestsReferencing — the tests that
8217
+ * encode a given set of methods, so a write that changes or deletes one can
8218
+ * say which tests it just invalidated.
8219
+ *
8220
+ * The walk itself belongs to the source analyzer, which already owns this
8221
+ * subsystem's only source-code I/O and the containment rules a root is held
8222
+ * to. A project that declares no test roots answers empty rather than
8223
+ * throwing: naming the tests must never be the thing that fails a write.
8224
+ */
8225
+ declare function findTestsReferencing(methods: ReadonlyArray<Pick<MethodImplementation, 'name' | 'symbol'>>, projectRoot: string, testRoots: readonly string[]): TestsToRevisit[];
8226
+ interface ValidationIssue {
8227
+ /**
8228
+ * After project and profile overrides. A `notice` is reported like any other
8229
+ * finding but never makes a result invalid (`valid` counts errors only) and
8230
+ * never fails `--ci`.
8231
+ */
8232
+ severity: IssueSeverity;
8233
+ code: string;
8234
+ message: string;
8235
+ /** Optional: agent id related to the issue */
8236
+ agentId?: string;
8237
+ specId?: string;
8238
+ /**
8239
+ * True when this issue was raised in a draft/design context — i.e. the spec
8240
+ * it concerns (or an ancestor) is not yet complete. Rules that already know
8241
+ * this (e.g. DRAFT_COMPONENT_WARNING, UNUSED_COMPONENT on a draft component)
8242
+ * surface it so downstream policy — like the --ci gate — can waive warnings
8243
+ * that merely reflect declared, unfinished work without silencing the rule.
8244
+ */
8245
+ draftContext?: boolean;
8246
+ /**
8247
+ * On a finding about a cross-project reference: how the owner's gate
8248
+ * resolved it (outcome, owner, call site, canonical target, input digest,
8249
+ * reason), decided before the severity.
8250
+ */
8251
+ resolution?: ReferenceResolution;
8252
+ /**
8253
+ * In a family run: the key of the project whose gate (or whose external,
8254
+ * for a composition finding) the finding belongs to — '' for the family
8255
+ * root. Absent on the owner's own run.
8256
+ */
8257
+ project?: string;
8258
+ /**
8259
+ * True on a finding reported beside a gate rather than by it — the live
8260
+ * comparison of an external with its producer (family_validator.advise).
8261
+ * Printed and counted with its severity, but never part of a failure
8262
+ * decision: `valid` and `validate --ci` both ignore it, because the pin is
8263
+ * the reproducible gate and a live producer is not.
8264
+ */
8265
+ advisory?: boolean;
8266
+ }
8267
+ interface ValidationResult {
8268
+ valid: boolean;
8269
+ issues: ValidationIssue[];
8270
+ /**
8271
+ * One line, never a finding. The owner's gate: present when the project
8272
+ * declares externals, saying they were judged against their pins and the
8273
+ * advisory live comparison reads their live producers. A family run: present when externals were left out
8274
+ * because their producers lie outside the run's reach.
8275
+ */
8276
+ hint?: string;
8277
+ /**
8278
+ * A family run only: one line per selected project (the root first, then its
8279
+ * members in scan order) with its own gate's totals. Absent on the owner's
8280
+ * gate.
8281
+ */
8282
+ projects?: ProjectVerdict[];
8283
+ /**
8284
+ * The as-complete run only (validateAsComplete): the code-conformance half
8285
+ * summarized with the analyzer that produced it. Absent on the owner's gate
8286
+ * and on a family run.
8287
+ */
8288
+ analysis?: CodeAnalysis;
8289
+ /**
8290
+ * One line, never a finding: how the owner's gate read the code — the
8291
+ * weakest grade any file was read at and, at exact grade, the compiler and
8292
+ * whose copy it is; or that no source file the design names exists yet.
8293
+ * `wairon validate` prints it; sdd_validate_tree carries it in its hint.
8294
+ */
8295
+ codeReading?: string;
8296
+ /**
8297
+ * A family run only: the aliases of the bound project's externals the run
8298
+ * composed as part of its gate (their producers in reach) — the advisory
8299
+ * live comparison skips them, so they get no second word.
8300
+ */
8301
+ composed?: string[];
8302
+ }
8303
+ /**
8304
+ * project_verdict — one project's line in a family run: which project it is,
8305
+ * where it lives, and the totals of its own gate's verdict, which the family
8306
+ * run carries verbatim under the project's key.
8307
+ */
8308
+ interface ProjectVerdict {
8309
+ /** The project's key in the family root's scan ('' for the root itself). */
8310
+ key: string;
8311
+ /** The project's effective id. */
8312
+ id?: string;
8313
+ /** The project's root directory. */
8314
+ directory: string;
8315
+ /** Whether its own gate found no error. */
8316
+ valid: boolean;
8317
+ errors: number;
8318
+ warnings: number;
8319
+ notices: number;
8320
+ }
8321
+ declare function validateRegistry(registry: Registry, rules: RulesConfig): ValidationResult;
8322
+ declare function validateProjectConfig(config: ProjectConfig): ValidationResult;
8323
+ interface ValidationOptions {
8324
+ rules?: RulesConfig;
8325
+ projectType?: string;
8326
+ scopeSubsystem?: string;
8327
+ /**
8328
+ * At a project that declares members: how many member levels the run
8329
+ * reaches. Absent, every level (the family run); 0, the owner's gate alone;
8330
+ * n, the family run selecting that many levels.
8331
+ */
8332
+ memberDepth?: number;
8333
+ /**
8334
+ * Pre-loaded extension packs (the programmatic-wrapper path). When omitted,
8335
+ * the packs declared in the project's own config are loaded — so CLI and
8336
+ * MCP callers get pack rules/profiles/languages without passing anything.
8337
+ */
8338
+ extensions?: LoadedExtensions;
8339
+ /**
8340
+ * Validate at FULL strictness: treat every spec as `complete`, so the
8341
+ * completeness rules that relax to warnings while draft/design apply as
8342
+ * errors. This is the as-complete gate behind `wairon lock`. The flip must
8343
+ * happen INSIDE the validation run — clearLoaderIssues() invalidates the
8344
+ * spec cache, so any status mutation done before calling in is lost to the
8345
+ * rescan (statuses are restored before returning, so the flip is never
8346
+ * observable to later callers).
8347
+ */
8348
+ treatAllAsComplete?: boolean;
8349
+ /**
8350
+ * Ask for the family run explicitly (`validate --family`, MCP `family:
8351
+ * true`). Omitted, a project that declares members runs its family and any
8352
+ * other project runs its owner's gate (validation_options.selectsFamily).
8353
+ */
8354
+ family?: boolean;
8355
+ /**
8356
+ * The by-name pack selections the pack rules judge. Omitted, the project's
8357
+ * own stored selections are read. Given only by a dry run that judges a
8358
+ * candidate configuration it has not written (pack_impact.measure), together
8359
+ * with that candidate's rules, projectType and loaded extensions.
8360
+ */
8361
+ packSelections?: PackSelection[];
8362
+ }
8363
+ /**
8364
+ * The active conformance rule set — the built-in rules plus the loaded
8365
+ * programmatic pack rules, in run order — for `wairon rules list`. Loads and
8366
+ * registers the governing packs, then reads the composed sequence.
8367
+ */
8368
+ declare function listRules(): SddRule[];
8369
+ /**
8370
+ * ispec_validator/ivalidator_portal.validateProject — the owner's gate (stage
8371
+ * 4): judge the bound project from its own files alone — its specs, its
8372
+ * configuration and doctrine, its code, its lock, its externals lock and
8373
+ * pinned snapshots, and the export tables of the members it contains — and
8374
+ * nothing else. It never walks up to a parent, never reads a sibling's live
8375
+ * tree and discovers nothing, so a project's verdict is the same from every
8376
+ * root and with or without its family on disk. A contained member's own specs
8377
+ * are never judged here: its gate judges them under its own configuration.
8378
+ */
8379
+ declare function validateProject(rulesOrOptions?: RulesConfig | ValidationOptions, projectType?: string): ValidationResult;
8380
+ /**
8381
+ * Validate the tree at FULL strictness — treating every spec as `complete`, so
8382
+ * the completeness rules that relax to warnings while draft/design apply as
8383
+ * errors — WITHOUT mutating anything on disk. This is the as-complete gate that
8384
+ * `wairon lock` and the hosting lock require: a draft tree can "pass" a normal
8385
+ * validate yet break the moment it is frozen, so lock must gate on this.
8386
+ *
8387
+ * The status flip lives inside validateProject (treatAllAsComplete) because
8388
+ * validation begins by invalidating the spec cache (clearLoaderIssues), which
8389
+ * would discard any objects mutated out here before the rules ever saw them —
8390
+ * exactly the silent degradation this wrapper previously suffered from.
8391
+ */
8392
+ declare function validateAsComplete(options?: ValidationOptions): ValidationResult;
8393
+ /**
8394
+ * ivalidator_portal.validateFamily — the family run: every selected project's
8395
+ * own gate verbatim under its project key, the composition of each project's
8396
+ * externals against their live producers, and the family checks. `wairon
8397
+ * validate` at a project that declares members, and `--family` anywhere, call
8398
+ * this; the owner's gate is validateProject. It forwards to the family
8399
+ * validator, which keeps the owner's gate a pure function of one project.
8400
+ */
8401
+ declare function validateFamily(options: ValidationOptions): ValidationResult;
8402
+ /**
8403
+ * ivalidator_portal.measurePackImpact — what one pack write would change on
8404
+ * the bound project, measured before it happens: the pack's doctrine against
8405
+ * wairon's defaults, the profiles of it that would govern, and the owner's-gate
8406
+ * findings that differ between the current and the candidate configuration.
8407
+ * Writes nothing. Forwarded to the pack impact workflow.
8408
+ */
8409
+ declare function measurePackImpact(candidate: PackCandidate): PackImpact;
8410
+ /**
8411
+ * ivalidator_portal.measurePackDoctrine — what one pack changes against
8412
+ * wairon's defaults, with no project to validate. Writes nothing. Forwarded to
8413
+ * the pack impact workflow.
8414
+ */
8415
+ declare function measurePackDoctrine(manifest: ExtensionPack): PackDoctrine;
8416
+ /**
8417
+ * ispec_validator/ivalidator_portal.builtinProfileIds — the ids of wairon's
8418
+ * built-in architectural profiles: the built-in half of the profiles a
8419
+ * projectType may name. A copy of the rule set's own constant, so a caller can
8420
+ * never mutate it.
8421
+ */
8422
+ declare function builtinProfileIds(): string[];
8423
+ /**
8424
+ * ispec_validator/ivalidator_portal.builtinProjectKinds — the built-in
8425
+ * composite project kinds: legal projectType values that are not
8426
+ * architectural profiles and carry no doctrine of their own.
8427
+ */
8428
+ declare function builtinProjectKinds(): string[];
8429
+ /**
8430
+ * The gate identity a lock records and every staleness check compares
8431
+ * (ispec_validator/ivalidator_portal.computeGateStateId): the project's OWN
8432
+ * DESIGN identity (code linkage and timestamps out), the design doctrine, its own consumed contract inputs, its
8433
+ * `composition`, and each direct member's composition subject — read from the
8434
+ * member's own lock record, never recomputed and never its specs. So a
8435
+ * parent's identity costs its own tree plus one lock file per direct member,
8436
+ * and a lock taken at a member's own root and one taken inside its family
8437
+ * record the same identity. The validator computes it because the doctrine it
8438
+ * covers is the validator's own rule set; core only compares a lock against
8439
+ * the identity its caller passes (readLockState).
8440
+ */
8441
+ declare function computeGateStateId(): StateId;
8442
+ /**
8443
+ * ivalidator_portal.familyApprovals — the bound project's pin tree: its own
8444
+ * approval state and each member's within `depth` levels, each computed at the
8445
+ * member's own root, with each member's subject and how its parent pinned it.
8446
+ * The one source the lock workflow, `wairon status` and sdd_get_status read,
8447
+ * so they cannot disagree. Writes nothing; a hosted caller gates on reach
8448
+ * itself before asking about a family.
8449
+ */
8450
+ declare function familyApprovals(depth?: number): ProjectApproval[];
8451
+ /**
8452
+ * ivalidator_portal.familyRelations — the bound family's relation health: each
8453
+ * project's externals status read at its own root, stamped with when, a project
8454
+ * that could not be opened answered with its reason. What the canvas colours
8455
+ * its consumption edges from. Writes nothing; callers grant the reach first.
8456
+ */
8457
+ declare function familyRelations(): ProjectRelations[];
8458
+
8459
+ /** How an approver's identity was established. */
8460
+ type ApproverSource = 'git' | 'hosted' | 'os' | 'legacy';
8461
+ /**
8462
+ * Who approved, and HOW that identity was established — because the two are
8463
+ * different claims. A `hosted` identity was authenticated by the instance that
8464
+ * issued the caller's credential; `git` and `os` are self-declared, read from
8465
+ * the machine's own config. Recording the source keeps the record honest about
8466
+ * how much it proves instead of leaving a bare name to imply more than it can.
8467
+ *
8468
+ * The actual proof is the commit that introduces the lock record — signed
8469
+ * commits or a protected branch establish it; no field inside the file ever
8470
+ * can.
8471
+ */
8472
+ interface ApproverIdentity {
8473
+ /** Git author line, hosted subject id, or OS username — per `source`. */
8474
+ id: string;
8475
+ /** Display name when the source carries one separately from the id. */
8476
+ name?: string;
8477
+ /** 'legacy' is a record written before this field existed: an opaque string. */
8478
+ source: ApproverSource;
8479
+ }
8480
+ /** Weakest-first order of the analysis grades; `none` when no file was analyzed. */
8481
+ type AnalysisGradeLabel = 'exact' | 'pattern' | 'generic' | 'none';
8482
+ /**
8483
+ * analyzer_identity — which code analyzer produced a set of code-conformance
8484
+ * results. Deliberately NOT an input of the gate identity: an analyzer upgrade
8485
+ * changes this and never stales a lock.
8486
+ */
8487
+ interface AnalyzerIdentity {
8488
+ /** The wairon version that ran the analysis. */
8489
+ validatorVersion: string;
8490
+ /** sha256 (hex) of the code-conformance doctrine (gate_identity.analyzer). */
8491
+ doctrineDigest: string;
8492
+ /** The weakest analysis grade applied to any analyzed file, or `none`. */
8493
+ grade: AnalysisGradeLabel;
8494
+ }
8495
+ /**
8496
+ * code_analysis — the code-conformance half of a validation run, summarized
8497
+ * apart from the design half. A lock records it as `code`, beside the claim
8498
+ * and never inside it; its `codes` list is left out there.
8499
+ */
8500
+ interface CodeAnalysis {
8501
+ analyzer: AnalyzerIdentity;
8502
+ /** Every code a code-judging rule declares, sorted. Absent on a lock record. */
8503
+ codes?: string[];
8504
+ errors: number;
8505
+ warnings: number;
8506
+ notices: number;
8507
+ }
8508
+ /**
8509
+ * spec_digest_reading — which reading of a spec file a lock record's per-spec
8510
+ * digests were taken in. `content`: the raw text, line endings normalized —
8511
+ * what every record written before format 3 carries (the field absent).
8512
+ * `design`: the spec's design view (code linkage and timestamps out) in
8513
+ * canonical form, so a sourcePath, a whitespace edit or a no-op re-save never
8514
+ * moves it.
8515
+ */
8516
+ type SpecDigestReading = 'content' | 'design';
8517
+ /**
8518
+ * lock_reexpression — provenance on a lock record a tool carried into a newer
8519
+ * reading after PROVING the design is the one approved (its own earlier
8520
+ * identity, recomputed over the tree as it stands, matched), rather than a
8521
+ * human re-approving it. Who approved and when stay the human's.
8522
+ */
8523
+ interface LockReexpression {
8524
+ /** ISO-8601 time of the re-expression. */
8525
+ at: string;
8526
+ /** The gate algorithm the record carried before. */
8527
+ fromAlgorithm: string;
8528
+ /** The per-spec digest reading the record carried before. */
8529
+ fromReading: SpecDigestReading;
8530
+ /** The command that re-expressed it (e.g. `wairon doctor --fix`), never a person. */
8531
+ by: string;
8532
+ }
8533
+ /** A project's approval state as seen from its own root. */
8534
+ type ProjectApprovalState = 'approved' | 'drifted' | 'never';
8535
+ /** How a parent's lock pinned a member. */
8536
+ type PinState = 'matches' | 'moved' | 'unpinned';
8537
+ /**
8538
+ * project_approval — one project's approval state, computed at that project's
8539
+ * OWN root, so the answer is the same whichever root asked (status-agrees).
8540
+ * The family's pin tree is a list of these, the root's own entry first.
8541
+ */
8542
+ interface ProjectApproval {
8543
+ /** '' for the root the question was asked at, else the member's key. */
8544
+ key: string;
8545
+ /** The alias the parent declares this member under; absent on the root. */
8546
+ alias?: string;
8547
+ /** The key of the declaring project; absent on the root. */
8548
+ parent?: string;
8549
+ /** The project's effective id, when it has a usable one. */
8550
+ projectId?: string;
8551
+ state: ProjectApprovalState;
8552
+ /** Its composition subject: its own record's stateId, `<algorithm>:<digest>`. Absent when never. */
8553
+ subject?: string;
8554
+ /** Drifted only because the lock predates the stage-5 gate identity. */
8555
+ upgraded?: boolean;
8556
+ /**
8557
+ * Why the approval on record does not cover the project although its gate
8558
+ * identity may match: its id moved since the approval, or a declared
8559
+ * external was never pinned or is used beyond its pin. Set only on a
8560
+ * drifted entry; status, lock-check and lock read the same entry.
8561
+ */
8562
+ owed?: string;
8563
+ /** How the parent's lock pinned it; absent on the root. */
8564
+ pinned?: PinState;
8565
+ /** part | project (stage 8). A part's state is its declaring project's, and it has no subject of its own. */
8566
+ as?: MemberKind;
8567
+ /** A part's content digest (ScannedPart.contentDigest), recorded by the lock as its MemberPin. */
8568
+ contentDigest?: string;
8569
+ /** The commit a part or a referenced project member was read at, when known — provenance the lock records. */
8570
+ commit?: string;
8571
+ }
8572
+
8573
+ /**
8574
+ * member_pin — one direct member as a parent's lock recorded it: the member's
8575
+ * composition subject (the stateId its OWN lock record carries) and its
8576
+ * approval state when the parent locked. A record of the member owner's
8577
+ * decision, never of the member's specs; the parent never writes below itself.
8578
+ */
8579
+ interface MemberPin {
8580
+ /** The member's effective project id when the parent locked. */
8581
+ project?: string;
8582
+ /** The member's recorded gate identity, `<algorithm>:<digest>`; absent when it had no lock. */
8583
+ subject?: string;
8584
+ /** approved | drifted | never, as it stood when the parent locked (a part records approved). Recorded, never hashed. */
8585
+ state: ProjectApprovalState;
8586
+ /** part | project, as the member's content made it when the parent locked; absent in a record written before stage 8. */
8587
+ as?: MemberKind;
8588
+ /** The commit the member was read at when the parent locked. Provenance only: never read by a verdict. */
8589
+ commit?: string;
7792
8590
  /** Part only: its content digest (ScannedPart.contentDigest) when the parent locked. */
7793
8591
  contentDigest?: string;
7794
8592
  }
@@ -7880,7 +8678,7 @@ interface LockRecord {
7880
8678
  /** For git-backed projects: the compare/PR URL a human opens to merge. */
7881
8679
  compareUrl?: string;
7882
8680
  }
7883
- /** Read the current project's lock record, or null when absent/unreadable. */
8681
+ /** Read the current project's lock record: null when ABSENT, LockRecordUnreadableError when present but unreadable. */
7884
8682
  declare function readLockRecord(): LockRecord | null;
7885
8683
 
7886
8684
  declare class WaironError extends Error {
@@ -7899,6 +8697,20 @@ declare class YamlSyntaxError extends WaironError {
7899
8697
  readonly key: string | undefined;
7900
8698
  constructor(file: string | undefined, line: number | undefined, reason: string, key: string | undefined);
7901
8699
  }
8700
+ /**
8701
+ * Thrown when a lock record EXISTS but cannot be read as one: it does not
8702
+ * parse, it is empty, it is JSON that is not a lock record, or it names a
8703
+ * format this release does not read. An approval that cannot be read is
8704
+ * never read as no approval — that turned a truncated merge into "nothing is
8705
+ * gated" — so every reader fails closed on it, with one line naming the file,
8706
+ * what is wrong, and the two ways out. A WaironError: every command prints it
8707
+ * as one `✖` line and exits non-zero.
8708
+ */
8709
+ declare class LockRecordUnreadableError extends WaironError {
8710
+ readonly file: string;
8711
+ readonly reason: string;
8712
+ constructor(file: string, reason: string);
8713
+ }
7902
8714
  /**
7903
8715
  * Thrown when the project has not been initialized (.wai/ directory missing).
7904
8716
  */
@@ -8803,6 +9615,12 @@ declare function typeSpellingFacts(): TypeSpellingFacts;
8803
9615
  /** ispec_loader.retiredReachFacts — forwarded 1:1 to the index read face. */
8804
9616
  declare function retiredReachFacts(): RetiredReachFact[];
8805
9617
  declare function findLegacySpecFiles(): LegacySpecFile[];
9618
+ /**
9619
+ * core_orchestrator.findOrphanedSpecFiles — the bound tree's spec files left
9620
+ * standing while its specs folder holds no L0: what `validate` and
9621
+ * `lock-check` report as an error instead of reading the tree as empty.
9622
+ */
9623
+ declare function findOrphanedSpecFiles(): string[];
8806
9624
  /**
8807
9625
  * spec_loader.loadSpec / icore_orchestrator.loadSpec — one stored spec of the
8808
9626
  * named kind in the bound tree, or null: for a caller that holds the kind as
@@ -9076,6 +9894,13 @@ interface ExternalConsumer {
9076
9894
  * that renaming that method breaks this consumer. Pure.
9077
9895
  */
9078
9896
  declare function consumerReaches(consumer: ExternalConsumer, publicNames: readonly string[], member: string): boolean;
9897
+ /**
9898
+ * external_consumer.narrowedTo — a consumer as a rename of `member` on one of
9899
+ * `publicNames` breaks it: only those public names, each with that one member,
9900
+ * so a dry run names what breaks rather than the consumer's whole use of the
9901
+ * producer. Its specs stay those that reach the public name. Pure.
9902
+ */
9903
+ declare function narrowedToMember(consumer: ExternalConsumer, publicNames: readonly string[], member: string): ExternalConsumer;
9079
9904
  /**
9080
9905
  * project_family.bindExternal — one external declaration bound to its
9081
9906
  * producer the way the graph binds every declared external: its own problem,
@@ -9194,6 +10019,15 @@ declare function isWindowsReservedName(name: string): boolean;
9194
10019
  */
9195
10020
  declare const MAX_SPEC_ID_LENGTH = 64;
9196
10021
  declare const SpecIdSchema: z.ZodString;
10022
+ declare const MethodNameSchema: z.ZodString;
10023
+ declare const ParamNameSchema: z.ZodString;
10024
+ declare const FieldNameSchema: z.ZodString;
10025
+ /**
10026
+ * A spec's human-readable `name`: display_name.problem — never empty or blank,
10027
+ * and no control, NUL or zero-width character (invisible in every view, cut
10028
+ * short by some tools, and a diagram holding one is a binary file).
10029
+ */
10030
+ declare const DisplayNameSchema: z.ZodString;
9197
10031
  /**
9198
10032
  * Split a qualified id at its last `::` into the namespace prefix and the local
9199
10033
  * id. An unqualified id has an empty prefix and is its own local id.
@@ -9396,9 +10230,9 @@ declare const SystemPublicInterfaceSchema: z.ZodObject<{
9396
10230
  name?: string | undefined;
9397
10231
  as?: string | undefined;
9398
10232
  version?: string | undefined;
10233
+ interface?: string | undefined;
9399
10234
  component?: string | undefined;
9400
10235
  subsystem?: string | undefined;
9401
- interface?: string | undefined;
9402
10236
  typeDef?: string | undefined;
9403
10237
  details?: string | undefined;
9404
10238
  audience?: string | undefined;
@@ -9412,9 +10246,9 @@ declare const SystemPublicInterfaceSchema: z.ZodObject<{
9412
10246
  name?: string | undefined;
9413
10247
  as?: string | undefined;
9414
10248
  version?: string | undefined;
10249
+ interface?: string | undefined;
9415
10250
  component?: string | undefined;
9416
10251
  subsystem?: string | undefined;
9417
- interface?: string | undefined;
9418
10252
  typeDef?: string | undefined;
9419
10253
  details?: string | undefined;
9420
10254
  audience?: string | undefined;
@@ -9486,9 +10320,9 @@ declare const SystemSpecSchema: z.ZodObject<{
9486
10320
  name?: string | undefined;
9487
10321
  as?: string | undefined;
9488
10322
  version?: string | undefined;
10323
+ interface?: string | undefined;
9489
10324
  component?: string | undefined;
9490
10325
  subsystem?: string | undefined;
9491
- interface?: string | undefined;
9492
10326
  typeDef?: string | undefined;
9493
10327
  details?: string | undefined;
9494
10328
  audience?: string | undefined;
@@ -9502,9 +10336,9 @@ declare const SystemSpecSchema: z.ZodObject<{
9502
10336
  name?: string | undefined;
9503
10337
  as?: string | undefined;
9504
10338
  version?: string | undefined;
10339
+ interface?: string | undefined;
9505
10340
  component?: string | undefined;
9506
10341
  subsystem?: string | undefined;
9507
- interface?: string | undefined;
9508
10342
  typeDef?: string | undefined;
9509
10343
  details?: string | undefined;
9510
10344
  audience?: string | undefined;
@@ -9585,9 +10419,9 @@ declare const SystemSpecSchema: z.ZodObject<{
9585
10419
  name?: string | undefined;
9586
10420
  as?: string | undefined;
9587
10421
  version?: string | undefined;
10422
+ interface?: string | undefined;
9588
10423
  component?: string | undefined;
9589
10424
  subsystem?: string | undefined;
9590
- interface?: string | undefined;
9591
10425
  typeDef?: string | undefined;
9592
10426
  details?: string | undefined;
9593
10427
  audience?: string | undefined;
@@ -9614,9 +10448,9 @@ declare const SystemSpecSchema: z.ZodObject<{
9614
10448
  name?: string | undefined;
9615
10449
  as?: string | undefined;
9616
10450
  version?: string | undefined;
10451
+ interface?: string | undefined;
9617
10452
  component?: string | undefined;
9618
10453
  subsystem?: string | undefined;
9619
- interface?: string | undefined;
9620
10454
  typeDef?: string | undefined;
9621
10455
  details?: string | undefined;
9622
10456
  audience?: string | undefined;
@@ -9686,8 +10520,8 @@ declare const PublicInterfaceSchema: z.ZodEffects<z.ZodObject<{
9686
10520
  }, "strip", z.ZodTypeAny, {
9687
10521
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9688
10522
  as?: string | undefined;
9689
- component?: string | undefined;
9690
10523
  interface?: string | undefined;
10524
+ component?: string | undefined;
9691
10525
  typeDef?: string | undefined;
9692
10526
  details?: string | undefined;
9693
10527
  role?: "implement" | "call" | undefined;
@@ -9696,8 +10530,8 @@ declare const PublicInterfaceSchema: z.ZodEffects<z.ZodObject<{
9696
10530
  }, {
9697
10531
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9698
10532
  as?: string | undefined;
9699
- component?: string | undefined;
9700
10533
  interface?: string | undefined;
10534
+ component?: string | undefined;
9701
10535
  typeDef?: string | undefined;
9702
10536
  details?: string | undefined;
9703
10537
  role?: "implement" | "call" | undefined;
@@ -9706,8 +10540,8 @@ declare const PublicInterfaceSchema: z.ZodEffects<z.ZodObject<{
9706
10540
  }>, {
9707
10541
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9708
10542
  as?: string | undefined;
9709
- component?: string | undefined;
9710
10543
  interface?: string | undefined;
10544
+ component?: string | undefined;
9711
10545
  typeDef?: string | undefined;
9712
10546
  details?: string | undefined;
9713
10547
  role?: "implement" | "call" | undefined;
@@ -9716,8 +10550,8 @@ declare const PublicInterfaceSchema: z.ZodEffects<z.ZodObject<{
9716
10550
  }, {
9717
10551
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9718
10552
  as?: string | undefined;
9719
- component?: string | undefined;
9720
10553
  interface?: string | undefined;
10554
+ component?: string | undefined;
9721
10555
  typeDef?: string | undefined;
9722
10556
  details?: string | undefined;
9723
10557
  role?: "implement" | "call" | undefined;
@@ -9907,13 +10741,13 @@ declare const LifecycleEntrypointSchema: z.ZodObject<{
9907
10741
  /** What this lifecycle flow establishes or tears down. */
9908
10742
  description: z.ZodOptional<z.ZodString>;
9909
10743
  }, "strip", z.ZodTypeAny, {
9910
- component: string;
9911
10744
  method: string;
10745
+ component: string;
9912
10746
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
9913
10747
  description?: string | undefined;
9914
10748
  }, {
9915
- component: string;
9916
10749
  method: string;
10750
+ component: string;
9917
10751
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
9918
10752
  description?: string | undefined;
9919
10753
  }>;
@@ -9953,8 +10787,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
9953
10787
  }, "strip", z.ZodTypeAny, {
9954
10788
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9955
10789
  as?: string | undefined;
9956
- component?: string | undefined;
9957
10790
  interface?: string | undefined;
10791
+ component?: string | undefined;
9958
10792
  typeDef?: string | undefined;
9959
10793
  details?: string | undefined;
9960
10794
  role?: "implement" | "call" | undefined;
@@ -9963,8 +10797,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
9963
10797
  }, {
9964
10798
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9965
10799
  as?: string | undefined;
9966
- component?: string | undefined;
9967
10800
  interface?: string | undefined;
10801
+ component?: string | undefined;
9968
10802
  typeDef?: string | undefined;
9969
10803
  details?: string | undefined;
9970
10804
  role?: "implement" | "call" | undefined;
@@ -9973,8 +10807,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
9973
10807
  }>, {
9974
10808
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9975
10809
  as?: string | undefined;
9976
- component?: string | undefined;
9977
10810
  interface?: string | undefined;
10811
+ component?: string | undefined;
9978
10812
  typeDef?: string | undefined;
9979
10813
  details?: string | undefined;
9980
10814
  role?: "implement" | "call" | undefined;
@@ -9983,8 +10817,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
9983
10817
  }, {
9984
10818
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
9985
10819
  as?: string | undefined;
9986
- component?: string | undefined;
9987
10820
  interface?: string | undefined;
10821
+ component?: string | undefined;
9988
10822
  typeDef?: string | undefined;
9989
10823
  details?: string | undefined;
9990
10824
  role?: "implement" | "call" | undefined;
@@ -10002,13 +10836,13 @@ declare const SubsystemSpecSchema: z.ZodObject<{
10002
10836
  /** What this lifecycle flow establishes or tears down. */
10003
10837
  description: z.ZodOptional<z.ZodString>;
10004
10838
  }, "strip", z.ZodTypeAny, {
10005
- component: string;
10006
10839
  method: string;
10840
+ component: string;
10007
10841
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
10008
10842
  description?: string | undefined;
10009
10843
  }, {
10010
- component: string;
10011
10844
  method: string;
10845
+ component: string;
10012
10846
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
10013
10847
  description?: string | undefined;
10014
10848
  }>, "many">>;
@@ -10121,8 +10955,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
10121
10955
  publicInterfaces: {
10122
10956
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
10123
10957
  as?: string | undefined;
10124
- component?: string | undefined;
10125
10958
  interface?: string | undefined;
10959
+ component?: string | undefined;
10126
10960
  typeDef?: string | undefined;
10127
10961
  details?: string | undefined;
10128
10962
  role?: "implement" | "call" | undefined;
@@ -10136,8 +10970,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
10136
10970
  profile?: string | undefined;
10137
10971
  designDepth?: "components" | "interfaces" | "implementations" | "narratives" | undefined;
10138
10972
  lifecycle?: {
10139
- component: string;
10140
10973
  method: string;
10974
+ component: string;
10141
10975
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
10142
10976
  description?: string | undefined;
10143
10977
  }[] | undefined;
@@ -10165,8 +10999,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
10165
10999
  publicInterfaces?: {
10166
11000
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
10167
11001
  as?: string | undefined;
10168
- component?: string | undefined;
10169
11002
  interface?: string | undefined;
11003
+ component?: string | undefined;
10170
11004
  typeDef?: string | undefined;
10171
11005
  details?: string | undefined;
10172
11006
  role?: "implement" | "call" | undefined;
@@ -10174,8 +11008,8 @@ declare const SubsystemSpecSchema: z.ZodObject<{
10174
11008
  consumers?: string[] | undefined;
10175
11009
  }[] | undefined;
10176
11010
  lifecycle?: {
10177
- component: string;
10178
11011
  method: string;
11012
+ component: string;
10179
11013
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
10180
11014
  description?: string | undefined;
10181
11015
  }[] | undefined;
@@ -10223,14 +11057,14 @@ declare const DispatchBindingSchema: z.ZodObject<{
10223
11057
  /** What this capability does. */
10224
11058
  description: z.ZodOptional<z.ZodString>;
10225
11059
  }, "strip", z.ZodTypeAny, {
10226
- component: string;
10227
11060
  method: string;
10228
11061
  capability: string;
11062
+ component: string;
10229
11063
  description?: string | undefined;
10230
11064
  }, {
10231
- component: string;
10232
11065
  method: string;
10233
11066
  capability: string;
11067
+ component: string;
10234
11068
  description?: string | undefined;
10235
11069
  }>;
10236
11070
  type DispatchBinding = z.infer<typeof DispatchBindingSchema>;
@@ -10560,14 +11394,14 @@ declare const ComponentSpecSchema: z.ZodObject<{
10560
11394
  /** What this capability does. */
10561
11395
  description: z.ZodOptional<z.ZodString>;
10562
11396
  }, "strip", z.ZodTypeAny, {
10563
- component: string;
10564
11397
  method: string;
10565
11398
  capability: string;
11399
+ component: string;
10566
11400
  description?: string | undefined;
10567
11401
  }, {
10568
- component: string;
10569
11402
  method: string;
10570
11403
  capability: string;
11404
+ component: string;
10571
11405
  description?: string | undefined;
10572
11406
  }>, "many">>;
10573
11407
  /** Store-only: whether held state survives restart (see DurabilitySchema). */
@@ -10751,9 +11585,9 @@ declare const ComponentSpecSchema: z.ZodObject<{
10751
11585
  example?: string | undefined;
10752
11586
  } | undefined;
10753
11587
  dispatch?: {
10754
- component: string;
10755
11588
  method: string;
10756
11589
  capability: string;
11590
+ component: string;
10757
11591
  description?: string | undefined;
10758
11592
  }[] | undefined;
10759
11593
  durability?: "ram-projection" | "durable" | "read-through" | "cache" | undefined;
@@ -10825,9 +11659,9 @@ declare const ComponentSpecSchema: z.ZodObject<{
10825
11659
  example?: string | undefined;
10826
11660
  } | undefined;
10827
11661
  dispatch?: {
10828
- component: string;
10829
11662
  method: string;
10830
11663
  capability: string;
11664
+ component: string;
10831
11665
  description?: string | undefined;
10832
11666
  }[] | undefined;
10833
11667
  durability?: "ram-projection" | "durable" | "read-through" | "cache" | undefined;
@@ -13650,7 +14484,7 @@ declare const NarrativeStepSchema: z.ZodObject<{
13650
14484
  outcome: z.ZodOptional<z.ZodString>;
13651
14485
  error: z.ZodOptional<z.ZodString>;
13652
14486
  }, "strip", z.ZodTypeAny, {
13653
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
14487
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
13654
14488
  description: string;
13655
14489
  stepNumber: number;
13656
14490
  label?: string | undefined;
@@ -13689,7 +14523,7 @@ declare const NarrativeStepSchema: z.ZodObject<{
13689
14523
  detach?: boolean | undefined;
13690
14524
  outcome?: string | undefined;
13691
14525
  }, {
13692
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
14526
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
13693
14527
  description: string;
13694
14528
  stepNumber: number;
13695
14529
  label?: string | undefined;
@@ -13851,7 +14685,7 @@ declare const MethodImplementationSchema: z.ZodObject<{
13851
14685
  outcome: z.ZodOptional<z.ZodString>;
13852
14686
  error: z.ZodOptional<z.ZodString>;
13853
14687
  }, "strip", z.ZodTypeAny, {
13854
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
14688
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
13855
14689
  description: string;
13856
14690
  stepNumber: number;
13857
14691
  label?: string | undefined;
@@ -13890,7 +14724,7 @@ declare const MethodImplementationSchema: z.ZodObject<{
13890
14724
  detach?: boolean | undefined;
13891
14725
  outcome?: string | undefined;
13892
14726
  }, {
13893
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
14727
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
13894
14728
  description: string;
13895
14729
  stepNumber: number;
13896
14730
  label?: string | undefined;
@@ -13996,7 +14830,7 @@ declare const MethodImplementationSchema: z.ZodObject<{
13996
14830
  }, "strip", z.ZodTypeAny, {
13997
14831
  name: string;
13998
14832
  narrative: {
13999
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
14833
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14000
14834
  description: string;
14001
14835
  stepNumber: number;
14002
14836
  label?: string | undefined;
@@ -14051,7 +14885,7 @@ declare const MethodImplementationSchema: z.ZodObject<{
14051
14885
  ext?: Record<string, unknown> | undefined;
14052
14886
  intent?: string | undefined;
14053
14887
  narrative?: {
14054
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
14888
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14055
14889
  description: string;
14056
14890
  stepNumber: number;
14057
14891
  label?: string | undefined;
@@ -14299,7 +15133,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14299
15133
  outcome: z.ZodOptional<z.ZodString>;
14300
15134
  error: z.ZodOptional<z.ZodString>;
14301
15135
  }, "strip", z.ZodTypeAny, {
14302
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15136
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14303
15137
  description: string;
14304
15138
  stepNumber: number;
14305
15139
  label?: string | undefined;
@@ -14338,7 +15172,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14338
15172
  detach?: boolean | undefined;
14339
15173
  outcome?: string | undefined;
14340
15174
  }, {
14341
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15175
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14342
15176
  description: string;
14343
15177
  stepNumber: number;
14344
15178
  label?: string | undefined;
@@ -14444,7 +15278,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14444
15278
  }, "strip", z.ZodTypeAny, {
14445
15279
  name: string;
14446
15280
  narrative: {
14447
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15281
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14448
15282
  description: string;
14449
15283
  stepNumber: number;
14450
15284
  label?: string | undefined;
@@ -14499,7 +15333,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14499
15333
  ext?: Record<string, unknown> | undefined;
14500
15334
  intent?: string | undefined;
14501
15335
  narrative?: {
14502
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15336
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14503
15337
  description: string;
14504
15338
  stepNumber: number;
14505
15339
  label?: string | undefined;
@@ -14544,7 +15378,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14544
15378
  }>, "many">>, {
14545
15379
  name: string;
14546
15380
  narrative: {
14547
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15381
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14548
15382
  description: string;
14549
15383
  stepNumber: number;
14550
15384
  label?: string | undefined;
@@ -14599,7 +15433,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14599
15433
  ext?: Record<string, unknown> | undefined;
14600
15434
  intent?: string | undefined;
14601
15435
  narrative?: {
14602
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15436
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14603
15437
  description: string;
14604
15438
  stepNumber: number;
14605
15439
  label?: string | undefined;
@@ -14721,7 +15555,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14721
15555
  methods: {
14722
15556
  name: string;
14723
15557
  narrative: {
14724
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15558
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14725
15559
  description: string;
14726
15560
  stepNumber: number;
14727
15561
  label?: string | undefined;
@@ -14809,7 +15643,7 @@ declare const ImplementationSpecSchema: z.ZodObject<{
14809
15643
  ext?: Record<string, unknown> | undefined;
14810
15644
  intent?: string | undefined;
14811
15645
  narrative?: {
14812
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
15646
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
14813
15647
  description: string;
14814
15648
  stepNumber: number;
14815
15649
  label?: string | undefined;
@@ -15631,7 +16465,7 @@ declare const TypeSpecSchema: z.ZodObject<{
15631
16465
  previousNames?: string[] | undefined;
15632
16466
  references?: string | undefined;
15633
16467
  }[];
15634
- kind: "signature" | "entity" | "value-object" | "enum";
16468
+ kind: "enum" | "signature" | "entity" | "value-object";
15635
16469
  createdAt: string;
15636
16470
  updatedAt: string;
15637
16471
  symbol?: string | undefined;
@@ -15673,7 +16507,7 @@ declare const TypeSpecSchema: z.ZodObject<{
15673
16507
  }, {
15674
16508
  id: string;
15675
16509
  name: string;
15676
- kind: "signature" | "entity" | "value-object" | "enum";
16510
+ kind: "enum" | "signature" | "entity" | "value-object";
15677
16511
  createdAt: string;
15678
16512
  updatedAt: string;
15679
16513
  symbol?: string | undefined;
@@ -16003,7 +16837,7 @@ declare const ResolvedTypeSpecSchema: z.ZodObject<{
16003
16837
  previousNames?: string[] | undefined;
16004
16838
  references?: string | undefined;
16005
16839
  }[];
16006
- kind: "signature" | "entity" | "value-object" | "enum";
16840
+ kind: "enum" | "signature" | "entity" | "value-object";
16007
16841
  createdAt: string;
16008
16842
  updatedAt: string;
16009
16843
  symbol?: string | undefined;
@@ -16045,7 +16879,7 @@ declare const ResolvedTypeSpecSchema: z.ZodObject<{
16045
16879
  }, {
16046
16880
  id: string;
16047
16881
  name: string;
16048
- kind: "signature" | "entity" | "value-object" | "enum";
16882
+ kind: "enum" | "signature" | "entity" | "value-object";
16049
16883
  createdAt: string;
16050
16884
  updatedAt: string;
16051
16885
  symbol?: string | undefined;
@@ -16373,7 +17207,7 @@ declare const SCHEMA_OF_KIND: {
16373
17207
  outcome: z.ZodOptional<z.ZodString>;
16374
17208
  error: z.ZodOptional<z.ZodString>;
16375
17209
  }, "strip", z.ZodTypeAny, {
16376
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17210
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16377
17211
  description: string;
16378
17212
  stepNumber: number;
16379
17213
  label?: string | undefined;
@@ -16412,7 +17246,7 @@ declare const SCHEMA_OF_KIND: {
16412
17246
  detach?: boolean | undefined;
16413
17247
  outcome?: string | undefined;
16414
17248
  }, {
16415
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17249
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16416
17250
  description: string;
16417
17251
  stepNumber: number;
16418
17252
  label?: string | undefined;
@@ -16518,7 +17352,7 @@ declare const SCHEMA_OF_KIND: {
16518
17352
  }, "strip", z.ZodTypeAny, {
16519
17353
  name: string;
16520
17354
  narrative: {
16521
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17355
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16522
17356
  description: string;
16523
17357
  stepNumber: number;
16524
17358
  label?: string | undefined;
@@ -16573,7 +17407,7 @@ declare const SCHEMA_OF_KIND: {
16573
17407
  ext?: Record<string, unknown> | undefined;
16574
17408
  intent?: string | undefined;
16575
17409
  narrative?: {
16576
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17410
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16577
17411
  description: string;
16578
17412
  stepNumber: number;
16579
17413
  label?: string | undefined;
@@ -16618,7 +17452,7 @@ declare const SCHEMA_OF_KIND: {
16618
17452
  }>, "many">>, {
16619
17453
  name: string;
16620
17454
  narrative: {
16621
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17455
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16622
17456
  description: string;
16623
17457
  stepNumber: number;
16624
17458
  label?: string | undefined;
@@ -16673,7 +17507,7 @@ declare const SCHEMA_OF_KIND: {
16673
17507
  ext?: Record<string, unknown> | undefined;
16674
17508
  intent?: string | undefined;
16675
17509
  narrative?: {
16676
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17510
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16677
17511
  description: string;
16678
17512
  stepNumber: number;
16679
17513
  label?: string | undefined;
@@ -16795,7 +17629,7 @@ declare const SCHEMA_OF_KIND: {
16795
17629
  methods: {
16796
17630
  name: string;
16797
17631
  narrative: {
16798
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17632
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16799
17633
  description: string;
16800
17634
  stepNumber: number;
16801
17635
  label?: string | undefined;
@@ -16883,7 +17717,7 @@ declare const SCHEMA_OF_KIND: {
16883
17717
  ext?: Record<string, unknown> | undefined;
16884
17718
  intent?: string | undefined;
16885
17719
  narrative?: {
16886
- type: "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "loop" | "try" | "parallel" | "jump" | "return" | "throw";
17720
+ type: "loop" | "return" | "call" | "local" | "dispatch" | "register" | "branch" | "switch" | "try" | "parallel" | "jump" | "throw";
16887
17721
  description: string;
16888
17722
  stepNumber: number;
16889
17723
  label?: string | undefined;
@@ -17306,7 +18140,7 @@ declare const SCHEMA_OF_KIND: {
17306
18140
  previousNames?: string[] | undefined;
17307
18141
  references?: string | undefined;
17308
18142
  }[];
17309
- kind: "signature" | "entity" | "value-object" | "enum";
18143
+ kind: "enum" | "signature" | "entity" | "value-object";
17310
18144
  createdAt: string;
17311
18145
  updatedAt: string;
17312
18146
  symbol?: string | undefined;
@@ -17348,7 +18182,7 @@ declare const SCHEMA_OF_KIND: {
17348
18182
  }, {
17349
18183
  id: string;
17350
18184
  name: string;
17351
- kind: "signature" | "entity" | "value-object" | "enum";
18185
+ kind: "enum" | "signature" | "entity" | "value-object";
17352
18186
  createdAt: string;
17353
18187
  updatedAt: string;
17354
18188
  symbol?: string | undefined;
@@ -17528,14 +18362,14 @@ declare const SCHEMA_OF_KIND: {
17528
18362
  /** What this capability does. */
17529
18363
  description: z.ZodOptional<z.ZodString>;
17530
18364
  }, "strip", z.ZodTypeAny, {
17531
- component: string;
17532
18365
  method: string;
17533
18366
  capability: string;
18367
+ component: string;
17534
18368
  description?: string | undefined;
17535
18369
  }, {
17536
- component: string;
17537
18370
  method: string;
17538
18371
  capability: string;
18372
+ component: string;
17539
18373
  description?: string | undefined;
17540
18374
  }>, "many">>;
17541
18375
  /** Store-only: whether held state survives restart (see DurabilitySchema). */
@@ -17719,9 +18553,9 @@ declare const SCHEMA_OF_KIND: {
17719
18553
  example?: string | undefined;
17720
18554
  } | undefined;
17721
18555
  dispatch?: {
17722
- component: string;
17723
18556
  method: string;
17724
18557
  capability: string;
18558
+ component: string;
17725
18559
  description?: string | undefined;
17726
18560
  }[] | undefined;
17727
18561
  durability?: "ram-projection" | "durable" | "read-through" | "cache" | undefined;
@@ -17793,9 +18627,9 @@ declare const SCHEMA_OF_KIND: {
17793
18627
  example?: string | undefined;
17794
18628
  } | undefined;
17795
18629
  dispatch?: {
17796
- component: string;
17797
18630
  method: string;
17798
18631
  capability: string;
18632
+ component: string;
17799
18633
  description?: string | undefined;
17800
18634
  }[] | undefined;
17801
18635
  durability?: "ram-projection" | "durable" | "read-through" | "cache" | undefined;
@@ -17856,8 +18690,8 @@ declare const SCHEMA_OF_KIND: {
17856
18690
  }, "strip", z.ZodTypeAny, {
17857
18691
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
17858
18692
  as?: string | undefined;
17859
- component?: string | undefined;
17860
18693
  interface?: string | undefined;
18694
+ component?: string | undefined;
17861
18695
  typeDef?: string | undefined;
17862
18696
  details?: string | undefined;
17863
18697
  role?: "implement" | "call" | undefined;
@@ -17866,8 +18700,8 @@ declare const SCHEMA_OF_KIND: {
17866
18700
  }, {
17867
18701
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
17868
18702
  as?: string | undefined;
17869
- component?: string | undefined;
17870
18703
  interface?: string | undefined;
18704
+ component?: string | undefined;
17871
18705
  typeDef?: string | undefined;
17872
18706
  details?: string | undefined;
17873
18707
  role?: "implement" | "call" | undefined;
@@ -17876,8 +18710,8 @@ declare const SCHEMA_OF_KIND: {
17876
18710
  }>, {
17877
18711
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
17878
18712
  as?: string | undefined;
17879
- component?: string | undefined;
17880
18713
  interface?: string | undefined;
18714
+ component?: string | undefined;
17881
18715
  typeDef?: string | undefined;
17882
18716
  details?: string | undefined;
17883
18717
  role?: "implement" | "call" | undefined;
@@ -17886,8 +18720,8 @@ declare const SCHEMA_OF_KIND: {
17886
18720
  }, {
17887
18721
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
17888
18722
  as?: string | undefined;
17889
- component?: string | undefined;
17890
18723
  interface?: string | undefined;
18724
+ component?: string | undefined;
17891
18725
  typeDef?: string | undefined;
17892
18726
  details?: string | undefined;
17893
18727
  role?: "implement" | "call" | undefined;
@@ -17905,13 +18739,13 @@ declare const SCHEMA_OF_KIND: {
17905
18739
  /** What this lifecycle flow establishes or tears down. */
17906
18740
  description: z.ZodOptional<z.ZodString>;
17907
18741
  }, "strip", z.ZodTypeAny, {
17908
- component: string;
17909
18742
  method: string;
18743
+ component: string;
17910
18744
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
17911
18745
  description?: string | undefined;
17912
18746
  }, {
17913
- component: string;
17914
18747
  method: string;
18748
+ component: string;
17915
18749
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
17916
18750
  description?: string | undefined;
17917
18751
  }>, "many">>;
@@ -18024,8 +18858,8 @@ declare const SCHEMA_OF_KIND: {
18024
18858
  publicInterfaces: {
18025
18859
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
18026
18860
  as?: string | undefined;
18027
- component?: string | undefined;
18028
18861
  interface?: string | undefined;
18862
+ component?: string | undefined;
18029
18863
  typeDef?: string | undefined;
18030
18864
  details?: string | undefined;
18031
18865
  role?: "implement" | "call" | undefined;
@@ -18039,8 +18873,8 @@ declare const SCHEMA_OF_KIND: {
18039
18873
  profile?: string | undefined;
18040
18874
  designDepth?: "components" | "interfaces" | "implementations" | "narratives" | undefined;
18041
18875
  lifecycle?: {
18042
- component: string;
18043
18876
  method: string;
18877
+ component: string;
18044
18878
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
18045
18879
  description?: string | undefined;
18046
18880
  }[] | undefined;
@@ -18068,8 +18902,8 @@ declare const SCHEMA_OF_KIND: {
18068
18902
  publicInterfaces?: {
18069
18903
  type?: "REST" | "GraphQL" | "MessageBus" | "RPC" | "Custom" | undefined;
18070
18904
  as?: string | undefined;
18071
- component?: string | undefined;
18072
18905
  interface?: string | undefined;
18906
+ component?: string | undefined;
18073
18907
  typeDef?: string | undefined;
18074
18908
  details?: string | undefined;
18075
18909
  role?: "implement" | "call" | undefined;
@@ -18077,8 +18911,8 @@ declare const SCHEMA_OF_KIND: {
18077
18911
  consumers?: string[] | undefined;
18078
18912
  }[] | undefined;
18079
18913
  lifecycle?: {
18080
- component: string;
18081
18914
  method: string;
18915
+ component: string;
18082
18916
  phase: "init" | "shutdown" | "cyclic" | "interrupt" | "scheduled";
18083
18917
  description?: string | undefined;
18084
18918
  }[] | undefined;
@@ -18947,33 +19781,44 @@ declare const SurfaceTypeDefSchema: z.ZodObject<{
18947
19781
  type: z.ZodString;
18948
19782
  description: z.ZodOptional<z.ZodString>;
18949
19783
  optional: z.ZodOptional<z.ZodBoolean>;
19784
+ /**
19785
+ * The field's rename trace as the producer recorded it (previousNames), so
19786
+ * a consumer pinned to a former field name reads a rename, never an
19787
+ * anonymous shape change. Provenance: it enters no digest.
19788
+ */
19789
+ formerly: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
18950
19790
  }, "strip", z.ZodTypeAny, {
18951
19791
  type: string;
18952
19792
  name: string;
18953
19793
  description?: string | undefined;
18954
19794
  optional?: boolean | undefined;
19795
+ formerly?: string[] | undefined;
18955
19796
  }, {
18956
19797
  type: string;
18957
19798
  name: string;
18958
19799
  description?: string | undefined;
18959
19800
  optional?: boolean | undefined;
19801
+ formerly?: string[] | undefined;
18960
19802
  }>, "many">>;
18961
- /** A signature's parameters (name, type, optional, description) in declared order; only on kind signature. */
19803
+ /** A signature's parameters (name, type, optional, description, rename trace) in declared order; only on kind signature. */
18962
19804
  params: z.ZodOptional<z.ZodArray<z.ZodObject<{
18963
19805
  name: z.ZodString;
18964
19806
  type: z.ZodString;
18965
19807
  description: z.ZodOptional<z.ZodString>;
18966
19808
  optional: z.ZodOptional<z.ZodBoolean>;
19809
+ formerly: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
18967
19810
  }, "strip", z.ZodTypeAny, {
18968
19811
  type: string;
18969
19812
  name: string;
18970
19813
  description?: string | undefined;
18971
19814
  optional?: boolean | undefined;
19815
+ formerly?: string[] | undefined;
18972
19816
  }, {
18973
19817
  type: string;
18974
19818
  name: string;
18975
19819
  description?: string | undefined;
18976
19820
  optional?: boolean | undefined;
19821
+ formerly?: string[] | undefined;
18977
19822
  }>, "many">>;
18978
19823
  /** A signature's one output type; only on kind signature. */
18979
19824
  returns: z.ZodOptional<z.ZodString>;
@@ -19054,6 +19899,7 @@ declare const SurfaceTypeDefSchema: z.ZodObject<{
19054
19899
  name: string;
19055
19900
  description?: string | undefined;
19056
19901
  optional?: boolean | undefined;
19902
+ formerly?: string[] | undefined;
19057
19903
  }[];
19058
19904
  kind: string;
19059
19905
  values?: {
@@ -19065,6 +19911,7 @@ declare const SurfaceTypeDefSchema: z.ZodObject<{
19065
19911
  name: string;
19066
19912
  description?: string | undefined;
19067
19913
  optional?: boolean | undefined;
19914
+ formerly?: string[] | undefined;
19068
19915
  }[] | undefined;
19069
19916
  methods?: {
19070
19917
  name: string;
@@ -19093,6 +19940,7 @@ declare const SurfaceTypeDefSchema: z.ZodObject<{
19093
19940
  name: string;
19094
19941
  description?: string | undefined;
19095
19942
  optional?: boolean | undefined;
19943
+ formerly?: string[] | undefined;
19096
19944
  }[] | undefined;
19097
19945
  methods?: {
19098
19946
  name: string;
@@ -19111,6 +19959,7 @@ declare const SurfaceTypeDefSchema: z.ZodObject<{
19111
19959
  name: string;
19112
19960
  description?: string | undefined;
19113
19961
  optional?: boolean | undefined;
19962
+ formerly?: string[] | undefined;
19114
19963
  }[] | undefined;
19115
19964
  kind?: string | undefined;
19116
19965
  returns?: string | undefined;
@@ -19467,14 +20316,14 @@ declare const SurfaceContractEntrySchema: z.ZodObject<{
19467
20316
  /** What this capability does. */
19468
20317
  description: z.ZodOptional<z.ZodString>;
19469
20318
  }, "strip", z.ZodTypeAny, {
19470
- component: string;
19471
20319
  method: string;
19472
20320
  capability: string;
20321
+ component: string;
19473
20322
  description?: string | undefined;
19474
20323
  }, {
19475
- component: string;
19476
20324
  method: string;
19477
20325
  capability: string;
20326
+ component: string;
19478
20327
  description?: string | undefined;
19479
20328
  }>, "many">>;
19480
20329
  details: z.ZodDefault<z.ZodString>;
@@ -19537,7 +20386,7 @@ declare const SurfaceContractEntrySchema: z.ZodObject<{
19537
20386
  openIdConnectUrl?: string | undefined;
19538
20387
  example?: string | undefined;
19539
20388
  }>>;
19540
- /** The backing Portal's basePath — becomes the per-portal OpenAPI `servers` url. */
20389
+ /** The backing Portal's basePath — joined before every endpoint path of the per-portal OpenAPI document. */
19541
20390
  basePath: z.ZodOptional<z.ZodString>;
19542
20391
  /** Stereotype of the backing component; absent on snapshots written before exports carried it. */
19543
20392
  componentType: z.ZodOptional<z.ZodString>;
@@ -19658,9 +20507,9 @@ declare const SurfaceContractEntrySchema: z.ZodObject<{
19658
20507
  example?: string | undefined;
19659
20508
  } | undefined;
19660
20509
  dispatch?: {
19661
- component: string;
19662
20510
  method: string;
19663
20511
  capability: string;
20512
+ component: string;
19664
20513
  description?: string | undefined;
19665
20514
  }[] | undefined;
19666
20515
  formerly?: string[] | undefined;
@@ -19760,9 +20609,9 @@ declare const SurfaceContractEntrySchema: z.ZodObject<{
19760
20609
  example?: string | undefined;
19761
20610
  } | undefined;
19762
20611
  dispatch?: {
19763
- component: string;
19764
20612
  method: string;
19765
20613
  capability: string;
20614
+ component: string;
19766
20615
  description?: string | undefined;
19767
20616
  }[] | undefined;
19768
20617
  formerly?: string[] | undefined;
@@ -20129,14 +20978,14 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20129
20978
  /** What this capability does. */
20130
20979
  description: z.ZodOptional<z.ZodString>;
20131
20980
  }, "strip", z.ZodTypeAny, {
20132
- component: string;
20133
20981
  method: string;
20134
20982
  capability: string;
20983
+ component: string;
20135
20984
  description?: string | undefined;
20136
20985
  }, {
20137
- component: string;
20138
20986
  method: string;
20139
20987
  capability: string;
20988
+ component: string;
20140
20989
  description?: string | undefined;
20141
20990
  }>, "many">>;
20142
20991
  details: z.ZodDefault<z.ZodString>;
@@ -20199,7 +21048,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20199
21048
  openIdConnectUrl?: string | undefined;
20200
21049
  example?: string | undefined;
20201
21050
  }>>;
20202
- /** The backing Portal's basePath — becomes the per-portal OpenAPI `servers` url. */
21051
+ /** The backing Portal's basePath — joined before every endpoint path of the per-portal OpenAPI document. */
20203
21052
  basePath: z.ZodOptional<z.ZodString>;
20204
21053
  /** Stereotype of the backing component; absent on snapshots written before exports carried it. */
20205
21054
  componentType: z.ZodOptional<z.ZodString>;
@@ -20320,9 +21169,9 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20320
21169
  example?: string | undefined;
20321
21170
  } | undefined;
20322
21171
  dispatch?: {
20323
- component: string;
20324
21172
  method: string;
20325
21173
  capability: string;
21174
+ component: string;
20326
21175
  description?: string | undefined;
20327
21176
  }[] | undefined;
20328
21177
  formerly?: string[] | undefined;
@@ -20422,9 +21271,9 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20422
21271
  example?: string | undefined;
20423
21272
  } | undefined;
20424
21273
  dispatch?: {
20425
- component: string;
20426
21274
  method: string;
20427
21275
  capability: string;
21276
+ component: string;
20428
21277
  description?: string | undefined;
20429
21278
  }[] | undefined;
20430
21279
  formerly?: string[] | undefined;
@@ -20439,33 +21288,44 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20439
21288
  type: z.ZodString;
20440
21289
  description: z.ZodOptional<z.ZodString>;
20441
21290
  optional: z.ZodOptional<z.ZodBoolean>;
21291
+ /**
21292
+ * The field's rename trace as the producer recorded it (previousNames), so
21293
+ * a consumer pinned to a former field name reads a rename, never an
21294
+ * anonymous shape change. Provenance: it enters no digest.
21295
+ */
21296
+ formerly: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
20442
21297
  }, "strip", z.ZodTypeAny, {
20443
21298
  type: string;
20444
21299
  name: string;
20445
21300
  description?: string | undefined;
20446
21301
  optional?: boolean | undefined;
21302
+ formerly?: string[] | undefined;
20447
21303
  }, {
20448
21304
  type: string;
20449
21305
  name: string;
20450
21306
  description?: string | undefined;
20451
21307
  optional?: boolean | undefined;
21308
+ formerly?: string[] | undefined;
20452
21309
  }>, "many">>;
20453
- /** A signature's parameters (name, type, optional, description) in declared order; only on kind signature. */
21310
+ /** A signature's parameters (name, type, optional, description, rename trace) in declared order; only on kind signature. */
20454
21311
  params: z.ZodOptional<z.ZodArray<z.ZodObject<{
20455
21312
  name: z.ZodString;
20456
21313
  type: z.ZodString;
20457
21314
  description: z.ZodOptional<z.ZodString>;
20458
21315
  optional: z.ZodOptional<z.ZodBoolean>;
21316
+ formerly: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
20459
21317
  }, "strip", z.ZodTypeAny, {
20460
21318
  type: string;
20461
21319
  name: string;
20462
21320
  description?: string | undefined;
20463
21321
  optional?: boolean | undefined;
21322
+ formerly?: string[] | undefined;
20464
21323
  }, {
20465
21324
  type: string;
20466
21325
  name: string;
20467
21326
  description?: string | undefined;
20468
21327
  optional?: boolean | undefined;
21328
+ formerly?: string[] | undefined;
20469
21329
  }>, "many">>;
20470
21330
  /** A signature's one output type; only on kind signature. */
20471
21331
  returns: z.ZodOptional<z.ZodString>;
@@ -20546,6 +21406,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20546
21406
  name: string;
20547
21407
  description?: string | undefined;
20548
21408
  optional?: boolean | undefined;
21409
+ formerly?: string[] | undefined;
20549
21410
  }[];
20550
21411
  kind: string;
20551
21412
  values?: {
@@ -20557,6 +21418,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20557
21418
  name: string;
20558
21419
  description?: string | undefined;
20559
21420
  optional?: boolean | undefined;
21421
+ formerly?: string[] | undefined;
20560
21422
  }[] | undefined;
20561
21423
  methods?: {
20562
21424
  name: string;
@@ -20585,6 +21447,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20585
21447
  name: string;
20586
21448
  description?: string | undefined;
20587
21449
  optional?: boolean | undefined;
21450
+ formerly?: string[] | undefined;
20588
21451
  }[] | undefined;
20589
21452
  methods?: {
20590
21453
  name: string;
@@ -20603,6 +21466,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20603
21466
  name: string;
20604
21467
  description?: string | undefined;
20605
21468
  optional?: boolean | undefined;
21469
+ formerly?: string[] | undefined;
20606
21470
  }[] | undefined;
20607
21471
  kind?: string | undefined;
20608
21472
  returns?: string | undefined;
@@ -20759,9 +21623,9 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20759
21623
  example?: string | undefined;
20760
21624
  } | undefined;
20761
21625
  dispatch?: {
20762
- component: string;
20763
21626
  method: string;
20764
21627
  capability: string;
21628
+ component: string;
20765
21629
  description?: string | undefined;
20766
21630
  }[] | undefined;
20767
21631
  formerly?: string[] | undefined;
@@ -20774,6 +21638,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20774
21638
  name: string;
20775
21639
  description?: string | undefined;
20776
21640
  optional?: boolean | undefined;
21641
+ formerly?: string[] | undefined;
20777
21642
  }[];
20778
21643
  kind: string;
20779
21644
  values?: {
@@ -20785,6 +21650,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20785
21650
  name: string;
20786
21651
  description?: string | undefined;
20787
21652
  optional?: boolean | undefined;
21653
+ formerly?: string[] | undefined;
20788
21654
  }[] | undefined;
20789
21655
  methods?: {
20790
21656
  name: string;
@@ -20921,9 +21787,9 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20921
21787
  example?: string | undefined;
20922
21788
  } | undefined;
20923
21789
  dispatch?: {
20924
- component: string;
20925
21790
  method: string;
20926
21791
  capability: string;
21792
+ component: string;
20927
21793
  description?: string | undefined;
20928
21794
  }[] | undefined;
20929
21795
  formerly?: string[] | undefined;
@@ -20940,6 +21806,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20940
21806
  name: string;
20941
21807
  description?: string | undefined;
20942
21808
  optional?: boolean | undefined;
21809
+ formerly?: string[] | undefined;
20943
21810
  }[] | undefined;
20944
21811
  methods?: {
20945
21812
  name: string;
@@ -20958,6 +21825,7 @@ declare const SurfaceSnapshotSchema: z.ZodObject<{
20958
21825
  name: string;
20959
21826
  description?: string | undefined;
20960
21827
  optional?: boolean | undefined;
21828
+ formerly?: string[] | undefined;
20961
21829
  }[] | undefined;
20962
21830
  kind?: string | undefined;
20963
21831
  returns?: string | undefined;
@@ -21239,1146 +22107,430 @@ interface ExternalAddition {
21239
22107
  * declaration and its pin (lock entry and snapshot) went, or why nothing was
21240
22108
  * removed, in one sentence.
21241
22109
  */
21242
- interface ExternalRemoval {
21243
- alias: string;
21244
- /** Whether this call took the declaration out of `.wai/project.yaml` (false on a refusal, a dry run, and an orphaned pin). */
21245
- removed: boolean;
21246
- /** Whether the alias's lock entry and pinned snapshot were removed (or would be, on a dry run). */
21247
- unpinned: boolean;
21248
- /** Why nothing was removed: the alias is neither declared nor pinned. */
21249
- refusal?: string;
21250
- }
21251
- /**
21252
- * external_use_request — what `wairon externals use` and sdd_update_external
21253
- * ask for: names to add to and remove from one declared external's `use`.
21254
- */
21255
- interface ExternalUseRequest {
21256
- alias: string;
21257
- /** Public names to import bare (`*` for all). */
21258
- add?: string[];
21259
- /** Names to stop importing. */
21260
- remove?: string[];
21261
- /** Answer what the `use` would become, writing nothing. */
21262
- dryRun?: boolean;
21263
- }
21264
- /**
21265
- * external_use_change — the answer to changing one external's `use`: the
21266
- * list after the change, what was added and removed, or the refusal.
21267
- */
21268
- interface ExternalUseChange {
21269
- alias: string;
21270
- /** Whether `.wai/project.yaml` now carries the changed `use` (false on a refusal, a dry run and when nothing changed). */
21271
- written: boolean;
21272
- /** The `use` list after the change, in order. */
21273
- use: string[];
21274
- /** The names this change imports that were not imported before. */
21275
- added: string[];
21276
- /** The names this change stops importing. */
21277
- removed: string[];
21278
- /** Why nothing was written, in one sentence. */
21279
- refusal?: string;
21280
- }
21281
- /** The verdict on one used member of a pinned external. */
21282
- type ExternalUseState = 'unchanged' | 'changed' | 'removed' | 'unlocked' | 'unavailable' | 'renamed';
21283
- /** external_use_status — the verdict on one used member of one pinned external. */
21284
- interface ExternalUseStatus {
21285
- publicName?: string;
21286
- member?: string;
21287
- state: ExternalUseState;
21288
- /** EXTERNAL_CHECK_UNAVAILABLE on an unavailable entry — never a pass. */
21289
- code?: string;
21290
- detail?: string;
21291
- /**
21292
- * On a renamed use: the public name (and member, as `name.member`) the live
21293
- * producer's rename trace carries the used name forward to — what the
21294
- * consumer's references should now name.
21295
- */
21296
- renamedTo?: string;
21297
- }
21298
- /** external_status — the status of one declared external. */
21299
- interface ExternalStatus {
21300
- alias: string;
21301
- project: string;
21302
- sourceKind: ExternalSourceKind;
21303
- pinned: boolean;
21304
- reachable: boolean;
21305
- stale: boolean;
21306
- drifted?: boolean;
21307
- uses: ExternalUseStatus[];
21308
- detail?: string;
21309
- /**
21310
- * True when the producer's root lies outside the request's reach and was
21311
- * therefore not read: a family run that narrowed the reach to its selection
21312
- * counts it in its hint rather than as a comparison that failed.
21313
- */
21314
- outOfReach?: boolean;
21315
- /** The content digest the lock recorded for this producer; provenance only, never compared here. */
21316
- pinnedDigest?: string;
21317
- /** The producer's commit as the lock recorded it (another repository only); provenance only. */
21318
- pinnedCommit?: string;
21319
- /**
21320
- * The carried facts the pinned snapshot no longer matches in the live
21321
- * producer (an abi, a transport, a role, the targetLanguage, a rename
21322
- * trace): the snapshot is stale and a re-pin refreshes it. Absent when the
21323
- * producer was not read or nothing carried moved.
21324
- */
21325
- staleFacts?: string[];
21326
- }
21327
- /** ok | drifted | incompatible | unavailable — a relation's health in one word. */
21328
- type RelationHealth = 'ok' | 'drifted' | 'incompatible' | 'unavailable';
21329
- /**
21330
- * external_status.health — the relation's health in one word, the same on the
21331
- * canvas's edges and on the hosted Relations tab. A known break outranks the
21332
- * unknown, and the unknown outranks a benign change, so nothing that could not
21333
- * be checked ever reads as ok. Pure: over the status's own fields.
21334
- */
21335
- declare function relationHealth(status: ExternalStatus): RelationHealth;
21336
- /**
21337
- * project_relations — one project of a family with its externals status, read
21338
- * at its own root: what the canvas colours its consumption edges from.
21339
- */
21340
- interface ProjectRelations {
21341
- /** The consuming project's key in the bound family ('' for the bound root). */
21342
- project: string;
21343
- /** Its externals status, per use — and one per contained project member it references. */
21344
- externals: ExternalStatus[];
21345
- /** ISO-8601 time the statuses were read. */
21346
- comparedAt: string;
21347
- /** Why the project's statuses could not be read at all; then externals is empty. */
21348
- detail?: string;
21349
- }
21350
- /** external_listing — one row of `wairon externals list`. */
21351
- interface ExternalListing {
21352
- alias: string;
21353
- project: string;
21354
- sourceKind: ExternalSourceKind;
21355
- relation?: ExternalRelation;
21356
- directory?: string;
21357
- audience: string;
21358
- lock?: ExternalLockEntry;
21359
- problem?: string;
21360
- }
21361
- /** One rendered per-portal OpenAPI document (see the codec's toOpenApiSet). */
21362
- declare const NamedOpenApiSpecSchema: z.ZodObject<{
21363
- portalId: z.ZodString;
21364
- name: z.ZodString;
21365
- document: z.ZodString;
21366
- }, "strip", z.ZodTypeAny, {
21367
- name: string;
21368
- document: string;
21369
- portalId: string;
21370
- }, {
21371
- name: string;
21372
- document: string;
21373
- portalId: string;
21374
- }>;
21375
- type NamedOpenApiSpec = z.infer<typeof NamedOpenApiSpecSchema>;
21376
- declare const GroupSpecSchema: z.ZodObject<{
21377
- kind: z.ZodLiteral<"group">;
21378
- id: z.ZodString;
21379
- name: z.ZodString;
21380
- description: z.ZodOptional<z.ZodString>;
21381
- createdAt: z.ZodString;
21382
- updatedAt: z.ZodString;
21383
- }, "strip", z.ZodTypeAny, {
21384
- id: string;
21385
- name: string;
21386
- kind: "group";
21387
- createdAt: string;
21388
- updatedAt: string;
21389
- description?: string | undefined;
21390
- }, {
21391
- id: string;
21392
- name: string;
21393
- kind: "group";
21394
- createdAt: string;
21395
- updatedAt: string;
21396
- description?: string | undefined;
21397
- }>;
21398
- type GroupSpec = z.infer<typeof GroupSpecSchema>;
21399
-
21400
- /**
21401
- * technology.packages — the package names the code twin of the leakage rule
21402
- * (TECH_LEAKAGE_IN_CODE) compares an import's package name with.
21403
- *
21404
- * A design names a technology the way people say it (`postgres`), while the
21405
- * code imports its driver (`pg`). Comparing only the declared tokens left the
21406
- * code fence inert on an ordinary design, so this module carries a CURATED,
21407
- * DOCUMENTED table of the common packages each technology is known by, keyed by
21408
- * the technology's usual spellings. It is deliberately short: a package belongs
21409
- * here only when importing it can mean nothing BUT that technology. An HTTP
21410
- * client (fetch, axios, got, undici) is never a technology — it is how an
21411
- * Adapter reaches anything — so no entry names one.
21412
- *
21413
- * Extending it takes no code change: a technology written `{ name, matches }`
21414
- * adds its own tokens, and a loaded pack contributes packages per technology
21415
- * name (an extension pack's `technologyPackages`).
21416
- */
21417
-
21418
- /** The common packages of one technology. */
21419
- interface TechnologyPackageEntry {
21420
- /** The names a design writes the technology under, lower-case. */
21421
- names: readonly string[];
21422
- /** The packages importing which means that technology. */
21423
- packages: readonly string[];
21424
- }
21425
- /**
21426
- * The built-in table. Documented in docs/cli.md ("Technologies and their
21427
- * packages"); keep the two in step.
21428
- */
21429
- declare const TECHNOLOGY_PACKAGES: readonly TechnologyPackageEntry[];
21430
- /**
21431
- * technology.packages — the entry's tokens, then the built-in table's packages
21432
- * for its name, then the packages `contributed` lists under its name (what
21433
- * loaded packs contribute, keyed by technology name), lower-cased and
21434
- * de-duplicated in that order. Pure: the contributions are handed in.
21435
- */
21436
- declare function technologyPackages(tech: Technology, contributed?: Readonly<Record<string, readonly string[]>>): string[];
21437
-
21438
- /**
21439
- * The type identifiers a type string names, with comments, trailing prose and
21440
- * string literals stripped. Duplicates are kept, in order of appearance.
21441
- */
21442
- declare function extractTypeIdentifiers(typeStr: string): string[];
21443
- /**
21444
- * The method shape the type references are read from: a contract method or a
21445
- * type method (whose params feed its references exactly as a contract
21446
- * method's do). The text and returns may be absent while a method is still in
21447
- * its stored form — a sourced method states neither, and a params-bearing one
21448
- * need not store its text — and an absent one names nothing.
21449
- */
21450
- interface MethodLike {
21451
- signature?: string;
21452
- returns?: string;
21453
- params?: {
21454
- name: string;
21455
- type: string;
21456
- }[];
21457
- }
21458
- /**
21459
- * method_signature.typeRefs — the named types a method references. Structured
21460
- * `params` are authoritative when present (no prose parsing): the named
21461
- * references of every param type and of the returns, each parsed under the
21462
- * grammar. Otherwise the prose signature and the returns are tokenized
21463
- * leniently, as the unstructured form always was.
21464
- */
21465
- declare function methodTypeRefs(m: MethodLike): string[];
21466
- /**
21467
- * type_spec.signatureTypeRefs — the named types a signature type references:
21468
- * every param type, then its returns, each parsed under the grammar — the
21469
- * references a signature carries in place of fields. None for any other kind,
21470
- * whose references are its fields'.
21471
- */
21472
- declare function signatureTypeRefs(type: Pick<TypeSpec, 'kind' | 'params' | 'returns'>): string[];
21473
- /**
21474
- * method_signature.genericParameters — the generic parameters declared before
21475
- * the parameter list of the method's prose signature (find<T>(id: string)
21476
- * gives T).
21477
- */
21478
- declare function methodGenericParameters(method: {
21479
- signature?: string;
21480
- }): Set<string>;
21481
- /**
21482
- * reference_resolution.nameKey — the one key a bare name is compared by,
21483
- * locally and through imports alike: lower-cased, every character outside
21484
- * [a-z0-9] removed, so `SharedError`, `shared-error` and `shared_error` are
21485
- * one name. It is normalizePart, the per-segment normalization
21486
- * type_spec.matchesRef already applies.
21487
- */
21488
- declare function nameKey(name: string): string;
21489
- /**
21490
- * Whether a written type reference names a type id: the reference's `::` or
21491
- * `.` segments are a suffix of the id's, compared ignoring case and
21492
- * punctuation.
21493
- */
21494
- declare function matchTypeRef(ref: string, typeId: string): boolean;
21495
- /**
21496
- * type_spec.qualifiedId — the type's id qualified by its owning subsystem, when
21497
- * the id is not already qualified.
21498
- */
21499
- declare function qualifiedTypeId(type: Pick<TypeSpec, 'id' | 'subsystem'>): string;
21500
- /**
21501
- * type_spec.matchesRef — whether a written type reference names this type: the
21502
- * reference's `::` or `.` segments are a suffix of the qualified id, compared
21503
- * ignoring case and punctuation.
21504
- */
21505
- declare function typeMatchesRef(type: Pick<TypeSpec, 'id' | 'subsystem'>, ref: string): boolean;
21506
- /** type_spec.genericParameters — the generic parameters declared in the type's name (Page<T> gives T). */
21507
- declare function typeGenericParameters(type: Pick<TypeSpec, 'name'>): Set<string>;
21508
- /**
21509
- * type_spec.fieldTypeRefs — the named types one of this type's field types
21510
- * references (type_expression.namedRefs of the field's parsed type), with the
21511
- * type's own generic parameters left out (compared ignoring case). A field
21512
- * type that does not parse names nothing: its problem is
21513
- * TYPE_EXPRESSION_INVALID's to report. It takes the field's type rather than
21514
- * its name, because nothing makes field names unique within a type.
21515
- */
21516
- declare function fieldTypeRefs(type: Pick<TypeSpec, 'name'>, fieldType: string): string[];
21517
- /** interface_spec.genericParameters — the generic parameters declared in the interface's name. */
21518
- declare function interfaceGenericParameters(intf: Pick<InterfaceSpec, 'name'>): Set<string>;
21519
-
21520
- /** type_dialect — one language's reading and writing of the neutral grammar. */
21521
- interface TypeDialect {
21522
- /** The language this dialect reads and writes, as the code analyzer names it. */
21523
- language: string;
21524
- /** The canonical expression a code annotation spells, or null when it has no canonical reading. */
21525
- read(annotation: string): TypeExpression | null;
21526
- /** Whether a code annotation and a canonical spec expression describe the same type. */
21527
- agrees(annotation: string, expression: TypeExpression, codeNames: Map<string, string>): boolean;
21528
- /** This language's idiomatic spelling of a canonical expression. */
21529
- write(expression: TypeExpression): string;
21530
- /** The write table as lines an implementer brief carries. */
21531
- mappingLines(): string[];
21532
- }
21533
- /** type_dialect.forLanguage — the dialect shipped for a language, or null when none reads it yet. */
21534
- declare function typeDialectFor(language: string): TypeDialect | null;
21535
- /**
21536
- * type_dialect.mappingFor — the write table an implementer brief carries for
21537
- * a language: a shipped dialect's mappingLines, else a MAPPING-ONLY table for
21538
- * a language no analyzer reads yet (Rust, Python), whose last line says that
21539
- * code conformance does not compare its types. Null for a language with
21540
- * neither.
21541
- */
21542
- declare function typeMappingFor(language: string): string[] | null;
21543
-
21544
- /**
21545
- * The step graph of one narrative (step_graph): the SINGLE source of truth for
21546
- * successor semantics (fall-through + jumps; loop and try headers carry both
21547
- * their body edge and their after-region exit edge; return/throw terminate).
21548
- * The narrative-reachability check and the antipattern analysis both read
21549
- * it, so the two never disagree about what "next" means.
21550
- */
21551
- interface StepGraph {
21552
- /** The narrative's step numbers in ascending order. */
21553
- stepNumbers: number[];
21554
- /** The step with this number, if there is one. */
21555
- stepAt(stepNumber: number): NarrativeStep | undefined;
21556
- /** The next step number in ascending order, ignoring jumps and parallel joins. */
21557
- nextOf(stepNumber: number): number | undefined;
21558
- /** The distinct existing step numbers flow can continue at from this step. */
21559
- successorsOf(stepNumber: number): number[];
21560
- }
21561
- /**
21562
- * method_implementation.stepGraph — the step graph of the method's narrative.
21563
- * Simple steps fall through; a branch continues at its true and false steps, a
21564
- * switch at its cases and default; a loop at its body and the step after its
21565
- * region; a try at its body, catch steps, finally step and the step after its
21566
- * region; a parallel fans out to its arms, whose last steps continue at the
21567
- * join; a jump at its target; return and throw end the path.
21568
- */
21569
- declare function stepGraph(method: Pick<MethodImplementation, 'narrative'>): StepGraph;
21570
-
21571
- /** The finding codes a narrative step-configuration problem maps to. */
21572
- type StepConfigCode = 'DUPLICATE_STEP_LABEL' | 'MALFORMED_FLOW_STEP' | 'INVALID_STEP_JUMP' | 'FOREIGN_STEP_FIELD';
21573
- /**
21574
- * One thing wrong with a narrative's step configuration (step_config_problem):
21575
- * the step it sits on, the finding code it maps to, and the detail a rule
21576
- * appends to its own "Method X in implementation Y" prefix. Duplicate labels,
21577
- * missing or misplaced flow config, and jumps that land nowhere are all
21578
- * reported through this one shape.
21579
- */
21580
- interface StepConfigProblem {
21581
- /** The step the problem sits on; a duplicate label names the earlier step in its detail. */
21582
- stepNumber: number;
21583
- /** The finding code this problem maps to. */
21584
- code: StepConfigCode;
21585
- /** The problem stated in full, ready to follow a rule's own location prefix. */
21586
- detail: string;
21587
- }
21588
- /**
21589
- * What a narrative's step configuration says about itself (step_config_verdict):
21590
- * the problems it carries, in step order, and whether its control flow is
21591
- * SOUND — no duplicate step number, no missing or misplaced flow config, and
21592
- * no jump that lands outside the narrative. A duplicate label is a problem but
21593
- * not an unsoundness: labels name steps, they do not route flow.
21594
- *
21595
- * Soundness is the gate every later phase runs behind. Reachability, region
21596
- * nesting and jump-edge judgement all read the step graph, and a graph built
21597
- * over jumps that target nothing reports steps as dead that are merely
21598
- * mis-numbered — wrong findings, not just noisier ones.
21599
- */
21600
- interface StepConfigVerdict {
21601
- /** The step-config problems, in step order: labels first, then numbering, then per-step config and jump targets. */
21602
- problems: StepConfigProblem[];
21603
- /** True when nothing found makes the control flow unreadable — the precondition for judging structure. */
21604
- sound: boolean;
22110
+ /** external_removal_plan — what removing one external takes out: its declaration, its pin, or both. */
22111
+ interface ExternalRemovalPlan {
22112
+ /** Whether the declaration in `.wai/project.yaml` goes. */
22113
+ declaration: boolean;
22114
+ /** Whether the lock entry and pinned snapshot go. */
22115
+ pin: boolean;
21605
22116
  }
21606
- /**
21607
- * The configuration each narrative step TYPE may carry, beyond what every step
21608
- * carries. This is the field set a retype rebuilds against, and the field set
21609
- * a stored step is judged against.
21610
- *
21611
- * Changing a step's `type` used to merge the new type's fields over the old
21612
- * step's and leave the rest standing, so a `branch` that became a `call` kept
21613
- * its `condition` and `onFalseStep`: a step the schema accepts, a write that
21614
- * reports success, and a MALFORMED_FLOW_STEP at the next validate, blamed on
21615
- * the narrative rather than on the edit that made it. The writer no longer
21616
- * leaves those behind; FOREIGN_STEP_FIELD reports the ones already written.
21617
- */
21618
- declare const STEP_TYPE_FIELDS: Readonly<Record<string, readonly string[]>>;
21619
- /**
21620
- * What a step carries whatever its type — the human's own content. A retype
21621
- * keeps these: the author is changing HOW the step works, not what it is for,
21622
- * and re-typing a step should never cost them the sentence they wrote or the
21623
- * anchor other steps address it by.
21624
- */
21625
- declare const STEP_COMMON_FIELDS: readonly string[];
21626
- /** The transient `*Label` twin of each jump-by-number field, resolved and dropped at write time. */
21627
- declare const STEP_LABEL_TWINS: Readonly<Record<string, string>>;
21628
- /** Every field a step of this type may carry, including the transient label twins. */
21629
- declare function stepFieldsFor(type: string): Set<string>;
21630
- /**
21631
- * narrative_step.foreignFields — the fields this step carries that its own
21632
- * `type` cannot: everything set on it beyond the common fields and the ones
21633
- * its type adds. An unknown step type has no table, so nothing is foreign to
21634
- * it — the schema is what names that.
21635
- */
21636
- declare function narrativeStepForeignFields(step: NarrativeStep): string[];
21637
- /**
21638
- * method_implementation.stepConfigVerdict — the step-config problems of this
21639
- * method's narrative and whether its control flow is sound. The schema keeps
21640
- * every flow field optional, so this derivation is what holds each step type
21641
- * to the config it needs, each label to one step, each step number to one
21642
- * step, and every jump field to a step number the narrative actually has.
21643
- */
21644
- declare function stepConfigVerdict(method: Pick<MethodImplementation, 'narrative'>): StepConfigVerdict;
21645
-
21646
- type AnalysisGrade = 'exact' | 'pattern' | 'generic';
21647
- type SourceFileStatus = 'analyzed' | 'missing' | 'escaped' | 'unreadable';
21648
- /**
21649
- * One runtime (value) import binding a file makes: the module specifier a
21650
- * local name came from, and whether it was bound as a whole NAMESPACE.
21651
- *
21652
- * The namespace flag separates the two readings of `x.save()`. For a namespace
21653
- * import (`import * as specs from './specs.js'`), `specs.save` IS that
21654
- * module's own export, so the call site resolves to the module. For a named or
21655
- * default binding, `db.save` is a property of a VALUE that module handed over,
21656
- * and where that property's function was written is beyond a pure model — so
21657
- * it resolves to nothing rather than to the module.
21658
- *
21659
- * Type-only imports are never recorded: a type binding cannot be a call origin.
21660
- */
21661
- /**
21662
- * One name a file republishes from another module (source_file_facts
21663
- * reexportBindings): `export { local as exported } from 'from'`, or a star
21664
- * re-export, which republishes every name its module exports under that same
21665
- * name and is written with `*` on both sides.
21666
- */
21667
- interface ReexportBindingFact {
21668
- /** The name this file publishes it under; `*` for a star re-export. */
21669
- exported: string;
21670
- /** The name the module it comes from publishes it under; `*` for a star re-export. */
21671
- local: string;
21672
- /** The module specifier, exactly as written. */
21673
- from: string;
21674
- }
21675
- /**
21676
- * One name a file publishes BOUND to another name of its own scope, with no
21677
- * module specifier of its own (source_file_facts exportAliases): an export
21678
- * specifier `export { local as exported }`, renamed or not, or an
21679
- * identifier-valued property of an exported top-level object literal —
21680
- * `{ exported: local }` or the shorthand `{ exported }` — which then carries
21681
- * the object's binding name as its `container`. The local name is this file's
21682
- * own declaration, or an import binding that leads on to the module it came
21683
- * from: either way the forwarding is written down, one hop away.
21684
- */
21685
- interface ExportAliasFact {
21686
- /** The name this file publishes: the export specifier's exported name, or the object property's key. */
21687
- exported: string;
21688
- /** The name of this file's own scope it is bound to: a local declaration, or an import binding. */
21689
- local: string;
21690
- /** The exported object literal's binding name, set only for a property alias — what an `exportedVia` handle names. */
21691
- container?: string;
21692
- }
21693
- interface ImportBindingFact {
21694
- /** The module specifier the binding came from, exactly as written. */
21695
- from: string;
21696
- /** True for `import * as name from …` — the only binding whose property calls are that module's own exports. */
21697
- namespace?: boolean;
21698
- /** The name the module publishes it under, set only when the import renamed it (`import { save as store }`). */
21699
- imported?: string;
21700
- }
21701
- /**
21702
- * One call SITE SHAPE inside a named function-like: the invoked name together
21703
- * with how the call was written. Shape is what a pure model can honestly say
21704
- * about a call's ORIGIN — with no type checker, `save(x)`, `ledger.save(x)`,
21705
- * `this.store.save(x)` and `new Ledger(db).save(x)` are four different
21706
- * questions, and collapsing them onto the name "save" is what let a call into
21707
- * an unrelated module count as realizing a narrative step.
21708
- *
21709
- * Sites are deduplicated per shape, never counted: the checks that read them
21710
- * ask where a call could land, never how often it was written.
21711
- */
21712
- interface CallSiteFact {
21713
- /** The invoked name: the identifier of a bare call, the property name of a member call. */
21714
- name: string;
21715
- /** True when the call was written as a member access (`receiver.name(…)`). */
21716
- member: boolean;
21717
- /**
21718
- * The receiver identifier — set only when the receiver is a plain identifier
21719
- * (`specs.save()` → "specs"). The one receiver that can be PROVEN, when the
21720
- * name is a namespace import binding and its properties are that module's
21721
- * own exports — and otherwise a receiver to follow past the value it holds,
21722
- * through the type the file ANNOTATES the name with.
21723
- */
21724
- via?: string;
21725
- /**
21726
- * The instance FIELD the receiver is — set only when the call was written
21727
- * `this.<field>.name(…)` (`this.store.save()` → "store"), and never together
21728
- * with `via`. A receiver a pure model can follow past the value it holds,
21729
- * because the class DECLARES what the field is; what that type resolves to
21730
- * is a POSSIBLE origin, never a proven one, since the declared type says
21731
- * what a collaborator is and not which class ships the body.
21732
- */
21733
- field?: string;
21734
- /**
21735
- * The CLASS the receiver was constructed from — set only when the call was
21736
- * written `new Class(…).name(…)` (`new ApprovalRegistry(store).create()` →
21737
- * "ApprovalRegistry"), and never together with `via` or `field`. Another
21738
- * receiver a pure model can follow, because the code NAMES the class it
21739
- * built. Like a declared field type it is a POSSIBLE origin and never a
21740
- * proven one: a method the class INHERITS is written in its base's module,
21741
- * not in the constructed class's.
21742
- */
21743
- constructed?: string;
21744
- /**
21745
- * The function whose RESULT the receiver is — set only when the call was
21746
- * written `fn(…).name(…)` with `fn` a plain identifier
21747
- * (`current().updateSpec()` → "current"), and never together with `via`,
21748
- * `field` or `constructed`. Followed through what the code writes down
21749
- * about fn's result (SourceFileFacts.returnTypes): a POSSIBLE origin and
21750
- * never a proven one, and only where the module that type leads to holds a
21751
- * body under the invoked name.
21752
- */
21753
- returnedBy?: string;
21754
- /**
21755
- * The top-level named class whose own method the call sits in — set only
21756
- * when the call was written `this.name(…)` directly inside a method,
21757
- * accessor or constructor of that class (an arrow function keeps `this`; a
21758
- * nested function expression rebinds it and records nothing). A POSSIBLE
21759
- * origin and never a proven one, since a subclass may override the method,
21760
- * and only where the class holds a body under the invoked name.
21761
- */
21762
- enclosingClass?: string;
21763
- /**
21764
- * The receiver written as a CHAIN of property accesses — set only when the
21765
- * call was written `this.<field>.<property>….name(…)`
21766
- * (`this.c.tracker.checkIn()` → ["this", "c", "tracker"]) or
21767
- * `<name>.<property>….name(…)` (`deps.tracker.checkIn()` → ["deps",
21768
- * "tracker"]), and never together with `via`, `field`, `constructed`,
21769
- * `returnedBy` or `enclosingClass`. The shape constructor-injected
21770
- * collaborators take when they arrive as ONE bag object. Followed link by
21771
- * link through what the code DECLARES each link to be — the root's field
21772
- * or annotated type, then each property's declared type on the shape that
21773
- * declares it — and, like every receiver past an import binding, a
21774
- * POSSIBLE origin and never a proven one.
21775
- */
21776
- receiverPath?: string[];
21777
- /**
21778
- * The file this site was READ in, set only when it is not the file these
21779
- * facts describe — a pure re-export barrel carries the sites of the function
21780
- * it publishes. A carried site's bare names and receivers resolve in that
21781
- * file's scope, never in the barrel's.
21782
- */
21783
- from?: string;
21784
- }
21785
- /**
21786
- * One function-like BODY under its name, with where it is bound — the
21787
- * identity that tells same-named functions in one file apart.
21788
- *
21789
- * module (no `container`, no `nested`) a top-level function declaration,
21790
- * or a function/arrow initializer of a top-level variable: what
21791
- * the bare name means anywhere in the module's scope.
21792
- * member `container` set: a member of a top-level named class, or a
21793
- * property of an object literal a top-level variable is bound to
21794
- * (`const store = { save() {} }` → container "store"). Reachable
21795
- * only through that container, never by the bare name.
21796
- * nested `nested` set: any other binding — a function inside a
21797
- * function, a member of a class or object literal the model
21798
- * cannot name. A nested body can shadow the bare name in the
21799
- * scope it sits in, so where one exists the name stays ambiguous.
21800
- */
21801
- interface FunctionBodyFact {
21802
- /** The named class or top-level object literal the body is a member of. */
21803
- container?: string;
21804
- /** True when the body is bound somewhere the model cannot name. */
21805
- nested?: boolean;
21806
- /** The call sites written inside this body alone. */
21807
- sites: CallSiteFact[];
21808
- }
21809
- /**
21810
- * One data member of a shape a file declares: its name, and whether the code
21811
- * lets it be ABSENT.
21812
- *
21813
- * Absent-able is the only optionality worth recording, because it is the only
21814
- * one a spec can be wrong about in a way a reader would notice — a field the
21815
- * spec calls required that the code lets you omit is a promise the data does
21816
- * not keep. A wrapper that FILLS a missing key is not absent-able: the value
21817
- * the type finally holds always has it, which is the shape the spec describes.
21818
- */
21819
- interface ShapeMemberFact {
21820
- /** The member's name, as the code spells it. */
21821
- name: string;
21822
- /** Whether the code lets the member be absent from a value of this shape. */
21823
- optional: boolean;
21824
- }
21825
- /**
21826
- * One parameter of a function as the code declares it: what it is called, what
21827
- * it is annotated with, and whether a caller may leave it out.
21828
- *
21829
- * The TYPE is what makes a RENAME tellable from a dropped parameter —
21830
- * `seed(config: HostConfig)` realized as `bootstrapInstance(cfg: HostConfig)`
21831
- * is one parameter under two names, and matching on names alone reads it as a
21832
- * parameter the code lost. A parameter bound by destructuring has no name to
21833
- * compare, so it records none rather than inventing one: a guess about
21834
- * somebody's signature is worse than silence, exactly as it is for a field.
21835
- */
21836
- interface ParameterFact {
21837
- /** The parameter's name, absent when it is bound by a destructuring pattern instead. */
21838
- name?: string;
21839
- /** The type it is annotated with, exactly as written and whitespace-normalized; absent when the code annotates nothing. */
21840
- type?: string;
21841
- /** Whether a caller may leave it out — marked optional, given a default, or a rest parameter. */
21842
- optional: boolean;
21843
- }
21844
- /**
21845
- * One route a router function handles, rebuilt from the conditions that guard
21846
- * the branch serving it — the branch's own AND every enclosing one on the path
21847
- * taken, because routers nest: an outer check on the first segment, an inner
21848
- * one on the rest. Reading only the innermost guard would turn every route
21849
- * into `/*` followed by whatever the inner branch happened to check.
21850
- *
21851
- * A segment is the literal the code compares it to, or `*` where nothing
21852
- * constrains it. A leading `*` is usually the segment the listener's mount
21853
- * already guarantees, which the router never re-checks — so it is left open
21854
- * here and completed by whoever knows the mount.
21855
- *
21856
- * Only one idiom is read: a method comparison together with comparisons on the
21857
- * path's split segments and their count. A router written another way yields
21858
- * nothing, and the reader reports that as unread rather than passing it — a
21859
- * check that cannot see a router must say so rather than stay quiet.
21860
- */
21861
- interface RouteFact {
21862
- /** The HTTP method the branch requires. */
21863
- verb: string;
21864
- /** The path's segments in order: the literal compared against, or `*` where nothing constrains it. */
21865
- segments: string[];
21866
- /**
21867
- * Whether the branch pins the number of segments. When it does not, the path
21868
- * may continue past the last one read, so the route covers any longer path
21869
- * with the same leading segments.
21870
- */
21871
- exactLength: boolean;
21872
- }
21873
- /** How a type shape's members were read: listed by the shape itself, or followed one hop from an alias to the value its shape comes from. */
21874
- type ShapeOrigin = 'declared' | 'derived';
21875
- /**
21876
- * The members of one named shape a file declares — what a data type IS, read
21877
- * off the code so a type spec's claim about it can be checked.
21878
- *
21879
- * Two origins answer, and the difference is recorded rather than smoothed
21880
- * away. A DECLARED shape lists its own members, so the file is the whole
21881
- * answer. A DERIVED one names a VALUE instead — an alias resolved one hop to
21882
- * the object literal its schema is built from, where the keys are the members
21883
- * — so the answer is as good as that hop and no better, and a hop that lands
21884
- * on nothing readable records no shape at all. Silence, not a guess: a wrong
21885
- * member list is worse than none, because nothing downstream would correct it.
21886
- *
21887
- * Methods are kept apart from fields because a spec models them on a different
21888
- * axis — the one `typeRealization` already judges. Counting a behavioural
21889
- * interface's method signatures as data would accuse every one of them of
21890
- * carrying undeclared state.
21891
- */
21892
- interface TypeShapeFact {
21893
- /** How the members were read. */
21894
- origin: ShapeOrigin;
21895
- /** The data members, each with whether the code lets it be absent. */
21896
- fields: ShapeMemberFact[];
21897
- /** The method-style members, kept on the axis a spec models them on. */
21898
- methods: string[];
21899
- /**
21900
- * True when the shape EXTENDS another, so members it does not list exist
21901
- * but are not in this file to count. Presence and absence are therefore
21902
- * different questions for it: what it shows can be judged, what it omits
21903
- * cannot.
21904
- */
21905
- inherited?: boolean;
21906
- }
21907
- interface SourceFileFacts {
21908
- /** Project-relative resolved source path (many implementations may share it, N:1). */
21909
- path: string;
21910
- status: SourceFileStatus;
21911
- /** Effective language the file was analyzed as. */
21912
- language?: string;
21913
- analysisGrade?: AnalysisGrade;
21914
- /**
21915
- * Declaration-tier anchors: named declarations at any nesting depth,
21916
- * destructuring bindings, object-literal keys, import bindings, and export
21917
- * specifiers (export-* barrels chased through relative specifiers).
21918
- */
21919
- declaredNames: string[];
21920
- /** Weaker anchors: exact string-literal occurrences (tool/route registrations). */
21921
- anchoredNames: string[];
21922
- /** Exported bindings (Level 2 dependency-conformance and UNDECLARED_EXPORT fuel). */
21923
- exportedNames: string[];
21924
- /**
21925
- * Runtime import/require module specifiers (dependency-conformance fuel).
21926
- * Type-only imports and export-from specifiers are excluded — type coupling
21927
- * is allowed by default, and re-exporting is surface republication, not
21928
- * collaboration.
21929
- */
21930
- imports: string[];
21931
- /** Module specifiers of export-from declarations (surface republication). */
21932
- reexports: string[];
21933
- /**
21934
- * What each export-from declaration republishes, name by name: a named one
21935
- * with both sides of its rename (`export { a as b } from 'm'` publishes `b`
21936
- * as m's `a`), a star with `*` on both sides. Runtime re-exports only — a
21937
- * type-only one republishes no function. EXACT grade only: it is what lets a
21938
- * reader follow a republished name to the module that wrote it, and a
21939
- * weaker grade leaves it unset rather than guess.
21940
- */
21941
- reexportBindings?: ReexportBindingFact[];
21942
- /**
21943
- * The forwarding bindings the file publishes with no module specifier of
21944
- * its own (see ExportAliasFact): each runtime `export { local as exported }`
21945
- * specifier, renamed or not, and each identifier-valued property of an
21946
- * exported top-level object literal, under that object's binding name.
21947
- * EXACT grade only. The analyzer carries the local name's body onto the
21948
- * published one when the local name settles on exactly one — a module-scope
21949
- * body of this file with no nested same-named one, or an import binding
21950
- * whose module holds one — and leaves the published name bodiless otherwise.
21951
- */
21952
- exportAliases?: ExportAliasFact[];
21953
- /**
21954
- * The type name each named function-like RETURNS, by function name,
21955
- * recorded only where the code settles it: a return annotation naming a
21956
- * type outright (`Promise<T>` unwrapped), else, unannotated, a body whose
21957
- * ONE return statement constructs a plainly named class. Same-named
21958
- * functions that disagree, a generic, union or literal annotation, and
21959
- * several returns record nothing. EXACT grade only. What a `fn().method()`
21960
- * receiver is followed through.
21961
- */
21962
- returnTypes?: Record<string, string>;
21963
- /**
21964
- * Cyclomatic complexity per named function-like (function/method/accessor
21965
- * declarations, and function/arrow initializers of named slots). EXACT grade
21966
- * only — lower grades omit the map rather than guess. Same-named functions
21967
- * in one file record their maximum. Fuel for the detail-sufficiency lint.
21968
- */
21969
- functionComplexity?: Record<string, number>;
21970
- /**
21971
- * Direct call sites per named function-like: every call written inside the
21972
- * function body, with its shape (see CallSiteFact) — nested NAMED functions
21973
- * excluded (they carry their own entries), anonymous callbacks included.
21974
- * EXACT grade only. Same-named functions union their sites.
21975
- *
21976
- * A function-like WITH A BODY always gets an entry, empty when it calls
21977
- * nothing; a name with NO entry has no body in this file to read — a bare
21978
- * declaration, an overload signature, an ambient declaration, an interface
21979
- * member, a plain value binding or an imported name. That difference is the
21980
- * whole of hasFunctionBody, which is why an empty entry is never dropped.
21981
- *
21982
- * Fuel for the call-step realization checks (Level 3).
21983
- */
21984
- functionCallSites?: Record<string, CallSiteFact[]>;
21985
- /**
21986
- * The same call sites, BODY by body, under each function-like's name: one
21987
- * entry per body, carrying WHERE that body is bound (see FunctionBodyFact).
21988
- * EXACT grade only. Where functionCallSites unions every same-named body,
21989
- * this keeps them apart, so an exported facade `save` and the class member
21990
- * `Workspace.save` it forwards to are read as the two functions they are.
21991
- * Which body a NAME means is bodySitesOf's question, and it answers only
21992
- * where the code itself settles it.
21993
- */
21994
- functionBodies?: Record<string, FunctionBodyFact[]>;
21995
- /**
21996
- * Runtime (value) import bindings by local name (see ImportBindingFact).
21997
- * EXACT grade only — a weaker grade sees module specifiers but never which
21998
- * local name they bound.
21999
- */
22000
- importBindings?: Record<string, ImportBindingFact>;
22001
- /**
22002
- * The type names an instance FIELD is DECLARED with, by field name — read
22003
- * off class property declarations and constructor parameter properties,
22004
- * which is where a constructor-injected collaborator says what it is.
22005
- * EXACT grade only.
22006
- *
22007
- * Same-named fields of different classes in one file keep EVERY declared
22008
- * type: the file cannot say which class a call site's `this` was, and a
22009
- * wider answer only ever widens what a call may have reached. A field with
22010
- * no annotation records nothing — what an initializer INFERS is not what
22011
- * the code declares, and a guess is not a fact.
22012
- */
22013
- fieldTypes?: Record<string, string[]>;
22014
- /**
22015
- * The type names a LOCALLY BOUND name is DECLARED with, by name — read off
22016
- * function and method parameters and off variable declarations that carry
22017
- * an annotation, which is where a module that wires its collaborators as
22018
- * closures writes down what each one is. EXACT grade only.
22019
- *
22020
- * Keyed by name across the WHOLE file, as `fieldTypes` is: the facts cannot
22021
- * say which function a call site sits in, and a receiver is as often a
22022
- * parameter of an ENCLOSING function as of the one that calls it — a
22023
- * closure captures it, which is the shape this records at all. Same-named
22024
- * bindings therefore keep EVERY declared type, and a wider answer only ever
22025
- * widens what a call may have reached. A binding the file annotates with
22026
- * nothing records nothing, and so does one annotated with anything but a
22027
- * plain type reference or a member-preserving utility (`Pick`, `Omit`,
22028
- * `Partial`, `Required`, `Readonly`) around one, which names the type it
22029
- * wraps: what an initializer INFERS is not what the code
22030
- * declares, and a guess is not a fact.
22031
- */
22032
- localTypes?: Record<string, string[]>;
22033
- /**
22034
- * The module specifier each TYPE-ONLY import binding came from, by local
22035
- * name. EXACT grade only.
22036
- *
22037
- * The half of the import list `importBindings` deliberately leaves out,
22038
- * because a type binding can never be a call ORIGIN — and exactly what a
22039
- * declared field type is resolved through, which is why it is kept apart
22040
- * rather than folded in.
22041
- */
22042
- typeOnlyBindings?: Record<string, string>;
22043
- /**
22044
- * The type names each PROPERTY of a named shape the file declares is
22045
- * DECLARED with, keyed `<shape>.<property>` — an interface's or a type
22046
- * literal alias's property signatures, and a class's property declarations
22047
- * and constructor parameter properties. EXACT grade only.
22048
- *
22049
- * What a receiver CHAIN (`CallSiteFact.receiverPath`) is followed through:
22050
- * a bag of collaborators handed to a constructor names each one's type
22051
- * exactly here. Read the way `fieldTypes` is, and a property annotated with
22052
- * anything else records nothing.
22053
- */
22054
- memberTypes?: Record<string, string[]>;
22055
- /**
22056
- * The ONE type each type alias NAMES outright, by alias name —
22057
- * `type Contract = Pick<HabitRepository, 'find'>` names HabitRepository,
22058
- * `type Store = SpecStore` names SpecStore. EXACT grade only. Read the way
22059
- * `fieldTypes` is, so a union, an intersection, a literal or any other
22060
- * generic names nothing. The one hop a declared type is followed through
22061
- * when it is an alias of this file.
22062
- */
22063
- aliasTargets?: Record<string, string>;
22064
- /**
22065
- * The interface names each named class's `implements` clause writes, by
22066
- * class name; exact grade only. What lets a receiver whose declared type is
22067
- * an interface written in a shared contracts file be followed to the class
22068
- * that implements it, wherever that class lives — a possible origin, never
22069
- * a proven one, like every declared type.
22070
- */
22071
- implementsClauses?: Record<string, string[]>;
22072
- /**
22073
- * The members of each named shape the file declares, by declaration name
22074
- * (see TypeShapeFact). EXACT grade only — below it a member list cannot be
22075
- * told from a mention, and a guess about somebody's data model is worse
22076
- * than silence.
22077
- *
22078
- * What lets a type spec's `fields` be CHECKED rather than read as truth by
22079
- * the ERD, the briefs and every implementer. A wrong method signature
22080
- * eventually breaks at a call site; a type spec that lies about its data is
22081
- * only ever read by humans and agents, so nothing corrects it until
22082
- * somebody measures it against the code.
22083
- */
22084
- typeShapes?: Record<string, TypeShapeFact>;
22085
- /**
22086
- * The parameter lists of each named function-like in the file, by name (see
22087
- * ParameterFact) — what lets a contract's declared `params` be checked
22088
- * against the signature that realizes them, the last of the three
22089
- * code-to-spec readings nothing had ever made. EXACT grade only: below it a
22090
- * parameter list cannot be told from a call.
22091
- *
22092
- * EVERY body under a name is kept, not the first: a file routinely holds a
22093
- * class member and the module-level facade that forwards to it under one
22094
- * name, with different parameters, and picking one silently drops the
22095
- * other's leading argument from view. Same-named bodies therefore keep every
22096
- * candidate, exactly as the field-type facts do, and a reader accuses only
22097
- * what all of them agree on.
22098
- *
22099
- * Overloads record the IMPLEMENTATION signature, the one with a body,
22100
- * because that is the one a caller actually reaches — and a name with no
22101
- * entry at all has no signature here to read, which is the silence a
22102
- * forwarding file owes: that the body is not here is already
22103
- * `methodRealization`'s finding.
22104
- */
22105
- functionParams?: Record<string, ParameterFact[][]>;
22106
- /**
22107
- * The routes each named function-like in the file handles, by name (see
22108
- * RouteFact) — what lets a listener's mount be read against the contract
22109
- * endpoints of the portal it serves, so a route the router answers that no
22110
- * contract declares cannot go unnoticed again. EXACT grade only: reading a
22111
- * guard as a route needs the conditions as expressions, not as text.
22112
- *
22113
- * A function with no recognisable route records NO entry rather than an
22114
- * empty one — an empty guess would read as "a router with no routes", and
22115
- * the reader needs to tell a router it could not read from one it read.
22116
- * Same-named bodies union their routes; nested NAMED functions carry their
22117
- * own entries, while anonymous callbacks count into the enclosing one.
22118
- */
22119
- functionRoutes?: Record<string, RouteFact[]>;
22120
- /**
22121
- * The named function-likes in the file that complete LATER — declared
22122
- * `async`, or annotated to return a Promise — listed once per such BODY, in
22123
- * the order the bodies are met, exactly as `functionParams` keeps one
22124
- * signature per body. A name with several bodies (a class member and the
22125
- * module-level facade forwarding to it) is therefore judged on what they ALL
22126
- * say: as many entries as signatures is every body, none is no body. What
22127
- * ASYNC_MISMATCH compares a contract method's `async` returns with. EXACT
22128
- * grade only: below it a body cannot be told from a call.
22129
- */
22130
- asyncFunctions?: string[];
22131
- /**
22132
- * The values of each ENUM-LIKE declaration in the file, by declaration name,
22133
- * in declared order: a string-literal union alias (`type E = 'a' | 'b'`),
22134
- * the string array a `z.enum([...])` constant holds — an alias
22135
- * `z.infer<typeof X>` followed one hop, as a derived shape is — or a string
22136
- * enum's member values. What UNREALIZED_ENUM_VALUE and UNDECLARED_ENUM_VALUE
22137
- * read. EXACT grade only; a union mixing in anything but string literals is
22138
- * not enum-like and is left out.
22139
- */
22140
- enumValues?: Record<string, string[]>;
22141
- /**
22142
- * The right side of each TYPE ALIAS the file declares, as written, by alias
22143
- * name — every alias whose right side is not an object shape
22144
- * (`type PackPath = string`). What a named scalar's holds is compared with
22145
- * through the file's dialect (TYPE_HOLDS_MISMATCH). EXACT grade only.
22146
- */
22147
- aliasTypes?: Record<string, string>;
22148
- /**
22149
- * Module-scope mutable bindings (`let`/`var` at the top level of the file).
22150
- * EXACT grade only. The static approximation of held state a logic
22151
- * component may be hiding — fuel for the HIDDEN_STATE lint. (Mutation of
22152
- * const-bound containers is invisible to this collection; the lint says so.)
22153
- */
22154
- topLevelMutableBindings?: string[];
22155
- /**
22156
- * True when the file declared nothing of its own and only re-exported —
22157
- * a pure re-export barrel, which has no code to claim. Measured BEFORE the
22158
- * barrel chase folds the republished names into `declaredNames`, since
22159
- * after it a barrel is indistinguishable from the files it publishes.
22160
- * EXACT grade only: a weaker grade cannot tell a barrel from a file it
22161
- * failed to parse, so it leaves this unset rather than guess.
22162
- */
22163
- reexportOnly?: boolean;
22164
- /**
22165
- * Every call expression of the file as the TypeScript type checker resolved
22166
- * it (see ResolvedCallFact), in source order. EXACT grade only, and only
22167
- * where a compiler with a type checker was loaded. What the Portal
22168
- * write-shortcut twin and the unnarrated-write check read first: the
22169
- * checker follows every spelling of a receiver to the declaration, where
22170
- * the shape facts follow the spellings they know.
22171
- */
22172
- resolvedCalls?: ResolvedCallFact[];
22117
+ interface ExternalRemoval {
22118
+ alias: string;
22119
+ /** Whether this call took the declaration out of `.wai/project.yaml` (false on a refusal, a dry run, and an orphaned pin). */
22120
+ removed: boolean;
22121
+ /** Whether this call removed the alias's lock entry and pinned snapshot (false on a refusal and a dry run). */
22122
+ unpinned: boolean;
22123
+ /** Present, true, on a dry run: nothing was written, and `wouldRemove` says what the real run removes. */
22124
+ dryRun?: boolean;
22125
+ /** On a dry run: what the real run would take out — the declaration, the pin, or both. */
22126
+ wouldRemove?: ExternalRemovalPlan;
22127
+ /** Why nothing was removed: the alias is neither declared nor pinned. */
22128
+ refusal?: string;
22173
22129
  }
22174
22130
  /**
22175
- * One place a call the type checker resolved can land in THIS project's code:
22176
- * the file holding the declaration (or an implementor of it), the class,
22177
- * interface or shape it is a member of, and the member's name. A declaration
22178
- * in a dependency's typings or the language's own library is no target — it
22179
- * is nobody's component.
22131
+ * external_use_request — what `wairon externals use` and sdd_update_external
22132
+ * ask for: names to add to and remove from one declared external's `use`.
22180
22133
  */
22181
- interface CallTargetFact {
22182
- /** Canonical project-relative path of the file holding the declaration or implementor. */
22183
- path: string;
22184
- /** The class, interface or named shape the member belongs to; absent for a module-level function. */
22185
- container?: string;
22186
- /** The declared name of the method or function the call reaches. */
22187
- member: string;
22188
- /**
22189
- * `declaration` when the checker named this declaration itself;
22190
- * `implementor` when the declaration sits in an interface or type shape and
22191
- * this is a class of the project that realizes it.
22192
- */
22193
- via: 'declaration' | 'implementor';
22134
+ interface ExternalUseRequest {
22135
+ alias: string;
22136
+ /** Public names to import bare (`*` for all). */
22137
+ add?: string[];
22138
+ /** Names to stop importing. */
22139
+ remove?: string[];
22140
+ /** Answer what the `use` would become, writing nothing. */
22141
+ dryRun?: boolean;
22194
22142
  }
22195
22143
  /**
22196
- * One call expression of a file as the TypeScript type checker resolved it:
22197
- * what was invoked, how it was written, which body it sits in, and every
22198
- * place in this project it can land. Where CallSiteFact records the SHAPE a
22199
- * pure model can follow, this records the checker's answer — so a receiver
22200
- * reached through an alias, a field chain, an element access, a destructured
22201
- * method, a factory's result, a barrel or a port interface lands where the
22202
- * checker says it lands, whatever its spelling.
22144
+ * external_use_change — the answer to changing one external's `use`: the
22145
+ * list after the change, what was added and removed, or the refusal.
22203
22146
  */
22204
- interface ResolvedCallFact {
22205
- /** The invoked name: the declared member a target names, else the name as written. */
22206
- name: string;
22207
- /** The callee as written, whitespace-collapsed and shortened — what a finding quotes. */
22208
- written: string;
22209
- /** The innermost named function-like the call sits in; absent at module scope. */
22210
- enclosing?: string;
22211
- /** The top-level class or object literal whose member that function-like is, when it is one. */
22212
- enclosingContainer?: string;
22213
- /** Every place in this project's own code the call can land; empty for a call into a dependency or the language library. */
22214
- targets: CallTargetFact[];
22147
+ interface ExternalUseChange {
22148
+ alias: string;
22149
+ /** Whether `.wai/project.yaml` now carries the changed `use` (false on a refusal, a dry run and when nothing changed). */
22150
+ written: boolean;
22151
+ /** The `use` list after the change, in order. */
22152
+ use: string[];
22153
+ /** The names this change imports that were not imported before. */
22154
+ added: string[];
22155
+ /** The names this change stops importing. */
22156
+ removed: string[];
22157
+ /** Why nothing was written, in one sentence. */
22158
+ refusal?: string;
22159
+ }
22160
+ /** The verdict on one used member of a pinned external. */
22161
+ type ExternalUseState = 'unchanged' | 'changed' | 'removed' | 'unlocked' | 'unavailable' | 'renamed';
22162
+ /** external_use_status — the verdict on one used member of one pinned external. */
22163
+ interface ExternalUseStatus {
22164
+ publicName?: string;
22165
+ member?: string;
22166
+ state: ExternalUseState;
22167
+ /** EXTERNAL_CHECK_UNAVAILABLE on an unavailable entry — never a pass. */
22168
+ code?: string;
22169
+ detail?: string;
22215
22170
  /**
22216
- * True when the checker resolved the callee to no declaration at all
22217
- * because its receiver (or the callee itself) is typed any, unknown or not
22218
- * at all — neither a landing nor its absence means anything.
22171
+ * On a renamed use: the public name (and member, as `name.member`) the live
22172
+ * producer's rename trace carries the used name forward to — what the
22173
+ * consumer's references should now name.
22219
22174
  */
22220
- unresolved?: boolean;
22175
+ renamedTo?: string;
22221
22176
  }
22222
- interface CodeModel {
22223
- /** One facts entry per distinct resolved sourcePath (missing/escaped/unreadable included). */
22224
- files: SourceFileFacts[];
22225
- /** The root every sourcePath was resolved and containment-checked against. */
22226
- projectRoot: string;
22177
+ /** external_status — the status of one declared external. */
22178
+ interface ExternalStatus {
22179
+ alias: string;
22180
+ project: string;
22181
+ sourceKind: ExternalSourceKind;
22182
+ pinned: boolean;
22183
+ reachable: boolean;
22184
+ stale: boolean;
22185
+ drifted?: boolean;
22186
+ uses: ExternalUseStatus[];
22187
+ detail?: string;
22227
22188
  /**
22228
- * Every source file the declared source-root walk found, as canonical keys
22229
- * in walk order — the domain the unclaimed-source rule judges. Empty when
22230
- * the project declares no source roots, which is what keeps that rule
22231
- * opt-in. Facts for these files live in `files`, like any other path.
22189
+ * True when the producer's root lies outside the request's reach and was
22190
+ * therefore not read: a family run that narrowed the reach to its selection
22191
+ * counts it in its hint rather than as a comparison that failed.
22232
22192
  */
22233
- rootFiles: string[];
22193
+ outOfReach?: boolean;
22194
+ /** The content digest the lock recorded for this producer; provenance only, never compared here. */
22195
+ pinnedDigest?: string;
22196
+ /** The producer's commit as the lock recorded it (another repository only); provenance only. */
22197
+ pinnedCommit?: string;
22234
22198
  /**
22235
- * The package specifiers that name a package of THIS repository, each
22236
- * mapped to the canonical source file it resolves to: the root package and
22237
- * every workspace package the root package.json declares (never
22238
- * node_modules), `name` for the main entry and `name/sub` for each plain
22239
- * subpath export, build entries mapped back to their source through the
22240
- * package's tsconfig outDir/rootDir. What lets a package import resolve like
22241
- * a relative one; a third-party specifier is in no entry and resolves to
22242
- * nothing. Absent or empty when the repository declares no packages.
22199
+ * The carried facts the pinned snapshot no longer matches in the live
22200
+ * producer (an abi, a transport, a role, the targetLanguage, a rename
22201
+ * trace): the snapshot is stale and a re-pin refreshes it. Absent when the
22202
+ * producer was not read or nothing carried moved.
22243
22203
  */
22244
- packages?: Record<string, string>;
22204
+ staleFacts?: string[];
22245
22205
  }
22206
+ /** ok | drifted | incompatible | unavailable — a relation's health in one word. */
22207
+ type RelationHealth = 'ok' | 'drifted' | 'incompatible' | 'unavailable';
22246
22208
  /**
22247
- * code_model.pathKey — the canonical key form of a source path in the model:
22248
- * forward slashes, no leading `./`. Every facts entry is stored under it, and
22249
- * every lookup or path comparison uses it.
22209
+ * external_status.health — the relation's health in one word, the same on the
22210
+ * canvas's edges and on the hosted Relations tab. A known break outranks the
22211
+ * unknown, and the unknown outranks a benign change, so nothing that could not
22212
+ * be checked ever reads as ok. Pure: over the status's own fields.
22250
22213
  */
22251
- declare function pathKey(sourcePath: string): string;
22214
+ declare function relationHealth(status: ExternalStatus): RelationHealth;
22252
22215
  /**
22253
- * code_model.factsFor — the facts entry for a source path, looked up by its
22254
- * canonical key; undefined when the run analyzed no such path. The model holds
22255
- * one entry per key; were it to hold two, the later one answers, as it does in
22256
- * the keyed indexes the rules build over the same files.
22216
+ * project_relations — one project of a family with its externals status, read
22217
+ * at its own root: what the canvas colours its consumption edges from.
22257
22218
  */
22258
- declare function factsFor(model: CodeModel, sourcePath: string): SourceFileFacts | undefined;
22219
+ interface ProjectRelations {
22220
+ /** The consuming project's key in the bound family ('' for the bound root). */
22221
+ project: string;
22222
+ /** Its externals status, per use — and one per contained project member it references. */
22223
+ externals: ExternalStatus[];
22224
+ /** ISO-8601 time the statuses were read. */
22225
+ comparedAt: string;
22226
+ /** Why the project's statuses could not be read at all; then externals is empty. */
22227
+ detail?: string;
22228
+ }
22229
+ /** external_listing — one row of `wairon externals list`. */
22230
+ interface ExternalListing {
22231
+ alias: string;
22232
+ project: string;
22233
+ sourceKind: ExternalSourceKind;
22234
+ relation?: ExternalRelation;
22235
+ directory?: string;
22236
+ audience: string;
22237
+ lock?: ExternalLockEntry;
22238
+ problem?: string;
22239
+ }
22240
+ /** One rendered per-portal OpenAPI document (see the codec's toOpenApiSet). */
22241
+ declare const NamedOpenApiSpecSchema: z.ZodObject<{
22242
+ portalId: z.ZodString;
22243
+ name: z.ZodString;
22244
+ document: z.ZodString;
22245
+ }, "strip", z.ZodTypeAny, {
22246
+ name: string;
22247
+ document: string;
22248
+ portalId: string;
22249
+ }, {
22250
+ name: string;
22251
+ document: string;
22252
+ portalId: string;
22253
+ }>;
22254
+ type NamedOpenApiSpec = z.infer<typeof NamedOpenApiSpecSchema>;
22255
+ declare const GroupSpecSchema: z.ZodObject<{
22256
+ kind: z.ZodLiteral<"group">;
22257
+ id: z.ZodString;
22258
+ name: z.ZodString;
22259
+ description: z.ZodOptional<z.ZodString>;
22260
+ createdAt: z.ZodString;
22261
+ updatedAt: z.ZodString;
22262
+ }, "strip", z.ZodTypeAny, {
22263
+ id: string;
22264
+ name: string;
22265
+ kind: "group";
22266
+ createdAt: string;
22267
+ updatedAt: string;
22268
+ description?: string | undefined;
22269
+ }, {
22270
+ id: string;
22271
+ name: string;
22272
+ kind: "group";
22273
+ createdAt: string;
22274
+ updatedAt: string;
22275
+ description?: string | undefined;
22276
+ }>;
22277
+ type GroupSpec = z.infer<typeof GroupSpecSchema>;
22278
+
22279
+ /** identifier — one identifier as written: a spec id, a project id, an alias, or a method, parameter or field name. */
22280
+ type Identifier = string;
22281
+ /** display_name — a spec's human-readable `name`: free text, never blank, no invisible character. */
22282
+ type DisplayName = string;
22283
+ /** identifier_kind — what an identifier names, which decides the grammar it is judged by. */
22284
+ type IdentifierKind = 'spec-id' | 'project-id' | 'alias' | 'method' | 'param' | 'field';
22259
22285
  /**
22260
- * source_file_facts.importBindingOf — the runtime import binding a file makes
22261
- * under a local name, or undefined when the name is not an import of this
22262
- * file (it is local, global, or bound type-only).
22286
+ * The longest identifier of any kind. A spec id is a folder and a file name
22287
+ * under `.wai/specs/`, and git for Windows refuses paths over 260 characters
22288
+ * by default; 64 keeps two nested ids plus a file name near 150. The same cap
22289
+ * holds for every kind (a DNS label stops at 63, a Postgres identifier at 63).
22263
22290
  */
22264
- declare function importBindingOf(facts: SourceFileFacts, name: string): ImportBindingFact | undefined;
22291
+ declare const MAX_IDENTIFIER_LENGTH = 64;
22292
+ /** The invisible characters (a control character — C0, DEL, C1 — a soft hyphen, a zero-width or bidi-control character, or a BOM) as a regular-expression character-class body (for a schema's negated class). */
22293
+ declare const INVISIBLE_CHARACTERS = "\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u180e\\u200b-\\u200f\\u2028-\\u202e\\u2060-\\u206f\\ufeff";
22265
22294
  /**
22266
- * source_file_facts.fieldTypesOf — the type names an instance field is
22267
- * DECLARED with, or EMPTY when the file declares no such field, annotates it
22268
- * with nothing, or was analyzed below exact grade. The empty answer is what
22269
- * keeps an unresolvable field from becoming a guess.
22295
+ * identifier.problemAs — why `text` is no identifier of this kind, as one
22296
+ * sentence a refusal can carry (it starts with the quoted text), or null when
22297
+ * it is one. Pure.
22270
22298
  */
22271
- declare function fieldTypesOf(facts: SourceFileFacts, field: string): string[];
22299
+ declare function identifierProblem(text: string, kind: IdentifierKind): string | null;
22272
22300
  /**
22273
- * source_file_facts.localTypesOf — the type names a locally bound name is
22274
- * DECLARED with, or EMPTY when the file binds no such name, annotates it with
22275
- * nothing, or was analyzed below exact grade. The empty answer is what keeps
22276
- * an unannotated receiver from becoming a guess, exactly as it does for a
22277
- * field.
22301
+ * display_name.problem — why `text` is no display name: empty or blank, or
22302
+ * holding an invisible character. Null when it is one. Pure.
22278
22303
  */
22279
- declare function localTypesOf(facts: SourceFileFacts, name: string): string[];
22304
+ declare function displayNameProblem(text: string): string | null;
22280
22305
  /**
22281
- * source_file_facts.memberTypesOf — the type names a property of a named
22282
- * shape this file declares is DECLARED with, or EMPTY when the file declares
22283
- * no such shape or property, annotates it with nothing, or was analyzed below
22284
- * exact grade. The empty answer keeps an unresolvable link of a receiver
22285
- * chain from becoming a guess.
22306
+ * identifier.reservedIn — why the target language cannot use `text` as this
22307
+ * kind of identifier, naming the language and offering an alternative that
22308
+ * fits the casing; null when it can, when the kind is not a member name, or
22309
+ * when the language has no table. Pure.
22286
22310
  */
22287
- declare function memberTypesOf(facts: SourceFileFacts, shape: string, property: string): string[];
22311
+ declare function reservedWordProblem(text: string, kind: IdentifierKind, targetLanguage?: string, casing?: string): string | null;
22312
+
22288
22313
  /**
22289
- * source_file_facts.aliasTargetOf — the type a type alias this file declares
22290
- * names outright, or undefined when the name is no such alias or its right
22291
- * side names no single type.
22314
+ * technology.packages — the package names the code twin of the leakage rule
22315
+ * (TECH_LEAKAGE_IN_CODE) compares an import's package name with.
22316
+ *
22317
+ * A design names a technology the way people say it (`postgres`), while the
22318
+ * code imports its driver (`pg`). Comparing only the declared tokens left the
22319
+ * code fence inert on an ordinary design, so this module carries a CURATED,
22320
+ * DOCUMENTED table of the common packages each technology is known by, keyed by
22321
+ * the technology's usual spellings. It is deliberately short: a package belongs
22322
+ * here only when importing it can mean nothing BUT that technology. An HTTP
22323
+ * client (fetch, axios, got, undici) is never a technology — it is how an
22324
+ * Adapter reaches anything — so no entry names one.
22325
+ *
22326
+ * Extending it takes no code change: a technology written `{ name, matches }`
22327
+ * adds its own tokens, and a loaded pack contributes packages per technology
22328
+ * name (an extension pack's `technologyPackages`).
22292
22329
  */
22293
- declare function aliasTargetOf(facts: SourceFileFacts, name: string): string | undefined;
22330
+
22331
+ /** The common packages of one technology. */
22332
+ interface TechnologyPackageEntry {
22333
+ /** The names a design writes the technology under, lower-case. */
22334
+ names: readonly string[];
22335
+ /** The packages importing which means that technology. */
22336
+ packages: readonly string[];
22337
+ }
22294
22338
  /**
22295
- * source_file_facts.typeBindingOf — the module specifier a NAME was imported
22296
- * from, whether the import was type-only or a runtime one, since a declared
22297
- * type may be spelled either way. Undefined when the file imports no such
22298
- * name, which leaves the name local, global or ambient.
22339
+ * The built-in table. Documented in docs/cli.md ("Technologies and their
22340
+ * packages"); keep the two in step.
22299
22341
  */
22300
- declare function typeBindingOf(facts: SourceFileFacts, name: string): string | undefined;
22342
+ declare const TECHNOLOGY_PACKAGES: readonly TechnologyPackageEntry[];
22301
22343
  /**
22302
- * source_file_facts.callSitesOf — the call sites written inside one named
22303
- * function-like, or undefined when the file holds no BODY under that name.
22304
- * The two answers are different findings and must never be collapsed: an
22305
- * empty array is a body that calls nothing, undefined is nothing to read.
22344
+ * technology.packages — the entry's tokens, then the built-in table's packages
22345
+ * for its name, then the packages `contributed` lists under its name (what
22346
+ * loaded packs contribute, keyed by technology name), lower-cased and
22347
+ * de-duplicated in that order. Pure: the contributions are handed in.
22306
22348
  */
22307
- declare function callSitesOf(facts: SourceFileFacts, fn: string): CallSiteFact[] | undefined;
22308
- /** The bodies one name resolved to, and an identity a walk can de-duplicate on. */
22309
- interface ResolvedBody {
22310
- /** `<container>.<name>` for a member, `<name>` for the module binding, `*<name>` for the union. */
22311
- key: string;
22312
- sites: CallSiteFact[];
22349
+ declare function technologyPackages(tech: Technology, contributed?: Readonly<Record<string, readonly string[]>>): string[];
22350
+
22351
+ /**
22352
+ * The type identifiers a type string names, with comments, trailing prose and
22353
+ * string literals stripped. Duplicates are kept, in order of appearance.
22354
+ */
22355
+ declare function extractTypeIdentifiers(typeStr: string): string[];
22356
+ /**
22357
+ * The method shape the type references are read from: a contract method or a
22358
+ * type method (whose params feed its references exactly as a contract
22359
+ * method's do). The text and returns may be absent while a method is still in
22360
+ * its stored form — a sourced method states neither, and a params-bearing one
22361
+ * need not store its text — and an absent one names nothing.
22362
+ */
22363
+ interface MethodLike {
22364
+ signature?: string;
22365
+ returns?: string;
22366
+ params?: {
22367
+ name: string;
22368
+ type: string;
22369
+ }[];
22313
22370
  }
22314
22371
  /**
22315
- * source_file_facts.bodySitesOf — the call sites of the ONE body a name
22316
- * means, told apart from its same-named neighbours by where each is bound;
22317
- * undefined when the file holds no body under the name.
22318
- *
22319
- * `container` and `member` are what the reference says about its owner:
22320
- * `container` is an anchor's `exportedVia` handle or a call's plain-identifier
22321
- * receiver, and `member` says the reference was written through a receiver at
22322
- * all. Only the code
22323
- * settles which body a name means, and where it does not this answers what
22324
- * the name-keyed union always answered — never a guess:
22325
- *
22326
- * - with a container the file binds bodies of this name under, those bodies;
22327
- * - else a BARE reference (an anchor's symbol, a bare call) means the
22328
- * module-scope bodies, when the name has some and NO nested one: a bare
22329
- * name in the module's scope binds the top-level declaration, a member is
22330
- * reachable only through its container, and a nested body could shadow
22331
- * the name where it sits;
22332
- * - else every body under the name, unioned, as callSitesOf answers — a
22333
- * receiver the file binds no container to holds a value the model cannot
22334
- * follow, so which body it reaches is not this model's to say.
22372
+ * method_signature.typeRefs — the named types a method references. Structured
22373
+ * `params` are authoritative when present (no prose parsing): the named
22374
+ * references of every param type and of the returns, each parsed under the
22375
+ * grammar. Otherwise the prose signature and the returns are tokenized
22376
+ * leniently, as the unstructured form always was.
22335
22377
  */
22336
- declare function bodySitesOf(facts: SourceFileFacts, fn: string, container?: string, member?: boolean): ResolvedBody | undefined;
22378
+ declare function methodTypeRefs(m: MethodLike): string[];
22337
22379
  /**
22338
- * source_file_facts.hasFunctionBody — whether the file holds a function-like
22339
- * BODY under a name, as the model measured it: a function, method or accessor
22340
- * declaration, or a function/arrow initializer bound to a named slot. A name
22341
- * the file declares WITHOUT one — an overload signature, an ambient
22342
- * declaration, an interface or type member, a plain value binding, an import
22343
- * binding, a re-export specifier — answers false, because there is no body
22344
- * there to read.
22380
+ * type_spec.signatureTypeRefs — the named types a signature type references:
22381
+ * every param type, then its returns, each parsed under the grammar — the
22382
+ * references a signature carries in place of fields. None for any other kind,
22383
+ * whose references are its fields'.
22384
+ */
22385
+ declare function signatureTypeRefs(type: Pick<TypeSpec, 'kind' | 'params' | 'returns'>): string[];
22386
+ /**
22387
+ * method_signature.genericParameters — the generic parameters declared before
22388
+ * the parameter list of the method's prose signature (find<T>(id: string)
22389
+ * gives T).
22390
+ */
22391
+ declare function methodGenericParameters(method: {
22392
+ signature?: string;
22393
+ }): Set<string>;
22394
+ /**
22395
+ * reference_resolution.nameKey — the one key a bare name is compared by,
22396
+ * locally and through imports alike: lower-cased, every character outside
22397
+ * [a-z0-9] removed, so `SharedError`, `shared-error` and `shared_error` are
22398
+ * one name. It is normalizePart, the per-segment normalization
22399
+ * type_spec.matchesRef already applies.
22400
+ */
22401
+ declare function nameKey(name: string): string;
22402
+ /**
22403
+ * Whether a written type reference names a type id: the reference's `::` or
22404
+ * `.` segments are a suffix of the id's, compared ignoring case and
22405
+ * punctuation.
22406
+ */
22407
+ declare function matchTypeRef(ref: string, typeId: string): boolean;
22408
+ /**
22409
+ * type_spec.qualifiedId — the type's id qualified by its owning subsystem, when
22410
+ * the id is not already qualified.
22411
+ */
22412
+ declare function qualifiedTypeId(type: Pick<TypeSpec, 'id' | 'subsystem'>): string;
22413
+ /**
22414
+ * type_spec.matchesRef — whether a written type reference names this type: the
22415
+ * reference's `::` or `.` segments are a suffix of the qualified id, compared
22416
+ * ignoring case and punctuation.
22417
+ */
22418
+ declare function typeMatchesRef(type: Pick<TypeSpec, 'id' | 'subsystem'>, ref: string): boolean;
22419
+ /** type_spec.genericParameters — the generic parameters declared in the type's name (Page<T> gives T). */
22420
+ declare function typeGenericParameters(type: Pick<TypeSpec, 'name'>): Set<string>;
22421
+ /**
22422
+ * type_spec.fieldTypeRefs — the named types one of this type's field types
22423
+ * references (type_expression.namedRefs of the field's parsed type), with the
22424
+ * type's own generic parameters left out (compared ignoring case). A field
22425
+ * type that does not parse names nothing: its problem is
22426
+ * TYPE_EXPRESSION_INVALID's to report. It takes the field's type rather than
22427
+ * its name, because nothing makes field names unique within a type.
22428
+ */
22429
+ declare function fieldTypeRefs(type: Pick<TypeSpec, 'name'>, fieldType: string): string[];
22430
+ /** interface_spec.genericParameters — the generic parameters declared in the interface's name. */
22431
+ declare function interfaceGenericParameters(intf: Pick<InterfaceSpec, 'name'>): Set<string>;
22432
+
22433
+ /**
22434
+ * The step graph of one narrative (step_graph): the SINGLE source of truth for
22435
+ * successor semantics (fall-through + jumps; loop and try headers carry both
22436
+ * their body edge and their after-region exit edge; return/throw terminate).
22437
+ * The narrative-reachability check and the antipattern analysis both read
22438
+ * it, so the two never disagree about what "next" means.
22439
+ */
22440
+ interface StepGraph {
22441
+ /** The narrative's step numbers in ascending order. */
22442
+ stepNumbers: number[];
22443
+ /** The step with this number, if there is one. */
22444
+ stepAt(stepNumber: number): NarrativeStep | undefined;
22445
+ /** The next step number in ascending order, ignoring jumps and parallel joins. */
22446
+ nextOf(stepNumber: number): number | undefined;
22447
+ /** The distinct existing step numbers flow can continue at from this step. */
22448
+ successorsOf(stepNumber: number): number[];
22449
+ }
22450
+ /**
22451
+ * method_implementation.stepGraph — the step graph of the method's narrative.
22452
+ * Simple steps fall through; a branch continues at its true and false steps, a
22453
+ * switch at its cases and default; a loop at its body and the step after its
22454
+ * region; a try at its body, catch steps, finally step and the step after its
22455
+ * region; a parallel fans out to its arms, whose last steps continue at the
22456
+ * join; a jump at its target; return and throw end the path.
22457
+ */
22458
+ declare function stepGraph(method: Pick<MethodImplementation, 'narrative'>): StepGraph;
22459
+
22460
+ /** The finding codes a narrative step-configuration problem maps to. */
22461
+ type StepConfigCode = 'DUPLICATE_STEP_LABEL' | 'MALFORMED_FLOW_STEP' | 'INVALID_STEP_JUMP' | 'FOREIGN_STEP_FIELD';
22462
+ /**
22463
+ * One thing wrong with a narrative's step configuration (step_config_problem):
22464
+ * the step it sits on, the finding code it maps to, and the detail a rule
22465
+ * appends to its own "Method X in implementation Y" prefix. Duplicate labels,
22466
+ * missing or misplaced flow config, and jumps that land nowhere are all
22467
+ * reported through this one shape.
22468
+ */
22469
+ interface StepConfigProblem {
22470
+ /** The step the problem sits on; a duplicate label names the earlier step in its detail. */
22471
+ stepNumber: number;
22472
+ /** The finding code this problem maps to. */
22473
+ code: StepConfigCode;
22474
+ /** The problem stated in full, ready to follow a rule's own location prefix. */
22475
+ detail: string;
22476
+ }
22477
+ /**
22478
+ * What a narrative's step configuration says about itself (step_config_verdict):
22479
+ * the problems it carries, in step order, and whether its control flow is
22480
+ * SOUND — no duplicate step number, no missing or misplaced flow config, and
22481
+ * no jump that lands outside the narrative. A duplicate label is a problem but
22482
+ * not an unsoundness: labels name steps, they do not route flow.
22345
22483
  *
22346
- * Only exact grade measures bodies at all, so a file analyzed below it always
22347
- * answers false; a caller that would ACCUSE on the answer must check the grade
22348
- * itself rather than read "no body" into "not measured".
22484
+ * Soundness is the gate every later phase runs behind. Reachability, region
22485
+ * nesting and jump-edge judgement all read the step graph, and a graph built
22486
+ * over jumps that target nothing reports steps as dead that are merely
22487
+ * mis-numbered — wrong findings, not just noisier ones.
22349
22488
  */
22350
- declare function hasFunctionBody(facts: SourceFileFacts, symbol: string): boolean;
22489
+ interface StepConfigVerdict {
22490
+ /** The step-config problems, in step order: labels first, then numbering, then per-step config and jump targets. */
22491
+ problems: StepConfigProblem[];
22492
+ /** True when nothing found makes the control flow unreadable — the precondition for judging structure. */
22493
+ sound: boolean;
22494
+ }
22351
22495
  /**
22352
- * The language a source file is analyzed as, read from its extension; undefined
22353
- * for a file no analyzer reads. The one table the analyzer and the implementer
22354
- * briefs share, so a brief's type mapping is the dialect its code is judged by.
22496
+ * The configuration each narrative step TYPE may carry, beyond what every step
22497
+ * carries. This is the field set a retype rebuilds against, and the field set
22498
+ * a stored step is judged against.
22499
+ *
22500
+ * Changing a step's `type` used to merge the new type's fields over the old
22501
+ * step's and leave the rest standing, so a `branch` that became a `call` kept
22502
+ * its `condition` and `onFalseStep`: a step the schema accepts, a write that
22503
+ * reports success, and a MALFORMED_FLOW_STEP at the next validate, blamed on
22504
+ * the narrative rather than on the edit that made it. The writer no longer
22505
+ * leaves those behind; FOREIGN_STEP_FIELD reports the ones already written.
22355
22506
  */
22356
- declare function languageOfSourcePath(sourcePath: string): string | undefined;
22507
+ declare const STEP_TYPE_FIELDS: Readonly<Record<string, readonly string[]>>;
22357
22508
  /**
22358
- * source_file_facts.dialect — the type dialect shipped for the language this
22359
- * file was analyzed as (type_dialect.forLanguage of its effective language),
22360
- * or null when the file has no language or no dialect reads it yet. What a
22361
- * conformance rule reads this file's type annotations through; a null answer
22362
- * is silence, never a finding.
22509
+ * What a step carries whatever its type — the human's own content. A retype
22510
+ * keeps these: the author is changing HOW the step works, not what it is for,
22511
+ * and re-typing a step should never cost them the sentence they wrote or the
22512
+ * anchor other steps address it by.
22363
22513
  */
22364
- declare function dialectOf(facts: SourceFileFacts): TypeDialect | null;
22514
+ declare const STEP_COMMON_FIELDS: readonly string[];
22515
+ /** The transient `*Label` twin of each jump-by-number field, resolved and dropped at write time. */
22516
+ declare const STEP_LABEL_TWINS: Readonly<Record<string, string>>;
22517
+ /** Every field a step of this type may carry, including the transient label twins. */
22518
+ declare function stepFieldsFor(type: string): Set<string>;
22365
22519
  /**
22366
- * The type name a named function-like returns, where the code settles it
22367
- * (SourceFileFacts.returnTypes); undefined otherwise — the silence a
22368
- * `fn().method()` receiver keeps when the code does not say what fn returns.
22520
+ * narrative_step.foreignFields — the fields this step carries that its own
22521
+ * `type` cannot: everything set on it beyond the common fields and the ones
22522
+ * its type adds. An unknown step type has no table, so nothing is foreign to
22523
+ * it — the schema is what names that.
22369
22524
  */
22370
- declare function returnTypeOf(facts: SourceFileFacts, fn: string): string | undefined;
22525
+ declare function narrativeStepForeignFields(step: NarrativeStep): string[];
22371
22526
  /**
22372
- * source_file_facts.resolveImport — resolve one of a file's import specifiers
22373
- * against a set of known source paths, purely (no I/O). A relative one: join
22374
- * it with the importing file's directory, then try the joined path, `.js`
22375
- * swapped for `.ts` or `.tsx`, the `.ts`, `.tsx` and `.js` extensions, and an
22376
- * index file. A package specifier: the source file `packages` (the code
22377
- * model's local-package map) names for it, when that file is known.
22378
- * Undefined for a package the map does not name — a third-party one — or
22379
- * when nothing matches.
22527
+ * method_implementation.stepConfigVerdict — the step-config problems of this
22528
+ * method's narrative and whether its control flow is sound. The schema keeps
22529
+ * every flow field optional, so this derivation is what holds each step type
22530
+ * to the config it needs, each label to one step, each step number to one
22531
+ * step, and every jump field to a step number the narrative actually has.
22380
22532
  */
22381
- declare function resolveImport(fromFile: string, specifier: string, knownPaths: Set<string>, packages?: Readonly<Record<string, string>>): string | undefined;
22533
+ declare function stepConfigVerdict(method: Pick<MethodImplementation, 'narrative'>): StepConfigVerdict;
22382
22534
 
22383
22535
  /**
22384
22536
  * How a cross-tree reference fared against the stored surface snapshots
@@ -22486,6 +22638,33 @@ interface SurfaceChange {
22486
22638
  /** What changed, said in one line. */
22487
22639
  detail: string;
22488
22640
  }
22641
+ /** One name a rename trace carries forward: the former name and the current one. */
22642
+ interface TracedRename {
22643
+ from: string;
22644
+ to: string;
22645
+ }
22646
+ /**
22647
+ * surface_snapshot.fieldRenames — the fields of one type renamed between an
22648
+ * older and a newer definition of it, per the newer one's rename trace
22649
+ * (`formerly`): a field the older definition had that the newer lacks, which a
22650
+ * newer field's trace names. Pure.
22651
+ */
22652
+ declare function fieldRenames(was: SurfaceTypeDef, now: SurfaceTypeDef): TracedRename[];
22653
+ /** field_rename_reading — the field renames inside a used member's closure, and whether they are its whole change. */
22654
+ interface FieldRenameReading {
22655
+ /** Each rename, read `field "<type>.<old>" renamed to "<new>"`. */
22656
+ renames: string[];
22657
+ /** Whether undoing the renames gives back the pinned member digest exactly. */
22658
+ renameOnly: boolean;
22659
+ }
22660
+ /**
22661
+ * surface_snapshot.fieldRenamesSince — every field rename inside the closure
22662
+ * of one used member between a pinned snapshot and the live one, as
22663
+ * `<type>.<old> → <new>` readings, and whether undoing them leaves the
22664
+ * member's digest exactly as pinned (a rename and nothing else). Empty
22665
+ * when no field of its closure was renamed. Pure.
22666
+ */
22667
+ declare function fieldRenamesSince(pinned: SurfaceSnapshot, live: SurfaceSnapshot, publicName: string, member: string, pinnedDigest: string): FieldRenameReading;
22489
22668
  /**
22490
22669
  * surface_snapshot.changesSince — what one producer's public surface changed
22491
22670
  * from an older snapshot of it to this one: each public name (contract entry
@@ -41954,7 +42133,7 @@ type DesignExport = z.infer<typeof DesignExportSchema>;
41954
42133
 
41955
42134
  declare const DEFAULT_TARGET_DIRS: Record<string, string>;
41956
42135
  declare function defaultTargetConfig(type: 'claude' | 'gemini' | 'agy' | 'cursor' | 'copilot' | 'codex'): BuiltinTargetConfig;
41957
- declare const WAIRON_VERSION = "5.1.1-dev.109";
42136
+ declare const WAIRON_VERSION = "5.1.1-dev.110";
41958
42137
  declare const GITHUB_REPO = "SYW-Apps/Waffle-AIron";
41959
42138
  declare const ARCHITECT_AGENT_ID = "agent-architect";
41960
42139
  declare const ARCHITECT_TEMPLATE_ID = "architect";
@@ -42713,6 +42892,14 @@ declare function exportSpecTree(includeDerived?: boolean, allowPartial?: boolean
42713
42892
  */
42714
42893
  declare function importSpecTree(archive: Uint8Array, options: TreeImportOptions): TreeImportResult;
42715
42894
 
42895
+ /**
42896
+ * Author the ShopFlow example spec tree at the currently-bound project root.
42897
+ * Overwrites the L0 system spec the provisioner wrote with a richer one, then
42898
+ * lays down the three subsystems and their layered component/interface/
42899
+ * implementation/type slices. Invalidates the spec cache at the end.
42900
+ */
42901
+ declare function seedDemoTree(): void;
42902
+
42716
42903
  /** One retired Specialist and the Orchestrator it becomes (specialist_retype). */
42717
42904
  interface SpecialistRetype {
42718
42905
  /** The component id. */
@@ -43481,4 +43668,4 @@ declare function schemaFingerprint(): string;
43481
43668
  */
43482
43669
  declare function loadProjectConfig(): ProjectConfig;
43483
43670
 
43484
- export { AI_PATHS, ARCHITECT_AGENT_ID, ARCHITECT_TEMPLATE_ID, type AgentBrief, AgentBriefSchema, type AgentRecord, AgentRecordSchema, type AgentStatus, AgentStatusSchema, type AgentTemplate, AgentTemplateSchema, type AnalysisGrade, type ApiKeyLocation, ApiKeyLocationSchema, type ApprovalDiff, type ApprovalVerdict, type ApprovedRevision, type ArchProfile, type AuthoredReference, BACKEND_COMMANDS, BUILTIN_PROFILES, type BoundaryItem, BoundaryItemSchema, type BuildContextOptions, type BuiltinTarget, type BuiltinTargetConfig, BuiltinTargetConfigSchema, BuiltinTargetSchema, BundleNotFoundError, type CallSiteFact, type CallTargetFact, type CarriedDebt, type CarriedDebtKind, CarriedDebtKindSchema, CarriedDebtSchema, type CarriedFinding, type CarriedFindingEntry, CarriedFindingSchema, type CatchClause, CatchClauseSchema, ChainingMigrationRefusedError, ClaudeExporter, type ClaudeExporterOptions, type CodeIndex, type CodeModel, type ComplexityRuleConfig, ComplexityRuleConfigSchema, type ComponentPlacement, type ComponentRename, type ComponentSpec, ComponentSpecSchema, type ComponentType, ComponentTypeSchema, type CompositionConfig, CompositionConfigSchema, ConfigValidationError, type ConformanceRuleConfig, ConformanceRuleConfigSchema, type ConformanceTier, ConformanceTierSchema, type CrossProjectReference, CustomExporter, type CustomTarget, type CustomTargetConfig, CustomTargetConfigSchema, CustomTargetSchema, DEFAULT_TARGET_DIRS, DESIGN_APPROVALS, DESIGN_DEPENDENCY_ROLES, DESIGN_FORMAT, DESIGN_FORMAT_VERSION, DESIGN_VIEW_FIELDS, type DatabaseSpec, DatabaseSpecSchema, type DeclarativePack, type DeclaredCall, type DeclaredExternal, type DeclaredInvocation, DeclaredInvocationSchema, type DeclaredMember, type DependencyClass, DependencyClassSchema, type DependencyEdge, type DependencyEdges, type DesignApproval, DesignApprovalSchema, type DesignComponent, DesignComponentSchema, type DesignDependency, type DesignDependencyRole, DesignDependencyRoleSchema, DesignDependencySchema, type DesignDepth, DesignDepthSchema, type DesignExport, type DesignExportEntry, DesignExportEntrySchema, DesignExportSchema, type DesignField, DesignFieldSchema, type DesignImplementation, DesignImplementationSchema, type DesignInterface, DesignInterfaceSchema, type DesignMethod, type DesignMethodBody, DesignMethodBodySchema, DesignMethodSchema, type DesignParam, DesignParamSchema, type DesignProject, DesignProjectSchema, type DesignSource, DesignSourceSchema, type DesignSubsystem, DesignSubsystemSchema, type DesignType, type DesignTypeRef, DesignTypeRefSchema, DesignTypeSchema, type DetectedDomainCandidate, type DiagramConfig, DiagramConfigSchema, type DiagramLineStyle, DiagramLineStyleSchema, type DiagramView, DiagramViewSchema, type DispatchBinding, DispatchBindingSchema, DoctorOptionsError, type DocumentationRuleConfig, DocumentationRuleConfigSchema, type Domain, DomainSchema, type DomainType, DomainTypeSchema, type Durability, DurabilitySchema, EXTERNAL_ALIAS_RE, EXTERNAL_SOURCE_FORMS, type EdgeReach, type Endpoint, EndpointSchema, type EndpointTransport, type EntryScope, EntryScopeSchema, type EnumValue, EnumValueSchema, type EventBinding, EventBindingSchema, type ExportAliasFact, type ExportContext, type ExportKind, type ExportProblem, type ExportProblemKind, type ExportResult, type ExportRole, ExportRoleSchema, type ExportTableLevel, type ExportUsage, type ExportUse, type Exporter, type ExtData, ExtDataSchema, type ExtensionPack, type ExternalAddition, type ExternalBinding, type ExternalConsumer, type ExternalDeclaration, ExternalDeclarationSchema, type ExternalLink, ExternalLinkSchema, type ExternalLinkType, ExternalLinkTypeSchema, type ExternalListing, type ExternalLockEntry, ExternalLockEntrySchema, type ExternalPin, type ExternalPinOutcome, type ExternalRelation, type ExternalRemoval, type ExternalRequest, type ExternalRole, type ExternalSource, type ExternalSourceKind, ExternalSourceSchema, type ExternalStatus, type ExternalUseChange, type ExternalUseRequest, type ExternalUseState, type ExternalUseStatus, type ExternalsLock, ExternalsLockSchema, FULL_COMMIT_RE, type FamilyProblemKind, type FamilySwitches, type FieldRename, type FindingDeclaration, FindingDeclarationSchema, type FindingParts, type ForeignFieldRepair, type ForwardedName, type FunctionBodyFact, GITHUB_REPO, GeminiExporter, type GenerateOptions, type GenerateSummary, type GroupSpec, GroupSpecSchema, type Guarantee, GuaranteeSchema, HOLDABLE_PRIMITIVES, type HostedRecordLookup, type HttpMethod, HttpMethodSchema, type ImplementationSpec, ImplementationSpecSchema, type ImportBindingFact, type ImportGraph, type ImportSection, type InstalledPack, type InterfaceSpec, InterfaceSpecSchema, type InternalizeDestination, type InternalizeResult, type Invariant, InvariantSchema, type InvocationKind, InvocationKindSchema, type IssueSeverity, type LegacySpecFile, type LifecycleEntrypoint, LifecycleEntrypointSchema, type LifecyclePhase, LifecyclePhaseSchema, type LintAllow, LintAllowSchema, type LintConfig, LintConfigSchema, type LoadedExtensions, type LoadedPackSkill, type LockRecord, type LockStatus, type LogLevel, type LoopKind, LoopKindSchema, MAX_SPEC_ID_LENGTH, type MemberAdvance, type MemberCreation, type MemberDeclaration, MemberDeclarationSchema, type MemberKind, type MemberPin, type MemberSource, type MemberStorage, type MethodEffect, MethodEffectSchema, type MethodImplementation, MethodImplementationSchema, type MethodLike, type MethodParam, MethodParamSchema, type MethodRename, type MethodSignature, MethodSignatureSchema, type ModelledCall, type MountForm, type NamedOpenApiSpec, NamedOpenApiSpecSchema, type NamingRuleConfig, NamingRuleConfigSchema, type NarrativeDetail, NarrativeDetailSchema, type NarrativeStep, NarrativeStepSchema, type NarrativeStepType, NarrativeStepTypeSchema, type NetworkBoundary, type NetworkDeclaration, NetworkDeclarationSchema, NetworkOptionsError, type OAuthFlow, OAuthFlowSchema, type OutputTarget, OutputTargetSchema, type OwnershipIndex, PATTERN_TYPES, PRIMITIVE_TYPES, PROJECT_ID_RE, PROJECT_KINDS, PUBLIC_NAME_RE, type PackDiagnosis, type PackEntry, type PackPath, type PackRef, type PackRequirement, PackRequirementSchema, type PackScope, type PackSelection, PackSelectionSchema, type ParallelBranch, ParallelBranchSchema, type ParamRename, type ParameterFact, type ParentExcerpt, ParentExcerptSchema, type ParsedMemberSource, type PartOf, PartOfSchema, type PathsConfig, PathsConfigSchema, type PatternRef, PatternRefSchema, type PinnedExternal, type PinnedParent, type PortalAuth, PortalAuthSchema, type PortalAuthScheme, PortalAuthSchemeSchema, PreviousIdsSchema, PreviousNamesSchema, ProfileSelectionSubjectSchema, type ProjectBinding, type ProjectBindingVia, type ProjectConfig, ProjectConfigSchema, type ProjectFamily, type ProjectFamilyProblem, type ProjectIdOrigin, type ProjectIdSource, type ProjectIdentity, type ProjectIdentityProblem, type ProjectImport, type ProjectNode, ProjectNotInitializedError, type ProjectProfileSelection, ProjectProfileSelectionSchema, type ProjectRelations, type PromoteResult, type PublicInterface, PublicInterfaceSchema, type PublicInterfaceType, PublicInterfaceTypeSchema, RETIRED_INVOCATION_KINDS, RETIRED_PORTAL_TYPE_SPELLINGS, RETIRED_STEREOTYPES, type ReachFinding, type ReachModel, type ReachRewrite, type ReachabilityMigrationPlan, type ReadExternalSource, type ReadableProject, type RealizationIndex, type ReexportBindingFact, type ReferenceBinding, type ReferenceEdit, type ReferenceForm, type ReferenceLanding, type ReferenceResolution, type Registry, RegistrySchema, type RelationHealth, type RenameTraceHolders, type RequirementItem, RequirementItemSchema, type ResolutionOutcome, type ResolvedBody, type ResolvedCallFact, type ResolvedDetail, type ResolvedExport, type ResolvedExportTable, type ResolvedExternal, ResolvedInterfaceSpecSchema, type ResolvedMethod, ResolvedMethodSignatureSchema, ResolvedTypeMethodSchema, ResolvedTypeSpecSchema, type RetiredMount, type RetiredReachFact, type RetiredReachForm, RetiredReachFormSchema, type RetiredReachHolder, type RouteFact, type RuleCode, type RuleContext, type RuleJudgement, type RuleScope, type RulesConfig, RulesConfigSchema, SCAN_EXCLUDE_DIRS, SDD_RULES, SEMANTIC_GUARANTEES, STEP_COMMON_FIELDS, STEP_LABEL_TWINS, STEP_TYPE_FIELDS, SUPPORTED_ALIASES, SURFACE_AUDIENCES, type ScopeFilterOptions, type SddRule, type Severity, type ShapeMemberFact, type ShapeOrigin, type SignatureFacts, type SignatureResolution, type SignatureSourceFact, type SignatureTextRepair, type SourceFileFacts, type SourceFileStatus, type SpecId, type SpecIdKind, SpecIdSchema, type SpecIndex, type SpecScanOptions, type SpecStatus, SpecStatusSchema, type SpecialistRetirement, type SpecialistRetype, type StaleSignatureText, type StateId, type StatusDecor, type StatusOptions, type StatusReport, type StepConfigCode, type StepConfigProblem, type StepConfigVerdict, type StepGraph, type StoredInterfaceSpec, type StoredMethodSignature, StoredMethodSignatureSchema, type StoredTypeMethod, StoredTypeMethodSchema, type StoredTypeSpec, type SubsystemSpec, SubsystemSpecSchema, type SubsystemWriteRule, type SupportedAlias, type SurfaceAudience, SurfaceAudienceSchema, type SurfaceChange, type SurfaceChangeKind, type SurfaceContractEntry, SurfaceContractEntrySchema, type SurfaceOrigin, SurfaceOriginSchema, type SurfaceRefResolution, type SurfaceSnapshot, SurfaceSnapshotSchema, type SurfaceTypeDef, SurfaceTypeDefSchema, type SurfaceTypeExport, SurfaceTypeExportSchema, type SurfaceUnresolvedExport, SurfaceUnresolvedExportSchema, type SwitchCase, SwitchCaseSchema, type SyncResult, type SystemPublicInterface, SystemPublicInterfaceSchema, type SystemSpec, SystemSpecSchema, TECHNOLOGY_PACKAGES, type TargetConfig, TargetConfigSchema, type Technology, TechnologySchema, type Template, TemplateNotFoundError, TemplateSchema, type TopicEnd, type TopologyConfig, TopologyConfigSchema, type Transport, type TransportKind, TransportKindSchema, TransportSchema, type TreeExportResult, type TreeImportOptions, type TreeImportResult, type TrustedLink, TrustedLinkSchema, type TypeCanonicalization, type TypeDialect, type TypeEnumProposal, type TypeExpression, type TypeExpressionProblem, TypeExpressionSchema, type TypeField, TypeFieldSchema, type TypeForm, type TypeKind, TypeKindSchema, type TypeMethod, TypeMethodSchema, type TypeParse, type TypePosition, type TypeProblemCode, type TypeRename, type TypeRespelling, type TypeShapeFact, type TypeSpec, TypeSpecSchema, type TypeSpellingFacts, type TypeSpellingRepair, type TypedSpecKind, USE_ENTRY_RE, type VerbReach, WAIRON_MANAGED_BANNER, WAIRON_MANAGED_MARKER, WAIRON_VERSION, WINDOWS_RESERVED_NAME_RE, type WaiPaths, WaironError, type WriteReach, YamlSyntaxError, activeTargetTypes, addDomain, admits, advanceMember, aiDir, aiDirAt, aiPathsAt, aliasGrammarProblem, aliasTargetOf, ambiguityMessage, approvalKeyIn, approvalRecord, approvalVerdict, approvedRevision, approvedStatuses, asSchemaReads, assertContainedProjectPath, assertProjectInitialized, attachRetiredMounts, backendCommand, backfillChainedSubprojectConfigs, backupBeside, bindDeclaredExternal, bodySitesOf, buildCanvasDataModel, buildProjectGraph, buildRuleContext, builtinProfileIds, builtinProjectKinds, callSitesOf, callersOf, canonicalTypeRef, canonicalTypeText, captureApprovedSpecs, carriedFactChanges, carryRetiredReachForms, checkDeclarativePack, clearLoaderIssues, cognitiveScore, complexityLevel, componentDesignView, componentEntryFor, composeAgentBrief, composeRuleSequence, computeGateStateId, computeOwnDesignStateId as computeOwnDesignId, computeOwnDesignStateIdAsRecorded as computeOwnDesignIdAsRecorded, computeOwnStateId, computeStateId, computeStateIdAt, conceptNoun, consumedContractInputs, consumerReaches, containedPathOf, contentDigest, createAgentRecord, createEmptyRegistry, createEmptyTopologyConfig, createMember, createProjectConfig, currentRootBinding, declareExternal, declareMember, declaredExternals, declaredMembers, declaredPackNames, declaredProfileIds, declares, declaresGlobalPacks, defaultConformanceTier, defaultNarrativeDetail, defaultPackSelections, defaultTargetConfig, deleteSpec, demoteMember, dependencyCycles, deregisterPackRef, deriveExecutionProfile, deriveMethodSignature, deriveTypeSignature, derivedDocPaths, describeProject, detectDomainCandidates, diagnoseProjectPacks, diagramSetIndex, dialectOf, diffAgainstApproval, diffSize, discoverPacks, dryRunSerializeSpecs, effectiveDetail, effectiveProjectId, emptyExtensions, emptyTypeSpellingFacts, enclosing, ensureDir, ensureProjectInitialized, excerpt as excerptParent, exportDesign, exportSpecTree, exportSurface, exportTargetKey, exportUsage, externalizeSubsystem, extractTypeIdentifiers, factsFor, familyApprovals, familyNode, familyRelations, fieldTypeRefs, fieldTypesOf, findChainingParent, findChainingSubprojectsMissingConfig, findLegacySpecFiles, findProjectRoot, findSystemRoot, findTestsReferencing, fromProjectRoot, generateAgent, generateAll, generateComponentDiagram, generateDiagramSet, generateSequenceDiagram, getExporter, getExternalsStatus, getHostedLookup, getLoaderIssues, getProjectRoot, getProjectRootOverride, getRequestParentReach, getRequestProjectRoot, getSnapshot, getStatusReport, getWriteReach, globalGuideFilePath, globalPacksDir, globalPacksEnabled, globalTemplatesDir, hasContext, hasFunctionBody, headNoun, holdsState, implementationDesignView, implementationSourceFiles, importBindingOf, importNames, importSpecTree, importSurface, injectGuide, installPackFromDirectory, interfaceCanonicalTypes, interfaceDesignView, interfaceGenericParameters, internalizeMember, isDraftSubsystem, isInProcessAddress, isLogic, isOutsideRoot, isOwnComponentEntry, isPart, isPattern, isProjectInitialized, isProvidedBy, isRetired, isSilent, isTypeVocabulary, isWindowsReservedName, judgesCode, keyIn, landReference, languageOfSourcePath, lineEndingFor, listDirectChainedSubprojects, listConsumers as listExternalConsumers, listExternals, listFiles, listFilesRecursive, listInstalledPacks, listPinnedExternals, listRules, listSnapshots, loadComponentSpec, loadComponentSpecs, loadExtensionPacks, loadExtensions, loadFor as loadExtensionsFor, loadImplementationSpec, loadImplementationSpecs, loadInterfaceSpec, loadInterfaceSpecs, loadProjectConfig, loadProjectExtensions, loadProjectVariants, loadRegistry, loadSpec, loadSpecGraph, loadSubsystemSpec, loadSubsystemSpecs, loadSystemSpec, loadTopologyConfig, loadTypeSpec, loadTypeSpecs, localApprover, localGuideFilePath, localTypesOf, logger, makeScopeFilter, markSelectionsBundled, matchTypeRef, measurePackDoctrine, measurePackImpact, memberDeclarationOf, memberDigest, memberLocationOf, memberTypesOf, methodCasingFor, methodGenericParameters, methodSourceFile, methodTypeRefs, migrate as migrateReachability, moveMember, moveMethods, moveMountToMembers, nameKey, namesAnInteger, narrativeStepForeignFields, normalizeReferences, ownerOf, packDirEntry, packEntryLabel, packEntryRef, manifestOf as packManifest, packStoreDir, parseDeclarativePack, parseDeclaredCall, parseMemberSource, parseTypeExpression, parseTypePosition, parseYaml, passesIntentFloor, pathExists, pathKey, pinExternals, pinInstalledPacksAsSelections, pinnedParent, producerOf, projectConfigExists, graph as projectFamily, projectIdentity, promoteMember, provisionProject, qualifiedTypeId, rangeProblem, readCodeAnnotation, readExternalSource, readFileOrNull, readJsonFile, readLockRecord, readLockState, readRetiredReachForms, readStampVersion, readYamlFile, recordProfileSelection, reexpress, registerExporter, registerPackRef, registerProjectServer, reinjectLocalGuides, relationHealth, removeDomain, removeExternal, removeMember, removePackSelection, removeSnapshot, renameAlias, renameComponent, renameField, renameProjectId as renameId, renameMethod, renameParam, renameType, renderDiagram, repairForeignStepFields, repairSignatures, repairTypeSpellings, repointExternal, requiredPolicies, resolveAgentTopology, resolveBudget, resolveChainingParent, resolveDomains, resolveExpectedOutputPaths, resolveCandidate as resolveExternalCandidate, resolveDeclared as resolveExternals, resolveImport, resolveInstalledPack, resolveProjectBinding, resolveProjectExports, resolveSignatures, resolveSubprojectForNamespace, resolveSubsystemExports, resolveVariantGuidance, retireSpecialists, retiredInvocationReadAs, retiredMountsOf, retiredReachFacts, returnTypeOf, rewriteReferences, runWithHostedLookup, runWithProjectBinding, runWithProjectRoot, sameContract, saveSpec, saveTopologyConfig, scanAllSpecs, schemaFingerprint, selectsFamily, serializeYaml, setExecutionTier, setProjectId as setId, setLogLevel, setNetwork, setProjectRoot, setProjectType, settledSpecPaths, signatureFacts, signatureTypeRefs, specIndexRetiredBy, specPathsInScope, splitNamespace, stepConfigVerdict, stepFieldsFor, stepGraph, storedMethodSignature, storedTypeMethod, subsystemDesignView, surfaceChanges, syncContextFiles, technologyName, technologyPackages, technologyTokens, toMarkdown, transportExportKind, transportKind, transportRequiresEndpoint, typeBindingOf, typeCanonicalTypes, typeDesignView, typeDialectFor, typeGenericParameters, typeIsMany, typeMappingFor, typeMatchesRef, typeNamedRefs, typeProblemEnumProposal, typeProblemIntProposal, typeSourceFiles, typeSpellingFacts, uninstallPack, updateMember, updateSpec, upsertPackSelection, validateAsComplete, validateComponentCandidate, validateFamily, validateProject, validateProjectConfig, validateRegistry, withLineEndings, withPack, writeFile, writeFileIfChanged, writeJsonFile, writeLockRecord, writeReachDenials, writeReachPermits, writeRootGuideDelegator, writeYamlFile, writtenTypeRefs };
43671
+ export { AI_PATHS, ARCHITECT_AGENT_ID, ARCHITECT_TEMPLATE_ID, type AgentBrief, AgentBriefSchema, type AgentRecord, AgentRecordSchema, type AgentStatus, AgentStatusSchema, type AgentTemplate, AgentTemplateSchema, type AnalysisGrade, type ApiKeyLocation, ApiKeyLocationSchema, type ApprovalDiff, type ApprovalVerdict, type ApprovedRevision, type ArchProfile, type AuthoredReference, BACKEND_COMMANDS, BUILTIN_PROFILES, type BoundaryItem, BoundaryItemSchema, type BuildContextOptions, type BuiltinTarget, type BuiltinTargetConfig, BuiltinTargetConfigSchema, BuiltinTargetSchema, BundleNotFoundError, type CallSiteFact, type CallTargetFact, type CarriedDebt, type CarriedDebtKind, CarriedDebtKindSchema, CarriedDebtSchema, type CarriedFinding, type CarriedFindingEntry, CarriedFindingSchema, type CatchClause, CatchClauseSchema, ChainingMigrationRefusedError, ClaudeExporter, type ClaudeExporterOptions, type CodeIndex, type CodeModel, type ComplexityRuleConfig, ComplexityRuleConfigSchema, type ComponentPlacement, type ComponentRename, type ComponentSpec, ComponentSpecSchema, type ComponentType, ComponentTypeSchema, type CompositionConfig, CompositionConfigSchema, ConfigValidationError, type ConformanceRuleConfig, ConformanceRuleConfigSchema, type ConformanceTier, ConformanceTierSchema, type CrossProjectReference, CustomExporter, type CustomTarget, type CustomTargetConfig, CustomTargetConfigSchema, CustomTargetSchema, DEFAULT_TARGET_DIRS, DESIGN_APPROVALS, DESIGN_DEPENDENCY_ROLES, DESIGN_FORMAT, DESIGN_FORMAT_VERSION, DESIGN_VIEW_FIELDS, type DatabaseSpec, DatabaseSpecSchema, type DeclarativePack, type DeclaredCall, type DeclaredExternal, type DeclaredInvocation, DeclaredInvocationSchema, type DeclaredMember, type DependencyClass, DependencyClassSchema, type DependencyEdge, type DependencyEdges, type DesignApproval, DesignApprovalSchema, type DesignComponent, DesignComponentSchema, type DesignDependency, type DesignDependencyRole, DesignDependencyRoleSchema, DesignDependencySchema, type DesignDepth, DesignDepthSchema, type DesignExport, type DesignExportEntry, DesignExportEntrySchema, DesignExportSchema, type DesignField, DesignFieldSchema, type DesignImplementation, DesignImplementationSchema, type DesignInterface, DesignInterfaceSchema, type DesignMethod, type DesignMethodBody, DesignMethodBodySchema, DesignMethodSchema, type DesignParam, DesignParamSchema, type DesignProject, DesignProjectSchema, type DesignSource, DesignSourceSchema, type DesignSubsystem, DesignSubsystemSchema, type DesignType, type DesignTypeRef, DesignTypeRefSchema, DesignTypeSchema, type DetectedDomainCandidate, type DiagramConfig, DiagramConfigSchema, type DiagramLineStyle, DiagramLineStyleSchema, type DiagramView, DiagramViewSchema, type DispatchBinding, DispatchBindingSchema, type DisplayName, DisplayNameSchema, DoctorOptionsError, type DocumentationRuleConfig, DocumentationRuleConfigSchema, type Domain, DomainSchema, type DomainType, DomainTypeSchema, type Durability, DurabilitySchema, EXTERNAL_ALIAS_RE, EXTERNAL_SOURCE_FORMS, type EdgeReach, type Endpoint, EndpointSchema, type EndpointTransport, type EntryScope, EntryScopeSchema, type EnumValue, EnumValueSchema, type EventBinding, EventBindingSchema, type ExportAliasFact, type ExportContext, type ExportKind, type ExportProblem, type ExportProblemKind, type ExportResult, type ExportRole, ExportRoleSchema, type ExportTableLevel, type ExportUsage, type ExportUse, type Exporter, type ExtData, ExtDataSchema, type ExtensionPack, type ExternalAddition, type ExternalBinding, type ExternalConsumer, type ExternalDeclaration, ExternalDeclarationSchema, type ExternalLink, ExternalLinkSchema, type ExternalLinkType, ExternalLinkTypeSchema, type ExternalListing, type ExternalLockEntry, ExternalLockEntrySchema, type ExternalPin, type ExternalPinOutcome, type ExternalRelation, type ExternalRemoval, type ExternalRemovalPlan, type ExternalRequest, type ExternalRole, type ExternalSource, type ExternalSourceKind, ExternalSourceSchema, type ExternalStatus, type ExternalUseChange, type ExternalUseRequest, type ExternalUseState, type ExternalUseStatus, type ExternalsLock, ExternalsLockSchema, FULL_COMMIT_RE, type FamilyProblemKind, type FamilySwitches, FieldNameSchema, type FieldRename, type FieldRenameReading, type FindingDeclaration, FindingDeclarationSchema, type FindingParts, type ForeignFieldRepair, type ForwardedName, type FunctionBodyFact, GITHUB_REPO, GeminiExporter, type GenerateOptions, type GenerateSummary, type GroupSpec, GroupSpecSchema, type Guarantee, GuaranteeSchema, HOLDABLE_PRIMITIVES, type HostedRecordLookup, type HttpMethod, HttpMethodSchema, INVISIBLE_CHARACTERS, type Identifier, type IdentifierKind, type ImplementationSpec, ImplementationSpecSchema, type ImportBindingFact, type ImportGraph, type ImportSection, type InstalledPack, type InterfaceSpec, InterfaceSpecSchema, type InternalizeDestination, type InternalizeResult, type Invariant, InvariantSchema, type InvocationKind, InvocationKindSchema, type IssueSeverity, type LegacySpecFile, type LifecycleEntrypoint, LifecycleEntrypointSchema, type LifecyclePhase, LifecyclePhaseSchema, type LintAllow, LintAllowSchema, type LintConfig, LintConfigSchema, type LoadedExtensions, type LoadedPackSkill, type LockRecord, LockRecordUnreadableError, type LockStatus, type LogLevel, type LoopKind, LoopKindSchema, MAX_IDENTIFIER_LENGTH, MAX_SPEC_ID_LENGTH, type MemberAdvance, type MemberCreation, type MemberDeclaration, MemberDeclarationSchema, type MemberKind, type MemberPin, type MemberSource, type MemberStorage, type MethodEffect, MethodEffectSchema, type MethodImplementation, MethodImplementationSchema, type MethodLike, MethodNameSchema, type MethodParam, MethodParamSchema, type MethodRename, type MethodSignature, MethodSignatureSchema, type ModelledCall, type MountForm, type NamedOpenApiSpec, NamedOpenApiSpecSchema, type NamingRuleConfig, NamingRuleConfigSchema, type NarrativeDetail, NarrativeDetailSchema, type NarrativeStep, NarrativeStepSchema, type NarrativeStepType, NarrativeStepTypeSchema, type NetworkBoundary, type NetworkDeclaration, NetworkDeclarationSchema, NetworkOptionsError, type OAuthFlow, OAuthFlowSchema, type OutputTarget, OutputTargetSchema, type OwnershipIndex, PATTERN_TYPES, PRIMITIVE_TYPES, PROJECT_ID_RE, PROJECT_KINDS, PUBLIC_NAME_RE, type PackDiagnosis, type PackEntry, type PackPath, type PackRef, type PackRequirement, PackRequirementSchema, type PackScope, type PackSelection, PackSelectionSchema, type ParallelBranch, ParallelBranchSchema, ParamNameSchema, type ParamRename, type ParameterFact, type ParentExcerpt, ParentExcerptSchema, type ParsedMemberSource, type PartOf, PartOfSchema, type PathsConfig, PathsConfigSchema, type PatternRef, PatternRefSchema, type PinnedExternal, type PinnedParent, type PortalAuth, PortalAuthSchema, type PortalAuthScheme, PortalAuthSchemeSchema, PreviousIdsSchema, PreviousNamesSchema, ProfileSelectionSubjectSchema, type ProjectBinding, type ProjectBindingVia, type ProjectConfig, ProjectConfigSchema, type ProjectFamily, type ProjectFamilyProblem, type ProjectIdOrigin, type ProjectIdSource, type ProjectIdentity, type ProjectIdentityProblem, type ProjectImport, type ProjectNode, ProjectNotInitializedError, type ProjectProfileSelection, ProjectProfileSelectionSchema, type ProjectRelations, type PromoteResult, type PublicInterface, PublicInterfaceSchema, type PublicInterfaceType, PublicInterfaceTypeSchema, RETIRED_INVOCATION_KINDS, RETIRED_PORTAL_TYPE_SPELLINGS, RETIRED_STEREOTYPES, type ReachFinding, type ReachModel, type ReachRewrite, type ReachabilityMigrationPlan, type ReadExternalSource, type ReadableProject, type RealizationIndex, type ReexportBindingFact, type ReferenceBinding, type ReferenceEdit, type ReferenceForm, type ReferenceLanding, type ReferenceResolution, type Registry, RegistrySchema, type RelationHealth, type RenameTraceHolders, type RequirementItem, RequirementItemSchema, type ResolutionOutcome, type ResolvedBody, type ResolvedCallFact, type ResolvedDetail, type ResolvedExport, type ResolvedExportTable, type ResolvedExternal, ResolvedInterfaceSpecSchema, type ResolvedMethod, ResolvedMethodSignatureSchema, ResolvedTypeMethodSchema, ResolvedTypeSpecSchema, type RetiredMount, type RetiredReachFact, type RetiredReachForm, RetiredReachFormSchema, type RetiredReachHolder, type RouteFact, type RuleCode, type RuleContext, type RuleJudgement, type RuleScope, type RulesConfig, RulesConfigSchema, SCAN_EXCLUDE_DIRS, SDD_RULES, SEMANTIC_GUARANTEES, STEP_COMMON_FIELDS, STEP_LABEL_TWINS, STEP_TYPE_FIELDS, SUPPORTED_ALIASES, SURFACE_AUDIENCES, type ScopeFilterOptions, type SddRule, type Severity, type ShapeMemberFact, type ShapeOrigin, type SignatureFacts, type SignatureResolution, type SignatureSourceFact, type SignatureTextRepair, type SourceFileFacts, type SourceFileStatus, type SpecId, type SpecIdKind, SpecIdSchema, type SpecIndex, type SpecScanOptions, type SpecStatus, SpecStatusSchema, type SpecialistRetirement, type SpecialistRetype, type StaleSignatureText, type StateId, type StatusDecor, type StatusOptions, type StatusReport, type StepConfigCode, type StepConfigProblem, type StepConfigVerdict, type StepGraph, type StoredInterfaceSpec, type StoredMethodSignature, StoredMethodSignatureSchema, type StoredTypeMethod, StoredTypeMethodSchema, type StoredTypeSpec, type SubsystemSpec, SubsystemSpecSchema, type SubsystemWriteRule, type SupportedAlias, type SurfaceAudience, SurfaceAudienceSchema, type SurfaceChange, type SurfaceChangeKind, type SurfaceContractEntry, SurfaceContractEntrySchema, type SurfaceOrigin, SurfaceOriginSchema, type SurfaceRefResolution, type SurfaceSnapshot, SurfaceSnapshotSchema, type SurfaceTypeDef, SurfaceTypeDefSchema, type SurfaceTypeExport, SurfaceTypeExportSchema, type SurfaceUnresolvedExport, SurfaceUnresolvedExportSchema, type SwitchCase, SwitchCaseSchema, type SyncResult, type SystemPublicInterface, SystemPublicInterfaceSchema, type SystemSpec, SystemSpecSchema, TECHNOLOGY_PACKAGES, type TargetConfig, TargetConfigSchema, type Technology, TechnologySchema, type Template, TemplateNotFoundError, TemplateSchema, type TopicEnd, type TopologyConfig, TopologyConfigSchema, type TracedRename, type Transport, type TransportKind, TransportKindSchema, TransportSchema, type TreeExportResult, type TreeImportOptions, type TreeImportResult, type TrustedLink, TrustedLinkSchema, type TypeCanonicalization, type TypeDialect, type TypeEnumProposal, type TypeExpression, type TypeExpressionProblem, TypeExpressionSchema, type TypeField, TypeFieldSchema, type TypeForm, type TypeKind, TypeKindSchema, type TypeMethod, TypeMethodSchema, type TypeParse, type TypePosition, type TypeProblemCode, type TypeRename, type TypeRespelling, type TypeShapeFact, type TypeSpec, TypeSpecSchema, type TypeSpellingFacts, type TypeSpellingRepair, type TypedSpecKind, USE_ENTRY_RE, type VerbReach, WAIRON_MANAGED_BANNER, WAIRON_MANAGED_MARKER, WAIRON_VERSION, WINDOWS_RESERVED_NAME_RE, type WaiPaths, WaironError, type WriteReach, YamlSyntaxError, activeTargetTypes, addDomain, admits, advanceMember, aiDir, aiDirAt, aiPathsAt, aliasGrammarProblem, aliasTargetOf, ambiguityMessage, approvalKeyIn, approvalRecord, approvalVerdict, approvedRevision, approvedStatuses, asSchemaReads, assertContainedProjectPath, assertProjectInitialized, attachRetiredMounts, backendCommand, backfillChainedSubprojectConfigs, backupBeside, bindDeclaredExternal, bodySitesOf, buildCanvasDataModel, buildProjectGraph, buildRuleContext, builtinProfileIds, builtinProjectKinds, callSitesOf, callersOf, canonicalTypeRef, canonicalTypeText, captureApprovedSpecs, carriedFactChanges, carryRetiredReachForms, checkDeclarativePack, clearLoaderIssues, cognitiveScore, complexityLevel, componentDesignView, componentEntryFor, composeAgentBrief, composeRuleSequence, computeGateStateId, computeOwnDesignStateId as computeOwnDesignId, computeOwnDesignStateIdAsRecorded as computeOwnDesignIdAsRecorded, computeOwnStateId, computeStateId, computeStateIdAt, conceptNoun, consumedContractInputs, consumerReaches, containedPathOf, contentDigest, createAgentRecord, createEmptyRegistry, createEmptyTopologyConfig, createMember, createProjectConfig, currentRootBinding, declareExternal, declareMember, declaredExternals, declaredMembers, declaredPackNames, declaredProfileIds, declares, declaresGlobalPacks, defaultConformanceTier, defaultNarrativeDetail, defaultPackSelections, defaultTargetConfig, deleteSpec, demoteMember, dependencyCycles, deregisterPackRef, deriveExecutionProfile, deriveMethodSignature, deriveTypeSignature, derivedDocPaths, describeProject, detectDomainCandidates, diagnoseProjectPacks, diagramSetIndex, dialectOf, diffAgainstApproval, diffSize, discoverPacks, displayNameProblem, dryRunSerializeSpecs, effectiveDetail, effectiveProjectId, emptyExtensions, emptyTypeSpellingFacts, enclosing, ensureDir, ensureProjectInitialized, excerpt as excerptParent, exportDesign, exportSpecTree, exportSurface, exportTargetKey, exportUsage, externalizeSubsystem, extractTypeIdentifiers, factsFor, familyApprovals, familyNode, familyRelations, fieldRenames, fieldRenamesSince, fieldTypeRefs, fieldTypesOf, findChainingParent, findChainingSubprojectsMissingConfig, findLegacySpecFiles, findOrphanedSpecFiles, findProjectRoot, findSystemRoot, findTestsReferencing, fitsMethodCasing, fromProjectRoot, generateAgent, generateAll, generateComponentDiagram, generateDiagramSet, generateSequenceDiagram, getExporter, getExternalsStatus, getHostedLookup, getLoaderIssues, getProjectRoot, getProjectRootOverride, getRequestParentReach, getRequestProjectRoot, getSnapshot, getStatusReport, getWriteReach, globalGuideFilePath, globalPacksDir, globalPacksEnabled, globalTemplatesDir, hasContext, hasFunctionBody, headNoun, holdsState, identifierProblem, implementationDesignView, implementationSourceFiles, importBindingOf, importNames, importSpecTree, importSurface, injectGuide, installPackFromDirectory, interfaceCanonicalTypes, interfaceDesignView, interfaceGenericParameters, internalizeMember, isDraftSubsystem, isInProcessAddress, isLogic, isOutsideRoot, isOwnComponentEntry, isPart, isPattern, isProjectInitialized, isProvidedBy, isRetired, isSilent, isTypeVocabulary, isWindowsReservedName, judgesCode, keyIn, landReference, languageOfSourcePath, lineEndingFor, listDirectChainedSubprojects, listConsumers as listExternalConsumers, listExternals, listFiles, listFilesRecursive, listInstalledPacks, listPinnedExternals, listRules, listSnapshots, loadComponentSpec, loadComponentSpecs, loadExtensionPacks, loadExtensions, loadFor as loadExtensionsFor, loadImplementationSpec, loadImplementationSpecs, loadInterfaceSpec, loadInterfaceSpecs, loadProjectConfig, loadProjectExtensions, loadProjectVariants, loadRegistry, loadSpec, loadSpecGraph, loadSubsystemSpec, loadSubsystemSpecs, loadSystemSpec, loadTopologyConfig, loadTypeSpec, loadTypeSpecs, localApprover, localGuideFilePath, localTypesOf, logger, makeScopeFilter, markSelectionsBundled, matchTypeRef, measurePackDoctrine, measurePackImpact, memberDeclarationOf, memberDigest, memberLocationOf, memberTypesOf, methodCasingFor, methodGenericParameters, methodSourceFile, methodTypeRefs, migrate as migrateReachability, moveMember, moveMethods, moveMountToMembers, nameKey, namesAnInteger, narrativeStepForeignFields, narrowedToMember, normalizeReferences, ownerOf, packDirEntry, packEntryLabel, packEntryRef, manifestOf as packManifest, packStoreDir, parseDeclarativePack, parseDeclaredCall, parseMemberSource, parseTypeExpression, parseTypePosition, parseYaml, passesIntentFloor, pathExists, pathKey, pinExternals, pinnedParent, producerOf, projectConfigExists, graph as projectFamily, projectIdentity, promoteMember, provisionProject, qualifiedTypeId, rangeProblem, readCodeAnnotation, readExternalSource, readFileOrNull, readJsonFile, readLockRecord, readLockState, readRetiredReachForms, readStampVersion, readYamlFile, recordProfileSelection, reexpress, registerExporter, registerPackRef, registerProjectServer, reinjectLocalGuides, relationHealth, removeDomain, removeExternal, removeMember, removePackSelection, removeSnapshot, renameAlias, renameComponent, renameField, renameProjectId as renameId, renameMethod, renameParam, renameType, renderDiagram, repairForeignStepFields, repairSignatures, repairTypeSpellings, repointExternal, requiredPolicies, reservedWordProblem, resolveAgentTopology, resolveBudget, resolveChainingParent, resolveDomains, resolveExpectedOutputPaths, resolveCandidate as resolveExternalCandidate, resolveDeclared as resolveExternals, resolveImport, resolveInstalledPack, resolveProjectBinding, resolveProjectExports, resolveSignatures, resolveSubprojectForNamespace, resolveSubsystemExports, resolveVariantGuidance, retireSpecialists, retiredInvocationReadAs, retiredMountsOf, retiredReachFacts, returnTypeOf, rewriteReferences, runWithHostedLookup, runWithProjectBinding, runWithProjectRoot, sameContract, saveSpec, saveTopologyConfig, scanAllSpecs, schemaFingerprint, seedDemoTree, selectsFamily, serializeYaml, setExecutionTier, setProjectId as setId, setLogLevel, setNetwork, setProjectRoot, setProjectType, settledSpecPaths, signatureFacts, signatureTypeRefs, specIndexRetiredBy, specPathsInScope, splitNamespace, stepConfigVerdict, stepFieldsFor, stepGraph, storedMethodSignature, storedTypeMethod, subsystemDesignView, surfaceChanges, syncContextFiles, technologyName, technologyPackages, technologyTokens, toMarkdown, transportExportKind, transportKind, transportRequiresEndpoint, typeBindingOf, typeCanonicalTypes, typeDesignView, typeDialectFor, typeGenericParameters, typeIsMany, typeMappingFor, typeMatchesRef, typeNamedRefs, typeProblemEnumProposal, typeProblemIntProposal, typeSourceFiles, typeSpellingFacts, uninstallPack, updateMember, updateSpec, upsertPackSelection, validateAsComplete, validateComponentCandidate, validateFamily, validateProject, validateProjectConfig, validateRegistry, withLineEndings, withPack, writeFile, writeFileIfChanged, writeJsonFile, writeLockRecord, writeReachDenials, writeReachPermits, writeRootGuideDelegator, writeYamlFile, writtenTypeRefs };