Install
$ agentstack add skill-bencharoenwong-parallax-workflows-parallax-load-house-view ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ● Filesystem access Used
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Load House View
When not to use
- Building a portfolio → use /parallax-portfolio-builder
- One-off scenario / what-if → describe inline to the portfolio skill, don't load as a view
- Single-stock evaluation → use /parallax-should-i-buy
Gotchas
- JIT-load _parallax/house-view/schema.yaml before extraction — it is the single source of truth for the YAML shape
- JIT-load _parallax/house-view/loader.md to see what consumer skills will validate (helps you produce a valid view first time). Note: loader.md §3 (Multiplier mapping) is a normative replay dependency per reasoning chain spec — changes to multiplier values, factor ordering, or composite formula MUST coincide with a
skill_versionbump and break replay byte-identity for chains pinned to prior versions. - PDF input — use the Read tool with
pagesparameter for >10 pages; do NOT defuddle PDFs (we want figure context) - PDF extraction is not deterministic, especially on large chunked PDFs — see the determinism note in Step 1.
- URL input — use the defuddle skill if Bash is available, else WebFetch
- Confirmation gate is REQUIRED — the uploader must explicitly confirm extracted YAML before save (uploader_confirmed=true). Saving without confirmation breaks downstream loaders.
- Always compute viewhash from the canonical tilts body per schema.yaml §"viewhash computation" — sorted keys, no comments, no empty fields
- Ask uploaderrole and basisstatement via AskUserQuestion — these are required-at-institutional fields and need explicit human input
- Auto-applied macro_regime → factor tilts (loader.md §3) MUST be surfaced to the uploader at the gate, not silently applied
- Confirmation gate persists a pre-edit snapshot (Step 3a) when uploader chooses 'Edit specific fields' — writes extractor's pristine draft to
.archive//pre_edit.yamlalongside the superseded view. No-edit confirmations skip this. - Every extraction attempt (Step 3b) logs an
extraction_attemptaudit entry toaudit.jsonl— whether or not it becomes a save. Capture disposition (confirmed/edited/reextracted/rejected) + draftyaml_hash per loader.md §6.2. Append it withaudit_chain.append_entry, never with the Write tool (Step 3b names the call). - Save (Step 4 step 10) computes a
version_diffblock vsparent_version_idand stashes it on the save audit entry. Only when this save supersedes a prior version. - Calibration manifest: Invoke
manifest_cache.load_manifest()during Step 4 (Write Phase) to resolve active calibration. HandleDeadStateNoFallbackor signature errors by logging a warning and falling back to the bundled-values default. - Reasoning Chains: Every save MUST invoke
chain_emit.emit_chain()(oremit_phase_0_chain()) to produce a compliance artifact at~/.parallax/reasoning-chains/. - Compliance Export: Use
--exportto generate a regulator-grade bundle. Validates hash-chain integrity before packaging. --whyis on-demand. Readsprovenance.yamlfirst when present; the latest derivation entry for the leaf controls the answer. If type ismacro_regime_rule, citerule_ref+trigger. If type isprose_extractionor noprovenance.yamlexists (legacy view), fall back to the prose.md targeted re-read. The saved house view never carries Parallax-derived overlays — augmentation happens just-in-time at consumer-skill use, with provenance recorded on the consuming portfolio/screen artifact, not on the view itself.- Operator verification: see [examples/testing-posture.md](../../examples/testing-posture.md)
Ingest a CIO house view (PDF / text / URL / wizard) into the Parallax workflow system.
Usage
/parallax-load-house-view
/parallax-load-house-view
/parallax-load-house-view
/parallax-load-house-view # wizard mode — guided manual entry
/parallax-load-house-view --status # show active view summary
/parallax-load-house-view --clear # remove active view
/parallax-load-house-view --extend 2026-09-30 # push valid_through forward
/parallax-load-house-view --re-pair # re-pair after manual prose edit (drift)
/parallax-load-house-view --edit # open YAML in editor; re-confirm on save
/parallax-load-house-view --export # export regulator-grade compliance bundle
/parallax-load-house-view --why tilts.factors.momentum # on-demand: why is this tilt set to what it is?
/parallax-load-house-view --why tilts.sectors.information_technology
/parallax-load-house-view --why factors.momentum # bare form — `tilts.` prefix auto-prepended
/parallax-load-house-view --version-history # show parent chain + per-version diffs from audit.jsonl
Where the view lives
~/.parallax/active-house-view/
view.yaml— canonical YAML per_parallax/house-view/schema.yamlprose.md— verbatim CIO narrative withpaired_yaml_hashfrontmatterprovenance.yaml— per-tilt derivation records (prose extraction / macro-regime rule / manual edit)audit.jsonl— append-only hash-chained log (consumers append; this skill initializes).archive/-/— superseded versions (kept forparent_version_idtraceability)
If ~/.parallax/active-house-view/ does not exist, create it on first save. Files are written 0600, the directory is 0700.
Workflow
Call ToolSearch with query "+Parallax" to load the deferred MCP tool schemas before the first mcp__claude_ai_Parallax__* call. JIT-load _parallax/house-view/schema.yaml (canonical structure) and _parallax/house-view/loader.md (consumer expectations) before extraction.
Step 1 — Detect mode and load source
If a path or URL was given: read the source via the appropriate tool. For PDFs:
- ≤10 pages: use
Readwithpagesparameter in one call; proceed to Step 2. - >10 pages: use streaming extraction — read in 5-page chunks via
Readwithpages: "N-(N+4)", parse YAML incrementally, merge results. Trackextraction_confidenceper chunk (if a chunk fails to parse, flag ≤ 0.5 for that chunk and continue). Merged result proceeds to Step 2 with average confidence score across chunks.
Determinism note. Chunked extraction on a large PDF is the least deterministic path in this skill — re-running the same document can produce different draft values. Do not present it to the uploader as a precise read of the source. Surface a lower confidence when the source is long or dense, and rely on the Step 3 confirmation gate, not on repeated extraction attempts, to reach a value the uploader trusts.
For URLs: use defuddle or WebFetch. Skip the wizard and proceed to Step 2.
If no source was given (wizard mode): walk the uploader through the schema interactively in the order below, using one AskUserQuestion invocation per numbered group (not eight separate prompts). Skip any dimension the uploader leaves neutral.
- Identity: view name, uploader role (CIO / PM / Investment Committee / Strategist / Other), basis statement, effective date, valid_through (or
auto_expire_days). - Macro regime: growth (slowing / steady / accelerating / null), inflation (disinflation / benign / sticky / accelerating / null), rates (cutting / holding / hiking / null), riskappetite (riskon / neutral / risk_off / null).
- Components:
econometrics_phase(macro backdrop),valuation_state(valuation),market_entropy(market state),psychological_wavelength(sentiment) — each on -2 / -1 / 0 / +1 / +2. - Factors: value, profitability, momentum, lowvolatility, tradingsignals — each on -2 / -1 / 0 / +1 / +2.
- Sectors: present GICS sector keys; uploader picks the ones with a view, then sets each on the same -2 to +2 scale.
- Regions: present broad keys (developedmarkets, emergingmarkets, etc.); offer per-country drill-down only if the uploader names specific countries.
- Styles & themes: offer a free-text follow-up for any thematic conviction.
- Excludes: free-text list; for each exclude, ask for a one-sentence reason.
Default to multi-select where the schema allows. Capture extraction_confidence as 1.0 for wizard-supplied values (the uploader is the source).
Step 2 — Extract structured tilts
Produce a draft YAML conforming to _parallax/house-view/schema.yaml. For each field, also produce a extraction_confidence score (0.0-1.0) representing your confidence in the extraction.
Component extraction. Before extracting sector/region/factor tilts, read the source for component-level conviction and populate tilts.pillars (field identifier preserved for data-contract stability):
| Component | Look for | Map to | |---|---|---| | econometrics_phase | Macro backdrop framing — "constructive on growth", "recessionary", "stagflation", "soft landing" | +2 very constructive → -2 recessionary/stress | | valuation_state | Valuation commentary — "stretched multiples", "cheap vs history", "PE reasonable", "dispersion" | +2 very undervalued → -2 highly overvalued | | market_entropy | Technicals/vol/flows — "orderly rotation", "elevated VIX", "breadth deteriorating", "heavy issuance" | +2 low/ordered → -2 high/disordered | | psychological_wavelength | Sentiment/RORO — "risk-on backdrop", "frothy retail", "capitulation", "fear index elevated" | +2 very positive → -2 very negative |
Components are usually coarse — a prose view rarely articulates sub-factor level. If the source is silent on a component, leave at 0 and flag pillars extraction_confidence ≤ 0.6. Component scores are encoding-only (per loader.md §3): they are stored but do NOT auto-translate into factor multipliers.
Hedged or split-sector language is a known failure mode. When the source uses phrases like:
- "constructive on tech but selective in semis"
- "modestly underweight financials"
- "barbell of growth and value"
- "tactical opportunity"
…do not collapse to a single integer without recording uncertainty. Set the confidence to ≤ 0.7 and note the ambiguity in extraction.extraction_notes.
Factor canonical names. Use profitability (not quality) and low_volatility (not defensive) when extracting fresh. The synonyms remain valid for backward compatibility but new extractions should use the canonical set: value, profitability, momentum, low_volatility, trading_signals.
Region granularity. For prose that names specific countries (Mexico, Brazil, Indonesia, etc.), use the country-level region keys rather than collapsing into broad buckets (em_ex_china, apac_ex_japan). The full country list is in schema.yaml §regions. When the view speaks in broad terms ("EM ex-China overweight"), use the broad key. When specific ("overweight India and Mexico"), use per-country keys.
Macro regime auto-mapping (per loader.md §3): if the source implies a macro regime, populate tilts.macro_regime AND compute the factor-tilt deltas. Show the uploader the raw regime + the resulting factor deltas at the gate so they can override.
Cross-asset views are out of scope. If the source carries views on fixed income, FX, credit, commodities, or alternatives (common in full TAA workbooks), capture them in extraction.extraction_notes as "DROPPED (out of scope): " so the uploader knows what was lost. Do NOT silently discard.
Required uploader-supplied fields (cannot be extracted from source — ask via AskUserQuestion after extraction):
metadata.uploader_role(single-select: CIO / PM / Investment Committee / Strategist / Other)metadata.basis_statement(free text — what's the basis for this view? IC meeting, strategy memo, regulatory mandate)metadata.effective_date(date, default today)metadata.valid_throughORmetadata.auto_expire_days(date or int; defaultauto_expire_days = 90)
Step 3 — Confirmation gate (REQUIRED before save)
> Architectural note: the saved house view is PURE — it carries only what the source document said + what the uploader confirmed at this gate. Parallax-derived augmentation is deferred to just-in-time lookup at consumer-skill use (e.g., when /parallax-portfolio-builder detects the active view is silent on a dimension it needs for a specific portfolio decision). The augmentation provenance lives on the consuming portfolio/screen artifact, never on the saved house view. The gap_detect and gap_suggest modules in _parallax/house-view/ remain — they get JIT-loaded by consumer skills.
> Shared module. The gate display + disposition loop lives in _parallax/house-view/gate_present.py so the in-progress /parallax-make-house-view skill can reuse it. This Step describes how parallax-load-house-view uses the module; the module itself is the source of truth for display rendering and disposition vocabulary. Step 3a (pre-edit snapshot persistence) and Step 3b (extraction_attempt audit logging) remain caller-side responsibilities — the module returns the snapshot in GateResult but never writes audit rows or .archive//pre_edit.yaml. Step 3b's row is appended with audit_chain.append_entry (see §3b); it does not go through view_commit, which derives action from its --mode and has no extraction-attempt mode.
JIT-load _parallax/house-view/gate_present.py and construct a GateContext:
source_label: the filename / URL /"wizard"identifier from Step 1.uploader_present=True(ingest framing — "Source:" prefix, extraction verb tense).confidence_map: per-category confidence fromextraction.extraction_confidence(keys:sectors,regions,factors,macro_regime; the maker path additionally carriespillars, which this skill omits).extraction_attempt_action=True(this skill always logs theextraction_attemptrow per §3b below).disposition_options=["confirm", "edit", "re_extract", "reject"].
Call gate_present.run_gate_loop(draft, context, dispose_fn=..., edit_fn=...). The two callbacks bridge to AskUserQuestion:
dispose_fn(prompt) -> str— printprompt.displayverbatim, then askprompt.questionwithprompt.optionsviaAskUserQuestion. Return the chosen disposition keyword.edit_fn(current_draft, context) -> (edited_draft, edit_notes | None)— loop onAskUserQuestionper flagged field (the LOW-CONFIDENCE block from the rendered prompt is the suggested order). After all edits land, optionally ask "One line on what you changed and why? (optional)" and pass the response asedit_notes. Return the post-edit draft. The module re-renders the gate and re-invokesdispose_fnuntil the uploader confirms or branches to a terminal disposition.
The module returns a GateResult with disposition set to one of "confirm", "edited", "re_extracted", or "rejected". Branch as follows:
"confirm"— proceed to Step 4 withresult.final_draft. No pre-edit snapshot to persist. Write theextraction_attemptaudit row per §3b withdisposition="confirmed"anddraft_yaml_hash= sha256(canonical) ofresult.final_draft."edited"— proceed to Step 3a usingresult.pre_edit_snapshot(the pristine pre-edit draft, which the module captured automatically on first entry into the edit branch) and optionallyresult.edit_notes. Then write theextraction_attemptaudit row per §3b withdisposition="edited"anddraft_yaml_hash= sha256(canonical) of the pre-edit snapshot — not the post-edit confirmed draft (that hash goes intoview.yamlvia Step 4'sview_hash). The pairextraction_attempt.draft_yaml_hash+save.view_hashis the audit signature of "what the extractor produced → what the uploader shipped." Proceed to Step 4 withresult.final_draft."re_extracted"— discard any holding buffer; do not writepre_edit.yaml. Write theextraction_attemptaudit row per §3b withdisposition="re_extracted", the rejected draft's hash, and the hint (collected via a follow-upAskUserQuestion). Re-run Step 2 with the hint added to extraction context and return to Step 3.- **`"reje
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: bencharoenwong
- Source: bencharoenwong/parallax-workflows
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.