diff --git a/.claude/skills/loop-design-scan/SKILL.md b/.claude/skills/loop-design-scan/SKILL.md
new file mode 100644
index 00000000..0e4d8dab
--- /dev/null
+++ b/.claude/skills/loop-design-scan/SKILL.md
@@ -0,0 +1,50 @@
+---
+name: loop-design-scan
+description: Local loop that scans a given area of the Accounted UI against the locked design system (.claude/rules/design.md) for UX friction, visual inconsistency, missing states, motion gaps, and accessibility issues — rendering pages in Chrome — then files GitHub issues for approved findings. Run locally (needs npm run dev + Chrome). Usage: /loop-design-scan (e.g. bookkeeping, invoices, settings).
+---
+
+# loop-design-scan
+
+**Goal:** for one area of the app, surface concrete, design-system-grounded UI/UX improvements and file
+them as GitHub issues (deduped). This is the GitHub-Issues sibling of the `scout-design` skill (which
+targets Linear). Read `dev_docs/loops.md` first. **Runs locally** — it needs to render the UI.
+
+## Why local
+A headless cloud session can't see the UI. This loop starts `npm run dev` and drives Chrome to render
+and screenshot real pages, then judges them against the design rules. Run on-demand or `/loop 6h /loop-design-scan `.
+
+## 1. Set up
+- `npm run dev` (starts on :3000). Load the **design contract**: `.claude/rules/design.md`
+ (editorial monochrome, locked tokens, primitives, spacing scale, a11y bar).
+- Map the area to its route(s), e.g. `bookkeeping` → `app/(dashboard)/bookkeeping/*`.
+
+## 2. Render & inspect each page (Chrome MCP)
+For each page in the area: navigate, screenshot, and check the **console for zero new errors/warnings**.
+Exercise key states where possible: loading, empty, populated, error.
+
+## 3. Evaluate against the design system (what "good" means here)
+Flag concrete deviations, each tied to `file:line` and a rule:
+- **Tokens/spacing**: forbidden spacing (`p-5`, `2.5`, hardcoded px), non-token colors for status
+ (`bg-blue-100`, `bg-emerald-500/10` instead of ``).
+- **Primitives not used**: hand-rolled empty state / skeleton / page header / table instead of the
+ components in `.claude/rules/design.md` (`EmptyState`, `Skeleton`, `PageHeader`, `Table`).
+- **Missing states**: no loading skeleton, no empty state, no error handling on a data view.
+- **Typography**: `font-medium` on Hedvig display text; missing `tabular-nums` on financial numbers.
+- **Motion**: press-scale / hover-lift / spring overshoot (all forbidden); missing `transition-colors`.
+- **A11y**: contrast < AA, icon-only button without `aria-label`, no visible focus ring, touch target < 40px.
+- **UX friction**: unclear labels, redundant `PageHeader.description`, slow paths for the 90-second session.
+
+## 4. Adversarial verification (kill false positives)
+Prefer the **`.claude/workflows/design-scan.js`** workflow: it fans out one agent per page, then runs a
+skeptic agent per finding ("is this a real regression against the locked design system, or a nitpick?").
+Only findings that survive get filed. Cap **6 findings/run**; log the rest.
+
+## 5. File issues (deduped — see loops.md)
+```
+Title: [design] :
+Labels: loop:auto, loop:design, enhancement
+Body: what's wrong (with file:line) · which design rule it breaks · concrete before→after · screenshot ref
+
+```
+Dedupe against existing `loop:design` issues before filing. Do not auto-fix UI here — design changes
+want human taste; file the ticket. (If asked to fix, use `/frontend-design` on an approved ticket.)
diff --git a/.claude/skills/loop-issue-triage/SKILL.md b/.claude/skills/loop-issue-triage/SKILL.md
new file mode 100644
index 00000000..294c75ab
--- /dev/null
+++ b/.claude/skills/loop-issue-triage/SKILL.md
@@ -0,0 +1,42 @@
+---
+name: loop-issue-triage
+description: Proactive loop that keeps GitHub Issues in erp-mafia/accounted tidy (label, dedupe, close stale/already-fixed, reconcile with merged PRs) and auto-implements small, well-scoped fixes as PRs. Use on a schedule (cloud routine) or on-demand via /loop-issue-triage. Follows dev_docs/loops.md (propose-don't-merge).
+---
+
+# loop-issue-triage
+
+**Goal:** the open-issue list is accurately labeled and free of stale/duplicate/already-fixed items,
+and a couple of small fixes ship as PRs each run. **Never merge.** Read `dev_docs/loops.md` first.
+
+## Preflight
+`gh auth status`, repo `erp-mafia/accounted`. If it fails, stop and report "environment not provisioned".
+
+## 1. Triage every open issue
+```bash
+gh issue list --state open --limit 100 --json number,title,labels,createdAt,updatedAt,comments
+```
+For each issue lacking a type label:
+- **Classify** → apply one of `bug` / `enhancement` / `question` / `documentation`.
+- **Dedupe** → search for near-duplicates (`gh issue list --search " in:title,body state:all"`).
+ If a duplicate, label `duplicate`, comment linking the canonical issue, and close the newer one.
+- **Stale** → no activity > 30 days AND not actionable: comment asking if still relevant; don't close
+ unilaterally unless clearly obsolete.
+
+## 2. Reconcile with completed work (the "are tickets up to date?" job)
+- For each open issue, check whether a **merged** PR or recent commit already resolved it:
+ `gh pr list --state merged --search "<#num or keywords>"`, `git log --oneline -S""`.
+- If resolved: comment with the PR/commit link, verify the fix exists in `main`, then close.
+- Conversely, if a merged PR said `Closes #N` but #N is still open, close it with a pointer.
+
+## 3. Auto-fix small issues (propose-don't-merge) — cap 2 PRs/run
+Pick issues that are **small, localized, and low-risk** (a clear bug in one file, a copy/label fix, a
+missing empty/loading state, a validation gap). **Never** auto-fix anything touching the bookkeeping
+engine, money math, migrations/triggers, auth, or compliance logic — those get `loop:needs-human`.
+- Branch `loop/issue-`, minimal fix, run the **[`loop-verify`](../loop-verify/SKILL.md)** gate.
+- Open PR with body `Closes #` + a one-line summary. Label `loop:auto`, `loop:triage`.
+- If the fix turns out larger/riskier than expected mid-way, abandon the branch and instead add a
+ scoping comment on the issue + `loop:needs-human`.
+
+## 4. Anti-thrash & report
+Don't re-triage issues already labeled this run. Summarize: labeled N, deduped N, closed N (with why),
+fix PRs opened, escalated N. That summary is the completion notification.
diff --git a/.claude/skills/loop-pr-ci-triage/SKILL.md b/.claude/skills/loop-pr-ci-triage/SKILL.md
new file mode 100644
index 00000000..9625a0f1
--- /dev/null
+++ b/.claude/skills/loop-pr-ci-triage/SKILL.md
@@ -0,0 +1,56 @@
+---
+name: loop-pr-ci-triage
+description: Proactive loop that watches open PRs in erp-mafia/accounted, fixes failing CI, and addresses actionable review-bot / reviewer comments — on the PR branch, never merging. Use on a schedule (cloud routine) or on-demand via /loop-pr-ci-triage. Follows dev_docs/loops.md (propose-don't-merge, dedupe, loop-verify gate).
+---
+
+# loop-pr-ci-triage
+
+**Goal:** every open, non-draft PR authored by our team or dependabot is either green + review-addressed,
+or explicitly escalated with `loop:needs-human`. **Never merge.** Read `dev_docs/loops.md` first.
+
+## Preflight
+- `gh auth status` and confirm repo `erp-mafia/accounted`. If either fails, stop and report "environment not provisioned".
+- Respect [foreign WIP](../../../CLAUDE.md): never touch a branch with another human's uncommitted/active work; never force-push over someone's commits.
+
+## 1. Enumerate & prioritize
+```bash
+gh pr list --state open --json number,title,isDraft,headRefName,author,reviewDecision,statusCheckRollup,updatedAt
+```
+Skip: drafts; PRs by `contributor:flagged`/`pr:flagged` authors; PRs already labeled `loop:needs-human`.
+Prioritize (cap **5 PRs/run**, log the rest):
+1. Failing CI that's a mechanical fix (lint, type error, snapshot, a flaky/needs-rerun check).
+2. Dependabot bumps failing `core-only` / `pg-real` (there is a live backlog — #730, #639, #638, #637).
+3. Unresolved actionable review comments (from "The PR Agent", Superagent, or a human).
+
+## 2. Diagnose each PR
+- Failing checks: read the failing job. `gh pr checks `; open the failing run's log
+ (`gh run view --log-failed`). Identify the *specific* failing command from `core-build.yml` /
+ `test-pg-real.yml` (e.g. `check:lint`, `npm test`, `test:pg`, the extension-import grep).
+- Review comments: `gh pr view --comments`. Separate *actionable* (a concrete bug/change) from
+ informational. Follow the [bot-triage rule](../../../CLAUDE.md): honest triage beats chasing every finding.
+
+## 3. Fix (propose-don't-merge)
+- `gh pr checkout ` (or for dependabot, check out its branch). Reproduce the failure locally by
+ running the exact failing command. Make the **minimal** fix.
+- Run the **[`loop-verify`](../loop-verify/SKILL.md)** gate. If it can't pass safely → step 5.
+- `git push` to the PR's own branch. Leave a concise comment on the PR: what was failing, what you
+ changed, verify output. Do **not** `gh pr merge`.
+
+## 4. Dependabot specifics
+If a bump breaks the build/tests, the fix is usually a small code adaptation to the new API or a
+peer-dep pin. If the bump is a **major** version with wide breakage, don't force it — comment with the
+breaking changes found and label `loop:needs-human` instead of a risky rewrite.
+
+## 5. Escalate / anti-thrash
+If you already attempted the same fix on this PR (same failure signature) and it failed again, or the
+fix is unsafe/large: **stop**, add label `loop:needs-human`, comment what you tried and why you stopped.
+Never retry the same failing push in a cycle.
+
+## 6. Report
+Summarize per PR: fixed & pushed / commented / escalated / skipped (with reason). This summary is the
+routine's completion notification.
+
+## Batch mode (optional)
+For many PRs at once, drive this with a dynamic **workflow**: one agent per PR in its own worktree
+(`isolation: 'worktree'`) so parallel fixes don't collide, then an adversarial reviewer per fix before
+it's pushed. Keep the 5-PR cap unless told otherwise.
diff --git a/.claude/skills/loop-vercel-errors/SKILL.md b/.claude/skills/loop-vercel-errors/SKILL.md
new file mode 100644
index 00000000..32fcbe8f
--- /dev/null
+++ b/.claude/skills/loop-vercel-errors/SKILL.md
@@ -0,0 +1,56 @@
+---
+name: loop-vercel-errors
+description: Proactive loop that pulls recent production runtime errors from Vercel (and Sentry if configured), groups + dedupes them, files well-formed GitHub issues, and opens a fix PR only for clearly trivial/safe cases. Use on a schedule (cloud routine) or on-demand via /loop-vercel-errors. Follows dev_docs/loops.md.
+---
+
+# loop-vercel-errors
+
+**Goal:** every distinct, real production runtime error is tracked as a GitHub issue (deduped), and the
+obviously-trivial ones have a proposed fix PR. **Never merge.** Read `dev_docs/loops.md` first.
+
+Project: Vercel `erp-base` (`prj_zOvCFaOMXS166cUY5VYEGHKke00X`, team `team_WPj3QZgcSVRWZKcHJQB3wfv8`).
+
+## 1. Fetch errors (try sources in order; report which worked)
+1. **Vercel MCP** (`mcp__plugin_vercel_vercel__*`) — authenticate if needed, then pull recent runtime
+ logs / observability for the production deployment. Prefer this.
+2. **Vercel CLI** fallback: `vercel logs --json` (tails a window) or
+ `vercel inspect`. The CLI here is old (v48) — if it errors, note it and move on.
+3. **Sentry** (the app ships `@sentry/*`; `SENTRY_DSN` may be set) — if a Sentry token is available,
+ its issue stream is richer than Vercel logs. Use it if present.
+
+If **no** source is reachable in this environment, stop and report that clearly (do not invent errors).
+
+## 2. Group into distinct errors
+Cluster raw log lines by **signature**: normalized message + top of stack + route. Drop noise
+(expected 4xx, aborted requests, health checks). For each cluster capture: signature, first/last seen,
+count, sample stack, affected route/file.
+
+## 3. Dedupe (mandatory — see loops.md)
+Fingerprint = hash of the normalized signature.
+```bash
+gh issue list --search " in:body state:all" --json number,state
+```
+- Match open → add a comment ("still occurring, N times since "). Do not file a duplicate.
+- Match closed but recurring → reopen with a note.
+- No match → file new (below). **Cap 8 new issues/run**; log the rest.
+
+## 4. File the issue
+```
+Title: [prod error] ()
+Labels: loop:auto, loop:vercel, bug
+Body:
+ **Signature:** … **Count / window:** … **First/last seen:** …
+ **Route/file:** app/…:line **Sample stack:** (fenced)
+ **Likely cause:** <1–2 lines of hypothesis from the code>
+
+```
+Point at the suspected `file:line` by reading the code the stack references.
+
+## 5. Trivial fix only (propose-don't-merge) — cap 2 PRs/run
+Open a `loop/vercel-` fix PR **only** when the cause is unambiguous and low-risk (e.g. a missing
+null guard, an unhandled `undefined`, a bad `.env` read with an obvious default, a narrow type fix).
+Anything touching bookkeeping/money/migrations/auth → issue only, label `loop:needs-human`.
+Every fix must pass the **[`loop-verify`](../loop-verify/SKILL.md)** gate. PR body: `Closes #`.
+
+## 6. Report
+List: new issues filed, existing issues updated, fix PRs opened, sources used, anything skipped.
diff --git a/.claude/skills/loop-verify/SKILL.md b/.claude/skills/loop-verify/SKILL.md
new file mode 100644
index 00000000..581155cd
--- /dev/null
+++ b/.claude/skills/loop-verify/SKILL.md
@@ -0,0 +1,68 @@
+---
+name: loop-verify
+description: The self-verification gate every automated code change must pass before a loop opens a PR. Encodes Accounted's real CI commands (check:lint, vitest, pg-real, check:guards, no-extension-imports) plus the accounting guard rails and i18n sync. Invoke from any loop-* skill after making a fix and before pushing.
+---
+
+# loop-verify — verification gate for automated changes
+
+Never report a change as done, and never open a PR, based on "the edit applied" alone. Verify it
+the way our CI would. If any step fails, fix and rerun from the top — do not push partially
+verified work.
+
+## 0. Guard rails first (hard stops — no fix is worth breaking these)
+Read [Accounting Guard Rails](../../../CLAUDE.md#accounting-guard-rails). A change is **rejected outright** if it:
+- edits or deletes a `posted` journal entry (use `reverseEntry`/`correctEntry` — storno, never edit),
+- makes an entry that doesn't balance, or sets a voucher number manually,
+- writes to a locked/closed period, or deletes a retained document,
+- uses `toFixed()` for money (must be `Math.round(x * 100) / 100`), or treats account numbers as numbers (they are strings: `'1930'`).
+- touches a trigger/RPC/RLS/DEFERRABLE object without a `*.pg.test.ts` (see step 3).
+
+## 1. Scope the blast radius
+List changed files (`git diff --name-only`). Decide which checks below are required:
+- always: lint + guards on touched code.
+- touched `lib/**` or `app/api/**` → run the matching `__tests__` with vitest.
+- touched `supabase/migrations/**` (trigger/RPC/RLS/DEFERRABLE) → **pg-real is mandatory**.
+- touched types / config / a shared primitive → run the build.
+- touched a user-facing string → i18n sync (step 5).
+
+## 2. Lint + guards (fast, always)
+```bash
+npm run check:lint # fails on NEW eslint errors (legacy errors are grandfathered)
+npm run check:guards # scripts/checks/no-new-antipatterns.mjs
+```
+Core must not import extensions (CI enforces this):
+```bash
+grep -r "from '@/extensions/" lib/ app/api/ components/ --include="*.ts" --include="*.tsx" \
+ | grep -v "app/api/extensions/" | grep -v "components/extensions/" \
+ | grep -v "lib/extensions/_generated/" | grep -v "lib/extensions/loader.ts"
+# any output = FAIL
+```
+
+## 3. Tests (targeted)
+Run the tests covering the touched area, not the whole suite (cost):
+```bash
+npx vitest run --project unit # e.g. lib/bookkeeping app/api/invoices
+```
+If a trigger / RPC / RLS / DEFERRABLE constraint or any `supabase/migrations/**` object changed,
+a `*.pg.test.ts` **must** exist/extend and pass:
+```bash
+npm run test:pg # vitest run --project pg-real (real Postgres)
+```
+No pg-real coverage for a DB-behavior change ⇒ do not open the PR; add the test first.
+
+## 4. Build (only when needed)
+If types/config/generated inputs changed, or lint/tests can't prove the change compiles:
+```bash
+npm run build
+```
+If you edited an atom `SKILL.md` run `npm run skills:check`; taxonomy inputs → `npm run taxonomy:check`.
+
+## 5. i18n sync
+For any new/changed user-facing string, update **both** `messages/en.json` and `messages/sv.json`
+(mirror the same keys). See [i18n rule](../../rules/i18n.md) for "stays Swedish" surfaces
+(email/invoices/reports/salary) — those stay Swedish regardless of locale.
+
+## 6. Verdict
+- All required steps green → safe to push the `loop/*` branch and open the PR.
+- Anything red you can't safely fix in-scope → **stop**, label the PR/issue `loop:needs-human`,
+ and comment exactly which step failed and the output. Never merge (`gh pr merge` is forbidden).
diff --git a/.claude/workflows/design-scan.js b/.claude/workflows/design-scan.js
new file mode 100644
index 00000000..4923242f
--- /dev/null
+++ b/.claude/workflows/design-scan.js
@@ -0,0 +1,112 @@
+export const meta = {
+ name: 'design-scan',
+ description: 'Scan an app area against the Accounted design system; adversarially verify findings; report the survivors for the loop-design-scan skill to file as GitHub issues.',
+ phases: [
+ { title: 'Enumerate' },
+ { title: 'Scan' },
+ { title: 'Verify' },
+ { title: 'Synthesize' },
+ ],
+}
+
+// Usage: Workflow({ name: 'design-scan', args: { area: 'bookkeeping' } })
+// Pattern: fan-out (one agent per page) -> adversarial verify (skeptic per finding) -> synthesize.
+// This workflow only PRODUCES verified findings. The loop-design-scan skill dedupes + files the
+// GitHub issues (workflow agents shouldn't take high-privilege outward actions).
+
+const area = (args && args.area) || 'dashboard'
+
+const DESIGN_CONTRACT = `Judge strictly against .claude/rules/design.md (the LOCKED Accounted design system):
+editorial monochrome; spacing tokens only (1,2,3,4,6,8,10,12 — p-5/2.5/hardcoded px are violations);
+status colors via only (no bg-blue-100 / bg-emerald-500/10 as chrome); use the
+primitives PageHeader/Table/EmptyState/Skeleton/InfoTooltip (hand-rolled equivalents are violations);
+Hedvig serif display must NOT be font-medium; financial numbers need tabular-nums; motion is
+transition-colors only (no press-scale/hover-lift/spring); a11y WCAG AA, aria-label on icon buttons,
+visible focus, touch targets >=40px. A "finding" must cite file:line and the exact rule it breaks.`
+
+const FINDINGS_SCHEMA = {
+ type: 'object',
+ additionalProperties: false,
+ required: ['findings'],
+ properties: {
+ findings: {
+ type: 'array',
+ items: {
+ type: 'object',
+ additionalProperties: false,
+ required: ['title', 'file', 'rule', 'problem', 'fix', 'severity'],
+ properties: {
+ title: { type: 'string' },
+ file: { type: 'string', description: 'path:line' },
+ rule: { type: 'string', description: 'which design.md rule it breaks' },
+ problem: { type: 'string' },
+ fix: { type: 'string', description: 'concrete before -> after' },
+ severity: { type: 'string', enum: ['high', 'medium', 'low'] },
+ },
+ },
+ },
+ },
+}
+
+const VERDICT_SCHEMA = {
+ type: 'object',
+ additionalProperties: false,
+ required: ['isReal', 'reason'],
+ properties: {
+ isReal: { type: 'boolean', description: 'true only if a real regression against the LOCKED system, not a nitpick or a matter of taste' },
+ reason: { type: 'string' },
+ },
+}
+
+// 1. Enumerate the pages/components in the area.
+phase('Enumerate')
+const PAGE_LIST_SCHEMA = {
+ type: 'object', additionalProperties: false, required: ['pages'],
+ properties: { pages: { type: 'array', items: { type: 'string' }, description: 'route or component file paths in this area' } },
+}
+const enumerated = await agent(
+ `List the distinct page/route files and their primary child components for the "${area}" area of this Next.js app ` +
+ `(look under app/(dashboard)/${area} and components/${area} and any obviously related components). ` +
+ `Return concrete file paths a reviewer should open. Keep it to the ~8 most important.`,
+ { label: `enumerate:${area}`, phase: 'Enumerate', schema: PAGE_LIST_SCHEMA }
+)
+const pages = (enumerated?.pages || []).slice(0, 8)
+log(`Scanning ${pages.length} pages/components in "${area}"`)
+
+// 2+3. Pipeline: scan each page, then adversarially verify each finding as soon as that page's scan lands.
+const perPage = await pipeline(
+ pages,
+ (file) => agent(
+ `Review this file for design-system compliance and UX quality: ${file}\n\n${DESIGN_CONTRACT}\n\n` +
+ `Read the file (and imports it renders). Report only concrete, defensible findings with file:line.`,
+ { label: `scan:${file}`, phase: 'Scan', schema: FINDINGS_SCHEMA }
+ ),
+ (scan, file) => parallel((scan?.findings || []).map((f) => () =>
+ agent(
+ `Adversarially verify this design finding. Default to isReal=false unless it is clearly a real ` +
+ `regression against the LOCKED design system (not taste, not a pre-existing site-wide pattern).\n\n` +
+ `${DESIGN_CONTRACT}\n\nFinding: ${JSON.stringify(f)}\nFile: ${file}`,
+ { label: `verify:${f.file}`, phase: 'Verify', schema: VERDICT_SCHEMA }
+ ).then((v) => ({ ...f, verdict: v }))
+ ))
+)
+
+// 4. Synthesize: keep only verified findings, rank by severity, cap at 6.
+phase('Synthesize')
+const sevRank = { high: 0, medium: 1, low: 2 }
+const confirmed = perPage
+ .flat()
+ .filter(Boolean)
+ .filter((f) => f.verdict?.isReal)
+ .sort((a, b) => (sevRank[a.severity] ?? 3) - (sevRank[b.severity] ?? 3))
+
+const kept = confirmed.slice(0, 6)
+const dropped = confirmed.length - kept.length
+if (dropped > 0) log(`Capped: reporting ${kept.length} findings, dropped ${dropped} lower-severity ones (raise the cap to see them).`)
+
+return {
+ area,
+ pagesScanned: pages.length,
+ findings: kept,
+ note: 'Hand these to the loop-design-scan skill to dedupe (loop-fingerprint) and file as GitHub issues labeled loop:auto, loop:design.',
+}
diff --git a/app/(dashboard)/articles/[id]/page.tsx b/app/(dashboard)/articles/[id]/page.tsx
index 9d56907e..328280a3 100644
--- a/app/(dashboard)/articles/[id]/page.tsx
+++ b/app/(dashboard)/articles/[id]/page.tsx
@@ -274,7 +274,7 @@ export default function ArticleDetailPage({
{article.type === 'tjanst' && article.housework_type && (
{consent.companyName && (
@@ -411,19 +412,13 @@ function ProviderStep({
{provider.name}
{comingSoon && (
-
- Kommer snart
-
+ Kommer snart
)}
{alreadyConnected && (
-
- Ansluten
-
+ Ansluten
)}
{needsSieFirst && !comingSoon && !alreadyConnected && (
-
- SIE krävs först
-
+ SIE krävs först
)}
diff --git a/components/import/BankFileConfirmStep.tsx b/components/import/BankFileConfirmStep.tsx
index 221a5f36..622f25ac 100644
--- a/components/import/BankFileConfirmStep.tsx
+++ b/components/import/BankFileConfirmStep.tsx
@@ -3,7 +3,6 @@
import { useState, useEffect } from 'react'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
import { Button } from '@/components/ui/button'
-import { Badge } from '@/components/ui/badge'
import { Label } from '@/components/ui/label'
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
import {
@@ -169,11 +168,9 @@ export default function BankFileConfirmStep({
{/* Additional info */}
{refsCount > 0 && (
-