Skip to content

InnoRouter 7.0.0

Choose a tag to compare

@github-actions github-actions released this 08 Oct 05:31
· 8 commits to main since this release
Immutable release. Only release title and notes can be modified.
33b0da7

InnoRouter 7.0.0 ships the validated package state from the tagged commit.

Documentation

Changes

7.0.0 was published on 2026-10-08 after exact-tag release validation. PR54 work is carried forward
without a separate 6.1.1 release. See the 7.0 migration guide
and release checklist.
Current native scene probes passed at the SHA recorded in the
Xcode 27 report; this does not establish
every historical environment cause of the vision-cancel K1 failure.

Added

  • Library-owned Codex and Claude Code skill for planned stable 7.0.x, with
    navigation guidance and an independently validated consumer pinned to an
    unreleased main commit. This does not qualify a published 7.0.0 tag.

Breaking

  • RouterState is externally read-only; construct validated values with RouterStateDraft.
  • Restoring or replacing owned topology expires prior scope execution lifetimes.
  • Authorization generation and catalog contracts are explicit; inspect the 7.0 guides.
  • Input-bearing Store factories and tab/split host construction throw on invalid
    state, resource settings, or renderer declarations. Configure an independent
    host descriptor before mounting; it freezes root shape and root meaning.
    Handle setup errors explicitly. Existing stack RouterHost(store:) and
    UIKit/AppKit bridge factories remain nonthrowing.
  • Preserve retired tab branches explicitly with .preserveDormant and apply
    RouterTabRestorationTopology before admission when the catalog changes.
    A preserved branch cannot become a selected renderer. Replace topology and
    its declaration atomically through the owning Store's replaceHost operation.

Fixed

  • visionOS bound immersive declarations carry activation identity through native
    appearance. Recovery adopts only a matching, still-valid activation after an
    open failure; stale, foreign, cancelled, and replaced activations have no
    recovery authority. Bound scene and Store identities must remain stable.
    Regression probes validate attributed recovery, but do not reproduce a real
    OS open error followed by a late physical appearance or establish its cause.
  • A queued immersive restoration failure revalidates its restoration ticket
    before repairing canonical state. A matching appearance or a newer attempt
    invalidates the old repair; a genuine open failure still removes the scene.
  • The performance smoke explicitly admits its existing 500-route snapshot
    workload with a finite budget. Default limits, workload size, iteration counts,
    and timing thresholds remain unchanged; admission self-tests reject overflow.
  • Native stack and recursive child hosts now render typed alerts and
    confirmation dialogs through UIKit, AppKit, and WatchKit adapters. Captured
    lifetime handles fence stale callbacks; rejection/deferral re-presents a fresh
    attempt, explicit cancel returns its declared value, and iPad outside dismissal
    remains distinct. See the Xcode 27 validation report for executed coverage.
  • Generated scenario tests call throwing Store factories correctly. The new
    pending-link flag is named isRevalidationRequired; its existing transport key
    remains requiresRevalidation.
  • Deferred visionOS immersive-space closure restores through the surviving
    scene driver, avoiding open requests from the disappearing scene's invalid
    SwiftUI context. Driver replacement and stale-open compensation preserve
    the existing canonical lifetime protections.

PR54 groundwork originally planned for 6.1.1 (not separately released)

Fixed

  • @TabItem no longer changes a backticked tab's persisted scope when a
    sibling tab declares id:. Without any id:, routerScopeID is
    RouterScopeID(rawValue), which Swift spells without backticks. A sibling
    id: switches every case to a string literal, and that literal kept the
    author's backticks, so case `default` persisted as `default`
    beside an explicit ID and as default without one. Duplicate detection
    (E009) compared the backticked spelling too and missed a sibling
    id: "default". The default ID is now the unescaped case name in both
    paths. Routers without a backticked tab case expand unchanged. A 6.1.0
    snapshot that stored the backticked spelling restores that branch as an
    orphan; keep the old identity with an explicit id: that spells it.
  • Tab link planning no longer reports an applied push into an invisible,
    retired branch. In the final 7.0 contract, explicit restoration topology
    resolves retired selections before admission and the frozen host declaration
    rejects an incompatible renderer. Default links use the admitted selection.
  • RouterTabHost(store:), RouterSplitHost(store:), and
    RouterThreeColumnSplitHost(store:) no longer abort the process when the
    Store's declaration or root is incompatible with the renderer. The final 7.0
    constructors throw a typed validation error instead of adopting a fallback
    catalog, root, or empty scope. Ordinary restoration retains the configured
    host contract; an intentional topology/root-meaning change uses atomic
    replaceHost. Hosts never register or rewrite the Store's declaration.
  • RouterRestorationDriver applies its RouterSnapshotRecoveryPolicy to a
    typed storage rejection. RouterFileSnapshotStorage(maximumByteCount:)
    rejects an oversized file before the codec reads it, and activation failed
    on every launch even with .use, although the codec's own limit error
    reached the policy. .use now receives the storage's
    RouterSnapshotError and submits the fallback as the restore request
    through normal policies, so inspect transition as for any restore;
    .fail still fails activation and preserves the file. An untyped storage error still fails
    activation, and the partial-validation driver still applies no recovery.
  • The macro plugin no longer uses an exhaustive switch over a swift-syntax
    enum. Built with library evolution — a Release build with
    BUILD_LIBRARY_FOR_DISTRIBUTION, as in the platform gates — swift-syntax
    604's accessor enum is resilient, and the plugin failed to compile. An
    accessor shape a later swift-syntax adds is rejected as not get-only.

Changed

  • Package.swift admits swift-syntax "603.0.2"..<"605.0.0", adding the
    604 line that Xcode 27 / Swift 6.4 pairs with, so an application whose
    other macro packages require 604 resolves InnoRouter. The committed
    resolution is 604.0.0 (050f1a346fbbac0ca2cfb15a95274f7bd1cf0ccf).
    603.0.2 is the supported dependency floor, not the current lock pin.
  • A new xcode-27 CI job runs the package tests with Xcode 27, re-resolves
    the newest admitted swift-syntax, runs both macro suites against it, and
    builds the macro-first consumer with library evolution. It is a forward
    lane on GitHub's preview image, not a release pin.
  • Simulator jobs boot through scripts/boot-simulator.py, which shuts down,
    erases, and retries a device whose boot never completes, up to three
    attempts. A stuck boot failed the 6.1.0 release run's visionOS job.
  • Failed simulator test jobs print every assertion their result bundle
    recorded; -quiet output named the failing test only. The native scene
    evidence upload runs only when its probe ran, so a missing log no longer
    buries an earlier failure.
  • The Inspector UI localization test is split into three scenarios that each
    launch a fresh probe, and one-time reads became predicate waits with the
    same timeouts. No retry was added and no Inspector assertion was removed.
  • RELEASING.md classifies adding a case to an existing public enum as
    breaking. SwiftPM clients compile InnoRouter without library evolution, so
    every public enum is exhaustive to them, whether or not it is @frozen.

Known issues

  • 6.1.0 added RouterSnapshotError.invalidByteLimit, .encodedDataTooLarge,
    and .payloadTooLarge under the previous release policy. A client switch
    over RouterSnapshotError without default stops compiling when it moves
    from 6.0 to 6.1. The cases remain, because removing them would break 6.1.0
    clients again; handle them or add a default branch.

What's Changed

  • chore(ci): bump softprops/action-gh-release from 3.0.2 to 3.0.3 by @dependabot[bot] in #45
  • chore(ci): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #44
  • docs: strengthen maintainer verification rules by @Ethan-IS in #52
  • ci: standardize selective validation and safe public operations by @Ethan-IS in #55
  • fix: isolate metadata CI and restore deferred immersive scenes by @Ethan-IS in #57
  • fix(ci): 메타데이터 검증과 aggregate 전환 절차 보강 by @Ethan-IS in #58
  • Prepare InnoRouter 7.0 host candidate with Xcode 27 native validation by @Ethan-IS in #60
  • fix: fence native restoration repairs and prepare 7.0.0 candidate by @Ethan-IS in #61
  • Diagnose native immersive repair ordering for 7.0 by @Ethan-IS in #62
  • Fix attributed visionOS immersive restoration by @Ethan-IS in #63
  • docs: unify GitHub Sponsors and Patreon links by @Ethan-IS in #64
  • docs: finalize 7.0.0 release date and recovery notes by @Ethan-IS in #65
  • feat: InnoRouter 7.0.x 예정 API용 라이브러리 소유 AI 스킬 추가 by @Ethan-IS in #66
  • docs: include merged skill notes in 7.0.0 release cut by @Ethan-IS in #67

Full Changelog: 6.1.0...7.0.0