Request: - Fix Codex v0.139.0 failing to load the project-local HK IPO skills with invalid YAML errors. Changes: - Converted the three HK IPO skill frontmatter descriptions to YAML folded block scalars. - Preserved the existing description text and skill bodies. - Left unrelated IPO archive/report refresh files unstaged. Verification: - Ran git diff --cached --check. - Confirmed Codex CLI parses with 'codex --search -s danger-full-access -a never exec -C /root/projects/hk-ipo --help'. - Ran a short Codex smoke test that returned OK without the prior invalid YAML errors. Next useful context: - Codex CLI v0.139.0 is the installed CLI package version, not the model version. - The prior YAML failed because unquoted descriptions contained ': ' such as 'project: T0/T1/T2', which strict YAML treats as a mapping separator.
14 KiB
name, description
| name | description |
|---|---|
| hk-ipo-analyst | Use for Hong Kong IPO subscription analysis in this project: T0/T1/T2 prediction cards, scoring, cross-IPO comparison, research reports, post-listing reviews, error attribution, and rule-update recommendations. Use archived facts when available and keep predictions append-only. |
HK IPO Analyst
Purpose
Assess Hong Kong IPO subscription candidates using the project's archived facts, scoring rules, prediction cards, and review history. This skill owns judgment: whether to subscribe, wait, avoid, sell in grey market or on D1, or revise a rule after outcomes arrive.
Use hk-ipo-archivist first when source documents, listing facts, allotment results, prices, or database snapshots need to be updated.
Core Discipline
Separate the decision stage from later facts:
T0_prospectus: prospectus and offer terms only.T0_5_market_heat: subscription-period non-official market heat, such as broker-aggregated margin subscription multiples, observed before official allotment results.T0_95_final_heat: near-deadline heat observed while the user can still place, amend, or cancel an IPO order; this is an actionable late-order stage, not an allotment-results stage.T1_allotment: allotment results, public subscription, international placing, allocation, and final pricing.T2_grey_market: grey-market result and immediate pre-listing trading context.D1,D5,D20,D60: post-listing review checkpoints.
Do not let later facts leak into earlier prediction cards. When reviewing an older call, compare the frozen prediction against the actual outcome instead of rewriting the original judgment.
Trading Horizon
The analyst model is a short-exit IPO subscription model, not a long-term holding model.
- The intended exit is
T2_grey_marketwhen a reliable grey-market signal and executable price are available, orD1otherwise. - The default assumption is to sell allocated shares by D1 unless a later rule explicitly creates a documented exception.
- D5/D20/D60 are review labels for learning, not holding targets and not inputs for subscription decisions.
- Reports should frame expected return, triggers, and exit discipline around T2/D1 realization rather than long-term fundamentals.
- Recommendations should avoid long-hold language unless the user explicitly asks for a separate long-term investment thesis.
Project Storage Contract
Use repo-relative paths everywhere:
- Memos:
memos/{ticker}_{stage}_{date}.md - Reports:
reports/{date}_{topic}.mdor another repo-relative report path requested by the user. - Latest candidate report mirror:
reports/README.md - Rules:
rules/ipo_score_v*.yamlandrules/rule_change_log.md - Source references: cite archived files using paths such as
data/raw/06658/prospectus.pdf
Never store or cite machine-specific absolute paths in durable project files.
Responsibilities
- Produce IPO subscription analysis and cross-candidate rankings.
- Write append-only T0/T1/T2 prediction cards.
- Include probability forecasts, score breakdowns, key reasons, risks, triggers, and exit discipline.
- Review actual outcomes against prior predictions.
- Attribute errors using stable tags such as
fundamental_miss,valuation_miss,heat_miss,structure_miss,market_window_miss,execution_miss, anddata_gap. - Recommend scoring-rule changes only after evidence supports them.
Boundaries
Do not silently mutate archived source facts. If facts are missing or stale, call out the data gap and use hk-ipo-archivist to update the archive before relying on them.
Do not overwrite prediction cards. If a view changes, write a new stage card or review card that references the earlier prediction.
Workflow
- Inspect current repo state and recent commits before changing files.
- Determine the requested stage: T0, T1, T2, or post-listing review.
- Load available archived facts and rules from repo-relative project files.
- If facts are missing or stale, update the archive through
hk-ipo-archivistor state the gap clearly. - Score the IPO using the current rule version.
- Record probability forecasts rather than only directional language.
- Write a memo/report with data-as-of time, rule version, sources, score, decision, and triggers.
- For reviews, compare the frozen prediction to actual outcomes and classify the error type.
- Commit only the related memo/report/rule changes after verification.
Broad Candidate Report Layout
For broad/latest candidate reports whose purpose is deciding what can be subscribed now, order the body for action first:
- Scoring/ranking table for currently actionable IPOs.
- Fundamentals cross-check for the current batch.
- Break-probability, risk/reward, and capital-efficiency framework.
- Per-IPO notes, execution guidance, and closed/waiting names.
- Recent 30-day listed-IPO review as post-hoc calibration.
- Data-refresh guardrails and sources.
Do not lead broad candidate reports with post-listing reviews; keep those after the live decision layers so the reader sees the actionable ranking first.
Latest Candidate Report Refresh
For scheduled runs, latest IPO list refreshes, and broad candidate reports, first use hk-ipo-archivist to refresh the latest internet-sourced IPO universe and archive updates before making analyst judgments. This includes the HKEX current new-listing page, newly available prospectuses, allotment-result announcements, listing-calendar changes, recent price-performance rows for review, and subscription-period market heat such as broker-aggregated margin subscription multiples.
Refresh the report content as a complete current snapshot, not as a partial patch. The dated report should be written to reports/{date}_latest_ipo_candidates_analysis.md and should update all relevant sections: actionable ranking, fundamentals, break-probability/risk-reward, capital efficiency, per-IPO notes, closed/waiting names, recent 30-day listed-IPO review, data gaps, and sources.
Market heat and subscription multiples must remain stage-safe:
- Unofficial live subscription or margin multiples belong in archived
ipo_market_heatrows with provider,observed_at, stage, and source path. - Do not copy T0.5/T0.95 market heat into official T1 public-oversubscription fields.
- Official public subscription, international placing demand, one-lot success, and final offer-price fields should come only from archived allotment-result sources or other documented official T1 sources.
- If a current network source cannot be refreshed, label the affected field as
data_gapand keep the stale timestamp visible.
After writing the dated latest report, copy the same final Markdown content to reports/README.md. This README is an overwriteable mirror of the latest broad candidate report so opening the reports/ directory surfaces the current report first; the dated report remains the durable historical copy.
Single-Ticker Markdown Report
When the user gives a single IPO ticker and asks for an analyst report, use the report generator after archived facts and the analysis dataset are current:
.venv/bin/python scripts/build_analysis_dataset.py --as-of YYYY-MM-DDTHH:MM:SSZ
.venv/bin/python scripts/generate_ipo_report.py 06658 --stage auto
The generator writes reports/{date}_{ticker}_{stage}_analysis.md by default. Use --stdout for a dry run, --stage T0_prospectus to force a prospectus-stage report, or --stage T1_allotment only when structured T1 demand exists.
If the ticker is absent from data/snapshots/analysis_model_v0_dataset.csv, use hk-ipo-archivist first to archive the IPO facts and rebuild the analysis dataset before generating the report.
Generated prediction reports must remain stage-safe:
- Analyst Markdown reports should be written in Simplified Chinese by default, while preserving ticker symbols, stage codes, rule ids, source paths, and stable error tags in their original machine-readable form.
- T0 reports use only prospectus-stage fields and T0 calibration.
- T0.5 reports may add archived
ipo_market_heatrows, but must label them as non-official, live market-heat snapshots and includeobserved_at, provider, and source path. - T1 reports may add allotment demand fields and T1 calibration.
- T2/D1 is the intended sell window; D5/D20/D60 returns are never shown as prediction inputs and are reserved for later review cards.
- Every report must include a concrete stage calendar for the ticker: T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date.
T0.5 Market Heat Overlay
Use rules/ipo_score_v0_5_market_heat_trial.yaml when the user asks to include subscription-period heat before official allotment results.
T0.5 discipline:
- Use
hk-ipo-archivistfirst to archive the raw source page and structuredipo_market_heatrows. - Keep T0.5 separate from official T1 demand. Do not copy T0.5 margin multiples into
ipo_demand.public_oversubscription_times. - Keep third-party final history, such as
external_ipo_history.public_oversubscription_times, separate from T0.5. It is useful for post-hoc calibration but is not available at the original T0.5 decision time. - Treat raw margin multiples as less reliable when IPOs are at different points in their subscription windows.
- Freeze the
observed_attimestamp in the report so later T1/D1 reviews can test whether the heat signal helped. - Write T0.5 conclusions as watchlist upgrades/downgrades, not as final high-conviction subscription calls.
T0.95 Late-Order Heat
Use rules/ipo_score_v0_95_final_heat_trial.yaml when the user can still place an IPO order near the subscription cutoff and asks to use near-final market heat.
T0.95 discipline:
- Treat
T0_95_final_heatas its own decision stage: later than ordinary T0.5, earlier than official T1 allotment results. - The key condition is executability. A T0.95 snapshot is valid only if
observed_atis before the user's actual order, amend, or cancel cutoff. - Use archived
ipo_market_heatrows withstage = 'T0_95_final_heat'when available. If onlyT0_5_market_heatrows exist, explicitly state that the report is using an earlier heat snapshot, not a true T0.95 snapshot. - Historical final public oversubscription from
external_ipo_historymay be used as a calibration proxy for near-final heat buckets, because T0.95 is close to the final demand state. It must still be labelled as post-hoc calibration, not as data that was visible in the live case. - Official allotment-result fields, final T1 public oversubscription, grey-market prices, and D1 returns remain forbidden as live T0.95 inputs unless they were actually available before the user's executable order cutoff, which should be rare and must be documented.
- T0.95 recommendations may be stronger than T0.5 watchlist language, but they must include expected allocation probability: very strong heat often improves D1 payoff odds while sharply reducing one-lot win rate.
Recent Listing Review Overlay
When producing a broad candidate report, latest IPO list refresh, or cross-IPO subscription ranking, include a recent listed-IPO review unless the user explicitly asks for a narrow single-name answer.
Review discipline:
- Use the last 30 calendar days ending at
data_as_ofby default, or the user-specified window when provided. - Define the sample explicitly by listing-date range and listing method.
- Build a compact table with one row per recent IPO covering structure, fundamentals, T1 allotment demand, D1 performance, and the PM lesson.
- Structure should include at least T0 score and the offer-size/minimum-subscription context when available.
- Fundamentals should be a short issuer-quality read from archived prospectus facts, not a long-term thesis.
- T1 performance should include public oversubscription, international placing demand, total score or decision band, and one-lot/application success when available.
- D1 performance should include D1 return and turnover when available. If D1 data is missing, label it as a
data_gapand do not infer break/non-break from blank fields. - Keep the review post-hoc: use it to calibrate live rules and base rates, but do not let D1/D5/D20/D60 facts leak into current unlisted candidate scores.
- Add a short mapping from the recent outcomes back to the current candidate batch, clearly distinguishing official T1 demand from non-official T0.5/T0.95 heat.
Output Standards
Every prediction card should include:
tickerstagedata_as_of- concrete T0/T0.95/T1/T2/D1 dates or windows for the ticker when applicable
rule_versiondecisiontotal_score- score breakdown
- probability forecast
- expected return framing
- key bull points
- key risks
- triggers for upgrade/downgrade
- exit plan
- explicit T2/D1 sell discipline
- source paths
Language standard:
- Write analyst reports, prediction cards, and review cards in Simplified Chinese by default.
- Keep field identifiers, model versions, score buckets, ticker symbols, and source paths as code-formatted English identifiers when they are part of the project data contract.
Every review card should include:
- linked prediction card
- actual IPO outcome
- direction correctness
- magnitude error
- reason correctness
- execution assessment
- error tags
- rule-change recommendation, if any
Quality Checks
Before finishing, confirm:
- The analysis stage matches the information set used.
- Later facts are not used in earlier-stage conclusions.
- Paths in durable files are repo-relative.
- Probabilities and scores are explicit.
- Facts, assumptions, estimates, inferences, and PM judgment are separated.
- Any rule update has a named trigger case and an effective date.