跳到主要内容

Client Site From Inn

Build a multipage org site from a Russian INN.

Skill metadata​

SourceBundled (installed by default)
Pathskills/creative/client-site-from-inn
Version1.1.0
AuthorVibeOS
LicenseMIT
Platformslinux, macos, windows
Tagsdesign, inn, org, website, dadata, creative, multipage
Related skillsdesign-variant-picker, internet-starter, desktop-local-preview, cinematic-web

Reference: full SKILL.md​

信息

The following is the complete skill definition that VibeOS loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.

Client Site From ИНН Skill

Operator (or client) provides only an ИНН. VibeOS validates it, looks up the organization (DaData findById/party), builds an OrgProfile, confirms a card with the human, then runs design-variant-picker and scaffolds a multipage Next site filled from registry facts.

This skill does not invent phones, reviews, or certificates. Soft marketing copy is allowed only where references/content-honesty.md says so. Secrets (DADATA_API_TOKEN / DADATA_API_KEY) live in .env only.

Plan (MVP freeze): docs/plans/2026-07-24-client-site-from-inn-work-plan.md.

When to Use​

  • User says «сайт по ИНН», /design inn <ИНН>, or pastes a 10/12-digit ИНН and asks for a company site.
  • Extending an existing design-variant-picker run with real org facts.

Prerequisites​

  • Optional: DADATA_API_TOKEN or DADATA_API_KEY in .env for live lookup (listed in OPTIONAL_ENV_VARS; never put tokens in config.yaml).
  • Optional map embed: YANDEX_MAPS_API_KEY in .env, or skills.config.client_site_from_inn.yandex_maps_api_key, or fill_pages_from_org.py --yandex-maps-key …. Without a key, /contacts uses OpenStreetMap (default).
  • Offline / CI: --fixture or VIBEOS_ORG_LOOKUP_FIXTURE=1 + fixtures/org/<inn>.json.
  • Contact enrich is opt-in (--enrich, --website, or skills.config.client_site_from_inn.web_enrich: true). Default off.
  • Related: design-variant-picker for A/B/C previews after OrgProfile → brief.

How to Run​

# One-shot (preferred): OrgProfile + brief (enrich off by default)
vibeos design inn 7707083893 --fixture --force --json
vibeos design inn 7702012345 --fixture --force --variants --json
vibeos design apply-org \
--run-dir skills/creative/client-site-from-inn/fixtures/runs/clinic \
--variant B --project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/scaffold_multipage.py \
--project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/fill_pages_from_org.py \
--project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/write_seo_from_org.py \
--project-dir ./my-landing --domain https://example.com --json
python3 skills/creative/client-site-from-inn/scripts/report_org_gaps.py \
--project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/assert_facts_untouched.py \
--project-dir ./my-landing --json
vibeos design inn 7707083893 --fixture --force --enrich --json
vibeos design inn 7707083893 --json # live DaData when token set

# After Confirm: brief → A/B/C previews (no Next scaffold)
python3 skills/creative/client-site-from-inn/scripts/generate_org_variants.py \
--inn 7702012345 --fixture --force --json

# Validate only
python3 skills/creative/client-site-from-inn/scripts/inn_validate.py 7707083893 --json

# Pieces
python3 skills/creative/client-site-from-inn/scripts/org_lookup.py 7707083893 --fixture --force --profile
python3 skills/creative/client-site-from-inn/scripts/org_to_brief.py 7707083893 --fixture --force
python3 skills/creative/client-site-from-inn/scripts/design_inn.py 7702012345 --fixture --force --json

Quick Reference​

StepArtifact
CLI one-shotvibeos design inn / scripts/design_inn.py
Validatescripts/inn_validate.py
Lookup + cachescripts/org_lookup.py
Normalizescripts/normalize_org.py
Web enrichscripts/org_web_enrich.py (+ fixtures/org/<inn>.enrich.json)
Org → briefscripts/org_to_brief.py
Brief → A/B/C stubsscripts/generate_org_variants.py / --variants
OKVED → industry/tone/familyreferences/okved-tone-map.yaml + .md
Sample ИННreferences/sample-inns.yaml
Operator post-scaffoldreferences/operator-post-scaffold.md
A11y / mobile (Day 21)references/a11y-mobile-checklist.md
Honesty rulesreferences/content-honesty.md
IA + field matrixreferences/ia-multipage.md, field-to-page-matrix.md
OrgProfile schemareferences/org-profile.schema.json
Org taste / diversityreferences/org-taste-checklist.md + fixtures/runs/
Lock + applyscripts/apply_org_design.py / vibeos design apply-org
Multipage scaffoldscripts/scaffold_multipage.py + templates/multipage/
Optional /team /gallery /blogscaffold_multipage.py --extra-pages team,gallery,blog (or all; honesty-gated)
Fill from OrgProfilescripts/fill_pages_from_org.py (hard facts + requisites/privacy; --with-llm soft-copy)
Gaps / honesty lintscripts/report_org_gaps.py, assert_facts_untouched.py
Branch select (Phase 2)scripts/select_org_branches.py (main / all / ids)
NAP check (Phase 2)scripts/nap_check.py
Maps playbookreferences/maps-client-playbook.md
SEO / JSON-LDscripts/write_seo_from_org.py (@graph, domain gate --publish, locations in sitemap; no ratings)
Site pack (Phase 2)scripts/build_site_pack.py + Desktop /design pack
Handoff checklistreferences/client-handoff-checklist.md
Section recipes (Phase 2)references/section-recipes.yaml → direction.md
Token contrast (Phase 2)scripts/assert_token_contrast.py (AA; --force-contrast on apply)
CMS-lite (Phase 2)scripts/overrides_cms_lite.py + content/overrides.yaml
Cinematic opt-inscaffold_multipage.py --cinematic + references/cinematic-bridge.md
Perf / Lighthouse (manual)references/lighthouse-oriented-checklist.md
Dogfood pack (eng)scripts/prepare_dogfood_pack.py / vibeos design dogfood-pack
Edge rehearse (eng)scripts/rehearse_edge_cases.py / vibeos design edge-rehearse
Preview smokescripts/smoke_mvp_routes.py + scripts/ensure_next_project.py
Timeweb (white-label)scripts/prepare_timeweb_deploy.py + docs/ops/client-site-from-inn-timeweb-deploy.md
Ops runbook / dogfooddocs/ops/client-site-from-inn-*.md
MVP freeze / releasedocs/ops/client-site-from-inn-mvp-freeze.md, client-site-from-inn-release-notes.md

Procedure​

  1. Normalize + validate ИНН (inn_validate.py). Stop on failure with RU message.

  2. Lookup / fixture → raw JSON + OrgProfile (org_lookup.py).

  3. Optional enrich (org_web_enrich.py) — merge only above confidence threshold.

  4. Show Confirm card before variants (Day 1 UX) — human must accept OrgProfile.

  5. org_to_brief.py → brief.md / brief.json (includes org_brand, ИНН, ОКВЭД).

  6. After Confirm: generate_org_variants.py (or vibeos design inn … --variants) → run-*/{A,B,C}/preview.html with real brand, direction.md with ИНН+ОКВЭД. Do not run Next scaffold yet (Days 12+).

  7. Lock + apply (Day 11): apply_org_design.py / vibeos design apply-org --run-dir <org-run> --variant A|B|C --project-dir <path> → DESIGN.md, design/tokens.css, org-profile.json, and (if globals.css exists) idempotent token @import. Cache-safe: skill CLI only — do not mutate system prompt or toolsets mid-session (Desktop Confirm→apply UX may defer to the next session).

  8. Multipage scaffold (Day 12): scaffold_multipage.py --project-dir <path> → app/(site)/{layout,nav,pages…} with skip-link + mobile nav.

  9. Fill hard facts (Days 13–14): fill_pages_from_org.py --project-dir <path> → home / about / services / contacts / requisites / privacy from org-profile.json (no invented phones or bank details). Soft-copy stays behind --with-llm (default off). Privacy is a RU template + «проверьте юристом» disclaimer — not legal advice. Footer links both pages from Day 12 scaffold.

  10. SEO (Day 15 / Phase 2): write_seo_from_org.py --project-dir <path> [--domain https://example.com] [--publish] → metadata/OG, sitemap, robots, JSON-LD @graph (Organization, WebSite, LocalBusiness, Service, BreadcrumbList; FAQPage only from overrides.faq; no ratings). --publish fails if domain is still the placeholder. One-shot: build_site_pack.py --project-dir <path> --domain https://….

Desktop (Day 17–21 + live lookup)​

  • Design rail shows an Org Confirm card (INN → lookup → Confirm / Edit / Cancel).
  • Lookup: known fixture INNs (7702012345, 7700000000) stay offline mocks; other INNs call gateway RPC design.inn.lookup (wraps design_inn / org_lookup, no_enrich=True). Falls back to offline when gateway/RPC missing.
  • Slash (Day 18):
    • /design inn <ИНН> — open Design tab + lookup (live when gateway + token)
    • /design org — show current OrgProfile summary
    • /design multipage — scaffold multipage after lock (scaffold_multipage.py --ensure-next)
  • Design rail status strip: Lookup → Brief → Variants → Locked → Pages
  • Preview (Day 19): after multipage success Desktop opens /preview at http://127.0.0.1:3000/ — run npm run dev, then click site nav. Aliases: /preview site, /preview /about, /preview 3000/contacts.
  • No Next app/ → toast + Project scaffold UI (internet-starter / ensure_next_project.py).
  • Smoke: scripts/smoke_mvp_routes.py --project-dir … (offline) or --base-url http://127.0.0.1:3000 (live); wrapper scripts/smoke-client-site-from-inn.sh.
  • Runbook: docs/ops/client-site-from-inn-runbook.md
  • Day 20: goldens client_site_* + references/day20-dogfood-notes.md
  • Day 21: a11y/mobile/prefers-reduced-motion in multipage templates + references/a11y-mobile-checklist.md
  • CLI bridge markers: VIBEOS_ORG_PROFILE=…, VIBEOS_CLIENT_SITE_PHASE=…, VIBEOS_NEEDS_INTERNET_STARTER=1 (plus VIBEOS_DESIGN_VARIANTS_RUN=…)
  • Skill slash /client-site-from-inn stays visible in Desktop (not block-listed).
  • Confirm sets $orgConfirm.phase = confirmed so variants unlock.

Out of scope (MVP)​

  • Online payment / client personal cabinet
  • CMS admin for the generated site
  • Auto-deploy to a third-party host without explicit operator confirmation
  • Unique stock photography generation
  • Legal warranty for the Privacy template (operator must review with counsel)

Post-MVP: /team + /gallery + /blog via --extra-pages (or all); Desktop live Confirm via gateway RPC design.inn.lookup (DaData token in .env); Yandex Maps embed when a key is set (else OSM); white-label Timeweb pack via prepare_timeweb_deploy.py (upload only with --i-confirm-deploy); soft-copy via fill_pages_from_org.py --with-llm (deterministic by default; VIBEOS_SOFT_COPY_LLM=1 / --soft-copy-live for LLM). Still backlog: live dogfood corpus (human).

Full freeze notes: docs/ops/client-site-from-inn-mvp-freeze.md.

Pitfalls​

  • Do not call DaData with an invalid checksum ИНН.
  • Prefer secrets in .env (DADATA_*, YANDEX_MAPS_API_KEY); skills.config may mirror the Yandex key for operators who already store skill knobs there.
  • Do not skip Confirm card — wrong org early is cheaper than regenerating three variants.
  • Requisites blocks must read only hard-fact fields (see honesty doc).
  • Prefer branch_type=MAIN when several suggestions return.
  • Enrich contacts are soft facts — never invent them when enrich is skipped.
  • Do not invent contacts when copying org-profile.json — copy the profile as-is.
  • Do not rebuild system prompt / swap toolsets on lock (prompt caching).
  • Nested <main> in page bodies is wrong — layout owns #main; pages use <article>.
  • Desktop Confirm calls design.inn.lookup with no_enrich; known fixture INNs (7702012345, 7700000000) stay offline mocks for rehearsal/CI.

Follow-ups (post-MVP)​

  • Live dogfood corpus (human; Day 20-B / E-20) — still operator-owned.
  • Phase 2 freeze (v1.1.0): docs/ops/client-site-from-inn-phase2-freeze.md
  • Plan / outcomes: docs/plans/2026-07-24-client-site-from-inn-phase2-work-plan.md, docs/ops/client-site-from-inn-phase2-outcomes.md.

See docs/ops/client-site-from-inn-release-notes.md.

Verification​

scripts/run_tests.sh \
tests/skills/test_inn_validate.py \
tests/skills/test_org_lookup.py \
tests/skills/test_org_to_brief.py \
tests/skills/test_org_web_enrich.py \
tests/skills/test_generate_org_variants.py \
tests/skills/test_org_diversity_fixtures.py \
tests/skills/test_apply_org_design.py \
tests/skills/test_org_lock_apply.py \
tests/skills/test_scaffold_multipage.py \
tests/skills/test_client_site_a11y_templates.py \
tests/skills/test_fill_pages_from_org.py \
tests/skills/test_soft_copy_from_org.py \
tests/skills/test_write_seo_from_org.py \
tests/skills/test_prepare_dogfood_pack.py \
tests/skills/test_rehearse_edge_cases.py \
tests/skills/test_assert_facts_untouched.py \
tests/skills/test_report_org_gaps.py \
tests/skills/test_lock_org_variant.py \
tests/skills/test_design_variant_picker.py \
tests/skills/test_smoke_mvp_routes.py \
tests/vibeos_cli/test_design_inn_cli.py -q
vibeos design inn 7702012345 --fixture --force --variants --json
vibeos design apply-org \
--run-dir skills/creative/client-site-from-inn/fixtures/runs/clinic \
--variant B --project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/scaffold_multipage.py \
--project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/fill_pages_from_org.py \
--project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/write_seo_from_org.py \
--project-dir ./my-landing --domain https://example.com --json
python3 skills/creative/client-site-from-inn/scripts/prepare_dogfood_pack.py \
--offline-rehearse --limit 5 --json
python3 skills/creative/client-site-from-inn/scripts/rehearse_edge_cases.py --json
# or: vibeos design dogfood-pack / vibeos design edge-rehearse
python3 skills/creative/client-site-from-inn/scripts/report_org_gaps.py \
--project-dir ./my-landing --json
python3 skills/creative/client-site-from-inn/scripts/assert_facts_untouched.py \
--project-dir ./my-landing --json
# Day 19 — after npm run dev:
python3 skills/creative/client-site-from-inn/scripts/smoke_mvp_routes.py \
--base-url http://127.0.0.1:3000 --json

Operator Preview runbook: docs/ops/client-site-from-inn-runbook.md.