chore(dnn): #131 migrate 12 RazorComponent templates to Razor14 (source-level, runtime pending) - #596
Conversation
Source-level migration of the 12 deprecated `ToSic.Sxc.Dnn.RazorComponent`
templates (the Dnn-specific base, removed in 2sxc 21 LTS) to the modern
Dnn-agnostic `Custom.Hybrid.Razor14` base.
Files (12):
News5/bs3 (5): _Details, _List, _List archive, _List Columns,
_List Columns without images
Content/bs3 (7): Layout/_Line, Link/_Large emphasized link,
Link/_List of document-links, Link/_List of icon-links,
Link/_List of image-links with overlay,
Link/_List of image-links, Link/_List of links
API migrations (semantics preserved, 2sxc 21-compatible):
- @inherits ToSic.Sxc.Dnn.RazorComponent -> Custom.Hybrid.Razor14 (12x)
- Request.QueryString["category"] -> CmsContext.Page.Parameters["category"] (5x, News5)
- Dnn.Module.ModuleID -> CmsContext.Module.Id (4x, Content/Link)
- @using ToSic.Eav.Run -> @using ToSic.Sxc.Context (4x, News5 _List*)
- CustomizeSearch: IContainer moduleInfo -> IModule moduleInfo (4x, News5 _List*)
Signature aligned with the repo's modern News5/DnnSearch/SearchMapper.cs
(Custom.Hybrid.Code12, ICustomizeSearch, IModule).
Preserved APIs (still valid in Razor14): App.Data, AsList, AsDynamic, Content,
CreateInstance, GetService, Edit.TagToolbar/Enabled, Text.Has, Tags.*,
@renderpage, @Html.Partial/Raw, CmsContext.View.
Runtime validation PENDING on sandbox (SOURCE-LEVEL migration only — these
.cshtml are interpreted by 2sxc at runtime in DNN, not compiled by dotnet build,
so cannot be validated locally by the .NET pipeline):
1. CustomizeSearch override signature (IModule) in the 4 News5 _List* — confirm
Custom.Hybrid.Razor14 still exposes the virtual override. If 2sxc 21 dropped
template-level overrides in favor of the ICustomizeSearch interface, fall
back to the existing News5/DnnSearch/SearchMapper.cs pattern.
2. CmsContext.Page.Parameters["category"] null-behavior (returns null if absent,
handled downstream by Text.Has) — verify on sandbox.
3. _LinkHelper.cshtml:30 uses Dnn.Portal.PortalAlias.HTTPAlias (legacy, NOT
migrated here — outside the 12-template scope, no @inherits). May break when
instantiated from a Razor14 template -> candidate follow-up PR.
Scope: DNNPlatform/ only. 0 files under Cards/ (release freeze respected, master
stays bef3bc6). Out-of-scope shared deps (_Parts.cshtml already Razor12,
_LinkHelper.cshtml helper) left untouched per dispatch perimeter.
Refs #131.
Co-Authored-By: Claude <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw]
LGTM — migration source-level complète et cohérente (12 templates, #131).
Vérifications :
@inherits: 12/12ToSic.Sxc.Dnn.RazorComponent→Custom.Hybrid.Razor14. Aucun fichier oublié.- APIs DNN-spécifiques : les 4 occurrences de
Dnn.Module.ModuleID→CmsContext.Module.Id(l'équivalent CMS-agnostique de Razor14). - Le point qui compte sous Razor14 — c'est une base CMS-neutre, donc tout appel
Dnn.*restant casserait au runtime. J'ai scanné les 12 fichiers migrés : 0 référenceDnn.*résiduelle (les 4 hits du diff sont tous des lignes-supprimées). Le risque de runtime-breakage prévisible est donc écarté côté source.
Le caveat « runtime pending » du titre est honnête et approprié : la migration source est complète, reste à valider contre une instance DNN/2sxc live. Rien à redire sur ce qui est dans le scope du PR.
Sandbox runtime-readiness assessment (2026-06-25, po-2023)Per ai-01 dispatch v2 ("runtime-valider #596 → un-gate merge ; fallback explicite = documente précisément le gap, ne stalle pas"). Sandbox not yet booted this tick — but the readiness picture is now precise, and better than expected (the hard piece is present). ✅ Present & functional (verified this tick)
→ The sandbox is bootable. The
|
Sandbox boot attempted (2026-06-25, po-2023 tick 2) — precise blocker found:
|
Assembly (physical bin/) |
AssemblyVersion | FileVersion | Expected by redirect / libs |
|---|---|---|---|
System.Buffers |
4.0.4.0 | 4.600.24.56208 (.NET 6 SDK) | 4.0.3.0 (Imageflow/2sxc) |
System.Collections.Immutable |
9.0.0.0 | 9.0.24.52809 (.NET 9 SDK) | ~5.0/6.0 |
System.Text.Json |
9.0.0.0 | 9.0.24.52809 (.NET 9 SDK) | ~5.0/6.0 |
System.Memory |
4.0.1.2 | 4.6.31308.01 | 4.0.1.1 |
System.Numerics.Vectors |
4.1.4.0 | 4.6.26515.06 | 4.1.3.0/4.1.4.0 |
System.Runtime.CompilerServices.Unsafe |
6.0.0.0 | 6.0.21.52210 | 4.0.4.1/4.5.x |
The fileVersions (4.600.x, 9.0.x) are .NET 6/9 SDK forwarder/contract assemblies — they should not be in a .NET Framework 4.8 DNN bin/. They appear to have been dropped by a global-tool / SDK NuGet restore polluting bin/. System.Collections.Immutable 9.0.0.0 + System.Text.Json 9.0.0.0 are the smoking gun: a DNN 9.11.1 site on .NET Framework 4.8 cannot bind these.
Why I stopped at whack-a-mole
Patching binding redirects one-by-one (I did fix System.Buffers → 4.0.4.0; that advanced the error to System.Collections.Immutable) is a fragile band-aid: ~6+ redirects to update, and the newer contract assemblies may be ABI-incompatible with the Imageflow/2sxc code compiled against the older versions → runtime errors even if binding succeeds. The correct fix is a clean bin/ re-deploy of the correct-framework assemblies (DNN 9.11.1 + 2sxc 21.07 + Imageflow.Net 0.14 built for net48), not redirect-patching.
Conclusion (honest, for the WE review)
- chore(dnn): #131 migrate 12 RazorComponent templates to Razor14 (source-level, runtime pending) #596 runtime validation remains gated — but now on a characterized blocker (
bin/SDK-assembly contamination), not an unknown. The templates themselves were not reached. - This is a pre-existing sandbox-environment issue, not a defect of the chore(dnn): #131 migrate 12 RazorComponent templates to Razor14 (source-level, runtime pending) #596 migration. The migration (source-level, 12 files) is orthogonal to it.
- Recommended path to un-gate chore(dnn): #131 migrate 12 RazorComponent templates to Razor14 (source-level, runtime pending) #596: (1) clean
DNNPlatform/bin/re-deploy from a known-good DNN 9.11.1 + 2sxc 21.07 install package; (2) re-run this boot recipe (LocalDB ready, IIS Express config ready); (3) then browser-verify the 12 templates. This is an environment/ops task (jsboige or a focused sandbox-repair tick), not a 2-minute config change. - The boot recipe itself is proven (IIS Express + LocalDB + conn string + dev machineKey all worked) — reusable once
bin/is clean.
Refs: UPGRADE-ASSESSMENT.md §1 (DB state). Scratchpad probe logs retained locally (not committed).
🤖 po-2023 (dispatched by ai-01, 2026-06-25 v2 — tick 2)
Net-new turnkey navigator that organizes the #131 DNN arc by RDP-session need (not by technical phase — the dnn-localization README already does phase-order). Motivated by jsboige coupling v0.9.0 to the DNN go-live (26/06): most of the arc is agent-delivered without touching runtime; a bounded set REQUIRES jsboige's interactive RDP session. Split: - [A] Done without RDP (verify only): #596 templates, #593 CVE/target, #132 deployment, #131-step2 smoke gate, #603 runbooks. - [B] Requires RDP session, turnkey sequence: B1 bin/ repair (sandbox- bootstrap §3 recipe), B2 sandbox upgrade + smoke, B3 browser-verify 12 templates (#596 runtime un-gate), B4 prod go-live (#132 Phase 5). References the authoritative doc for each step (no duplication). Added to the #603 branch (3 DNN ops docs together: sandbox-bootstrap + go-live- smoke-test + go-live-turnkey-checklist) for coherent internal links. Related: #131, #596, #597, #132. Read-only doc, no code, no Cards/ change. Co-Authored-By: Claude-Code <noreply@anthropic.com>
PowerShell tooling that makes the first RDP blocker (B1 of go-live-turnkey- checklist.md) executable in one command. The bin/ SDK contamination (5 .NET 9 contract assemblies + 2 .NET 6 markers) currently blocks all DNN sandbox boot (PR #596 issuecomment-4804068740); the recipe was documented in sandbox- bootstrap-runbook.md section 3 - this script executes it. - DryRun is the DEFAULT: prints current->target asmVer map (verified via reflection: System.Collections.Immutable 9.0.0.0 -> 6.0.0.0, etc.), no changes. -Apply executes: backup bin\ -> bin.contaminated.bak, copy 2 clean DLLs from bin\Imageflow\ (Buffers 4.0.3.0, Memory 4.0.1.1), download+extract 5 NuGet 6.0.0 (lib/net4x, verified net48-compatible), drop into bin\. - web.config redirect alignment NOT auto-applied (prints the map + points to sandbox-bootstrap section 3.3 - keeps blast radius to the binaries). - bin/ is git-tracked: prints the revert command after. Manual run in jsboige's RDP session only (no auto-execution without GO). DryRun validated on po-2023: all 7 asmVer read correctly via reflection, match the sandbox-bootstrap section 2 table. go-live-turnkey-checklist.md B1 updated to point at the script (alongside the recipe doc). Placed in docs/dnn/ (not docs/dnn/scripts/ - that dir is gitignored by the global Scripts/ rule at .gitignore:163). Added to the #603 DNN ops bundle. Related: #131, #596. Co-Authored-By: Claude-Code <noreply@anthropic.com>
…e-test + turnkey checklist (#603) * docs(dnn): add sandbox-bootstrap + go-live smoke-test runbooks Two new ops docs in docs/dnn/, both NET-NEW complements (no duplication of the #132 deployment runbook in docs/dnn-localization/): - sandbox-bootstrap-runbook.md (idle track): capitalizes the 2026-06-25 bin/ SDK-contamination characterization. Documents the verified boot infrastructure (LocalDB + IIS Express :8090 + DB ArgumentumGames) and the bounded clean bin/ re-deploy recipe (replace ~8 net48 assemblies: Buffers/Memory from bin/Imageflow/, fetch 5 .NET 9 contaminants at 6.0.x NuGet). The remaining ops work to un-gate #596 runtime. - go-live-smoke-test.md (secondary track): detailed URL-level smoke checklist run in the maintenance window after the #132 Phase-5 wizard. Complements #132 (which treats smoke as 1-liners). Three sections: (A) platform core, (B) 12 Razor14 templates (#596, post-dating #132), (C) 4 social-auth connectors (#597, post-dating #132) + eshop path. Sign-off gate references #132 §6 rollback contract. Related: #131 (DNN upgrade arc), #596 (runtime-pending), #597 (auth). Read-only docs, no code, no Cards/ changes (master stays bef3bc6 for v0.9.0 release). Co-Authored-By: Claude-Code <noreply@anthropic.com> * docs(dnn): add go-live turnkey checklist (RDP-session navigator) Net-new turnkey navigator that organizes the #131 DNN arc by RDP-session need (not by technical phase — the dnn-localization README already does phase-order). Motivated by jsboige coupling v0.9.0 to the DNN go-live (26/06): most of the arc is agent-delivered without touching runtime; a bounded set REQUIRES jsboige's interactive RDP session. Split: - [A] Done without RDP (verify only): #596 templates, #593 CVE/target, #132 deployment, #131-step2 smoke gate, #603 runbooks. - [B] Requires RDP session, turnkey sequence: B1 bin/ repair (sandbox- bootstrap §3 recipe), B2 sandbox upgrade + smoke, B3 browser-verify 12 templates (#596 runtime un-gate), B4 prod go-live (#132 Phase 5). References the authoritative doc for each step (no duplication). Added to the #603 branch (3 DNN ops docs together: sandbox-bootstrap + go-live- smoke-test + go-live-turnkey-checklist) for coherent internal links. Related: #131, #596, #597, #132. Read-only doc, no code, no Cards/ change. Co-Authored-By: Claude-Code <noreply@anthropic.com> * docs(dnn): add bin/ repair script (B1 turnkey, dry-run default) PowerShell tooling that makes the first RDP blocker (B1 of go-live-turnkey- checklist.md) executable in one command. The bin/ SDK contamination (5 .NET 9 contract assemblies + 2 .NET 6 markers) currently blocks all DNN sandbox boot (PR #596 issuecomment-4804068740); the recipe was documented in sandbox- bootstrap-runbook.md section 3 - this script executes it. - DryRun is the DEFAULT: prints current->target asmVer map (verified via reflection: System.Collections.Immutable 9.0.0.0 -> 6.0.0.0, etc.), no changes. -Apply executes: backup bin\ -> bin.contaminated.bak, copy 2 clean DLLs from bin\Imageflow\ (Buffers 4.0.3.0, Memory 4.0.1.1), download+extract 5 NuGet 6.0.0 (lib/net4x, verified net48-compatible), drop into bin\. - web.config redirect alignment NOT auto-applied (prints the map + points to sandbox-bootstrap section 3.3 - keeps blast radius to the binaries). - bin/ is git-tracked: prints the revert command after. Manual run in jsboige's RDP session only (no auto-execution without GO). DryRun validated on po-2023: all 7 asmVer read correctly via reflection, match the sandbox-bootstrap section 2 table. go-live-turnkey-checklist.md B1 updated to point at the script (alongside the recipe doc). Placed in docs/dnn/ (not docs/dnn/scripts/ - that dir is gitignored by the global Scripts/ rule at .gitignore:163). Added to the #603 DNN ops bundle. Related: #131, #596. Co-Authored-By: Claude-Code <noreply@anthropic.com> --------- Co-authored-by: Claude-Code <noreply@anthropic.com>
…shed pack (#663) Tertiaire dispatch kp26j6. Refines the #415 Phase-2 proposal (PR #628, read-only, no execution). Re-measured on current master 9c19e51 (was 33b1c0b at proposal time). Two findings that sharpen the plan: 1. Mindmapper gap (186.7 MB) — the proposed git filter-repo --path prefixes are exact-prefix matches and MISS two sibling build-output trees: - .../AssetConverter/Mindmapper/Published/ (129.2 MB) - Cartes/Generation/Mindmap/Mindmapper/Published/ (57.5 MB) These are regenerable dotnet-publish output (.csproj/.sln committed in history, binaries deleted at HEAD, .REMOVED.git-id sentinels alongside). Corrected strip target = ~1.8 GB (proposal said ~1.557 GB). The --path set is updated to close the gap; they were misclassified into the "other" zone by the audit path regex. 2. Pack grew 2.05 -> 2.08 GiB (+3868 objects) but the growth is text/code only (other zone 882.8 -> 946.7 MB); regenerable binary zones byte-for-byte unchanged. Bloat source is NOT recurring — no new build artifacts committed. Risk #2 currency update: open PRs 8 -> 3 (#596/#661/#662), lowering rewrite risk. READ-ONLY per DoD: 0 history mutation, 0 force-push, 0 clone, 0 Cards/ write. Reproducible via python tools/git-weight-audit.py + scratchpad 415_mindmapper_gap.py. Go/no-go = jsboige. Recommendation (DEFER post-tag) unchanged. Co-authored-by: Your <your.email@example.com> Co-authored-by: Claude-Code <noreply@anthropic.com>
…columns AIF_attackType + AIF_attackedNode (#753) Reassigned by ai-01 (po-2023 dead-channel ~2j, dispatch 1pgunw). First prod CSV write of chantier #498. Adds 2 trailing-AIF-block columns to Cards/Fallacies/Argumentum Fallacies - Taxonomy.csv, inserted AFTER AIF_skosMappingType (col idx 94), before `shape` (idx 95) — new cols join the existing AIF block (cols 91-96). Derivation: §7 of the 12 docs/taxonomy/498-aif-*-cluster.md cluster docs. attackType = bolded token in each `### pk NNN -> **type**` header. attackedNode DETERMINISTIC per ratified contract #707§4 Option (a): undercut->RA-node, undermine->I-node, rebut->CA-node. Distribution (46 filled of 1408): 44 undercut/RA-node + 2 undermine/I-node (838, 843). 0 rebut (consistent with rebut-rarity). 17 FAIL-LOUD/gap leaves left EMPTY (0 fabrication #677): CA-token-missing {829,840,847,848,853} + RA-node/gap {832,834,835,837,861,868-874}. Remaining 1345 leaves (not decomposed in §7) empty. SURGICAL byte-exact: rewrites NO existing field. Byte-preservation VERIFIED independently — 0 mismatches: every existing field (idx 0-94 and 95-101) is byte-identical between backup and result; only 2 new fields inserted per row. CRLF (1409) + 144 embedded-LF + BOM preserved. CsvHelper maps by header name, so insertion breaks no existing mapping. Tests: dotnet test = 594 pass / 1 fail (#133 OWL pre-existing, unrelated) / 5 skip — 0 new failures; Fallacies-loading tests all pass. Audit: tools/498-fallacies-aif-columns-apply.py (re-runnable derivation + surgical apply + verify). Gated: review ai-01 + veto jsboige (structural reassignment). Does NOT self-merge. Does NOT touch #674/#666/#596 (HOLD). Co-authored-by: Your <your.email@example.com> Co-authored-by: Claude-Code <noreply@anthropic.com>
…v2) into 2 new columns (#755) Executes the [primaire] mirror per ai-01 dispatch tw8www (post #753 merge). Applies the ratified deterministic back-fill (plan #750 v2) to Cards/Fallacies/Argumentum Virtues - Taxonomy.csv as the same 2 columns (AIF_attackType + AIF_attackedNode) — anti-drift with the Fallacies contract (#753). Both taxonomies now share an identical AIF column contract. Derivation (plan #750 v2, re-confirmed programmatically on master): default undercut/RA-node override undermine/I-node if opposes {889 Mensonge, 804 Acception arbitraire} override rebut/CA-node if opposes {340 Appel aux conséquences} Distribution EXACT: 206 undercut + 13 undermine {34,36,49,55,56,73,137,139,140, 153,154,155,158} + 3 rebut {53,54,165} = 222 nodes with scheme; 1 root node (pk 0, no scheme) = empty. SURGICAL byte-exact (same technique as #753, tools/499-...-apply.py on master via #754): rewrites NO existing field. Independently VERIFIED post-write backup-vs-result: 0 byte-preservation mismatch across all 223 data rows (fields idx 0-77 and 78 original -> 80 after byte-identical); CRLF (224) + BOM preserved; re-parse clean 81 cols (was 79). CsvHelper maps by header name -> 0 ClassMap break. Placement: after AIF_skosMappingType (idx 77), before print_and_play (->80). Same convention as #753 (per ai-01 verdict: keep after-AIF-block). Tests: dotnet test = 594 pass / 1 fail (#133 OWL pre-existing, unrelated) / 5 skip -- 0 new failures; Virtues-loading tests (VirtueClassMapRegressionTests, EntityClassMapRegressionTests) all pass. 0 entity/test references new cols. Gated: review ai-01 (independent byte-check, same as #753). Does NOT self-merge. Does NOT touch #674/#666/#596 (HOLD). Co-authored-by: Your <your.email@example.com> Co-authored-by: Claude-Code <noreply@anthropic.com>
Summary
Source-level migration of the 12 deprecated
ToSic.Sxc.Dnn.RazorComponenttemplates (the Dnn-specific base, removed in 2sxc 21 LTS) to the modern Dnn-agnosticCustom.Hybrid.Razor14base. This is the last remaining 2sxc breaking-risk identified in the DNN 10.3.2 + 2sxc 21 upgrade arc (#458 / #131).Dispatched by ai-01 (coordinator). Worker: po-2023.
Scope (12 files — all under
DNNPlatform/)News5/bs3 (5):
_Details.cshtml_List.cshtml_List archive.cshtml_List Columns.cshtml_List Columns without images.cshtmlContent/bs3 (7):
Layout/_Line.cshtmlLink/_Large emphasized link.cshtmlLink/_List of document-links.cshtmlLink/_List of icon-links.cshtmlLink/_List of image-links with overlay.cshtmlLink/_List of image-links.cshtmlLink/_List of links.cshtml0 files under
Cards/(release freeze respected — master staysbef3bc6c).API migrations (semantics preserved, 2sxc 21-compatible)
@inherits ToSic.Sxc.Dnn.RazorComponent@inherits Custom.Hybrid.Razor14Request.QueryString["category"]CmsContext.Page.Parameters["category"]Dnn.Module.ModuleIDCmsContext.Module.Id@using ToSic.Eav.Run;@using ToSic.Sxc.Context;_List*CustomizeSearch(... IContainer moduleInfo ...)CustomizeSearch(... IModule moduleInfo ...)_List*The
CustomizeSearchsignature is aligned with the repo's already-modernNews5/DnnSearch/SearchMapper.cs(Custom.Hybrid.Code12, ICustomizeSearch,IModule). Each of the 4_List*overrides preserves its own logic (_List.cshtml= stream cleanup + per-entity querystring; the 3 others =searchInfos.Clear()to prevent duplicate results) — none were removed or merged intoSearchMapper, to avoid changing behavior without runtime tests.APIs preserved (still valid in Razor14 — confirmed)
App.Data,AsList,AsDynamic,Content,CreateInstance,GetService,Edit.TagToolbar/Edit.Enabled,Text.Has,Tags.*(Tags.Nl2Br,Tags.Strip),@RenderPage,@Html.Partial,@Html.Raw,CmsContext.View.Identifier(already modern in_Line.cshtml).Out-of-scope shared dependencies left untouched (per dispatch perimeter):
News5/bs3/shared/_Parts.cshtml— alreadyCustom.Hybrid.Razor12(2sxc 21 supports Razor12).Content/bs3/Link/_LinkHelper.cshtml— helper with no@inherits, not in the 12-template list.These points cannot be verified by
dotnet build(2sxc interprets.cshtmlat runtime). To validate on the DNN sandbox post-2sxc-21-upgrade:CustomizeSearchoverride signature (IModule) in the 4 News5_List*— confirmCustom.Hybrid.Razor14still exposes thevirtualoverride. If 2sxc 21 dropped template-level overrides in favor of theICustomizeSearchinterface, fall back to the existingNews5/DnnSearch/SearchMapper.cspattern (move the per-template logic intoSearchMapperor a per-viewSearchMapper).CmsContext.Page.Parameters["category"]null-behavior — verify it returnsnullwhen the parameter is absent (downstreamText.Has(...)handles null). If it throws on missing key, wrap with.ContainsKey("category")._LinkHelper.cshtml:30usesDnn.Portal.PortalAlias.HTTPAlias(legacy). NOT migrated here (outside the 12-template scope, no@inherits). It may break when instantiated from a Razor14 template → candidate follow-up PR if the sandbox reveals it.Diff hygiene
29 insertions / 29 deletions (no line-ending noise — repo has no
.gitattributes+core.autocrlf=false; files were re-normalized to match each original's line ending).Related
docs/dnn-localization/131-step2-smoke-test-checklist.md.🤖 Worker po-2023 · dispatched by ai-01 · runtime validation pending on sandbox