[33mcommit afa857813ed95cccb4d04474d29f862000e855b9[m[33m ([m[1;36mHEAD[m[33m -> [m[1;32mmain[m[33m, [m[1;31morigin/main[m[33m, [m[1;31morigin/HEAD[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Sat Jun 27 03:06:07 2026 +0800

    feat: per-exchange error-handling policy for order retries
    
    Classify exchange API errors per-exchange into explicit behaviours instead of
    treating every failure as retryable. Fixes the cancel storm where Bybit 110001
    ("order not exists / too late to cancel") was retried until max_retries_allowed,
    burning rate-limit budget on already-gone orders.
    
    - ErrorAction taxonomy: TERMINAL_SUCCESS / RETRY / RATE_LIMITED / FATAL
    - ExchangeErrorPolicy ABC + Binance/Bybit/Default impls with code->action tables
    - Credentials.to_error_policy() factory; injected OMS -> OPM -> OrderExecutor
    - cancel/place error paths consult the policy; unknown codes keep RETRY so
      behaviour is unchanged for everything not explicitly classified
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit f438bc400b21764bb95d5646f821165d0949ded7[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Sat Jun 27 02:41:55 2026 +0800

    fix: cap backlog retry concurrency to avoid rate-limit bursts
    
    Bound on_retry_backlog's concurrent retries with a semaphore
    (MAX_CONCURRENT_BACKLOG_RETRIES=3). reserve-at-check caps the sustained
    request rate; this caps the instantaneous burst so a backlog-clearing
    pass can't spike the exchange's 1s rate-limit window.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit 1a70ab90d8e7e266bc8f785596c6c051588c8537[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Fri Jun 26 16:04:28 2026 +0800

    chore: bumped to 1.4.5

[33mcommit 5496669997b4b085f3340b87fc02c982f1833804[m
Merge: 3b1d596 6e2d454
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Fri Jun 26 15:54:50 2026 +0800

    Merge pull request #25 from balaenaquant/feat/oms_optimizations
    
    Feat/oms optimizations

[33mcommit 6e2d45456d170e74913fd98ba3cdc66901e61a94[m[33m ([m[1;31morigin/feat/oms_optimizations[m[33m, [m[1;32mfeat/oms_optimizations[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 26 15:40:03 2026 +0800

    fix: dedup order backlog by client_order_id
    
    A stuck order re-encountered by cancel_multi_limit_order each
    on_order_placement tick (or re-hit by on_order_expiry_check) was
    appended to the backlog again every time, growing it unbounded. Add
    OrderPoolHandler.dedup_append, which skips the append when an entry
    with the same client_order_id is already queued, and route every
    append site through it. Hoist client_order_id onto the BacklogDetails
    base so the check is type-safe across all backlog variants.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit a03876d5c9b05da3eaa86db9a156ba4cb61d4fb9[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 26 15:05:17 2026 +0800

    fix: align Bybit soft-limit semantics with Binance
    
    soft_limit_percent was applied as "fraction to keep" on Binance but
    passed straight into Bybit's with_buffer as "fraction to remove", so
    0.8 kept 80% on Binance but only 20% on Bybit. Pass 1 - soft_limit
    as the buffer so both keep the configured fraction.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit 3e0eeb7edfeef3385b6ead39bb902790e5683326[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 26 14:46:30 2026 +0800

    fix: OMS position accounting and order-pool concurrency
    
    - update_positions: store cumulative filled_size as the baseline (was
      storing the per-update slice), fixing fill over-counting from the 3rd
      fill update onward; drop fill baseline on terminal status
    - on_order_update: subtract unfilled remain_size from pending on
      PARTIALLY_FILLED_CANCELLED (mirrors CANCELLED) to stop a pending leak
    - resync_order_pool: snapshot the old pool for timer carryover and swap
      the rebuilt pool in once after the loop under the pool lock (was
      reassigning mid-loop, resetting expiry timers and dropping updates)
    - route every order_pool access through get_order_pool(); keep each
      critical section a synchronous leaf so the lock cannot deadlock
    - on_order_expiry_check: hold delta_lock only across the cancel/replace
      window, run price discovery lock-free, and append backlog once at the
      end instead of holding the backlog lock across both gathers
    - redact exchange headers in rate-limit error logs to rate-limit fields
    - gitignore rotated *.log.* files
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit 5d9380e7b4ffa3969a0438fa60cdbb90da232a00[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 26 12:25:19 2026 +0800

    fix: added rate limiter guards to missed endpoints

[33mcommit d6ddebc927a285410eedbfdebb4981666bb41617[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 25 23:17:30 2026 +0800

    feat: optimized retry backlog

[33mcommit a988f42a74b564b65798c8128e3882da4a254070[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 25 12:48:52 2026 +0800

    feat: atomic local rate limit handler

[33mcommit 3b1d5968768497b9589690757eca03f687b6bb51[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Jun 25 19:46:55 2026 +0800

    fix: PublicMetricStream and PublicNatsDatasourceStream added grpc retry

[33mcommit 56c14e11671a82d273cb39caec2f4e05205221f5[m
Merge: 4a3611e b4e1c4e
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Thu Jun 25 16:52:51 2026 +0800

    Merge pull request #24 from balaenaquant/fix/decouple-metric-insert-from-routing
    
    fix: AlphaExecutor bug

[33mcommit b4e1c4e9ed99ca31c798aa51b807def4bc1c898b[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Jun 25 16:52:08 2026 +0800

    fix: AlphaExecutor bug

[33mcommit 4a3611ee248d038e79d163375e713e0d8253d54a[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Wed Jun 24 12:14:25 2026 +0800

    feat: removed on_health_check trigger for AlphaExecutor

[33mcommit f627cb77e9b4233e2bc2a511ae0150cd5d4da30e[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 14:06:01 2026 +0800

    feat: bumped bq-nats-client to 0.1.3

[33mcommit a74a231cebd3fb9cb93df8d0e2d873eeb0375cf5[m
Merge: 876d4a7 f93bbfa
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Mon Jun 22 12:09:28 2026 +0800

    Merge pull request #23 from balaenaquant/feat/periodic-resync
    
    feat(execution): periodic REST resync fallback in AlphaExecutor

[33mcommit f93bbfa12eabbf98559537fd7ca1017b57221d08[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 12:00:38 2026 +0800

    feat(execution): periodic REST resync fallback in AlphaExecutor
    
    The flow-NATS WS feed can drop data, leaving alphas without fresh input so no
    signal is published. Add a timer-driven fallback that re-triggers every alpha
    over REST, independent of the WS:
    
    - on_periodic_resync pulls the latest data for each alpha via the dataloader and
      re-emits its signal. Each alpha runs in its own task, so one alpha's fetch
      retries or failures never block the others.
    - _resync_alpha retries transient REST failures (bounded, with backoff).
    - The signal-emit path is extracted into _emit_signal, shared by the WS path
      (on_event) and the resync so both produce identical signals.
    - Scheduled via aion Trigger.Interval at finest_signal_interval / 2 by default
      (e.g. a 1h alpha resyncs every 30m); overridable via resync_interval, threaded
      through run_portfolio. Disabled with a warning if no topic declares an interval.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit 876d4a7c92f2a50de5c742f6af9fda05b16be5a7[m[33m ([m[1;33mtag: [m[1;33m1.3.0[m[33m)[m
Merge: 8a574e0 d271135
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Mon Jun 22 11:20:29 2026 +0800

    Merge pull request #22 from balaenaquant/feat/signal-namespace
    
    feat(stream): verbatim transport + per-tenant signal routing namespace

[33mcommit d271135697d1bb00ef8663d15511803592f608bc[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 11:19:47 2026 +0800

    updated some comments

[33mcommit 6653ede98e528686051d1f90fce728cdba85a7cd[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 11:12:37 2026 +0800

    refactor(stream): verbatim transport; namespace alpha+portfolio signal routing
    
    PublicMetricStream blanket-prepended `publish_prefix` ("portfolio_signal") to
    every core publish, so an alpha signal meant for `alpha_signal.<id>` went out on
    `portfolio_signal.alpha_signal.<id>` and the PortfolioExecutor's `alpha_signal.*`
    subscription never matched — the alpha->portfolio link was silently dead and the
    portfolio ran off signal_df only.
    
    Make PublicMetricStream a verbatim NATS transport and move subject construction
    to the callers:
    - MetricBuilder owns the dashboard-insert namespace (insert_prefix, e.g.
      aegis_ts) and prefixes every metric it publishes.
    - Routing subjects live in a new adrs/subjects.py, shared by the executors and
      the OMS without an import cycle.
    
    Namespace both routing channels by an optional tenant token so a shared NATS
    server only delivers a tenant its own traffic (NATS wildcards are whole-token,
    so the namespace must be its own token):
    - alpha_signal.<ns>.<id>  (AlphaExecutor publish / PortfolioExecutor subscribe)
    - portfolio_signal.<ns>.<id>  (PortfolioExecutor publish / OMS subscribe)
    
    signal_namespace + insert_prefix are threaded through run_portfolio and the OMS
    (defaults preserve legacy single-tenant subjects).
    
    Also fix the alpha_id_map desync: run_portfolio renamed the Alpha objects' ids
    but not the portfolio's frames, so a live signal (published under the renamed id)
    never matched the portfolio's lookup. _remap_portfolio_ids now rewrites
    metadata_df/weight_df/signal_df with the same map, and PortfolioExecutor.on_signal
    drops signals for alpha ids it doesn't hold instead of polluting lastest_signal.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit faef77b1d4706d97cff880cfcb73857ff8ab9153[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 09:35:31 2026 +0800

    feat(execution): optional signal_namespace to isolate alpha signals per tenant
    
    PortfolioExecutor subscribed to `alpha_signal.*` and AlphaExecutor published to
    `alpha_signal.<alpha_id>`. On a shared NATS server every PortfolioExecutor
    therefore received every tenant's alpha signals, and on_signal wrote them
    straight into the portfolio's lastest_signal dict (update_signal does an
    unfiltered insert) — a cross-tenant data leak, not just wasted traffic.
    
    NATS `*` matches a whole token, so `alpha_signal.<user>*` can't filter when the
    id is one token. Add an opt-in `signal_namespace` (threaded through
    run_portfolio to both executors) that makes the namespace its own token:
    publish `alpha_signal.<ns>.<alpha_id>`, subscribe `alpha_signal.<ns>.>`. Default
    None keeps the legacy flat subject, so existing single-tenant runs are
    unchanged.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit 8a574e00ecd522dad440181b63957a042a813030[m
Merge: dab6472 c91fb8a
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Mon Jun 22 02:03:51 2026 +0800

    Merge pull request #21 from balaenaquant/fix/order-qty-precision
    
    fix(oms): quantize order qty + notional bounds against worst-case resting price

[33mcommit c91fb8abf4884dec24192c105983083b7ee7cbde[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 02:03:06 2026 +0800

    fix(oms): derive notional qty bounds from worst-case resting price
    
    _make_context computed min_qty/max_qty from min_notional/max_notional divided
    by the current market price. But limit orders rest away from the touch — buys
    fill cheaper, sells fill dearer — so order value at fill differs from value at
    market. An order could clear min_notional against the market price yet be
    rejected for order value once it rested at the (lower) limit price.
    
    Bound each side by its worst-case resting price via NOTIONAL_PRICE_SLIPPAGE
    (0.5%): min_qty against market*(1-slippage) (buy floor), max_qty against
    market*(1+slippage) (sell ceiling). Mirrors BqOrderExecutor's adjusted-price
    sizing, applied uniformly and side-correctly in the base.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit 9e03aadca26447946d7675fd620b03ae6c905d44[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 01:58:35 2026 +0800

    fix(oms): quantize order qty to quantity_precision in split_order_quantity
    
    The naive base OrderExecutor.split_order_quantity returned the raw target
    quantity (a high-precision Decimal) as the order size. Bybit (and other
    exchanges) reject any qty that isn't a multiple of the instrument lot step
    with retCode 10001 "Qty invalid", so every order from a portfolio using the
    default splitter failed to place.
    
    Round (truncate) each returned size to symbol_info.quantity_precision via
    Calculate.round_with_precision — the same helper the internal BqOrderExecutor
    uses through generate_gaussian_order_size. Sizes that truncate below min_qty
    are dropped (too small to place).
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

[33mcommit dab6472e9a01f1f13e92ef10fc0e9cc64ccba237[m[33m ([m[1;33mtag: [m[1;33m1.2.8[m[33m)[m
Merge: bf1c0c8 009a9ad
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Mon Jun 22 01:15:32 2026 +0800

    Merge pull request #20 from balaenaquant/fix/live-oms-mixed-interval
    
    Live-OMS support for mixed-interval portfolios

[33mcommit 009a9ad9a4caa23a281bdd6bf6b85b942494ad6e[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jun 22 01:06:38 2026 +0800

    feat: live-OMS support for mixed-interval portfolios
    
    - datamap._init: tolerate the speculative 'today' bar fetch failing (slow
      topics like 24h have no closed bar yet -> datasource 400); fall back to the
      historical data instead of crashing the whole datamap.
    - run_portfolio: expose max_signal_age; default to max(2h, 2*finest_interval)
      so daily/slow portfolios aren't rejected by a flat 2h staleness rule (never
      tighter than legacy 2h -> intraday unaffected).
    - generate_signal_df: opt-in forward_fill_to_end (live only; default off so
      backtests are byte-identical) -- forward-fill every alpha column + carry the
      last decision to snapped_end so a mixed-cadence signal_df reaches ~now.
    - bump version 1.2.7 -> 1.2.8.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

[33mcommit bf1c0c898ea2007653b4c6e6faf9a41cb792eb15[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sun Jun 21 12:57:54 2026 +0800

    feat: updated run_portfolio and cleaned up some examples

[33mcommit 3c06e835061c1b48b2513d9481824238d5b00d3e[m
Merge: 1887e3e 05b979d
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Fri Jun 19 16:01:34 2026 +0800

    Merge pull request #19 from balaenaquant/feat/portfolio_oms_example
    
    Feat/portfolio oms example

[33mcommit 05b979d6d838d7a4a148888b2c04ae0e3390b1e2[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 19 15:59:50 2026 +0800

    feat: added running example

[33mcommit 8ca63a0478d0aa7794071167f758aae5c996f3fc[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 19 15:18:36 2026 +0800

    feat: added examples and nats datasource stream

[33mcommit 1887e3e81e39df66da26dddbf7b91ccf5ad8c86b[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 19 14:32:08 2026 +0800

    feat: added example for oms

[33mcommit 69c8f412cbcb30552a2909e15f7fb558915b8e90[m[33m ([m[1;33mtag: [m[1;33mv1.2.6[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 18 03:35:06 2026 +0800

    chore: bump v1.2.6

[33mcommit 98a8214f565af384b95a5ac9de130453b20e40c2[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 18 03:34:14 2026 +0800

    fix: imports for oms

[33mcommit b5bd542e426368cf6dcbccf09ba031d164901e49[m[33m ([m[1;33mtag: [m[1;33mv1.2.5[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 18 02:25:46 2026 +0800

    chore: bump v1.2.5

[33mcommit f80234f0200f5cce5f77c859e9e146528381b906[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 18 02:25:22 2026 +0800

    fix: updated oms path

[33mcommit 47d6e8c7187759db8ee48038ddaaf2eeaf873e88[m[33m ([m[1;33mtag: [m[1;33mv1.2.4[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 18 00:54:53 2026 +0800

    chore: bump v1.2.4

[33mcommit 3acc477383453c9661a266a00b94b91e925c832a[m
Merge: bb098ad 34b9ee3
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Thu Jun 18 00:53:56 2026 +0800

    Merge pull request #18 from balaenaquant/feat/base_oms
    
    feat: added base oms class

[33mcommit 34b9ee3db924b2c3756f4b000e575ea4b4d1ba73[m[33m ([m[1;31morigin/feat/base_oms[m[33m, [m[1;32mfeat/base_oms[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 18 00:52:58 2026 +0800

    feat: added base oms class

[33mcommit bb098ad47165fa698f4cc4fb769c613cf730de26[m[33m ([m[1;33mtag: [m[1;33mv1.2.3[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Jun 17 03:46:34 2026 +0800

    chore: bump v1.2.3

[33mcommit 9dc86f43449e274cf11f2770e3ff41653fd49890[m[33m ([m[1;33mtag: [m[1;33mv.1.2.2[m[33m)[m
Merge: 9e58e4e 4ccbeee
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Tue Jun 16 21:07:27 2026 +0800

    Merge pull request #17 from balaenaquant/feat/custom_nats_client
    
    Feat/custom nats client

[33mcommit 9e58e4e59bc8f976ce05cfde2a1c2ae5859c0c1a[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Jun 13 02:38:52 2026 +0800

    fix(portfolio): keep per alpha pnl column

[33mcommit 4ccbeee7c434c4bbd8832f0b1ab19802302c1096[m[33m ([m[1;31morigin/feat/custom_nats_client[m[33m, [m[1;32mfeat/custom_nats_client[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 12 11:59:03 2026 +0800

    feat: added new metrics for metrics builder

[33mcommit f032af9df693b25997f93275b7eddea1ffd844e8[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Jun 5 11:48:42 2026 +0800

    fix: signal type error

[33mcommit 3a8b21f2325271486f4470ad62c416b133d06018[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 4 15:29:15 2026 +0800

    feat: added caching for signal

[33mcommit 756de122dee45032e1b0a36c30bd6d28abe80a74[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Jun 4 14:50:45 2026 +0800

    fix: test_datasource.py old code

[33mcommit cad6d220630b5dd624082d7968fa31297d7c0717[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Jun 4 14:46:40 2026 +0800

    chore: bump to 1.2.1, move Portfolio to top-level, fix circular import
    
    - Move adrs.execution.portfolio → adrs.portfolio (top-level)
    - Portfolio.backtest() now returns (PortfolioPerformance, performance_df) tuple, matching alpha API
    - Add performance_df field to PortfolioReportV1Performance; fix compute/deserialize accordingly
    - Fix stale import in adrs.report.portfolio
    - Break adrs.data ↔ adrs.performance circular import via TYPE_CHECKING guard
    - Expose __version__ via importlib.metadata (single source of truth from pyproject.toml)
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

[33mcommit 0f160c3dacf5914cdadbdaeaefeac85747e41660[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Jun 4 13:43:42 2026 +0800

    feat: updated infra to use custom nats client implementation

[33mcommit 698671e8fbbeae8ef688315299fdc46649fe6c80[m
Merge: 3c03ae6 6d71004
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Wed Jun 3 15:07:53 2026 +0800

    Merge pull request #16 from balaenaquant/fix/merge
    
    fix: inconsistent data type during merge

[33mcommit 6d71004d03e857a3e7be29a14fd904ca7727805d[m[33m ([m[1;31morigin/fix/merge[m[33m, [m[1;32mfix/merge[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Jun 3 14:47:55 2026 +0800

    fix: inconsistent data type during merge

[33mcommit 3c03ae68efe30752e408949501fe1524be469e64[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 15:45:39 2026 +0800

    chore: bumped version to 1.2.0

[33mcommit c7f476b3ced9ff96aae60b6c72f4ba90022754ba[m
Merge: eb9de88 e336e2f
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Thu May 28 15:44:38 2026 +0800

    Merge pull request #14 from balaenaquant/worktree-progress-bar-download
    
    feat(data): two-level download progress bar

[33mcommit e336e2f51cdf83c6cecbb424e2016f4f61d9fce7[m[33m ([m[1;31morigin/worktree-progress-bar-download[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 15:43:25 2026 +0800

    feat(logging): switch default to RichHandler sharing console with Progress
    
    Use a shared rich Console (adrs.console.console) for both the
    Progress live region and the default logging stream handler. When
    Progress is active, RichHandler routes log records through the same
    Console, which prints them above the live region instead of
    interleaving with the bars.
    
    setup_logger default is now make_rich_stream_handler(). The colorlog
    factory remains available for callers that pass handlers explicitly.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit eb9de88afcef409929f6ea1411cbeac358e6dd74[m
Merge: 3903a3d 151e9a2
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Thu May 28 15:43:23 2026 +0800

    Merge pull request #15 from balaenaquant/fix/dependency_update
    
    fix: updated aion dependency and minor bug fixes

[33mcommit 65743f67575da4d6f35cd277b071d595092780a0[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 15:40:52 2026 +0800

    fix(data): redirect stdout/stderr through Progress so logs render above bars
    
    Without redirection the colorlog stream handler writes into the same
    terminal region as the rich live display, interleaving log lines with
    the bars. redirect_stdout/stderr=True makes rich capture both streams
    and reprint them above the live region.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 151e9a211ae48a9b4b8f86243f2642eca78f5585[m[33m ([m[1;31morigin/fix/dependency_update[m[33m, [m[1;32mfix/dependency_update[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu May 28 15:17:49 2026 +0800

    fix: updated aion dependency and minor bug fixes

[33mcommit 01a60eb5ef2c01871e7b43895f921329ad820af3[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 14:24:17 2026 +0800

    test(data): drop inert progress_mod.progress_context monkeypatch
    
    datamap.py binds progress_context via from-import, so the call site
    resolves through dm_mod only — patching progress_mod has no effect.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 02fca70e82aec756ebfe89e0100fe1dc1cf5bae2[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 14:19:00 2026 +0800

    feat(data): show outer per-topic progress bar in Datamap.init
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 1dcaf65d762e19e39314c74ad4147aeac2b85791[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 14:17:06 2026 +0800

    refactor(data): hoist end_ms and drop stray comment in query_paginated
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 57a3f22b25d2cb91b89e958d381faeb64eb02712[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 14:09:25 2026 +0800

    feat(data): show per-page inner progress bar in query_paginated
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 52fa7215b06ffcd748478a62d9784a1acb2e369a[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 14:02:19 2026 +0800

    feat(data): add progress_context with outer task and inner_task tracking
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit dfdbd71d71c6bcb384dd3791688c620187279f72[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 14:00:27 2026 +0800

    refactor(data): drop forward-looking rich imports from progress skeleton
    
    The five column classes will be re-added in the next commit alongside
    the _make_progress function that uses them. Removing the inert
    # noqa: F401 suppressions and "used in Task 3" comments now.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 070418954bb34c8a214cab12f2bd7f1a428070e4[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 13:56:03 2026 +0800

    feat(data): add progress module skeleton with no-op fallback
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit a1cfc6eeb97f0836032d6cbc6baf7da024155541[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 13:51:54 2026 +0800

    build: promote rich to direct dependency
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit cf032e627f2c81649f9f780b4e04661c4ba82a91[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 13:50:55 2026 +0800

    build: swap bq-aion-rs for aion-scheduler
    
    bq-aion-rs has no macOS wheel; aion-scheduler is the cross-platform
    replacement that exposes the same `aion` Python package (Scheduler,
    Trigger). No source changes needed.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit ef8c7499d1eb01f41a3263156ac2f88328d89256[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 13:43:44 2026 +0800

    docs: implementation plan for download progress bar
    
    Six TDD-style tasks: rich dep promotion, progress module (no-op +
    active), inner-bar wiring into query_paginated, outer-bar wiring into
    Datamap.init, plus manual TTY verification.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 70b2e48355d6af437be9eb5f81cc5c9005a2958f[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu May 28 13:37:46 2026 +0800

    docs: spec for download progress bar
    
    Two-level progress UI (topics + pagination) via shared rich.progress
    instance, bridged through a contextvar so query_paginated can discover
    the renderer without arg threading.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

[33mcommit 3903a3d4c59682d073461d0b892fda921bbd617b[m
Merge: 8ead4a1 304f6b3
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Wed May 27 19:40:05 2026 +0800

    Merge pull request #13 from balaenaquant/refactor/portfolio
    
    Refactor/portfolio

[33mcommit 304f6b3f4015ebd41879b179f7e239d2faced9fc[m[33m ([m[1;31morigin/refactor/portfolio[m[33m, [m[1;32mrefactor/portfolio[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed May 27 19:38:02 2026 +0800

    chore: some name change and trimming logs

[33mcommit c3926c1d80fe16ef6ba4749d7ebb13b9065b41c6[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Tue May 26 17:02:55 2026 +0800

    chore: clean up"

[33mcommit d201e6392696db1dd0b6221ac0f862e99611d0d6[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Tue May 26 17:00:28 2026 +0800

    chore: rename run

[33mcommit 4a0bd4d58bae298fad872ffddb5c678d2f4832c9[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Tue May 26 14:19:30 2026 +0800

    feat: live portfolio execution with examples

[33mcommit 3ceae9808e38dc55f6032f8481c2f3e2f629d8d5[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Sat May 23 17:24:25 2026 +0800

    chore: clean up

[33mcommit 6f16aa3cfb80491d6bc0d383a147a3951e2b99fc[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Sat May 23 17:01:13 2026 +0800

    feat: connectors, portfolio and executor implemented

[33mcommit 8ead4a113937ae7dab2bfe902b390b2824ac504a[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri May 15 15:56:52 2026 +0800

    chore: bump to version 1.1.5

[33mcommit d857760f1d47f8a1dd97fe2a0f495b06c30e02a3[m
Merge: 7a42b40 bada047
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Fri May 15 14:11:55 2026 +0800

    Merge pull request #12 from balaenaquant/feat/connectors
    
    Feat/connectors

[33mcommit bada047f1f3c1b1e373b0418fb4af0806471be13[m[33m ([m[1;31morigin/feat/connectors[m[33m, [m[1;32mfeat/connectors[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri May 15 13:40:18 2026 +0800

    chore: missed init

[33mcommit 0f4d47c387d92e46db153cda5c1767b7f48eea31[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri May 15 13:36:00 2026 +0800

    refactor: naming and function streamlining

[33mcommit 88d4c511ad66399fe579ab1b61e3001f1b93a8e7[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed May 13 15:07:53 2026 +0800

    chore: rename

[33mcommit e7d00b5325defafd20b4526e263c2add8ebabc95[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed May 13 15:02:21 2026 +0800

    feat: added publish and subcribe to db

[33mcommit 9be237616630e778726fc81565e4f591fe5a68d1[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed May 13 14:31:30 2026 +0800

    refactor: db to just design around nats

[33mcommit 41cf9a036f022300ec3cbab940a991a421f8296d[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed May 13 13:25:41 2026 +0800

    chore: added newly added classes to init

[33mcommit ea29f21fd060ea79f255a571175cc2be435bd824[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed May 13 13:14:19 2026 +0800

    feat: added type Message for stream

[33mcommit abb4d8db7c8b04d5d1529103b4e423f246d2e13f[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed May 13 13:10:59 2026 +0800

    feat: defined protocols for database and stream

[33mcommit 7a42b4042a4a9376ee3f9f602385eaa0d238fc97[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Mon May 11 16:15:21 2026 +0800

    chore: bump v1.1.4

[33mcommit 75d053561e1ff41f443b13c44a4005cd21634ee1[m
Merge: 5359d2f b67c80c
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Mon May 11 16:14:06 2026 +0800

    Merge pull request #11 from balaenaquant/fix/trades_and_cache
    
    fix: fixed premature abs for trades and data inconsistency with parqu…

[33mcommit b67c80cf9a52ae67191737117cab7f9952acb340[m[33m ([m[1;31morigin/fix/trades_and_cache[m[33m, [m[1;32mfix/trades_and_cache[m[33m)[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Mon May 11 16:09:34 2026 +0800

    fix: fixed premature abs for trades and data inconsistency with parquet files

[33mcommit 5359d2ff91dbf2d8c8a9352e0ed0ad37d3dcd4b4[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Mon May 11 12:02:33 2026 +0800

    chore: bump to 1.1.3

[33mcommit d42bf5720353de7a422beb59e029022df4e5bcac[m
Merge: 1d64bb8 dc8b2a5
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Mon May 11 11:46:22 2026 +0800

    Merge pull request #10 from balaenaquant/fix/dt_aware_inconsistency
    
    Fix/dt aware inconsistency

[33mcommit dc8b2a59d94022411776f71154370cc72aa90113[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Sun May 10 16:34:39 2026 +0800

    fix: revert round for num trades for int in some edge cases

[33mcommit 2e95844cee87a1b112971e75ecc487cf19c6e91e[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Sun May 10 16:18:05 2026 +0800

    fix: datamap loading for latest data, cache file reading data type mismatch

[33mcommit 53f8ddfd0197c619d818abb5f9d1eb3789d86769[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri May 8 14:30:02 2026 +0800

    fix: datetime inconsistency

[33mcommit 1d64bb8a88ae4b78f46ee688d0bd87529eb858f6[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri May 8 13:11:10 2026 +0800

    chore: bump version to 1.1.2

[33mcommit 28b53c8d2e1d0683ae1626581d063a500f3033eb[m
Merge: c8e54c7 add0bbd
Author: Wong Jian Wen <108650061+FungusSpore@users.noreply.github.com>
Date:   Fri May 8 13:09:33 2026 +0800

    Merge pull request #9 from balaenaquant/fix/issue-8
    
    fix: removed all rounding for sensitive metrics

[33mcommit add0bbd08b8254446bbeef1c189cce519c1d349f[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri May 8 12:59:26 2026 +0800

    fix: removed all rounding for sensitive metrics

[33mcommit c8e54c768174e19a0fdba58d0544beefb92472f8[m[33m ([m[1;32mfix/rounding[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Apr 30 17:14:03 2026 +0800

    feat: updated version to 1.1.1

[33mcommit 365eb06bc3a9badd7d8dcc05ab572a55eedeca09[m
Merge: b7b3a30 4856b93
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Thu Apr 30 17:12:08 2026 +0800

    Merge pull request #7 from balaenaquant/chore/missed_dependency
    
    chore: added httpx dependentcy in pyproject

[33mcommit 4856b93fab664f6df3206357f01459b689859a69[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Apr 30 11:50:11 2026 +0800

    chore: added httpx dependentcy in pyproject

[33mcommit b7b3a30b4ae4e99e9bb77fc1e769a0c999a056ba[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Tue Apr 28 13:12:17 2026 +0800

    feat: updated lib to 1.1.0 and changed build commands since prebuilt libraries are no longer required

[33mcommit 6f584c06fddac0e24737c0b21b1ab13c5f63a08c[m
Merge: 1835a8f b172eec
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Tue Apr 28 12:58:47 2026 +0800

    Merge pull request #6 from balaenaquant/feat/resync
    
    Feat/resync

[33mcommit b172eec72c49eb08c124d805950777f6ea54aa2b[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Mon Apr 27 16:18:57 2026 +0800

    fix: datamap resync

[33mcommit 8b69d13479fa2d402094491a793e4a42fb4483a8[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Mon Apr 27 14:41:15 2026 +0800

    fix: datamap update, logging cleaning

[33mcommit 9442adc12cf139317bc8314078ab3fb2effc8a51[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Apr 24 14:28:05 2026 +0800

    fix: cache fetch-read not normalized start/end dates

[33mcommit 3e722e028d3b131c0da677be45aba0cb97caa13c[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Fri Apr 24 11:55:38 2026 +0800

    feat: implemented resync feature for datamap

[33mcommit 1835a8ff8e658e14cce4488027c32df52bbb7cfb[m
Merge: 1200934 6d9ca42
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Wed Apr 22 16:49:42 2026 +0800

    Merge pull request #5 from balaenaquant/feat/remove_internal_dependency
    
    chore: updated examples to use make_datamap

[33mcommit 120093452ecc051ed5f8e92b6b0cd67c13672946[m
Merge: eebf88d fc34ee1
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Wed Apr 22 16:48:24 2026 +0800

    Merge pull request #4 from balaenaquant/feat/remove_internal_dependency
    
    Feat/remove internal dependency

[33mcommit 6d9ca42950a4708a8b0dc3e88cc3883fa4b91d68[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 22 16:47:46 2026 +0800

    chore: updated examples to use make_datamap

[33mcommit fc34ee1b2c2fdd1bb710d870e8955c66f3926a18[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 22 14:06:54 2026 +0800

    feat: More strict requirement checks for query and simply api for cache

[33mcommit d2395ecb5d927c395802007c2307b3a2654439ae[m
Merge: a780a09 eebf88d
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 22 13:12:31 2026 +0800

    chore: merge from main

[33mcommit eebf88d0bf09a1f93e8a6d7835789d3225839900[m[33m ([m[1;33mtag: [m[1;33m1.0.9[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Apr 18 12:14:25 2026 +0800

    bumped to 1.0.9

[33mcommit 31ef92e70598a9cdeb9ab82c19a3597b7db84f4b[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Apr 18 12:14:06 2026 +0800

    feat: added largest_win and max_holding_time_in_seconds

[33mcommit 8889cd50a5909a9992ead87b6de8c62bc8bb16e1[m[33m ([m[1;33mtag: [m[1;33m1.0.8[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Apr 16 09:39:47 2026 +0800

    feat: made AlphaReportV1's sensitivity test optional

[33mcommit a780a096975e642ddb161cf47781d91da2d10d2d[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 15 16:09:58 2026 +0800

    feat: refactored dataloader, and plug and playable datasource and cache

[33mcommit 5b7bf60ec7490482006f2b39a69997eddee78329[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 15 16:08:20 2026 +0800

    fix: circular dependency

[33mcommit e2b48bcb0a73560d0ddf79d594ea4b3024ae5d09[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 15 16:06:52 2026 +0800

    feat: added test cases for datamap and datasource

[33mcommit 8e4821ee3a5367dfccf684ad52ac5cceee8bcf32[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 15 16:05:25 2026 +0800

    feat: removed all internal dependencies

[33mcommit f7280e59904d2dd7cab4eafa65121df7f39b5df7[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Apr 9 17:30:58 2026 +0800

    fix: some minor bugs, chore: updated imports that require external dependencies

[33mcommit 63bcfcde5e81d72303882120bea2b50c3bf5bc8a[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Apr 9 17:24:03 2026 +0800

    chore: removed cybotrade dependency and imported setup logger from cybotrade

[33mcommit 6345a8291043ca753ea6d345e5c08f83f1561939[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Thu Apr 9 17:21:59 2026 +0800

    fix: processor due to changes in datamap api, feat: clean up and optimized datamap

[33mcommit 5144ef37d37c1b2fca3cb92fbd87aceca31d094d[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Wed Apr 8 13:33:58 2026 +0800

    refactor: datamap internal storage

[33mcommit d65b535f5a7cc30e5f30a312221c5ed88f7703ad[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Tue Apr 7 23:27:00 2026 +0800

    feat: ported topic and symbol, included test cases

[33mcommit bf2aa394fc0d16d14e72d25e7b2a5ffb829788f0[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Mar 12 13:13:41 2026 +0800

    feat: added yfinance data handler

[33mcommit b65325108ddd20c226064a4f48a590e4735c13eb[m
Merge: 297726a ebc67b7
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Mar 12 13:03:19 2026 +0800

    Merge remote-tracking branch 'origin/main'

[33mcommit 297726a6beb936d4bc2e4a965907eb5edc390312[m[33m ([m[1;33mtag: [m[1;33m1.0.7[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Mar 12 13:02:33 2026 +0800

    chore: bumped to 1.0.7

[33mcommit ebc67b727f36fc12ea961898e620e4f37cc80ab0[m
Merge: efb03eb dfd7639
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Mon Mar 2 15:48:31 2026 +0800

    Merge pull request #3 from balaenaquant/fix/calc
    
    fix: sortino ratio and cagr

[33mcommit dfd7639df66d2acf251b70c5917a6c1503c60dc4[m
Author: Jian Wen <wongjianwen0520@gmail.com>
Date:   Mon Mar 2 15:40:43 2026 +0800

    fix: sortino ratio and cagr

[33mcommit efb03eb607b30bd88557e1fe6b0131a8bcd63b21[m[33m ([m[1;33mtag: [m[1;33m1.0.6[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Fri Feb 6 16:22:48 2026 +0800

    fix: datamap cast to original schema in update() method

[33mcommit cd3660af7944ea9d4ec8836e7c6f101e832cfa8b[m[33m ([m[1;33mtag: [m[1;33m1.0.5[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Jan 29 16:11:18 2026 +0800

    fix: datamap datetime cast time_unit issue

[33mcommit f103c466700e622b4c6f9b61d0a770c71ae3b7b7[m[33m ([m[1;33mtag: [m[1;33m1.0.4[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Jan 15 13:50:51 2026 +0800

    updated CHANGELOG.md and bumped version to 1.0.4

[33mcommit c0cdf247524aad99b79688aaf444c8135adcee0b[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Thu Jan 15 13:50:13 2026 +0800

    feat: updated search implementation to include a 'filter' method

[33mcommit ace2827572bf035e7b23f23fe8454c87e17a681f[m[33m ([m[1;33mtag: [m[1;33m1.0.3[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jan 5 23:49:28 2026 +0800

    chore: bumped version to 1.0.3

[33mcommit 653da848af660556f477e771b05ba8ba8936f84d[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jan 5 23:49:13 2026 +0800

    feat: allowed 0 paramter in SensitivityTest (indicating skip)

[33mcommit 9aac17ec28a478e2d579df7c8f322d31a746863b[m[33m ([m[1;33mtag: [m[1;33m1.0.2[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jan 5 21:29:38 2026 +0800

    chore: bumped version to 1.0.2

[33mcommit 9131bdf328a92369bd3b993cf6fa7e330d94a3b3[m[33m ([m[1;31morigin/portfolio-update[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Mon Jan 5 17:30:35 2026 +0800

    updated implementation of portfolio

[33mcommit 49b1111e7ec10376f9e1c380454761afae90d5df[m
Author: Edwin <edwinthiew@balaenaquant.com>
Date:   Sun Jan 4 22:19:47 2026 +0800

    fix: updated portfolio code to work with new alpha api

[33mcommit 18e735e5d59f40ee94662f6f5f3d1bb704a80c75[m[33m ([m[1;33mtag: [m[1;33m1.0.1[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Dec 27 13:24:23 2025 +0800

    chore bumped to 1.0.1

[33mcommit 299ddb3bc29080a309e8d7bd0a101895f995513f[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Dec 27 13:24:03 2025 +0800

    feat: added write_parquet() to AlphaReportV1

[33mcommit 0d66fe43d58080130dcefbf5318a7983e05feb78[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Dec 27 13:18:46 2025 +0800

    feat: added example for custom datasource

[33mcommit 5bc0837e09ebebe0274a588e0f68494634532eba[m[33m ([m[1;33mtag: [m[1;33m1.0.0[m[33m)[m
Merge: ba9b35b 6c69d5e
Author: Marcus Lee <59773847+marcustut@users.noreply.github.com>
Date:   Fri Dec 26 15:58:32 2025 +0800

    Merge pull request #1 from balaenaquant/feat/v1-api
    
    feat: disabled portfolio and updated Alpha api to fit for V1

[33mcommit 6c69d5ee8c7a1fa6dfe509fd4db85b6d8e911307[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Fri Dec 26 15:56:41 2025 +0800

    feat: disabled portfolio and updated Alpha api to fit for V1

[33mcommit ba9b35b08c453cc4d9dee58a24c622c10e97b98c[m[33m ([m[1;33mtag: [m[1;33m0.1.16[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Nov 22 01:48:04 2025 +0800

    bumped to v0.1.16 and updated CHANGELOG.md

[33mcommit d3b15be1f5ee4ae6d921f40f2f4473bbf6dcc6c1[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Sat Nov 22 01:47:02 2025 +0800

    feat: added Search class and updated Sensitivity

[33mcommit f78c760401de3b46d360b90996d971bcc55968f6[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Fri Nov 21 10:50:02 2025 +0800

    feat: migrated from pyright to pyrefly for type-checking

[33mcommit 5687e7d75c1e75a70c8f0284c9b156ca18de9881[m[33m ([m[1;33mtag: [m[1;33m0.1.15[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Fri Nov 21 00:45:19 2025 +0800

    feat: updated sensitivity logic and added homepage to pyproject.toml

[33mcommit dc0f71fd3d0fbc5252bc6ab64616b4bde43d286b[m[33m ([m[1;33mtag: [m[1;33m0.1.14[m[33m)[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Wed Nov 19 15:49:08 2025 +0800

    added LICENSE and classifiers to pyproject.toml

[33mcommit f63c30c3ec0657119b353b5d769ed47c44f076c7[m
Author: Marcus Lee <marcustutorial@hotmail.com>
Date:   Wed Nov 19 15:18:24 2025 +0800

    bootstrapped the project with added build steps for different platforms
