Production Grade Cloud-Ready .NET 10 Starter Kit (Web API + React Client) with Multitenancy Support, and Clean/Modular Architecture that saves roughly 200+ Development Hours! All Batteries Included.
This report presents the forensic synthetic code analysis of fullstackhero/dotnet-starter-kit, a C# project with 6,713 GitHub stars. SynthScan v2.0 examined 224,470 lines of code across 2132 source files, recording 825 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 9.5 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 825 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | clients/admin/src/components/ui/dialog.tsx | 152 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/ui/dialog.tsx | 156 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nts/admin/src/components/auth/demo-accounts-dialog.tsx | 11 | // ──────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nts/admin/src/components/auth/demo-accounts-dialog.tsx | 19 | // ──────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nts/admin/src/components/auth/demo-accounts-dialog.tsx | 117 | // ─── AccountRow ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/auth/auth-shell.tsx | 5 | // ──────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/auth/auth-shell.tsx | 18 | // ──────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/topbar.tsx | 39 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/topbar.tsx | 41 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/topbar.tsx | 143 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/topbar.tsx | 145 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/nav-items.ts | 39 | // ─── Top-level singletons ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/nav-items.ts | 49 | // ─── Section accordions ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/nav-items.ts | 122 | // ─── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/sidebar.tsx | 165 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/sidebar.tsx | 168 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/sidebar.tsx | 262 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/sidebar.tsx | 264 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/sidebar.tsx | 352 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/layout/sidebar.tsx | 355 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ents/admin/src/components/roles/create-role-dialog.tsx | 23 | // ─── Schema (identical to the old create page) ─────────────────────────────── | COMMENT |
| MEDIUM | …ents/admin/src/components/roles/create-role-dialog.tsx | 36 | // ─── Dialog ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/tenant-branding-card.tsx | 187 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/tenant-branding-card.tsx | 189 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/tenant-branding-card.tsx | 289 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/tenant-branding-card.tsx | 291 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/tenant-branding-card.tsx | 382 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/tenant-branding-card.tsx | 384 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/create-tenant-dialog.tsx | 35 | // ─── Schema (unchanged contract) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/create-tenant-dialog.tsx | 90 | // ─── Small inline adornment button (eye / generate) ───────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/create-tenant-dialog.tsx | 119 | // ─── Live preview rail ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/admin/src/components/tenants/create-tenant-dialog.tsx | 198 | // ─── Dialog ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/list/settings-section.tsx | 5 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/list/settings-section.tsx | 16 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/list/settings-field.tsx | 4 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/list/settings-field.tsx | 15 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ients/admin/src/components/list/entity-page-header.tsx | 5 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ients/admin/src/components/list/entity-page-header.tsx | 10 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/list/tone-icon-tile.tsx | 4 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/list/tone-icon-tile.tsx | 15 | // ─────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/components/list/index.ts | 10 | // ── Phase-2 unified design-system primitives ────────────────────────── | COMMENT |
| MEDIUM | …ents/admin/src/components/users/create-user-dialog.tsx | 23 | // ─── Schema (identical to the old create page) ─────────────────────────────── | COMMENT |
| MEDIUM | …ents/admin/src/components/users/create-user-dialog.tsx | 47 | // ─── Section label ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ents/admin/src/components/users/create-user-dialog.tsx | 76 | // ─── Dialog ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/src/components/impersonation/active-grants-card.tsx | 107 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/src/components/impersonation/active-grants-card.tsx | 109 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/src/components/impersonation/impersonate-dialog.tsx | 122 | // ─── Step 1: pick user ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/src/components/impersonation/impersonate-dialog.tsx | 245 | // ─── Step 2: configure ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/src/components/impersonation/impersonate-dialog.tsx | 436 | // ─── Handoff helper ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/hooks/use-file-upload.ts | 98 | // ── Client-side guard rails (defense-in-depth) ───────────── | COMMENT |
| MEDIUM | clients/admin/src/hooks/use-file-upload.ts | 136 | // ── Step 1 — mint the presigned URL ───────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/hooks/use-file-upload.ts | 165 | // ── Step 2 — PUT bytes via XHR for progress events ────────── | COMMENT |
| MEDIUM | clients/admin/src/hooks/use-file-upload.ts | 191 | // ── Step 3 — finalize ────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/lib/permissions.ts | 80 | // ─── Catalog (drives the Role editor) ─────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/api/wallet.ts | 4 | // ─── shared enums ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/api/wallet.ts | 13 | // ─── top-up requests ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/api/tenants.ts | 145 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/api/tenants.ts | 153 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/api/billing.ts | 6 | // ─── shared enums ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | clients/admin/src/api/billing.ts | 25 | // ─── plans ─────────────────────────────────────────────────────────── | COMMENT |
| 566 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/admin/tests/billing/plans.spec.ts | 101 | COMMENT | |
| LOW | clients/admin/src/components/auth/auth-shell.tsx | 1 | import type { ReactNode } from "react"; | COMMENT |
| LOW | clients/admin/src/components/list/settings-section.tsx | 1 | import * as React from "react"; | COMMENT |
| LOW | clients/admin/src/components/list/settings-field.tsx | 1 | import * as React from "react"; | COMMENT |
| LOW | clients/admin/src/components/list/tone-icon-tile.tsx | 1 | import type { LucideIcon } from "lucide-react"; | COMMENT |
| LOW | clients/admin/src/api/audits.ts | 81 | traceId?: string; | COMMENT |
| LOW | clients/dashboard/tests/chat/chat.spec.ts | 1 | // E2E coverage for the /chat shell (src/pages/chat/chat-page.tsx): the | COMMENT |
| LOW | clients/dashboard/tests/files/files.spec.ts | 1 | // E2E coverage for the /files page (src/pages/files/my-files.tsx): the file | COMMENT |
| LOW | …hboard/tests/impersonation/impersonation-ended.spec.ts | 1 | // E2E coverage for the impersonation-revoked terminal flow. | COMMENT |
| LOW | clients/dashboard/src/routes.tsx | 1 | import { lazy, Suspense, type ComponentType } from "react"; | COMMENT |
| LOW | …ients/dashboard/src/components/list/tone-icon-tile.tsx | 1 | import type { LucideIcon } from "lucide-react"; | COMMENT |
| LOW | clients/dashboard/src/api/tenants.ts | 1 | import { apiFetch } from "@/lib/api-client"; | COMMENT |
| LOW | deploy/terraform/modules/ecs_task/main.tf | 1 | ################################################################################ | COMMENT |
| LOW | deploy/terraform/modules/static_site/main.tf | 1 | ################################################################################ | COMMENT |
| LOW | deploy/terraform/apps/starter/deploy.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …ans/2026-08-06-framework-owned-transactional-outbox.md | 381 | /// <summary> | COMMENT |
| LOW | src/Tools/CLI/Infrastructure/VersionComparer.cs | 1 | namespace FSH.CLI.Infrastructure; | COMMENT |
| LOW | src/Host/FSH.Starter.DbMigrator/PostgresMigratorLock.cs | 21 | // Parameterised SQL: the bigint key is constant, but a parameter satisfies | COMMENT |
| LOW | src/Host/FSH.Starter.DbMigrator/DemoSeed/DemoSeeder.cs | 181 | /// | COMMENT |
| LOW | src/Tests/Caching.Tests/CachedTypeContractTests.cs | 1 | using System.ComponentModel; | COMMENT |
| LOW | src/Tests/Architecture.Tests/TenantIsolationTests.cs | 21 | /// the auto-apply in <c>BaseDbContext.OnModelCreating</c>. Opt-out is via the | COMMENT |
| LOW | …ests/Infrastructure/MiddlewareWebApplicationFactory.cs | 21 | using Microsoft.Extensions.Configuration; | COMMENT |
| LOW | …ests/Infrastructure/MiddlewareWebApplicationFactory.cs | 301 | if (modulesField?.GetValue(null) is System.Collections.IList list) | COMMENT |
| LOW | …tegration.Tests/Tests/Chat/ChatTenantIsolationTests.cs | 1 | using FSH.Modules.Chat.Contracts.v1.DTOs; | COMMENT |
| LOW | …tegration.Tests/Tests/Multitenancy/TenantThemeTests.cs | 1 | #pragma warning disable S1144 // Unused private members — populated by JSON deserialization | COMMENT |
| LOW | …s/Tests/Multitenancy/TenantProvisioningFailureTests.cs | 1 | using System.Text.Json; | COMMENT |
| LOW | …/Multitenancy/ChangeTenantActivationValidationTests.cs | 1 | #pragma warning disable S1144 // Unused private members — populated by JSON deserialization | COMMENT |
| LOW | ….Tests/Tests/Multitenancy/TenantHeaderOverrideTests.cs | 1 | #pragma warning disable S1144 // Unused private members — populated by JSON | COMMENT |
| LOW | …ts/Integration.Tests/Tests/Auditing/AuditTestHelper.cs | 1 | using System.Text.Json; | COMMENT |
| LOW | …ts/Integration.Tests/Tests/Auditing/AuditTestHelper.cs | 101 | response.StatusCode.ShouldBe(HttpStatusCode.OK); | COMMENT |
| LOW | …/Tests/Integration.Tests/Infrastructure/OutboxDrain.cs | 1 | using FSH.Framework.Eventing.Outbox; | COMMENT |
| LOW | …ramework.Tests/Eventing/EventingDbContextModelTests.cs | 81 | // Both are IGlobalEntity: the dispatcher scans across tenants within a database. | COMMENT |
| LOW | src/Tests/Multitenancy.Tests/TenantLifecycleTests.cs | 1 | namespace Multitenancy.Tests; | COMMENT |
| LOW | src/Tests/Multitenancy.Tests/TenantLifecycleTests.cs | 21 | // $"/api/v1/tenants/{tenantId}/activation", | COMMENT |
| LOW | src/BuildingBlocks/Core/Context/IRequestContext.cs | 1 | namespace FSH.Framework.Core.Context; | COMMENT |
| LOW | …BuildingBlocks/Core/Context/ICurrentUserInitializer.cs | 1 | using System.Security.Claims; | COMMENT |
| LOW | src/BuildingBlocks/Core/Context/ICurrentUser.cs | 21 | /// <summary> | COMMENT |
| LOW | src/BuildingBlocks/Core/Context/ICurrentUser.cs | 41 | /// </summary> | COMMENT |
| LOW | src/BuildingBlocks/Core/Common/QueryStringKeys.cs | 1 | namespace FSH.Framework.Core.Common; | COMMENT |
| LOW | src/BuildingBlocks/Core/Abstractions/IAppUser.cs | 1 | namespace FSH.Framework.Core.Abstractions; | COMMENT |
| LOW | src/BuildingBlocks/Core/Abstractions/IAppUser.cs | 21 | Uri? ImageUrl { get; } | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/ISoftDeletable.cs | 1 | namespace FSH.Framework.Core.Domain; | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/IHasDomainEvents.cs | 1 | namespace FSH.Framework.Core.Domain; | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/IAuditableEntity.cs | 1 | namespace FSH.Framework.Core.Domain; | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/BaseEntity.cs | 21 | /// <summary> | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/IDomainEvent.cs | 21 | /// <summary> | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/IGlobalEntity.cs | 1 | namespace FSH.Framework.Core.Domain; | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/DomainEvent.cs | 1 | namespace FSH.Framework.Core.Domain; | COMMENT |
| LOW | src/BuildingBlocks/Core/Domain/IEntity.cs | 1 | namespace FSH.Framework.Core.Domain; | COMMENT |
| LOW | …dingBlocks/Web/HttpResilience/HttpResilienceOptions.cs | 1 | namespace FSH.Framework.Web.HttpResilience; | COMMENT |
| LOW | …dingBlocks/Web/HttpResilience/HttpResilienceOptions.cs | 21 | public TimeSpan MedianFirstRetryDelay { get; set; } = TimeSpan.FromSeconds(1); | COMMENT |
| LOW | src/BuildingBlocks/Web/Sse/SseEvent.cs | 1 | namespace FSH.Framework.Web.Sse; | COMMENT |
| LOW | …/BuildingBlocks/Web/Security/SecurityHeadersOptions.cs | 21 | /// Additional script sources to append to CSP. | COMMENT |
| LOW | …c/BuildingBlocks/Web/Idempotency/IdempotencyOptions.cs | 1 | namespace FSH.Framework.Web.Idempotency; | COMMENT |
| LOW | …eb/Observability/OpenTelemetry/OpenTelemetryOptions.cs | 21 | /// Job instrumentation options (e.g., Hangfire). | COMMENT |
| LOW | src/BuildingBlocks/Web/Realtime/IPresenceTracker.cs | 1 | namespace FSH.Framework.Web.Realtime; | COMMENT |
| LOW | src/BuildingBlocks/Web/Realtime/AppHub.cs | 1 | using System.Security.Claims; | COMMENT |
| LOW | …c/BuildingBlocks/Web/Validation/PagedQueryValidator.cs | 1 | using FluentValidation; | COMMENT |
| LOW | …ks/Shared/Multitenancy/ITenantInitialPasswordBuffer.cs | 1 | namespace FSH.Framework.Shared.Multitenancy; | COMMENT |
| LOW | src/BuildingBlocks/Shared/Persistence/IPagedQuery.cs | 1 | namespace FSH.Framework.Shared.Persistence; | COMMENT |
| 66 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/BuildingBlocks/Caching/CacheKeys.cs | 6 | /// <see cref="Microsoft.Extensions.Caching.Hybrid.HybridCache.RemoveByTagAsync(string, System.Threading.CancellationTok | COMMENT |
| CRITICAL | src/Modules/Identity/Modules.Identity/IdentityModule.cs | 86 | FSH.Framework.Shared.Constants.PermissionConstants.Register( | CODE |
| CRITICAL | …ultitenancy/Modules.Multitenancy/MultitenancyModule.cs | 51 | FSH.Framework.Shared.Constants.PermissionConstants.Register( | CODE |
| CRITICAL | src/Modules/Auditing/Modules.Auditing/AuditingModule.cs | 33 | FSH.Framework.Shared.Constants.PermissionConstants.Register( | CODE |
| CRITICAL | src/Modules/Billing/Modules.Billing/BillingModule.cs | 47 | FSH.Framework.Shared.Constants.PermissionConstants.Register( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/admin/tests/tenants/tenants-list.spec.ts | 7 | name: "Acme Corp", | CODE |
| LOW | clients/admin/tests/tenants/tenant-billing.spec.ts | 55 | id: "acme-corp", name: "Acme Corp", adminEmail: "admin@acme.example", | CODE |
| LOW | clients/admin/tests/tenants/tenant-billing.spec.ts | 87 | await dialog.getByLabel(/^Display name/).fill("Acme Corp"); | CODE |
| LOW | clients/admin/tests/tenants/tenant-billing.spec.ts | 111 | id: "acme-corp", name: "Acme Corp", adminEmail: "admin@acme.example", | CODE |
| LOW | clients/admin/tests/tenants/tenant-billing.spec.ts | 179 | id: "acme-corp", name: "Acme Corp", adminEmail: "admin@acme.example", | CODE |
| LOW | clients/admin/tests/tenants/branding.spec.ts | 20 | name: "Acme Corp", | CODE |
| LOW | clients/admin/tests/tenants/tenant-create.spec.ts | 93 | name: "Acme Corp", | CODE |
| LOW | clients/admin/tests/tenants/tenant-create.spec.ts | 125 | await dialog.getByLabel(/^Display name/).fill("Acme Corp"); | CODE |
| LOW | clients/admin/tests/tenants/tenant-create.spec.ts | 142 | name: "Acme Corp", | CODE |
| LOW | clients/admin/tests/tenants/tenant-create.spec.ts | 158 | await dialog.getByLabel(/^Display name/).fill("Acme Corp"); | CODE |
| LOW | clients/admin/tests/tenants/tenant-create.spec.ts | 214 | await dialog.getByLabel(/^Display name/).fill("Acme Corp"); | CODE |
| LOW | clients/admin/tests/tenants/tenant-detail.spec.ts | 13 | name: "Acme Corp", | CODE |
| LOW | clients/admin/tests/tenants/tenant-detail.spec.ts | 73 | page.getByRole("heading", { level: 2, name: "Acme Corp", exact: true }), | CODE |
| LOW | clients/admin/tests/tenants/tenant-detail.spec.ts | 120 | page.getByRole("heading", { level: 2, name: "Acme Corp", exact: true }), | CODE |
| LOW | clients/admin/tests/dashboard/dashboard.spec.ts | 20 | name: "Acme Corp", | CODE |
| LOW | …/admin/src/components/tenants/create-tenant-dialog.tsx | 385 | placeholder="Acme Corp" | CODE |
| LOW | …ents/admin/src/components/users/create-user-dialog.tsx | 237 | placeholder="user@example.com" | CODE |
| LOW | clients/dashboard/tests/overview/overview.spec.ts | 63 | name: "Acme Corp", | CODE |
| LOW | clients/dashboard/tests/overview/overview.spec.ts | 82 | name: "Acme Corp", | CODE |
| LOW | clients/dashboard/tests/helpers/shell-mocks.ts | 55 | name: "Acme Corp", | CODE |
| LOW | clients/dashboard/tests/billing/subscription.spec.ts | 25 | name: "Acme Corp", | CODE |
| LOW | clients/dashboard/src/pages/login.demo-accounts.ts | 40 | tenantLabel: "Acme Corp", | CODE |
| LOW | clients/dashboard/src/pages/login.demo-accounts.ts | 94 | tenantLabel: "Acme Corp", | CODE |
| LOW | clients/dashboard/src/pages/chat/composer.tsx | 155 | // (avoids false positives inside emails like "foo@bar.com"). The token | COMMENT |
| LOW | src/Host/FSH.Starter.DbMigrator/DemoSeed/DemoSeeder.cs | 56 | Name: "Acme Corp", | CODE |
| LOW | …c/Tests/Auditing.Tests/Contracts/AuditEnvelopeTests.cs | 26 | "John Doe", | CODE |
| LOW | …c/Tests/Auditing.Tests/Contracts/AuditEnvelopeTests.cs | 51 | "John Doe", | CODE |
| LOW | …c/Tests/Auditing.Tests/Contracts/AuditEnvelopeTests.cs | 68 | envelope.UserName.ShouldBe("John Doe"); | CODE |
| LOW | …Tests/Tests/Health/TenantMigrationsHealthCheckTests.cs | 125 | new AppTenantInfo("placeholder", "placeholder", string.Empty, "x@x", null)); | CODE |
| LOW | …Tests/Validators/GenerateTokenCommandValidatorTests.cs | 19 | var command = new GenerateTokenCommand("user@example.com", "password123"); | CODE |
| LOW | …Tests/Validators/GenerateTokenCommandValidatorTests.cs | 65 | [InlineData("user@example.com")] | CODE |
| LOW | …Tests/Validators/GenerateTokenCommandValidatorTests.cs | 89 | var command = new GenerateTokenCommand("user@example.com", "password123"); | CODE |
| LOW | …Tests/Validators/GenerateTokenCommandValidatorTests.cs | 105 | var command = new GenerateTokenCommand("user@example.com", password!); | CODE |
| LOW | …Tests/Validators/GenerateTokenCommandValidatorTests.cs | 123 | var command = new GenerateTokenCommand("user@example.com", "SecureP@ssw0rd!"); | CODE |
| LOW | …/Tests/Identity.Tests/Authorization/JwtOptionsTests.cs | 236 | r.ErrorMessage!.Contains("placeholder", StringComparison.OrdinalIgnoreCase)); | CODE |
| LOW | …ity.Tests/Handlers/GenerateTokenCommandHandlerTests.cs | 64 | var command = new GenerateTokenCommand("user@example.com", "password123"); | CODE |
| LOW | …ity.Tests/Handlers/GenerateTokenCommandHandlerTests.cs | 103 | var command = new GenerateTokenCommand("user@example.com", "password123"); | CODE |
| LOW | …ity.Tests/Handlers/GenerateTokenCommandHandlerTests.cs | 142 | var command = new GenerateTokenCommand("user@example.com", "wrongpassword"); | CODE |
| LOW | …ity.Tests/Handlers/GenerateTokenCommandHandlerTests.cs | 161 | var command = new GenerateTokenCommand("user@example.com", "wrongpassword"); | CODE |
| LOW | …ity.Tests/Handlers/GenerateTokenCommandHandlerTests.cs | 202 | var command = new GenerateTokenCommand("user@example.com", "password123"); | CODE |
| LOW | …ity.Tests/Handlers/GenerateTokenCommandHandlerTests.cs | 237 | var command = new GenerateTokenCommand("user@example.com", "password123"); | CODE |
| LOW | …ity.Tests/Handlers/GenerateTokenCommandHandlerTests.cs | 271 | var command = new GenerateTokenCommand("user@example.com", "password123"); | CODE |
| LOW | …sts/Identity.Tests/Services/CurrentUserServiceTests.cs | 386 | new(ClaimTypes.Name, "John Doe") | CODE |
| LOW | …sts/Identity.Tests/Services/CurrentUserServiceTests.cs | 396 | result.ShouldBe("John Doe"); | CODE |
| LOW | src/Tests/Identity.Tests/Services/TokenServiceTests.cs | 61 | new Claim(ClaimTypes.Email, "user@example.com") | CODE |
| LOW | src/Tests/Identity.Tests/Services/TokenServiceTests.cs | 114 | jwt.Claims.ShouldContain(c => c.Type == ClaimTypes.Email && c.Value == "user@example.com"); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 173 | - [Getting started](https://fullstackhero.net/docs/getting-started/introduction/) — scaffold, run, and the default crede | CODE |
| MEDIUM | .agents/skills/testing-guide/SKILL.md | 88 | ## Architecture tests (guardrails — keep green) | COMMENT |
| MEDIUM | .github/workflows/template-smoke.yml | 3 | # Guards the distribution path: scaffolding a project from the template must | COMMENT |
| MEDIUM | src/Host/FSH.Starter.AppHost/AppHost.cs | 159 | // React apps excluded: discard the unused api handle to keep the no-frontend scaffold warning-clean (S1481 under TreatW | STRING |
| MEDIUM | …egration.Tests/Tests/Files/FileTenantIsolationTests.cs | 85 | #region Tenant scaffolding (copied from WebhookTenantIsolationTests) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/admin/src/api/tenants.ts | 93 | export async function getTenantProvisioningStatus(id: string): Promise<TenantProvisioningStatus> { | CODE |
| LOW | clients/admin/src/api/webhooks.ts | 42 | export function createWebhookSubscription(input: CreateWebhookSubscriptionInput): Promise<string> { | CODE |
| LOW | clients/admin/src/api/webhooks.ts | 53 | export function deleteWebhookSubscription(id: string): Promise<void> { | CODE |
| LOW | clients/admin/src/api/sessions.ts | 51 | export async function adminRevokeAllUserSessions(userId: string): Promise<{ revokedCount: number }> { | CODE |
| LOW | clients/dashboard/src/auth/impersonation-handoff.ts | 21 | export function installImpersonationFromHash(): void { | CODE |
| LOW | …ents/dashboard/src/components/theme/theme-provider.tsx | 153 | function clearCustomBrandInlineStyles(root: HTMLElement) { | CODE |
| LOW | …ents/dashboard/src/components/theme/theme-provider.tsx | 157 | function applyCustomBrandInlineStyles(root: HTMLElement, spec: CustomAccentSpec) { | CODE |
| LOW | clients/dashboard/src/lib/api-client.ts | 61 | export function isImpersonationRevokedError(error: unknown): boolean { | CODE |
| LOW | clients/dashboard/src/api/identity.ts | 121 | export async function resendUserConfirmationEmail(userId: string): Promise<void> { | CODE |
| LOW | clients/dashboard/src/api/identity.ts | 247 | export async function adminRevokeAllUserSessions( | CODE |
| LOW | clients/dashboard/src/api/sessions.ts | 66 | export function adminRevokeUserSessionById(userId: string, sessionId: string) { | CODE |
| LOW | clients/dashboard/src/api/sessions.ts | 73 | export function adminRevokeAllUserSessions(userId: string) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | deploy/terraform/bootstrap/.terraform.lock.hcl | 1 | # This file is maintained automatically by "terraform init". | COMMENT |
| MEDIUM | deploy/terraform/apps/starter/app_stack/main.tf | 445 | # Create a secret for the full connection string | COMMENT |
| MEDIUM | …y/terraform/apps/starter/app_stack/.terraform.lock.hcl | 1 | # This file is maintained automatically by "terraform init". | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ules.Auditing/Infrastructure/Http/ContentTypeHelper.cs | 11 | // Prefer robust parse; fallback to naive split if needed. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/Host/FSH.Starter.DbMigrator/DemoSeed/DemoSeeder.cs | 819 | (uid("carol@acme.com"), "Thanks. Let me know if you need a repro account."), | CODE |