Self-hosted, open-source agent skill registry for enterprises. Publish & version skill packages, govern with RBAC and audit logs, deploy on-premise with Docker or Kubernetes.
This report presents the forensic synthetic code analysis of iflytek/skillhub, a Java project with 4,840 GitHub stars. SynthScan v2.0 examined 226,337 lines of code across 1806 source files, recording 325 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 4.6 places this repository in the Likely human-written 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 325 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 |
|---|---|---|---|---|
| CRITICAL⚡ | …ek/skillhub/infra/scanner/SkillScannerServiceTest.java | 21 | org.assertj.core.api.Assertions.assertThatThrownBy(() -> | CODE |
| CRITICAL⚡ | …ek/skillhub/infra/scanner/SkillScannerServiceTest.java | 24 | org.assertj.core.api.Assertions.assertThatThrownBy(() -> | CODE |
| CRITICAL⚡ | …ek/skillhub/infra/scanner/SkillScannerServiceTest.java | 27 | org.assertj.core.api.Assertions.assertThatThrownBy(() -> | CODE |
| CRITICAL⚡ | …ek/skillhub/infra/scanner/SkillScannerServiceTest.java | 30 | org.assertj.core.api.Assertions.assertThatThrownBy(() -> | CODE |
| CRITICAL | …a/com/iflytek/skillhub/infra/http/WebClientConfig.java | 27 | reactor.netty.http.client.HttpClient reactorClient = reactor.netty.http.client.HttpClient.create() | CODE |
| CRITICAL⚡ | …lytek/skillhub/auth/oauth/OAuth2LoginHandlersTest.java | 29 | new com.iflytek.skillhub.auth.session.PlatformSessionService(), | CODE |
| CRITICAL⚡ | …lytek/skillhub/auth/oauth/OAuth2LoginHandlersTest.java | 38 | var principal = new com.iflytek.skillhub.auth.rbac.PlatformPrincipal( | CODE |
| CRITICAL⚡ | …lytek/skillhub/auth/oauth/OAuth2LoginHandlersTest.java | 78 | new com.iflytek.skillhub.auth.session.PlatformSessionService(), | CODE |
| CRITICAL⚡ | …lytek/skillhub/auth/oauth/OAuth2LoginHandlersTest.java | 88 | var principal = new com.iflytek.skillhub.auth.rbac.PlatformPrincipal( | CODE |
| CRITICAL | …tek/skillhub/auth/oauth/CustomOidcUserServiceTest.java | 180 | new org.springframework.security.oauth2.core.OAuth2Error("access_denied"))); | CODE |
| CRITICAL | …tek/skillhub/auth/identity/IdentityBindingService.java | 75 | throw new com.iflytek.skillhub.auth.oauth.AccountPendingException(); | CODE |
| CRITICAL | …tek/skillhub/auth/identity/IdentityBindingService.java | 78 | throw new com.iflytek.skillhub.auth.oauth.AccountDisabledException(); | CODE |
| CRITICAL | …tek/skillhub/auth/identity/IdentityBindingService.java | 101 | throw new com.iflytek.skillhub.auth.oauth.AccountDisabledException(); | CODE |
| CRITICAL | …tek/skillhub/auth/identity/IdentityBindingService.java | 103 | throw new com.iflytek.skillhub.auth.oauth.AccountPendingException(); | CODE |
| CRITICAL | …skillhub/controller/NamespacePortalControllerTest.java | 85 | .willReturn(List.of(new com.iflytek.skillhub.domain.namespace.NamespaceMember(1L, "owner-1", NamespaceRo | CODE |
| CRITICAL | …skillhub/controller/NamespacePortalControllerTest.java | 134 | mockMvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put("/api/v1/namespaces/team | CODE |
| CRITICAL | …skillhub/controller/NamespacePortalControllerTest.java | 182 | .willReturn(new org.springframework.data.domain.PageImpl<>(List.of(), org.springframework.data.domain.Pa | STRING |
| CRITICAL | …skillhub/controller/NamespacePortalControllerTest.java | 200 | .willReturn(new org.springframework.data.domain.PageImpl<>(List.of(member), org.springframework.data.dom | STRING |
| CRITICAL | …skillhub/controller/NamespacePortalControllerTest.java | 266 | mockMvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete("/api/v1/namespaces/t | STRING |
| CRITICAL | …skillhub/controller/NamespacePortalControllerTest.java | 286 | mockMvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put("/api/v1/namespaces/team | STRING |
| CRITICAL | …ytek/skillhub/controller/GovernanceControllerTest.java | 182 | mockMvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/api/v1/governance/not | CODE |
| CRITICAL | …ytek/skillhub/controller/GovernanceControllerTest.java | 183 | .with(org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors | CODE |
| CRITICAL | …m/iflytek/skillhub/controller/SkillControllerTest.java | 176 | new com.iflytek.skillhub.domain.skill.service.SkillLifecycleProjectionService.VersionProjection( | CODE |
| CRITICAL | …m/iflytek/skillhub/controller/SkillControllerTest.java | 178 | new com.iflytek.skillhub.domain.skill.service.SkillLifecycleProjectionService.VersionProjection( | CODE |
| CRITICAL | …skillhub/controller/NamespaceWorkflowContractTest.java | 211 | org.springframework.test.util.ReflectionTestUtils.setField(namespace, "id", id); | CODE |
| CRITICAL | …skillhub/controller/NamespaceWorkflowContractTest.java | 215 | org.springframework.test.util.ReflectionTestUtils.setField(member, "id", id); | CODE |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 129 | var token = new com.iflytek.skillhub.auth.entity.ApiToken("user-42", "cli", "sk_123456", "hash-1", "[]"); | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 130 | org.springframework.test.util.ReflectionTestUtils.setField(token, "id", 7L); | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 131 | org.springframework.test.util.ReflectionTestUtils.setField(token, "createdAt", java.time.Instant.parse("2026-03- | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 159 | new com.iflytek.skillhub.auth.entity.ApiToken("user-42", "cli", "sk_123456", "hash-1", "[]"), | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 160 | new com.iflytek.skillhub.auth.entity.ApiToken("user-42", "deploy", "sk_654321", "hash-2", "[]") | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 167 | org.springframework.test.util.ReflectionTestUtils.setField(first, "id", 7L); | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 168 | org.springframework.test.util.ReflectionTestUtils.setField(first, "createdAt", java.time.Instant.parse("2026-03- | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 169 | org.springframework.test.util.ReflectionTestUtils.setField(second, "id", 8L); | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 170 | org.springframework.test.util.ReflectionTestUtils.setField(second, "createdAt", java.time.Instant.parse("2026-03 | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 195 | var token = new com.iflytek.skillhub.auth.entity.ApiToken("user-42", "cli", "sk_123456", "hash-1", "[]"); | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 196 | org.springframework.test.util.ReflectionTestUtils.setField(token, "id", 7L); | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 197 | org.springframework.test.util.ReflectionTestUtils.setField(token, "createdAt", java.time.Instant.parse("2026-03- | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 225 | List.of(new com.iflytek.skillhub.auth.entity.ApiToken("user-42", "cli", "sk_123456", "hash-1", "[]")), | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 230 | org.springframework.test.util.ReflectionTestUtils.setField(token, "id", 7L); | STRING |
| CRITICAL⚡ | …m/iflytek/skillhub/controller/TokenControllerTest.java | 231 | org.springframework.test.util.ReflectionTestUtils.setField(token, "createdAt", java.time.Instant.parse("2026-03- | STRING |
| CRITICAL | …ek/skillhub/controller/ReviewPortalControllerTest.java | 216 | .willThrow(new com.iflytek.skillhub.domain.shared.exception.DomainForbiddenException("review.no_permissi | CODE |
| CRITICAL | …ek/skillhub/controller/ReviewPortalControllerTest.java | 294 | .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.header() | CODE |
| CRITICAL⚡ | …ub/controller/portal/SkillLifecycleControllerTest.java | 351 | org.springframework.test.util.ReflectionTestUtils.setField(namespace, "id", id); | CODE |
| CRITICAL⚡ | …ub/controller/portal/SkillLifecycleControllerTest.java | 355 | org.springframework.test.util.ReflectionTestUtils.setField(skill, "id", id); | CODE |
| CRITICAL⚡ | …ub/controller/portal/SkillLifecycleControllerTest.java | 359 | org.springframework.test.util.ReflectionTestUtils.setField(version, "id", id); | CODE |
| CRITICAL | …portal/SkillApprovalVisibilityFlowIntegrationTest.java | 136 | .thenReturn(List.of(new com.iflytek.skillhub.domain.namespace.NamespaceMember( | CODE |
| CRITICAL | …ek/skillhub/controller/cli/CliSkillControllerTest.java | 138 | new com.iflytek.skillhub.dto.cli.CliResolveResponse( | CODE |
| CRITICAL | …ek/skillhub/controller/cli/CliSkillControllerTest.java | 157 | new com.iflytek.skillhub.dto.cli.CliResolveResponse( | CODE |
| CRITICAL | …ek/skillhub/controller/cli/CliSkillControllerTest.java | 214 | )).willReturn(new com.iflytek.skillhub.dto.cli.CliDeleteResponse( | CODE |
| CRITICAL | …flytek/skillhub/service/SkillSearchAppServiceTest.java | 118 | new com.iflytek.skillhub.domain.shared.exception.DomainBadRequestException( | CODE |
| CRITICAL | …va/com/iflytek/skillhub/config/SkillScannerConfig.java | 46 | reactor.netty.http.client.HttpClient reactorClient = reactor.netty.http.client.HttpClient.create(connectionProvi | CODE |
| CRITICAL | …iflytek/skillhub/service/SkillLifecycleAppService.java | 192 | com.iflytek.skillhub.domain.skill.SkillVisibility.valueOf(targetVisibility), | CODE |
| CRITICAL | …llhub/domain/skill/service/SkillGovernanceService.java | 283 | eventPublisher.publishEvent(new com.iflytek.skillhub.domain.event.SkillVersionYankedEvent( | CODE |
| CRITICAL | docs/superpowers/plans/2026-03-12-phase4-ops-polish.md | 2537 | var ex = new com.iflytek.skillhub.domain.shared.exception.DomainBadRequestException("bad"); | CODE |
| CRITICAL | docs/superpowers/plans/2026-03-12-phase4-ops-polish.md | 2544 | var ex = new com.iflytek.skillhub.domain.shared.exception.DomainForbiddenException("forbidden"); | CODE |
| CRITICAL | …superpowers/plans/2026-03-11-phase1-foundation-auth.md | 2530 | return new org.springframework.security.oauth2.core.user.DefaultOAuth2User( | CODE |
| CRITICAL | …rs/specs/2026-03-12-phase3-review-cli-social-design.md | 611 | SELECT new com.iflytek.skillhub.domain.skill.RatingStats( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | web/e2e/search-page-full.spec.ts | 29 | // ─── Search Input ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-page-full.spec.ts | 103 | // ─── Sort / Filter ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-page-full.spec.ts | 173 | // ─── Skill Count ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-page-full.spec.ts | 213 | // ─── Search Results ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-page-full.spec.ts | 266 | // ─── Pagination ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-page-full.spec.ts | 300 | // ─── Security ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 107 | // ─── Card Display After Search ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 160 | // ─── Card Content & Search Relevance ───────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 188 | // ─── Card Click Navigation ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 236 | // ─── Sort Switching Updates Cards ──────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 275 | // ─── Pagination Card Updates ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 315 | // ─── Loading State ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 331 | // ─── Responsive Layout ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 392 | // ─── Keyboard Navigation ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/e2e/search-card-interaction.spec.ts | 435 | // ─── Error Handling ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 1 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 3 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 5 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 7 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 62 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 64 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 68 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 70 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 79 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 81 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 84 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | charts/skillhub/values.yaml | 86 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 28 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 30 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 46 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 48 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 100 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 102 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 186 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 188 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 278 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 280 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 363 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 365 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 420 | # ============================================================================ | COMMENT |
| MEDIUM | charts/skillhub/values.yaml | 422 | # ============================================================================ | COMMENT |
| MEDIUM | …iflytek/skillhub/domain/user/ProfileReviewService.java | 126 | // ── Private helpers ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 219 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 221 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 229 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 231 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 240 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 242 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 252 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 254 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 262 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/tests/publish-cli-test.sh | 264 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 276 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 278 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 296 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 298 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 337 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 339 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 350 | # ---------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/tests/publish-cli-test.sh | 352 | # ---------------------------------------------------------------------------- | COMMENT |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/e2e/role-access-control.spec.ts | 5 | async function expectLeaveForbiddenRoute(page: Page, route: string) { | CODE |
| LOW | web/e2e/dashboard-routes.spec.ts | 5 | async function expectRouteOpenOrRedirected(page: Page, route: string, heading: string) { | CODE |
| LOW | web/e2e/promotions-review.spec.ts | 99 | async function installPromotionRouteMock(page: Page, expectedSignatures: string[]) { | CODE |
| LOW | web/e2e/promotions-review.spec.ts | 241 | function expectPromotionRequestsSatisfied() { | CODE |
| LOW | web/e2e/helpers/test-data-builder.ts | 85 | async function runCleanupTaskWithTimeout(task: CleanupTask): Promise<void> { | CODE |
| LOW | web/e2e/helpers/test-data-builder.ts | 126 | function buildSkillPackageZipBuffer(suffix: string, options?: SeedSkillOptions): Buffer { | CODE |
| LOW | web/e2e/helpers/test-data-builder.ts | 148 | function createSkillPackageZipFile(suffix: string, options?: SeedSkillOptions): { filePath: string; cleanup: () => void | CODE |
| LOW | web/e2e/helpers/session.ts | 128 | async function restoreCachedSessionForAccount(page: Page, username: string): Promise<SessionSnapshot | null> { | CODE |
| LOW | web/e2e/helpers/review-seed.ts | 26 | export async function createNamespaceReviewData( | CODE |
| LOW | web/e2e/helpers/search-seed.ts | 57 | async function openProvidedPublisherSession(browser: Browser, testInfo: TestInfo): Promise<PublisherSession> { | CODE |
| LOW | web/e2e/helpers/search-seed.ts | 73 | async function openAdhocPublisherSession(browser: Browser, testInfo: TestInfo): Promise<PublisherSession> { | CODE |
| LOW | web/src/bootstrap.ts | 19 | function ensureRuntimeConfigFallback() { | CODE |
| LOW | web/src/app/layout-main-content.ts | 12 | export function resolveAppMainContentPathname( | CODE |
| LOW | web/src/app/router.tsx | 64 | return function RoleProtectedRouteComponent(props: Record<string, unknown>) { | CODE |
| LOW | web/src/features/skill/skill-delete-flow.ts | 4 | export function isDeleteSlugConfirmationValid(expectedSlug: string, typedSlug: string) { | CODE |
| LOW | web/src/features/skill/skill-delete-flow.ts | 8 | export function resolveDeletedSkillReturnTo(returnTo?: string) { | CODE |
| LOW | web/src/features/skill/install-command.tsx | 37 | export function buildSkillhubInstallCommand(namespace: string, slug: string, baseUrl: string): string { | CODE |
| LOW | web/src/features/skill/code-language.ts | 28 | export function inferMarkdownCodeLanguage(value: string): string | undefined { | CODE |
| LOW | web/src/features/skill/skill-action-error.ts | 1 | export function resolveSkillActionErrorTitle(action: 'download' | 'report') { | CODE |
| LOW | web/src/features/skill/overview-collapse.ts | 5 | export function getOverviewCollapseMaxHeight(viewportWidth: number, viewportHeight: number) { | CODE |
| LOW | web/src/features/skill/package-relative-link.ts | 84 | export function resolvePackageRelativeLink( | CODE |
| LOW | web/src/features/notification/use-notifications.ts | 84 | export function useDeleteReadNotification(userId?: string | null) { | CODE |
| LOW | web/src/features/notification/notification-bell.tsx | 8 | export function resolveNotificationUserId(user?: { userId?: string } | null) { | CODE |
| LOW | web/src/features/notification/notification-content.ts | 29 | export function resolveNotificationDisplay(item: NotificationItem, language: string): NotificationDisplay { | CODE |
| LOW | web/src/features/notification/notification-target.ts | 3 | export function resolveNotificationTarget(item: NotificationItem): string { | CODE |
| LOW | …/features/notification/use-notification-preferences.ts | 11 | export function useNotificationPreferences() { | CODE |
| LOW | …/features/notification/use-notification-preferences.ts | 22 | export function useUpdateNotificationPreferences() { | CODE |
| LOW | web/src/features/notification/notification-page.ts | 11 | export function shouldShowNotificationPagination(total: number, pageSize: number) { | CODE |
| LOW | web/src/features/notification/use-notification-sse.ts | 12 | export function attachNotificationSseListeners( | CODE |
| LOW | …/features/notification/notification-sse-coordinator.ts | 22 | export function isSharedBrowserSseEnabled() { | CODE |
| LOW | …/features/notification/notification-sse-coordinator.ts | 26 | export function createNotificationSseConnection( | CODE |
| LOW | …features/notification/notification-preference-form.tsx | 39 | export function NotificationPreferenceForm() { | CODE |
| LOW | web/src/features/notification/notification-session.ts | 3 | export function getNotificationQueryKeyScope(userId?: string | null) { | CODE |
| LOW | web/src/features/notification/notification-session.ts | 7 | export function clearSessionScopedQueries(queryClient: QueryClient) { | CODE |
| LOW | web/src/features/admin/use-admin-users.ts | 101 | export function useTriggerUserPasswordReset() { | CODE |
| LOW | web/src/features/admin/use-admin-labels.ts | 45 | export function useUpdateAdminLabelSortOrder() { | CODE |
| LOW | web/src/features/publish/publish-error-utils.ts | 40 | export function isPrecheckConfirmationMessage(message?: string): boolean { | CODE |
| LOW | web/src/features/publish/publish-error-utils.ts | 44 | export function isFrontmatterFailureMessage(message?: string): boolean { | CODE |
| LOW | web/src/features/review/review-skill-detail.ts | 3 | export function getReviewSkillDocumentation(detail: ReviewSkillDetail) { | CODE |
| LOW⚡ | web/src/features/review/review-paths.ts | 9 | export function buildNamespaceReviewsPath(slug: string) { | CODE |
| LOW⚡ | web/src/features/review/review-paths.ts | 13 | export function buildNamespaceReviewDetailPath(slug: string, reviewId: number) { | CODE |
| LOW⚡ | web/src/features/review/review-paths.ts | 17 | export function canAccessGlobalReviewCenter(platformRoles?: readonly string[]) { | CODE |
| LOW⚡ | web/src/features/review/review-paths.ts | 21 | export function canManageNamespaceReviews(role?: NamespaceRole) { | CODE |
| LOW⚡ | web/src/features/review/review-paths.ts | 25 | export function getPreferredNamespaceReviewEntry( | CODE |
| LOW | web/src/features/review/review-error.ts | 1 | export function resolveReviewActionErrorDescription(error: unknown): string | undefined { | CODE |
| LOW | web/src/features/governance/use-governance.ts | 30 | export function useGovernanceNotifications(page = 0, size = GOVERNANCE_PAGE_SIZE) { | CODE |
| LOW | web/src/features/governance/use-governance.ts | 37 | export function useMarkGovernanceNotificationRead() { | CODE |
| LOW | web/src/features/security-audit/display-state.ts | 3 | export function getSecurityAuditDisplayState( | CODE |
| LOW | web/src/shared/hooks/skill-query-helpers.ts | 38 | export function shouldEnableNamespaceMemberCandidates(slug: string, search: string, enabled = true) { | CODE |
| LOW | web/src/shared/hooks/use-namespace-queries.ts | 23 | async function searchNamespaceMemberCandidates(params: { slug: string; search: string }): Promise<NamespaceCandidateUser | CODE |
| LOW | web/src/shared/hooks/use-namespace-queries.ts | 31 | async function updateNamespaceMemberRole(params: { slug: string; userId: string; role: NamespaceRole }): Promise<Namespa | CODE |
| LOW | web/src/shared/hooks/use-namespace-queries.ts | 47 | function invalidateNamespaceQueries(queryClient: ReturnType<typeof useQueryClient>, slug: string) { | CODE |
| LOW | web/src/shared/hooks/use-namespace-queries.ts | 90 | export function useNamespaceMemberCandidates(slug: string, search: string, enabled = true) { | CODE |
| LOW | web/src/shared/hooks/use-namespace-queries.ts | 111 | export function useBatchAddNamespaceMembers() { | CODE |
| LOW | web/src/shared/hooks/use-namespace-queries.ts | 122 | export function useUpdateNamespaceMemberRole() { | CODE |
| LOW | web/src/shared/hooks/use-namespace-queries.ts | 205 | export function useTransferNamespaceOwnership() { | CODE |
| LOW | web/src/shared/hooks/query-keys.ts | 19 | export function getAdminLabelDefinitionsQueryKey() { | CODE |
| LOW | web/src/shared/hooks/label-query.ts | 3 | export function shouldFallbackVisibleLabelsError(error: unknown) { | CODE |
| LOW | web/src/shared/hooks/use-label-queries.ts | 50 | function invalidateSkillLabelQueries(queryClient: ReturnType<typeof useQueryClient>, namespace: string, slug: string) { | CODE |
| LOW | web/src/shared/lib/namespace-member-cache.ts | 27 | export function replaceNamespaceMemberRole( | CODE |
| 39 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli/RELEASE.md | 51 | ### Step 1: Run the publish script | COMMENT |
| LOW | cli/RELEASE.md | 71 | ### Step 2: Merge the PR | COMMENT |
| LOW | cli/RELEASE.md | 75 | ### Step 3: Tag and push | COMMENT |
| LOW | builtin-skills/skills/storytelling-advisor/SKILL.md | 105 | ### Step 1: Clarify the Goal | COMMENT |
| LOW | builtin-skills/skills/storytelling-advisor/SKILL.md | 109 | ### Step 2: Harvest the Raw Material | COMMENT |
| LOW | builtin-skills/skills/storytelling-advisor/SKILL.md | 120 | ### Step 3: Select the Framework | COMMENT |
| LOW⚡ | builtin-skills/skills/storytelling-advisor/SKILL.md | 131 | ### Step 4: Map Content to Structure | COMMENT |
| LOW⚡ | builtin-skills/skills/storytelling-advisor/SKILL.md | 134 | ### Step 5: Add Narrative Devices | COMMENT |
| LOW⚡ | builtin-skills/skills/storytelling-advisor/SKILL.md | 140 | ### Step 6: Refine and Cut | COMMENT |
| LOW⚡ | builtin-skills/skills/storytelling-advisor/SKILL.md | 145 | ### Step 7: End with a Punch | COMMENT |
| LOW | builtin-skills/skills/decision-matrix/SKILL.md | 132 | ### Step 1: Define the Decision Clearly | COMMENT |
| LOW | builtin-skills/skills/decision-matrix/SKILL.md | 139 | ### Step 2: Identify the Decision Type | COMMENT |
| LOW⚡ | builtin-skills/skills/decision-matrix/SKILL.md | 150 | ### Step 3: Collect the Data | COMMENT |
| LOW⚡ | builtin-skills/skills/decision-matrix/SKILL.md | 160 | ### Step 4: Apply the Framework | COMMENT |
| LOW⚡ | builtin-skills/skills/decision-matrix/SKILL.md | 164 | ### Step 5: Check for Bias | COMMENT |
| LOW⚡ | builtin-skills/skills/decision-matrix/SKILL.md | 173 | ### Step 6: Decide and Commit | COMMENT |
| LOW⚡ | builtin-skills/skills/decision-matrix/SKILL.md | 180 | ### Step 7: Review the Outcome | COMMENT |
| LOW⚡ | builtin-skills/skills/daily-standup-journal/SKILL.md | 134 | ### Step 1: Identify the Session Type | COMMENT |
| LOW⚡ | builtin-skills/skills/daily-standup-journal/SKILL.md | 140 | ### Step 2: Generate the Prompts | COMMENT |
| LOW⚡ | builtin-skills/skills/daily-standup-journal/SKILL.md | 147 | ### Step 3: Process the Responses | COMMENT |
| LOW⚡ | builtin-skills/skills/daily-standup-journal/SKILL.md | 157 | ### Step 4: Offer Optional Export | COMMENT |
| LOW⚡ | builtin-skills/skills/daily-standup-journal/SKILL.md | 161 | ### Step 5: Surface Action Items | COMMENT |
| LOW | builtin-skills/skills/meeting-note-summarizer/SKILL.md | 113 | ### Step 1: Receive Input | COMMENT |
| LOW | builtin-skills/skills/meeting-note-summarizer/SKILL.md | 122 | ### Step 2: Classify Meeting Type | COMMENT |
| LOW | builtin-skills/skills/meeting-note-summarizer/SKILL.md | 134 | ### Step 3: Extract Core Categories | COMMENT |
| LOW⚡ | builtin-skills/skills/meeting-note-summarizer/SKILL.md | 146 | ### Step 4: Structure the Summary | COMMENT |
| LOW⚡ | builtin-skills/skills/meeting-note-summarizer/SKILL.md | 153 | ### Step 5: Flag Missed Items | COMMENT |
| LOW⚡ | builtin-skills/skills/meeting-note-summarizer/SKILL.md | 161 | ### Step 6: Provide a TL;DR | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/src/i18n/locales/zh.json | 175 | "placeholder": "搜索技能...", | CODE |
| LOW | web/src/i18n/locales/zh.json | 199 | "placeholder": "搜索技能...", | CODE |
| LOW | web/src/i18n/locales/en.json | 175 | "placeholder": "Search skills...", | CODE |
| LOW | web/src/i18n/locales/en.json | 199 | "placeholder": "Search skills...", | CODE |
| LOW | web/src/pages/settings/profile.test.ts | 34 | useAuth: () => ({ user: { displayName: 'Test', avatarUrl: null, email: 'test@test.com' } }), | CODE |
| LOW⚡ | …lytek/skillhub/auth/oauth/OAuth2LoginHandlersTest.java | 39 | "user-1", "User", "user@example.com", null, "github", Set.of() | CODE |
| LOW⚡ | …lytek/skillhub/auth/oauth/OAuth2LoginHandlersTest.java | 89 | "user-1", "User", "user@example.com", null, "github", Set.of() | CODE |
| LOW | …tek/skillhub/auth/oauth/CustomOidcUserServiceTest.java | 41 | "email", "user@example.com", | CODE |
| LOW | …tek/skillhub/auth/oauth/CustomOidcUserServiceTest.java | 50 | "user@example.com", | CODE |
| LOW | …tek/skillhub/auth/oauth/CustomOidcUserServiceTest.java | 65 | assertThat(claims.email()).isEqualTo("user@example.com"); | CODE |
| LOW | …ub/repository/JpaProfileReviewQueryRepositoryTest.java | 47 | UserAccount submitter = new UserAccount("user-1", "NewestName", "user@example.com", null); | CODE |
| LOW | …ub/repository/JpaProfileReviewQueryRepositoryTest.java | 48 | UserAccount reviewer = new UserAccount("admin-1", "Admin Reviewer", "admin@example.com", null); | CODE |
| LOW | …skillhub/controller/UserProfileControllerUnitTest.java | 80 | "user@example.com", | CODE |
| LOW | …skillhub/controller/UserProfileControllerUnitTest.java | 85 | UserAccount user = new UserAccount("user-1", "ApprovedName", "user@example.com", "https://example.com/avatar.png | CODE |
| LOW | …skillhub/controller/UserProfileControllerUnitTest.java | 115 | "user@example.com", | CODE |
| LOW | …skillhub/controller/UserProfileControllerUnitTest.java | 120 | UserAccount user = new UserAccount("user-1", "ApprovedName", "user@example.com", "https://example.com/avatar.png | CODE |
| LOW | …tek/skillhub/controller/UserProfileControllerTest.java | 90 | "user-1", "OldName", "user@example.com", | CODE |
| LOW | …tek/skillhub/controller/UserProfileControllerTest.java | 122 | var user = new UserAccount("user-1", "OldName", "user@example.com", "https://example.com/avatar.png"); | CODE |
| LOW | …tek/skillhub/controller/UserProfileControllerTest.java | 141 | var user = new UserAccount("user-1", "OldName", "user@example.com", "https://example.com/avatar.png"); | CODE |
| LOW | …tek/skillhub/controller/UserProfileControllerTest.java | 204 | var user = new UserAccount("user-1", "OldName", "user@example.com", "https://example.com/avatar.png"); | CODE |
| LOW | …tek/skillhub/controller/UserProfileControllerTest.java | 221 | var user = new UserAccount("user-1", "CurrentName", "user@example.com", "https://example.com/avatar.png"); | CODE |
| LOW | …tek/skillhub/controller/UserProfileControllerTest.java | 234 | .andExpect(jsonPath("$.data.email").value("user@example.com")) | CODE |
| LOW | …tek/skillhub/controller/UserProfileControllerTest.java | 241 | var user = new UserAccount("user-1", "CurrentName", "user@example.com", "https://example.com/avatar.png"); | CODE |
| LOW⚡ | …skillhub/controller/NamespaceWorkflowContractTest.java | 78 | UserAccount adminUser = new UserAccount("user-admin", "Admin", "admin@example.com", null); | CODE |
| LOW⚡ | …skillhub/controller/NamespaceWorkflowContractTest.java | 85 | new UserAccount("user-admin", "Admin", "admin@example.com", null) | CODE |
| LOW⚡ | …skillhub/controller/NamespaceWorkflowContractTest.java | 95 | .willReturn(List.of(new NamespaceCandidateUserResponse("user-admin", "Admin", "admin@example.com", "ACTI | CODE |
| LOW | …skillhub/controller/NamespaceWorkflowContractTest.java | 133 | .andExpect(jsonPath("$.data.email").value("admin@example.com")); | CODE |
| LOW | …skillhub/controller/NamespaceWorkflowContractTest.java | 142 | .andExpect(jsonPath("$.data.items[0].email").value("admin@example.com")); | CODE |
| LOW | …b/controller/admin/AdminSkillReportControllerTest.java | 145 | "admin", "admin", "admin@example.com", "", "github", Set.of("SKILL_ADMIN") | CODE |
| LOW | …b/controller/admin/AdminSkillReportControllerTest.java | 154 | "super-admin", "super-admin", "admin@example.com", "", "github", Set.of("SUPER_ADMIN") | CODE |
| LOW | …controller/admin/AdminProfileReviewControllerTest.java | 62 | var principal = new PlatformPrincipal("admin-1", "Admin", "admin@example.com", "", "github", Set.of("USER_ADMIN" | CODE |
| LOW | …controller/admin/AdminProfileReviewControllerTest.java | 72 | var principal = new PlatformPrincipal("user-1", "User", "user@example.com", "", "github", Set.of("USER")); | CODE |
| LOW | …hub/controller/admin/UserManagementControllerTest.java | 69 | "user-42", "admin", "admin@example.com", "", "github", Set.of("USER_ADMIN") | CODE |
| LOW | …hub/controller/admin/UserManagementControllerTest.java | 134 | "user-42", "admin", "admin@example.com", "", "github", Set.of("USER_ADMIN") | CODE |
| LOW | …hub/controller/admin/UserManagementControllerTest.java | 160 | "user-42", "admin", "admin@example.com", "", "github", Set.of("USER_ADMIN") | CODE |
| LOW | …hub/controller/admin/UserManagementControllerTest.java | 185 | "user-42", "admin", "admin@example.com", "", "github", Set.of("USER_ADMIN") | CODE |
| LOW | …hub/controller/admin/UserManagementControllerTest.java | 208 | "user-42", "admin", "admin@example.com", "", "github", Set.of("USER_ADMIN") | CODE |
| LOW | …hub/controller/admin/UserManagementControllerTest.java | 231 | "user-42", "admin", "admin@example.com", "", "github", Set.of("USER_ADMIN") | CODE |
| LOW | …hub/controller/admin/UserManagementControllerTest.java | 254 | "user-42", "admin", "admin@example.com", "", "github", Set.of("USER_ADMIN") | CODE |
| LOW | …om/iflytek/skillhub/service/AuthMethodCatalogTest.java | 25 | oauthProperties.getRegistration().put("placeholder", registration("PLACEHOLDER", "Placeholder")); | CODE |
| LOW | …skillhub/service/AdminProfileReviewAppServiceTest.java | 57 | UserAccount submitter = new UserAccount("user-1", "NewestName", "user@example.com", null); | CODE |
| LOW | …skillhub/service/AdminProfileReviewAppServiceTest.java | 58 | UserAccount reviewer = new UserAccount("admin-1", "Admin Reviewer", "admin@example.com", null); | CODE |
| LOW | …flytek/skillhub/service/SkillDeleteAppServiceTest.java | 154 | new PlatformPrincipal("user-2", "User", "user@example.com", "", "session", java.util.Set.of("USER")), | CODE |
| LOW | …flytek/skillhub/service/SkillDeleteAppServiceTest.java | 236 | new PlatformPrincipal("user-2", "User", "user@example.com", "", "session", java.util.Set.of("USER")), | CODE |
| LOW | …va/com/iflytek/skillhub/service/AuthMethodCatalog.java | 67 | return !clientId.toLowerCase(Locale.ROOT).contains("placeholder"); | CODE |
| LOW | …hub/domain/skill/metadata/SkillMetadataParserTest.java | 57 | assertEquals("John Doe", metadata.frontmatter().get("author")); | STRING |
| LOW | …lytek/skillhub/domain/user/UserProfileServiceTest.java | 70 | return new UserAccount("user-1", "OldName", "user@example.com", "https://example.com/avatar.png"); | CODE |
| LOW | …/search/postgres/PostgresSearchRebuildServiceTest.java | 59 | "author": "Jane Doe", | CODE |
| LOW | …/search/postgres/PostgresSearchRebuildServiceTest.java | 95 | assertThat(document.searchText()).contains("Jane Doe"); | STRING |
| LOW | …/search/postgres/PostgresSearchRebuildServiceTest.java | 240 | "author": "Jane Doe" | CODE |
| LOW | docs/openclaw-integration.md | 284 | "displayName": "John Doe" | CODE |
| LOW | docs/openclaw-integration-en.md | 284 | "displayName": "John Doe" | CODE |
| LOW | .github/scripts/issue-triage-config.ts | 170 | "placeholder", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | AGENTS.md | 43 | │ │ ├── service/ # App services (workflow orchestration) | CODE |
| MEDIUM | AGENTS.md | 181 | ├── Makefile # Top-level build/test/dev orchestration | CODE |
| MEDIUM | docs/17-backend-annotation-findings.md | 56 | ## 2. Several controllers still perform orchestration that belongs in application services | COMMENT |
| MEDIUM | docs/18-frontend-annotation-findings.md | 39 | ## 3. Some pages still do too much orchestration instead of delegating to feature-level containers | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …ain/skill/validation/BasicPrePublishValidatorTest.java | 85 | token=YOUR_TOKEN_HERE | STRING |
| HIGH | scanner/docs/configuration.md | 338 | SKILLHUB_SCANNER_AI_DEFENSE_API_KEY: "your-api-key-here" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/build-builtin-skills.py | 4 | CODE | |
| LOW | scanner/backports/apply_1_0_2_llm_base_url_backport.py | 4 | CODE | |
| LOW | weekly/scripts/validate_site.py | 4 | CODE | |
| LOW | weekly/scripts/build_site.py | 4 | CODE | |
| LOW | weekly/scripts/sync_report_theme.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/k8s/base/configmap.yaml | 1 | apiVersion: v1 | COMMENT |
| LOW | …superpowers/plans/2026-03-11-phase1-foundation-auth.md | 4401 | # 2. 安装前端依赖 | COMMENT |
| LOW | …specs/2026-03-12-phase2-namespace-skill-core-design.md | 721 | SearchResult search(SearchQuery query) { | COMMENT |
| LOW | cli/test/unit/commands/update-command.test.ts | 1 | import { describe, expect, test } from 'bun:test' | COMMENT |