# Prompt 03 — Georgia Monthly Employment Tracker

Report type 3 in `../reports.md` (procedural index/tracker). Modelled on the
structure of PMC Research Center's monthly *Employment Tracker* (produced
with jobs.ge), whose July 2026 issue was read in full: it has exactly three
data blocks, each from a public source —

1. persons receiving a salary, by salary band — **Revenue Service** (rs.ge);
2. vacancies published on **jobs.ge**, total and by category;
3. quarterly labour-force indicators — **Geostat** labour force survey (LFS);

plus an optional quarterly Beveridge-curve chart (jobs.ge + hr.gov.ge +
Geostat) that this prompt does not attempt.

Worked example: `examples/2026-09-21-employment-tracker.md`, built from
`examples/2026-09-21-employment-tracker-inputs.md`.

## What "reconstructable" means here

Blocks 1 and 3 are *lookups*: the numbers exist as official series and any
run on the same date gets the same values. Block 2 is *procedural*: jobs.ge
does not publish counts, it publishes listings, and listings expire after
about 30 days. A single run therefore yields the trailing ~30-day window
only. To reproduce PMC's month-by-month series you must run the count at
each month-end (or accumulate daily) and keep the results — the first run
gives one data point, not a history. State this in any published output.

## How to run it

**Option A — model with code execution.** Run `scripts/jobsge_count.py`
(pure Python, no browser), query the two Geostat/rs.ge sources as
described, then write.

**Option B — model without tools.** Gather the three blocks by hand (the
rs.ge form and the Geostat PX-Web table are point-and-click; the jobs.ge
count needs the script or a manual tally per category from the listing
pages), paste them as an input pack, and run Part 2.

---

## Part 1 — Gather inputs

### Block 1 — Persons receiving a salary (Revenue Service)
- Page: https://www.rs.ge/statistics → "ინფორმაცია შემოსავლის მიმღებ
  ფიზიკურ პირთა შესახებ" (information on income-recipient natural
  persons). Form: year (`#StatisticsYears`), month (`#StatisticsMonths`,
  `00` = whole year, `01`–`12`), payment type (`#StatisticsSalaryTypes`,
  `1` = ხელფასი / salary). Result: a table of income ranges with the number
  of persons and taxable income per range; an Excel export button exists.
- Endpoint behind the form: `POST /RsGe.Module/Statistics/SearchStatistics`
  with `period=YYYYMM`, `salaryType=1` and the page's
  `__RequestVerificationToken`; returns `{"Statistics":[…]}` with 31
  income ranges. It is slow — 2 to 8 minutes per period in testing — so
  run `scripts/rs-fetch.js <YYYYMM> …` in the background (it keeps the
  page's cookie/token pair) and aggregate the ranges into PMC's bands with
  `scripts/rs_bands.py`. A manual fetch in a browser is an acceptable
  fallback for a one-off run; say so in the sources.
- Record for the latest month, the previous month and the same month a
  year earlier: total persons; persons in the bands 0–599, 600–1,199,
  1,200–2,399, 2,400+ GEL (and 9,600+ if reported). Data are gross salaries
  and are revised — note the date viewed, as PMC does.

### Block 2 — Vacancies on jobs.ge
- Run `python3 scripts/jobsge_count.py --csv <file>` (in `georesearch/`
  the script lives under `scripts/`). It calls jobs.ge's scroll endpoint
  `POST https://jobs.ge/en/?page=N&cid=<category>&jid=1&for_scroll=yes`
  (300 rows per page, job type `jid=1` = jobs only), parses id / title /
  company / published / deadline, and prints counts by category and
  publish month plus the earliest publish date still listed.
- Category ids (jobs.ge `cid`): 1 Administration/Management, 3
  Finance/Statistics, 2 Sales/Procurement, 4 PR/Marketing, 18 General
  Technical Staff, 5 Logistics/Transport/Distribution, 11
  Construction/Repair, 16 Cleaning, 17 Security/Safety, 6 IT/Programming,
  13 Media/Publishing, 12 Education, 7 Law, 8 Medicine/Pharmacy, 14
  Beauty/Fashion, 10 Food, 9 Other. PMC reports five named categories
  (Sales/Procurement, Administration/Management, Finance/Statistics,
  Logistics/Transport/Distribution, IT/Programming) plus "Other" — group
  the rest into "Other" to match.
- Record: the count for the latest *complete* month if the run happened
  at month-end, otherwise the month-to-date count with the cut-off date;
  the per-category counts; the earliest date in the window. If you have
  earlier runs, add MoM and YoY changes; if not, say there is no history
  yet rather than inferring one.

### Block 3 — Labour-force indicators (Geostat LFS, quarterly)
- PX-Web table: `Social Statistics/Labour/LFS_by_sex_and_urban_(Quarter_II,_2026).px`
  (the file name carries the latest quarter and changes each release —
  list the folder first). Variables: `Sex, Urban/Rural Areas` (0 = Total),
  `Economic Status` (1 labour force, 2 employed, 3 hired, 4 self-employed,
  6 unemployed, 8 unemployment rate, 9 participation rate, 10 employment
  rate), `Years`, `Quarters` (0 annual, 1–4). Query the latest quarter,
  the previous quarter, and the same quarter a year earlier, explicit
  codes only.
- Also the latest quarterly earnings release (Geostat "Average Monthly
  Nominal Earnings of Employees", PDF) for the average salary line.

### Calendar
- rs.ge data for month M appear during month M+1 (PMC viewed July data on
  20 August). Geostat LFS for quarter Q appears ~7 weeks after quarter end
  (Q2 2026 → 19 August 2026). Geostat earnings for Q appear mid-month 3 of
  the following quarter.

---

## Part 2 — Write the tracker

```
You are producing a monthly labour-market tracker for Georgia for
professional readers. Use only the INPUT PACK. Do not invent, extrapolate
or "estimate" any figure; where a comparison (MoM, YoY) is not in the pack,
omit it and say why in one clause.

Sections, in this order:

TITLE: "Georgia Employment Tracker — <Month Year>" (the latest month with
salary data; if the jobs.ge count is month-to-date, say so in the title's
subtitle line: "jobs.ge data to <date>").

1. PERSONS RECEIVING A SALARY — 3–4 sentences: total for the month with
   MoM and YoY change; share of persons under 600 GEL and its change in
   percentage points; share at 2,400 GEL or more and its change; the 9,600+
   share if present. Then a table: Band | Persons | Share, for the latest
   month. Footnote: Revenue Service, gross salaries, data not final,
   viewed <date>.
2. VACANCIES ON jobs.ge — 3–4 sentences: total published in the period
   with the exact window used; the largest and smallest categories; MoM
   and YoY only if earlier runs exist. Table: Category | Vacancies |
   Share, for the five named categories plus Other, sorted by count.
   Footnote: jobs.ge, job type "Job" only, listings live ~30 days, counted
   on <date>; no history before <first run date>.
3. LABOUR MARKET INDICATORS — Table with columns for the same quarter a
   year earlier, the previous quarter and the latest quarter: labour
   force, employed, hired, self-employed, unemployed (thousands);
   participation, employment and unemployment rates (%); average nominal
   monthly salary (GEL) where available. One sentence on the direction of
   the unemployment rate QoQ and YoY.
4. SOURCES — Institution — dataset/release — period — URL or endpoint —
   date accessed. Mark anything fetched manually.

Register: neutral and dense; every sentence carries a figure or a date.
Use "MoM", "YoY", "QoQ" after defining them once. Percent changes to one
decimal; percentage-point changes labelled "pp". Re-check every number
against the input pack before finishing, then output the tracker only.
```

---

## Known limits
- The jobs.ge count is only comparable with PMC's if taken at month-end for
  a full month; a mid-month run is a partial figure and must be labelled.
  PMC may also count listing types beyond "Job" — its July 2026 total
  (8,138) is not directly checkable against a run made in September.
- rs.ge's endpoint is slow and token-protected; treat it as
  "manual-fetch-friendly" rather than reliably scriptable.
- The Beveridge curve in PMC's version needs seasonally adjusted series
  and hr.gov.ge public-sector vacancies — out of scope for this prompt.
