chore: project scaffold, specs, and working record
Build and deploy / build-and-deploy (push) Failing after 5s

This commit is contained in:
Pouya Lajevardi
2026-08-26 08:51:16 -04:00
commit 19f7226661
26 changed files with 3206 additions and 0 deletions
+161
View File
@@ -0,0 +1,161 @@
/**
* Site-wide constants.
*
* Anything marked TODO(pouya) is an unanswered question in AGENTS.md §9.
* Do not guess a value to make the build pass — an unanswered question is
* supposed to be visible. See CLAUDE.md.
*/
export const SITE = {
name: 'Pouya Lajevardi',
tagline: 'Mediation · Arbitration · Toronto',
url: 'https://adr.smlcompany.ca',
locale: 'en_CA',
entity: 'SML Company Ltd. · Ontario, Canada',
} as const;
/**
* Verified credentials only — mirrors AGENTS.md §4.
* Adding a line here without adding it there is a bug.
*
* D13: the site asserts the JD and makes NO licensure claim. Do not add
* 'lawyer', 'called to the bar', 'licensed', or any post-nominal implying a
* licence — and do not imply it either. See AGENTS.md §4 Forbidden.
*/
export const CREDENTIALS = {
designations: ['Q.Med (ADRIC / ADRIO)'],
inProgress: ['Q.Arb — commenced August 2026'], // [verified 2026-08-26]
goal: 'C.Med-Arb (Chartered Mediator-Arbitrator)',
education: ['JD, Bond University'],
certifications: [
'Kompass Arbitration Certificate Program',
'Stitt Feld Handy — negotiation and ADR workshop series',
],
languages: ['English', 'Farsi'],
/** [verified 2026-08-26]. NOT OCNI (lapsed) and NOT the Law Society —
* listing the LSO implies licensure, which D13 bars. Do not add either. */
memberships: [
'ADR Institute of Canada (ADRIC)',
'ADR Institute of Ontario (ADRIO)',
'Ontario Bar Association — Construction & Infrastructure, ADR, and Civil Litigation sections',
],
} as const;
/** The three credential slots. Never matter counts — AGENTS.md §4. */
export const CREDENTIAL_ROW = [
{ value: 'Q.Med', label: 'ADRIC / ADRIO designation' },
{ value: 'JD + ML', label: 'Law and engineering' },
{ value: 'EN · FA', label: 'Bilingual practice' },
] as const;
/**
* The Toronto boutique is NEVER named — AGENTS.md D16. Use this string.
* Do not infer a name from an email domain or anywhere else.
*/
export const BOUTIQUE = 'a Toronto litigation and ADR boutique' as const;
/** Analytics: privacy-first and cookieless (D15). No GA4, no consent banner. */
export const ANALYTICS = {
provider: 'plausible' as 'plausible' | 'fathom' | null,
domain: 'adr.smlcompany.ca',
} as const;
export const CONTACT = {
email: 'info@smlcompany.ca', // [verified 2026-08-26]
/** No public phone by choice. Render 'By scheduled call' wherever a number
* would go — do not leave the field visually empty. */
phone: null as string | null, // [verified 2026-08-26]
phoneFallback: 'By scheduled call',
location: 'Toronto · Ontario · By appointment',
responseTime: 'Inquiries are answered within one business day.',
linkedin: 'https://www.linkedin.com/in/pouyalajevardi/', // [verified 2026-08-26]
/** Booking parked 2026-08-26 (AGENTS.md R6). Build /contact/ with the intake
* form and a reserved slot so an embed drops in later without a rebuild. */
bookingUrl: null as string | null,
} as const;
/** Portrait assets. Astro derives AVIF/WebP variants from the master at build. */
export const PORTRAIT = {
master: 'src/assets/pouya-lajevardi.jpg', // 1600x1600
og: 'src/assets/og-portrait.jpg', // 1200x630, cropped high
alt: 'Pouya Lajevardi',
} as const;
/** Shown on /contact/ and with the booking embed. Do not reword casually. */
export const NO_RETAINER_NOTICE =
'Submitting this form does not create a retainer, does not appoint a neutral, ' +
'and does not itself establish a mediatorparty relationship.';
/**
* Rate card — AGENTS.md D14, confirmed by Pouya 2026-08-26.
* One rate for all mediation matters. All figures PLUS HST.
* Full research and reasoning: docs/07-fees.md
*/
export const FEES = {
currency: 'CAD',
taxNote: 'All fees are plus HST.',
mediation: {
/** Prep is bundled AND stated on the page — [verified 2026-08-26].
* Do not hide it: at these rates, saying preparation is included is the
* point, not a detail. */
halfDay: { amount: 2000, hours: 3.5, prepIncluded: 2 },
fullDay: { amount: 4000, hours: 7, prepIncluded: 3 },
additionalParty: 500, // each party beyond two
overtimePerHour: 500, // [verified 2026-08-26]
},
arbitration: {
perHour: 500,
hearingDay: 4000,
documentsOnlySimple: 6500, // flat
documentsOnlyComplex: 9500, // flat
// No tribunal-secretary rate — removed by Pouya 2026-08-26.
},
// ENE, settlement counsel, dispute-system design, pre-dispute technical advisory
hourly: 500, // [verified 2026-08-26]
cancellation: [
{ window: 'More than 30 days before', fee: 'No fee. Disbursements only.' },
{ window: '15 to 30 days before', fee: '50% of the booked fee.' },
{ window: 'Fewer than 15 days before', fee: '100% of the booked fee.' },
],
cancellationNotes: [
'Rescheduling at the time of cancellation, with a new date fixed, is not charged.',
'The cancellation fee is waived if the reserved time is filled by another matter of equal or greater value.',
],
terms: [
'Fees are shared equally between the parties unless they agree otherwise in writing.',
'Accounts are payable on rendering. Interest accrues on overdue accounts at 5% per annum.',
'Video and in-person sessions are charged at the same rate.',
],
} as const;
export const PRACTICE_AREAS = [
{ slug: 'construction', name: 'Construction & Infrastructure', chip: 'Construction' },
{ slug: 'technology', name: 'Technology, AI & Data', chip: 'Technology' },
{ slug: 'energy', name: 'Energy, Grid & Regulatory', chip: 'Energy' },
{ slug: 'insurance', name: 'Insurance, SABS & LAT', chip: 'Insurance' },
{ slug: 'shareholder', name: 'Shareholder & Family Business', chip: 'Shareholder' },
{ slug: 'cross-cultural', name: 'Cross-Border & Diaspora', chip: 'Cross-cultural' },
] as const;
/** Seven items is the ceiling before a nav stops being scannable. */
export const PRIMARY_NAV = [
{ href: '/about/', label: 'About' },
{ href: '/mediation/', label: 'Mediation' },
{ href: '/arbitration/', label: 'Arbitration' },
{ href: '/practice/', label: 'Practice', children: PRACTICE_AREAS },
{ href: '/fees/', label: 'Fees' },
{ href: '/insights/', label: 'Insights' },
{ href: '/contact/', label: 'Contact' },
] as const;
/** Linked contextually rather than from the primary nav. */
export const SECONDARY_NAV = [
{ href: '/process/', label: 'How I work' },
{ href: '/med-arb/', label: 'Med-Arb' },
{ href: '/for-parties/', label: 'For parties' },
] as const;
export const LEGAL_NAV = [
{ href: '/legal/privacy/', label: 'Privacy' },
{ href: '/legal/terms/', label: 'Terms' },
] as const;