Client Site From Inn
Build a multipage org site from a Russian INN.
Skill metadata
| Source | Bundled (installed by default) |
| Path | skills/creative/client-site-from-inn |
| Version | 1.1.0 |
| Author | VibeOS |
| License | MIT |
| Platforms | linux, macos, windows |
| Tags | design, inn, org, website, dadata, creative, multipage |
| Related skills | design-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_TOKENorDADATA_API_KEYin.envfor live lookup (listed inOPTIONAL_ENV_VARS; never put tokens inconfig.yaml). - Optional map embed:
YANDEX_MAPS_API_KEYin.env, orskills.config.client_site_from_inn.yandex_maps_api_key, orfill_pages_from_org.py --yandex-maps-key …. Without a key,/contactsuses OpenStreetMap (default). - Offline / CI:
--fixtureorVIBEOS_ORG_LOOKUP_FIXTURE=1+fixtures/org/<inn>.json. - Contact enrich is opt-in (
--enrich,--website, orskills.config.client_site_from_inn.web_enrich: true). Default off. - Related:
design-variant-pickerfor 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
| Step | Artifact |
|---|---|
| CLI one-shot | vibeos design inn / scripts/design_inn.py |
| Validate | scripts/inn_validate.py |
| Lookup + cache | scripts/org_lookup.py |
| Normalize | scripts/normalize_org.py |
| Web enrich | scripts/org_web_enrich.py (+ fixtures/org/<inn>.enrich.json) |
| Org → brief | scripts/org_to_brief.py |
| Brief → A/B/C stubs | scripts/generate_org_variants.py / --variants |
| OKVED → industry/tone/family | references/okved-tone-map.yaml + .md |
| Sample ИНН | references/sample-inns.yaml |
| Operator post-scaffold | references/operator-post-scaffold.md |
| A11y / mobile (Day 21) | references/a11y-mobile-checklist.md |
| Honesty rules | references/content-honesty.md |
| IA + field matrix | references/ia-multipage.md, field-to-page-matrix.md |
| OrgProfile schema | references/org-profile.schema.json |
| Org taste / diversity | references/org-taste-checklist.md + fixtures/runs/ |
| Lock + apply | scripts/apply_org_design.py / vibeos design apply-org |
| Multipage scaffold | scripts/scaffold_multipage.py + templates/multipage/ |
| Optional /team /gallery /blog | scaffold_multipage.py --extra-pages team,gallery,blog (or all; honesty-gated) |
| Fill from OrgProfile | scripts/fill_pages_from_org.py (hard facts + requisites/privacy; --with-llm soft-copy) |
| Gaps / honesty lint | scripts/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 playbook | references/maps-client-playbook.md |
| SEO / JSON-LD | scripts/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 checklist | references/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-in | scaffold_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 smoke | scripts/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 / dogfood | docs/ops/client-site-from-inn-*.md |
| MVP freeze / release | docs/ops/client-site-from-inn-mvp-freeze.md, client-site-from-inn-release-notes.md |
Procedure
-
Normalize + validate ИНН (
inn_validate.py). Stop on failure with RU message. -
Lookup / fixture → raw JSON + OrgProfile (
org_lookup.py). -
Optional enrich (
org_web_enrich.py) — merge only above confidence threshold. -
Show Confirm card before variants (Day 1 UX) — human must accept OrgProfile.
-
org_to_brief.py→brief.md/brief.json(includesorg_brand, ИНН, ОКВЭД). -
After Confirm:
generate_org_variants.py(orvibeos design inn … --variants) →run-*/{A,B,C}/preview.htmlwith real brand,direction.mdwith ИНН+ОКВЭД. Do not run Next scaffold yet (Days 12+). -
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 (ifglobals.cssexists) 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). -
Multipage scaffold (Day 12):
scaffold_multipage.py --project-dir <path>→app/(site)/{layout,nav,pages…}with skip-link + mobile nav. -
Fill hard facts (Days 13–14):
fill_pages_from_org.py --project-dir <path>→ home / about / services / contacts / requisites / privacy fromorg-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. -
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 fromoverrides.faq; no ratings).--publishfails 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 RPCdesign.inn.lookup(wrapsdesign_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
/previewathttp://127.0.0.1:3000/— runnpm 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); wrapperscripts/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-motionin multipage templates +references/a11y-mobile-checklist.md - CLI bridge markers:
VIBEOS_ORG_PROFILE=…,VIBEOS_CLIENT_SITE_PHASE=…,VIBEOS_NEEDS_INTERNET_STARTER=1(plusVIBEOS_DESIGN_VARIANTS_RUN=…) - Skill slash
/client-site-from-innstays visible in Desktop (not block-listed). - Confirm sets
$orgConfirm.phase = confirmedso 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.configmay 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=MAINwhen 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.lookupwithno_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.