Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d16e28e
docs: plan Icod.Terminal 1.18.0 rendition baseline
uniblab Sep 18, 2026
af1ba1f
docs: refine rendition baseline safety contract
uniblab Sep 18, 2026
cfb6fcb
docs: separate local and downstream acceptance gates
uniblab Sep 18, 2026
4faf8db
docs: clarify downstream fixture boundary
uniblab Sep 18, 2026
1f9d670
docs: complete rendition baseline acceptance cases
uniblab Sep 18, 2026
53dadc2
test: freeze rendition baseline contract
uniblab Sep 18, 2026
0d1501f
feat: add rendition baseline planning
uniblab Sep 18, 2026
616fe99
fix: correct rendition baseline condition
uniblab Sep 18, 2026
6833931
test: harden rendition baseline safety
uniblab Sep 18, 2026
c659ed9
test: freeze Terminal 1.18 public API
uniblab Sep 18, 2026
09cb426
test: freeze Terminal 1.18 public API
uniblab Sep 18, 2026
b369a37
test: freeze Terminal 1.18 public API
uniblab Sep 18, 2026
e22f548
test: observe rendition baseline lifecycle purity
uniblab Sep 18, 2026
141fd5d
test: qualify rendition baseline ownership
uniblab Sep 18, 2026
0906219
test: qualify Terminal 1.18 package contracts
uniblab Sep 18, 2026
132ca3e
test: qualify Terminal 1.18 package contracts
uniblab Sep 18, 2026
d638645
test: qualify Terminal 1.18 package contracts
uniblab Sep 18, 2026
b70ec50
test: qualify Terminal 1.18 package contracts
uniblab Sep 18, 2026
36a0b3c
docs: prepare Terminal 1.18 stable candidate
uniblab Sep 18, 2026
5556434
fix: update Terminal 1.18 package release notes
uniblab Sep 18, 2026
56bbc01
fix: finalize Terminal 1.18 package README
uniblab Sep 18, 2026
fa9a34c
docs: record Terminal 1.18 qualification
uniblab Sep 18, 2026
8fc4a0a
docs: align Terminal 1.18 authority labels
uniblab Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

Notable changes to `Icod.Terminal` are recorded here for consumers who need a concise release history. Detailed design evidence remains in the versioned roadmaps, tranche records, and public-API baseline documents.

## 1.18.0

### Unknown-rendition baseline recovery

- Adds `TerminalScreenPlanner.PlanRenditionBaseline()` for safe recovery from unknown physical rendition state without requiring a caller-supplied known current rendition.
- Derives obligations from raw attribute-entry and color-selection evidence; returns `null` when any exposed axis cannot be restored unconditionally.
- Emits global attribute reset or every required safe specific exit in stable order, then restores original colors.
- Preserves valid zero-byte planning for empty and reset-only profiles while retaining exact byte cost, padding, affected-line, same-session ownership, stale-epoch, cancellation, and transaction semantics.
- Exposes no TermInfo type or raw capability/terminal-string API and leaves retained screen/layout/damage policy above Terminal.
- Finalizes identical `net8.0`/`net9.0`/`net10.0` public API snapshots with fingerprint `48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d`.
- Retains production dependencies `Icod.TermInfo 1.15.0` and `Icod.Timing 1.0.0`.
- Qualifies fresh package consumers, published `Icod.DCurses 1.6.0` compatibility, and a separate TermInfo-free future-renderer package consumer on all target frameworks.

See `docs/releases/1.18.0.md`, `docs/Public-API-Baseline-1.18.md`, and `Icod.Terminal-1.18.0-Development-Roadmap.md` for the complete contract.

## 1.17.1

### Packaged README and release metadata correction
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<!-- Repository-wide release version authority. -->
<VersionPrefix>1.17.1</VersionPrefix>
<VersionPrefix>1.18.0</VersionPrefix>
<VersionSuffix></VersionSuffix>
<Version Condition="'$(VersionSuffix)' == ''">$(VersionPrefix)</Version>
<Version Condition="'$(VersionSuffix)' != ''">$(VersionPrefix)-$(VersionSuffix)</Version>
Expand Down
173 changes: 173 additions & 0 deletions Icod.Terminal-1.18.0-Development-Roadmap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# Icod.Terminal 1.18.0 Development Roadmap

**Release:** `1.18.0`
**Theme:** Unknown-rendition baseline recovery for Terminal-only screen consumers
**Status:** T180-T185 accepted; stable `1.18.0` candidate qualified
**Candidate identity:** `1.18.0`
**Stable compatibility floor:** `1.0.0`
**Current published line:** `1.17.0`; `1.17.1` is the documentation-only patch baseline

## Release objective

Version 1.18 closes the single Terminal contract gap found by the `Icod.DCurses 2.0` decoupling readiness gate. A renderer that does not know the terminal's physical rendition state must be able to request one safe, opaque plan that restores every rendition axis exposed by the selected profile's enter/select evidence.

The governing rule is:

> Terminal may claim a rendition baseline only when it can unconditionally restore every rendition axis exposed by the selected profile that Terminal can enter or select; otherwise no plan is available.

The dependency direction remains:

```text
Icod.DCurses -> Icod.Terminal -> Icod.TermInfo
```

`Icod.TermInfo` remains Terminal's private capability-data, expansion, padding, and cost authority. No TermInfo type, capability identifier, terminal string, or expansion program enters the new public contract.

## Design and implementation authorities

- [`docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md`](docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md)
- [`docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md`](docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md)
- [`Icod.DCurses 2.0 PR #32`](https://github.com/uniblab/Icod.DCurses/pull/32)

## Accepted implementation record

T180-T185 are complete on PR #63. The implementation adds only `PlanRenditionBaseline()` to the public surface and retains production `Icod.TermInfo 1.15.0` / `Icod.Timing 1.0.0`.

- T180 recorded the `CS1061` package/source RED witness before the method existed.
- T181 implemented unknown-state restoration with all-or-nothing availability.
- T182 qualified attribute-only, color-only, combined, specific-exit, unsafe, empty, reset-only, padding, deterministic, and side-effect-free behavior.
- T183 qualified same-session ordering, foreign-session rejection, stale output epochs, and pre-commit cancellation.
- T184 froze identical API snapshots at `48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d`, verified the deliberate mismatch rejection, and passed the candidate package, XML, dependency, published DCurses 1.6.0, and TermInfo-free future-renderer consumers across all three target frameworks.
- T185 finalized stable package identity and release-facing metadata, then qualified the stable candidate at commit `56bbc011325e5c88e67f243a9b882b97bae9aac7` in workflow run `35382158657`.

The retained DCurses PR #32 package witness remains governed by its published-package resume criterion. It resumes after `Icod.Terminal 1.18.0` is published; no unpublished project reference or raw TermInfo workaround is introduced.

## Stable-candidate qualification

Workflow run [`35382158657`](https://github.com/uniblab/Icod.Terminal/actions/runs/35382158657) passed all nine jobs at source head `56bbc011325e5c88e67f243a9b882b97bae9aac7`: Windows, Linux, macOS, package candidate, Foundation, Presentation, Semantic and hardening, Stable 1.x release line, and validated package artifact.

- Unit tests: 2,383 passed, zero failed, on each of `net8.0`, `net9.0`, and `net10.0`.
- TermInfo integration tests: 15 passed, zero failed, on each target framework.
- Stable package: `Icod.Terminal.1.18.0.nupkg`, SHA-256 `e8f2b374fd0865aa151910686197096b344f7daf8d0ef72331520d944b322932`.
- Symbols package: `Icod.Terminal.1.18.0.snupkg`, SHA-256 `8a14d163f2ea0bf030bea0416e0a84a919a2e8c83c692956b3a2a98470d78422`.
- Candidate artifact: ID `10563191796`, uploaded ZIP SHA-256 `b0fc9e57dcd0ccf42befc7d8d6fe91e9b0e19b62691fbfb775164252147fa028`.
- Validated artifact: ID `10562732859`, uploaded ZIP SHA-256 `1ddf8f76fbb6131271dd9123d5cab8043ddc68fd0084dfc1d1e84e8916121537`.
- Public API: identical on all target frameworks, SHA-256 `48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d`.
- Package consumers: stable 1.x smoke, published `Icod.DCurses 1.6.0` soak, and the TermInfo-free future-renderer screen-contract witness passed on all target frameworks.

## Public contract

Add one method to the existing session-bound planner:

```csharp
public TerminalScreenOperationPlan? PlanRenditionBaseline();
```

The method represents an unknown physical rendition, not a known current `TerminalScreenRendition`. It is side-effect free and returns an opaque `Rendition` plan owned by the same planner/session.

The returned plan:

- restores all enterable text attributes to their normalized default through a global reset or a complete stable sequence of safe specific exits;
- restores foreground and background colors to terminal defaults whenever Terminal can select colors;
- emits the global attribute reset before original-color restoration;
- includes capability expansion, padding, exact encoded-byte cost, and affected-line accounting;
- remains valid only through the existing same-session transaction ownership rules.

The method returns `null` if any profile-exposed enterable/selectable rendition axis cannot be restored safely from an unknown state. This obligation is computed from entry/selection evidence before current normalization suppresses unsafe requests. A valid zero-byte plan is allowed only when the profile exposes no enterable attribute and no selectable color axis; reset capabilities alone do not create reachable state.

Existing `PlanRenditionTransition(...)`, `PlanRenditionReset(current)`, normalization, operation-plan opacity, and transaction semantics remain unchanged.

## Tranche sequence

```text
T180 contract freeze, reference snapshot, API-regret gate, and alpha identity
T181 unknown-state rendition-baseline planner and focused red-green tests
T182 capability ordering, padding, cost, zero-byte, and nullability hardening
T183 session ownership, transaction commitment, and adversarial qualification
T184 package/API/XML/docs and DCurses 2.0 package-only acceptance
T185 release-candidate qualification and stable 1.18.0 closure
```

## T180 — Contract freeze and development identity

Record the 1.17.1 baseline, establish `1.18.0-alpha.1`, and freeze the single additive public signature and its XML contract before implementation.

Acceptance requires:

- no change to existing 1.x signatures or behavior;
- no raw TermInfo or escape-sequence exposure;
- explicit distinction between unknown physical state and known-current reset;
- exact profile-evidence, safety, nullability, ordering, ownership, and zero-byte rules;
- a package-level failing witness matching the DCurses T2001 blocker, with representative enter/select capabilities added to its synthetic profile so the `<sgr0><op>` expectation is semantically reachable.

## T181 — Baseline planner

Implement `PlanRenditionBaseline()` in `TerminalScreenPlanner` using existing private capability interpretation and opaque plan construction.

Acceptance covers:

- attribute-only profiles using global attribute reset;
- multi-attribute profiles without a global reset using every required safe specific exit in stable order;
- color-only profiles using original-color-pair restoration;
- combined profiles emitting attribute reset before color restoration;
- correct `Rendition` kind and one affected line;
- side-effect-free planning followed by exact-byte transaction commitment.

## T182 — Safety and cost hardening

Prove that availability describes unconditional recovery rather than a best-effort partial reset.

Acceptance covers:

- `null` when any enterable attribute lacks both a global reset and a safe specific exit;
- complete specific-exit coverage and stable underline, standout, italic, then strikeout ordering when no global reset exists;
- `null` when foreground or background selection is available without original-color-pair restoration;
- a zero-byte plan only for a profile with no enterable attribute and no selectable color axis, including a reset-only profile;
- exact padding-sensitive byte cost after capability expansion;
- deterministic segment ordering, overflow safety, and repeated-call stability;
- no dependence on a caller-supplied or retained physical rendition state.

## T183 — Ownership and transaction qualification

Exercise the new plan through the existing transaction boundary without inventing another output or state domain.

Acceptance covers same-session commitment, foreign-session rejection, stale-epoch rejection, cancellation before commitment, serialized output, and unchanged cleanup/failure behavior. Planning itself must perform no writes, flushes, epoch changes, or lifecycle mutation.

## T184 — Package and downstream acceptance

Freeze identical public API/XML snapshots for `net8.0`, `net9.0`, and `net10.0`; update the active baseline selector, package smoke, and the local future-DCurses compile/package consumer. That local consumer and the eventual DCurses production boundary must have no direct `Icod.TermInfo` reference. Separately, compile and run the DCurses T2001 exact-byte witness against the candidate package using its already reviewed test-only TermInfo fixture exception. The retained downstream witness's synthetic profile must add representative enter/select capabilities before it can truthfully expect `<sgr0><op>`; its public API call, transaction path, and exact-byte assertion remain unchanged.

Published `Icod.DCurses 1.6.0` compatibility remains a separate required witness. Production dependencies remain `Icod.TermInfo 1.15.0` and `Icod.Timing 1.0.0` unless an independently justified qualification issue requires a later reviewed change.

## T185 — Stable closure

Complete cross-platform, package, public-API, XML-documentation, dependency, security, and exact-head artifact qualification. Synchronize README, changelog, compatibility authority, release notes, and the main roadmap.

Tagging, release creation, and publication remain explicit maintainer actions after the stable candidate is accepted.

Current closure work removes the prerelease suffix, synchronizes consumer/release/architecture/security documentation, runs the complete exact-head workflow, records its artifact/test evidence, and stops before merge, tag, GitHub Release, or publication.

## Explicit non-goals

Version 1.18 does not add:

- retained physical rendition state or automatic state tracking;
- desired-versus-physical screen comparison or repaint policy;
- Terminal-owned cells, windows, layout, clipping, damage, or Unicode width;
- public raw capabilities, terminal strings, or generic control-sequence builders;
- a replacement for `PlanRenditionReset(current)`;
- transaction, output-epoch, hyperlink, raster, input, query, or lifecycle redesign;
- new raster-animation, PTY, process-hosting, or widget features;
- a production dependency update without separate evidence and review.

## Release gates

The stable candidate must pass:

- focused red-green exact-byte rendition-baseline tests;
- the full unit and TermInfo-integration suites on all target frameworks;
- Windows, Linux, and macOS workflow matrices;
- package/public API/XML/license validation;
- fresh package-only screen-contract and DCurses 2.0 readiness consumers;
- published DCurses 1.6 compatibility and hardening;
- exact-head artifact and independent review gates.
48 changes: 44 additions & 4 deletions Icod.Terminal-Development-Roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
- **Target frameworks:** `net8.0`; `net9.0`; `net10.0`
- **Current published feature line:** `1.17.0` — Terminal-owned Screen Output Contracts
- **Current patch line:** `1.17.1` — Packaged README and release metadata correction
- **Development status:** 1.17.0 published; 1.17.1 documentation-only patch in qualification
- **Development status:** 1.17.1 published; 1.18.0 stable candidate qualified on PR #63
- **Active development target:** `1.18.0` — Unknown-rendition baseline recovery for Terminal-only screen consumers
- **Stable compatibility floor:** `1.0.0`

## Purpose
Expand All @@ -23,6 +24,8 @@ The published feature line uses production `Icod.TermInfo 1.15.0` and optional t

Version 1.17.1 is a documentation-only patch that corrects the README embedded in 1.17.0 and synchronizes release metadata. It makes no runtime or public-API change.

Version 1.18.0 is a qualified stable source candidate on PR #63. T180-T185 are accepted: the additive unknown-rendition baseline API, hardening/ownership tests, identical three-framework API fingerprint, package/XML gates, published DCurses 1.6.0 soak, TermInfo-free future-renderer package witness, and nine-job stable-candidate workflow are complete. Merge, tag, release creation, and publication remain maintainer actions.

## Current architecture

```text
Expand Down Expand Up @@ -71,12 +74,13 @@ Optional integration tests/samples may use `Icod.TermInfo.Inspection 1.15.0`; In
1.16.0 persistent raster animation and frame lifecycle PUBLISHED
1.17.0 Terminal-owned dimensions, screen planning, and transactions PUBLISHED
1.17.1 packaged README and release metadata correction PATCH
1.18.0 unknown-rendition baseline recovery CANDIDATE
```

The final 1.17 public API fingerprint is:
The 1.18 public API fingerprint is:

```text
c0a051a925d551e526343ef59d8c47d75e41868d84235fa30bfa7debe1b3ceb9
48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d
```

Permanent ownership authority: [`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md).
Expand Down Expand Up @@ -212,8 +216,44 @@ Authorities:
- [`docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md`](docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md)
- [`docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md`](docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md)

## 1.18 development line — Unknown-rendition Baseline Recovery

Version 1.18 is a focused additive release that closes the sole blocking Terminal contract found by the DCurses 2.0 readiness gate.

The governing rule is:

> Terminal may claim a rendition baseline only when it can unconditionally restore every rendition axis exposed by the selected profile that Terminal can enter; otherwise no plan is available.

The release adds one public planner method:

```csharp
public TerminalScreenOperationPlan? PlanRenditionBaseline();
```

The plan represents unknown physical rendition state, restores attributes before original colors in a safe deterministic order, retains Terminal-owned expansion/padding/cost and same-session transaction ownership, and returns a valid zero-byte plan only when the selected profile exposes no enterable attribute and no selectable color axis. Existing known-state reset and transition behavior remains unchanged.

T180-T185 are accepted. The stable candidate at `56bbc011325e5c88e67f243a9b882b97bae9aac7` passed the complete Windows/Linux/macOS, package, API/XML, downstream, and artifact matrix in workflow run `35382158657`. Publication remains a separate maintainer action.

The tranche sequence is:

```text
T180 contract freeze, reference snapshot, API-regret gate, and alpha identity
T181 unknown-state rendition-baseline planner and focused red-green tests
T182 capability ordering, padding, cost, zero-byte, and nullability hardening
T183 session ownership, transaction commitment, and adversarial qualification
T184 package/API/XML/docs and DCurses 2.0 package-only acceptance
T185 release-candidate qualification and stable 1.18.0 closure
```

Authorities:

- [`Icod.Terminal-1.18.0-Development-Roadmap.md`](Icod.Terminal-1.18.0-Development-Roadmap.md)
- [`docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md`](docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md)
- [`docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md`](docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md)
- [`Icod.DCurses 2.0 PR #32`](https://github.com/uniblab/Icod.DCurses/pull/32)

## Later development candidates

After 1.17, independent candidates still include animation-frame composition, absolute screen-coordinate placement, pixel-within-cell positioning, richer terminal-side reconciliation only if a truthful non-destructive primitive exists, image-file decoding/transcoding, and PTY/ConPTY process hosting.
After 1.18, independent candidates still include animation-frame composition, absolute screen-coordinate placement, pixel-within-cell positioning, richer terminal-side reconciliation only if a truthful non-destructive primitive exists, image-file decoding/transcoding, and PTY/ConPTY process hosting.

Scene/window/cell ownership and hidden source-raster replay caches remain intentionally outside the Terminal contract.
2 changes: 1 addition & 1 deletion Icod.Terminal.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
<Title>Icod.Terminal</Title>
<Authors>Timothy J. Bruce</Authors>
<Description>Managed, cross-platform live-terminal session, endpoint, mode, input, lifecycle, and terminal-control foundation for .NET.</Description>
<PackageReleaseNotes>Icod.Terminal 1.17.1 corrects the packaged README and release metadata for the published 1.17 line without changing the runtime or public API. Release notes: https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.17.1.md. Compatibility policy: https://github.com/uniblab/Icod.Terminal/blob/main/docs/Compatibility-and-Versioning.md.</PackageReleaseNotes>
<PackageReleaseNotes>Icod.Terminal 1.18.0 adds safe unknown-rendition baseline planning for Terminal-only screen consumers. Release notes: https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.18.0.md. Compatibility policy: https://github.com/uniblab/Icod.Terminal/blob/main/docs/Compatibility-and-Versioning.md.</PackageReleaseNotes>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageIcon>icon.png</PackageIcon>
<PackageProjectUrl>https://github.com/uniblab/Icod.Terminal</PackageProjectUrl>
Expand Down
Loading
Loading