zorya-classifier 0.2.0 → 0.2.1

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/zorya-classifier)](https://www.npmjs.com/package/zorya-classifier)
4
4
 
5
- Provider-independent text/image classification and coarse-to-fine object localization for Node.js and TypeScript. MIT application code. The library never selects or connects a model for you: create a client with an explicit `DecisionPort`, either injected by your application or built with an adapter you configure. The model and provider shown in examples are examples, not defaults. Ordinary vision language models and native decision APIs are both supported.
5
+ Provider-independent text/image classification for Node.js and TypeScript, with experimental, unqualified spatial localization and object extraction. MIT application code. The library never selects or connects a model for you: create a client with an explicit `DecisionPort`, either injected by your application or built with an adapter you configure. The model and provider shown in examples are examples, not defaults. Ordinary vision language models and native decision APIs are both supported for closed classification.
6
6
 
7
7
  Use an explicitly configured image-capable model through a supported adapter, or implement the small `DecisionPort` for another protocol. OpenRouter is an optional adapter, not a mandatory service. A more capable model may help on a task, but model strength does not guarantee a monotonic accuracy improvement. Compatibility and quality vary; see the exact [tested models/results](docs/vision-results.md), [acceptance](docs/acceptance.md), and historical [Jev baseline](docs/results.md).
8
8
 
@@ -24,6 +24,22 @@ npm install zorya-classifier
24
24
 
25
25
  The release archive also installs with `npm install ./zorya-classifier-0.1.0.tgz`. Runtime dependencies are Zod and Sharp; model weights, Electron, a database and background services are not included. Optional local segmentation backends and their model assets are a separate responsibility of the caller; the library does not download or choose them.
26
26
 
27
+ ## Capability and status
28
+
29
+ Further accuracy experiments on spatial workflows are stopped; no localization, extraction, or proposal strategy is promoted for general use. Historical metrics below and in `docs/evidence/**` are preserved as recorded.
30
+
31
+ | Capability | Status | Notes |
32
+ | --------------------------------------------------------------- | ------------ | --------------------------------------------------------------------- |
33
+ | `classify` with an explicit `DecisionPort` / supported adapters | Supported | Closed class ID; no universal model accuracy claim |
34
+ | Default `locate` (region grid search) | Experimental | Hypothesized grid cell, not whole-object geometry or proof of absence |
35
+ | `RefinementPort` | Experimental | No general quality qualification |
36
+ | `locate({ mode: 'whole-object' })` | Experimental | Interval or segmentation paths; unqualified |
37
+ | `extract`, `SegmentationPort`, box-check composition | Experimental | Structural checks ≠ semantic object or mask quality |
38
+ | `objectProposals` / native segmentation factories | Experimental | Caller-owned; unqualified |
39
+ | `representation: { type: 'experimental-text', … }` | Rejected | `UNSUPPORTED` until a profile qualifies |
40
+
41
+ Heldout region-seeded metrics (one documented recipe, not universal): 26/60 positive coarse seed hits; 8/60 complete whole-object boxes; 0 false seeds on 20 negatives. Among 30 exact-canvas masks: 8 reached IoU 0.8, 3 failed, 19 had no predicted mask. H8 DEV reported 7/9 positives with 2/3 false outputs and did not qualify. A narrow historical admission pass is not broad spatial qualification.
42
+
27
43
  ## Example: Luna Decisions
28
44
 
29
45
  This example uses the typed **Decisions API** with genuine Choice probabilities. Model and provider are explicit; there are no automatic retries or fallbacks. It illustrates one integration and is not a library default. Jev is optional and is not used by this example.
@@ -101,9 +117,9 @@ try {
101
117
 
102
118
  Supply the **full trusted chat-completions URL**, such as your local `http://localhost:8000/v1/chat/completions`, and the actual deployed model ID. Anonymous local servers can omit the key; custom headers support other authentication. These are integration examples, not a claim that every provider/model has been live-qualified. Other wire protocols can implement the exported `DecisionPort`. Keep keys on a trusted server, outside frontend bundles and Git.
103
119
 
104
- ## Locate an object
120
+ ## Locate an object (experimental)
105
121
 
106
- With either configured client:
122
+ Default region `locate` is experimental and unqualified. With either configured client:
107
123
 
108
124
  ```ts
109
125
  const result = await client.locate({
@@ -117,9 +133,9 @@ if (result.status === 'located') console.log(result.region)
117
133
 
118
134
  The locator uses up to three sequential calls: coarse 4×4 regions, fine grids in four padded regions, then four enlarged candidates. Coordinates come from code, never free-form model coordinates. Ordinary-model rankings select candidates; independent present/absent/unknown answers govern abstention. Multiple matching physical instances are allowed; one candidate is returned. Localization requires the model/endpoint to accept multiple images per call (up to nine); single-image-only endpoints can still support `classify`.
119
135
 
120
- ## Extract a mask-derived object
136
+ ## Extract a mask-derived object (experimental)
121
137
 
122
- For a visible object box, center, or transparent cutout, use `extract` with an explicitly configured caller-owned segmenter. The existing region locator supplies a seed; the segmenter receives that seed while processing the full oriented source image. The library derives the returned box and center from actual mask pixels. After segmentation, the caller's decision port checks the original image with the mask-derived box and seed anchor. An incomplete box permits one enclosing-mask correction and one recheck; unresolved results remain unknown. This adds one or two closed checks to the normal region requests, without model-generated coordinates or an extent search. See the [0.2 usage guide](docs/v02-usage.md) and runnable [`extract-object.ts`](examples/extract-object.ts). The classifier and segmenter are separately caller-owned and both must be disposed.
138
+ Extraction and caller-owned segmentation are experimental and unqualified. For a visible object box, center, or transparent cutout, use `extract` with an explicitly configured caller-owned segmenter. The existing region locator supplies a seed; the segmenter receives that seed while processing the full oriented source image. The library derives the returned box and center from actual mask pixels. After segmentation, the caller's decision port checks the original image with the mask-derived box and seed anchor. An incomplete box permits one enclosing-mask correction and one recheck; unresolved results remain unknown. This adds one or two closed checks to the normal region requests, without model-generated coordinates or an extent search. See the [0.2 usage guide](docs/v02-usage.md) and runnable [`extract-object.ts`](https://github.com/zoomplus/zorya-classifier/blob/main/examples/extract-object.ts). The classifier and segmenter are separately caller-owned and both must be disposed.
123
139
 
124
140
  ## Development and limits
125
141
 
@@ -137,4 +153,4 @@ Tests are offline. Examples, CLI and explicitly authorized model benchmarks make
137
153
 
138
154
  A model must understand the input, follow instructions and produce the checked answer shape. JSON Schema/JSON-object modes are opt-in when the chosen endpoint supports them; prompt-only mode does not require structured-output support. No universal accuracy, calibration or sub-second guarantee is asserted. Legacy region refinement uses `RefinementPort`; the 0.2 explicit `extract` workflow uses a caller-owned `SegmentationPort`.
139
155
 
140
- See [CONTRIBUTING](CONTRIBUTING.md), [SECURITY](SECURITY.md), [NOTICE](NOTICE.md), and [LICENSE](LICENSE).
156
+ See [CONTRIBUTING](https://github.com/zoomplus/zorya-classifier/blob/main/CONTRIBUTING.md), [SECURITY](https://github.com/zoomplus/zorya-classifier/blob/main/SECURITY.md), [NOTICE](NOTICE.md), and [LICENSE](LICENSE).
@@ -12,19 +12,24 @@ export interface ClassifierOptions {
12
12
  concurrency?: number;
13
13
  maxQueue?: number;
14
14
  maxInputBytes?: number;
15
+ /** @experimental Optional legacy region refinement; unqualified for general use. */
15
16
  refinement?: RefinementPort;
16
- /** Caller-owned; classifier disposal never disposes a shared segmenter. */
17
+ /** Caller-owned; classifier disposal never disposes a shared segmenter. @experimental Unqualified segmentation adapter. */
17
18
  segmentation?: SegmentationPort;
18
- /** Optional caller-owned containment checker; by default reuses the injected decision port. */
19
+ /** Optional caller-owned containment checker; by default reuses the injected decision port. @experimental Unqualified box-check override. */
19
20
  segmentationBoxCheck?: SegmentationBoxCheckPort;
20
- /** Explicit, caller-owned pixel-mask proposal strategy for whole-object operations. */
21
+ /** Explicit, caller-owned pixel-mask proposal strategy for whole-object operations. @experimental Unqualified proposal path. */
21
22
  objectProposals?: ObjectProposalPort;
22
23
  }
23
24
  export interface Classifier {
24
25
  classify(input: ClassifyInput): Promise<ClassificationResult>;
26
+ /** @experimental Unqualified spatial localization; see {@link LocateInput} and {@link WholeObjectLocateInput}. */
25
27
  locate(input: WholeObjectLocateInput): Promise<WholeObjectLocalizationResult>;
28
+ /** @experimental Unqualified coarse region search; returns a hypothesized grid cell. */
26
29
  locate(input: LocateInput): Promise<LocalizationResult>;
30
+ /** @experimental Unqualified spatial localization. */
27
31
  locate(input: AnyLocateInput): Promise<LocalizationResult | WholeObjectLocalizationResult>;
32
+ /** @experimental Region-seeded extraction; unqualified for general mask or object accuracy. */
28
33
  extract(input: ExtractInput): Promise<ExtractionResult>;
29
34
  dispose(): Promise<void>;
30
35
  }
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import { createMobileSamSegmenter, createGrabCutSegmenter } from './segmentation
8
8
  async function main() {
9
9
  const args = parseCliArguments(process.argv.slice(2));
10
10
  if (args.command === 'help') {
11
- console.log('zorya-classifier classify-text <text> <classes.json>\nzorya-classifier classify-image <image> <classes.json>\nzorya-classifier locate <image> <target> [--mode region|whole-object]\nzorya-classifier extract <image> <target> --output <prefix> --backend mobile-sam --encoder <path> --decoder <path> [--provider cpu|dml]\nzorya-classifier extract <image> <target> --output <prefix> --backend grabcut --opencv <path>\nSet ZORYA_MODEL. Default ZORYA_MODE=decisions; use chat for ordinary vision models/custom chat endpoints. OpenRouter: OPENROUTER_API_KEY + ZORYA_PROVIDER. Direct: ZORYA_ENDPOINT + optional ZORYA_API_KEY. Optional ZORYA_REASONING_EFFORT and ZORYA_RESPONSE_FORMAT. One classify request; up to three region or six whole-object requests. Extraction additionally runs the explicit local backend. Output files are never overwritten; native assets are never downloaded automatically.');
11
+ console.log('zorya-classifier classify-text <text> <classes.json>\nzorya-classifier classify-image <image> <classes.json>\nzorya-classifier locate <image> <target> [--mode region|whole-object] (experimental, unqualified spatial search)\nzorya-classifier extract <image> <target> --output <prefix> --backend mobile-sam --encoder <path> --decoder <path> [--provider cpu|dml] (experimental extraction)\nzorya-classifier extract <image> <target> --output <prefix> --backend grabcut --opencv <path> (experimental extraction)\nSet ZORYA_MODEL. Default ZORYA_MODE=decisions; use chat for ordinary vision models/custom chat endpoints. OpenRouter: OPENROUTER_API_KEY + ZORYA_PROVIDER. Direct: ZORYA_ENDPOINT + optional ZORYA_API_KEY. Optional ZORYA_REASONING_EFFORT and ZORYA_RESPONSE_FORMAT. classify is supported; locate/extract/object backends are experimental and not qualified for general use. One classify request; up to three region or six whole-object requests. Extraction additionally runs the explicit local backend. Output files are never overwritten; native assets are never downloaded automatically.');
12
12
  return;
13
13
  }
14
14
  const { command, value, target } = args;
@@ -223,6 +223,7 @@ export declare const locateSchema: z.ZodObject<{
223
223
  } | undefined;
224
224
  mode?: "region" | undefined;
225
225
  }>;
226
+ /** @experimental Unqualified coarse region search; a located grid cell is a hypothesis, not reliable whole-object geometry or proof of absence. */
226
227
  export type LocateInput = z.input<typeof locateSchema> & {
227
228
  signal?: AbortSignal;
228
229
  };
@@ -424,6 +425,7 @@ export interface LocalizationMetadata {
424
425
  knownCostUsd: number;
425
426
  unknownCostCount: number;
426
427
  }
428
+ /** @experimental Outcome of unqualified spatial localization; grid regions are not semantic object boxes or masks. */
427
429
  export type LocalizationResult = ({
428
430
  status: 'located';
429
431
  region: PixelRect;
@@ -440,6 +442,7 @@ export type LocalizationResult = ({
440
442
  }) & {
441
443
  metadata: LocalizationMetadata;
442
444
  };
445
+ /** @experimental Optional legacy region refinement with no general quality qualification. */
443
446
  export type RefinementResult = {
444
447
  status: 'refined';
445
448
  region: PixelRect;
@@ -448,6 +451,7 @@ export type RefinementResult = {
448
451
  status: 'unknown';
449
452
  reason: string;
450
453
  };
454
+ /** @experimental Caller-owned refinement hook; unqualified for general spatial accuracy. */
451
455
  export interface RefinementPort {
452
456
  refine(input: {
453
457
  image: Uint8Array;
@@ -33,7 +33,10 @@ export interface ObjectProposalBatch {
33
33
  proposals: readonly ObjectProposal[];
34
34
  metadata: SegmentationMetadata;
35
35
  }
36
- /** Caller-owned. propose settles only after physical work closes; no model calls here. */
36
+ /**
37
+ * Caller-owned. propose settles only after physical work closes; no model calls here.
38
+ * @experimental Mask proposal strategy with no general quality qualification.
39
+ */
37
40
  export interface ObjectProposalPort {
38
41
  propose(input: ObjectProposalInput): Promise<ObjectProposalBatch>;
39
42
  settle(): Promise<void>;
@@ -16,6 +16,7 @@ export interface SegmentationBoxCheckResult {
16
16
  selection: ChoiceSelection;
17
17
  metadata: DecisionMetadata;
18
18
  }
19
+ /** @experimental Closed box containment check; verdicts are unqualified for general spatial accuracy. */
19
20
  export interface SegmentationBoxCheckPort {
20
21
  check(input: SegmentationBoxCheckInput): Promise<SegmentationBoxCheckResult>;
21
22
  }
@@ -84,6 +84,7 @@ export declare const extractSchema: z.ZodObject<{
84
84
  boxTolerancePx?: number | undefined;
85
85
  maxExtentPasses?: number | undefined;
86
86
  }>;
87
+ /** @experimental Region-seeded extraction input; unqualified for general object or mask accuracy. */
87
88
  export type ExtractInput = z.input<typeof extractSchema> & {
88
89
  signal?: AbortSignal;
89
90
  };
@@ -115,7 +116,10 @@ export type SegmentationResult = {
115
116
  reason: string;
116
117
  metadata: SegmentationMetadata;
117
118
  };
118
- /** Caller-owned. settle joins physical work; dispose closes this adapter only. */
119
+ /**
120
+ * Caller-owned. settle joins physical work; dispose closes this adapter only.
121
+ * @experimental Caller-owned segmentation; structural validation does not establish semantic object or mask quality.
122
+ */
119
123
  export interface SegmentationPort {
120
124
  segment(input: SegmentationInput): Promise<SegmentationResult>;
121
125
  /** Optional actual enclosing mask on the full source; previousMask is full-source binary-u8. */
@@ -123,6 +127,7 @@ export interface SegmentationPort {
123
127
  settle(): Promise<void>;
124
128
  dispose(): Promise<void>;
125
129
  }
130
+ /** @experimental Extraction outcome; `extracted` reflects validation, not guaranteed semantic correctness. */
126
131
  export type ExtractionResult = {
127
132
  status: 'extracted';
128
133
  location: WholeObjectLocated;
@@ -81,10 +81,13 @@ export declare const wholeObjectSchema: z.ZodObject<{
81
81
  boxTolerancePx?: number | undefined;
82
82
  maxExtentPasses?: number | undefined;
83
83
  }>;
84
+ /** @experimental Same unqualified coarse region search as default {@link LocateInput}. */
84
85
  export type RegionLocateInput = LocateInput;
86
+ /** @experimental Whole-object localization (interval or caller segmentation); unqualified for general use. */
85
87
  export type WholeObjectLocateInput = z.input<typeof wholeObjectSchema> & {
86
88
  signal?: AbortSignal;
87
89
  };
90
+ /** @experimental Region or whole-object locate input; spatial paths are experimental. */
88
91
  export type AnyLocateInput = RegionLocateInput | WholeObjectLocateInput;
89
92
  export interface BoundaryInterval {
90
93
  start: number;
@@ -124,5 +127,6 @@ export type WholeObjectFailure = LocalizationFailure | {
124
127
  metadata: LocalizationMetadata;
125
128
  verification?: SegmentationVerification;
126
129
  };
130
+ /** @experimental Whole-object localization outcome; passing structural checks does not establish mask or box accuracy. */
127
131
  export type WholeObjectLocalizationResult = WholeObjectLocated | WholeObjectFailure;
128
132
  export {};
@@ -7,7 +7,11 @@ declare const optionsSchema: z.ZodObject<{
7
7
  }, {
8
8
  assetPath: string;
9
9
  }>;
10
+ /** @experimental Options for the unqualified GrabCut segmentation factory. */
10
11
  export type GrabCutSegmenterOptions = z.input<typeof optionsSchema>;
11
- /** Explicit pinned OpenCV GrabCut adapter. The supplied native asset is never downloaded. */
12
+ /**
13
+ * Explicit pinned OpenCV GrabCut adapter. The supplied native asset is never downloaded.
14
+ * @experimental Native segmentation adapter; unqualified for general mask or object accuracy.
15
+ */
12
16
  export declare function createGrabCutSegmenter(options: GrabCutSegmenterOptions): Promise<SegmentationPort>;
13
17
  export {};
@@ -7,7 +7,10 @@ import { nativeErrorReplySchema, nativeSegmentationReplySchema } from '../native
7
7
  import { verifyPinnedAsset } from '../verify-asset.js';
8
8
  import { probeBackend } from '../probe-backend.js';
9
9
  const optionsSchema = z.object({ assetPath: z.string().min(1).max(4096) }).strict();
10
- /** Explicit pinned OpenCV GrabCut adapter. The supplied native asset is never downloaded. */
10
+ /**
11
+ * Explicit pinned OpenCV GrabCut adapter. The supplied native asset is never downloaded.
12
+ * @experimental Native segmentation adapter; unqualified for general mask or object accuracy.
13
+ */
11
14
  export async function createGrabCutSegmenter(options) {
12
15
  const checked = optionsSchema.safeParse(options);
13
16
  if (!checked.success)
@@ -22,6 +22,7 @@ declare const optionsSchema: z.ZodObject<{
22
22
  deviceId?: number | undefined;
23
23
  threads?: number | undefined;
24
24
  }>;
25
+ /** @experimental Options for the unqualified MobileSAM segmentation factory. */
25
26
  export type MobileSamSegmenterOptions = z.input<typeof optionsSchema>;
26
27
  declare const proposalOptionsSchema: z.ZodObject<{
27
28
  encoderPath: z.ZodString;
@@ -39,6 +40,7 @@ declare const proposalOptionsSchema: z.ZodObject<{
39
40
  executionProvider?: "cpu" | undefined;
40
41
  threads?: number | undefined;
41
42
  }>;
43
+ /** @experimental Options for the unqualified MobileSAM object-proposal factory. */
42
44
  export type MobileSamObjectProposalsOptions = z.input<typeof proposalOptionsSchema>;
43
45
  type SerializedTask = (Omit<Extract<NativeSegmentationRequest, {
44
46
  kind: 'mobile-sam';
@@ -49,10 +51,16 @@ type SerializedTask = (Omit<Extract<NativeSegmentationRequest, {
49
51
  }>, 'id' | 'rgba'> & {
50
52
  rgba: string;
51
53
  });
52
- /** Explicit pinned MobileSAM inference in a separately owned Node child process. */
54
+ /**
55
+ * Explicit pinned MobileSAM inference in a separately owned Node child process.
56
+ * @experimental Native segmentation adapter; unqualified for general mask or object accuracy.
57
+ */
53
58
  export declare function createMobileSamSegmenter(options: MobileSamSegmenterOptions): Promise<SegmentationPort>;
54
59
  /** Internal adapter seam: pool ownership stays with the caller. */
55
60
  export declare function createMobileSamPortForPool(pool: Pick<NativeChildPool<SerializedTask>, 'runLazy' | 'settle' | 'dispose'>, parsed: z.output<typeof optionsSchema>): SegmentationPort & Required<Pick<SegmentationPort, 'expand'>>;
56
- /** Explicit CPU-only, caller-owned one-shot 3x3-point / 36-mask proposal adapter. */
61
+ /**
62
+ * Explicit CPU-only, caller-owned one-shot 3x3-point / 36-mask proposal adapter.
63
+ * @experimental Native proposal adapter; unqualified for general spatial or mask accuracy.
64
+ */
57
65
  export declare function createMobileSamObjectProposals(options: MobileSamObjectProposalsOptions): Promise<ObjectProposalPort>;
58
66
  export {};
@@ -25,7 +25,10 @@ const proposalOptionsSchema = z
25
25
  threads: z.number().int().min(1).max(8).default(2),
26
26
  })
27
27
  .strict();
28
- /** Explicit pinned MobileSAM inference in a separately owned Node child process. */
28
+ /**
29
+ * Explicit pinned MobileSAM inference in a separately owned Node child process.
30
+ * @experimental Native segmentation adapter; unqualified for general mask or object accuracy.
31
+ */
29
32
  export async function createMobileSamSegmenter(options) {
30
33
  const checked = optionsSchema.safeParse(options);
31
34
  if (!checked.success)
@@ -286,7 +289,10 @@ export function createMobileSamPortForPool(pool, parsed) {
286
289
  dispose: () => pool.dispose(),
287
290
  };
288
291
  }
289
- /** Explicit CPU-only, caller-owned one-shot 3x3-point / 36-mask proposal adapter. */
292
+ /**
293
+ * Explicit CPU-only, caller-owned one-shot 3x3-point / 36-mask proposal adapter.
294
+ * @experimental Native proposal adapter; unqualified for general spatial or mask accuracy.
295
+ */
290
296
  export async function createMobileSamObjectProposals(options) {
291
297
  const checked = proposalOptionsSchema.safeParse(options);
292
298
  if (!checked.success)
@@ -10,7 +10,7 @@ The fresh text-only development comparison is now complete for the primary photo
10
10
 
11
11
  The owner explicitly activated the completion goal on 2026-10-20: finish this plan, close its acceptance gates, and choose the best qualified vision approach. The goal covers the standalone library and its authorized GitHub/npm release. Vision localization and experimental text-only image encodings are separate comparisons; a result from one does not qualify the other.
12
12
 
13
- The earlier qualification preparation used the box-confirmation recipe documented below. That preparation is historical and is superseded by the region-segmentation implementation described in the next section. The earlier [categorical neutral-instruction recipe](evidence/v02/categorical-vision-method-selection.json) used the [v4 frozen 80-case input/source closure](evidence/v02/categorical-heldout-run-freeze-20261020-v4.json). Its [dispatch authorization](evidence/v02/categorical-heldout-dispatch-authorization-20261020-v4.json) records 451 passing local tests, all four Windows/Linux CI jobs, installed-archive checks and the completed monotonic resource gate for that snapshot. Candidate80 and photo-only no-image40 completed serially before independent evaluation. The [v4 heldout result failed](evidence/v02/categorical-heldout-v4/README.md): one correct whole-object box on 60 positives, zero false locations on 20 negatives, and paired-photo interval [0, 0.10], whose lower bound must be positive. Classification is 69/80 and does not qualify localization. Initial mask coverage omitted the separately indexed references; differing annotation canvases remain explicit and cannot repair the box/paired result. This cohort is now exposed regression data. A changed method requires a separately named development comparison and a fresh blind cohort. Earlier experimental branches below are preserved history, not instructions to select a runner-up from the failed heldout.
13
+ The earlier qualification preparation used the box-confirmation recipe documented below. That preparation is historical and is superseded by the region-segmentation implementation described in the next section. The earlier [categorical neutral-instruction recipe](evidence/v02/categorical-vision-method-selection.json) used the [v4 frozen 80-case input/source closure](evidence/v02/categorical-heldout-run-freeze-20261020-v4.json). Its [dispatch authorization](evidence/v02/categorical-heldout-dispatch-authorization-20261020-v4.json) records 451 passing local tests, all four Windows/Linux CI jobs, installed-archive checks and the completed monotonic resource gate for that snapshot. Candidate80 and photo-only no-image40 completed serially before independent evaluation. The [v4 heldout result failed](https://github.com/zoomplus/zorya-classifier/blob/36818582091bfd19951631f358183bdb9ffd1e11/docs/evidence/v02/categorical-heldout-v4/README.md): one correct whole-object box on 60 positives, zero false locations on 20 negatives, and paired-photo interval [0, 0.10], whose lower bound must be positive. Classification is 69/80 and does not qualify localization. Initial mask coverage omitted the separately indexed references; differing annotation canvases remain explicit and cannot repair the box/paired result. This cohort is now exposed regression data. A changed method requires a separately named development comparison and a fresh blind cohort. Earlier experimental branches below are preserved history, not instructions to select a runner-up from the failed heldout.
14
14
 
15
15
  ## Current checked region-segmentation implementation
16
16
 
@@ -76,7 +76,7 @@ The repaired [DEV2 run](evidence/v02/dev2-proposal-evaluation.md) completed with
76
76
 
77
77
  Additional ordinary-model screens must distinguish unsupported API configurations from visual errors. Preserve the incomplete JSON-Schema Qwen screen and the ordinary-Luna 45-second timeout results. Probe actual multi-image route compatibility before an expanded run, without automatic format/model/provider fallback. A differently configured deadline or response format is a separately named and frozen development recipe; it does not repair earlier rows. The public default deadline remains 45 seconds. Timings collected while native stress is running are diagnostic and cannot rank latency. Keep per-case native metadata and physical request accounting independent when overlapping operations.
78
78
 
79
- The first proposal resource report used wall-clock phase accounting and could not prove the full physical duration. Its measurements remain historical. The replacement resource harness is frozen at `261dc23`: monotonic deadlines, at least 600 seconds warmup, 6,540 busy seconds, two 30-second idle windows, five-second samples, and an independent process/kernel-uptime witness. The complete replacement run passed its monotonic-duration, memory and owned-child gates; see [the pinned receipt](evidence/v02/proposal-resource-soak-261dc23.md). The earlier incomplete duration proof remains preserved. The public runtime itself already uses monotonic operation durations and owned deadline timers.
79
+ The first proposal resource report used wall-clock phase accounting and could not prove the full physical duration. Its measurements remain historical. The replacement resource harness is frozen at `261dc23`: monotonic deadlines, at least 600 seconds warmup, 6,540 busy seconds, two 30-second idle windows, five-second samples, and an independent process/kernel-uptime witness. The complete replacement run passed its monotonic-duration, memory and owned-child gates; see [the pinned receipt](https://github.com/zoomplus/zorya-classifier/blob/36818582091bfd19951631f358183bdb9ffd1e11/docs/evidence/v02/proposal-resource-soak-261dc23.md). The earlier incomplete duration proof remains preserved. The public runtime itself already uses monotonic operation durations and owned deadline timers.
80
80
 
81
81
  The first split-port vision experiment assigned closed spatial Choices and independent Noul predicates to separate caller-supplied adapters. Its [DEV6 pilot failed](evidence/v02/split-choice-noul-dev6.md): classification 4/6, positive whole-object matches 0/2, zero false locations on four negatives and one failed negative localization. It is ineligible for full DEV40 dispatch; preserve its source, outputs, failures and unknown cost.
82
82
 
@@ -187,4 +187,4 @@ Update README/Russian README, API, architecture, operations, provenance/licenses
187
187
 
188
188
  The owner reconfirmed npm publication and discoverability on 2026-10-20. At release, update npm keywords and GitHub repository topics to match the capabilities actually qualified and shipped, create the version tag and release notes, publish the reviewed archive, and verify the registry version/dist-tag and GitHub/npm links. Update usage examples and measured-results documentation before publication. Do not tag an unqualified research method as a supported public feature.
189
189
 
190
- The replacement monotonic resource gate completed on frozen source `261dc23`: [duration, memory and owned-process evidence](evidence/v02/proposal-resource-soak-261dc23.md). The repaired `d684259` CI run passed all four Windows/Linux × Node 22/24 jobs. The categorical heldout producers and independent evaluator use separate explicit profile identities; a new freeze must pin their actual executable source and canonical inputs before any dispatch.
190
+ The replacement monotonic resource gate completed on frozen source `261dc23`: [duration, memory and owned-process evidence](https://github.com/zoomplus/zorya-classifier/blob/36818582091bfd19951631f358183bdb9ffd1e11/docs/evidence/v02/proposal-resource-soak-261dc23.md). The repaired `d684259` CI run passed all four Windows/Linux × Node 22/24 jobs. The categorical heldout producers and independent evaluator use separate explicit profile identities; a new freeze must pin their actual executable source and canonical inputs before any dispatch.
package/docs/README.ru.md CHANGED
@@ -6,19 +6,35 @@
6
6
 
7
7
  Сравнение шести способов передачи изображения текстом завершено на свежих фотографиях и реальном интерфейсе: ни один не прошёл требования локализации. [Результаты и ограничения](evidence/v02/fresh-text/README.md) сохранены, публичный экспериментальный режим явно возвращает `UNSUPPORTED`.
8
8
 
9
- Zorya Classifier — библиотека для Node.js и TypeScript, которая помогает приложению принимать решения по тексту и изображениям. Библиотека не выбирает и не подключает модель за приложение: клиент получает явно переданный `DecisionPort` — готовый адаптер с выбранными настройками или собственную реализацию. Модель и провайдер в примерах — лишь варианты интеграции, не значения по умолчанию. Код распространяется по MIT; веса модели в поставку не входят, запросы удалённых моделей оплачиваются отдельно; можно подключить и свой локальный сервер. Совместимость и качество зависят от выбранного маршрута. Более мощная модель может помочь, но улучшение точности не гарантировано. Проверенные комбинации и результаты перечислены в [таблице моделей](vision-results.md).
9
+ Zorya Classifier — библиотека для Node.js и TypeScript с поддерживаемой классификацией по тексту и изображениям и экспериментальной, не квалифицированной для общего применения пространственной локализацией и извлечением объектов. Библиотека не выбирает и не подключает модель за приложение: клиент получает явно переданный `DecisionPort` — готовый адаптер с выбранными настройками или собственную реализацию. Модель и провайдер в примерах — лишь варианты интеграции, не значения по умолчанию. Код распространяется по MIT; веса модели в поставку не входят, запросы удалённых моделей оплачиваются отдельно; можно подключить и свой локальный сервер. Совместимость и качество зависят от выбранного маршрута. Более мощная модель может помочь, но улучшение точности не гарантировано. Проверенные комбинации и результаты перечислены в [таблице моделей](vision-results.md).
10
10
 
11
11
  Это самостоятельная библиотека: ей не нужны Zorya Games, Electron, база данных или игровой процесс. Её можно встроить в сервер, бота, инструмент обработки фотографий или собственный HTTP-сервис. Готовый постоянно работающий HTTP-сервер в пакет не входит.
12
12
 
13
+ ## Статус возможностей
14
+
15
+ Дальнейшие эксперименты по точности пространственных сценариев остановлены; ни одна стратегия локализации, извлечения или предложений масок не продвигается для общего использования. Исторические метрики в `docs/evidence/**` сохранены без переинтерпретации.
16
+
17
+ | Возможность | Статус | Примечание |
18
+ | --------------------------------------------- | ---------------- | ------------------------------------------------------------------------------ |
19
+ | `classify` с явным `DecisionPort` | Поддерживается | Один закрытый ID класса; без заявления об универсальной точности модели |
20
+ | `locate` (сетка регионов) | Экспериментально | Гипотеза по ячейке, не геометрия целого объекта и не доказательство отсутствия |
21
+ | `RefinementPort` | Экспериментально | Без общей квалификации качества |
22
+ | `locate({ mode: 'whole-object' })` | Экспериментально | Интервалы или сегментация вызывающего; без квалификации |
23
+ | `extract`, `SegmentationPort`, проверка рамки | Экспериментально | Структурный успех ≠ семантическая точность маски |
24
+ | `objectProposals`, нативные фабрики | Экспериментально | На стороне вызывающего; без квалификации |
25
+ | `experimental-text` | Отклонено | `UNSUPPORTED`, пока профиль не пройдёт отбор |
26
+
27
+ Heldout region-seeded (один задокументированный рецепт): 26/60 попаданий seed на позитивах; 8/60 полных рамок объекта; на 30 эталонных масках — 8 с IoU 0,8, 3 неудачи, 19 без предсказания. H8 DEV: 7/9 позитивов и 2/3 ложных выхода, без квалификации. Узкий исторический admission — не общая пространственная квалификация.
28
+
13
29
  ## Что умеет
14
30
 
15
- | Задача | API | Результат |
16
- | ---------------------------------------------------------- | ----------------------------------- | --------------------------------------------------------------------------------- |
17
- | Распределить обращения по отделам, определить намерение | `classify` с текстом | Один из заданных классов и ранжирование вариантов |
18
- | Проверить наличие объекта или выбрать категорию фотографии | `classify` с изображением | Один из заданных классов |
19
- | Оценить изображение с текстовым условием | `classify` с текстом и изображением | Класс с учётом обоих входов |
20
- | Найти примерную область предмета, значка или указателя | `locate` | Ячейка в координатах исходного изображения либо явная неопределённость/отсутствие |
21
- | Получить маску, рамку, центр и прозрачный вырез предмета | `extract` с явным сегментатором | Геометрия и вырез, выведенные из пикселей маски |
31
+ | Задача | Статус | API | Результат |
32
+ | ---------------------------------------------------------- | ---------------- | ----------------------------------- | --------------------------------------------------------------------------------- |
33
+ | Распределить обращения по отделам, определить намерение | Поддерживается | `classify` с текстом | Один из заданных классов и ранжирование вариантов |
34
+ | Проверить наличие объекта или выбрать категорию фотографии | Поддерживается | `classify` с изображением | Один из заданных классов |
35
+ | Оценить изображение с текстовым условием | Поддерживается | `classify` с текстом и изображением | Класс с учётом обоих входов |
36
+ | Найти примерную область предмета, значка или указателя | Экспериментально | `locate` | Ячейка в координатах исходного изображения либо явная неопределённость/отсутствие |
37
+ | Получить маску, рамку, центр и прозрачный вырез предмета | Экспериментально | `extract` с явным сегментатором | Геометрия и вырез, выведенные из пикселей маски |
22
38
 
23
39
  Для `extract` после сегментации модель получает исходную картинку с рамкой маски и отметкой прежней найденной области. Она выбирает один ответ: весь видимый объект внутри, нужно расширение или определить не удалось. При необходимости сегментатор один раз ищет внешнюю маску, содержащую прежние пиксели; её рамка проверяется повторно. Максимум получается пять модельных запросов: три на поиск области и два на проверку. Если подтверждения нет, библиотека возвращает неопределённость без частичного выреза. `verification` сохраняет проверки и результат расширения. Рамка и центр всегда вычисляются из маски; проверка рамки не гарантирует точности каждого пикселя. Своя модель подключается через `DecisionPort`, отдельная проверка — через `segmentationBoxCheck`.
24
40
 
@@ -111,9 +127,9 @@ const result = await client.classify({
111
127
 
112
128
  Для одной картинки поле `text` можно опустить. Принимаются `Uint8Array` и `Buffer` с одним PNG/JPEG/WebP: до 16 MiB и 16 777 216 декодированных пикселей. Ссылки на изображения публичный API не загружает — скачивание, права доступа и ограничения внешних URL остаются у вызывающего приложения.
113
129
 
114
- ## Поиск объекта и координаты
130
+ ## Поиск объекта и координаты (экспериментально)
115
131
 
116
- Также внутри `try`:
132
+ Обычный `locate` экспериментален и не квалифицирован для общего применения. Также внутри `try`:
117
133
 
118
134
  ```js
119
135
  const result = await client.locate({
@@ -254,5 +270,5 @@ npm run format:check
254
270
  - [Архитектура](architecture.md): слои, порты, отмена и владение ресурсами.
255
271
  - [Эксплуатация](operations.md): интеграция в сервис, расходы и завершение работы.
256
272
  - [Воспроизведение benchmark](benchmarks.md): лицензированные фотографии и отдельный запуск платных проверок.
257
- - [Безопасность](../SECURITY.md): ключи, Git, npm-архивы и ограничения сканирования.
273
+ - [Безопасность](https://github.com/zoomplus/zorya-classifier/blob/main/SECURITY.md): ключи, Git, npm-архивы и ограничения сканирования.
258
274
  - [Подготовка публикации](publishing.md): GitHub/npm и необходимая авторизация владельца.
@@ -1,6 +1,6 @@
1
1
  # Acceptance: standalone library
2
2
 
3
- This acceptance concerns the extracted MIT Node.js library, not the Zorya desktop application, installer, microphone or game session. The caller supplies a `DecisionPort` or explicitly configures an adapter; model/provider recipes below are examples, not library defaults. Ordinary vision chat, direct OpenAI-compatible servers and native decisions are all supported. Jev is optional historical compatibility.
3
+ This acceptance concerns the extracted MIT Node.js library, not the Zorya desktop application, installer, microphone or game session. The caller supplies a `DecisionPort` or explicitly configures an adapter; model/provider recipes below are examples, not library defaults. Closed `classify` and explicitly configured provider/transport adapters are supported integration paths. Region `locate`, whole-object location, extraction, `RefinementPort`, segmentation/box-check composition, `objectProposals`, and native segmentation factories are experimental and unqualified; public API symbols carry `@experimental`. Further spatial accuracy experiments are stopped; no strategy is promoted. Jev is optional historical compatibility.
4
4
 
5
5
  ## Current 0.2 acceptance
6
6
 
@@ -49,13 +49,13 @@ The [two-hour `450439c` proposal baseline](evidence/v02/proposal-resource-soak-4
49
49
 
50
50
  The integrated executable passes 471 Linux offline tests, formatting, strict source checks and the installed-archive consumer at `9f85acc`. [All four Windows/Linux × Node 22/24 jobs passed for `9f85acc`](evidence/v02/ci-9f85acc.json), including the new HELDOUT profiles, evaluator metadata correction, explicit-thread resource harness, archive and formatting steps. [The `6f9cc15` run](evidence/v02/ci-6f9cc15.json), [the `e0c190b` run](evidence/v02/ci-e0c190b.json), [the `c35f67d` run](evidence/v02/ci-c35f67d.json) and [the earlier `450439c` run](evidence/v02/ci-450439c.json) remain preserved. [Native Windows installed-archive acceptance](evidence/v02/native-proposal-windows-450439c.json) passes on the changed runtime: eight child starts/closes, none left, physical cancellation and caller ownership. Its 107-file installed manifest matches the reviewed archive exactly. Independent Gitleaks scanned 104 commits / 8.58 MB with no findings. The evaluator-only metadata correction passes these source checks and does not change runtime or scoring. Earlier [c107 CI](evidence/v02/ci-c107ddf.json) and [integration evidence](evidence/v02/integration-25c19cd.json) remain preserved. Final release source still needs its own checks.
51
51
 
52
- The frozen runtime used for v4 had all 53 source files and 106 compiled runtime files byte-identical to `0c365cb`. The new box-confirmation development hypothesis changes the proposal process and presenter, so the historical native/resource receipts below do not automatically cover its new bytes. Fresh native Windows acceptance has passed; the new two-thread resource run remains active. The first proposal resource run completed its configured wall-clock phases, but its observed process lifetime and summed monotonic operation durations did not prove the required physical duration. It is retained as historical evidence. Replacement harness `261dc23` uses monotonic phase deadlines, enforces the full duration minima, and has a separate kernel-uptime observer. Its [fresh two-hour run passed](evidence/v02/proposal-resource-soak-261dc23.md): 7,212.6 monotonic seconds, an independent live process-age witness at 7,200.68 seconds, and 2,158 native starts/closes in the measurement window with none left. Idle heap, external and array-buffer growth pass the fixed limits; RSS grew 115.76 MiB, below the 128 MiB threshold. Root independently checked parity of all 55 pinned files. This fixture run establishes resource/lifecycle behavior; its shared-host timing does not qualify model quality or production latency.
52
+ The frozen runtime used for v4 had all 53 source files and 106 compiled runtime files byte-identical to `0c365cb`. The new box-confirmation development hypothesis changes the proposal process and presenter, so the historical native/resource receipts below do not automatically cover its new bytes. Fresh native Windows acceptance has passed; the new two-thread resource run remains active. The first proposal resource run completed its configured wall-clock phases, but its observed process lifetime and summed monotonic operation durations did not prove the required physical duration. It is retained as historical evidence. Replacement harness `261dc23` uses monotonic phase deadlines, enforces the full duration minima, and has a separate kernel-uptime observer. Its [fresh two-hour run passed](https://github.com/zoomplus/zorya-classifier/blob/36818582091bfd19951631f358183bdb9ffd1e11/docs/evidence/v02/proposal-resource-soak-261dc23.md): 7,212.6 monotonic seconds, an independent live process-age witness at 7,200.68 seconds, and 2,158 native starts/closes in the measurement window with none left. Idle heap, external and array-buffer growth pass the fixed limits; RSS grew 115.76 MiB, below the 128 MiB threshold. Root independently checked parity of all 55 pinned files. This fixture run establishes resource/lifecycle behavior; its shared-host timing does not qualify model quality or production latency.
53
53
 
54
54
  The [first frozen blind candidate](evidence/v02/heldout-evaluation-20261020.md) failed: 3/60 positive whole-object boxes matched, there were 2/20 false locations against a limit of one, and the paired photo bootstrap interval was [0, 0.20], whose lower bound must be positive. Four of six scored mask instances reached IoU 0.8; nineteen reference instances were unavailable. Mask and box metrics remain separate. The no-image control completed all 40 photos with no successful location. No alternative is selected from these revealed heldout results.
55
55
 
56
56
  The [six-case split Choice/NoUL pilot](evidence/v02/split-choice-noul-dev6.md) failed its predeclared positive gate: classification 4/6, positive whole-object matches 0/2, false locations 0/4 verified negatives, and one failed localization. The [split categorical-presence follow-up](evidence/v02/categorical-presence-dev6.md) also produced no locations. Neither failed split profile advanced to full DEV40.
57
57
 
58
- The distinct native categorical batch comparison completed both original DEV40 profiles: [preserving the neutral instruction](evidence/v02/categorical-dev40-preserve.json) reached 3/30 positive whole-object matches, while [target alone](evidence/v02/categorical-dev40-target-only.json) reached 0/30. Both classify 35/40 and have zero false locations on ten negatives. Preserving the instruction is [frozen as the development selection](evidence/v02/categorical-vision-method-selection.json), before new heldout pixels or per-case truth were opened. Its eight 502 failures and eight unknown charges remain counted. The second profile has four such failures. Timing is unranked under concurrent native stress; no latency tie-break was needed. This caller-owned recipe does not become a library default or qualify blind accuracy. The new 80-case cohort has independent photo, controlled Mousepad UI and controlled Minetest minimap source oracles. Its [first setup attempt failed before HTTP](evidence/v02/categorical-heldout-predispatch-20261020-v3.json); the separate [v4 freeze](evidence/v02/categorical-heldout-run-freeze-20261020-v4.json) binds the corrected common photo instruction, unchanged images/targets/truth and the exact executable producer closure. Both measurements completed before independent truth evaluation. The [v4 result failed qualification](evidence/v02/categorical-heldout-v4/README.md): 1/60 positive whole-object boxes, zero false locations on 20 negatives, and paired photo bootstrap interval [0, 0.10]. Classification is 69/80, including ten false positives; the no-image control has zero positive locations. All 456 physical calls, seven unknown charges and failures remain counted. The initial mask section has no joined references; the separate official index has 32 masks on 21 photos, with 30 masks using a different full-frame canvas. A separate exploratory normalized-canvas calculation records seven scored reference instances, three at IoU 0.8, and 25 unavailable predictions; exact alignment remains unqualified and cannot change the box/paired failure. These cases are now exposed regression data; a changed method requires new development and a fresh blind cohort.
58
+ The distinct native categorical batch comparison completed both original DEV40 profiles: [preserving the neutral instruction](evidence/v02/categorical-dev40-preserve.json) reached 3/30 positive whole-object matches, while [target alone](evidence/v02/categorical-dev40-target-only.json) reached 0/30. Both classify 35/40 and have zero false locations on ten negatives. Preserving the instruction is [frozen as the development selection](evidence/v02/categorical-vision-method-selection.json), before new heldout pixels or per-case truth were opened. Its eight 502 failures and eight unknown charges remain counted. The second profile has four such failures. Timing is unranked under concurrent native stress; no latency tie-break was needed. This caller-owned recipe does not become a library default or qualify blind accuracy. The new 80-case cohort has independent photo, controlled Mousepad UI and controlled Minetest minimap source oracles. Its [first setup attempt failed before HTTP](evidence/v02/categorical-heldout-predispatch-20261020-v3.json); the separate [v4 freeze](evidence/v02/categorical-heldout-run-freeze-20261020-v4.json) binds the corrected common photo instruction, unchanged images/targets/truth and the exact executable producer closure. Both measurements completed before independent truth evaluation. The [v4 result failed qualification](https://github.com/zoomplus/zorya-classifier/blob/36818582091bfd19951631f358183bdb9ffd1e11/docs/evidence/v02/categorical-heldout-v4/README.md): 1/60 positive whole-object boxes, zero false locations on 20 negatives, and paired photo bootstrap interval [0, 0.10]. Classification is 69/80, including ten false positives; the no-image control has zero positive locations. All 456 physical calls, seven unknown charges and failures remain counted. The initial mask section has no joined references; the separate official index has 32 masks on 21 photos, with 30 masks using a different full-frame canvas. A separate exploratory normalized-canvas calculation records seven scored reference instances, three at IoU 0.8, and 25 unavailable predictions; exact alignment remains unqualified and cannot change the box/paired failure. These cases are now exposed regression data; a changed method requires new development and a fresh blind cohort.
59
59
 
60
60
  The [paired segmentation component comparison](evidence/v02/segmentation/component-comparison-summary.json) uses the same five public DEV photos and independent masks for both MobileSAM and GrabCut. Its corrected, oracle-assisted seed panel gives mean per-case mask IoU 0.859 versus 0.595; its 53-file runtime snapshot matches `c107ddf`, before the two later proposal prompt/presentation changes. The native backend implementations are unchanged. This supports a component comparison under supplied geometry, not end-to-end accuracy or a library-selected backend.
61
61
 
@@ -95,7 +95,7 @@ The release is **not qualified or published yet**. The following table and parag
95
95
 
96
96
  Whole-object location, explicit extraction, optional native adapters and CLI are implemented and integrated. [Snapshot evidence](evidence/v02/integration-8010aad.json) records source commit, actual installed-archive hash and check results. The 254-test snapshot passed source gates and the independent consumer tested the old and new APIs with zero provider HTTP calls. Subsequent diagnostic/corpus integration passed 256 tests; these counts are offline evidence, not model accuracy.
97
97
 
98
- The installed consumer imports core and segmentation entries and compiles declarations without ONNX Runtime. It exercises cutout/mask output with a controlled segmenter and proves caller ownership. The [native CPU smoke](../benchmarks/v02/native-smoke-evidence.md) separately exercised real MobileSAM on five licensed dev photographs with independent instance masks. These are distinct tests.
98
+ The installed consumer imports core and segmentation entries and compiles declarations without ONNX Runtime. It exercises cutout/mask output with a controlled segmenter and proves caller ownership. The [native CPU smoke](https://github.com/zoomplus/zorya-classifier/blob/main/benchmarks/v02/native-smoke-evidence.md) separately exercised real MobileSAM on five licensed dev photographs with independent instance masks. These are distinct tests.
99
99
 
100
100
  The configured two-hour Linux CPU resource run completed against the frozen native sources of `8010aad`: ten minutes of warmup followed by two idle windows and the 6,540-second busy phase. Its [numeric report](evidence/v02/resource-soak-linux-8010aad.json) records 4,756 segmented operations, matching child starts/closes and no owned children left. Before/after idle-median growth was approximately 7.4 MiB heap, 11.2 MiB external, 6.2 MiB array buffers and 43.8 MiB RSS, within the plan's thresholds. Sampling was scheduled every five seconds; actual gaps are recorded. Native Windows CPU component acceptance passed against the pinned installed archive: imports/declarations, real inference, cancellation, queue capacity and disposal left zero owned children. The [hardened report](evidence/v02/native-windows-eea1790.json) separates those lifecycle checks from mask quality. These tests use oracle boxes, not end-to-end localization. Live whole-object qualification and the experimental encoder's independent development/heldout gates remain pending. Historical 0.1 results below do not qualify these additions.
101
101
 
@@ -105,7 +105,7 @@ The subsequent [CI run for `9d00fe5`](evidence/v02/ci-9d00fe5.json) passed all f
105
105
 
106
106
  All six text-image encoders remain research-only. The [fresh independent comparison](evidence/v02/fresh-text/README.md) is complete for photographs and real UI: every encoder has zero correct whole-object matches, and some violate the negative-case gate. None qualifies for heldout promotion. The initial classification harness defect and corrected classification-only follow-ups are preserved separately; they do not overwrite the localization runs. Failed protocol/rate-limit/truncated-generation diagnostics remain recorded. The public experimental image selector rejects explicitly. Historical controlled map/UI renders with model-assisted labels remain an exploratory supplement: their source licensing and split are recorded, but they do not close the independent-ground-truth gate.
107
107
 
108
- Subsequent [whole-object prompt/presentation experiments](evidence/v02/boundary-variants.md) found one correctly bounded Car example after removing the separate seed crop and outlining that seed on the original. Boat still returned unknown; this is development evidence, not qualification. A [controlled real-UI oracle](../benchmarks/v02/corpus/dev-independent-ui/README.md) now independently derives seven button boxes from GTK accessibility allocations and verifies all painted edges in the captured pixels. Its three negatives are scoped to the completely inventoried visible toolbar. It is one controlled source family, not a diverse natural-UI benchmark.
108
+ Subsequent [whole-object prompt/presentation experiments](evidence/v02/boundary-variants.md) found one correctly bounded Car example after removing the separate seed crop and outlining that seed on the original. Boat still returned unknown; this is development evidence, not qualification. A [controlled real-UI oracle](https://github.com/zoomplus/zorya-classifier/blob/main/benchmarks/v02/corpus/dev-independent-ui/README.md) now independently derives seven button boxes from GTK accessibility allocations and verifies all painted edges in the captured pixels. Its three negatives are scoped to the completely inventoried visible toolbar. It is one controlled source family, not a diverse natural-UI benchmark.
109
109
 
110
110
  The five-photo native reports also retain a subsequently discovered fixture limitation: the original Hat seed contains zero ground-truth foreground pixels, and the Cat seed center is background. Their historical results are preserved. These invalid or ambiguous grounding prompts must not be interpreted as a clean segmentation-quality comparison; corrected oracle prompts require a separate manifest and report. This does not change the physical lifecycle/resource scope of the original run.
111
111
 
package/docs/api.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Public API
2
2
 
3
+ Spatial localization, whole-object location, extraction, `RefinementPort`, caller-owned segmentation/box-check composition, `objectProposals`, and native segmentation factories are **experimental and unqualified** for general use (TypeScript `@experimental` on the corresponding public types and methods). Closed `classify` and explicitly configured `DecisionPort`/transport adapters remain supported; they do not imply universal model accuracy. Further spatial accuracy experiments are stopped; no strategy is promoted.
4
+
3
5
  `createClassifier({ decision, timeoutMs?, concurrency?, maxQueue?, maxInputBytes?, refinement?, segmentation?, objectProposals? })` creates an owned client. Defaults: 45,000ms absolute budget including queue/image work/provider work; two active operations; sixteen waiters; 64 MiB total admitted input bytes, reserved before copying. Configured maxima: 120s, four active,32 queued,256 MiB admitted input. Input images are at most16MiB and16,777,216 decoded pixels, with source sides at most16,384; single PNG/JPEG/WebP only. The vision adapter accepts prepared PNG/JPEG with sides280..1568 and a32MiB total request cap. Byte inputs are copied before the first await, including Buffer views.
4
6
 
5
7
  The caller supplies the `DecisionPort`; the library never chooses a model, provider or endpoint. You may inject a port directly or explicitly construct one of the adapters below. Their model/provider values are examples or benchmark recipes, not defaults, and stronger models do not guarantee higher accuracy. Optional segmentation adapters are configured separately and require caller-installed runtime packages and caller-supplied local assets.
@@ -8,13 +10,13 @@ The [0.2 guide](v02-usage.md) documents `extract`, mask-derived `locate({ mode:
8
10
 
9
11
  `classify({ input, classes, instructions?, signal? })`: input is a string or `{ text?, image? }` with at least one field. Classes are2..255 distinct IDs plus descriptions. IDs match `[a-zA-Z][a-zA-Z0-9_-]*`; descriptions at most300 chars. Text is at most32,000 chars, custom instructions4,000. Define explicit none/other behavior in your classes. With ordinary vision models the result contains `choice` (first ranked ID), `ranking`, `probabilities: null`, `nativeChoice: null`, empty `tied`, and metadata. No rank is converted to a fabricated probability. Optional native integrations instead retain raw probabilities, stable maximum/ties, native choice/confidence and optional quantization annotation. Confidence is never a calibrated spatial guarantee.
10
12
 
11
- `locate({ image, target, exclusions?, roi?, signal? })`: target at most2,000 chars; up to16 exclusions of500 chars. ROI uses integer `left/top/width/height` in EXIF-oriented source pixels. Return coordinates reference that oriented image; metadata names this space and dimensions. Rectangles include left/top and exclude right/bottom. Normalized rectangle fields are divided by image dimensions. Tiny/impossible bounded grids return `unknown/layout-limit`.
13
+ `locate({ image, target, exclusions?, roi?, signal? })` (**experimental**): target at most2,000 chars; up to16 exclusions of500 chars. ROI uses integer `left/top/width/height` in EXIF-oriented source pixels. Return coordinates reference that oriented image; metadata names this space and dimensions. Rectangles include left/top and exclude right/bottom. Normalized rectangle fields are divided by image dimensions. Tiny/impossible bounded grids return `unknown/layout-limit`.
12
14
 
13
15
  `located` from default region mode returns a selected grid region, normalized region, third-stage selection evidence and optional refinement. `not-found/absent-in-evaluated-region` is based on the initial independent presence check. A target missing from later shortlisted cells yields `unknown/candidate-union-empty`, not global absence. Ordinary models return present/absent/unknown as an independent categorical predicate. Legacy Noul0.5 abstains; contradictory presence/selection returns unknown. Multiple physical matching objects are permitted; this is an any-instance locator. With an explicit `segmentation` port, `locate({ mode: 'whole-object' })` and `extract` use the region seed plus full-source segmentation; reported bounds and center come from the valid mask.
14
16
 
15
17
  The algorithm searches4×4 coarse cells, keeps four source-distinct maxima, pads each by half a coarse cell within ROI, partitions each into at most49 fine cells (global≤196, side≤256), then compares the four best fine cells as enlarged A–D/none. Edges count as matches. Scores/rank hints are not sent to the final comparison. No cell-center correction is presented as object segmentation.
16
18
 
17
- `RefinementPort.refine({ image, target, region, signal })` is optional trusted code. It receives a private oriented-source byte copy. A returned refined rectangle must fit the source and intersect the selected cell. It does not replace the original area evidence. No built-in heavy refiner is downloaded.
19
+ `RefinementPort.refine({ image, target, region, signal })` (**experimental**) is optional trusted code. It receives a private oriented-source byte copy. A returned refined rectangle must fit the source and intersect the selected cell. It does not replace the original area evidence. No built-in heavy refiner is downloaded.
18
20
 
19
21
  `dispose()` cancels current/queued work, rejects further calls and waits for physical settlement. Injected ports must honor cancellation. Native image work retains its concurrency slot until completion, even if cancellation has already been requested.
20
22
 
@@ -1,5 +1,7 @@
1
1
  # Architecture and lifecycle
2
2
 
3
+ Closed `classify` and injected `DecisionPort`/adapter transport are supported integration paths. Region `locate`, whole-object location, extraction, `RefinementPort`, caller-owned segmentation and box-check composition, `ObjectProposalPort`, and explicit native segmentation factories are experimental and unqualified; they are labeled `@experimental` on the public API. No spatial or extraction strategy is promoted; evidence under `docs/evidence/**` remains historical.
4
+
3
5
  The public factory composes the caller-supplied `DecisionPort` and a Sharp-backed `RasterPort`. The library does not select a model, provider or endpoint; applications either inject an existing port or explicitly build one with a supported adapter. Processes orchestrate classify/locate; features contain pure Choice interpretation, grid geometry and prompt construction; entities define validated public contracts; infrastructure owns provider HTTP and image processing. No application runtime, game-state schema or workspace import is required.
4
6
 
5
7
  The primary 0.2 object path preserves the original region locator. Its selected seed prompts an explicitly configured segmenter on the full oriented source image; actual mask pixels determine bounds, center and the optional cutout. A generic closed containment checker receives the full source with the mask-derived box and original seed anchor. It uses the injected decision port and a presentation port; the process allows at most one actual enclosing-mask correction and a final check. The segmenter can implement optional `expand`; corrected foreground must strictly contain the old visible foreground and grow the real box within the hard ROI. The process rejects unresolved checks without publishing a partial cutout. Its absolute deadline, cancellation and byte ownership cover every stage. No additional extent search or model-generated coordinates are used. `locate({ mode: 'whole-object' })` and `extract` use the same mask-derived geometry when a segmenter is configured. Boundary-interval location and `ObjectProposalPort` remain optional legacy strategies with their own request flows.
@@ -14,7 +14,7 @@ Offline fixture tests validate mechanics only. Actual provider outcomes are reco
14
14
 
15
15
  ## 0.2 checked region and segmentation recipe
16
16
 
17
- The [region-seeded runner](../benchmarks/v02/region-seeded-runner.md) records the original region search separately from full-source segmentation and up to two closed visible-box checks. The caller configures the model, native adapter and presence guard explicitly. Its [v3 development freeze](evidence/v02/region-seeded-development-freeze-20261021-v3.json), [prospective control-R2 correction](evidence/v02/region-seeded-development-control-r2-freeze-20261021.json) and [independent results](evidence/v02/region-seeded-dev-v3-control-r2/README.md) retain the original identity-authoring failure. A separate offline verifier rejects reuse of candidate prompt policies in the control identity before dispatch.
17
+ The [region-seeded runner](https://github.com/zoomplus/zorya-classifier/blob/main/benchmarks/v02/region-seeded-runner.md) records the original region search separately from full-source segmentation and up to two closed visible-box checks. The caller configures the model, native adapter and presence guard explicitly. Its [v3 development freeze](evidence/v02/region-seeded-development-freeze-20261021-v3.json), [prospective control-R2 correction](evidence/v02/region-seeded-development-control-r2-freeze-20261021.json) and [independent results](evidence/v02/region-seeded-dev-v3-control-r2/README.md) retain the original identity-authoring failure. A separate offline verifier rejects reuse of candidate prompt policies in the control identity before dispatch.
18
18
 
19
19
  The historical hash helper serializes JSON in insertion order; it does not sort every object's keys. Freeze the exact producer-shaped object for each variant, including its distinct prompt policy. Reordering a spread can change its digest even when the values look equivalent. Keep failed pre-dispatch drafts rather than changing the historical hash algorithm. The [all-attempt ledger](evidence/v02/region-seeded-dev-v3-control-r2/attempt-accounting.json) includes charges from the original unscored control as well as the valid pair.
20
20
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Configure a trusted model endpoint or the optional OpenRouter route. SDK factories receive endpoint/model/key explicitly; the core knows only DecisionPort. Keep server-specific credentials separate from OpenRouter credentials. Store keys in ignored local files or a secret manager. No startup request is made.
4
4
 
5
- CLI requires `ZORYA_MODEL` and defaults to `ZORYA_MODE=decisions`. For ordinary vision models/custom chat servers choose `ZORYA_MODE=chat`. OpenRouter mode requires `OPENROUTER_API_KEY` and `ZORYA_PROVIDER`; direct mode uses a full `ZORYA_ENDPOINT` with optional separate `ZORYA_API_KEY`, and never forwards the OpenRouter key. In chat mode, optional `ZORYA_REASONING_EFFORT` and `ZORYA_RESPONSE_FORMAT` must be supported by the chosen endpoint. Use `zorya-classifier --help`. Commands: classify-text text classes.json; classify-image image classes.json; locate image target. CLI calls real paid models. Native images are decoded locally through Sharp; external requests send prepared text/images to the configured route. The library neither writes nor logs media by default.
5
+ CLI requires `ZORYA_MODEL` and defaults to `ZORYA_MODE=decisions`. For ordinary vision models/custom chat servers choose `ZORYA_MODE=chat`. OpenRouter mode requires `OPENROUTER_API_KEY` and `ZORYA_PROVIDER`; direct mode uses a full `ZORYA_ENDPOINT` with optional separate `ZORYA_API_KEY`, and never forwards the OpenRouter key. In chat mode, optional `ZORYA_REASONING_EFFORT` and `ZORYA_RESPONSE_FORMAT` must be supported by the chosen endpoint. Use `zorya-classifier --help`. Commands: classify-text and classify-image are supported; locate and extract are experimental and unqualified (see README capability table). CLI calls real paid models. Native images are decoded locally through Sharp; external requests send prepared text/images to the configured route. The library neither writes nor logs media by default.
6
6
 
7
7
  Choose a finite timeout based on your UI needs. Default 45s includes queue time; no latency SLA is asserted. Handle CAPACITY by applying upstream backpressure rather than creating more clients. Explicitly cancel superseded application requests and call dispose on shutdown. A cancelled native job may finish before its slot is released; this prevents unbounded physical concurrency.
8
8
 
@@ -10,12 +10,12 @@ Unknown cost remains unknown. Budget your own calls or use the benchmark's conse
10
10
 
11
11
  Build release locally with npm run check and npm run pack:check. Produce npm pack only after those gates. Review LICENSE/NOTICE/acceptance and archive contents before publishing. Publication destinations are GitHub `zoomplus/zorya-classifier` and npm `zorya-classifier` under owner `zoomplus`. Authentication stays outside the repository. Check the remote release/registry and external receipt for actual publication state.
12
12
 
13
- Owner handoff and authentication steps are in [publishing](publishing.md). Secret scanning commands and their limits are in [SECURITY](../SECURITY.md); they run in Husky, source checks and the archive check. Release manifests live next to the prepared archives, outside Git/npm contents.
13
+ Owner handoff and authentication steps are in [publishing](publishing.md). Secret scanning commands and their limits are in [SECURITY](https://github.com/zoomplus/zorya-classifier/blob/main/SECURITY.md); they run in Husky, source checks and the archive check. Release manifests live next to the prepared archives, outside Git/npm contents.
14
14
 
15
15
  Compatibility with another image-capable model does not imply tested accuracy or support for all structured-output parameters. Choose prompt/JSON-object/JSON-schema mode according to server capabilities, inspect explicit failures and consult docs/vision-results.md. Never label generated ranks as calibrated probabilities.
16
16
 
17
17
  # 0.2 additions
18
18
 
19
- Whole-object location, explicit extraction backends, CLI artifacts and ownership are described in [the 0.2 guide](v02-usage.md). The core input reservation is bounded across active and queued work; native admission rejects before expensive snapshots/base64. Keep a shared segmenter or object-proposal adapter alive until all owning clients have disposed. The optional CPU proposal adapter rejects sources above 2,097,152 pixels and packs at most 36 masks into a 10 MiB batch; it does not silently resize. Proposal selection is currently an API composition; the CLI retains the explicit interval/segmenter path. Raw native scores are uncalibrated diagnostics, never probability thresholds. Native calls currently start a fresh owned child each time; session reuse is not implemented. Do not extrapolate cold synthetic smoke timings into production latency or photo quality.
19
+ Whole-object location, explicit extraction backends, CLI artifacts and ownership are experimental and described in [the 0.2 guide](v02-usage.md). The core input reservation is bounded across active and queued work; native admission rejects before expensive snapshots/base64. Keep a shared segmenter or object-proposal adapter alive until all owning clients have disposed. The optional CPU proposal adapter rejects sources above 2,097,152 pixels and packs at most 36 masks into a 10 MiB batch; it does not silently resize. Proposal selection is currently an API composition; the CLI retains the explicit interval/segmenter path. Raw native scores are uncalibrated diagnostics, never probability thresholds. Native calls currently start a fresh owned child each time; session reuse is not implemented. Do not extrapolate cold synthetic smoke timings into production latency or photo quality.
20
20
 
21
- The [native resource harness](../benchmarks/v02/NATIVE-SMOKE.md) records independent parent samples, short-child memory, idle/busy phases, cancellation and child ownership without forcing garbage collection. A short harness verification is separate from the required two-hour resource run. Use an explicit corpus/asset manifest and preserve unsuccessful results.
21
+ The [native resource harness](https://github.com/zoomplus/zorya-classifier/blob/main/benchmarks/v02/NATIVE-SMOKE.md) records independent parent samples, short-child memory, idle/busy phases, cancellation and child ownership without forcing garbage collection. A short harness verification is separate from the required two-hour resource run. Use an explicit corpus/asset manifest and preserve unsuccessful results.
@@ -28,3 +28,9 @@ Use the original-region/full-source-segmentation workflow in the current usage g
28
28
  Before release, match every runtime file in the final archive to the bytes covered by native/resource acceptance, and require green Windows/Linux × Node 22/24 CI for the release source. A later documentation-only archive can have a different package SHA while retaining the tested runtime; record both complete archive hashes and the explicit runtime-file parity proof. Keep a final independently installed consumer check for the actual release archive.
29
29
 
30
30
  Keep the final release manifest outside its own archives to avoid self-reference. It records the clean source commit, archive hashes/integrities, model recipe and corpus seals, preserved failures, native/resource receipts, CI run and redacted secret scan. Publish those exact archive bytes, verify the registry response and dist-tag, then attach the matching source and npm artifact to the GitHub release. Do not replace failed accuracy or resource gates with an offline test count.
31
+
32
+ ## 0.2.1 release-candidate handoff
33
+
34
+ This branch prepares a local **0.2.1 release candidate** from the published **0.2.0** package baseline. Only experimental status documentation, JSDoc, CLI help, the package description, and a test-only Git fixture isolation fix in `test/secrets.test.ts` changed. There are no model, default, or algorithm/runtime behavior changes relative to 0.2.0. At local 0.2.1 release-candidate preparation time, npm and GitHub publication for 0.2.1 had not yet been recorded in this handoff; check the repository releases, npm registry entry, and external release receipt for the current publication state.
35
+
36
+ A failed pre-commit attempt during local release preparation is preserved in the maintainer’s local release-preparation logs. That failure led to the narrow test-only isolation fix so hook-provided `GIT_*` variables cannot redirect fixture repositories or mutate unrelated sentinel indexes during secret scans.
package/docs/v02-usage.md CHANGED
@@ -1,17 +1,19 @@
1
1
  # Region-seeded masks and extraction (0.2)
2
2
 
3
+ Everything in this guide—default region `locate`, `locate({ mode: 'whole-object' })`, `extract`, optional `RefinementPort`, `SegmentationPort`, box-check composition, `objectProposals`, and exported native factories—is **experimental and unqualified** for general use. Passing structural or lifecycle checks does not establish semantic object accuracy or mask quality. Further accuracy experiments on these paths are stopped; no spatial or extraction strategy is promoted. Historical metrics in `docs/evidence/**` are unchanged.
4
+
3
5
  The [accepted plan](0.2.0-plan.md) and [acceptance status](acceptance.md) distinguish implementation, offline checks, live quality and platform qualification. The frozen caller recipe passed admission with only 8/60 complete positive object boxes; 19/30 mask references had no prediction. Configure and test the model and segmenter for your own data. No text-image encoder qualified.
4
6
 
5
7
  The library does not select or connect a model. Supply a `DecisionPort` to `createClassifier`, either by implementing the port or explicitly constructing a provider adapter. The Luna examples below are reproducible integration recipes, not defaults or a claim that one model is always more accurate; stronger model capability does not guarantee monotonic accuracy gains. Optional local segmenters and proposal generators are configured separately, and their runtime packages and model assets remain the caller's responsibility.
6
8
 
7
9
  ## Choose the operation
8
10
 
9
- | Operation | Result | Model requests |
10
- | ------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------- |
11
- | `classify` | One supplied class | One |
12
- | `locate` (default / `mode: 'region'`) | A grid cell that may contain an object fragment | Up to three |
13
- | `locate` with `mode: 'whole-object'` and `segmentation` | Visible bounds and center derived from a mask | Up to five, plus local segmentation/correction |
14
- | `extract` with `segmentation` | Mask-derived bounds, center, transparent PNG, cropped mask and source offset | Up to five, plus local segmentation/correction |
11
+ | Operation | Status | Result | Model requests |
12
+ | ------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------- | ---------------------------------------------- |
13
+ | `classify` | Supported | One supplied class | One |
14
+ | `locate` (default / `mode: 'region'`) | Experimental | A grid cell that may contain an object fragment | Up to three |
15
+ | `locate` with `mode: 'whole-object'` and `segmentation` | Experimental | Visible bounds and center derived from a mask | Up to five, plus local segmentation/correction |
16
+ | `extract` with `segmentation` | Experimental | Mask-derived bounds, center, transparent PNG, cropped mask and source offset | Up to five, plus local segmentation/correction |
15
17
 
16
18
  The primary object workflow is the unchanged region locator followed by an explicitly configured segmenter. Segmentation receives the locator's seed prompt on the full EXIF-oriented source image; it does not receive a seed crop or treat the seed as an object box. Bounds and center come from actual foreground mask pixels. After the initial mask, a closed decision checks the original image with the actual mask box and original seed anchor: `complete`, `needs-expansion`, or `unknown`. It reuses the caller-supplied `DecisionPort`. An incomplete box permits one actual enclosing-mask correction and one final check; there is no separate extent search or generated model geometry. Default `locate` behavior remains compatible.
17
19
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## Current 0.2 region and extraction evidence
4
4
 
5
+ Region `locate`, whole-object location, `extract`, proposal/refinement strategies, and native segmentation adapters are **experimental and unqualified** for general use; figures below are historical evidence for one documented recipe, not a promotion or universal accuracy claim. Further spatial accuracy experiments are stopped. H8 DEV recorded 7/9 positives with 2/3 false outputs and did not qualify.
6
+
5
7
  The final [frozen v3 heldout report](evidence/v02/region-seeded-heldout-v3/README.md) evaluates all 80 cases per profile. Classification is 65/80; positive seed hits 26/60; complete object boxes 8/60; false seeds and extractions 0/20 negatives. Of 30 exact-canvas mask references, eight pass IoU 0.8, three fail and 19 have no prediction. Both positive-photo paired seed intervals are [0.500, 0.833]. These are separate metrics; a successful seed or containment decision does not guarantee a tight mask. Candidate accounting includes 266 physical calls, two HTTP 502 failures and two unknown charges. The control made 80 image-free calls. This one controlled corpus admission and the resource/native checks qualify the documented recipe only; model choice stays with the caller. Development and failed historical evidence below is preserved.
6
8
 
7
9
  The primary 0.2 flow retains the original three-Choice region search and uses its seed to segment the full oriented source. Only actual mask pixels determine the cutout, bounds and center. The caller's decision port then sees the full image with the actual box and seed anchor, choosing `complete`, `needs-expansion`, or `unknown`. One actual enclosing-mask correction and one final check are allowed. Unresolved results remain unknown. The caller chooses both ports; no model-generated coordinates or separate extent search are added.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zorya-classifier",
3
- "version": "0.2.0",
4
- "description": "Provider-independent text/image classification, whole-object localization and optional transparent cutouts for Node.js",
3
+ "version": "0.2.1",
4
+ "description": "Provider-independent classification with experimental localization and object extraction for Node.js",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "engines": {
@@ -1,35 +0,0 @@
1
- # Frozen categorical heldout v4: failed qualification
2
-
3
- Both producers completed on the frozen source and inputs before independent truth evaluation. The candidate completed 80 cases; its no-image control completed all 40 photographs. **The candidate does not qualify for release.** The [numeric report](report.json) binds the original run, source, input, truth and output hashes. The earlier [zero-HTTP admission failure](../categorical-heldout-predispatch-20261020-v3.json) remains a separate, unchanged record.
4
-
5
- | Measurement | Candidate | No-image control |
6
- | -------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------- |
7
- | Classification | 69/80: 59 true positives, 10 false positives, one false negative, ten true negatives | 10/40; predicted absent on every photograph |
8
- | Positive whole-object boxes | 1/60: photo 1/30, controlled UI 0/15, controlled minimap 0/15 | 0/30 photographs |
9
- | False locations | 0/20 negatives; limit one | 0/10 photograph negatives |
10
- | Paired positive-photo difference | 1/30; 95% bootstrap interval **[0, 0.10]** | Lower bound must be strictly positive |
11
- | Physical calls | 356; 349 HTTP 200, seven HTTP 502 | 100; all HTTP 200 |
12
- | Known cost | $0.1608769 plus seven unknown charges | $0.0540033 |
13
-
14
- All 30 positive photo pairs count, including unknowns and failures. The fixed 10,000-resample paired bootstrap uses seed `0x5a4f5259` and nearest-rank percentiles. The negative gate passes, but the paired gate fails. The seven 502 calls occurred on negative cases; none explains the positive localization failures. No automatic retry, provider fallback or replacement case was used. The combined known cost is $0.2148802; retaining $0.05 for each unknown charge gives accounted exposure $0.5648802. This is admission accounting, not a verified provider invoice.
15
-
16
- The candidate's 60 positive cases reconcile as follows: one initial absence decision, 22 final-grid failures, 15 selections of no mask, 18 rejected completeness checks, three incorrect returned boxes and one correct box. The 37 cases reaching native proposals include the latter four categories. Classification of presence and localization of a complete instance are different tasks; the 69/80 classification result does not qualify the whole-object path.
17
-
18
- Whole-box and cutout-mask correctness remain separate. The original candidate evaluation below contains **zero joined mask references**, although the separately pinned official index contains 32 masks for 21 photographs. A strict source-canvas join then rejected 30 masks whose full-frame annotation resolution differs from the source image. Two canvases match exactly. This is a reporting/alignment issue, not the cause of the box or bootstrap failure. The original evaluation is preserved byte for byte; normalized-canvas mask calculations, if reported, must be explicitly exploratory and cannot repair its release result. Exact annotation sampling and original Flickr rotation are not independently established. A separate [exploratory normalized-canvas calculation](mask-normalized-exploratory.json) now verifies all 32 original PNGs and records all 21 annotated cases: seven reference instances have a saved prediction to score, three reach IoU 0.8 and 25 lack a returned mask. It projects source prediction pixel centers onto the original annotation canvas; raw references, box gates and the failed paired result remain unchanged. This explicitly uncertain alignment does not qualify mask accuracy.
19
-
20
- Operation latency uses nearest rank over every completed case, including failures: candidate classification p50/p95 0.980/4.537 seconds and localization 6.746/41.875 seconds; control classification 0.605/1.722 seconds and localization 0.927/2.654 seconds. Physical-fetch distributions are recorded separately. These shared-host measurements are **unranked** under the frozen policy.
21
-
22
- The no-image audit verified all 100 actual requests contained neither image parts nor image-derived state. Its DeepSeek/Together model differs from the native Luna/OpenAI candidate, so this compares complete recipes and does not isolate the causal contribution of image input. UI and map each use one controlled source family, Mousepad and Minetest respectively; this is not arbitrary real-game acceptance.
23
-
24
- The 80 cases are now exposed regression data. Do not select a runner-up or claim a new blind success from them. A changed method requires separately named development evaluation and a new source-group-disjoint blind cohort, with the existing gates retained. Models and providers remain caller-owned, with no library default.
25
-
26
- ## Preserved artifacts
27
-
28
- - [Candidate evaluation](candidate-evaluation.json) and [provenance](candidate-provenance.json): initial output without the separately indexed mask references.
29
- - [Control evaluation](control-evaluation.json) and [provenance](control-provenance.json).
30
- - [Original paired qualification](paired-qualification.json).
31
- - [Candidate physical receipts](candidate-physical-receipts.json) and [control physical receipts](control-physical-receipts.json): metadata-only derivatives, without request bodies, media or credentials.
32
-
33
- `report.json` records each artifact's SHA256 and byte length. The five original evaluator/provenance outputs remain byte-exact; receipt JSON preserves the original arrays as a separately identified derivative. Source, pixel and reference-mask bytes remain outside the npm package.
34
-
35
- The exact exposed [input/truth/source metadata catalog](../../../../benchmarks/v02/evidence/exposed-regression-v4/README.md) records all corpus pins and canvas audit; source pixels require separate licensed acquisition.
@@ -1,15 +0,0 @@
1
- # MobileSAM public-path resource acceptance
2
-
3
- This two-hour Linux CPU run passed its monotonic duration gates and native-child cleanup checks. It exercised the public `createClassifier` locate/extract path against a deterministic synthetic 256×256 image and an injected decision fixture. It is a resource and lifecycle result, not an image-localization quality result.
4
-
5
- The [numeric receipt](proposal-resource-soak-261dc23.json) records the run and host details. The runtime execution was a working tree at `261dc235f609934b7aa125ace52984d9dd786d83`; all 55 manifest-pinned source files matched before and after (`0fb0dae63ffd384c5c32dbc9eac98e51e7c7a67a97b75cebf87eae32b09fdc66`). The separately checked Windows installed-archive acceptance used the same archive reference and confirmed 106 distribution files plus `package.json` (107 installed files), with exact installed bytes. That archive verification is separate from this working-tree soak.
6
-
7
- The run requested 600 seconds of warmup, then 30 seconds idle, 6,540 seconds busy, and 30 seconds idle. Monotonic observations were 600.071 seconds warmup and 6,602.024 seconds of measurement, including 30.001 seconds before load, 6,541.991 seconds busy, and 30.001 seconds after load. The parent recorded 1,324 samples at a nominal 5-second interval; median gap was 5,000.363 ms and the largest was 5,032.394 ms. Forced GC was disabled.
8
-
9
- The busy phase completed 2,158 operations: 1,079 locates and 1,079 extracts, with 1,079 located and extracted results, no unknowns, failures, timeouts, or seed misses, and zero provider HTTP calls. The warmup separately recorded 207 operations. In the measurement window, native children started and closed 2,158 times; abort/join, capacity, dispose, and parent-loss checks passed, and no children remained owned. Cold-per-call p50/p95 were 2,993.656/3,344.590 ms. These timings are not ranked: source checks, builds, provider development requests, native diagnostics and controlled application captures overlapped the broader run.
10
-
11
- Idle-window memory medians were compared using `max(percentage of idle-before median, absolute floor)`. For RSS the gate was `max(20%, 128 MiB)`: the increase was 121,384,960 bytes (115.76 MiB), below the 134,217,728-byte (128 MiB) threshold. Record the increase for investigation; it does not exceed the gate. Heap-used, external, and array-buffer increases were 3,842,268 bytes, 13,045,137 bytes, and 9,216 bytes, each below its `max(10%, 16 MiB)` threshold of 16,777,216 bytes.
12
-
13
- The public receipt contains no machine-local absolute paths. Full raw data remains outside the commit in the ignored local `.run/v02` directory; the raw report SHA-256 is `0b25adcde61cc90f5faa696aa7d7ee83d840abfa159044c98c8813fa1d505d30`, and the dense process-age witness SHA-256 is `5ed02be50937f7810f1f4daea8b490b67a027654b3e35273f80f4d0615fb579e`. The witness confirmed the same process PID/start-tick identity alive at 7,200.68 seconds. The [raw report](../../../.run/v02/proposal-resource-soak-monotonic-261dc23.json), [dense witness](../../../.run/v02/proposal-resource-soak-monotonic-261dc23-proc-dense.tsv), [coarse witness](../../../.run/v02/proposal-resource-soak-monotonic-261dc23-proc-watch.tsv), [run log](../../../.run/v02/proposal-resource-soak-monotonic-261dc23.log), and host snapshots are excluded from Git; their full hashes are in the receipt.
14
-
15
- The workload uses a synthetic fixture and does not qualify factual localization, segmentation quality, or production latency. The 106-file runtime parity check is a separate installed-archive acceptance, not a claim that this soak executed the packed archive.