docs: multi-stack frontend architecture (P-017/P-020), alpha-readiness gate, bilingual README#140
Conversation
Capture the decided shape for taking the one-core/OwnIR-seam architecture beyond .NET, so the decision is on the record rather than evaporating. - JS/TS: one frontend family (OwnTS), two confidence tiers — TS type-aware via the TypeScript Compiler API, JS best-effort via syntax/JSDoc — not two products. Same OWN001 bug model; only type info (→ severity) differs. - Java/Kotlin: split frontends (OwnJava via Error Prone/JDT/Spoon, OwnKotlin via Detekt/KSP/K2) unified by one shared OwnJVM profile. Shared JVM lifecycle model, different source tooling. - Separates the conflated axes: language frontend vs platform profile (OwnReact/OwnJVM/OwnAndroid/OwnSpring) vs core, refusing brand-per-framework. - Reuses the P-001 seam verbatim: *.ts/*.java/*.kt -> extractor -> facts.ownir.json -> existing core -> OWN0xx. No second checker, bug-driven, gated behind a tasty .NET alpha + a real cross-stack bug. Wires P-017 into the proposals index and the ROADMAP backlog (milestone 6, horizon). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QnGqHwVb2H1jZ71f498MFa
Add the Cloudflare-shaped angle and the hub-level positioning, kept honest. - P-020 (Own.React effect profile under the OwnTS frontend): EFF001-005. Splits honestly — EFF003/004/005 are the existing acquire->release/OWN001 model; EFF001/002 (unstable-dependency effect storm, the actual Cloudflare shape) are a NEW dependency-stability analysis the core does not model yet, named as such rather than smuggled in as a leak. One-rule spike (EFF001), not a TS analyzer. - Cloudflare framing is deliberately non-overclaiming: "not all lifecycle bugs leak memory; some leak requests," never "we'd have saved Cloudflare" (the source is a vendor marketing post, not a neutral postmortem). - ROADMAP framing: "Positioning against the competition (not another SAST)" — the niche is a cross-language resource/lifetime/effect contract checker, a deterministic layer under AI reviewers, not a head-on SAST/AI-review fight. - ROADMAP framing: "From memory leaks to effect storms" — WPF leak / DI captive / ArrayPool view / React effect storm as one lifecycle-contract model. - Cross-link P-017 <-> P-020; EFF003/004 share cleanup semantics with the OwnTS authoring rules, P-020 is the canonical home. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QnGqHwVb2H1jZ71f498MFa
…atus Records the wedge strategy (one delicious stack, prove the core isn't bolted to it: 80% .NET / 20% one spike) and answers "are we ready to show people yet?" with a concrete A-G gate mapped to the actual repo state on 2026-06-27: - B (GitHub Action), C (SARIF/annotations), D (5+ diagnostics: OWN/DI/POOL/WPF), E (12 test-pinned bad/ok examples) are BUILT. - A (single `ownsharp check MyApp.sln` dotnet tool), F (3 packaged real-world case studies), G (consolidated suppression + false-positive page) are PARTIAL. - Plus the real front-door gap: README is still a Russian PoC doc, no 20-second landing / copy-paste install / Action quickstart. Verdict: capability is past alpha; the gap to "people install it" is packaging and presentation, not analysis power. The 20% rule caps other-stack work to one experimental rule each (experiments/owents-react-effect-cleanup, experiments/ownjava-listener-leak), keeping P-017/P-020 horizon/draft. ROADMAP points at the gate from the Priorities section. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QnGqHwVb2H1jZ71f498MFa
Make the README bilingual the common multilingual-repo way: English is the default README.md, the original Russian moves verbatim to README.ru.md, and both carry a language nav line at the top (English · Русский). - README.md: full faithful English translation — code blocks, tables, diagnostic codes and output samples kept verbatim; the internal Changelog anchor updated to the translated heading (#changelog-code-renumbering). - README.ru.md: the prior Russian content unchanged, with its anchors intact. - ci.yml: the comment that referenced the Russian heading now points at the English "Where it cheats" item #7. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QnGqHwVb2H1jZ71f498MFa
|
Warning Review limit reached
More reviews will be available in 13 minutes and 57 seconds. Learn how PR review limits work. To continue reviewing without waiting, enable usage-based billing in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits. 🚦 How do rate limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughThe PR rewrites both READMEs, adds roadmap and readiness notes, introduces two proposal docs plus an updated proposals index, and updates one CI workflow comment reference. ChangesDocumentation and planning updates
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 71237c2826
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
) Two cross-reference fixes flagged by Codex: - The cleanup-rule cross-walk was off: OWNTS004 is AbortController, which maps to EFF005 — not EFF004 (timers = OWNTS002). State the accurate one-to-one: OWNTS002/003/004 ↔ EFF004/EFF003/EFF005. Fixed in P-017's reference note and in P-020's open-question #3. - Stop marketing the OWNTS001 cleanup rule (→ OWN001) with the request-storm / Cloudflare story. That shape is EFF001/002 (new dependency-stability analysis the core lacks), per P-020's honest split — the conflation P-020 explicitly avoids. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QnGqHwVb2H1jZ71f498MFa
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
README.md (1)
193-211: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winBound the pooled views to
size.
ArrayPool.Rent(size)can return an oversized backing array, sobuf.AsSpan()exposes the stale tail and conflicts with the OWN025 contract documented later. Threadsizethrough the template and use the bounded span instead, or mark this sample as intentionally non-normative.Proposed fix
- var bytes = buf.AsSpan(); + var bytes = buf.AsSpan(0, size); Fill(bytes); @@ - var view = buf.AsSpan(); + var view = buf.AsSpan(0, size); Hash(view);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@README.md` around lines 193 - 211, The sample in process shows an unbounded view over an array rented with ArrayPool<byte>.Shared.Rent(size), which can expose the oversized tail and violate the OWN025 guidance. Update the process example to thread size through the borrow sites and use a span limited to size for both the Fill and Hash calls, referencing process, ArrayPool<byte>.Shared.Rent, and the buf.AsSpan usage; if you don’t want to change the sample, explicitly mark it as intentionally non-normative.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/notes/alpha-readiness.md`:
- Line 40: The status table entry still uses lowercase “built” in a user-facing
cell; update the GitHub Action row in the alpha-readiness notes so the status
text capitalizes “GitHub” consistently and matches the rest of the table. Locate
the single table row mentioning action.yml and adjust only the visible status
phrasing, keeping the marketplace and README notes unchanged.
- Around line 47-51: Update the front-door readiness note to reflect the
branch’s current docs state: the old Russian PoC description for README.md is
stale because English is now the default and the Russian version is preserved
separately. Edit the paragraph in the alpha-readiness note so it matches the
current README/README.english setup and the actual status of the top-of-readme
onboarding flow, using the README-related references in this section to keep the
wording aligned.
In `@README.md`:
- Around line 155-161: The README text currently describes OWN001 as a warning,
but the diagnostics contract treats OWN001 as an error. Update the wording in
the section describing injected sources/unknown lifetime so it consistently
labels OWN001 as an error and avoids calling it a warning; use the OWN001 and
OWN014 references in the same paragraph to keep the severity distinction clear.
In `@README.ru.md`:
- Around line 154-160: In the README section describing OWN001/OWN014, the
severity for unknown-lifetime or leak cases is mislabeled as a warning. Update
the text around the region-model explanation and the
`StaticEventEscapeViewModel` example so `OWN001` is clearly described as an
error, while keeping `OWN014` as the static-event region escape case.
- Around line 193-211: The example in process(int size) uses buf.AsSpan() over
the full rented array, which includes unused capacity beyond size and violates
the OWN025 contract described in README.ru.md. Update the process example to
bound both the mutable and shared spans to size by threading size into the span
creation in process and the Fill/Hash usage, or mark this snippet as
non-normative if it is only illustrative. Reference the process method and the
buf/span creation sites so the bounded-span fix is applied consistently.
---
Outside diff comments:
In `@README.md`:
- Around line 193-211: The sample in process shows an unbounded view over an
array rented with ArrayPool<byte>.Shared.Rent(size), which can expose the
oversized tail and violate the OWN025 guidance. Update the process example to
thread size through the borrow sites and use a span limited to size for both the
Fill and Hash calls, referencing process, ArrayPool<byte>.Shared.Rent, and the
buf.AsSpan usage; if you don’t want to change the sample, explicitly mark it as
intentionally non-normative.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 6af5c498-8b21-4a76-a5fd-bac455310717
📒 Files selected for processing (8)
.github/workflows/ci.ymlREADME.mdREADME.ru.mddocs/ROADMAP.mddocs/notes/alpha-readiness.mddocs/proposals/P-017-multi-stack-frontends.mddocs/proposals/P-020-ownts-react-effects.mddocs/proposals/README.md
Fixed: - alpha-readiness front-door note was stale within this PR — README is now bilingual (EN default + README.ru.md), no longer "the Russian PoC"; reworded. - alpha-readiness gate-B cell: backtick the action `format` values (`github`/`msbuild`/`human`/`sarif`) — they are literal option strings, so backticked, not capitalized as the platform name (LanguageTool misfire). Kept with clarification (CodeRabbit applied the global contract without the profile nuance): - "OWN001 warning" is correct, not a contract violation: the subscription profile deliberately down-tiers an injected/unknown-lifetime source to a warning (ROADMAP milestone 2, P-004:84). Added "deliberate down-tier (OWN001 is otherwise an error)" inline, EN + RU. - ArrayPool `buf.AsSpan()` stays unbounded: the block is emitter output *verbatim* (the borrow template carries no length), and the README already documents the `AsSpan(0,size)` caveat. Editing it would falsify the verbatim-emit claim; strengthened the caveat to mark the snippet illustrative/non-normative instead, EN + RU. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QnGqHwVb2H1jZ71f498MFa
Что и зачем
Фиксирует на бумаге архитектуру мультистековой поддержки (один core, OwnIR —
шов, фронтенды только извлекают факты) и приводит README к двуязычному виду.
Это документация и позиционирование — кода ядра/экстрактора PR не трогает.
Состав:
OwnTSв двухрежимах уверенности (не два продукта); Java/Kotlin — раздельные экстракторы
(
OwnJava/OwnKotlin), объединённые профилемOwnJVM. Разводит оси«языковой фронтенд / платформенный профиль / core», чтобы не плодить бренд
на каждый фреймворк.
Own.React(эффект-шторма, каталогEFF001–005) подфронтендом OwnTS, с честной рамкой Cloudflare-кейса: «не все lifecycle-баги
текут памятью — некоторые текут запросами», без заявок «мы бы спасли
Cloudflare».
EFF001/002честно помечены как новый анализ стабильностизависимостей, которого в ядре пока нет (не маскируются под
OWN001).cross-language resource/lifetime/effect contract checker) и объединяющая
модель «from memory leaks to effect storms».
docs/notes/alpha-readiness.md— конкретный gate «вкусной .NET alpha»(A–G) с честным статусом против реального состояния репозитория: B/C/D/E
готовы, A/F/G частичны, плюс главный блокер — front-door README. Вердикт:
по способности уже за alpha, разрыв до «люди ставят» — упаковка, не сила
анализа.
README.md), русский вариантбез изменений (
README.ru.md), переключатель языка вверху обоих;внутренний якорь Changelog перепривязан под перевод; комментарий в
ci.yml,ссылавшийся на русский заголовок, указывает на «Where it cheats».
Тип изменения
Как проверено
python tests/run_tests.py— зелёные (sanity: правки чистодокументационные, поведение ядра не менялось)
python scripts/validate_contrib.py --selftest(16/16)проверено отсутствие непереведённого текста в
README.md(кириллица — толькометка «Русский» в переключателе), сверены индексы
docs/proposals/README.mdи таблица в
ROADMAP.md.Связанные issue
Нет связанного issue — ветка ведёт линию обсуждения мультистековой архитектуры
и позиционирования; предложения оформлены как
docs/proposals/P-017,P-020.Чеклист
форматные доки выверены, тест-сеть прогнана как sanity
docs:)🤖 Generated with Claude Code
Generated by Claude Code
Summary by CodeRabbit