Get started

Plan voor het verwijderen van de ingress-kern

Verwijderingsplan voor de ingress-kern

De ingress-refactor is niet gezond zolang die duizenden netto regels toevoegt. Kerncentralisatie telt alleen wanneer productiecode van gebundelde plugins kleiner wordt en oude SDK-compatibiliteit voor derden wordt afgezonderd in SDK-/kern-shims.

Gewenste runtime-vorm:

bundled plugin event
  -> extract platform facts locally
  -> resolve shared ingress once when facts are available
  -> branch on generic ingress projections/outcomes
  -> perform platform side effects locally

old third-party helper
  -> SDK compatibility shim
  -> shared ingress-compatible projection where possible
  -> old return shape preserved

Gebundelde plugins mogen ingress niet terugvertalen naar lokale AccessResult-, GroupAccessDecision-, CommandAuthDecision-, DmCommandAccess- of { allowed, reasonCode }-vormen, tenzij dat type openbare plugin-API is.

Budget

Gemeten tegen de PR-merge-base met origin/main, inclusief niet-gevolgde bestanden.

merge-base            1671e7532adb

current:
core production       +3,922 / -546    = +3,376
docs                  +601 / -17       = +584
other                 +145 / -2        = +143
plugin production     +4,148 / -5,388  = -1,240
tests                 +2,326 / -2,414  = -88
total                 +11,142 / -8,367 = +2,775

required:
plugin production     <= -1,500
core production       <= +1,500, or paid for by larger plugin deletion
tests                 <= +1,000
total                 <= +2,000

stretch:
plugin production     <= -2,500
core production       <= +1,200
total                 <= 0

Minimale resterende opschoning:

plugin production     needs 260 more net deleted lines
total                 needs 775 more net deleted lines
core production       still +1,876 over standalone budget, unless paid down by plugin deletion

Verwijdering van alleen opmerkingen telt niet als opschoning. De vorige budgetronde was te ruimhartig omdat die herstelde verklarende QQBot-opmerkingen meenam; dit document volgt alleen verplaatsing van uitvoerbare code, documentatiecode en testcode.

Meet opnieuw na elke opschoningsgolf:

base=$(git merge-base HEAD origin/main)
git diff --shortstat "$base"
git diff --numstat "$base" -- src/channels/message-access src/plugin-sdk extensions | sort -nr -k1 | head -n 80
pnpm lint:extensions:no-deprecated-channel-access

Diagnose

De eerste ronde voegde de gedeelde ingress-kernel toe en liet daarna te veel plugin-lokale autorisatie ernaast staan:

platform facts
  -> shared ingress state and decision
  -> plugin-local DTO or legacy projection
  -> plugin-local if/else ladder

Dat dupliceert het model. De kernproductie groeide met ongeveer 3.376 regels, terwijl de productiecode van gebundelde plugins 1.240 regels kleiner is. Dat is beter dan de eerste ronde, maar het valt niet binnen het minimumbudget. De oplossing blijft verwijdering eerst:

  • verwijder plugin-DTO's die alleen ingress-velden hernoemen
  • verwijder tests die alleen wrapper-vorm bevestigen
  • voeg alleen kernhelpers toe wanneer dezelfde patch gebundelde plugin-code verwijdert
  • houd oude SDK-compatibiliteit alleen in SDK-/kern-shims
  • pak de kern opnieuw in nadat wrapper-verwijdering de stabiele vorm blootlegt

Hotspots

Positieve gebundelde productiebestanden die nog moeten krimpen:

extensions/telegram/src/ingress.ts                        +126
extensions/discord/src/monitor/dm-command-auth.ts         +101
extensions/signal/src/monitor/access-policy.ts             +92
extensions/feishu/src/policy.ts                            +85
extensions/slack/src/monitor/auth.ts                       +64
extensions/googlechat/src/monitor-access.ts                +59
extensions/nextcloud-talk/src/inbound.ts                   +51
extensions/matrix/src/matrix/monitor/access-state.ts       +49
extensions/irc/src/inbound.ts                              +44
extensions/imessage/src/monitor/inbound-processing.ts      +36
extensions/qa-channel/src/inbound.ts                       +34
extensions/qqbot/src/bridge/sdk-adapter.ts                 +33
extensions/tlon/src/monitor/utils.ts                       +30
extensions/twitch/src/access-control.ts                    +22
extensions/qqbot/src/engine/commands/slash-command-handler.ts +20
extensions/telegram/src/bot-handlers.runtime.ts            +19

De branch valt nog niet binnen het minimumbudget. Het resterende review-relevante werk moet herhaalde autorisatiestromen, turn-scaffolding of wrappertests verwijderen voordat er nog een kernabstractie wordt toegevoegd.

Huidige codelezing

De gezonde kernnaad bestaat al in src/channels/message-access/runtime.ts: die is eigenaar van identity-adapters, effectieve allowlists, pairing-store-reads, routebeschrijvers, command-/event-presets, access groups en de uiteindelijke opgeloste ResolvedChannelMessageIngress-projectie.

De resterende groei is vooral plugin-lijm boven op die naad:

  • extensions/telegram/src/ingress.ts wikkelt kernbeslissingen in Telegram-specifieke command-/eventhelpers, waarna callsites nog steeds vooraf berekende genormaliseerde allowlists en eigenaarslijsten doorgeven.
  • extensions/discord/src/monitor/dm-command-auth.ts, extensions/feishu/src/policy.ts, extensions/googlechat/src/monitor-access.ts en extensions/matrix/src/matrix/monitor/access-state.ts houden nog steeds lokale policy-DTO's of legacy beslissingsnamen naast ingress.
  • extensions/signal/src/monitor/access-policy.ts houdt Signal-identiteitsnormalisatie en pairing-antwoorden terecht lokaal, maar heeft nog steeds een wrapper-naad die moet instorten tot directe ingress-consumptie.
  • extensions/nextcloud-talk/src/inbound.ts, extensions/irc/src/inbound.ts, extensions/qa-channel/src/inbound.ts, extensions/zalo/src/monitor.ts en extensions/zalouser/src/monitor.ts herhalen nog steeds route-/envelope-/turn-assemblage die naar gedeelde turnhelpers buiten de ingress-kernel kan verhuizen.

Conclusie: meer code naar de kern verplaatsen is alleen nuttig als het in dezelfde patch deze plugin-wrapperlagen verwijdert. Nog een abstractie toevoegen terwijl wrapper-returns blijven bestaan, herhaalt de fout.

Grens

De kern is eigenaar van generiek beleid:

  • allowlist-normalisatie en matching
  • uitbreiding en diagnostiek van access groups
  • DM-allowlist-reads uit de pairing-store
  • route-, sender-, command-, event- en activation-gates
  • toelatingsmapping: dispatch, drop, skip, observe, pairing
  • geredigeerde status, beslissingen, diagnostiek en SDK-compatibiliteitsprojecties
  • herbruikbare generieke beschrijvers voor identity, route, command, event, activation en outcomes

Plugins zijn eigenaar van transportfeiten en neveneffecten:

  • authenticiteit van webhook/socket/request
  • platformidentiteitsextractie en API-lookups
  • kanaalspecifieke beleidsstandaarden
  • levering van pairing-uitdagingen, antwoorden, acks, reacties, typen, media, geschiedenis, setup, doctor, status, logs en gebruikersgerichte tekst

De kern moet kanaalagnostisch blijven: geen Discord, Slack, Telegram, Matrix, room, guild, space, API-client of plugin-specifieke standaard in src/channels/message-access.

Acceptatieregel

Elke nieuwe kernhelper moet onmiddellijk productiecode van gebundelde plugins verwijderen.

one bundled caller        reject; keep plugin-local
two bundled callers       accept only if plugin production LOC drops
three or more callers     plugin deletion must be at least 2x new core LOC
compatibility-only helper SDK/core shim only; never bundled hot paths

Stop en ontwerp opnieuw als:

  • productie-LOC van plugins toeneemt
  • tests sneller groeien dan productie krimpt
  • een gebundeld hot path een DTO retourneert die alleen ResolvedChannelMessageIngress hernoemt
  • een kernhelper een channel-id, platformobject, API-client of kanaalspecifieke standaard nodig heeft

Werkpakketten

  1. Bevries het budget. Zet LOC in de PR, houd deprecated-ingress-lint groen en neem voor/na-LOC op in opschoningscommits.

  2. Verwijder dunne DTO-naden. Vervang plugin-lokale wrapper-returns door direct gebruik van ResolvedChannelMessageIngress, senderAccess, commandAccess, routeAccess of ingress. Begin met QQBot, Telegram, Slack, Discord, Signal, Feishu, Matrix, iMessage en Tlon. Verwijder wrapper-vormtests; behoud gedragstests.

  3. Voeg outcome-classificatie alleen toe met verwijderingen. Een generieke classifier mag dispatch, pairing-required, skip-activation, drop-command, drop-route, drop-sender en drop-ingress blootleggen. Die moet afgeleid zijn van de beslissingsgrafiek, niet van redenstrings, en in dezelfde patch minstens drie plugins migreren.

  4. Voeg routebeschrijver-builders alleen toe met verwijderingen. Generieke helpers voor routedoel en routesender zijn alleen acceptabel als ze route-zware plugins onmiddellijk verkleinen: Google Chat, IRC, Microsoft Teams, Nextcloud Talk, Mattermost, Slack, Zalo en Zalo Personal.

  5. Voeg command-/event-presets alleen toe met verwijderingen. Centraliseer text-command-, native-command-, callback- en origin-subject-vormen. Command-consumenten moeten standaard naar unauthorized gaan wanneer er geen command-gate is uitgevoerd; events mogen geen pairing starten.

  6. Voeg identity-presets alleen toe waar ze boilerplate verwijderen. Stable-id-, stable-id-plus-aliases-, phone/e164- en multi-identifier-helpers zijn toegestaan wanneer ruwe waarden alleen adapterinvoer binnenkomen en geredigeerde status ondoorzichtige id's/aantallen behoudt.

  7. Deel geautoriseerde turn-assemblage. Verwijder buiten de ingress-kernel herhaalde route-/session-/envelope-/context-/reply-scaffolding uit QA Channel, IRC, Nextcloud Talk, Zalo en Zalo Personal. De kern mag route-/session-/envelope-/dispatch-volgorde bezitten; plugins behouden levering en kanaalspecifieke context.

  8. Zet compatibiliteit in quarantaine. Verouderde SDK-helpers blijven broncompatibel, maar gebundelde hot paths mogen geen verouderde ingress- of command-auth-facades importeren. Compatibiliteitstests moeten nepplugins van derden gebruiken, geen internals van gebundelde plugins.

  9. Pak de kern opnieuw in. Na wrapper-verwijdering: klap modules met één gebruik in, verwijder ongebruikte exports, verplaats compatibiliteitsprojectie uit hot paths en behoud gerichte tests voor identity, route, command/event, activation, access groups en compatibiliteitsshims.

Verwijderingsgolven

Voer deze op volgorde uit. Elke golf moet productie-LOC van gebundelde plugins verlagen.

  1. Wrapper-collapse, verwachte plugin-delta: -400 tot -600. Vervang plugin-lokale resolveXAccess-, resolveXCommandAccess- en accessFromIngress-resultaattypen door directe reads uit ResolvedChannelMessageIngress. Eerste doelen: Discord DM command auth, Feishu policy, Matrix access state, Telegram ingress, Signal access policy, QQBot SDK-adapter.

  2. Gedeelde outcome-helpers, verwachte plugin-delta: -200 tot -350. Voeg één generieke classifier alleen toe als die herhaalde shouldBlockControlCommand-, pairing-, activation-skip-, route-block- en sender-block-ladders verwijdert uit minstens drie plugins.

  3. Routebeschrijver-builders, verwachte plugin-delta: -200 tot -350. Verplaats herhaalde assemblage van routedoel- en routesenderbeschrijvers naar kernhelpers. Eerste doelen: Google Chat, IRC, Microsoft Teams, Nextcloud Talk, Mattermost, Slack, Zalo, Zalo Personal.

  4. Delen van turn-assemblage, verwachte plugin-delta: -250 tot -450. Gebruik gemeenschappelijke route-/session-/envelope-/dispatch-volgorde voor eenvoudige inkomende plugins. Eerste doelen: QA Channel, IRC, Nextcloud Talk, Zalo, Zalo Personal.

  5. Kern opnieuw inpakken, verwachte kern-delta: -300 tot -700. Nadat plugins runtime-projecties direct consumeren: verwijder modules met één gebruik, voeg kleine bestanden terug samen in runtime.ts of gerichte buren, en houd SDK-compatibiliteitsbestanden gescheiden van gebundelde hot paths.

  6. Testopschoning, verwachte test-delta: -300 tot -600. Verwijder tests die alleen verwijderde wrapper-vormen bevestigen. Behoud gedragstests voor command denial, group fallback, origin-subject matching, activation skip, access groups, pairing en redactie.

Verwachte minimale landingsvorm na deze golven:

plugin production     <= -1,500
core production       about +1,800 to +2,200 before final repack
tests                 <= +500
total                 <= +2,000

Niet Verplaatsen

Verplaats geen platformconfiguratiestandaarden, installatie-UX, doctor/fix-tekst, API-lookups, Slack-eigenaarsaanwezigheidscontroles, Matrix-alias-/verificatieafhandeling, Telegram callback-parsing, syntaxisparsing van opdrachten, native opdrachtregistratie, parsing van reactiepayloads, koppelingsantwoorden, opdrachtantwoorden, bevestigingen, typen, media, geschiedenis of logs.

Verificatie

Gerichte lokale loop:

pnpm lint:extensions:no-deprecated-channel-access
pnpm test src/channels/message-access/message-access.test.ts src/plugin-sdk/channel-ingress-runtime.test.ts src/plugin-sdk/access-groups.test.ts
pnpm test extensions/<changed-plugin>/src/...
pnpm plugin-sdk:api:check
pnpm config:docs:check
pnpm check:docs
git diff --check

Gebruik Testbox voor brede gewijzigde gates/full-suitebewijs zodra de LOC-trend binnen budget is.

Elk werkpakket legt vast:

  • LOC vóór/na per categorie
  • verwijderde Plugin-wrappers
  • nieuwe kernhelper-LOC, indien aanwezig
  • uitgevoerde gerichte tests
  • resterende lijst met hotspots

Exitcriteria

  • gebundelde productie-imports gebruiken geen verouderde channel-access- of command-auth-facades
  • compatibiliteitscode is geïsoleerd tot SDK-/kernnaden
  • gebundelde Plugins consumeren ingress-projecties of generieke uitkomsten rechtstreeks
  • Plugin-productie-LOC is netto ten minste 1.500 lager ten opzichte van origin/main
  • kernproductie-LOC is <= +1,500, of elke overschrijding wordt gecompenseerd terwijl het totaal <= +2,000 blijft
  • representatieve tests dekken redactie, route, opdracht/event, activatie, toegangsgroep en kanaalspecifiek fallbackgedrag