Auto-deploy: 2026-08-06 12:46:03

This commit is contained in:
Hamza-Ayed
2026-08-06 12:46:03 +03:00
parent fd6498091d
commit f9b9016c22
3 changed files with 226 additions and 34 deletions
+112 -10
View File
@@ -12,7 +12,14 @@ const PROFILE_DATA = {
identity: { identity: {
fullName: 'Hamza Ayed', fullName: 'Hamza Ayed',
primaryTitle: 'Senior Mobile Architect', primaryTitle: 'Senior Mobile Architect',
positioningLine: 'Ride-Hailing & Real-Time Systems · FinTech in Emerging Markets', // Ride-hailing is the flagship, not the fence. The earlier line named only
// the two mobility platforms, and every downstream prompt read that as the
// whole scope — so full-stack backend, native Android, security and DevOps
// work (30+ shipped apps across e-commerce, delivery, healthcare, news)
// silently stopped counting toward any match score.
positioningLine:
'End-to-End Product Engineer · Flutter & Native Mobile · PHP/Laravel, Node.js & Python Backends · ' +
'Real-Time Geo Systems · Security & DevOps · 38+ production apps shipped',
location: 'Amman, Jordan', location: 'Amman, Jordan',
phone: '+962 798 583 052', phone: '+962 798 583 052',
email: 'hamzaayedflutter@gmail.com', email: 'hamzaayedflutter@gmail.com',
@@ -61,12 +68,36 @@ const PROFILE_DATA = {
'Specialized in real-time systems, self-hosted geo-services, high-latency optimization and ' + 'Specialized in real-time systems, self-hosted geo-services, high-latency optimization and ' +
'infrastructure cost reduction.', 'infrastructure cost reduction.',
// ── Roles I actually apply to ─────────────────────────────────────────────
// These are PRODUCT-ENGINEERING roles: something ships to users. My security,
// server and DevOps work is real, but it is infrastructure I built in service
// of products I owned — it is not a career track I am pursuing. See
// `supportingSkills` below, which exists to stop the analyser from reading a
// skill as a target.
targetRoles: [ targetRoles: [
'Senior / Lead Mobile Engineer', 'Senior / Lead / Staff Mobile Engineer',
'Mobile Architect', 'Flutter Developer (any seniority at or above mid-level)',
'Founding Engineer (Mobility, Logistics, FinTech)', 'Android Developer',
'Senior Backend Engineer', 'Mobile Architect / Mobile Technical Lead',
'Full Stack Engineer' 'Founding Engineer (Mobility, Logistics, FinTech, any early-stage product)',
'Senior Backend Engineer (PHP / Laravel, Node.js, Python)',
'Full Stack Engineer',
'Maps / Geospatial / Location Platform Engineer',
'Software Engineer (general product engineering)'
],
// Genuine, provable skills that are NOT job targets. They belong in the CV as
// supporting evidence of end-to-end ownership — never as the headline, and
// never as a reason to surface or recommend a job built around them.
supportingSkills: [
'Application & API security (HMAC, anti-tampering, RASP, Fake GPS detection) — ' +
'secured the products I built; not applying for Security Engineer / AppSec / ' +
'Penetration Testing / SOC / Cybersecurity roles',
'Server administration and infrastructure (Linux, Nginx, Docker, VPS, self-hosted ' +
'CI/CD) — ran the infrastructure my own products needed; not applying for ' +
'SysAdmin / DevOps Engineer / SRE / Platform Engineer / Cloud Engineer roles',
'Data analytics certifications (IBM, Google) — background knowledge only; not ' +
'applying for Data Analyst / Data Scientist roles'
], ],
// Headline metrics — ordered by how well they survive a sceptical reader. // Headline metrics — ordered by how well they survive a sceptical reader.
@@ -255,6 +286,14 @@ const PROFILE_DATA = {
// that does not. // that does not.
boundaries: { boundaries: {
strongIn: [ strongIn: [
// Sole ownership used to sit under limitedIn, where every prompt read it
// as a deficiency and scored down roles that asked for teamwork. It is
// the opposite: shipping four apps plus a backend alone is the rarest
// thing on this CV.
'Sole end-to-end ownership: took two platforms from empty repo to live ' +
'commercial operations alone — product, mobile, backend, infra, release',
'Breadth across the whole stack: mobile, backend, database, servers, ' +
'security and deployment — no hand-off needed to ship a product',
'Flutter / Dart mobile architecture at production scale', 'Flutter / Dart mobile architecture at production scale',
'Real-time systems: WebSockets, dispatching, live tracking', 'Real-time systems: WebSockets, dispatching, live tracking',
'Self-hosted geo infrastructure: tiles, routing, polylines', 'Self-hosted geo infrastructure: tiles, routing, polylines',
@@ -263,11 +302,15 @@ const PROFILE_DATA = {
'PHP / Laravel / MySQL backend supporting mobile products', 'PHP / Laravel / MySQL backend supporting mobile products',
'Docker, Linux, Nginx, self-hosted CI/CD' 'Docker, Linux, Nginx, self-hosted CI/CD'
], ],
// SCOPE OF THIS LIST: it exists to stop the CV/cover-letter generator from
// CLAIMING things that are not true. It is NOT a list of reasons to skip a
// job. Anything here that a posting merely mentions is a learning curve, not
// a disqualifier — see `applyPolicy` below, which governs apply/skip.
limitedIn: [ limitedIn: [
'NO formal people management: no direct reports, no hiring, no performance reviews. ' + 'No formal people management yet: no direct reports, no hiring, no performance ' +
'Both platforms were architected and built SOLO. Leadership here is technical — ' + 'reviews. Leadership is technical — architecture ownership, end-to-end delivery, ' +
'architecture ownership, end-to-end delivery, stakeholder alignment — never headcount. ' + 'stakeholder alignment. Fine for Lead / Staff / Principal roles; only pure ' +
'Do not frame this profile for Engineering Manager roles.', 'headcount-management titles (Engineering Manager) are a genuine stretch.',
'AI is limited to INTEGRATING third-party vision/LLM APIs (KYC automation, Gemini API). ' + 'AI is limited to INTEGRATING third-party vision/LLM APIs (KYC automation, Gemini API). ' +
'No model training, no MLOps, no deep learning research.', 'No model training, no MLOps, no deep learning research.',
'Cloud experience is self-hosted/VPS-centric — not deep AWS/GCP/Azure managed-service experience.', 'Cloud experience is self-hosted/VPS-centric — not deep AWS/GCP/Azure managed-service experience.',
@@ -282,6 +325,60 @@ const PROFILE_DATA = {
] ]
}, },
// ── Apply / skip policy ───────────────────────────────────────────────────
// Separate from `boundaries` on purpose. `boundaries` protects CV honesty;
// this governs the apply decision. Before it existed, the analysis tab read
// the boundaries list as a rejection checklist and returned "لا تتقدّم" on
// almost everything — including plain Flutter roles.
applyPolicy: {
// A verdict of "do not apply" is only ever justified by one of these.
hardBlockers: [
'Requires a security clearance, or citizenship/residency I cannot obtain',
'Explicitly no visa sponsorship AND requires being already resident/authorised in that country',
'The core discipline is one I have never practised: pure Data Science, ML/model ' +
'training, pure QA/manual testing, embedded/firmware, game engines, ' +
'Salesforce/SAP/blockchain',
// Distinct from the line above: these ARE things I can do, but they are not
// the career I am building. A posting whose PRIMARY deliverable is
// infrastructure or security — rather than a product that ships to users —
// is a skip even at a high skills match.
'The role\'s primary deliverable is infrastructure or security rather than a ' +
'product: Security Engineer, AppSec, Penetration Tester, SOC/Cybersecurity ' +
'Analyst, SysAdmin, DevOps Engineer, SRE, Platform Engineer, Cloud/Network ' +
'Engineer, Database Administrator. These skills support my product work; ' +
'they are not the job I am looking for.',
'Native-only iOS role demanding Swift/SwiftUI as the primary daily language',
'Junior/intern/graduate level, or pay clearly below market floor',
'Unpaid, equity-only, or an obvious scam posting'
],
// These are the things the analyser kept mistaking for blockers.
notBlockers: [
'ON-SITE or hybrid anywhere in GCC/MENA/Europe — relocation is welcome, not an obstacle',
'A location not yet decided, or an office in a city I do not live in',
'Asking for team/collaboration experience — solo delivery plus stakeholder work covers it',
'Asking for 1-3 more years than I have, or a higher title than my last one',
'Naming 2-4 tools I have not used, when the core stack is one I know',
'AWS / GCP / Azure named in a posting whose core is application engineering — ' +
'self-hosted Docker/Linux/Nginx/CI-CD transfers directly',
'A domain I have not worked in (health, e-commerce, edtech, logistics, banking)',
'React Native / Kotlin / Java-first mobile roles — Flutter and native Android transfer',
'A degree preference in CS (BSc Mathematics is accepted in practice)',
'Backend-only or full-stack roles — PHP/Laravel, Node.js and Python are all real experience',
// The mirror image of the infrastructure blocker: security and DevOps duties
// listed INSIDE a product role are a plus, not a reason to skip.
'A mobile / backend / full-stack role that also lists security, CI/CD, Docker or ' +
'server duties among its responsibilities — that combination is my strongest fit'
],
// The intended distribution of verdicts across a normal LinkedIn feed.
calibration:
'On a typical mobile/backend job feed, roughly 60% of postings should be APPLY, ' +
'30% APPLY WITH EDITS, and at most 10% SKIP. If more than 1 in 5 comes back SKIP, ' +
'the bar is being set wrong — re-read the hardBlockers list, which is exhaustive. ' +
'Missing skills are a cover-letter problem, not a reason to stay home. ' +
'A 60% match with a real strength in the core requirement is worth applying to: ' +
'the employer decides the shortlist, not the candidate.'
},
// Voice rules — applied to cover letters, LinkedIn comments and posts. // Voice rules — applied to cover letters, LinkedIn comments and posts.
voice: { voice: {
tone: 'Operator-level, calm, direct, evidence-first. Writes like someone who has shipped, not someone selling.', tone: 'Operator-level, calm, direct, evidence-first. Writes like someone who has shipped, not someone selling.',
@@ -313,6 +410,11 @@ function renderProfileText(p = PROFILE_DATA) {
lines.push(''); lines.push('');
lines.push('TARGET ROLES: ' + p.targetRoles.join(' | ')); lines.push('TARGET ROLES: ' + p.targetRoles.join(' | '));
lines.push(''); lines.push('');
if (p.supportingSkills && p.supportingSkills.length) {
lines.push('SUPPORTING SKILLS (real, but NOT roles I am seeking):');
p.supportingSkills.forEach(s => lines.push(`- ${s}`));
lines.push('');
}
lines.push('HEADLINE METRICS:'); lines.push('HEADLINE METRICS:');
p.headlineMetrics.forEach(m => lines.push(`- ${m.lead} ${m.rest}`)); p.headlineMetrics.forEach(m => lines.push(`- ${m.lead} ${m.rest}`));
lines.push(''); lines.push('');
+69 -15
View File
@@ -67,7 +67,8 @@ STRICT INTEGRITY RULES — VIOLATING ANY OF THESE INVALIDATES THE OUTPUT:
${b.neverClaim.join(', ')}. ${b.neverClaim.join(', ')}.
4. MY GENUINE STRENGTHS (lead with these): 4. MY GENUINE STRENGTHS (lead with these):
${b.strongIn.map(s => ' • ' + s).join('\n')} ${b.strongIn.map(s => ' • ' + s).join('\n')}
5. MY HONEST LIMITS (acknowledge, never paper over): 5. MY HONEST LIMITS — these constrain what you may WRITE, not what I may apply
to. Never claim them; never treat them as reasons to reject a job:
${b.limitedIn.map(s => ' • ' + s).join('\n')} ${b.limitedIn.map(s => ' • ' + s).join('\n')}
6. Every number I use must be one of the real metrics in my profile. Do not 6. Every number I use must be one of the real metrics in my profile. Do not
round up, do not extrapolate, do not invent new ones. round up, do not extrapolate, do not invent new ones.
@@ -76,6 +77,37 @@ ${b.limitedIn.map(s => ' • ' + s).join('\n')}
${P.voice.banned.join(' / ')}.`; ${P.voice.banned.join(' / ')}.`;
} }
// ─── Apply/skip policy, generated from the profile ──────────────────────────
// Injected ONLY into the decision-making tabs (analysis, ATS verdict, benefits,
// bulk pre-screen). Without it the model treats the CV-integrity boundaries as a
// rejection checklist and skips almost everything.
function buildApplyPolicy(P) {
const a = P.applyPolicy;
if (!a) return '';
const supporting = (P.supportingSkills && P.supportingSkills.length)
? `
SKILL vs. TARGET — do not confuse the two. Having a skill is not wanting the job:
${P.supportingSkills.map(s => ' ~ ' + s).join('\n')}
Roles I am seeking: ${P.targetRoles.join(' | ')}.
`
: '';
return `${supporting}
APPLY / SKIP POLICY — THIS GOVERNS THE VERDICT:
Default position: APPLY. The employer runs the filter; my job is to be in the pile.
Only ONE of the following justifies a "do not apply". The list is exhaustive:
${a.hardBlockers.map(s => ' ✗ ' + s).join('\n')}
The following are explicitly NOT reasons to skip. If one of these is the worst
thing about the posting, the verdict is APPLY or APPLY WITH EDITS — never skip:
${a.notBlockers.map(s => ' ✓ ' + s).join('\n')}
CALIBRATION: ${a.calibration}
A gap is something to ADDRESS in the CV and cover letter, not a veto. State the
gap, then state how to cover it — that is the useful output.`;
}
function buildPromptV2(tab, job, userProfile, language) { function buildPromptV2(tab, job, userProfile, language) {
const P = (typeof PROFILE_DATA !== 'undefined') ? PROFILE_DATA : null; const P = (typeof PROFILE_DATA !== 'undefined') ? PROFILE_DATA : null;
if (!P) { if (!P) {
@@ -112,13 +144,14 @@ function buildPromptV2(tab, job, userProfile, language) {
const prof = 'MY PROFESSIONAL PROFILE:\n' + profileText; const prof = 'MY PROFESSIONAL PROFILE:\n' + profileText;
const co = job.company || 'this company'; const co = job.company || 'this company';
const STRICT_RULES = P ? buildIntegrityRules(P) : ''; const STRICT_RULES = P ? buildIntegrityRules(P) : '';
const APPLY_POLICY = P ? buildApplyPolicy(P) : '';
const Pr = {}; const Pr = {};
// ── TAB: Analysis (Arabic) ──────────────────────────────────────────────── // ── TAB: Analysis (Arabic) ────────────────────────────────────────────────
Pr.analysis = `You are an elite career strategist and a hiring manager who has Pr.analysis = `You are my career strategist — on MY side of the table, not the
screened thousands of engineering CVs. Evaluate this job against my profile with employer's. Your job is to get me shortlisted, not to gatekeep. Be honest, be
brutal honesty and EXTREME brevity. brief, and be actionable.
${analysisLang} ${analysisLang}
@@ -130,6 +163,8 @@ Equally: do NOT inflate it into architecture-astronaut or CTO language.
DO NOT recount my history or summarise my profile back to me. Be actionable. DO NOT recount my history or summarise my profile back to me. Be actionable.
${APPLY_POLICY}
${STRICT_RULES} ${STRICT_RULES}
${prof} ${prof}
@@ -139,8 +174,10 @@ ${ctx}
Respond in this EXACT structure: Respond in this EXACT structure:
## 🎯 القرار: [تقدّم / لا تتقدّم] ## 🎯 القرار: [تقدّم / تقدّم بعد تعديل السيفي / لا تتقدّم]
[سطر واحد قصير يشرح السبب] [سطر واحد قصير يشرح السبب. "لا تتقدّم" ممنوعة إلا إذا انطبق مانع صريح من قائمة
hardBlockers أعلاه — واذكر المانع بالاسم. إذا ما في مانع منها، القرار "تقدّم"
أو "تقدّم بعد تعديل السيفي" مهما كانت الفجوات.]
## 📊 نسبة المطابقة التقديرية: X% ## 📊 نسبة المطابقة التقديرية: X%
[سطر واحد: على أي أساس حسبتها] [سطر واحد: على أي أساس حسبتها]
@@ -150,9 +187,9 @@ Respond in this EXACT structure:
- [نقطة 2] - [نقطة 2]
- [نقطة 3] - [نقطة 3]
## ❌ الفجوات الحقيقية ## ❌ الفجوات وكيف نغطيها
- [فجوة 1 — ومدى خطورتها: قاتلة / قابلة للمعالجة / شكلية] - [فجوة 1 — التصنيف: مانع فعلي / قابلة للمعالجة / شكلية — ثم كيف أغطيها في السيفي أو المقابلة]
- [فجوة 2] - [فجوة 2 — نفس الشيء]
## 📝 تعديلات السيفي المطلوبة ## 📝 تعديلات السيفي المطلوبة
- [ما الذي يجب إبرازه] - [ما الذي يجب إبرازه]
@@ -254,6 +291,8 @@ Respond ENTIRELY in English.
${ATS_METHOD} ${ATS_METHOD}
${APPLY_POLICY}
${STRICT_RULES} ${STRICT_RULES}
${prof} ${prof}
@@ -282,11 +321,14 @@ Write as plain lines, not a markdown table — tables break ATS parsing when cop
TRUE per my profile and carry a keyword copied exactly from the posting.] TRUE per my profile and carry a keyword copied exactly from the posting.]
## DISQUALIFIERS ## DISQUALIFIERS
[Anything that would auto-reject me: location, work authorisation, hard years [ONLY items from the hardBlockers list above — a legally or physically impossible
requirement, mandatory certification. If none, say "None detected".] requirement. On-site work, relocation, a years-of-experience preference and
unfamiliar tools are NOT disqualifiers. If none, say "None detected".]
## VERDICT ## VERDICT
[APPLY AS-IS / APPLY AFTER EDITS / SKIP] — one sentence of reasoning.`; [APPLY AS-IS / APPLY AFTER EDITS / SKIP] — one sentence of reasoning.
SKIP requires naming a hard blocker from the list. Otherwise choose one of the
first two, even at a low score.`;
// ── TAB: Application form Q&A ───────────────────────────────────────────── // ── TAB: Application form Q&A ─────────────────────────────────────────────
const dynamicQuestions = (job.questions && job.questions.length > 0) const dynamicQuestions = (job.questions && job.questions.length > 0)
@@ -353,6 +395,8 @@ RESPOND WITH ONLY THIS FORMAT (raw JSON, answering ONLY the questions listed abo
Pr.benefits = `You are a career analyst specialising in tech compensation across Pr.benefits = `You are a career analyst specialising in tech compensation across
MENA and the GCC. Respond ENTIRELY in English. MENA and the GCC. Respond ENTIRELY in English.
${APPLY_POLICY}
${prof} ${prof}
JOB: JOB:
@@ -398,10 +442,20 @@ MY PROFILE IN ONE LINE: ${P ? P.identity.primaryTitle : 'Senior Mobile Architect
MY CORE STACK: ${coreStack} MY CORE STACK: ${coreStack}
ROLES I WANT: ${targetRoles} ROLES I WANT: ${targetRoles}
${APPLY_POLICY}
SCORING RULES: SCORING RULES:
- YES → Strongly matches the ROLES I WANT (Mobile, Backend, or Full Stack) and my CORE STACK at a senior level. - YES → Any Mobile / Flutter / Android / Backend / Full Stack / general software
- MAYBE → Adjacent roles (general senior software engineering, roles where the stack is partially matching or learnable). engineering role at mid-level or above. Title need not match exactly.
- NO → Completely unrelated roles (e.g., pure data science, ML, QA, pure product management, junior/mid-level roles, or stacks I have zero overlap with). - MAYBE → Adjacent engineering roles where the stack only partially overlaps but is
learnable, or where seniority is a stretch in either direction.
- NO → ONLY a hard blocker from the policy above: a different discipline entirely
(data science, ML, manual QA, embedded, product management), an
infrastructure- or security-titled role (DevOps, SRE, SysAdmin, Platform,
Cloud, DBA, Security/AppSec/SOC) even though I hold those skills,
junior/intern level, or an obvious scam. Nothing else earns a NO.
Judging from the title alone: when in doubt between NO and MAYBE, answer MAYBE —
the full description has not been read yet, and a wrong NO costs me the job.
I will give you a JSON array of jobs (Title, Company). I will give you a JSON array of jobs (Title, Company).
+45 -9
View File
File diff suppressed because one or more lines are too long