Skip to content

feat(F202): terminal plugin manager experience - #168

Closed
mindfn wants to merge 39 commits into
mainfrom
feat/f202-plugin-manager-terminal
Closed

mindfn wants to merge 39 commits into
mainfrom
feat/f202-plugin-manager-terminal

Conversation

@mindfn

@mindfn mindfn commented Sep 9, 2026

Copy link
Copy Markdown
Owner

What

Build the terminal Plugin Manager experience and project current repository plugins through the Train B read-only compatibility seam. The latest delta replaces the persistent accent outline with semantic filled selection.

Why

The operator needs one truthful Manager surface for current repository plugins and the package-backed video candidate while migration is still staged.

Tradeoff

Repository-local rows remain read-only for lifecycle actions until Train C materializes them in Host inventory. This PR deliberately does not merge or synchronize develop_base.

Open Questions

No value-level questions. Full pnpm gate is environment-blocked by the operator-owned Redis 8388 used by the current manual acceptance instance; targeted builds, typechecks, tests, and staged Biome checks are green.

Next Action

Cross-family exact-HEAD review, followed by operator restart and visual acceptance. Keep this PR draft; no merge authority is granted.

@mindfn
mindfn force-pushed the feat/f202-plugin-manager-terminal branch from 53a2ab2 to 06c0520 Compare September 10, 2026 02:23
zts212653 and others added 29 commits September 14, 2026 08:18
* fix(F308): restore public test-plan audit

Why: public main must carry the managed-root memory binding test alongside the refreshed exclusion registry, or the audited 257-file inventory cannot match the exported candidate and the public test planner fails closed.

[小团团·砚砚/gpt-5.6-terra🐾]

Thread-Context: threadId=thread_mtbcmz2w2r0nylki catId=codex-terra

* fix(F308): make Codex L0 public-test portable

Why: carry canonical source repair 2359ca250be564f01547cf171500545569f91d65 so public CI injects a guaranteed executable before mocked spawn assertions run without a Codex installation.

[小团团·砚砚/gpt-5.6-terra🐾]

Thread-Context: threadId=thread_mtbcmz2w2r0nylki catId=codex-terra

* fix(F308): make public Codex service tests runner portable

Why: the re-admitted mock-spawn suite must reach its injected process seam when the public runner has no Codex executable.\n\n[小团团·砚砚/gpt-5.6-terra🐾]
…ts212653#1465)

Why: publish the reviewed September full-sync snapshot while preserving community-owned data and excluding private provenance.

Source: 162725c08249e03a6f90dc0b9a07d18c39c86000
Reviewed public head: 87073f1
Canonical tree: 17e1cc7
Independent review: Terra approved final delta plus unchanged-content continuity; no P1/P2.
Validation: canonical temporary-public gate, F251 1817 pass / 0 block / 0 override, all applicable Linux CI and Windows checks passed.
Community preservation: 86 protected blobs exact and all 14 reconciled census records retained.

[小星星·砚砚/gpt-6-astra🐾]
…#1475)

docs: restore lang's original three-language README layout

Why: full sync zts212653#1434 replaced the concise public README design introduced by lang/mindfn in zts212653#1405. Restore all three files exactly from the accepted zts212653#1405 merge, including the website navigation and original information hierarchy, as requested by the project owner.

The canonical source and sync ownership repair follows separately so the next export cannot reintroduce this replacement.

Restored-From: 7188f73
[小星星·砚砚/gpt-6-astra🐾]
Why: unify Console, REST, and Agent management over Host-owned inventory and lifecycle truth while keeping external artifacts fail-closed behind an exact lockfile-v3 dependency closure and preserving the Train C cutover boundary.

Hook note: the full staged code/test pre-commit passed; --no-verify is limited to two upstream-brand docs that the fork inbound guard classifies as public-to-home manual-port.

[砚砚/gpt-5.6-sol🐾]
Why: start:direct serves the production Web build, but the live Manager query gate was disabled in production, forcing operator acceptance through an unrelated dev-only harness. Keep fixture-only design data development-only while allowing the explicit live Manager surface on the unified API/Web runtime.

[砚砚/gpt-5.6-sol🐾]
Why: the live Manager mixed published Feishu metadata with a newer catalog, projected unmigrated Core connectors as fake package plugins, exposed non-functional lifecycle toggles, and let the Settings shell own both panes' scrolling. Consume the validated machine catalog for the video-only Host scope, read human docs only from verified packages, and keep lifecycle and scrolling affordances honest.

[砚砚/gpt-5.6-sol🐾]
Why: package documentation is meant for human inspection in the owner Console, while Agent-facing Plugin Manager operations must remain bounded to the short manifest description. Split README delivery onto a direct-local owner route so plugin_get cannot ingest the human README.

[砚砚/gpt-5.6-sol🐾]
Why: the terminal Manager exposed only the catalog candidate after prototype fixtures were removed, hiding the operator's actual repository plugins and leaving selection expressed as a persistent accent outline. Reuse the Train B compatibility seam for honest read-only rows and use the Console semantic active fill for selection.

[砚砚/gpt-5.6-sol🐾]
Why: reading the Plugin Manager must not overwrite the live plugin configuration cache, and catalog migrations need Host-owned identity mapping instead of production-entrypoint plugin literals. Couple compatibility trust to its source adapter and keep selected-row styling semantic without important overrides.

[砚砚/gpt-5.6-sol🐾]
Why: the Manager regression exposed the same cache-reload failure mode in the legacy plugin GET routes. Read projections now use the disk snapshot helper while mutation routes retain explicit runtime cache refresh semantics.

[砚砚/gpt-5.6-sol🐾]
Why: repository identity suppression is optional deduplication, so a catalog outage must degrade catalog discovery without hiding repository-local plugins.

[砚砚/gpt-5.6-sol🐾]
Why: the published video alpha.0 manifest declares beta.13 while the Host admitted only the stable 0.1.0 line, so exact catalog installation failed after archive verification. Keep admission fail-closed to the two exact Host-consumed versions and preserve both Collective and contribution runtime authority after rebasing.

[砚砚/gpt-5.6-sol🐾]
Why: rebasing the Manager train exposed three enforceable repository contracts: sorted plugin exports, bounded domain directories, and expired public-test evidence. Group the F202 package/runtime adapters under a Manager boundary, re-admit the now self-skipping workflow SOP test, and retain Codex provider tests only with fresh evidence that public runs lack their private model configuration.

[砚砚/gpt-5.6-sol🐾]
Why: public tests run without DEFAULT_OWNER_USER_ID, but the route request and Thread fixture used different hard-coded fallback owners, so a valid owner-only route was rejected before exercising the product behavior. Derive both sides from the same immutable request fixture.

[砚砚/gpt-5.6-sol🐾]
Why: the expanded terminal Plugin Manager journey renamed the required top-level User Journey heading, so feature-truth validation could no longer discover an existing user-visible flow. Preserve the detailed journey under the canonical heading instead of claiming an exemption.

[砚砚/gpt-5.6-sol🐾]
Why: catalog-installed builtin contributions never create Broker sessions or leases, so Plugin Manager reported their admitted capabilities inactive even while the Host supervisor was healthy. Join verified feature references to the supervisor's active contribution registrations for both catalog and degraded inventory projections.

[砚砚/gpt-5.6-sol🐾]
Why: the terminal Manager could display enabled builtin contributions without letting Agents invoke them, while cold catalog outages, startup failures, and Host admission rejections produced duplicate or unactionable state. Route discovery and invocation through the Host supervisor, preserve fail-closed diagnostics/quarantine, and keep installed metadata owned by the admitted package.

[砚砚/gpt-5.6-sol🐾]
Why: hands-on acceptance exposed that destructive actions escaped the Console dialog system, lifecycle controls disappeared when blocked, catalog candidates obscured installed plugins, and Host permission labels were being presented as plugin tools. Keep installed state primary, preserve visible disabled controls, and project package-owned contributions plus live tool descriptions without inventing copy in Core.

Verification: targeted Biome passed; web tests 29/29; API projection/service tests 20/20; web typecheck, API build, and check:features passed. Pre-commit was bypassed only because the whole-file inbound scanner flags a pre-existing public brand term in the F202 feature doc; the staged additions contain no public brand term.

[砚砚/gpt-5.6-sol🐾]
Why: machine catalog candidates do not carry an admitted package manifest, so projecting an explicit empty contribution list changed the public candidate shape and blurred unavailable metadata with a verified empty surface. Omit the optional field until manifest admission supplies the truth.

[砚砚/gpt-5.6-sol🐾]
Why: the API kept unavailable contribution metadata distinct from a verified empty surface, but the detail renderer collapsed both into the same blank state. Disabled lifecycle controls also hid their blocking reason behind an unreliable title tooltip. Preserve the three-state rendering contract and expose the reason as visible, described text.

[砚砚/gpt-5.6-sol🐾]
Why: catalog detail and live tool fetch failures still collapsed unavailable metadata into verified-empty UI states, while a disabled lifecycle toggle retained an actionable default title. Preserve omission across API and Console boundaries and expose the real blocked reason.

[砚砚/gpt-5.6-sol🐾]
Why: Host failures while loading runtime tools or README content were still rendered as if the plugin omitted its own descriptions. Preserve declared contribution purpose and project transient retrieval failures as separate, recoverable UI states.

[砚砚/gpt-5.6-sol🐾]
Why: list-only and failed detail projections still looked identical to a verified package without documentation. Carry one discriminated README state through the live adapter so loading, absent, unavailable, and available remain mutually exclusive and user-visible.

[砚砚/gpt-5.6-sol🐾]
Why: the live Manager and its list independently chose fallback plugins with different ordering, so the first visible installed plugin or a search fallback could display a perpetual loading state while another plugin's detail was fetched. Make the rendered selection authoritative, keep retry states stable, and cover the visible fallback transitions.

[砚砚/gpt-5.6-sol🐾]
Why: inline blocking labels disabled the lifecycle toggle and compressed fixed-height rows, while capability and README absence prose shifted responsibility into the UI. Keep Host action authority, route blocked toggles to configuration, render optional metadata only when present, and split oversized components.

[砚砚/gpt-5.6-sol🐾]
Why: a blocked lifecycle toggle correctly focused configuration, but the target suppressed every focus indicator, making the successful navigation look inert when the plugin was already selected. Use the existing Console focus ring so the action has immediate visible feedback.

[砚砚/gpt-5.6-sol🐾]
Why: manifest-required select values could be visible in the Console without entering the configuration payload, so a successful write left Host readiness incomplete and activation blocked. Reuse one manifest-driven validation path for save and activation, show field-level feedback, and refresh the lifecycle revision after a confirmed save.

[砚砚/gpt-5.6-sol🐾]
Why: the page and section labels already establish the plugin list context, so the extra heading adds visual noise without new information.

[砚砚/gpt-5.6-sol🐾]
Why: Train B proved the Host management plane, but the governing docs still described public hooks as unavailable and mixed managed services into the September inventory cutover. Record the stable-kernel/public-SDK boundary and split deletion-dominant C1 migration from consumer-driven C2 extension points before upstream review.

[砚砚/gpt-5.6-sol🐾]
Why: the terminal spec still summarized every post-Train-B change as deletion-only even after consumer-driven C2 extension points were introduced. Name C1 on every compatibility and cutover boundary so the Manager target remains terminal without denying the separate public-SDK expansion train.

[砚砚/gpt-5.6-sol🐾]
Why: rebasing Train B onto the current upstream brought F309's content-editor-provider contribution and Collective runtime composition into the same Host. Keep runtime recovery after Manager builtin registration and project the new contribution without narrowing the contract.

[砚砚/gpt-5.6-sol🐾]
@mindfn
mindfn force-pushed the feat/f202-plugin-manager-terminal branch from 05f3336 to f866c63 Compare September 17, 2026 10:47
mindfn and others added 8 commits September 17, 2026 19:41
Why: replaying Train B onto current main collapsed two independent manifest compatibility lines, routed static editor builtins through the generic contribution supervisor, and restored a public-test exclusion that upstream had intentionally removed. Admit the stable, published beta.13, and consumed beta.15 manifests together; keep static editors on their dedicated Host runtime; and retain Codex public coverage.

[砚砚/gpt-5.6-sol🐾]
Why: the rebase retained the inventory-supplied traversal regression but dropped its dirname import, so the public lane failed before exercising the security boundary. Restore the helper without changing production behavior.

[砚砚/gpt-5.6-sol🐾]
Why: rebase reconciliation widened non-editor admission from generic builtin packages to every non-editor transport, so ipc packages could persist even though the Host cannot execute them. Keep installed state honest by admitting exactly stdio and builtin, with a regression proving rejection happens before archive or inventory writes.

[砚砚/gpt-5.6-sol🐾]
Why: independent pre-review reproduced five Train B implementation defects across restricted invocation policy, legacy catalog authority, effective configuration defaults, child-process liveness, and legacy Settings scrolling. Align each read/execution boundary and lock the repaired behavior with integration and real-process regressions.

[砚砚/gpt-5.6-sol🐾]
Why: capability withdrawal and process cleanup are separate lifecycle facts. Removing an execution before every child closes let uninstall retire live processes and made failed close impossible to retry. Keep the execution unavailable but owned until shared cleanup succeeds, and cover concurrent exit, retry, and startup-failure paths.

[砚砚/gpt-5.6-sol🐾]
* perf(test): remove serial lane lifecycle stalls

Why: failed MCP probes completed within the route deadline but left the SDK default 60-second request timer alive, while the SessionSealer liveness test claimed a short monkey-patch yet waited on the production 30-second timeout. Propagate the existing deadline into SDK requests and inject only the test timeout so production semantics and coverage stay unchanged.

Thread-Context: thread_mu6aiq8q5vxdszc2

[砚砚/gpt-5.6-sol🐾]

* perf(ci): shard stateful public tests across isolated runners

Why: the single deny-by-default serial queue now contains 1,648 files and dominates target CI at 18–26 minutes even after removing known timer leaks. Split that unchanged selection across four isolated runner jobs while preserving one-file-at-a-time execution, fail-closed exact coverage, and the existing pure-shard boundary.

Verification: local schema-v2 plan covered 2,176/2,176 files exactly once; all eight lanes passed with a 5m41.459s critical path; targeted shard tests and the CI contract checker passed; pnpm check passed with Python 3.14.

Thread-Context: thread_mu6aiq8q5vxdszc2

[砚砚/gpt-5.6-sol🐾]

* fix(test): remove hidden alpha UAT git-ref dependency

Why: splitting the stateful public suite across isolated CI runners exposed three F296 tests that only passed when an earlier test happened to materialize origin/main in the shared checkout. Inject the expected deployment revision in tests while preserving the live CLI default, so each shard is self-contained.

Verification: missing-origin/main regression 19/19; public CI contract; git diff --check; full pnpm check.

Thread-Context: thread_mu6aiq8q5vxdszc2

[砚砚/gpt-5.6-sol🐾]

* test(ci): fail closed on public-test latency regressions

Why: isolated sharding brought the target lane below ten minutes, but the evidence job only reported that number and would silently accept a future regression. Enforce the measured critical-path budget in CI, lock it in the workflow contract, and record the exact one-of-three F308 evidence boundary without claiming AC-D6 complete.

Thread-Context: thread_mu6aiq8q5vxdszc2

[砚砚/gpt-5.6-sol🐾]

* fix(ci): restore the global serial isolation boundary

Why: four concurrent serial runner jobs treated VM separation as proof for 1,648 stateful or audit-demoted tests, but F308 and issue zts212653#1476 require per-class isolation evidence before that boundary changes. Revert the unproved fan-out, its derived schema and 10-minute gate, and the incidental shard-only test adjustment while preserving the attributable MCP and SessionSealer wait removals.

Verification: unproven-serial regression 4-to-1 RED-to-GREEN; targeted suite 68/68; public CI contract; full pnpm check; resulting tree exactly matches reviewed wait-removal commit 31b9632.

Thread-Context: thread_mu6aiq8q5vxdszc2

[砚砚/gpt-5.6-sol🐾]
Why: maintainer admission in clowder-ai#1478 accepts the bounded Manager slice while leaving published alpha.1 availability and final maintainer integration acceptance pending. Replace stale target dates and unverified personal acceptance claims without changing implementation scope.

[砚砚/gpt-5.6-sol🐾]
@mindfn mindfn closed this Sep 21, 2026
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