Skip to content

docs: multi-stack frontend architecture (P-017/P-020), alpha-readiness gate, bilingual README#140

Merged
PhysShell merged 6 commits into
mainfrom
claude/multi-stack-architecture-yte8l6
Jun 27, 2026
Merged

docs: multi-stack frontend architecture (P-017/P-020), alpha-readiness gate, bilingual README#140
PhysShell merged 6 commits into
mainfrom
claude/multi-stack-architecture-yte8l6

Conversation

@PhysShell

@PhysShell PhysShell commented Jun 27, 2026

Copy link
Copy Markdown
Owner

Что и зачем

Фиксирует на бумаге архитектуру мультистековой поддержки (один core, OwnIR —
шов, фронтенды только извлекают факты) и приводит README к двуязычному виду.
Это документация и позиционирование — кода ядра/экстрактора PR не трогает.

Состав:

  • P-017 — мультистековые фронтенды: JS/TS как одна семья OwnTS в двух
    режимах уверенности (не два продукта); Java/Kotlin — раздельные экстракторы
    (OwnJava/OwnKotlin), объединённые профилем OwnJVM. Разводит оси
    «языковой фронтенд / платформенный профиль / core», чтобы не плодить бренд
    на каждый фреймворк.
  • P-020 — профиль Own.React (эффект-шторма, каталог EFF001–005) под
    фронтендом OwnTS, с честной рамкой Cloudflare-кейса: «не все lifecycle-баги
    текут памятью — некоторые текут запросами», без заявок «мы бы спасли
    Cloudflare». EFF001/002 честно помечены как новый анализ стабильности
    зависимостей, которого в ядре пока нет (не маскируются под OWN001).
  • ROADMAP — позиционирование «не ещё один SAST» (ниша:
    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 → EN/RU: английский по умолчанию (README.md), русский вариант
    без изменений (README.ru.md), переключатель языка вверху обоих;
    внутренний якорь Changelog перепривязан под перевод; комментарий в ci.yml,
    ссылавшийся на русский заголовок, указывает на «Where it cheats».

Тип изменения

  • feat — новая возможность
  • fix — исправление бага
  • docs — документация
  • refactor / chore / test / ci — без изменения поведения

Как проверено

  • python tests/run_tests.py — зелёные (sanity: правки чисто
    документационные, поведение ядра не менялось)
  • селфтест гейта формата — python scripts/validate_contrib.py --selftest (16/16)
  • Дополнительно: сверены markdown-якоря (EN-ссылка Changelog ↔ заголовок),
    проверено отсутствие непереведённого текста в README.md (кириллица — только
    метка «Русский» в переключателе), сверены индексы docs/proposals/README.md
    и таблица в ROADMAP.md.

Связанные issue

Нет связанного issue — ветка ведёт линию обсуждения мультистековой архитектуры
и позиционирования; предложения оформлены как docs/proposals/P-017, P-020.

Чеклист

  • изменение покрыто тестом/селфтестом (или объяснено, почему нет) — docs-only;
    форматные доки выверены, тест-сеть прогнана как sanity
  • README/docs обновлены при необходимости
  • коммиты в conventional-commit стиле (docs:)

🤖 Generated with Claude Code


Generated by Claude Code

Summary by CodeRabbit

  • Documentation
    • Reworked the main README and the Russian README with clearer English guidance, expanded CLI/run examples, diagnostics and logging details, and updated project/quality-gate information.
    • Expanded the roadmap with updated positioning and milestone framing, plus added an alpha-readiness gate note.
    • Added/updated proposals for multi-stack frontends and an OwnTS React effects profile (effect-storm angle), and extended the proposals index.
  • Chores
    • Updated a single CI workflow comment to match English wording for a README reference.

claude added 4 commits June 27, 2026 03:08
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
@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@PhysShell, we couldn't start this review because you've reached your PR review rate limit.

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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 71f8b227-2aba-4bb2-9849-3fb957115956

📥 Commits

Reviewing files that changed from the base of the PR and between 2e1b31b and 6d51b4a.

📒 Files selected for processing (3)
  • README.md
  • README.ru.md
  • docs/notes/alpha-readiness.md
📝 Walkthrough

Walkthrough

The 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.

Changes

Documentation and planning updates

Layer / File(s) Summary
Overview, usage, and examples
README.md, README.ru.md
The English and Russian READMEs rewrite the introduction, run instructions, diagnostics gallery, WPF lifetime-leak section, region-escape example, and ArrayPool golden example.
Ownership model and checker
README.md, README.ru.md
The English and Russian READMEs rewrite the resource model, extern fn call boundary, OWN diagnostic rules, branch-merge semantics, and C# codegen strategy.
Storage policies, logging, and limits
README.md, README.ru.md
The English and Russian READMEs rewrite buffer storage policies, logging, cheat boundaries, changelog, limitations, related-work positioning, repository layout, and quality gates.
Roadmap framing and readiness
docs/ROADMAP.md, docs/notes/alpha-readiness.md
ROADMAP and the new alpha-readiness note add the positioning language, readiness checklist, packaging gap, and the multi-stack milestone.
Multi-stack and React proposals
docs/proposals/P-017-multi-stack-frontends.md, docs/proposals/P-020-ownts-react-effects.md, docs/proposals/README.md
P-017 and P-020 define multi-stack frontends and the Own.React effect profile, covering TS/JS and JVM splits, spike scope, and open questions.
CI comment reference
.github/workflows/ci.yml
The workflow header comment updates the README reference wording.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • PhysShell/Own.NET#38: Also updates roadmap and proposal-adjacent documentation, including positioning language and planning structure.

Poem

🐇 I nibbled docs by lantern glow,
Two languages now march in row.
The roadmap sprouted carrots bright,
With proposals leaping left and right.
Hop, hop—Own.NET is set to show!

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main doc-focused changes: P-017/P-020, alpha-readiness, and README localization.
Description check ✅ Passed All required sections are present and filled with relevant details, including testing, related issue, and checklist items.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/multi-stack-architecture-yte8l6

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread docs/proposals/P-017-multi-stack-frontends.md Outdated
Comment thread docs/proposals/P-017-multi-stack-frontends.md Outdated
)

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Bound the pooled views to size.

ArrayPool.Rent(size) can return an oversized backing array, so buf.AsSpan() exposes the stale tail and conflicts with the OWN025 contract documented later. Thread size through 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

📥 Commits

Reviewing files that changed from the base of the PR and between 3867c4b and 71237c2.

📒 Files selected for processing (8)
  • .github/workflows/ci.yml
  • README.md
  • README.ru.md
  • docs/ROADMAP.md
  • docs/notes/alpha-readiness.md
  • docs/proposals/P-017-multi-stack-frontends.md
  • docs/proposals/P-020-ownts-react-effects.md
  • docs/proposals/README.md

Comment thread docs/notes/alpha-readiness.md Outdated
Comment thread docs/notes/alpha-readiness.md Outdated
Comment thread README.md Outdated
Comment thread README.ru.md Outdated
Comment thread README.ru.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
@PhysShell
PhysShell merged commit 4818e44 into main Jun 27, 2026
27 checks passed
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