Skip to content

PR-C: alpha-1 legacy/deprecated purge + hygiene (breaking)#114

Merged
rickylabs merged 11 commits into
mainfrom
chore/alpha1-legacy-purge
Jun 23, 2026
Merged

PR-C: alpha-1 legacy/deprecated purge + hygiene (breaking)#114
rickylabs merged 11 commits into
mainfrom
chore/alpha1-legacy-purge

Conversation

@rickylabs

Copy link
Copy Markdown
Owner

PR-C — project-wide alpha-1 legacy/deprecated purge + folded hygiene

Third and final slice of the JSR-readiness program after PR-A (additive) and PR-B #113 (breaking
prod-readiness removals, merged). Removes the remaining alpha-1 legacy/deprecated surface that PR-B
did not own, and folds in the mechanical hygiene cleanup (PR-D dissolved into this PR).

Status: draft — plan + research committed; PLAN-EVAL (OpenHands minimax-M3) pending. No
implementation slice until PLAN-EVAL returns PASS.

Baseline: branched off PR-B's merged main abb6e9a4; every item re-grepped against that tip.

Breaking change

This is a breaking (subtractive) change at the alpha-1 pre-1.0 line. Per the lockstep single-version
scheme, no per-package version bump — the repo-wide breaking bump lands once at JSR-publish prep
(recorded as DEBT-1). Versions hold at 0.0.1-alpha.0.

Removal manifest (final, post-re-verification)

Tier 1 (low-consumer aliases / dead stubs):

  • updatePluginRegistry no-op stub (cli plugin workspace-mutator) — config-driven path superseded it
  • safeExtend Zod-compat alias (fresh pagination-types) — 0 call consumers
  • startWorkersStreamMirror back-compat wrapper (plugins/workers producer) — 1 consumer, renamed

Tier 2 (the substantive slice):

  • aspire ServiceEntry.DependsOn? (@deprecated → ServiceReferences) + back-compat merge branch — 6
    consumers. Gated on proving ServiceReferences is a complete replacement before removal.

Two inventory items re-verified and EXCLUDED (re-baselining caught these):

  • packagesAsWorkspaceMembers — a live, load-bearing scaffold seam (dynamic
    hasLocalPackageWorkspace, real === true / () => false branches), NOT a dead always-true
    option. Not touched.
  • workers streams/schema.ts schedule? — deprecation ties to the deferred workers-cron→triggers
    unification (CRON-SUBSYSTEM-DUP) and is still wired into a projection mask. Deferred with that work.

Folded hygiene

  • H1 untrack the 109-file .llm/tmp/init-json-smoke/ accidental test-output + close the
    .gitignore gap (root cause)
  • H2 remove 4 zero-ref scratch files
  • H3 fix misleading "Backward-compatible alias" docstrings on the fresh query hooks +
    FreshAppTelemetryOptions (WORDING ONLY — these are canonical API; removal is a trap)
  • H4 refresh 2 downstream doc refs for the removed Tier-1 symbols

arch-debt folded (record-only; not implemented here)

RUN-ARTIFACT-ARCHIVAL-POLICY, PAGEBUILDER-LEGACY-COMPAT-TREE, FORMPAGEPROPS-PLAYGROUND-MIGRATION,
REDIS-LEGACY-VALUE-FALLBACK, plus DEBT-1 (version timing) and DEBT-2 (db-init e2e flake) carried from
PR-B.

Gates (at IMPL-EVAL)

Scoped check/lint/fmt (src ts/tsx); deno doc --lint per package; per-package deno task test;
pre-delete grep gate over templates/docs/scaffold; deno task arch:check; deno task publish:dry-run; deno task e2e:cli run scaffold.runtime --cleanup --format pretty. No deno.lock
churn; zero-cast.

Run artifacts: .llm/tmp/run/chore-alpha1-legacy-purge--purge/ (research.md, plan.md).

@rickylabs

Copy link
Copy Markdown
Owner Author

@openhands-agent model=openrouter/minimax/minimax-m3 output=pr-comment

use harness

You are the PLAN-EVAL evaluator for PR #114 (run chore-alpha1-legacy-purge--purge). This is a
separate-session plan gate. Do NOT implement anything. Read the plan + research, apply the Plan-Gate,
and emit a single verdict.

SKILL

Activate and follow these repo skills before evaluating (read each SKILL.md):

  • .agents/skills/netscript-harness — harness protocol, Plan-Gate, PLAN-EVAL verdict rules
    (PASS / FAIL_PLAN; two FAIL cycles then escalate). Read .llm/harness/evaluator/plan-protocol.md
    and .llm/harness/gates/plan-gate.md.
  • .agents/skills/netscript-doctrine — package/plugin archetype + public-surface + gate selection
    (this PR touches ARCHETYPE-2 aspire, ARCHETYPE-3 cli/fresh, ARCHETYPE-5 plugins/workers).
  • .agents/skills/netscript-deno-toolchaindeno doc surface inspection, deno why, version/
    lockstep policy (used to judge the version-timing decision).
  • .agents/skills/netscript-tools — scoped check/lint/fmt wrappers, gate-evidence rules, lock hygiene.

Inputs (on the PR branch chore/alpha1-legacy-purge)

  • .llm/tmp/run/chore-alpha1-legacy-purge--purge/research.md
  • .llm/tmp/run/chore-alpha1-legacy-purge--purge/plan.md (includes the Design checkpoint)

What to scrutinize (the load-bearing decisions)

  1. aspire DependsOn Tier-2 removal: is the plan's precondition — proving ServiceReferences
    is a COMPLETE replacement (ordering, transitive refs, deploy-config resolvers) before deleting the
    field — sufficient? Is the "leave-the-case + record-debt if uncovered" fallback acceptable, or
    must the plan resolve completeness up front?
  2. Version policy: the plan holds lockstep 0.0.1-alpha.0 and defers the repo-wide breaking bump
    to JSR-publish prep (DEBT-1), rather than a per-package bump. Confirm this is correct for the
    lockstep single-version scheme (per-package would break lockstep).
  3. The two EXCLUSIONSpackagesAsWorkspaceMembers (re-verified live seam) and workers
    schedule? (deferred to cron-unification). Confirm both are correctly scoped OUT (research.md
    gives the git-grep evidence).
  4. H3 wording-only for the fresh query hooks + FreshAppTelemetryOptions: confirm the plan
    correctly forbids removing these canonical symbols (removal-trap) and only fixes docstrings.
  5. Gate set adequacy for a breaking subtractive change across aspire+cli+fresh+workers+scaffold:
    is scaffold.runtime E2E + deno doc --lint + arch:check + publish:dry-run + the pre-delete grep
    gate the right bar? Anything missing?
  6. Slice decomposition / rollback soundness (S1-S4, S2 isolated as the only behavior-affecting
    slice).

Output

Write .llm/tmp/run/chore-alpha1-legacy-purge--purge/plan-eval.md and post your verdict as a PR
comment: PASS or FAIL_PLAN with specific, actionable gaps. Two FAIL_PLAN cycles then escalate.
No implementation may begin before PASS.

@rickylabs

rickylabs commented Jun 23, 2026

Copy link
Copy Markdown
Owner Author

OpenHands Agent — Completed

Model: openrouter/minimax/minimax-m3
Provider: OPENROUTER
Job status: success
Summary source: agent-after-retry
Trace: .llm/tmp/run/openhands/pr-114/run-27992746723-1 (committed to the PR branch)
Artifact: openhands-agent-27992746723-1

Run summary — PR-C PLAN-EVAL cycle 2 (chore-alpha1-legacy-purge--purge)

Summary

PLAN-EVAL (separate session) for the project-wide alpha-1 legacy/deprecated purge + folded
hygiene plan. Read research.md and plan.md, walked the Plan-Gate checklist
(gates/plan-gate.md), and spot-checked the plan's load-bearing claims against the current
tree on branch chore/alpha1-legacy-purge (baseline abb6e9a4). Verdict: PASS with two
minor non-blocking wording drift items surfaced in plan-eval.md for the implementer to
address during S1 (these do not gate implementation).

Changes

Files written during this run:

  • .llm/tmp/run/chore-alpha1-legacy-purge--purge/plan-eval.md — the PLAN-EVAL verdict
    deliverable (PASS), including the Plan-Gate checklist table, evaluator-run spot-check
    evidence table, and three Notes for the implementer:
    1. safeExtend has 1 in-class caller (search-params.ts:76), not 0 — removal still
      correct (rewrite to this.extend(shape)), but plan wording should be updated.
    2. startWorkersStreamMirror IS the canonical name — there is no separate alias; the
      S1 action is delete + inline (or move createStreamMutationHook to consumer),
      not "rename to canonical name".
    3. dependsOn lives on TWO surfaces: aspire DependsOn (legacy alias, removed) vs
      canonical ServiceConfig.dependsOn (LIVE, kept) — plan correctly scopes removal to
      aspire only; noting here so IMPL-EVAL can spot-check the discipline.

No code changes were made. No commits were made. No PR comment was posted (the task says
"Do not post GitHub issue or PR comments directly. The workflow owns GitHub comments.").

Validation

PLAN-EVAL is the planning gate; it does not run code. Validation was the spot-check
evidence-gathering documented in plan-eval.md (table of plan-claim vs tree-evidence):

  • updatePluginRegistry — 1 test consumer at
    packages/cli/src/kernel/adapters/plugin/workspace-mutator_test.ts:270 (plan claim OK).
  • safeExtend — 1 caller at
    packages/fresh/src/application/builders/define-page/search-params.ts:76 (plan says 0;
    minor drift).
  • DependsOn legacy vs canonical dependsOn — verified both surfaces:
    packages/aspire/src/domain/raw-config.ts (legacy alias) vs
    packages/config/src/domain/schemas/service-schema.ts:17 +
    config-section-types.ts:127 (LIVE canonical). deploy-config-resolvers.ts:133 cascade
    confirmed: dependsOn: appSvc?.DependsOn ?? nsSvc.dependsOn.
  • startWorkersStreamMirror — 1 consumer at plugins/workers/services/src/main.ts; no
    separate "canonical" alias found via grep across packages//plugins//workers/.
  • H1 — git ls-files .llm/tmp/init-json-smoke/ shows tracked artifacts; .gitignore
    does not yet exclude the dir; init-json_test.ts writes there.
  • H2 — 5 zero-ref scratch files exist under .llm/tmp/; 0 code refs (only mentions in
    run logs / handover notes).
  • H3 — 5 query hooks at packages/fresh/src/application/query/hooks.ts:142,149,156,163,174
    and FreshAppTelemetryOptions at
    packages/fresh/src/runtime/server/define-fresh-app.ts:14 all carry the
    "Backward-compatible alias" wording.
  • Version policy — deno.json single 0.0.1-alpha.0; per-package bump would break lockstep.
  • Slice decomposition S1–S4 — small, ordered, S2 isolated as the only behavior-affecting
    slice with documented rollback.
  • Gate set — scaffold.runtime E2E + deno doc --lint per affected package + arch:check
    • publish:dry-run + scoped check/lint/fmt + named pre-delete grep gate is adequate
      for breaking subtractive across aspire+cli+fresh+plugins+scaffold.

Remaining risks

  • The PASS verdict is conditional on the implementer picking up the two S1 wording-drift
    fixes (Notes 1 and 2 in plan-eval.md) before/during S1. These are mechanical, not
    load-bearing, and do not require a new PLAN-EVAL cycle.
  • IMPL-EVAL (next session) must spot-check S2 scope discipline: the canonical
    ServiceConfig.dependsOn (in packages/config/...) MUST remain untouched; only aspire's
    DependsOn legacy alias is removed. The plan scope is correct; the risk is
    scope-creep drift at implementation time.
  • No deno.lock churn and zero-cast discipline must be preserved by IMPL-EVAL (per plan
    Decision 5).
  • scaffold.runtime E2E is the load-bearing gate for S2; if it regresses, rollback S2
    alone and record the ServiceReferences-gap as arch-debt (per plan Rollback section).
  • The task instructions said to "post your verdict as a PR comment" — this was NOT done
    in this session because the operational contract in the trigger metadata explicitly
    states "Do not post GitHub issue or PR comments directly. The workflow owns GitHub
    comments." The verdict is captured in plan-eval.md and the PR comment is owned by
    the workflow. The run summary makes this explicit so the workflow can post the
    PASS verdict from plan-eval.md per the harness protocol.
    Run: https://github.com/rickylabs/netscript/actions/runs/27992746723

Copy link
Copy Markdown
Owner Author

[PHASE: IMPL] [SLICE: S1]

Tier-1 legacy surface purge landed and pushed.

Scope

  • Removed the updatePluginRegistry no-op stub and its registry-untouched test call; config-driven plugin declarations remain covered by PluginWorkspaceMutator appends project-local plugin config specs.
  • Removed Fresh safeExtend from the pagination search implementation and public route facade; docs now point to extend(shape) only.
  • Removed startWorkersStreamMirror and its dead companion WorkersStreamMirrorState; the workers service now wires runtime.executionState.setMutationHook(createStreamMutationHook()) directly.
  • Refreshed the route and workers reference docs for the changed public surfaces.

Commit

  • 7492a1d97940d5059dc68732f222eafabc307699chore: purge tier-1 legacy surfaces

Evidence

  • Named S1 grep gate: updatePluginRegistry, safeExtend, startWorkersStreamMirror, and WorkersStreamMirrorState all returned 0 hits under templates/, docs/, plugins/, and packages/ after excluding non-source generated assets.
  • deno run --allow-read --allow-run .llm/tools/run-deno-check.ts --root packages/cli --root packages/fresh --root plugins/workers --ext ts,tsx — PASS, 739 files, 7 batches, 0 diagnostics (--unstable-kv default).
  • deno run --allow-read --allow-run .llm/tools/run-deno-lint.ts --root packages/cli --root packages/fresh --root plugins/workers --ext ts,tsx --batch-size 1000 — PASS, 739 files, 0 diagnostics.
  • deno run --allow-read --allow-run .llm/tools/run-deno-fmt.ts --root packages/cli --root packages/fresh --root plugins/workers --ext ts,tsx --batch-size 1000 — PASS, 739 files, 0 findings.
  • deno doc --lint packages/cli/mod.ts — PASS.
  • deno doc --lint packages/fresh/mod.ts — PASS.
  • deno doc --lint packages/plugin-workers-core/mod.ts — PASS.
  • Extra touched subpath check: deno doc --lint plugins/workers/streams/server.ts — PASS.
  • Package tests: packages/cli 146 passed; packages/fresh 141 passed; plugins/workers 13 passed; packages/plugin-workers-core 20 passed.
  • deno task arch:check — PASS exit 0; existing catalog/doctrine warnings only.

Notes

  • The scoped lint/fmt wrappers initially failed in smaller batches because some batches contained only files excluded by Deno config and returned No target files found; rerun with --batch-size 1000 preserved the requested roots and selected file count while avoiding empty effective batches.
  • Root deno.lock was not modified; no casts were introduced.

Copy link
Copy Markdown
Owner Author

[PHASE: IMPL] [SLICE: S2]

Aspire legacy DependsOn alias removal landed and pushed.

Scope

  • Removed ServiceEntry.DependsOn from packages/aspire/config.ts and dropped the back-compat merge branch into ServiceReferences.
  • Simplified extractServiceReferences to deduplicate canonical ServiceReferences only.
  • Removed the legacy DependsOn arm from CLI deploy config resolution and raw service config typing.
  • Updated generated Aspire helper compatibility template so scaffolded helpers only read ServiceReferences.
  • Updated Aspire service-discovery docs to describe ServiceReferences as the only live field.
  • Added CLI deploy coverage proving appsettings ServiceReferences still resolves to compile-target dependsOn for ordering/service dependency consumers.

Commit

  • 35f9278b5c654e6ac9ee1891a7c53317277a3c79chore: remove aspire DependsOn alias

Precondition Evidence

  • git grep DependsOn over packages/aspire, packages/cli, plugins, templates, and docs returned 0 live hits after the change.
  • Canonical path remains intact: Aspire parses/validates ServiceReferences; generated helpers wire ServiceReferences in pass 2; CLI resolves ServiceReferences into ResolvedServiceConfig.dependsOn; compile targets, manifest topological sort, and Servy dependency generation consume that dependsOn graph.
  • New test: loadDeployConfig maps service references to compile target dependencies asserts orders.ServiceReferences = ['users'] becomes orders.dependsOn = ['users'].

Evidence

  • deno run --allow-read --allow-run .llm/tools/run-deno-check.ts --root packages/aspire --root packages/cli --ext ts,tsx — PASS, 560 files, 5 batches, 0 diagnostics (--unstable-kv default).
  • deno run --allow-read --allow-run .llm/tools/run-deno-lint.ts --root packages/aspire --root packages/cli --ext ts,tsx --batch-size 1000 — PASS, 560 files, 0 diagnostics.
  • deno run --allow-read --allow-run .llm/tools/run-deno-fmt.ts --root packages/aspire --root packages/cli --ext ts,tsx --batch-size 1000 — PASS, 560 files, 0 findings.
  • deno doc --lint packages/aspire/mod.ts — PASS.
  • packages/aspire: deno task test — PASS, 18 tests / 50 steps.
  • Targeted CLI deploy/scaffold tests: deno test --allow-all src/kernel/adapters/windows/compile/compile_test.ts src/kernel/templates/aspire/helpers/tests/generators-service-plugin_test.ts — PASS, 5 tests / 24 steps.
  • Full packages/cli: deno task test — PASS, 147 tests / 311 steps.
  • deno task arch:check — PASS exit 0; existing catalog/doctrine warnings only.

Notes

  • Canonical ServiceConfig.dependsOn in packages/config was not touched.
  • Root deno.lock was not modified; no casts were introduced.

Copy link
Copy Markdown
Owner Author

[PHASE: IMPL] [SLICE: S3]

Hygiene H1/H2 landed and pushed.

Scope

  • Added .llm/tmp/init-json-smoke/ to .gitignore.
  • Removed 109 tracked generated files under .llm/tmp/init-json-smoke/ from the index.
  • Removed zero-ref scratch files under .llm/tmp/: measure-doclint.ts, measure-wave5-rebaseline.ts, eval-pr97-e2e-runtime.log, doc-lint-fresh.json, and doc-lint-fresh-rev2.json.

Commit

  • 6971fa8e5553dcbb8329ac84f876d9c689e1c7d4chore: untrack generated smoke artifacts

Evidence

  • git ls-files .llm/tmp/init-json-smoke | wc -l — 109 before removal; 0 after cached removal.
  • deno test --allow-all e2e/tests/presentation/init-json_test.ts from packages/cli — PASS, 1 test; regenerated the smoke output locally.
  • git check-ignore -v .llm/tmp/init-json-smoke/json-smoke/deno.json .llm/tmp/init-json-smoke/json-smoke/apps/dashboard/main.ts — PASS, both matched .gitignore:15:.llm/tmp/init-json-smoke/.
  • H2 reference check: no code/docs/template consumers; only a historical handover mention for measure-doclint.ts.
  • deno task arch:check — PASS exit 0; existing catalog/doctrine warnings only.

Notes

  • Root deno.lock was not modified.
  • The regenerated .llm/tmp/init-json-smoke/ files remain present locally as ignored scratch output, not tracked files.

Copy link
Copy Markdown
Owner Author

PR-C S4 implementation: fresh wording + arch-debt folding

Commit: a0573ce34cc5823cf0ec9f07148eece5a1741373 (chore: clarify fresh canonical docs)

Scope:

  • Updated Fresh query hook and telemetry docstrings as wording only; canonical APIs were retained.
  • Refreshed the Fresh reference wording to match the canonical API language.
  • Folded the staged architecture debt entries into .llm/harness/debt/arch-debt.md: RUN-ARTIFACT-ARCHIVAL-POLICY, PAGEBUILDER-LEGACY-COMPAT-TREE, FORMPAGEPROPS-PLAYGROUND-MIGRATION, REDIS-LEGACY-VALUE-FALLBACK, DEBT-1, and DEBT-2.

Evidence:

  • Stale wording grep is clean for Backward-compatible alias, Backward-compatible telemetry, and backward-compatible alias across packages/fresh/src and docs/site/reference/fresh/index.md.
  • Canonical symbols remain present: useQuery, useSuspenseQuery, useInfiniteQuery, useSuspenseInfiniteQuery, useMutation, and FreshAppTelemetryOptions.
  • deno doc --lint packages/fresh/mod.ts PASS.
  • .llm/tools/run-deno-fmt.ts on the four touched S4 files PASS after scoped format/write and check.
  • deno task arch:check PASS, exit 0 with only pre-existing warnings.

Lock/cast hygiene:

  • Root deno.lock was not modified.
  • No new casts were introduced.

Note: formatting churn is confined to touched docs/harness Markdown files from the scoped formatter run.

@rickylabs

Copy link
Copy Markdown
Owner Author

@openhands-agent model=openrouter/qwen/qwen3.7-max output=pr-comment

use harness — you are the IMPL-EVAL evaluator for PR-C (#114), running in a separate session
from the WSL Codex generator. Do NOT implement; evaluate and emit a verdict. Read
.llm/harness/evaluator/protocol.md + .llm/harness/evaluator/verdict-definitions.md + the relevant
gate docs before judging.

Scope under evaluation

PR-C = project-wide alpha-1 legacy/deprecated purge + folded hygiene. Branch
chore/alpha1-legacy-purge @ 7d91fbb6, off merged main abb6e9a4. Commits:

  • 7492a1d9 S1 — tier-1 removals (updatePluginRegistry stub, safeExtend alias, startWorkersStreamMirror)
  • 35f9278b S2 — remove aspire legacy DependsOn alias (the only behavior-affecting slice)
  • 6971fa8e S3 — untrack 109 generated init-json-smoke artifacts + scratch files + .gitignore
  • a0573ce3 S4 — fresh canonical-docstring wording + arch-debt folding
  • 7d91fbb6 — implementation evidence

Run artifacts (read first)

.llm/tmp/run/chore-alpha1-legacy-purge--purge/{research.md,plan.md,plan-eval.md,worklog.md,context-pack.md,commits.md}.
plan-eval.md is a minimax-M3 PASS with 3 corrections already folded into the implementation.

What to verify

  1. Scope fidelity — only the planned removals landed. The 2 EXCLUSIONS must be UNTOUCHED:
    packagesAsWorkspaceMembers (live load-bearing scaffold seam) and workers
    packages/plugin-workers-core/src/streams/schema.ts schedule? (deferred to CRON-SUBSYSTEM-DUP).
    Canonical ServiceConfig.dependsOn (config schema) must REMAIN; only the aspire legacy DependsOn
    alias is removed.
  2. Behavior preservation — S2 is the only behavior-affecting slice. Confirm canonical dependsOn
    fully covers every removed legacy DependsOn merge case. Note the new
    packages/cli/.../windows/compile/compile_test.ts regression test asserting
    ServiceReferences → dependsOn (orders.dependsOn === ['users']).
  3. Gates — scoped run-deno-check.ts/run-deno-lint.ts/run-deno-fmt.ts (src ts/tsx; roots
    aspire, cli, fresh, plugins/workers); deno doc --lint per affected package; per-package
    deno task test; deno task arch:check; deno task publish:dry-run.
  4. scaffold.runtime E2E (merge-readiness, single pass):
    deno task e2e:cli run scaffold.runtime --cleanup --format pretty
    (aspire + workers + scaffold paths changed). Report the raw exit code and any failing suite/test
    names. Do not split into individual gate commands.
  5. Lock hygiene — root deno.lock must be untouched (supervisor verified clean; re-confirm).
    Zero new casts (only the 2 accepted casts may exist; this PR is removal-only).
  6. Version-timing ruling — NOT a defect: the repo holds lockstep 0.0.1-alpha.0; the repo-wide
    breaking bump lands ONCE at JSR-publish prep (DEBT-1, recorded in arch-debt.md). A per-package
    bump would break the single-version scheme. The breaking-change note belongs in the PR/merge body,
    not a version bump. Do NOT fail the PR for the unbumped version.
  7. arch-debt folding — confirm the 6 entries are appended to .llm/harness/debt/arch-debt.md:
    RUN-ARTIFACT-ARCHIVAL-POLICY, PAGEBUILDER-LEGACY-COMPAT-TREE, FORMPAGEPROPS-PLAYGROUND-MIGRATION,
    REDIS-LEGACY-VALUE-FALLBACK, DEBT-1 (version timing), DEBT-2 (db-init flake).

Output

Write .llm/tmp/run/chore-alpha1-legacy-purge--purge/evaluate.md and post a PR comment with a clear
verdict: PASS, FAIL_FIX, FAIL_RESCOPE, or FAIL_DEBT. Preserve lock hygiene — do not
commit deno.lock or source churn unless an explicitly-reviewed fix requires it. Eval loop limit is
two failures before escalation.

SKILL

  • .agents/skills/netscript-harness — IMPL-EVAL protocol, verdict definitions, gate set
  • .agents/skills/netscript-doctrine — ARCHETYPE-2/3/5 public-surface gates for the removed exports
  • .agents/skills/netscript-deno-toolchaindeno doc --lint publish bar, deno why, publish:dry-run
  • .agents/skills/netscript-tools — scoped check/lint/fmt wrappers, e2e:cli runner, lock hygiene
  • .agents/skills/jsr-audit — publishability of the trimmed multi-package public surface
  • .agents/skills/netscript-pr — PR verdict-comment conventions

@rickylabs

rickylabs commented Jun 23, 2026

Copy link
Copy Markdown
Owner Author

OpenHands Agent — Completed

Model: openrouter/qwen/qwen3.7-max
Provider: OPENROUTER
Job status: success
Trace: .llm/tmp/run/openhands/pr-114/run-27995582550-1 (committed to the PR branch)
Artifact: openhands-agent-27995582550-1

IMPL-EVAL Summary - PR-C alpha-1 legacy/deprecated purge

Verdict: PASS

Evaluation Scope

Evaluated PR-C (branch chore/alpha1-legacy-purge at 7d91fbb) against approved plan for project-wide alpha-1 legacy/deprecated purge + folded hygiene.

Verification Results

  1. Scope Fidelity - PASS
  • All planned removals landed (updatePluginRegistry, safeExtend, startWorkersStreamMirror, aspire DependsOn alias)
  • Both exclusions UNTOUCHED: packagesAsWorkspaceMembers (5 live call sites intact), workers schedule? (deprecated, deferred to CRON-SUBSYSTEM-DUP)
  • Canonical ServiceConfig.dependsOn schema REMAINS; only legacy alias removed
  1. Behavior Preservation - PASS
  • S2 (only behavior-affecting slice): canonical dependsOn fully covers removed legacy DependsOn merge cases
  • New regression test asserts orders.dependsOn === users (ServiceReferences to dependsOn)
  • 18/18 CLI adapter tests pass; 18/18 aspire tests pass
  1. Static Gates - PASS
  • deno check: 784 files, 0 violations
  • deno lint: wrapper exit 1 with 0 occurrences (pre-existing wrapper bug on main); raw lint clean
  • deno fmt: 8 changed files clean (wrapper anomaly pre-existing on main)
  • deno doc --lint: aspire, cli, fresh, workers all pass
  • deno task arch:check: exit 0 (only pre-existing WARN/INFO)
  • deno task publish:dry-run: Success (all packages resolve exports)
  1. scaffold.runtime E2E - PASS WITH CAVEAT
  • 10/11 tasks pass; single database.init failure
  • Failure = recorded DEBT-2 (pre-existing db-init flake, out-of-scope)
  • Does not touch purge surface; GitHub Actions evidence green independently
  • Not a PR-C blocker
  1. Lock Hygiene - PASS
  • deno.lock UNTOUCHED (zero lines in diff)
  • Zero new casts introduced
  1. Arch-Debt Folding - PASS
  • 6 entries appended to arch-debt.md: RUN-ARTIFACT-ARCHIVAL-POLICY, PAGEBUILDER-LEGACY-COMPAT-TREE, FORMPAGEPROPS-PLAYGROUND-MIGRATION, REDIS-LEGACY-VALUE-FALLBACK, DEBT-1 (version timing), DEBT-2 (db-init flake)

Changes Made

None. This is an evaluation run only; no source code modifications.

Remaining Risks (Non-Blocking)

  1. DEBT-2 db-init flake: Recorded, owned by CLI E2E maintainers. Separate GitHub Actions evidence green.
  2. DEBT-1 version bump: Must be issued at JSR-publish prep (one repo-wide breaking bump). Breaking-change note recommended in PR body.
  3. Wrapper lint/fmt bug: failedBatches:1 with 0 occurrences reproduces on main. wrapper bug, not a PR-C regression.

Recommended Action

Merge PR #114 as-is with BREAKING CHANGE note calling out: aspire DependsOn alias removed (use canonical ServiceReferences / dependsOn); 3 Tier-1 compat exports removed. Per DEBT-1, no version bump.

Run: https://github.com/rickylabs/netscript/actions/runs/27995582550

@rickylabs
rickylabs marked this pull request as ready for review June 23, 2026 01:51
@rickylabs
rickylabs merged commit 08758c0 into main Jun 23, 2026
6 checks passed
@rickylabs
rickylabs deleted the chore/alpha1-legacy-purge branch June 23, 2026 01:53
rickylabs added a commit that referenced this pull request Jun 25, 2026
…ported ServiceEnv (#114) (#125)

JSR rejects publishing `@netscript/service@0.0.1-alpha.2`:

  modifying global types is not allowed
  file:///src/auth/hono-context.ts:10:16

`deno publish --dry-run` did NOT catch this — it is a server-side JSR check —
so both local and CI dry-runs passed green while the real publish aborted at
service, landing 18/31 packages then failing (the 12 queued after it never
uploaded).

Root cause: `hono-context.ts` used `declare module 'hono' { interface
ContextVariableMap { ... } }` to globally augment every Hono app's context
variables. JSR forbids ambient global-type modification in published packages.

Fix (behavior-identical for this package's own code):
- Remove the `declare module 'hono'` augmentation.
- Export `ServiceVariables` + `ServiceEnv` from hono-context.ts as the
  JSR-compliant opt-in: consumers type their app `new Hono<ServiceEnv>()`
  instead of relying on global pollution. Re-exported from `@netscript/service/auth`.
- Drop the three now-dead `import './hono-context.ts'` side-effect imports
  (types.ts, auth-middleware.ts, service-builder-impl.ts).

The service's own plumbing already typed contexts as plain `Context` /
`MiddlewareHandler` (env defaults to `any`), so `c.get('principal')` /
`c.set('principal')` / `c.get('logger')` resolve identically before and after.
The test suite owns its `AuthTestEnv` and never depended on the augmentation.

Validation:
- deno check --unstable-kv ./mod.ts ./src/auth/mod.ts — clean
- deno test ./tests/ — 57 passed, 0 failed


Claude-Session: https://claude.ai/code/session_014gW4zfhMMQU6txC828ijct

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
rickylabs added a commit that referenced this pull request Jun 26, 2026
* chore(release): bump workspace to 0.0.1-alpha.3

Native `deno bump-version prerelease` across all 32 workspace members plus the
root workspace version, in lockstep for the alpha.3 JSR release train. No source
or lock changes — version fields only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014gW4zfhMMQU6txC828ijct

* fix(release): repair 3 alpha.3 JSR release-train defects

The alpha.3 publish itself succeeded (all 31 members live), but every
release-triggered workflow went red on post-publish defects. None affect
the published packages; all three are fixed here.

1. jsr-set-package-settings: send ONE PATCH per changed field. JSR's
   `PATCH /scopes/{scope}/packages/{package}` deserializes into the
   externally-tagged enum `ApiUpdatePackageRequest`, which accepts exactly
   one field per request. The merged readmeSource+description+runtimeCompat
   body failed server-side with HTTP 400 `malformedRequest` for all 31
   packages, so the readmeSource toggle / description / runtimeCompat were
   never applied. Now one PATCH per field; interface/env/dry-run unchanged.

2. e2e-cli-prod + e2e harness: add `--minimum-dependency-age=0` on every
   JSR-mode install/check so Deno 2.9's supply-chain recency guard stops
   refusing the just-published CLI and its `jsr:@netscript/*` deps (<24h
   old). Gated on JSR mode only; local/maintainer e2e is byte-identical.

3. packages/cli/deno.json: declare `@netscript/{aspire,config,plugin}` jsr
   imports. JSR records dependencies from the import map, not the monorepo
   workspace array, so a standalone-installed CLI bin (added in alpha.3)
   could not resolve its `@netscript/*` siblings ("Import @netscript/plugin
   not a dependency"). deno.lock gains the 3 matching entries.

Refs #114 #116. Pages tag-policy defect (v* deploy ref) already fixed via
the github-pages environment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014gW4zfhMMQU6txC828ijct

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
rickylabs added a commit that referenced this pull request Jun 26, 2026
Whole-workspace version bump 0.0.1-alpha.3 -> 0.0.1-alpha.4 across all 32
members + the workspace-root deno.json. Cuts the alpha.4 release that
exercises the three alpha.3 release-train fixes (#131) end-to-end: the
per-field JSR settings PATCH, the Deno 2.9 --minimum-dependency-age=0 e2e
installs, and the standalone-CLI @netscript/* import resolution.

- `deno bump-version prerelease` bumped all 32 workspace members and (being
  workspace-aware) the packages/cli @netscript/{aspire,config,plugin} import
  ranges to ^0.0.1-alpha.4.
- The workspace-root deno.json version and the 3 matching deno.lock
  dependency entries were bumped manually: native bump-version only touches
  workspace[] members, so it skips the publish:false root meta-version and
  the lock's dependency mirror.

Validated: whole-workspace `deno publish --dry-run` succeeds (import ranges
and lock are consistent; all member tarballs build).

Refs #114 #116.


Claude-Session: https://claude.ai/code/session_014gW4zfhMMQU6txC828ijct

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
rickylabs added a commit that referenced this pull request Jun 26, 2026
…accepts them (#139)

The v0.0.1-alpha.5 whole-workspace publish partial-failed: @netscript/fresh-ui
and @netscript/plugin were rejected with "The import attribute type of 'text'
is unsupported", which also skipped @netscript/cli and 5 other dependents
(23 of 31 members published).

Root cause is a deno publish defect, not a config gap. The publish module-graph
build (deno_graph crate) never sets unstable_text_imports, so it rejects
`with { type: 'text' }` import attributes even though text imports are otherwise
stable and pass deno check / deno info / deno publish --dry-run. No CLI flag or
deno.json lever force-enables it on the publish path: text imports are stable
(so there is deliberately no flag), and --unstable-raw-imports only toggles the
separate `bytes` feature, which this workspace does not use. The flag added in a
prior attempt was therefore a no-op for the text error and is reverted here.

Fix: the assets-barrel generator now inlines each asset's content as a plain
string constant (`const template_NNN = "...";`) instead of importing it via
`with { type: 'text' }`. The three generated barrels keep their exact export
shapes (EMBEDDED_TEMPLATE_CONTENT, PLUGIN_SKELETON_TEMPLATE_CONTENT,
FRESH_UI_REGISTRY_CONTENT as Record<..., string>), so every consumer is
unchanged and the runtime asset-read path is identical. Plain string constants
carry no import attribute, so the publish graph builder has nothing to reject.

To keep determinism and formatting green, the generator pipes its rendered
output through `deno fmt` before writing, so the committed barrels are already
fmt-canonical: check:assets-barrel (regen + git diff --exit-code) and fmt:check
both stay byte-stable.

Also removes the now-dead `raw-imports` entry from the workspace-root unstable
list (no bytes imports exist repo-wide and text imports are stable).

Gates: check:assets-barrel exit 0 (deterministic), deno task check 0 findings
(1735 files), lint 0, fmt:check 0 findings, fresh-ui barrel+consumer type-check
exit 0, asset consumer unit tests 5/5 (including "reads embedded content without
hydration" and "no direct Deno.read").

Follow-up: deno publish --dry-run is a blind spot for this failure class (it
tolerates text imports the real publish rejects); a real-publish-equivalent
preflight is tracked under the deterministic JSR release/publish e2e (#114). An
upstream deno issue for the publish-graph unstable_text_imports gap will be filed.


Claude-Session: https://claude.ai/code/session_014gW4zfhMMQU6txC828ijct

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants