From 8ae661ec24b6539c19a5237dcd232644d7490cfd Mon Sep 17 00:00:00 2001 From: Qwynn Marcelle Date: Fri, 21 Aug 2026 14:37:05 -0400 Subject: [PATCH 1/3] docs(evidence): META-375 phase 0 prior-art methods + preregistration freeze --- docs/evidence/meta-375/PREREGISTRATION.md | 331 ++++++++++++++++++++ docs/evidence/meta-375/PRIOR-ART-METHODS.md | 140 +++++++++ 2 files changed, 471 insertions(+) create mode 100644 docs/evidence/meta-375/PREREGISTRATION.md create mode 100644 docs/evidence/meta-375/PRIOR-ART-METHODS.md diff --git a/docs/evidence/meta-375/PREREGISTRATION.md b/docs/evidence/meta-375/PREREGISTRATION.md new file mode 100644 index 0000000..8014543 --- /dev/null +++ b/docs/evidence/meta-375/PREREGISTRATION.md @@ -0,0 +1,331 @@ +# PREREGISTRATION — META-375 prospective co-change projection characterization + +**Frozen 2026-08-21, before any characterization result was computed.** The +commit that adds this file is the freeze point. Phase 0's +`PRIOR-ART-METHODS.md` precedes it and names the exact sources used. + +This document freezes every rule META-375's contract requires. Nothing in it +may be revised after characterization output is observed; deviations are +recorded in `RECEIPT.md`, never silently corrected. + +## 1. Exact question + +> Across preregistered repositories and historical bases, what fraction and +> kinds of qualifying historical relationships survive the current +> workspace.json projection at decision time, and what does the global top-N +> projection systematically omit or stale out? + +Not asked here: whether workspace.json helps an agent. No model is run. + +## 2. Repository-selection rule and cohort + +Rule: exactly the META-310 public corpus, no additions, no exclusions, no +replacements. Denominator: **3 repositories × 3 bases = 9 bases**. + +| Repository | META-310 pin | `availableTransitions` at pin | +| -- | -- | --: | +| `formatjs/formatjs` | `27c29bf9a40a50dac232a159b8790dbd14732c57` | 6,545 | +| `JamieMason/syncpack` | `958d30689ac24b60623258630242330bd6d0264b` | 919 | +| `polyfy/polylith` | `68dab9868274c8044817983c2424fbdbd616a456` | 394 | + +## 3. Basis-selection rule and resolved identities + +Per repository, bases = {pin, pin−100, pin−250}, where pin−k is the commit +exactly k first-parent transitions before the pin: + +```sh +git rev-list --first-parent | sed -n '101p' # offset 100 +git rev-list --first-parent | sed -n '251p' # offset 250 +``` + +Eligibility is mechanical only: the basis resolves to a commit in a full, +non-shallow clone. **There is no history-depth floor.** Resolved 2026-08-21 +against full clones, before any mining: + +| Repository | Basis | Commit | Commit date | +| -- | -- | -- | -- | +| formatjs | pin | `27c29bf9a40a50dac232a159b8790dbd14732c57` | — | +| formatjs | −100 | `f3f07cd92a7ffb8e4686187aaa09dc3669f001da` | 2026-07-18 | +| formatjs | −250 | `50031ffe85c20ac46491c0afd0a43704893daac0` | 2026-05-29 | +| syncpack | pin | `958d30689ac24b60623258630242330bd6d0264b` | — | +| syncpack | −100 | `233a0b37265ff278bc96ece91f8c2bbfcaeeb280` | 2026-03-21 | +| syncpack | −250 | `e59665142b309955cdf5a6a83e522f9e92457c36` | 2025-11-09 | +| polylith | pin | `68dab9868274c8044817983c2424fbdbd616a456` | — | +| polylith | −100 | `801e7afa6af14fcd86d4bccfa2c2f58fb199fb13` | 2024-06-22 | +| polylith | −250 | `23c976ba040ab904414e2dea02aac11ad98af155` | 2022-05-05 | + +syncpack −100 is byte-identical to META-374's T0′; its produced artifact must +reproduce META-374's history block `5b2c63e879015673…` and is used as a +control. + +## 4. Miner identity (frozen referent) + +| | | +| -- | -- | +| Driver | `evidence/meta-310/meta310-mine.mjs`, sha256 `5be5c814caed895b30a26d6fee697e1b65bc01c95789235dc49ad2a3f805e83c` (byte-frozen) | +| Producer source | `workspacejson/cli` @ `031c3504a0977b8d90ac518c82a39a2f4ec741a9` | +| Standard source | `workspacejson/standard` @ `f95c42f89c8fe39995c10918bea880729cf17bbd` | +| Tarball digests | spec `2e0c326e…9111`, rules `548dd788…dbb7`, cli `aa0ab752…ad18`, mining-core `4f2a632d…7577e` (full digests in `standard/docs/evidence/meta-310/RECEIPT.md`) | +| Runner manifest | `evidence/meta-310/runner-package.json` (not byte-frozen by design; tarball digests are the pin) | +| Environment as run | node v22.19.0, npm 10.9.8, pnpm 10.24.0, darwin arm64. META-310 recorded pnpm 9.0.0; the tarball digests are the real pin — any build divergence surfaces as a digest mismatch and stops the run (§17) | + +The driver passes **no options** to `mine`/`score`/`select`. + +## 5. Mining contract (frozen producer behavior) + +Verbatim from META-310's frozen contract: + +```text +weighting version: META-289 v2.2.1 (size weight numerator 10, + position decay half-life 250) — recorded, never ranked on +history traversal: git rev-list --first-parent --reverse + git -c diff.renamelimit=5000 diff-tree -r --name-status -z \ + --no-commit-id -M50% +rename handling: -M50% similarity, renamelimit 5000 (extraction only) +analysis window: 500 first-parent transitions requested; + actualWindowTransitions = min(500, available) +bulk exclusion: fileCount > 50, applied to whole EVENTS; excluded commits + named, not merely counted +path/file-role exclusions: EMPTY SET +threshold: support >= 3 +ranking: support DESC, occurrences ASC, + files[0] ASC by UTF-8 bytes, files[1] ASC by UTF-8 bytes +cap: 50 +stored values: no rate, no derived probability/lift/confidence +``` + +## 6. Qualification policy and projection + +- **Qualifying relationship:** a pair with `support >= 3` over scored events + in the window. The full qualifying population is `pairsBeforeCap`. +- **Emitted:** the top 50 of the qualifying population under the frozen + ranking. **Global rank** of a qualifying relationship = its 1-based position + in that ranking over the full population. Emitted ⇔ rank ≤ 50. +- **File-centric availability:** a relationship involving file F is available + file-centrically iff it is in the full qualifying population, regardless of + rank. No reranking of the canonical artifact occurs anywhere. + +## 7. Per-relationship record fields (Phase 3) + +For every qualifying relationship at every basis: + +- `files` (endpoint A, endpoint B; UTF-8 ascending); +- `support`, `occurrences`, `globalRank`, `emitted` (rank ≤ 50); +- `existsA`, `existsB` at basis (§8); +- `roleA`, `roleB` (§9); +- `mostRecentSupport`: commit + Δpos of the most recent **scored** event + touching both endpoints; +- `ageFromBasis` = Δpos of that event (§10); +- `firstSupport`: commit + Δpos of the oldest scored event touching both; +- `persistence`: X/Y over eligible subwindows (§11); +- `exposureClasses`: subset of the five frozen classes, with per-class + `UNKNOWN` where content is required but an endpoint is absent (§12); +- `noPreregisteredExposure`: true when no class matched — recorded, never + treated as proof of undiscoverability. + +## 8. Endpoint-existence rule + +`git ls-tree -r --name-only ` membership, exact byte-string match. +A path renamed or deleted before the basis is **absent** — no cross-rename +stitching is invented (path identity is ADR-006's; the producer's `-M50%` +rename detection applies to event extraction, not to basis existence). + +## 9. Endpoint-role taxonomy — single-label, exact precedence + +Each path gets exactly one role: the **first** matching class below. +Classification is path-based except where noted; `roleEvidence` records +`path` or `content`. + +1. **manifest-lock** — basename ∈ {`package.json`, `package-lock.json`, + `pnpm-lock.yaml`, `yarn.lock`, `Cargo.toml`, `Cargo.lock`, `MODULE.bazel`, + `MODULE.bazel.lock`, `WORKSPACE`, `WORKSPACE.bazel`, `Gemfile`, + `Gemfile.lock`, `composer.json`, `composer.lock`, `go.mod`, `go.sum`, + `deps.edn`, `project.clj`, `bb.edn`, `shadow-cljs.edn`, + `.release-please-manifest.json`}, or basename ends `.lock`. +2. **tooling-ci** — path contains a `.github` segment, or basename matches + `tsconfig*.json`, `*.config.{js,mjs,cjs,ts}`, `biome.json`, `biome.jsonc`, + `.eslintrc*`, `.prettierrc*`, `jest.config.*`, `vitest.config.*`, `BUILD`, + `BUILD.bazel`, `.bazelrc`, `Makefile`, `Dockerfile`, `rust-toolchain*`. +3. **docs** — extension ∈ {`.md`, `.mdx`, `.adoc`, `.rst`, `.txt`}, or first + path segment is `docs`, or basename matches `^(README|CHANGELOG|LICENSE|CONTRIBUTING)`. +4. **test** — any path segment ∈ {`test`, `tests`, `__tests__`, `spec`, + `specs`}, or basename matches `(_test|_spec|\.test|\.spec)\.[A-Za-z0-9]+$`, + or basename matches `^(test|spec)_`. +5. **generated** — file exists at basis and its first 10 lines match + `generated|do not (edit|update|modify)|autogenerated` (case-insensitive), + or any path segment ∈ {`dist`, `gen`, `generated`}. Content check applies + only when the file exists at basis; otherwise this class cannot match. +6. **source** — extension ∈ {`.rs`, `.ts`, `.tsx`, `.js`, `.jsx`, `.mjs`, + `.cjs`, `.clj`, `.cljs`, `.cljc`, `.java`, `.py`, `.go`, `.rb`, `.c`, `.h`, + `.cc`, `.cpp`, `.hpp`, `.cs`, `.kt`, `.kts`, `.swift`, `.scala`, `.vue`, + `.svelte`, `.ex`, `.exs`, `.erl`, `.hrl`}. +7. **UNKNOWN** — everything else. UNKNOWN is preserved and counted, never + coerced to another label. + +## 10. Age definition + +`ageFromBasis = decayOriginPosition − position(most recent scored event +touching both endpoints)` — the producer's Δpos convention, in first-parent +transitions (0 = newest extracted event). Also recorded: exact age. +Buckets, frozen: **[0–24], [25–99], [100–249], [250–499]**. The maximum +possible age at a basis is `extractedTransitions − 1` (≤ 499), so the buckets +are exhaustive. + +## 11. Persistence across subwindows + +Subwindow k ∈ {1..5} covers Δpos ∈ [100(k−1), 100k−1] ∩ +[0, extractedTransitions−1]. A subwindow is **eligible** iff it contains ≥1 +extracted event; since extraction positions are dense over +[0, extractedTransitions−1], eligibility is mechanical: k ≤ +⌈extractedTransitions / 100⌉. A final partial subwindow counts as eligible +(frozen, not discretionary). `persistence = X/Y` where Y = eligible +subwindows and X = eligible subwindows containing ≥1 **scored** event touching +both endpoints. + +## 12. Current-tree mechanical exposure taxonomy + +Carried verbatim from META-374's `protocol/exposure.mjs` (D4 classes). **No +classes are added or altered in META-375**, preserving comparability: + +- **E1 manifest-lock** — one endpoint matches the lock pattern + `/(^|\/)(.*\.lock|.*-lock\.json|pnpm-lock\.yaml|yarn\.lock|Cargo\.lock)$/` + and the other the manifest pattern `/(^|\/)(package\.json|Cargo\.toml)$/`. +- **E2 stem** — basename stems equal, or one is a prefix of the other. +- **E3 same-dir** — identical directory. +- **E4 static-edge** — either file's content at basis contains a word-boundary + token of the other (tokens: basename stem plus parent-directory module name + when not `src`/`.`, length > 2). **UNKNOWN** when either endpoint is absent + at basis. +- **E5 generated-marker** — either file's first 10 lines at basis match the + generation-marker regex. **UNKNOWN** when both endpoints are absent at + basis. + +"No preregistered exposure class found" is a recorded state, never evidence +that the relationship is undiscoverable. + +## 13. Held-out transaction-unit rule + +Carried verbatim from META-373's frozen rule +(`integrations/docs/evidence/meta-373/gate/TRANSACTION-UNIT-RULE.md`, sha256 +`f4671df6bce1fea2…`), applied as META-374 applied it: + +- Held-out window: **(basis, META-310 pin]** — the immutable pin is always the + endpoint. Current upstream HEAD is never used or re-measured. A pin basis + therefore has **0** held-out transitions **by definition** (reported as 0, + not measured); −100 bases have 100, −250 bases have 250. +- Unit (fallback clause, per commit): each first-parent commit in the window + is one transaction. Observed subsequent changed-file set: + `git -c diff.renamelimit=5000 diff-tree -r --name-status -M50% + --no-commit-id `. A merge commit on the first-parent chain + is classified `MERGE_ON_FIRST_PARENT`, named, and excluded from overlap + denominators. +- Transaction classes, regexes carried verbatim from META-374's frozen + `protocol/screen.mjs`: **BULK** (>50 changed files), **RELEASE**, + **REVERT**, **DEPENDENCY**. Classes are recorded per transaction. +- Overlap is reported two ways, both frozen: over **all** transactions, and + over transactions passing META-374's M2∧M3∧M4 (non-bulk, non-release/revert, + non-dependency). **No candidate selection occurs** — D1/D4/D5 admissibility + screening belonged to a different question and is not applied. +- Naming discipline: held-out paths are "the observed subsequent changed-file + set" — never required files, impact, blast radius, necessary changes, or a + correct file set. +- Ordering: oldest-first, for determinism only; no stop-at-first. + +## 14. File-centric comparison rule + +Target files (META-323's preregistered set; paths verified against the +META-310 pinned artifacts): + +| Repository | Targets | +| -- | -- | +| syncpack | `src/commands/lint.rs`, `src/instance.rs`, `src/context.rs` | +| polylith | `components/command/src/polylith/clj/core/command/core.clj` | +| formatjs | `packages/cli-lib/extract.ts` | + +At every basis, each target is first classified as exactly one of +**TARGET_ABSENT_AT_BASIS**, **TARGET_PRESENT_ZERO_QUALIFYING_PARTNERS**, or +**TARGET_PRESENT_N_QUALIFYING_PARTNERS** (absence is not a zero-partner +observation). For the third state, report per target: total qualifying +partners, partners with global rank ≤ 50, partners omitted, and per-partner +endpoint roles, partner existence at basis, relationship age, persistence, and +exposure classes. Sparse and zero results are preserved. + +## 15. Aggregate measurements (per repository × basis, exact X/Y) + +Total qualifying; emitted; omitted; both endpoints current; one absent; both +absent; role composition (emitted vs omitted); age buckets (emitted vs +omitted); persistence categories; each exposure class; no preregistered +exposure; global-vs-file-centric per target; held-out overlap; emitted-vs- +omitted held-out overlap with covariates. **No collapse into a single score.** + +Hypotheses H1–H5 (from the issue) are each reported supported / not +supported / indeterminate with the counts. + +## 16. Denominators and missing-data treatment + +- Every measurement reports its denominator; absent endpoints are counted as + absent, never dropped from the population. +- UNKNOWN roles and UNKNOWN exposure classes are preserved as UNKNOWN. +- Bases with `actualWindowTransitions < 500` (polylith −250: 144) are labeled + window-truncated; cross-basis comparisons note differing actual windows. +- No imputation anywhere. + +## 17. Stopping rule + +Stop, record the discrepancy, and produce no comparative results if any of: + +- a Phase 2 reproduction control mismatches (tarball digest, driver digest, + calibration history block, pin history blocks, T0′ control); +- the full-population dump cross-check fails (§19 C2/C3); +- a preregistered basis fails to resolve. + +A stop is a result. Parameters are never adjusted to make a control pass. + +## 18. No-replacement rule + +After any characterization output beyond Phase 2 controls is observed, no +repository, basis, target file, threshold, or rule in this document may be +added, removed, or substituted — including because output is sparse, stale, +trivial, or unfavorable. + +## 19. Internal consistency checks and red tests + +Checks on every basis dump: + +- **C1** `support ≤ occurrences` for every relationship; +- **C2** dump relationship count == driver receipt `pairsBeforeCap`; +- **C3** dump ranks 1–50 == artifact `coChange`, pairwise on + files+support+occurrences; +- **C4** rank order satisfies the frozen ranking rule exactly; +- **C5** dump basis identity == requested basis commit; +- **C6** recomputed history-block digest == artifact's recorded value. + +Red tests — each perturbed input **must fail** the checks (co-change is +symmetric, so pair-field order is not an invariant and is never perturbed): + +- **R1** one relationship's support raised above its occurrences; +- **R2** two emitted relationships swapped in rank; +- **R3** one top-50 relationship deleted from the dump; +- **R4** basis SHA altered by one hex character; +- **R5** recorded digest string corrupted. + +All five red tests must be caught before any aggregate table is trusted. + +## 20. Decision rule + +Exactly one disposition, from the aggregate tables only: +`PROJECTION_SUPPORTS_SUCCESSOR_AGENT_TEST`, +`PROJECTION_LIMITATION_CONFIRMED`, or `MIXED_BY_REPOSITORY_OR_BASIS` (naming +the conditional pattern and exact denominators). No projection fix is made in +this issue. The successor experiment (META-376) is reconciled only under the +first disposition, and is not executed regardless. + +## 21. What this characterization never does + +No model runs; no META-376 execution; no MCP/hooks/skills/ToolSearch/recruitment +testing; no workspace.json semantics change; no qualification-threshold, cap, +recency-weighting, or deleted-path-filter change; no invented relevance, risk, +fragility, planning, or usefulness scores; no maintainer contact; no outreach; +no tuning to rescue co-change; no SnapBack-derived constructs (rollback = AI +mistake, fragility/risk scores, blast radius, behavioral telemetry, AI +attribution, recommendations, PASS/WARN/BLOCK, prescriptive policy). diff --git a/docs/evidence/meta-375/PRIOR-ART-METHODS.md b/docs/evidence/meta-375/PRIOR-ART-METHODS.md new file mode 100644 index 0000000..2754145 --- /dev/null +++ b/docs/evidence/meta-375/PRIOR-ART-METHODS.md @@ -0,0 +1,140 @@ +# PRIOR-ART-METHODS — META-375 bounded methodology check + +**Date:** 2026-08-21. **Scope:** methodology alignment only. This is not a +literature review. No published performance number from any source below is +imported as evidence about workspace.json, and none appears in any META-375 +result table. + +## Attribution discipline (per execution ruling) + +A paper is cited as informing a measurement choice **only where source text +supporting that specific point was actually inspected**. Inspection method for +all four entries: verbatim passages from the papers surfaced through +bibliographic search results (publisher pages, author-mirrored PDFs, dblp/ACM +records), retrieved 2026-08-21. A direct full-text fetch of the Zimmermann TSE +2005 PDF returned undecodable binary in this environment, so **no full text of +any paper was inspected**; attribution is limited to the inspected passages +quoted in search results, and each entry says exactly which passages those were. + +Where a META-375 protocol choice has no inspected-text backing, it is declared +**internally preregistered** — it stands on the frozen META-373/META-374 +protocols and the requirements of this experiment, and needs no literature +citation to be valid. + +## Sources actually used + +### 1. Zimmermann, Weißgerber, Diehl, Zeller — "Mining Version Histories to Guide Software Changes" + +IEEE Transactions on Software Engineering 31(6), pp. 429-445, June 2005. +DOI `10.1109/TSE.2005.72`. + +**Status: PARTIALLY_INSPECTED.** Inspected: abstract, section-3 ROSE +description passages, and evaluation-summary passages quoted verbatim in +search results. Not inspected: full text, including the precise evaluation +protocol. + +**Informs, from inspected text:** + +- The mining unit: association-rule mining over items changed together in + version-archive transactions ("Programmers who changed these functions also + changed..."). Supports META-375's use of one commit's changed-file set as + the transaction unit — which is in any case already frozen by the META-310 + producer contract. +- The support/confidence vocabulary for co-change observations. META-375 uses + the producer's frozen counts (`support`, `occurrences`); confidence is not + computed. +- The claim that history-derived coupling can be "undetectable by program + analysis". This motivates measuring current-tree mechanical exposure as a + **separate** state (state 5 of the six-state distinction in META-375), + never conflated with the historical observation itself. + +**Explicitly not taken from it:** the evaluation protocol details (not +inspected) and the reported top-3 suggestion accuracy (>70% over eight OSS +projects). Neither informs any META-375 protocol decision or expectation. + +### 2. Gall, Hajek, Jazayeri — "Detection of Logical Coupling Based on Product Release History" + +ICSM 1998, pp. 190-197. DOI `10.1109/ICSM.1998.738508`. + +**Status: PARTIALLY_INSPECTED.** Inspected: abstract and CSA/CRA +process-description passages quoted verbatim from an author-mirrored PDF. + +**Informs, from inspected text:** + +- Logical coupling is computable from release/change history alone, at module + granularity, without code-level dependency data ("dependencies not evident + in the source code"). Supports treating the historical observation (state 1) + and current-tree structure (state 5) as distinct, separately measured + properties. + +**Not taken:** their release-sequence pattern machinery (CSA/CRA) — META-375 +does not adopt it. + +### 3. D'Ambros, Lanza, Robbes — "On the Relationship Between Change Coupling and Software Defects" + +WCRE 2009, pp. 135-144. DOI `10.1109/WCRE.2009.19`. + +**Status: PARTIALLY_INSPECTED.** Inspected: abstract and results-section +passages quoted verbatim, including the description of coupling measures +(NOCC, SOC, EWSOC, LWSOC) and the threshold parameter `n` over which reported +correlations are plotted. + +**Informs, from inspected text:** + +- Reported change-coupling results vary with the support threshold chosen. + This is treated as a **confounder convention**: META-375 freezes `minSupport + 3` and all thresholds before any result is computed, and does not tune them + afterward. Threshold sensitivity is recorded as a standing limit, not + explored. + +**Not taken:** any defect-correlation finding. META-375 measures projection +behavior, not defects. + +### 4. Kagdi, Yusuf, Maletic — "Mining Sequences of Changed-files from Version Histories" + +MSR 2006, pp. 47-53. DOI `10.1145/1137983.1137996`. + +**Status: PARTIALLY_INSPECTED.** Inspected: abstract and methodology passages +quoted verbatim, including "log-entries consisting of more than ten files were +pruned ... to discard noisy change-sets" and the exclusion of single-event +transactions. + +**Informs, from inspected text:** + +- Pruning very large change-sets before mining is an established convention. + META-375 therefore treats the producer's frozen `fileCount > 50` event + exclusion as within convention. The exact value (50) is **internally frozen** + by the META-310 contract (META-289 v2.2.1), not literature-derived. + +**Not taken:** the sequence-mining ordering heuristics. META-375 relationships +are symmetric observations. + +## Protocol choices that stand WITHOUT external authority (internally preregistered) + +- **Temporal held-out rule** — carried verbatim from META-373's frozen + transaction-unit rule as applied by META-374. No citation needed or claimed. +- **Age in first-parent transitions** (Δpos convention from the frozen + producer) rather than wall-clock days. Commit-time non-uniformity makes + transitions the defensible unit for this experiment; that is an internal + decision. +- **100-transition persistence subwindows** — internal construction, frozen in + `PREREGISTRATION.md` §11. +- **Endpoint-existence and rename/delete treatment** — internal; follows + ADR-006 path identity and the producer's `-M50%` extraction behavior. +- **Overlap-only held-out measurement** — no precision/recall or ranking + quality metric is computed; "observed subsequent changed-file set" overlap + is observational. Internal decision per META-375's contract. +- **Endpoint-role taxonomy** — internal, frozen in `PREREGISTRATION.md` §9. + +## Known pitfalls recorded (from the inspected sources above, applied as cautions) + +- Threshold choices move results (D'Ambros et al.) → everything frozen + pre-compute; no post-hoc tuning permitted by the stopping/no-replacement + rules. +- Bulk change-sets pollute co-change counts (Kagdi et al.) → the frozen + producer already excludes them; excluded commits are named, not just + counted. +- History-derived coupling and code-visible coupling are different things + (Zimmermann et al.; Gall et al.) → the six-state distinction in META-375 is + maintained throughout; agreement between states is reported, never + interpreted as causality or recommendation. From aef9d8726068764515bb37ed96c27df3b045ffce Mon Sep 17 00:00:00 2001 From: Qwynn Marcelle Date: Fri, 21 Aug 2026 15:00:57 -0400 Subject: [PATCH 2/3] docs(evidence): META-375 prospective co-change characterization (phases 1-3) --- docs/evidence/meta-375/RECEIPT.md | 123 + docs/evidence/meta-375/REPORT.md | 262 + docs/evidence/meta-375/runs/aggregate.json | 9008 ++ .../runs/formatjs-b100.characterization.json | 64245 +++++++++++ .../meta-375/runs/formatjs-b100.dump.json | 32757 ++++++ .../meta-375/runs/formatjs-b100.receipt.json | 197 + .../runs/formatjs-b100.workspace.json | 2105 + .../runs/formatjs-b250.characterization.json | 92318 ++++++++++++++++ .../meta-375/runs/formatjs-b250.dump.json | 46643 ++++++++ .../meta-375/runs/formatjs-b250.receipt.json | 199 + .../runs/formatjs-b250.workspace.json | 2053 + .../runs/formatjs-pin.characterization.json | 36743 ++++++ .../meta-375/runs/formatjs-pin.dump.json | 19001 ++++ .../meta-375/runs/formatjs-pin.receipt.json | 195 + .../meta-375/runs/formatjs-pin.workspace.json | 2134 + .../runs/polylith-b100.characterization.json | 73227 ++++++++++++ .../meta-375/runs/polylith-b100.dump.json | 37035 +++++++ .../meta-375/runs/polylith-b100.receipt.json | 203 + .../runs/polylith-b100.workspace.json | 1580 + .../runs/polylith-b250.characterization.json | 17547 +++ .../meta-375/runs/polylith-b250.dump.json | 8958 ++ .../meta-375/runs/polylith-b250.receipt.json | 188 + .../runs/polylith-b250.workspace.json | 1143 + .../runs/polylith-pin.characterization.json | 86130 ++++++++++++++ .../meta-375/runs/polylith-pin.dump.json | 43591 ++++++++ .../meta-375/runs/polylith-pin.receipt.json | 203 + .../meta-375/runs/polylith-pin.workspace.json | 1812 + .../runs/syncpack-b100.characterization.json | 30477 +++++ .../meta-375/runs/syncpack-b100.dump.json | 15236 +++ .../meta-375/runs/syncpack-b100.receipt.json | 200 + .../runs/syncpack-b100.workspace.json | 1036 + .../runs/syncpack-b250.characterization.json | 41915 +++++++ .../meta-375/runs/syncpack-b250.dump.json | 20855 ++++ .../meta-375/runs/syncpack-b250.receipt.json | 203 + .../runs/syncpack-b250.workspace.json | 976 + .../runs/syncpack-pin.characterization.json | 39788 +++++++ .../meta-375/runs/syncpack-pin.dump.json | 19416 ++++ .../meta-375/runs/syncpack-pin.receipt.json | 194 + .../meta-375/runs/syncpack-pin.workspace.json | 1139 + docs/evidence/meta-375/scripts/aggregate.mjs | 201 + docs/evidence/meta-375/scripts/bases.json | 36 + .../meta-375/scripts/characterize.mjs | 286 + docs/evidence/meta-375/scripts/checks.mjs | 171 + docs/evidence/meta-375/scripts/dump.mjs | 119 + 44 files changed, 751848 insertions(+) create mode 100644 docs/evidence/meta-375/RECEIPT.md create mode 100644 docs/evidence/meta-375/REPORT.md create mode 100644 docs/evidence/meta-375/runs/aggregate.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b100.characterization.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b100.dump.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b100.receipt.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b100.workspace.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b250.characterization.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b250.dump.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b250.receipt.json create mode 100644 docs/evidence/meta-375/runs/formatjs-b250.workspace.json create mode 100644 docs/evidence/meta-375/runs/formatjs-pin.characterization.json create mode 100644 docs/evidence/meta-375/runs/formatjs-pin.dump.json create mode 100644 docs/evidence/meta-375/runs/formatjs-pin.receipt.json create mode 100644 docs/evidence/meta-375/runs/formatjs-pin.workspace.json create mode 100644 docs/evidence/meta-375/runs/polylith-b100.characterization.json create mode 100644 docs/evidence/meta-375/runs/polylith-b100.dump.json create mode 100644 docs/evidence/meta-375/runs/polylith-b100.receipt.json create mode 100644 docs/evidence/meta-375/runs/polylith-b100.workspace.json create mode 100644 docs/evidence/meta-375/runs/polylith-b250.characterization.json create mode 100644 docs/evidence/meta-375/runs/polylith-b250.dump.json create mode 100644 docs/evidence/meta-375/runs/polylith-b250.receipt.json create mode 100644 docs/evidence/meta-375/runs/polylith-b250.workspace.json create mode 100644 docs/evidence/meta-375/runs/polylith-pin.characterization.json create mode 100644 docs/evidence/meta-375/runs/polylith-pin.dump.json create mode 100644 docs/evidence/meta-375/runs/polylith-pin.receipt.json create mode 100644 docs/evidence/meta-375/runs/polylith-pin.workspace.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b100.characterization.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b100.dump.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b100.receipt.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b100.workspace.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b250.characterization.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b250.dump.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b250.receipt.json create mode 100644 docs/evidence/meta-375/runs/syncpack-b250.workspace.json create mode 100644 docs/evidence/meta-375/runs/syncpack-pin.characterization.json create mode 100644 docs/evidence/meta-375/runs/syncpack-pin.dump.json create mode 100644 docs/evidence/meta-375/runs/syncpack-pin.receipt.json create mode 100644 docs/evidence/meta-375/runs/syncpack-pin.workspace.json create mode 100644 docs/evidence/meta-375/scripts/aggregate.mjs create mode 100644 docs/evidence/meta-375/scripts/bases.json create mode 100644 docs/evidence/meta-375/scripts/characterize.mjs create mode 100644 docs/evidence/meta-375/scripts/checks.mjs create mode 100644 docs/evidence/meta-375/scripts/dump.mjs diff --git a/docs/evidence/meta-375/RECEIPT.md b/docs/evidence/meta-375/RECEIPT.md new file mode 100644 index 0000000..2738846 --- /dev/null +++ b/docs/evidence/meta-375/RECEIPT.md @@ -0,0 +1,123 @@ +# RECEIPT — META-375 prospective co-change projection characterization + +**Date:** 2026-08-21. **Scope:** Phase 0–3 execution record: environment, +frozen-referent reproduction, controls, checks, red tests, deviations. +Findings: `REPORT.md`. Freeze: `PREREGISTRATION.md` @ commit +`8ae661ec24b6539c19a5237dcd232644d7490cfd` (before any characterization +output). + +## Environment + +| | | +| -- | -- | +| Host | darwin arm64 | +| Node | v22.19.0 | +| npm | 10.9.8 | +| pnpm | 10.24.0 (META-310 recorded 9.0.0 — see Deviations) | +| Run directory | `$RUN` scratch (transient); all outputs committed under `runs/` | + +## Frozen referent reproduction (Phase 2) + +| Control | Expected | Observed | Result | +| -- | -- | -- | -- | +| cli@031c3504 worktree | commit exists | exists | PASS | +| standard@f95c42f8 worktree | commit exists | exists | PASS | +| Tarball digest spec 0.4.4 | `2e0c326e7d8b…9111` | identical | PASS | +| Tarball digest rules 0.4.4 | `548dd7887258…dbb7` | identical | PASS | +| Tarball digest cli 0.5.2 | `aa0ab7526a8f…ad18` | identical | PASS | +| Tarball digest mining-core 0.0.0 | `4f2a632d874d…7577e` | identical | PASS | +| Driver digest (`meta310-mine.mjs`) | `5be5c814caed…83c` | identical | PASS | +| Install audit | 4 × `file:`, 0 registry | 4 × `file:`, 0 registry | PASS | +| Duplicate `@workspacejson/spec` | 0 | 1 copy installed | PASS | +| Calibration (standard@8e08c8c) | `7012352617df…`, 50 entries, 128 pre-cap | identical | PASS | +| Pin control syncpack | `ce5ecabea30e…` | identical | PASS | +| Pin control formatjs | `cc4b87e4d63f…` | identical | PASS | +| Pin control polylith | `a77451d9727d…` | identical | PASS | +| T0′ control (syncpack-b100, = META-374) | `5b2c63e87901…`, 568 qualifying, 819 available | identical | PASS | +| Driver↔receipt cross-check, every basis | identical | identical | PASS | +| `npm run check:workspace` (spec validation), every basis | valid, 0 errors | valid, 0 errors | PASS | + +## Mining runs (9 bases, frozen driver, no options) + +| Label | Basis commit | Available | Extracted | Qualifying (pairsBeforeCap) | Emitted | capBound | +| -- | -- | --: | --: | --: | --: | -- | +| syncpack-pin | `958d30689ac2…` | 919 | 500 | 729 | 50 | true | +| syncpack-b100 | `233a0b37265f…` | 819 | 500 | 568 | 50 | true | +| syncpack-b250 | `e59665142b30…` | 669 | 500 | 784 | 50 | true | +| formatjs-pin | `27c29bf9a40a…` | 6,545 | 500 | 713 | 50 | true | +| formatjs-b100 | `f3f07cd92a7f…` | 6,445 | 500 | 1,242 | 50 | true | +| formatjs-b250 | `50031ffe85c2…` | 6,295 | 500 | 1,776 | 50 | true | +| polylith-pin | `68dab9868274…` | 394 | 394 | 1,658 | 50 | true | +| polylith-b100 | `801e7afa6af1…` | 294 | 294 | 1,406 | 50 | true | +| polylith-b250 | `23c976ba040a…` | 144 | 144 | 327 | 50 | true | + +All qualifying counts match the driver receipts exactly (check C2). + +## Internal consistency checks (PREREGISTRATION §19) + +54/54 PASS: C1 (support ≤ occurrences), C2 (dump count == receipt +pairsBeforeCap), C3 (dump top-50 == artifact coChange, pairwise +files+support+occurrences), C4 (frozen ranking order), C5 (basis identity == +frozen bases.json), C6 (recomputed history-block digest == recorded) — for +each of the 9 bases. + +## Red tests + +45/45 CAUGHT: R1 (support > occurrences), R2 (rank swap), R3 (top-50 +deletion), R4 (basis SHA one-char alteration), R5 (digest corruption) — for +each of the 9 bases. + +## Exposure UNKNOWN audit + +Post-hoc verification that the verbatim META-374 static-edge regex guard never +fired: at every basis, `static-edge` UNKNOWN count == pairs with ≥1 absent +endpoint (e.g. syncpack-b250: 690 == 690) and `generated-marker` UNKNOWN count +== both-absent pairs (625 == 625). All UNKNOWNs are absence-driven. + +## Artifacts + +`runs/` contains, per basis label: `